关于 Zookeeper 的总结与配置备忘

在这里插入图片描述


# Leader 选举流程 (Zab协议)
#   1.所有的 Follower 广播自己事务队列中的最大事务编号 maxId
#   2.接收集群中其他 Follower 发来的 maxId,挑选出最大的 maxId 所属的 Follower 后投票给该 Follower,选它为Leader
#   3.统计所有投票,获取投票数超过一半的 Follower 被推选为 Leader

# 广播
#   1.Leader 节点接收到请求后将事务加入事务队列,并且将事务广播给所有 Follower
#   2.Follower 接收事务并加入事务队列,然后再给 Leader 发准备提交的请求
#   3.Leader 在接收到半数以上的准备提交请求时,提交事务同时向 Follower 发送提交事务请求
#   4.Follower 提交事务 ...

# ---------------------------------------------------------------

# 其配置简单,各节点配置文件 zoo.cfg 都是相同的(仅date/myid文件内ID不同)
# Zookeeper类似于集群环境中的协调者,也能作为集群中存放"全局变量"的角色使用(不适于存放单个大容量数据)
# 是开源的分布式应用程序协调服务,其作为集群管理者的身份监视着集群中各节点的状态、根据节点提交的反馈进行其他合理操作
# 所有的分布式协商和一致性都可利用它来实现,可将其简单理解为分布式带有订阅功能的小型元数据库 ...

# ZooKeeper 集群中节点的3种角色类型
# 集群中同时只有一个Leader,其他都是 Follower、Observer(不参与选举)
#   1.Leader
#   2.Follower
#   3.Observer

# 关于 Observer 角色的说明
# https://zookeeper.apache.org/doc/current/zookeeperObservers.html

# --------------------------------------------------------------- Deploy

# 解压(略过JDK)
[root@localhost ~]# tar -zxf zookeeper-3.4.10.tar.gz -C /usr/local/
[root@localhost ~]# cd /usr/local/zookeeper-3.4.10/
[root@localhost zookeeper-3.4.10]# ls
# bin         docs             NOTICE.txt            zookeeper-3.4.10.jar
# build.xml   ivysettings.xml  README_packaging.txt  zookeeper-3.4.10.jar.asc
# conf        ivy.xml          README.txt            zookeeper-3.4.10.jar.md5
# contrib     lib              recipes               zookeeper-3.4.10.jar.sha1
# dist-maven  LICENSE.txt      src

# 创建数据、日志目录、myid文件 (启动时通过在数据目录中查找myid文件来知道自己是集群中的哪台服务器,值必须在1到254之间)
[root@localhost zookeeper-3.4.10]# mkdir -p {data,logs} && touch data/myid
[root@localhost zookeeper-3.4.10]# echo '<本节点ID>' > data/myid

# 设置环境变量
[root@localhost zookeeper-3.4.10]# cat > /etc/profile.d/zookeeper.sh <<'EOF'
export ZOOKEEPER_HOME=/usr/local/zookeeper-3.4.10/
export PATH=$ZOOKEEPER_HOME/bin:$PATH
EOF
[root@localhost zookeeper-3.4.10]# source ~/.bash_profile

# 集群中每个节点配置相同因此可直接同步配置文件而不做任何修改
[root@localhost zookeeper-3.4.10]# cat conf/zoo.cfg
# 集群间心跳的基本时间单位 (ms),并且最小会话超时将是tickTime的两倍
tickTime=2000
# 用于限制仲裁中的ZooKeeper服务器之间必须连接到领导者的时间长度,相当于最大等待时间
initLimit=10
# Leader与Follower之间发送消息,请求和应答的时间长度
syncLimit=5
# 存储内存数据库快照的位置,除非另有说明,否则存储数据库更新的事务日志 (要事先创建)
dataDir=/usr/local/zookeeper-3.4.10/data
# 事务日志目录,当此配置不存在时默认路径与 dataDir 一致 (要事先创建)
dataLogDir=/usr/local/zookeeper-3.4.10/logs
# 用于侦听客户端连接的端口
clientPort=21811
# 默认1000,当Server没有空闲来处理更多的客户端请求时,还是允许C端将请求提交到S以提高吞吐性能
# 为防止Server内存溢出,这个请求堆积数还是要限制一下  
globalOutstandingLimit=1000

