文章系转载,便于整理和分类,原文地址:https://www.cnblogs.com/zpKang/p/13533978.html
centos安装zookeeper及搭建集群
ZooKeeper是一个分布式的,开放源码的分布式应用程序分布式应用程序协调服务,是Google的Chubby一个开源的实现,是Hadoop和Hbase的重要组件。它是一个为分布式应用提供一致性服务的软件,提供的功能包括:配置维护、域名服务、分布式同步、组服务等。
ZooKeeper的目标就是封装好复杂易出错的关键服务,将简单易用的接口和性能高效、功能稳定的系统提供给用户。
ZooKeeper包含一个简单的原语集,提供Java和C的接口。
ZooKeeper代码版本中,提供了分布式独享锁、选举、队列的接口,代码在$zookeeper_home\src\recipes。其中分布锁和队列有Java和C两个版本,选举只有Java版本。
总结:Zookeeper负责服务的协调调度.当客户端发起请求时,返回正确的服务器地址.
centos安装配置zookeeper
1. Zookeeper下载
网址: http://zookeeper.apache.org/releases.html
其他下载地址: http://mirrors.hust.edu.cn/apache/zookeeper/
2. Zookeeper安装
安装前提, 确保已经安装了JDK环境 关于jdk的配置: [配置jdk]
上传安装文件并解压即可, 解压命令 tar -xvf 包名.tar.gz
3. 修改配置文件
在zookeeper解压的根目录下创建两个目录, data和log mkdir data log
进入conf目录, 配置文件就在里面, 里面只有一个zoo_sample.cfg
的简单位置文件, 我们可以复制一份, 自己修改
假设复制文件名为zoo.cfg
, 编辑文件如下
# 数据目录, 即创建的data目录
dataDir=/usr/local/src/zookeeper/data
# 日志目录, 即创建的log目录
dataLogDir=/usr/local/src/zookeeper/log
# 端口号, 默认2181
clientPort=2181
4. 启动zookeeper
跳转到bin目录中 zk启动关闭命令如下.
# 可以在最后面跟上配置文件的位置, 启动指定配置文件, 不加默认启动zoo.cfg
sh zkServer.sh start 或者 ./zkServer.sh start
sh zkServer.sh stop
sh zkServer.sh status
Zookeeper集群搭建
为了方便测试, 在同一台linux上使用不同端口号代表不同zookeeper主机, 端口号为2181, 2182, 2183
1. 准备文件夹
在zookeeper根目录下创建zkCluster目录, 此目录为测试集群目录 mkdir zkCluster
在zkCluster目录下, 创建zk1, zk2, zk3 目录 mkdir zk1 zk2 zk3
分别在zk1, zk2, zk3 目录中创建data和log目录, 快捷指令 mkdir {zk1,zk2,zk3}/{data,log}
2. 添加myid文件
关于myid文件: myid的值是zoo.cfg文件里定义的server.A项A的值,Zookeeper 启动时会读取这个文件,拿到里面的数据与 zoo.cfg 里面的配置信息比较从而判断到底是那个server,只是一个标识作用。
分别在zk1, zk3, zk2 中创建myid文件, 文件内容分别为 1, 2, 3 数字, 为服务的编号
3. 编辑配置文件
我们首先创建一个配置文件, 修改之后复制三份, 节省时间
进入conf目录, 将zoo_sample.cfg复制为zoo1.cfg, 然后对其进行修改
使用vim等工具打开zoo1.cfg, 修改内容如下:
# 数据目录
dataDir=/usr/local/src/zookeeper/zkCluster/zk1/data
# 日志目录
dataLogDir=/usr/local/src/zookeeper/zkCluster/zk1/log
# 端口号
clientPort=2181
tickTime=2000
initLimit=5
syncLimit=2
# 配置集群
# server.myid文件编号=ip地址:LF通信端口:选举端口
# 如果3个zookeeper不在同一台服务器, 通信端口和选举端口一样也没有关系, ip不同即可
server.1=192.168.126.129:2887:3887
server.2=192.168.126.129:2888:3888
server.3=192.168.126.129:2889:3889
修改完成之后, 我们把此文件再次复制为zoo2.cfg和zoo3.cfg, 然后修改对应的dataDir
, dataLogDir
, clientPort
即可
关于配置文件的详细介绍如下:
①、tickTime:基本事件单元,这个时间是作为Zookeeper服务器之间或客户端与服务器之间维持心跳的时间间隔,每隔tickTime时间就会发送一个心跳;最小 的session过期时间为2倍tickTime
②、dataDir:存储内存中数据库快照的位置,除非另有说明,否则指向数据库更新的事务日志。注意:应该谨慎的选择日志存放的位置,使用专用的日志存储设备能够大大提高系统的性能,如果将日志存储在比较繁忙的存储设备上,那么将会很大程度上影像系统性能。
③、client:监听客户端连接的端口。
④、initLimit:允许follower连接并同步到Leader的初始化连接时间,以tickTime为单位。当初始化连接时间超过该值,则表示连接失败。
⑤、syncLimit:表示Leader与Follower之间发送消息时,请求和应答时间长度。如果follower在设置时间内不能与leader通信,那么此follower将会被丢弃。
⑥、server.A=B:C:D
A:其中 A 是一个数字,表示这个是服务器的编号;
B:是这个服务器的 ip 地址;
C:Leader选举的端口;
D:Zookeeper服务器之间的通信端口。
4. 启动集群
通过下面的命令按顺序启动zk集群 (在bin目录下, 其3个配置文件都在conf目录下)
sh zkServer.sh start ../conf/zoo1.cfg
sh zkServer.sh stop ../conf/zoo2.cfg
sh zkServer.sh status ../conf/zoo3.cfg
如果启动失败, 说明配置文件有问题, 重新配置修改即可
然后使用 sh zkServer.sh status ../conf/zoo1.cfg
分别检测运行状态
结果如下:
[root@localhost bin]# sh zkServer.sh status ../conf/zoo1.cfg
ZooKeeper JMX enabled by default
Using config: ../conf/zoo1.cfg
Client port found: 2181. Client address: localhost.
Mode: follower
[root@localhost bin]# sh zkServer.sh status ../conf/zoo2.cfg
ZooKeeper JMX enabled by default
Using config: ../conf/zoo2.cfg
Client port found: 2182. Client address: localhost.
Mode: leader
[root@localhost bin]# sh zkServer.sh status ../conf/zoo3.cfg
ZooKeeper JMX enabled by default
Using config: ../conf/zoo3.cfg
Client port found: 2183. Client address: localhost.
Mode: follower
如图:
可见, 按顺序启动后, 2为主机, 1和3为从机,
我们试着把第二台主机关闭(假设宕机) sh zkServer.sh stop ../conf/zoo2.cfg
关闭后发现3为主机, 1为从机
这和zookeeper的选举机制有关
zookeeper选举机制
- zk选举采用最大值(myid)优先的机制.
- 超过半数以上人数同意即可成为领导者(主机)
- 只有当主机宕机后(心跳检测结果为宕机), 才会重新选举, 即有领导者的时候, 即使新添加了主机, 也不会选举
图解
(按顺序启动1,2,3)
选举案例
目前有5台服务器,每台服务器均没有数据,它们的编号分别是1,2,3,4,5,按编号依次启动,它们的选择举过程如下:
- 服务器1启动,给自己投票,然后发投票信息,由于其它机器还没有启动所以它收不到反馈信息,服务器1的状态一直属于Looking(选举状态)。
- 服务器2启动,给自己投票,同时与之前启动的服务器1交换结果,由于服务器2的编号大所以服务器2胜出,但此时投票数没有大于半数,所以两个服务器的状态依然是LOOKING。
- 服务器3启动,给自己投票,同时与之前启动的服务器1,2交换信息,由于服务器3的编号最大所以服务器3胜出,此时投票数正好大于半数,所以服务器3成为领导者,服务器1,2成为小弟。
- 服务器4启动,给自己投票,同时与之前启动的服务器1,2,3交换信息,尽管服务器4的编号大,但之前服务器3已经胜出,所以服务器4只能成为小弟。
- 服务器5启动,后面的逻辑同服务器4成为小弟。
选举结果: 服务器3为主机
当3宕机, 5为主机,
当5宕机, 4为主机,
当4宕机, 集群彻底崩溃,
1和2永远无法成为主机