ZooKeeper:搭建分布式集群

ZooKeeper是一个分布式开源协调服务框架,ZooKeeper集群中的每台服务器的数据完全相同,其中有一个服务器为Leader,用来为其它服务器(Follower)校准数据。ZooKeeper集群内部使用选举机制选举Leader所以必须是奇数台,只要有半数以上节点存活集群就能正常运作(如果有2N+1台服务器,允许有N台服务器宕机),ZooKeeper主要用于管理用户提交的数据并为数据提供监听服务。

集群搭建

在这里以3台服务器为例

环境说明:CentOS-7、JDK-1.8

修改主机名

将三台服务器的主机名分别修改为:zk1、zk2、zk3,也可以不修改,如果不修改的话后面的配置必须使用IP地址进行配置

1
vi /etc/hostname

配置IP地址与主机名之间的映射

IP地址根据自己的实际情况进行修改,三台服务器上保持一致

1
2
3
192.168.1.101    zk1
192.168.1.102 zk2
192.168.1.103 zk3

安装JDK

在任意一台上进行如下操作:

1、解压

1
tar -zxf jdk.tar.gz -C /opt

2、配置环境变量

1
vi /etc/profile

3、追加内容

1
2
export JAVA_HOME=/opt/jdk
export PATH=$PATH:$JAVA_HOME/bin

4、拷贝到其它服务器

1
2
3
# 拷贝至zk2的/opt目录下
scp -r /opt/jdk zk2:/opt
scp /etc/profile zk2:/etc/profile

5、在所有服务器上执行如下命令,让环境变量生效

1
source /etc/profile

安装与配置ZooKeeper

安装ZooKeeper

与安装JDK方式大致一致(解压、配置环境变量、暂时不拷贝),这里不再赘述

配置

修改 $ZOOKEEPER_HOME/conf/zoo.cfg ,该文件默认不存在,可以将zoo_sample.cfg进行重命名

1
mv zoo_sample.cfg zoo.cfg

修改配置文件

1
2
3
4
5
6
7
# 数据保存的路径
dataDir=/opt/zookeeper/data

# 服务器及端口,主机名:心跳端口:选举端口
server.1=zk1:2888:3888
server.2=zk2:2888:3888
server.3=zk3:2888:3888

新建data目录并配置节点ID

1
2
3
4
5
6
7
8
# 该目录为上面配置的dataDir
mkdir /opt/zookeeper/data

# 切换目录
cd /opt/zookeeper/data

# 新建myid文件
touch myid

以上操作完成后拷贝至其它服务器

修改zk1的myid文件内容为1,zk2的内容为2,zk3的内容为3,与配置文件中的server ID一致

其他配置项说明

tickTime=毫秒值: 客户端和服务端通信的心跳时间

initLimit=次数: Leader/Follower之间初始连接时最多能容忍的心跳次数

syncLimit=次数: Leader/Follower之间请求和应答时最多能容忍的心跳次数

clientPort=端口号: 客户端连接端口号

集群管理

启动服务
1
zkServer.sh start

注: 如果启动服务失败有可能是防火墙阻止了端口间的通信,关闭防火墙后再还有错误再查日志信息

1
2
3
4
5
6
7
# CentOS-6
service stop iptables # 关闭防火墙
chkconfig iptables off # 禁止开机启动

# CentOS-7
systemctl stop firewalld # 关闭防火墙
systemctl disable firewalld # 禁止开机启动

查看服务状态
1
zkServer.sh status
停止服务
1
zkServer.sh stop

客户端操作

客户端连接
1
2
3
4
5
# 默认连接本机
zkCli.sh

# 连接其他服务器
zkCli.sh -server zk2:2181
操作节点
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# 查看根节点
ls /

# 创建节点a
create /a "hello world"

# 获取节点数据
get /a
get /a watch # 获取数据并监听该节点的变化

# 修改节点数据
set /a "hello zookeeper"

# 删除节点,该节点必须没有子节点
delete /a

# 递归删除节点
rmr /a
使用Java API
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
package cn.harmel.zk;

import java.io.IOException;
import java.util.List;

import org.apache.zookeeper.CreateMode;
import org.apache.zookeeper.WatchedEvent;
import org.apache.zookeeper.Watcher;
import org.apache.zookeeper.ZooDefs.Ids;
import org.apache.zookeeper.ZooKeeper;
import org.apache.zookeeper.data.Stat;
import org.junit.Before;
import org.junit.Test;

public class ZkClient {

private static final String CONNECT_URL= "zk1:2181,zk2:2181,zk3:2181";
private static final int SESSION_TIMEOUT = 2000;

private ZooKeeper zkClient = null;

@Before
public void init() throws Exception {
zkClient = new ZooKeeper(CONNECT_URL, SESSION_TIMEOUT, new Watcher() {
@Override
public void process(WatchedEvent event) {
// 这里可以对事件进行处理
try {
zkClient.getChildren("/", true);
} catch (Exception e) {
// TODO
}
}
});

}


// 创建节点
@Test
public void testCreate() throws Exception {
String nodeCreated = zkClient.create("/a", "hello world".getBytes(),
Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);
}

// 判断节点是否存在
@Test
public void testExist() throws Exception{
Stat stat = zkClient.exists("/a", false);
System.out.println(stat == null?"不存在":"存在");
}

// 获取子节点
@Test
public void getChildren() throws Exception {
List<String> nodes = zkClient.getChildren("/", true);
for (String node : nodes) {
System.out.println(node);
}
}

// 获取节点数据
@Test
public void getData() throws Exception {
byte[] data = zkClient.getData("/a", false, null);
System.out.println(new String(data));
}

// 删除节点
@Test
public void deleteZnode() throws Exception {
// -1表示删除所有版本
zkClient.delete("/a", -1);
}

// 修改节点数据
@Test
public void setData() throws Exception {
zkClient.setData("/a", "hello zookeeper".getBytes(), -1);
}

}
  • 本文作者: Harmel
  • 本文链接: http://www.harmel.cn/2018/09/zookeeper-distributed.html
  • 版权声明: 文章如无特别说明,则表明该文章为原创文章,如需要转载,请注明出处。
  • 本站说明: 本站使用阿里云服务器,如果您喜欢我的网站,欢迎收藏,能捐赠支持一下就再好不过了。