暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

初识ZooKeeper(一)

梵讯技术人 2021-06-24
602



01

ZooKeeper是什么


ZooKeeper(基于k-v形式存储)是雅虎研究院的一个研究小组为解决分布式单点问题(SPOF)而开发的分布式协调框架(感兴趣的伙伴可以了解一下其名字的由来,很是有趣)。后来,ZooKeeper成为Hadoop子项目,为大数据生态一些组件提供一的分布式协作服务。之后,ZooKeeper脱离Hadoop,成为Apache顶级项目,并开源至今。

ZooKeeper提供基于类似于文件系统的目录节点树方式的数据存储,但是它并不是用来专门存储数据的,它的作用主要是用来维护和监控存储的数据的状态变化。通过监控这些数据状态的变化,从而可以达到基于数据的集群管理。


02


为何需要ZooKeeper


在解答该问题之前,我们先了解一下,在分布式环境下会出现的问题:

  • 在分布式环境下,需要确定一个管理节点;

  • 如果只设置一个管理节点,容易出现单点故障;

  • 为了解决管理节点的单点故障问题,需要配置多个管理节点;

  • 需要多个管理节点保证信息的共享以及能够应对崩溃恢复的场景;

  • 确定一套选举算法,能够始终保证对外提供服务。


举个栗子:

在一个团队里面,通常都会需要一个leader,一方面管理团队,另一方面如果团队外的人想要了解团队内的一切事情,那么首先就会找这个leader,原因无他,因为这个leader知道的最多,并且他所说的也最值得信赖。

突然有天,产品A需要找团队里的比如成员a商讨某项目需求,leader 发现成员a 手头目前没有其他项目,于是就将成员a安排给了产品A;

过了一会儿,产品B也来要人了,leader 发现无人可以安排,就打发产品B说人员已经都被你们产品要走了,你们产品自己去协调。

某天,leader感冒请了病假,产品这时候过来要人,发现leader不在,则无法进行新的产品需求对应;

Boss觉得这个不是事,就给这个团队配了2个leader候选人,并规定两个leader候选人同时只能一个人请假,并且两个人信息共享,这样产品那边过来要人的时候总能找到一个leader候选人对应;

又某天,两个leader候选人闹别扭,不再信息共享,那么不同的产品来要人时,每个leader都安排自己所了解到的成员,成员们傻眼了,出现了一个成员被两个产品同时要的情况,甚至有的成员没有事可做。

这样的团队显然不是Boss愿意看到的,因此Boss决定给这个团队配了3个leader候选人,并规定三个人中,有一个leader,每次只能leader对接产品那边的需求,每个人都需要同leader信息共享,当leader请假时,选择剩下两个人了解信息对多的人来当leader并继续对外提供服务。

Boss觉得这样如此的决策很赞。

通过这个例子,我们再来看一下这句话 "ZooKeeper是分布式应用协调系统",小伙伴是否已经get到ZooKeeper的作用呢?

03


ZooKeeper的简单安装

  • 关闭防火墙

      [root@hadoop01 software]# systemctl status firewalld
      ......
      [root@hadoop01 software]# systemctl stop firewalld
      [root@hadoop01 software]# systemctl disable firewalld


    • 安装JDK,下载解压 jdk-8u181-linux-x64.tar.gz 并配置环境变量

      • [root@hadoop01 software]# java -version
        java version "1.8.0_181"
        Java(TM) SE Runtime Environment (build 1.8.0_181-b13)
        Java HotSpot(TM) 64-Bit Server VM (build 25.181-b13, mixed mode)
      • 安装ZooKeeper,下载解压zookeeper-3.4.14.tar.gz

      • 进入安装目录conf中

        • [root@hadoop01 software]# cd zookeeper-3.4.14/conf
        • ZooKeeper配置文件复制

          • [root@hadoop01 conf]cp zoo_sample.cfg zoo.cfg
          • 修改属性,例如

            • dataDir=/home/software/zookeeper-3.4.14/data
              dataLogDir=/home/software/zookeeper-3.4.14/log
              server.1=hadoop01:2888:3888
            • 保存退出 并cd到bin目录下

            • 启动

              • [root@hadoop01 bin]# ./zkServer.sh start
                ZooKeeper JMX enabled by default
                Using config: home/software/zookeeper-3.4.14/bin/../conf/zoo.cfg
                Starting zookeeper ... STARTED
              • jps

                • [root@hadoop01 bin]# jps
                  1683 QuorumPeerMain
                  1705 Jps
                • 当服务器启动的时候,会在bin目录下生成一个zookeeper.out的文件,记录的Zookeeper启动日志

                  • [root@hadoop01 bin]# ls
                    README.txt zkCli.cmd zkEnv.cmd zkServer.cmd zkTxnLogToolkit.cmd zookeeper.out
                    zkCleanup.sh zkCli.sh zkEnv.sh zkServer.sh zkTxnLogToolkit.sh


                  04


                  ZooKeeper的特点


                  • 其本身是一个树状结构,称为ZNode树,其根节点为/

                  • 任意一个节点称为ZNode节点

                  • 任何一个节点都必须存储数据

                  • 只有持久节点才能挂接子节点

                  • 任意一条路径都是从根节点开始计算,并且是唯一的

                  • ZNode树是维系在内存中的,就是为了能够快速查询

                  • 发生的每一次写操作(创建、更新、删除)都会分配一个全局且递增的事务id——Zxid

                  • 其数据可以持久化到磁盘上,目录由dataDir决定

                  • 节点状态

                    1. looking - 选举

                    2. follower - 跟随者

                    3. leader - 领导者

                    4. observer - 观察者

                  • 节点类型:


                    持久
                    临时
                    顺序
                    Persistent_Sequential
                    Ephemeral_Sequential
                    非顺序
                    Persistent
                    Ephemeral


                  05



                  ZooKeeper的客户端命令使用

                  • 进入客户端

                    • [root@hadoop01 bin]# ./zkCli.sh
                      ......
                      WatchedEvent state:SyncConnected type:None path:null
                      [zk: localhost:2181(CONNECTED) 0]
                    • 查看根节点(Kafka已配置)

                      • [zk: localhost:2181(CONNECTED) 0] ls 
                        [cluster, controller_epoch, brokers, zookeeper, admin, isr_change_notification, consumers, log_dir_event_notification, latest_producer_id_block, config]
                      • 跟节点创建node1节点,并且数据为hi

                        • [zk: localhost:2181(CONNECTED) 1] create node1 "hi"
                          Created /node1
                          [zk: localhost:2181(CONNECTED) 2] ls /
                          [cluster, controller_epoch, brokers, zookeeper, admin, isr_change_notification, consumers, log_dir_event_notification, latest_producer_id_block, config, node1]
                        • 查看node1节点数据

                          • [zk: localhost:2181(CONNECTED) 3] get /node1
                            hi
                            cZxid = 0x194
                            ctime = Wed Jul 08 12:05:55 EDT 2020
                            mZxid = 0x194
                            mtime = Wed Jul 08 12:05:55 EDT 2020
                            pZxid = 0x194
                            cversion = 0
                            dataVersion = 0
                            aclVersion = 0
                            ephemeralOwner = 0x0
                            dataLength = 2
                            numChildren = 0
                          • 更改node1节点数据

                            • [zk: localhost:2181(CONNECTED) 4] set /node1 "hello"
                              cZxid = 0x194
                              ctime = Wed Jul 08 12:05:55 EDT 2020
                              mZxid = 0x195
                              mtime = Wed Jul 08 12:08:22 EDT 2020
                              pZxid = 0x194
                              cversion = 0
                              dataVersion = 1
                              aclVersion = 0
                              ephemeralOwner = 0x0
                              dataLength = 5
                              numChildren = 0
                            • 查看node1节点的已更新信息

                              • [zk: localhost:2181(CONNECTED) 5] get /node1
                                hello
                                cZxid = 0x194
                                ctime = Wed Jul 08 12:05:55 EDT 2020
                                mZxid = 0x195
                                mtime = Wed Jul 08 12:08:22 EDT 2020
                                pZxid = 0x194
                                cversion = 0
                                dataVersion = 1
                                aclVersion = 0
                                ephemeralOwner = 0x0
                                dataLength = 5
                                numChildren = 0
                              • 删除node1节点 (delete 删除/rmr 递归删除)

                                • [zk: localhost:2181(CONNECTED) 6] rmr /node1
                                  [zk: localhost:2181(CONNECTED) 7] ls /
                                  [cluster, controller_epoch, brokers, zookeeper, admin, isr_change_notification, consumers, log_dir_event_notification, latest_producer_id_block, config]
                                • 创建临时节点node2

                                  • [zk: localhost:2181(CONNECTED) 3] create -e /node2 ''
                                    Created /node2
                                  • 创建持久顺序节点node3

                                    • [zk: localhost:2181(CONNECTED) 4] create -s /node3 ''
                                      Created /node30000000032
                                    • 创建临时顺序节点node4

                                      • [zk: localhost:2181(CONNECTED) 5] create -e -s /node5 ''
                                        Created /node50000000033

                                        对于创建的顺序节点名称与所显示的不太一样,具体原因在后面的章节中会讲到,那么本章节内容到此就结束了,后面还有ZooKeeper集群的选举与奔溃恢复以及不同状态节点的职责分别是什么ZooKeeper的源码分析等等,小伙伴们敬请期待!

                                       


                                      文章转载自梵讯技术人,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

                                      评论