Zookeeper伪集群部署及角色介绍
一、zookeeper伪分布式部署
和大多数分布式系统一样 zookeeper集群的最小集合同样为三个服务节点,当集群内半数节点无法提供服务时整个集群才无法提供服务。一般建议分布式集群服务节点数为奇数。
集群配置流程
1、创建各节点数据存储目录,我此处在zookeeper默认配置文件的临时目录1中分别为三个节点创建zoo1、zoo2、zoo3目录
mkdir /tmp/zookeeper/zoo1
mkdir /tmp/zookeeper/zoo2
mkdir /tmp/zookeeper/zoo3
2、创建myid文件、在zookeeper集群模式节点服务启动时,zk会在数据目录下找到myid文件中记录的节点ID来与配置文件中server中配置进行匹配
echo > /tmp/zookeeper/zoo1/myid 1
echo > /tmp/zookeeper/zoo2/myid 2
echo > /tmp/zookeeper/zoo3/myid 3
3、伪集群部署配置文件配置
配置语法: server.<节点ID>=<IP地址>:<数据同步端口>:<选举端口>
配置项 | 描述 |
---|---|
节点ID | 服务id手动指定1至125之间的数字,并写到对应服务节点的 {dataDir}/myid 文件中 |
IP地址 | 节点的远程IP地址 |
数据同步端口 | 主从节点选举端口 |
选举端口 | 主从节点选举端口 |
zookeeper conf目录结构 L1:
可以看到我在zk 的conf目录下分别创建了zoo1、zoo2、zoo3目录并在目录中创建zoo.cfg
conf
├── configuration.xsl
├── log4j.properties
├── zoo.cfg
├── zoo1
│ └── zoo.cfg
├── zoo2
│ └── zoo.cfg
├── zoo3
│ └── zoo.cfg
└── zoo_sample.cfg
配置示例:
#zoo1/zoo.cfg
tickTime=2000
#数据存储目录
dataDir=/tmp/zookeeper/zoo1
clientPort=2181
initLimit=5
syncLimit=2
#以下为集群配置,必须配置在所有节点的zoo.cfg文件中
server.1=127.0.0.1:2281:3281
server.2=127.0.0.1:2381:3381
server.3=127.0.0.1:2481:3481
#zoo2/zoo.cfg
tickTime=2000
#数据存储目录
dataDir=/tmp/zookeeper/zoo2
clientPort=2182
initLimit=5
syncLimit=2
#以下为集群配置,必须配置在所有节点的zoo.cfg文件中
server.1=127.0.0.1:2281:3281
server.2=127.0.0.1:2381:3381
server.3=127.0.0.1:2481:3481
#zoo3/zoo.cfg
tickTime=2000
#数据存储目录
dataDir=/tmp/zookeeper/zoo3
clientPort=2183
initLimit=5
syncLimit=2
#以下为集群配置,必须配置在所有节点的zoo.cfg文件中
server.1=127.0.0.1:2281:3281
server.2=127.0.0.1:2381:3381
server.3=127.0.0.1:2481:3481
4、启动zookeeper
# 此命令在zk根目录下执行
./bin/zkServer.sh --config conf/zoo1 start
./bin/zkServer.sh --config conf/zoo2 start
./bin/zkServer.sh --config conf/zoo1 start
#成功启动控制台输出如下信息
ZooKeeper JMX enabled by default
Using config: conf/zoo1/zoo.cfg
Starting zookeeper ... STARTED
5、查看zookeeper 各节点状态
#查询状态命令
./bin/zkServer.sh --config conf/zoo1 status
./bin/zkServer.sh --config conf/zoo2 status
./bin/zkServer.sh --config conf/zoo3 status
根据zk 的选举机制如果此时是整个集群的初次启动那么当选Leader的节点一定是zoo2,选举机制我们稍后讨论
% ./bin/zkServer.sh --config conf/zoo3 status
/usr/bin/java
ZooKeeper JMX enabled by default
Using config: conf/zoo3/zoo.cfg
Client port found: 2183. Client address: localhost.
Mode: follower
% ./bin/zkServer.sh --config conf/zoo2 status
/usr/bin/java
ZooKeeper JMX enabled by default
Using config: conf/zoo2/zoo.cfg
Client port found: 2182. Client address: localhost.
Mode: leader
% ./bin/zkServer.sh --config conf/zoo1 status
/usr/bin/java
ZooKeeper JMX enabled by default
Using config: conf/zoo1/zoo.cfg
Client port found: 2181. Client address: localhost.
Mode: follower
此时我们成功完成并启动了zookeeper的伪分布式集群,这时我们回头再查看一下conf目录结构,细心的你一定会发现zoo.cfg.dynamic.next。根据文件名不难猜想此文件与动态配置有关。如果对zookeeper动态配置感兴趣的朋友可以 以此作为入口进行研究
conf
├── configuration.xsl
├── log4j.properties
├── zoo.cfg
├── zoo1
│ ├── zoo.cfg
│ └── zoo.cfg.dynamic.next
├── zoo2
│ ├── zoo.cfg
│ └── zoo.cfg.dynamic.next
├── zoo3
│ ├── zoo.cfg
│ └── zoo.cfg.dynamic.next
└── zoo_sample.cfg
二、 zookeeper角色介绍
zookeeper集群角色
zookeeper 集群中总共有三种角色,分别是leader(领导者)follower(追随者) observer(观察者)
角色 | 描述 |
---|---|
leader | 领导者。用于写入数据,通过选举产生,如果宕机将会选举新的主节点。 |
follower | 追随者。用于实现数据的读取。同时他也是主节点的备选节点,并用拥有投票权。 |
observer | 观察者。用于读取数据,与fllower区别在于没有投票权,不能选为主节点。并且在计算集群可用状态时不会将observer计算入内。 |
Leader的作用
一个zookeeper集群中只有一个leader节点,leader节点通过选举机制产生。leader负责进行投票的发起和决议、更新系统状态。
Follower的作用
follower 用于接收客户的请求并向客户端返回结果,在选举的过程中参与投票
Observer的作用
- 在不伤害写性能的条件下扩展ZooKeeper集群
- 不会影响到ZooKeeper服务的可用性
Observer的使用配置
Observer的设置是非常简单的,仅仅需要修改配置文件中的两个配置。
- 将下面的行写入到配置文件,这行配置告诉ZooKeeper这个结点是一个Observer
peerType=observer
- 在每个服务配置文件增加:observer配置,这个配置告诉其他的服务器结点: server.4是一个Observer。因此,其他服务器不会期待server.4投票。现在,你能够像常规的Follower一样连接Observer。
server.4=127.0.0.1:2581:3681:observer
生产环境或dev环境不建议使用此默认地址,相信大家根据自己或公司的开发习惯有合理的目录地址 ↩︎