共计 1931 个字符,预计需要花费 5 分钟才能阅读完成。
server 和 client:
server 指集群的每一台机器
client 指每一个向 server 请求服务的机器
zookeeper 角色:
leader:为客户端提供写服务,负责进行投票的发起和决议,更新系统状态,事务请求的唯一调度和处理者
follower:为客户端提供读服务,参与投票,包括事务请求 proposal 投票和 leader 选举投票,接收客户端请求,为客户端返回结果
observe:为客户端提供读服务,不参与任何投票,包括事务请求 proposal 投票和 leader 选举投票,同步 leader 的状态,加快读写速度
znode(数据节点):
zookeeper 将所有数据存在内存中,数据模型是一棵树,用斜杠 / 进行分割的路径就是一个 znode,zkCli.sh 使用命令行就是对 znode 的操作
zap 协议
为保证 zookeeper 服务的原子性,保证每个 server 间的状态同步,包括两种模式:
崩溃恢复模式:当服务启动或 leader 服务器崩溃退出与重启,zap 进入崩溃恢复模式,选举 leader 服务器或新的 leader 服务器,当 leader 被选举出来后,且集群中有过半的机器完成与 leader 服务器的状态同步,zap 就退出恢复模式
消息广播模式:当集群中有过半的 follower 完成 与 leader 的状态同步,就进入消息广播模式。当有新的 server 加入到 zookeeper 服务中,会以恢复模式启动,找到 leader 服务器,完成状态同步,然后一起参与到消息广播模式
zookeeper 特性:
顺序一致性:同一个客户端的请求严格按照其发起的顺序执行
原子性:事务的一次执行在每个 server 上应该是一致的,要么都执行,要么都不执行
单一视图:每个 server 的数据视图都是一样的
实时性:在一定时间内,zookeeper 应该保证 client 读取的数据是最新的
zookeeper 选举
zookeeper 节点状态:
LOOKING
LEADING
FOLLOWERING
OBSERVE
当最初的时候,每个 server 的最初状态都是 LOOKING,当 leader 服务器选举出来后,leader 服务器状态变为 LEADING,不是 observe 服务器的 server 的状态自动变为 FOLLOWERING,当 leader 服务器挂掉之后,所有非 observe 的 server 将状态都改为 LOOKING,进行新的选举,选举出新的 leader 服务器,然后 leader 服务器状态变为 LEADING,不是 observe 的 server 的状态自动变为 FOLLOWERING。
zxid(zookeeper 事务 id):zookeeper 状态每次改变都会收到一个不同全局唯一的 zxid,删除节点,创建节点都会使 zookeeper 状态改变,zxid 不断递增
leader 服务器选取规则:
优先检查 zxid,zxid 大的作为 leader 服务器
zxid,相同就比较 myid 大小,myid 大的作为 leader 服务器
只有获取过半 server 的支持才能成为 leader
zookeeper 选举算法:
basic paxos 和 fast paxos
basic paxos:选举线程向所有 server 发起一次询问,按照服务器选取规则去比较,选出下一次要询问的 server,当被选取的 server 有一般 server 支持,则成为 leader 服务器,不然就一直选举,直到选出了 leader
fast paxos:一个 server 声明自己要做 leader,其它 server 将配合工作,解决 zxid 和 epoch 冲突,并向该 server 发送接收提议的消息
zookeeper 命令行使用:
将 zookeeper 加入环境变量后,在命令行运行 zkCli.sh 进入 zookeeper 命令行,连接不同的主机用./zkCli.sh -server ip:port
创建节点(znode):create [-s][-e] path data acl - s 为顺序节点,- e 为临时节点,退出 zookeeper 命令行后就删除,不指定默认为永久节点 例:create /zk-permanent 123 创建永久节点 /zk-permanent
读取节点(znode):ls path 或者 ls2 path 或者 get path 例:ls / 查看根目录下的 znode,get 或 ls2 /zk-permanent 查看节点 /zk-permanent 的详情
更新节点(znode):set path data 例:set /zk-permanent 456 将 /zk-permanent 的内容更新为 456
删除节点(znode):delete path 例:delete /zk-permanent,注意,若删除节点存在子节点,则无法完成删除,必须先删除子节点才能删除父节点
: