zookeeper由浅入深

1.  什么是zookeeper?

     为分布式系统进行协调的服务

2.  zookeeper有什么用?

    可以在分布式系统中协作多个任务

3.  zookeeper使用实例

    1.  HBase

        zookeeper用于选举一个集群内的主节点,以便跟踪可用的服务器,并保存集群的元数据

    2.  kafka

        zookeeper用于检测崩溃,实现主题(topic)的发现,并保持主题的生产和消费状态

4.  zookeeper不适用的场景

    1.  不适合用作海量数据存储

5.  zookeeper单节点

    1.  下载zookeeper

        http://zookeeper.apache.org

    2.  安装zookeeper

        tar -zxvf zookeeper-3.4.10.tar.gz

    3.  修改zoo.cfg文件和dataDir目录

        cp zoo_sample.cfg zoo.cfg

        dataDir=/usr/local/zookeeper-3.4.10/storage

    4.  启动zookeeper

        /usr/local/zookeeper-3.4.10/bin/zkServer.sh start  后台启动

        /usr/local/zookeeper-3.4.10/bin/zkServer.sh start-foreground  前台启动

    5.  客户端登录

        /usr/local/zookeeper-3.4.10/bin/zkCli.sh

    6.  默认只有/zookeeper节点

        ls /  

        /zookeeper节点标记zookeeper服务所需的元数据树

    7.  创建名为/workers的znode

        create /workers ""  创建/workers节点,指定一个空字符串 

    8.  删除znode

        delete /workers

6.  会话的状态和声明周期

    1.  状态及状态的转换

        

7.  zookeeper集群模式

    保证三台服务器的时间同步                                     

    1.      zookeeper集群节点

        修改对应的hosts文件

        192.168.1.67   node1

        192.168.1.68   node2

        192.168.1.69   node3

    2.      安装目录

        node1 /usr/local/server/zookeeper/zookeeper-3.4.6

        node2 /usr/local/server/zookeeper/zookeeper-3.4.6

        node3 /usr/local/server/zookeeper/zookeeper-3.4.6

    3.      配置文档

        /usr/local/server/zookeeper/zookeeper-3.4.6/conf/zoo.cfg

[zhangshaohua1510@node1 conf]$ cat zoo.cfg
# The number of milliseconds of each tick
tickTime=2000
# The number of ticks that the initial
# synchronization phase can take
initLimit=10
# The number of ticks that can pass between
# sending a request and getting an acknowledgement
syncLimit=5
# the directory where the snapshot is stored.
# do not use /tmp for storage, /tmp here is just
# example sakes.
dataDir=/usr/local/server/zookeeper/storage
# 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=10
# Purge task interval in hours
# Set to "0" to disable auto purge feature
autopurge.purgeInterval=24
server.1=node1:2888:3888 
server.2=node2:2888:3888
server.3=node3:2888:3888 

    4.  zookeeper有三个端口(可以修改)

        2181  对cline端提供服务

        3888  集群内机器通信使用(Leader监听此端口)

        2888  选举leader使用

    5.  配置参数说明

        tickTime这个时间是作为zookeeper服务器之间或客户端与服务器之间维持心跳的时间间隔,也就是说每个tickTime时间就会发送一个心跳。

        initLimit这个配置项是用来配置zookeeper接受客户端(这里所说的客户端不是用户连接zookeeper服务器的客户端,而是zookeeper服务器集群中连接到leader的follower 服务器)初始化连接时最长能忍受多少个心跳时间间隔数。当已经超过10个心跳的时间(也就是tickTime)长度后 zookeeper 服务器还没有收到客户端的返回信息,那么表明这个客户端连接失败。总的时间长度就是 10*2000=20秒。

        syncLimit这个配置项标识leader与follower之间发送消息,请求和应答时间长度,最长不能超过多少个tickTime的时间长度,总的时间长度就是5*2000=10秒。

        dataDir顾名思义就是zookeeper保存数据的目录,默认情况下zookeeper将写数据的日志文件也保存在这个目录里;

        clientPort这个端口就是客户端连接Zookeeper服务器的端口,Zookeeper会监听这个端口接受客户端的访问请求;

        server.A=B:C:D中的A是一个数字,表示这个是第几号服务器,B是这个服务器的IP地址,C第一个端口用来集群成员的信息交换,表示这个服务器与集群中的leader服务器交换信息的端口,D是在leader挂掉时专门用来进行选举leader所用的端口。

    6.  创建ServerID标识

        除了修改zoo.cfg配置文件外,zookeeper集群模式下还要配置一个myid文件,这个文件需要放在dataDir目录下。

        这个文件里面有一个数据就是A的值(该A就是zoo.cfg文件中server.A=B:C:D中的A),在zoo.cfg文件中配置的dataDir路径中创建myid文件。

        #在192.168.1.148服务器上面创建myid文件,并设置值为1,同时与zoo.cfg文件里面的server.1保持一致,如下

        echo "1" > /opt/zookeeper/data/myid

    7.  zookeeper启动

        /usr/local/server/zookeeper/zookeeper-3.4.6/bin/zkServer.sh start

    8.  查看zookeeper状态

        /usr/local/server/zookeeper/zookeeper-3.4.6/bin/zkServer.sh status

    9.  客户端登录

        /usr/local/server/zookeeper/zookeeper-3.4.6/bin/zkCli.sh -server 192.168.1.67:2181,192.168.1.68:2181,192.168.1.69:2181

8.  zookeeper数据结构

    1.  概况

        1.  层次化的目录结构,命名符合常规文件系统规范

        2.  每个节点在zookeeper中叫做znode,并且其有一个唯一的路径标识

        3.  节点znode可以包含数据和子节点

        4.  客户端应用可以在节点上设置监听

        5.  每个zone包含了一些基本的元数据信息,比如:数据版本号、创建时间、最后一次更新时间

        6.  zookeeper最大可存储1MB的数据。

    2.  节点类型

        1.  znode有两种类型

            1.  短暂  断开连接自己删除

            2.  持久  断开连接不删除

        2.  znode有四种形式的目录节点(默认是persistent)

            1.  persistent

            2.  persistent_sequential

            3.  ephemeral

            4.  ephemeral_sequential

        3.  创建znode时设置顺序标识,znode名称后附件一个值,顺序号是一个单调递增的计数器,由父节点维护

        4.  在分布式系统中,顺序号可以被用于为所有的事件进行全局排序,这样客户端可以通过顺序号推断事件的顺序

9.  zookeeper客户端的使用

    1.  登录本机或登录远程服务器

        /usr/local/server/zookeeper/zookeeper-3.4.6/bin/zkCli.sh  登录本机

        /usr/local/server/zookeeper/zookeeper-3.4.6/bin/zkCli.sh -server 192.168.1.67:2181,192.168.1.68:2181,192.168.1.69:2181  登录远程服务器

    2.  创建znode

        create /yangjianbo "yangjianbo"

    3.  查看znode

        get /yangjianbo        

"yangjianbo"
cZxid = 0xa400000131
ctime = Fri May 06 22:36:24 CST 2022
mZxid = 0xa400000131
mtime = Fri May 06 22:36:24 CST 2022
pZxid = 0xa400000131
cversion = 0
dataVersion = 0
aclVersion = 0
ephemeralOwner = 0x0
dataLength = 12
numChildren = 0

    4.  修改znode

        set /yangjianbo "yichangkun"

    5.  删除znode

        delete /collections/milanyi/leader_elect

    6.  监听

        get /yangjianbo watch  监听数据改变  收到事件一次就失效,客户端还需要再次监听

          WatchedEvent state:SyncConnected type:NodeDataChanged path:/yangjianbo

        ls /yangjianbo watch  子节点改变

        stat /yangjianbo watch  数据状态改变

10.  zookeeper的选举机制

    1.  全新集群选举

        假如有5台机器,id 1-5

        1.  先启动1,集群不能正常工作,1处于looking状态

        2.  再启动2,因为id大,2得到2票,但是没有超过集群的半数(集群数从配置文件得到)

        3.  再启动3,因为id更大,3得到3票,超过集群的半数,3成为leader

        4.  再启动4,虽然4id更大,但是leader已经选出来了,4只能做follower

        5.  再启动5,结果跟4一样

    2.  非全新集群选举

        参考的值:  数据version,leader id 和逻辑时钟

        1.  逻辑时钟小的选举结果被忽略,重新投票

        2.  统一逻辑时钟后,数据version大的胜出

        3.  数据version一样,id大的胜出

10.  zookeeper常见问题:

    1.  日志过大。

        迁移日志,重启zookeeper。

11.  zookeeper开机启动

    1.  系统为centos6

        在/etc/rc.d/rc.local,添加启动命令,结果不生效。

    2.  在/etc/init.d目录下,创建一个文件zookeeper,内容如下:       

#!/bin/bash
#chkconfig:2345 20 90
#description:zookeeper
#processname:zookeeper
export JAVA_HOME=/usr/local/java
case $1 in
          start) /usr/local/zookeeper-3.4.6/bin/zkServer.sh start;;
          stop) /usr/local/zookeeper-3.4.6/bin/zkServer.sh stop;;
          status) /usr/local/zookeeper-3.4.6/bin/zkServer.sh status;;
          restart) /usr/local/zookeeper-3.4.6/bin/zkServer.sh restart;;
          *)  echo "require start|stop|status|restart"  ;;
esac

    3.  把zookeeper加入系统启动服务

        chkconfig --add zookeeper

  

          

    

 

posted @ 2018-10-29 14:18  奋斗史  阅读(248)  评论(0)    收藏  举报