ZooKeeper

一、介绍ZooKeeper

1.ZooKeeper 使用场景: 
ZooKeeper 是一个分布式服务框架,它主要是用来解决分布式应用中经常遇到的一些数据管理问题,如:命名服务、状态同步、配置中心、集群管理等。


2.命名服务:
命名服务是分布式系统中比较常见的一类场景。命名服务是分布式系统最基本的公共服务之一。在分布式系统中,被命名的实体通常可以是集群中的机器、提供的服务地址或远程对象等——这些我们都可以统称它们为名字(Name),其中较为常见的就是一些分布式服务框架(如 RPC、RMI)中的服务地址列表,通过使用命名服务,客户端应用能够根据指定名字来获取资源的实体、服务地址和提供者的信息等。


3.状态同步:
每个节点除了存储数据内容和 node 节点状态信息之外,还存储了已经注册的APP 的状态信息,当有些节点或 APP 不可用,就将当前状态同步给其他服务。


4.配置中心:
现在我们大多数应用都是采用的是分布式开发的应用,搭建到不同的服务器上,我们的配置文件,同一个应用程序的配置文件一样,还有就是多个程序存在相同的配置,当我们配置文件中有个配置属性需要改,我们需要改变每个程序的配置属性,这样会很麻烦的去修改配置,那么可用使用 ZooKeeper 来实现配置中心,ZooKeeper采用的是推拉相结合的方式:客户端想服务端注册自己需要关注的节点,一旦该节点的数据发生变更,那么服务端就会向相应的客户端发送Watcher事件通知,客户端接收到这个消息通知后,需要主动到服务端获取最新的数据。

5.集群管理:
所谓集群管理,包括集群监控与集群控制两大块,前者侧重对集群运行时状态的收集,后者则是对集群进行操作与控制,在日常开发和运维过程中,我们经常会有类似于如下的需求:
    希望知道当前集群中究竟有多少机器在工作。
    对集群中每台机器的运行时状态进行数据收集。
    对集群中机器进行上下线操作。


ZooKeeper 具有以下两大特性。
客户端如果对 ZooKeeper 的一个数据节点注册 Watcher 监听,那么当该数据节点的内容或是其子节点列表发生变更时,ZooKeeper 服务器就会向订阅的客户端发送变更通知。
对在 ZooKeeper 上创建的临时节点,一旦客户端与服务器之间的会话失效,那么该临时节点也就被自动清除。



Watcher(事件监听器),是 Zookeeper 中的一个很重要的特性。Zookeeper 允许用户在指定节点上注册一些 Watcher,并且在一些特定事件触发的时候,ZooKeeper 服务端会将事件通知到感兴趣的客户端上去,该机制是 Zookeeper实现分布式协调服务的重要特性
0 生产者启动
1 生产者注册至 zookeeper
2 消费者启动并订阅频道
3 zookeeper 通知消费者事件
4 消费者调用生产者
5 监控中心负责统计和监控服务状态

 

二、安装单机ZooKeeper

#配置 java 环境:
[root@localhost7h ]# yum --showduplicate list java* | grep 1.8.0
[root@localhost7h ]# yum install  java-1.8.0-openjdk

#解压
[root@localhost7h ]# tar xvf zookeeper-3.4.14.tar.gz 
[root@localhost7h ]# ln -sv  zookeeper-3.4.14  zookeeper
[root@localhost7h ]# cd zookeeper
[root@localhost7h zookeeper]# conf/zoo_sample.cfg  conf/zoo.cfg 
[root@localhost7h zookeeper]# mkdir data
[root@localhost7h zookeeper]# chown root:root  /usr/local/zookeeper/  -R

修改显示文件
[root@localhost7h zookeeper]# grep -v "^#" /usr/local/zookeeper/conf/zoo.cfg 
tickTime=2000
initLimit=10
syncLimit=5
dataDir=/usr/local/zookeeper/data/
clientPort=2181
maxClientCnxns=120

[root@localhost7h zookeeper]# ./bin/zkServer.sh start

三、群集ZooKeeper


ZooKeeper 集群用于解决单点和单机性能及数据高可用等问题




Zookeeper 集群中的机器分为以下三种角色:
Leader   :为客户端提供读写服务,并维护集群状态,它是由集群选举所产生的;
Follower :为客户端提供读写服务,并定期向 Leader 汇报自己的节点状态。同时也参与写操作“过半写成功”的策略和 Leader 的选举;
Observer :为客户端提供读写服务,并定期向 Leader 汇报自己的节点状态,但不参与写操作“过半写成功”的策略和 Leader 的选举,因此 Observer 可以在不影响写性能的情况下提升集群的读性能。

