zk-1

174 阅读2分钟

分布式

分布式的问题

  1. session
  2. 配置中心
  3. 分布式事务
  4. 分布式锁

cap

  1. c强一致性
  2. a可用性
  3. p分区容错性

base理论

基本可用 软状态 最终一致性


zk

解决数据一致性

zoo.cfg
# The number of milliseconds of each tick
# 单位是毫秒,心跳时间
tickTime=2000
# The number of ticks that the initial
# synchronization phase can take
# 集群中的follower服务器(F)与leader服务器(L)之间初始连接时能容忍的最多心跳数
# 单位是tickTime
initLimit=10
# The number of ticks that can pass between
# sending a request and getting an acknowledgement
# 集群中flower服务器(F)跟leader(L)服务器之间的请求和答应最多能容忍的心跳数
# 单位是tickTime
syncLimit=5
# the directory where the snapshot is stored.
# do not use /tmp for storage, /tmp here is just
# example sakes.
# 该属性对应的目录是用来存放myid信息跟一些版本,日志,跟服务器唯一的ID信息等
dataDir=/tmp/zookeeper
# the port at which the clients will connect
# 端口
clientPort=2181
# the maximum number of client connections.
# increase this if you need to handle more clients
#maxClientCnxns=60
#
# Be sure to read the maintenance section of the
# administrator guide before turning on autopurge.
#
# http://zookeeper.apache.org/doc/current/zookeeperAdmin.html#sc_maintenance
#
# The number of snapshots to retain in dataDir
#autopurge.snapRetainCount=3
# Purge task interval in hours
# Set to "0" to disable auto purge feature
#autopurge.purgeInterval=1
命令
# 单机
1.启动服务端
zkServer.sh start
2.连接
zkCli.sh -server localhost:2181
# 集群
> /Users/lijunlong/installsoft/zookeeper-3.4.14/conf/cluster/zoo1.cfg
tickTime=2000
initLimit=10
syncLimit=5
dataDir=/tmp/zookeeper/cluster/data1
clientPort=2181
# server.x是和myid值一致。第一个端口是同步端口,第二个端口是选举端口
server.1=localhost:2887:3887
server.2=localhost:2888:3888
server.3=localhost:2889:3889
server.4=localhost:2890:3890:observer

> /Users/lijunlong/installsoft/zookeeper-3.4.14/conf/cluster/zoo2.cfg
tickTime=2000
initLimit=10
syncLimit=5
dataDir=/tmp/zookeeper/cluster/data2
clientPort=2182
server.1=localhost:2887:3887
server.2=localhost:2888:3888
server.3=localhost:2889:3889
server.4=localhost:2890:3890:observer

> /Users/lijunlong/installsoft/zookeeper-3.4.14/conf/cluster/zoo3.cfg
tickTime=2000
initLimit=10
syncLimit=5
dataDir=/tmp/zookeeper/cluster/data3
clientPort=2183
server.1=localhost:2887:3887
server.2=localhost:2888:3888
server.3=localhost:2889:3889
server.4=localhost:2890:3890:observer

> /Users/lijunlong/installsoft/zookeeper-3.4.14/conf/cluster/zoo4.cfg
tickTime=2000
initLimit=10
syncLimit=5
dataDir=/tmp/zookeeper/cluster/data4
clientPort=2184
peerType=observer
server.1=localhost:2887:3887
server.2=localhost:2888:3888
server.3=localhost:2889:3889
server.4=localhost:2890:3890:observer

> echo "1" > /tmp/zookeeper/cluster/data1/myid
> echo "2" > /tmp/zookeeper/cluster/data2/myid
> echo "3" > /tmp/zookeeper/cluster/data3/myid
> echo "4" > /tmp/zookeeper/cluster/data4/myid

>zkServer.sh start /Users/lijunlong/installsoft/zookeeper-3.4.14/conf/cluster/zoo1.cfg
>zkServer.sh start /Users/lijunlong/installsoft/zookeeper-3.4.14/conf/cluster/zoo2.cfg
>zkServer.sh start /Users/lijunlong/installsoft/zookeeper-3.4.14/conf/cluster/zoo3.cfg
>zkServer.sh start /Users/lijunlong/installsoft/zookeeper-3.4.14/conf/cluster/zoo4.cfg
# zoo1 follower
# zoo2 leader
# zoo3 follower
# zoo4 observer
# 角色跟启动顺序有关系
# 查看状态
>zkServer.sh status /Users/lijunlong/installsoft/zookeeper-3.4.14/conf/cluster/zoo3.cfg
算法
  • 角色
    • leader
      • 负责进行投票的发起和决议,最终更新状态
    • follower
      • 接受客户请求并返回结果,参与leader发起的投票
    • observer
      • 不参与投票,可以接受读操作,写操作将请求转发给leader节点
    • learner
      • 同步状态都是,follower和observer都是
  • 协议
    • zab
      • 一致性协议,leader发送请求,包括自己也算进来

zk图

zk cluster