Zookeeper 安装与部署

7,288 阅读4分钟

Zookeeper安装方式有三种,单机模式集群模式以及伪集群模式

■ 单机模式:Zookeeper只运行在一台服务器上,适合测试环境;

■ 伪集群模式:就是在一台物理机上运行多个Zookeeper 实例;

■ 集群模式:Zookeeper运行于一个集群上,适合生产环境,这个计算机集群被称为一个“集合体”(ensemble)

单机模式

下载 ZooKeeper,解压,将 conf 目录下的 zoo_sample.cfg 复制一份重命名为 zoo.cfg

cp zoo_sample.cfg zoo.cfg

然后直接启动 ZooKeeper 就行了

bin/zkServer.sh start

查看 ZooKeeper 运行状态


可以看到 ZooKeeper 的 Mode 是单机模式的(standalone)

使用客户端连接 ZK

本地连接

bin/zkCli.sh


远程连接 ZK

bin/zkCli.sh -server ip:port


停止 ZooKeeper

bin/zkServer.sh stop



伪集群模式

Zookeeper不但可以在单机上运行单机模式Zookeeper,而且可以在单机模拟集群模式 Zookeeper的运行,也就是将不同节点运行在同一台机器。我们在实验的时候,可以先使用少量数据在集群伪分布模式下进行测试。当测试可行的时候,再将数据移植到集群模式进行真实的数据实验。这样不但保证了它的可行性,同时大大提高了实验的效率。这种搭建方式,比较简便,成本比较低,适合测试和学习,如果你的手头机器不足,就可以在一台机器上部署了 3个server。

注意事项

在一台机器上部署了3个server,需要注意的是:在伪分布式模式下我们使用的每个配置文件模拟一台机器,也就是说单台机器上运行多个Zookeeper实例。但是,必须保证每个配置文档的各个端口号不能冲突,除了clientPort不同之外,dataDir也不同。另外,还要在dataDir所对应的目录中创建myid文件来指定对应的Zookeeper服务器实例。

■ clientPort端口:如果在1台机器上部署多个server,那么每台机器都要不同的 clientPort,比如 server1是2181,server2是2182,server3是2183

■ dataDir和dataLogDir:dataDir和dataLogDir也需要区分下,将数据文件和日志文件分开存放,同时每个server的这两变量所对应的路径都是不同的

■ server.X和myid: server.X 这个数字就是对应,data/myid中的数字。在3个server的myid文件中分别写入了1,2,3,那么每个server中的zoo.cfg都配 server.1 server.2,server.3就行了。因为在同一台机器上,后面连着的2个端口,3个server都不要一样,否则端口冲突。

同样将 conf 目录下的 zoo_sample.cfg 复制三份,分别重命名为 zoo1.cfg,zoo2.cfg,zoo3.cfg。

cp zoo_sample.cfg zoo1.cfg

cp zoo_sample.cfg zoo2.cfg

cp zoo_sample.cfg zoo3.cfg

然后分别修改每个配置文件,我的配置如下:




创建 zoox.cfg 配置文件中 dataDir 和 dataLogDir 的路径,

# 创建数据目录

mkdir -p /var/elvis/zookeeper/data/server1

mkdir -p /var/elvis/zookeeper/data/server2

mkdir -p /var/elvis/zookeeper/data/server3

# 创建日志文件目录

mkdir -p /var/elvis/zookeeper/logs/server1

mkdir -p /var/elvis/zookeeper/logs/server1

mkdir -p /var/elvis/zookeeper/logs/server1

在每个 dataDir 目录下常见一个 myid 文件并在其中写入 server 对应的序号,比如在 /var/elvis/zookeeper/data/server1 目录下创建一个 myid 文件,并在 myid 中写入 1,其他目录同理。




然后使用每个配置文件启动3个 ZooKeeper 实例:

bin/zkServer.sh stop conf/zoo1.cfg

bin/zkServer.sh stop conf/zoo2.cfg

bin/zkServer.sh stop conf/zoo3.cfg


可以使用 jps 来查看是否启动成功

jps -ml


查看 zk 的运行状态

bin/zkServer.sh status conf/zoo1.cfg

bin/zkServer.sh status conf/zoo2.cfg

bin/zkServer.sh status conf/zoo3.cfg


可以看到 ZK 的 Mode 不再是 standalone 了,而且 server2 作为 leader,其他2台server 作为 follower。

客户端连接 zk 集群

本地连接/远程连接

bin/zkCli.sh -server ip:2181

bin/zkCli.sh -server ip:2182

bin/zkCli.sh -server ip:2183




可以看见,我们远程连接任何一个端口都能够连接上。

上面我们知道 server2 是 leader,所以我们使用客户端连接到 server2上,然后创建一些节点。

bin/zkCli.sh -server 39.106.111.160:2182

create /zktest 123


现在我们在本地连接到 server1 看能不能看到刚才我们创建的节点。

bin/zkCli.sh -server localhost:2181

ls /

get /zktest


可以看到我们在 server1 上也获取到了刚才我们通过远程连接在 server2 上创建的 /zktest 数据。

现在我们尝试将 server2 这个leader 给停掉。

bin/zkServer.sh stop conf/zoo2.cfg


然后查看 server1和 server3 的运行状态

查看 server1 和 server3 状态

现在可以看到 ZooKeeper 通过选举,将 server3选举成了新的 leader。

这个时候我们刚才远程连接到 server2 的客户端开始报错了,zkCli.sh 客户端并没有实现连接断后,自动连接其他节点的功能。


这时我们再重启 server2

bin/zkServer.sh start conf/zoo2.cfg

然后再来查看各个 server 的运行状态


可以看到 server2 再次加入组织,不过 server2已经不再是 leader 了。

这个时候连接 sever2 的客户端也从报错中恢复过来。

集群模式

集群模式和伪分布式部署基本相同,唯一的区别就是 zoo.cfg 中,ip 配置不在是127.0.0.1 或 localhost 了,而是真正的机器 ip。

server.2= ip:2288:3388

欢迎关注我的微信公众号:java初学者的日常

java初学者的日常