Zookeeper 的集群部署过程。 zookeeper 集群特性:整个集群种只要有超过集群数量一半的 zookeeper 工作只正常的,那么整个集群对外就是可用的,假如有
2 台服务器做了一个zookeeper集群,只要有任何一台故障或宕机,那么这个 zookeeper 集群就不可用了,因为剩下的一台没有超过集群一半的数量,但是假如有三台 zookeeper 组成一个集群,那么损坏一台就还剩两台,大于 3台的一半,所以损坏一台还是可以正常运行的,但是再损坏一台就只剩一台集群就不可用了。那么要是 4 台组成一个zookeeper 集群,损坏一台集群肯定是正常的,那么损坏两台就还剩两台,那么2 台不大于集群数量的一半,所以 3 台的 zookeeper 集群和 4 台的 zookeeper 集群损坏两台的结果都是集群不可用,以此类推 5 台和 6 台以及 7 台和 8 台都是同理,所以这也就是为什么集群一般都是奇数的原因。 #配置文件说明 tickTime=2000 #服务器与服务器之间的单次心跳检测时间间隔,单位为毫秒 initLimit=10 #集群中 leader 服务器与 follower 服务器初始连接心跳次数,即多少个 2000 毫秒 syncLimit=5 #leader 与 follower 之间连接完成之后,后期检测发送和应答的心跳次数,如果该 follower 在设置的时间内(5*2000)不能与 leader 进行通信,那么此 follower 将被视为不可用。 dataDir=/usr/local/zookeeper/data #自定义的 zookeeper 保存数据的目录 clientPort=2181 #客户端连接 Zookeeper 服务器的端口,Zookeeper 会监听这个端口,接受客户端的访问请求 maxClientCnxns=128 #单个客户端 IP 可以和 zookeeper 保持的连接数 autopurge.snapRetainCount=3 #3.4.0 中的新增功能:启用后,ZooKeeper 自动清除功能会将 autopurge.snapRetainCount 最新快照和相应的事务日志分别保留在 dataDir 和 dataLogDir 中,并删除其余部分,默认值为 3。最小值为 3。 autopurge.purgeInterval=1 #3.4.0 及之后版本,ZK 提供了自动清理日志和快照文件的功能,这个参数指定了清理频率,单位是小时,需要配置一个 1 或更大的整数,默认是 0,表示不开启自动清理功能 server.1=172.18.0.101:2888:3888 #server.服务器编号=服务器 IP:LF 数据同步端口:LF 选举端口 server.2=172.18.0.102:2888:3888 server.3=172.18.0.103:2888:3888 1.解压参数单机ZooKeeper 2.配置说明 [root@localhost7h zookeeper]# grep -v "^#" /usr/local/zookeeper/conf/zoo.cfg tickTime=2000 initLimit=10 syncLimit=5 dataDir=/usr/local/zookeeper/data/ clientPort=2181 maxClientCnxns=120 autopurge.snapRetainCount=3 autopurge.purgeInterval=1 server.1=192.168.80.170:2888:3888 server.2=192.168.80.180:2888:3888 server.3=192.168.80.190:2888:3888 [root@localhost7h zookeeper]#scp conf/zoo.cfg 192.168.80.180:/usr/local/zookeeper/conf/zoo.cfg [root@localhost7h zookeeper]#scp conf/zoo.cfg 192.168.80.190:/usr/local/zookeeper/conf/zoo.cfg 3.数值要与上面的server.1 对应,myid文件名不能变 [root@localhost7h zookeeper]# echo "1" > /usr/local/zookeeper/data/myid #当前节点 id, [root@localhost7h I]# echo "2" > /usr/local/zookeeper/data/myid [root@localhost7h I]# echo "3" > /usr/local/zookeeper/data/myid 4.启动 [root@localhost7h zookeeper]# ./bin/zkServer.sh start ZooKeeper JMX enabled by default Using config: /usr/local/zookeeper/bin/../conf/zoo.cfg Starting zookeeper ... STARTED 5.命令行写入数据: [root@localhost7J zookeeper]# ./bin/zkCli.sh -server 192.168.80.170:2181 Connecting to 192.168.80.170:2181 [zk: 192.168.80.170:2181(CONNECTED) 0] help ZooKeeper -server host:port cmd args stat path [watch] set path data [version] ls path [watch] delquota [-n|-b] path ls2 path [watch] setAcl path acl setquota -n|-b val path history redo cmdno printwatches on|off delete path [version] sync path listquota path rmr path get path [watch] create [-s] [-e] path data acl addauth scheme auth quit getAcl path close connect host:port [zk: 192.168.80.170:2181(CONNECTED) 1] [zk: 192.168.80.170:2181(CONNECTED) 1] create /test "zzhz" #写入数据 Created /test [zk: 192.168.80.170:2181(CONNECTED) 2] get /test #验证数据,可以到其他节点验证数据是否一致 zzhz cZxid = 0x100000003 ctime = Mon Jan 16 18:54:44 CST 2023 mZxid = 0x100000003 mtime = Mon Jan 16 18:54:44 CST 2023 pZxid = 0x100000003 cversion = 0 dataVersion = 0 aclVersion = 0 ephemeralOwner = 0x0 dataLength = 4 numChildren = 0 [zk: 192.168.80.170:2181(CONNECTED) 3]

windows 客户端使用

 

 



 

 



 

posted @ 2023-01-16 19:24  yuanbangchen  阅读(154)  评论(0编辑  收藏  举报