欢迎来到窥视未来的博客

Fork me on GitHub

Zookeeper 全局设计+集群环境搭建

zookeeper是什么?

(分布式协调)通过分布式协调组件多节点顺序一致性,简单来说zookeeper=文件系统+监听通知机制

 

Google Chubby(不开源产品)

  解决分布式一致性

 

 

 

 

 


 

单机

  • 修改zoo.cfg

  • sh zkServer.sh start

集群

 

集群的角色:leader、follower、observer

leader

  • 整个集群中的调度节点

  • 数据的同步

follower

  • 高可用特性

  • 参与投票(leader选举的投票,数据达成一致的投票)

    • 过半提交(集群节点过多会影响整个集群性能的数据同步)

  • 处理客户端请求(提升集群性能)

observer

  1. observer不参与投票。 只同步 leader的状态 ;

  2. observers 接受客户端的连接,并将写请求转发给 leader节点 ;

  3. 加入更多ObServer 节点,提高伸缩性,同时还不影响吞吐率。

  4. 2N+1台组成(过半提交决策)大于过半

为什么在Zookeeper中Server 数目一般为奇数?

我们知道在Zookeeper中 Leader 选举算法采用了Zab协议。Zab核心思想是当多数 Server 写成功,则任务数据写成功。

安装部署/集群

  • 修改配置文件zoo.cfg,原配置文件,添加集群节点配置

  • $dataDir/myid 添加一个Myid文件

​
/home/program/zookeeper-3.4.14/data
​
如果需要增加observer节点
同时在zoo.cfg中增加;peerType=observer
Server.1=192.168.11.129:2888:3181    
Server.2=192.168.11.135:2888:3181
Server.3=192.168.11.136:2888:3181:observer

 


# The number of milliseconds of each tick
# 这个时间是作为 Zookeeper 服务器之间或客户端与服务器之间维持心跳的时间间隔,也就是每个 tickTime 时间就会发送一个心跳。
  2 tickTime=2000   
  3 # The number of ticks that the initial 
  4 # synchronization phase can take    
  5 initLimit=10
  6 # The number of ticks that can pass between 
  7 # sending a request and getting an acknowledgement
# 这个配置项标识 Leader 与 Follower 之间发送消息,请求和应答时间长度,最长不能超过多少个 tickTime 的时间长度,总的时间长度就是 5*2000=10秒
  8 syncLimit=5
  9 # the directory where the snapshot is stored.
 10 # do not use /tmp for storage, /tmp here is just 
 11 # example sakes.
# 顾名思义就是 Zookeeper 保存数据的目录,默认情况下,Zookeeper 将写数据的日志文件也保存在这个目录里。
 12 dataDir=/home/program/zookeeper-3.4.14/data
 13 # the port at which the clients will connect
# 这个端口就是客户端连接 Zookeeper 服务器的端口,Zookeeper 会监听这个端口,接受客户端的访问请求。
 14 clientPort=2181
 15 # the maximum number of client connections.
 16 # increase this if you need to handle more clients
 17 #maxClientCnxns=60
 18 #
 19 # Be sure to read the maintenance section of the 
 20 # administrator guide before turning on autopurge.
 21 #
 22 # http://zookeeper.apache.org/doc/current/zookeeperAdmin.html#sc_maintenance
 23 #
 24 # The number of snapshots to retain in dataDir
 25 #autopurge.snapRetainCount=3
 26 # Purge task interval in hours
 27 # Set to "0" to disable auto purge feature
 28 #autopurge.purgeInterval=1
 29 server.1=192.168.1.102:2888:3181:observer
 30 server.2=192.168.1.115:2888:3181
 31 server.3=192.168.1.106:2888:3181

 


配置说明

  • tickTime:这个时间是作为 Zookeeper 服务器之间或客户端与服务器之间维持心跳的时间间隔,也就是每个 tickTime 时间就会发送一个心跳。

  • initLimit:这个配置项是用来配置 Zookeeper 接受客户端(这里所说的客户端不是用户连接 Zookeeper 服务器的客户端,而是 Zookeeper 服务器集群中连接到 Leader 的 Follower 服务器)初始化连接时最长能忍受多少个心跳时间间隔数。当已经超过 10个心跳的时间(也就是 tickTime)长度后 Zookeeper 服务器还没有收到客户端的返回信息,那么表明这个客户端连接失败。总的时间长度就是 10*2000=20 秒

  • syncLimit:这个配置项标识 Leader 与 Follower 之间发送消息,请求和应答时间长度,最长不能超过多少个 tickTime 的时间长度,总的时间长度就是 5*2000=10秒

  • dataDir:顾名思义就是 Zookeeper 保存数据的目录,默认情况下,Zookeeper 将写数据的日志文件也保存在这个目录里。

  • clientPort:这个端口就是客户端连接 Zookeeper 服务器的端口,Zookeeper 会监听这个端口,接受客户端的访问请求。

  • server.A=B:C:D:其中 A 是一个数字,表示这个是第几号服务器;B 是这个服务器的 ip 地址;C 表示的是这个服务器与集群中的 Leader 服务器交换信息的端口;D 表示的是万一集群中的 Leader 服务器挂了,需要一个端口来重新进行选举,选出一个新的 Leader,而这个端口就是用来执行选举时服务器相互通信的端口。如果是伪集群的配置方式,由于 B 都是一样,所以不同的 Zookeeper 实例通信端口号不能一样,所以要给它们分配不同的端口号。

远程访问

sh zkCli.sh -server 192.168.1.102

 

 

 


 

Zookeeper的数据模型

 

 

 

 


 

节点特性

临时节点(生命周期

持久化节点,客户端与zookeeper断开连接后,该节点依旧存在 有序节点(递增序列号) 先有父节点,再有子节点 临时节点下不能存在子节点 同级节点下,节点名称必须是唯一

有序节点使用场景

  • 有序节点:全局ID

  • 分布式锁

  • 分布式队列

同级节点的唯一性

  • master选举

  • 分布式锁(锁用来解决安全性)

zookeeper数据结构

  • 服务注册

  • 配置中心

查询相关指令

[zk: 192.168.1.102(CONNECTED) 18] ls /

[zookeeper]

查看节点状态

[zk: 192.168.1.102(CONNECTED) 19] stat /zookeeper

 

创建节点指令

[zk: 192.168.1.102:2181(CONNECTED) 1] create /node1 123

Created /node1

 

 

 

如上:在根目录创建了node_1节点,携带数据 123

· cZxid:创建节点时的事务id
· pZxid:子节点列表最后一次被修改的事务id
· cversion:节点版本号
· dataCersion:数据版本号
. aclVerson:acl权限版本号
----------------------------------------------------------------
cZxid = 0x0        // 创建节点时的事务id
ctime = Thu Jan 01 08:00:00 CST 1970
mZxid = 0x0        // 修改的事务id
mtime = Thu Jan 01 08:00:00 CST 1970
pZxid = 0x200000002        // 子节点列表最后一次被修改的事务id
cversion = 0            //节点版本号(乐观锁)
dataVersion = 0            //数据版本号
aclVersion = 0            //权限版本号
ephemeralOwner = 0x0     // 临时节点所属会话
dataLength = 0             // 数据的长度
numChildren = 2             // 子节点梳理(当前节点)

cversion=1->2 子节点的版本号

dataVersion 表示当前节点

 

posted on 2020-10-02 12:56  窥视未来  阅读(122)  评论(0编辑  收藏  举报

导航