zookeeper单机和集群环境的搭建

 ̄綄美尐妖づ 提交于 2020-01-07 17:32:37

【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>>

1. 前言

19年过的还蛮快,这篇博客作为20年的第一篇,我想在这里为前一年做一个简单的总结:说真的,19年过的蛮凄惨的。😄没错,总结就是这一句话,毕竟仪式感必须还是要有的。

好了,不说这些了,希望20年过的好吧,多存点钱,少点烦恼。

2. 简单说一下zookeeper是什么,可以解决什么问题

ZooKeeper 是Hadoop下的一个子项目,它是一个针对大型分布式系统的可靠协调系统;它提供的功能包括:配置维护、名字服务、分布式同步、组服务等; 它的目标就是封装好复杂易出错的关键服务,将简单易用的接口和性能高效、功能稳定的系统提供给用户。

  1. 统一命名
    在分布式环境中统一命名服务就像域名与ip一样,IP不容易记住,域名比较容易记住,统一命名服务,可以直接来通过服务名称获取服务的地址等关键信息。
  2. 配置管理 这个比较好理解,在分布式项目中,每个项目的配置提取出来,统一管理。目前市面上用的多的是apollo,nacos,spring cloud conifg等
  3. 集群管理 担任服务生产者和服务消费者的注册中心,服务生产者将自己提供的服务注册到Zookeeper中心,服务的消费者在进行服务调用的时候先到Zookeeper中查找服务,获取到服务生产者的详细信息之后,再去调用服务生产者的内容与数据。
  4. 分布式通知与协调 心跳机制,消息推送等
  5. 分布式锁 听说这个倒是市面上用的比较多,不过我所在的公司在分布式锁是redis实现的,这块并不是很了解。
  6. 分布式队列

3. zookeeper中的角色

zk中存在三种角色:leader,follower,observer;
leader:主要是数据恢复,维持心跳,是zk集群中的主节点
follower:参与leader的选举,处理leader的建议
observer:与follower类似,但不参与leader的选举,如果集群中读的负载比较高的情况下,增加observer比增加follower所带来的负面影响要好得多(因为不参与选举,leader就可以减少leader发送选举的请求)
画一张简图。

4. zookeeper单机部署

下载地址 https://zookeeper.apache.org/

我这里下载的是3.4.14版本

解压文件

进入zookeeper-3.4.14/conf目录,拷贝zoo_sample.cfg文件为zoo.cfg 进入bin目录,执行

./zkServer.sh start


停止服务直接键入:./zkServer.sh stop 查看服务状态:./zkServer.sh status

客户端链接:

./zkCli.sh

单机还是蛮简单的,直接找到运行文件执行相应命令即可。

5. zookeeper集群部署

我这里部署4个zk实例,其中一台observer,进入conf目录
配置文件解释

拷贝zoo.cfg文件

cp zoo.cfg zoo1.cfg

编辑zoo1.cfg文件

tickTime=2000
initLimit=10
syncLimit=5

dataDir=/zookeeper/data_1 #新建对应目录
clientPort=2181
dataLogDir=/zookeeper/logs_1 #新建对应目录
# server.x中的x需要和myid一致,第一个客户端用户Leader和Learner之间同步,第二个端口用于选举过程中的投票通信
server.1=localhost:2887:3887
server.2=localhost:2888:3888
server.3=localhost:2889:3889
server.4=localhost:2890:3890:observer

另外拷贝三份zoo1.cfg文件

cp zoo1.cfg zoo2.cfg
cp zoo1.cfg zoo3.cfg
cp zoo1.cfg zoo4.cfg

修改文件中的端口号:clientPort,dataDir,dataLogDir,并新建对应的目录 下面贴上其他三个实例的配置文件内容

zoo2.cfg

tickTime=2000
initLimit=10
syncLimit=5

dataDir=/zookeeper/data_2 #新建对应目录
clientPort=2182
dataLogDir=/zookeeper/logs_2 #新建对应目录
# server.x中的x需要和myid一致,第一个客户端用户Leader和Learner之间同步,第二个端口用于选举过程中的投票通信
server.1=localhost:2887:3887
server.2=localhost:2888:3888
server.3=localhost:2889:3889
server.4=localhost:2890:3890:observer

zoo3.cfg

tickTime=2000
initLimit=10
syncLimit=5

dataDir=/zookeeper/data_3 #新建对应目录
clientPort=2183
dataLogDir=/zookeeper/logs_3 #新建对应目录
# server.x中的x需要和myid一致,第一个客户端用户Leader和Learner之间同步,第二个端口用于选举过程中的投票通信
server.1=localhost:2887:3887
server.2=localhost:2888:3888
server.3=localhost:2889:3889
server.4=localhost:2890:3890:observer

zoo4.cfg 这个实例是observer,要加上peerType=observer配置

tickTime=2000
initLimit=10
syncLimit=5

dataDir=/zookeeper/data_4 #新建对应目录
clientPort=2184
dataLogDir=/zookeeper/logs_4 #新建对应目录
peerType=observer

# server.x中的x需要和myid一致,第一个客户端用户Leader和Learner之间同步,第二个端口用于选举过程中的投票通信
server.1=localhost:2887:3887
server.2=localhost:2888:3888
server.3=localhost:2889:3889
server.4=localhost:2890:3890:observer

在4个data文件夹下新建myid文件

echo "1" > /zookeeper/data_1/myid
echo "2" > /zookeeper/data_2/myid
echo "3" > /zookeeper/data_3/myid
echo "4" > /zookeeper/data_4/myid

启动实例

zkServer.sh start zookeeper-3.4.14/conf/zoo1.cfg
zkServer.sh start zookeeper-3.4.14/conf/zoo2.cfg
zkServer.sh start zookeeper-3.4.14/conf/zoo3.cfg
zkServer.sh start zookeeper-3.4.14/conf/zoo4.cfg

查看实例状态

zkServer.sh status zookeeper-3.4.14/conf/zoo1.cfg
zkServer.sh status zookeeper-3.4.14/conf/zoo2.cfg 
zkServer.sh status zookeeper-3.4.14/conf/zoo3.cfg
zkServer.sh status zookeeper-3.4.14/conf/zoo4.cfg

可以看到 各个实例的角色 1和3是follower,2为leader,4为observer

输入./zkCli.sh -server localhost:2181连接
创建一个节点

create /test 'test1'

然后连接其他实例,也能看到同步到的数据节点

[zk: localhost:2181(CONNECTED) 0] ls /
[zookeeper, test]

[zk: localhost:2182(CONNECTED) 0] ls /
[zookeeper, test]

[zk: localhost:2183(CONNECTED) 0] ls /
[zookeeper, test]

[zk: localhost:2184(CONNECTED) 0] ls /
[zookeeper, test]
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!