# 集群成员相关配置,单节点不需此配置
server.1=192.168.220.128:2888:3888  # 需在该节点的Zookeeper/data下 echo '1' > myid 来标明其ID号 
server.2=192.168.220.128:4888:5888  # 同上...
server.3=192.168.220.128:6888:7888  # 同上...
# 格式说明: server.N=B:C:D
# N 是数字标识,指明其是第几号服务器,此数字标识与myid中的值相同
# B 是集群中的服务器IP地址
# C 指明此节点与集群中Leader服务器交换信息的端口
# D 标识的是万一集群中Leader服务器挂了,需要使用一个端口来重新选举出新的Leader

# 在分布式环境下Zookeeper的启动命令要尽量在各节点同时执行
[root@localhost conf]# cd ../bin/
[root@localhost bin]# ./zkServer.sh start
# ZooKeeper JMX enabled by default
# Using config: /usr/local/zookeeper-3.4.10/bin/../conf/zoo.cfg
# Starting zookeeper ... STARTED

# 查看当前节点状态
[root@localhost bin]# ./zkServer.sh status
# ZooKeeper JMX enabled by default
# Using config: /usr/local/zookeeper-3.4.10/bin/../conf/zoo.cfg
# Mode: standalone

# ----------------------------------------- zookeeperTools --help

# ./zkServer.sh {start|start-foreground|stop|version|restart|status|upgrade|print-cmd}
./zkServer.sh start-foreground  # 在前台启动服务器进行调试
./zkServer.sh upgrade           # 不推荐使用
./zkServer.sh print-cmd         # 打印启动参数
./zkServer.sh version           # 显示ZooKeeper服务器的版本
zkEnv.sh                        # ZooKeeper服务器的环境设置
./zkCleanup.sh -n 5             # 保留最新的5个日志和快照

Theory

# Zookeeper 使用ZAB协议作为其数据一致性的核心算法 (Paxos的实现),在读大于写的小数据类型 (不超过1MB) 的场景性能优秀
# 组成它的所有节点都能彼此了解,它们在内存中维护着状态信息,以及持久存储中的事务日志和快照,只要大多数节点可用,则服务就可用
# 提供类似 Linux 文件系统的数据模型和基于 Watcher 机制的分布式事件通知,这些特性都依赖于它的高容错性的数据一致性协议
# 数据库是包含整个数据树的内存数据库,它将更新记录到磁盘以确保可恢复性,并且在写入操作序列化到磁盘之后再将其应用于内存数据库中 ...
# 客户端仅连到一台服务器即可提交请求,读取请求从每个服务器数据库的本地副本提供服务,更改服务状态的请求(写请求)由ZAB协议处理
# 它使用反映所有事务顺序的数字标记来每个更新,后续操作可以使用它来实现更高级别的抽象,例如同步原语 (Zxid)
# 其应用非常广泛,如使用其实现共识、发布订阅、命名服务、配置中心、注册中心、分布式锁等 ...
# 所有客户端的写请求都交给 Leader,然后由 Leader 同步到其他节点,称为 Follower

# 3.2版与以前的3.1版相比,r/w性能提高了约2倍 ...
# 动态重新配置: https://zookeeper.apache.org/doc/current/zookeeperReconfig.html

# -------------------------------------------------------- Feature

# 1.顺序一致性-来自客户端的更新将按照发送的顺序应用
# 2.原子性-更新要么成功要么或失败,没有中间结果
# 3.单个系统镜像-无论客户端连接到哪个服务器,都会看到相同的内容
# 4.可靠性-应用更新后将一直持续到客户端覆盖更新为止
# 5.及时性-保证系统的客户视图在特定时间内是最新的

