赞
踩
前置条件:需要安装jdk 1.8
版本号:zookeeper-3.4.10
三台虚拟机:一主两从(已经提前做了免密登录,hostname修改,hosts地址映射)
node1
node2
node3
在搭建 zookeeper 集群之前,我们首先要明白为什么要选择三台机器搭建,2台不可以吗?4台不可以吗?
zookeeper 集群通常是用来对用户的分布式应用程序提供协调服务的,为了保证数据的一致性,对 zookeeper 集群进行了这样三种角色划分:leader、follower、observer分别对应着总统、议员和观察者。
总统(leader):负责进行投票的发起和决议,更新系统状态。
议员(follower):用于接收客户端请求并向客户端返回结果以及在选举过程中参与投票。
观察者(observer):也可以接收客户端连接,将写请求转发给leader节点,但是不参与投票过程,只同步leader的状态。通常对查询操作做负载。
我们知道,在每台机器数据保持一致的情况下,zookeeper集群可以保证,客户端发起的每次查询操作,集群节点都能返回同样的结果。
但是对于客户端发起的修改、删除等能改变数据的操作呢?集群中那么多台机器,你修改你的,我修改我的,最后返回集群中哪台机器的数据呢?
这就是一盘散沙,需要一个领导,于是在zookeeper集群中,leader的作用就体现出来了,只有leader节点才有权利发起修改数据的操作,而follower节点即使接收到了客户端发起的修改操作,也要将其转交给leader来处理,leader接收到修改数据的请求后,会向所有follower广播一条消息,让他们执行某项操作,follower 执行完后,便会向 leader 回复执行完毕。当 leader 收到半数以上的 follower 的确认消息,便会判定该操作执行完毕,然后向所有 follower 广播该操作已经生效。
所以zookeeper集群中leader是不可缺少的,但是 leader 节点是怎么产生的呢?其实就是由所有follower 节点选举产生的,讲究民主嘛,而且leader节点只能有一个,毕竟一个国家不能有多个总统。
这个时候回到我们的小标题,为什么 zookeeper 节点数是奇数,我们下面来一一来说明:
①、容错率
首先从容错率来说明:(需要保证集群能够有半数进行投票)
2台服务器,至少2台正常运行才行(2的半数为1,半数以上最少为2),正常运行1台服务器都不允许挂掉,但是相对于 单节点服务器,2台服务器还有两个单点故障,所以直接排除了。
3台服务器,至少2台正常运行才行(3的半数为1.5,半数以上最少为2),正常运行可以允许1台服务器挂掉
4台服务器,至少3台正常运行才行(4的半数为2,半数以上最少为3),正常运行可以允许1台服务器挂掉
5台服务器,至少3台正常运行才行(5的半数为2.5,半数以上最少为3),正常运行可以允许2台服务器挂掉
②、防脑裂
脑裂集群的脑裂通常是发生在节点之间通信不可达的情况下,集群会分裂成不同的小集群,小集群各自选出自己的leader节点,导致原有的集群出现多个leader节点的情况,这就是脑裂。
3台服务器,投票选举半数为1.5,一台服务裂开,和另外两台服务器无法通行,这时候2台服务器的集群(2票大于半数1.5票),所以可以选举出leader,而 1 台服务器的集群无法选举。
4台服务器,投票选举半数为2,可以分成 1,3两个集群或者2,2两个集群,对于 1,3集群,3集群可以选举;对于2,2集群,则不能选择,造成没有leader节点。
5台服务器,投票选举半数为2.5,可以分成1,4两个集群,或者2,3两集群,这两个集群分别都只能选举一个集群,满足zookeeper集群搭建数目。
以上分析,我们从容错率以及防止脑裂两方面说明了3台服务器是搭建集群的最少数目,4台发生脑裂时会造成没有leader节点的错误。
链接: https://pan.baidu.com/s/1EZq9J3rUBABv0wW46BvtOg
密码: pwro
自行选择上传方式
tar -zxvf zookeeper-3.4.10.tar.gz -C /usr/local/src
vim /etc/profile
新增zookeeper的配置:
export ZOOKEEPER_HOME=/usr/local/src/zookeeper-3.4.10
export PATH=$PATH:${JAVA_HOME}/bin:${ZOOKEEPER_HOME}/bin
使配置生效:
source /etc/profile
进入到zookeeper安装目录的conf目录下:
cd /usr/local/src/zookeeper-3.4.10/conf
复制一份配置文件zoo_sample.cfg 改名为:zoo.cfg
cp zoo_sample.cfg zoo.cfg
修改zoo.cfg
vim zoo.cfg
修改内容如下:
# zookeeper节点树文件的存放目录,持久化使用的,我们更换一个目录
dataDir=/usr/local/src/zookeeper-3.4.10/data
# 1 代表的是选举id 2881是广播端口 3881是选举端口
server.1=node2:2881:3881
server.2=node3:2881:3881
server.3=node4:2881:3881
编辑后保存
在zookeeper安装目录下创建data目录,是刚才在上步配置的路径
mkdir data
在data文件下新建文件,存储选举id:
echo 1 > myid
将配置好的zookeeper目录直接复制到node3 和node4 下
scp -r zookeeper-3.4.10/ node3:`pwd`
scp -r zookeeper-3.4.10/ node4:`pwd`
修改其他两台的myid的值,node3改为2,node4改为3
注意:因为我的三台机器环境变量是一致的,可以直接复制,如果有不一致的地方不能直接复制,需要手动添加配置
scp /etc/profile node3:/etc/
scp /etc/profile node4:/etc/
之后分别到node3和node4执行命令,让配置生效
source /etc/profile
启动命令:
zkServer.sh start
停止命令:
zkServer.sh stop
查看节点状态命令:
zkServer.sh status
重新启动命令:
zkServer.sh restart
查看节点状态:
zkServer.sh status
可以看到node4是主节点,node2和node3是从节点。
zkCli.sh -server 具体的ip
zkCli.sh -server node2
create [-s] [-e] path data acl
其中,-s 或-e 分别指定节点特性,顺序或临时节点,若不指定,则表示持
久节点;acl 用来进行权限控制。
创建顺序节点:
create -s /test 123
创建临时节点:
create -e /test-tmp 123tmp
创建永久节点:
create /test-p 123p
与读取相关的命令有 ls 命令和 get 命令,ls 命令可以列出 Zookeeper 指
定节点下的所有子节点,只能查看指定节点下的第一级的所有子节点;get 命令
可以获取 Zookeeper 指定节点的数据内容和属性信息。
ls path [watch]
get path [watch]
ls2 path [watch]
set path data [version]
data 就是要更新的新内容,version 表示数据版本。
set /test-p 123pupdate
现在 dataVersion 已经变为 1 了,表示进行了更新。
delete path [version]
若删除节点存在子节点,那么无法删除该节点,必须先删除子节点,再删除
父节点。
Rmr path
可以递归删除节点。
delete /test-p
模拟宕机的情况,将leader节点node4的进程杀掉,看下集群情况
查看node2和node3阶段的状态,可以看到node3成为了新的leader
zkServer.sh status
再将node4节点启动,查看状态,可以看到角色变成了follower
至此,zookeeper集群版安装完成,并且支持高可用。
如有问题,请联系作者修改!
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。