从下面三个方面解释:
1.集群部署
2.选举机制
3.数据提交机制
特点:主存自动切换
一般是3台服务器,3个节点,半数运行机制,生产环境上应该部署到不同的物理机上,如果是测试环境可以部署到同一个物理机上,只要port不同就可以,
首先解决集群启动时遇到的一个问题:
详见这个博客: https://www.jianshu.com/p/505f53f0a320
2.部署:
- 节点ID:服务id手动指定1至125之间的数字,并写到对应服务节点的 {dataDir}/myid 文件中。
- IP地址:节点的远程IP地址,可以相同。但生产环境就不能这么做了,因为在同一台机器就无法达到容错的目的。所以这种称作为伪集群。
- 数据同步端口:主从同时数据复制端口,(做伪集群时端口号不能重复)。
- 远举端口:主从节点选举端口,(做伪集群时端口号不能重复)。
配置文件示例:
tickTime=2000
dataDir=/var/lib/zookeeper/
clientPort=2181
initLimit=5
syncLimit=2
#以下为集群配置,必须配置在所有节点的zoo.cfg文件中
server.1=zoo1:2888:3888
server.2=zoo2:2888:3888
server.3=zoo3:2888:3888
集群配置流程:
- 分别创建3个data目录用于存储各节点数据
mkdir data mkdir data/1 mkdir data/3 mkdir data/3
- 编写myid文件
echo 1 > data/1/myid echo 3 > data/3/myid echo 2 > data/2/myid
3、编写配置文件 conf/zoo1.cfgtickTime=2000 initLimit=10 syncLimit=5 dataDir=data/1 clientPort=2181 #集群配置 server.1=127.0.0.1:2887:3887 server.2=127.0.0.1:2888:3888 server.3=127.0.0.1:2889:3889
conf/zoo2.cfg
tickTime=2000
initLimit=10
syncLimit=5
dataDir=data/2
clientPort=2182
#集群配置
server.1=127.0.0.1:2887:3887
server.2=127.0.0.1:2888:3888
server.3=127.0.0.1:2889:3889
conf/zoo3.cfg
tickTime=2000
initLimit=10
syncLimit=5
dataDir=data/3
clientPort=2183
#集群配置
server.1=127.0.0.1:2887:3887
server.2=127.0.0.1:2888:3888
server.3=127.0.0.1:2889:3889
4.分别启动
./bin/zkServer.sh start conf/zoo1.cfg
./bin/zkServer.sh start conf/zoo2.cfg
./bin/zkServer.sh start conf/zoo3.cfg
5.分别查看状态
./bin/zkServer.sh status conf/zoo1.cfg
Mode: follower
./bin/zkServer.sh status conf/zoo2.cfg
Mode: leader
./bin/zkServer.sh status conf/zoo3.cfg
Mode: follower
检查集群复制情况: 1、分别连接指定节点 zkCli.sh 后加参数-server 表示连接指定IP与端口。
./bin/zkCli.sh -server 127.0.0.1:2181
./bin/zkCli.sh -server 127.0.0.1:2182
./bin/zkCli.sh -server 127.0.0.1:2183
- 任意节点中创建数据,查看其它节点已经同步成功。
注意: -server参数后同时连接多个服务节点,并用逗号隔开 127.0.0.1:2181,127.0.0.1:2182
- 集群角色说明
zookeeper 集群中总共有三种角色,分别是leader(主节点)follower(子节点) observer(次级子节点) | 角色 | 描述 | |:----|:----| | leader | 主节点,又名领导者。用于写入数据,通过选举产生,如果宕机将会选举新的主节点。 | | follower | 子节点,又名追随者。用于实现数据的读取。同时他也是主节点的备选节点,并用拥有投票权。 | | observer | 次级子节点,又名观察者。用于读取数据,与fllower区别在于没有投票权,不能选为主节点。并且在计算集群可用状态时不会将observer计算入内。 |
observer配置: 只要在集群配置中加上observer后缀即可,示例如下:
server.3=127.0.0.1:2889:3889:observer
3.选举机制
通过 ./bin:
/zkServer.sh status 命令可以查看到节点状态
./bin/zkServer.sh status conf/zoo1.cfg
Mode: follower
./bin/zkServer.sh status conf/zoo2.cfg
Mode: leader
./bin/zkServer.sh status conf/zoo3.cfg
Mode: follower
投票机制;
1.第一次投票给自己
2.第二次投票给自己id大的节点
3.zxid大的为主节点
3.总的一个原则:投票的半数机制
数据同步机制:
分为两种:因为客户端并不知道是那个节点是master那个是slave
1.数据写的时候写给leader,并且同步到flower
和所有的节点建立链接
如果请求发给leader:则走leader请求的数据同步
如果请求发给flower,则走以下的途径:
而这个的核心数据的同步过程是:zxid.这个就是上面的参数:
leader挂掉之后,整个物理机是不提供服务的,只有有新的leader节点字后才会提供服务
怎么向一个文件后增加数据?四字运维命令
echo "4lw.commands.whitelist=*" >> conf/zoo1.cfg
查看zxid命令:
zxid
leader在位期间:任何数据的变化,这个数都会+1;如果flower节点和leader节点的zxid不一致,那么数据就不一致;这个就是数据同步的基础;