# --------------------------------------------------------

Znode
# ZooKeeper 命名空间 (树状结构,路径以/开头) 中的每个节点都可以具有与其关联的数据以及子节点(允许文件成为目录)
# 官方使用术语 Znode 来表示ZooKeeper中的数据节点 (Znode有两种类型: 持久节点、临时节点),它以 key/value 形式存储数据
# 旨在存储协调数据,如:状态信息,配置,位置信息等,因此存储在每个节点上的数据通常很小,在字节到千字节范围内
# 节点的顺序 (SEQUENTIAL) 属性,即当创建子节点时如果设置 SEQUENTIAL 属性,则会自动在节点名后追加整型数字,上限是整型的最大值
# Znodes 维护一个统计信息结构,其中包括用于数据更改、ACL更改、时间戳的版本号,以允许进行缓存验证和协调更新
# Znode 的数据每次更改时版本号都会增加,每当客户端检索数据时也接收数据的版本
# 每个 Znode 都有访问控制列表(ACL),用于限制谁可以执行操作 ...
# ZooKeeper 还具有临时节点的类型。因此只要创建znode的会话处于活动状态则这些znode就存在,会话结束时将删除znode
# zookeeper 规定同一级只允许有一个key名称相同的文件目录,这一特性可以用来实现分布式锁 !

# 注: 
# 提供 ACL 来控制znode节点的访问...
# 创建节点时必须使用全路径,删除节点只能一级一级删除 ...

Watch
# 基于Watcher机制来实现分布式通知功能,例如当: znode及其子节点创建/删除时、数据被改变时
# 客户端可针对znode进行watch,znode更改时将触发并删除相关watch (触发后客户端会收到数据说明znode已更改,并由客户端进行回调处理)
# 如果客户端和其中一个 ZooKeeper 服务器之间的连接断开,则客户端将收到本地通知 (网络突然坏掉不算会话失效) ...
# v3.6.0 新功能:客户端还能在znode上设置持久、递归的watch,它们在触发时不会删除,并以递归方式触发返回所有znodes的更改

# -------------------------------------------------------- Example

# 获取节点数据和节点的更新信息 (get命令包含了stat命令的输出)
[zk: localhost:2181(CONNECTED) 23] get /yarn-leader-election/appcluster-yarn/ActiveBreadCrumb
appcluster-yarnrm1                      # [该行内容为此ZNode节点的值]
cZxid = 0x1b00133dc0                    # 该节点被创建时的事务ID (Created ZXID)
ctime = Tue Jan 03 15:44:42 CST 2017    # 该节点被创建的时间 (Created Time)
mZxid = 0x1d00000063                    # 该节点最后一次被更新时的事务ID (Modified ZXID)
mtime = Fri Jan 06 08:44:25 CST 2017    # 该节点最后一次被更新的时间 (Modified Time)
pZxid = 0x1b00133dc0                    # 该节点的子ZNode列表最后被修改时的事务ID,仅当子节点列表变更才会改变,子节点内容对其不影响
cversion = 0                            # 子节点的版本
dataVersion = 11                        # 该节点的数据的版本,数据每次修改该版本号加1
aclVersion = 0                          # ACL版本号 (权限的版本),权限每次修改该版本号加1
ephemeralOwner = 0x0                    # 创建该节点的会话的 seddionID,若它是持久节点则值为 0 (可判断是否是临时节点)
dataLength = 22                         # 数据的长度
numChildren = 0                         # 该节点拥有子节点的数量(只统计直接子节点的数量)

# 在ZooKeeper中的 version 属性是用来实现乐观锁机制中的『写入校验』的,用于保证分布式数据原子性操作

# -------------------------------------------------------- 适用场景
#   1.分布式锁
#   2.统一配置管理
#   3.集群管理
#   4.分布式协调/通知
#   5.数据发布/订阅
#   6.负载均衡

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值