zookeeper 集群配置
简介
ZooKeeper是一个分布式的,开放源码的分布式应用程序协调服务,是Google的Chubby一个开源的实现,是Hadoop和Hbase的重要组件。它是一个为分布式应用提供一致性服务的软件,提供的功能包括:配置维护、域名服务、分布式同步、组服务等。
zookeeper 使用场景
配置管理 集中式的配置管理在应用集群中是非常常见的,一般商业公司内部都会实现一套集中的配置管理中心,应对不同的应用集群对于共享各自配置的需求,并且在配置变更时能够通知到集群中的每一个机器。
集群管理 应用集群中,我们常常需要让每一个机器知道集群中(或依赖的其他某一个集群)哪些机器是活着的,并且在集群机器因为宕机,网络断链等原因能够不在人工介入的情况下迅速通知到每一个机器
zookeeper 集群配置
本人测试用一台机器做集群,一台机器部署三个zookeeper.但是在生产环境中,你最好部署3,5,7个节点。部署的越多,可靠性就越高,当然最好是部署奇数个,偶数个不是不可以的,但是zookeeper集群是以宕机个数过半才会让整个集群宕机的,所以奇数个集群更佳。
目录结构为
F:\11-zookeeper-cluster\server01\data
F:\11-zookeeper-cluster\server01\logs
F:\11-zookeeper-cluster\server01\zookeeper
F:\11-zookeeper-cluster\server02\data
F:\11-zookeeper-cluster\server02\logs
F:\11-zookeeper-cluster\server02\zookeeper
F:\11-zookeeper-cluster\server03\data
F:\11-zookeeper-cluster\server03\logs
F:\11-zookeeper-cluster\server03\zookeeper
首先下载zookeeper
修改配置文件 ,将zookeeper/conf/zoo_sample.cfg重命名为zoo.cfg
打开后修改为
#
#The number of milliseconds of each tick
tickTime=2000
#The number of ticks that the initial
#synchronization phase can take
initLimit=10
#The number of ticks that can pass between
#sending a request and getting an acknowledgement
syncLimit=5
#the directory where the snapshot is stored.
dataDir=F:/11-zookeeper-cluster/server01/data #需要修改成对应的目录(01,02,03)
dataLogDir=F:/11-zookeeper-cluster/server01/logs #需要修改成对应的目录(01,02,03)
#the port at which the clients will connect
clientPort=2181 #三个的监听端口需要不一样 2081,2182,2183
#以下三个配置,三个节点都一样
server.1=localhost:8881:7771
server.2=localhost:8882:7772
server.3=localhost:8883:7773
创建myid文件
在每一个data下面创建一个myid文件(myid没有扩展名)
里边的内容是 server.X=localhost:8881:7771 中配置的X,例如第一个就是1,第二个就是2
配置参数解释
tickTime:发送心跳的间隔,单位:毫秒
dataDir:zookeeper保存数据的位置。
clientPort:客户端连接 Zookeeper 服务器的端口
syncLimit:这个配置项标识 Leader 与 Follower 之间发送消息,请求和应答时间长度,最长不能超过多少个 tickTime 的时间长度,总的时间长度就是 2*2000=4 秒
server.A=B:C:D:其中 A 是一个数字,表示这个是第几号服务器;B 是这个服务器的 ip 地址;C 表示的是这个服务器与集群中的 Leader 服务器交换信息的端口;D 表示的是万一集群中的 Leader 服务器挂了,需要一个端口来重新进行选举,选出一个新的 Leader,而这个端口就是用来执行选举时服务器相互通信的端口。如果是伪集群的配置方式,由于 B 都是一样,所以不同的 Zookeeper 实例通信端口号不能一样,所以要给它们分配不同的端口号。
启动
依次启动 server01,server02,server03
server01/bin/zkServer.cmd
server02/bin/zkServer.cmd
server03/bin/zkServer.cmd
一开始会报错,因为节点之间会互相连接,一开始起来的会连不上还没起来的,全部起来后就不会报错了
客户端连接的时候连接其中任意一个都可以,或者一般都是连接所有,保证不会出现单点故障
运行 zkServer.cmd status 可以查看节点的角色 是leader 还是follower
连接时连接任意一个节点都可以,但一般都是连接所有节点,保证没有单点故障。
例如
<bean id="serviceRegistry" class="cn.jialx.nettyrpc.registry.ServiceDiscovery">
<constructor-arg name="registryAddress" value="127.0.0.1:2181,127.0.0.1:2182,127.0.0.1:2183"/>
</bean>