环境变量的配置
1. 将zookeeper-3.4.10.tar.gz上传到/root中
2. 解压
[root@qianfeng01 ~]# tar -zxvf zookeeper-3.4.10.tar.gz -C /usr/local/
3. 更名zookeeper
[root@qianfeng01 ~]# cd /usr/local/
[root@qianfeng01 local]# mv zookeeper-3.4.10 zookeeper
4. 配置环境变量
[root@qianfeng01 local]# vi /etc/profile
.........省略......
export ZOOKEEPER_HOME=/usr/local/zookeeper
export PATH=$ZOOKEEPER_HOME/bin:$PATH
5. 使当前会话生效
[root@qianfeng01 local]# source /etc/profile
6. 检查如下:
如果只检查环境变量是否配置成功,只需要使用tab键进行补全zk,是否zookeeper的相关脚本提示即可。
注意:第七步,只能是运行zookeeper服务后,才能这样查看。
7. 查看zookeeper的版本号
[root@qianfeng01 local]# echo stat|nc localhost 2181
## 独立模式的安装
1 把zoo_sample.cfg复制到当前文件下并改名zoo.cfg
```j[root@qianfeng01 local]# cd zookeeper/
[root@qianfeng01 zookeeper]# cd conf/ #进入zookeeper的conf目录
[root@qianfeng01 conf]# cp zoo_sample.cfg zoo.cfg #复制出zoo.cfg文件ava
2 修改zoo.cfg文件
[root@qianfeng01 conf]# vi zoo.cfg
tickTime=2000 # 定义的时间单元(单位毫秒),下面的两个值都是tickTime的倍数。
initLimit=10 #follower连接并同步leader的初始化连接时间。
syncLimit=5 #心跳机制的时间(正常情况下的请求和应答的时间)
dataDir=/usr/local/zookeeper/zkData #修改zookeeper的存储路径
clientPort=2181 #客户端连接服务器的port
集群模式的配置
1 修改zoo.cfg文件
[root@qianfeng01 local]# cd ./zookeeper/conf/
[root@qianfeng01 conf]# cp zoo_sample.cfg zoo.cfg #复制出zoo.cfg文件
[root@qianfeng01 conf]# vi zoo.cfg
tickTime=2000 # 定义的时间单元(单位毫秒),下面的两个值都是tickTime的倍
数。
initLimit=10 #follower连接并同步leader的初始化连接时间。
syncLimit=5 #心跳机制的时间(正常情况下的请求和应答的时间)
dataDir=/usr/local/zookeeper/zkData #修改zookeeper的存储路径,zkData目录一会要
创建出来
clientPort=2181 #客户端连接服务器的port
server.1=qianfeng01:2888:3888 # 添加三个服务器节点
server.2=qianfeng02:2888:3888
server.3=qianfeng03:2888:3888
解析Server.id=ip:port1:port2
id: 服务器的id号,对应zkData/myid文件内的数字
ip: 服务器的ip地址
port1: follower与leader交互的port
port2: 选举期间使用的port
在$ZK_HOME/zkDATA目录下设置server的id号
[root@qianfeng01 conf]# cd ..
[root@qianfeng01 zookeeper]# mkdir zkData
[root@qianfeng01 zookeeper]# cd zkData
[root@qianfeng01 zkData]# echo "1" >> myid
2.4.4 搭建其他两个server节点的环境
1 复制发送zookeeper环境 到其他的节点中
[root@qianfeng01 zkData]# cd /usr/local
[root@qianfeng01 local]# scp -r zookeeper qianfeng02:/usr/local/
[root@qianfeng01 local]# scp -r zookeeper qianfeng03:/usr/local
2 /etc/profile的拷贝,拷贝完成需要source启动一下
[root@qianfeng01 local]# scp /etc/profile qianfeng02:/etc/
[root@qianfeng01 local]# scp /etc/profile qianfeng03:/etc/
3 修改server的id号码,赋予新的编号
[root@qianfeng01 ~]# ssh qianfeng02
[root@qianfeng02 ~]# echo "2" > /usr/local/zookeeper/zkData/myid
[root@qianfeng02 ~]# ssh qianfeng03
[root@qianfeng03 ~]# echo "3" > /usr/local/zookeeper/zkData/myid
启动zookeeper
1 所有节点启动zookeeper服务
[root@qianfeng01 ~]# zkServer.sh start
再查看一下状态
[root@qianfeng01 ~]# zkServer.sh status
2 启动客户端链接本地服务和链接节点服务
zkCli.sh [-server] [ ip:port]
reg:
[root@qianfeng01 ~]# zkCli.sh #启动客户端,连接本地服
务进程
[root@qianfeng01 ~]# zkCli.sh -server qianfeng02:2181 #启动客户端,连接
qianfeng02上的服务进程
输入help,查看所有指令,如下图
启动注意事项
集群启动的一些注意事项:
1. 每一次启动的日志信息都存储在一个叫
zookeeper.out文件里。
2. zookeeper.out文件的路径是 使用启动脚本
启动集群时所在目录里
3. 如果启动失败,需要在zookeeper.out文件
中查看原因
4. 如果认为自己配置的没有问题,可以尝试一
下再次启动(或者是reboot后启动)
zookeeper的命令
1、脚本
zkServer.sh {start|start-foreground|stop|restart|status|upgrade|print-cmd}
zkServer.sh start:
启动当前机器节点的zookeeper服务
zkServer.sh status:
查询当前服务的状态
zkServer.sh stop:
关闭当前机器节点的服务
客户端脚本:zkCli.sh
语法: zkCli.sh [-server] ip|
hostname:port
表示:连接zookeeper集群中的某一个服务项
reg: zkCli.sh -server qianfeng01:2181
表示客户端连接qianfeng01服务器
zkCli.sh -server qianfeng02:2181
表示客户端连接qianfeng02服务器zkCli.sh -server
qianfeng03:2181
表示客户端连接qianfeng03服务器
zkCli.sh 回车
表示客户端连接的服务器是本机上的服务项QuorumPeerMain
1. ls -- 查看某个目录包含的所有文件
2. ls2 -- 查看某个目录包含的所有文件,与ls不同的是它查看到time、version等信息
3. create -- 创建znode,并设置初始内容,例如:
[zk: 47.0.0.1:2181(CONNECTED) 1] create /test "test"
Created /test
4. get -- 获取znode的数据
5. set -- 修改znode内容
6. delete -- 删除znode
7. quit -- 退出客户端
8. help -- 帮助命
错误集锦
1. java.net.NoRouteToHostException: 没有到主机的路由
原因1: 没有配置/etc/hosts
原因2: 没有关闭防火墙
节点类型
1 persistent 持久型 :断开链接后,改节点依旧存在
2 persistent_sequentail 有序持久型 :与持久型不同于它还会对节点名进行顺序编号
3 echemeral 短暂型 : 断开链接后,节点自动删除
4 ephermral_sequential 有序短暂型 :与短暂性不同的是它还会对节点进行顺序排序
Zookeeper的工作原理
1 选举制度
开启选举条件
1 节点半数以上才能选举(*注意:一半以上是开区间),因此Zookeeper适合用在奇数台的机器
2 在配置文件中没有指定的leader和follower ,而是使用算法(Paxos)在内部通过选举机制来选择一个节点为leader和剩下的follower
开机启动的选举过程
1. 服务器1启动
此时只有它一台服务器启动了,它发出去的投票信息没有任何响应,所以它的选举状态一直是 LOOKING
状态。
2. 服务器2启动
它与最开始启动的服务器 1 进行通信,互相交换自己的选举结果,由于两者都没有历史数据,所以 id
值较大
的服务器 2 胜出,但是由于没有达到超过半数以上的服务器都同意选举它(这个例子中的半数以上是
3),所以
服务器 1、 2 还是继续保持LOOKING 状态。
3. 服务器3启动
根据前面的理论分析,服务器 3 成为服务器 1、 2、 3 中的老大,而与上面不同的是,此时有三台服
务器选
举了它,所以它成为了这次选举的 leader。
4. 服务器4启动
根据前面的分析,理论上服务器 4 应该是服务器 1、 2、 3、 4 中最大的,但是由于前面已经有半
数以上的
服务器选举了服务器 3,所以它只能接收当小弟的命
了。
5. 服务器5启动
同 4 一样当小弟
选举制度的四个概念
- serverid:服务器id
比如有三台服务器,编号分别为1,2,3。编号越大在选择算法中的权重越大
- zxid:数据id
服务器中存放的最大数据ID。值越大说明数据越新,在选举算法中的权重越大
- Epoch:逻辑时钟
也可以称之为每个服务器参加投票的次数。同一轮投票过程中的逻辑时钟值相同
优先级:Epoch > zxid >serverid
- Server状态:选举状态
• LOOKING:竞选状态
• FOLLOWING:随从状态,同步leader状态,参与选票
• OBSERVING:观察状态,同步leader状态,不参与选票
• LEADER:领导者状态