Zookeeper简介

Zookeeper是什么?

Zookeeper 是⼀个分布式协调服务的开源框架。 主要⽤来解决分布式集群中应⽤系统的⼀致性问题,例如怎样避免同时操作同⼀数据造成脏读的问题。分布式系统中数据存在⼀致性的问题!!

  • ZooKeeper 本质上是⼀个分布式的⼩⽂件存储系统。 提供基于类似于⽂件系统的⽬录树⽅式的数据存储,并且可以对树中的节点进⾏有效管理。

  • ZooKeeper 提供给客户端监控存储在zk内部数据的功能,从⽽可以达到基于数据的集群管理。 诸如: 统⼀命名服务(dubbo)、分布式配置管理(solr的配置集中管理)、分布式消息队列(sub/pub)、分布式锁、分布式协调等功能。

Zookeeper的架构组成


  • Leader

    • Zookeeper 集群⼯作的核⼼⻆⾊。

    • 集群内部各个服务器的调度者。

    • 事务请求(写操作) 的唯⼀调度和处理者,保证集群事务处理的顺序性;对于 create,setData, delete 等有写操作的请求,则需要统⼀转发给leader 处理, leader 需要决定编号、执⾏操作,这个过程称为⼀个事务。

  • Follower

    • 处理客户端⾮事务(读操作) 请求。

    • 转发事务请求给 Leader。

    • 参与集群 Leader 选举投票 2n-1台可以做集群投票。

    • 此外,针对访问量⽐较⼤的 zookeeper 集群, 还可新增观察者⻆⾊。

  • Observer

    • 观察者⻆⾊,观察 Zookeeper 集群的最新状态变化并将这些状态同步过来,其对于⾮事务请求可以进⾏独⽴处理,对于事务请求,则会转发给 Leader服务器进⾏处理。

    • 不会参与任何形式的投票只提供⾮事务服务,通常⽤于在不影响集群事务处理能⼒的前提下提升集群的⾮事务处理能⼒。增加了集群增加并发的读请求。

      ZK也是Master/slave架构,但是与之前不同的是zk集群中的Leader不是指定⽽来,⽽是通过选举产⽣。

Zookeeper 特点

  1. Zookeeper:⼀个领导者(leader:⽼⼤),多个跟随者(follower:⼩弟)组成的集群。

  2. Leader负责进⾏投票的发起和决议,更新系统状态(内部原理)

  3. Follower⽤于接收客户请求并向客户端返回结果,在选举Leader过程中参与投票

  4. 集群中只要有半数以上节点存活,Zookeeper集群就能正常服务。

  5. 全局数据⼀致:每个server保存⼀份相同的数据副本,Client⽆论连接到哪个server,数据都是⼀致的。

  6. 更新请求顺序进⾏(内部原理)

  7. 数据更新原⼦性,⼀次数据更新要么成功,要么失败。

Zookeeper环境搭建

Zookeeper的搭建⽅式

Zookeeper安装⽅式有三种,单机模式和集群模式以及伪集群模式。

  • 单机模式:Zookeeper只运⾏在⼀台服务器上,适合测试环境。

  • 伪集群模式:就是在⼀台服务器上运⾏多个Zookeeper 实例。

  • 集群模式:Zookeeper运⾏于⼀个集群上,适合⽣产环境,这个计算机集群被称为⼀个“集合体”。

Zookeeper集群搭建

  1. 下载,上传并解压缩

⾸先我们下载稳定版本的zookeeper http://zookeeper.apache.org/releases.html


下载完成后,将zookeeper压缩包 zookeeper-3.4.14.tar.gz上传到linux系统/opt/lagou/software

1
tar -zxvf zookeeper-3.4.14.tar.gz -C ../servers/

  1. 修改配置⽂件创建data与log⽬录
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
#创建zk存储数据⽬录
mkdir -p /opt/lagou/servers/zookeeper-3.4.14/data

#创建zk⽇志⽂件⽬录
mkdir -p /opt/lagou/servers/zookeeper-3.4.14/data/logs

#修改zk配置⽂件
cd /opt/lagou/servers/zookeeper-3.4.14/conf

#⽂件改名并配置
mv zoo_sample.cfg zoo.cfg
vim zoo.cfg

#更新datadir
dataDir=/opt/lagou/servers/zookeeper-3.4.14/data
#增加logdir
dataLogDir=/opt/lagou/servers/zookeeper-3.4.14/data/logs
#增加集群配置
##server.服务器ID=服务器IP地址:服务器之间通信端⼝:服务器之间投票选举端⼝
server.1=Linux121:2888:3888
server.2=Linux122:2888:3888
server.3=Linux123:2888:3888
#打开注释
#ZK提供了⾃动清理事务⽇志和快照⽂件的功能,这个参数指定了清理频率,单位是⼩时
autopurge.purgeInterval=1

  1. 添加myid配置
  • 在zookeeper的 data ⽬录下创建⼀个 myid ⽂件,内容为1,这个⽂件就是记录每个服务器的ID
1
2
3
cd /opt/lagou/servers/zookeeper-3.4.14/data

echo 1 > myid
  • 安装包分发并修改myid的值
1
rsync-script /opt/lagou/servers/zookeeper-3.4.14
  • 修改myid值 Linux122
1
echo 2 >/opt/lagou/servers/zookeeper-3.4.14/data/myid
  • 修改myid值 Linux123
1
echo 3 >/opt/lagou/servers/zookeeper-3.4.14/data/myid
  • 依次启动三个zk实例(三个节点都要执⾏)
1
/opt/lagou/servers/zookeeper-3.4.14/bin/zkServer.sh start
  • 查看zk启动情况
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
/opt/lagou/servers/zookeeper-3.4.14/bin/zkServer.sh status

[root@Linux121 bin]# /opt/lagou/servers/zookeeper-3.4.14/bin/zkServer.sh status
ZooKeeper JMX enabled by default
Using config: /opt/lagou/servers/zookeeper-3.4.14/bin/../conf/zoo.cfg
Mode: follower

[root@Linux122 ~]# /opt/lagou/servers/zookeeper-3.4.14/bin/zkServer.sh status
ZooKeeper JMX enabled by default
Using config: /opt/lagou/servers/zookeeper-3.4.14/bin/../conf/zoo.cfg
Mode: leader

[root@Linux123 data]# /opt/lagou/servers/zookeeper-3.4.14/bin/zkServer.sh status
ZooKeeper JMX enabled by default
Using config: /opt/lagou/servers/zookeeper-3.4.14/bin/../conf/zoo.cfg
Mode: follower

Zookeeper 集群启动停⽌脚本

在/usr/local/bin下创建zk.sh文件,内容如下:

1
2
3
4
5
6
7
8
9
10
11
12
#!/bin/sh
echo "start zookeeper server..."
if(($#==0));then
echo "no params";
exit;
fi
hosts="Linux121 Linux122 Linux123"
for host in $hosts
do
ssh $host "source /etc/profile; /opt/lagou/servers/zookeeper-
3.4.14/bin/zkServer.sh $1"
done
1
2
3
4
5
6
7
cd /usr/local/bin

# 集群停止
sh zk.sh stop

# 集群启动
sh zk.sh start