zookeeper原理和集群配置

1、什么是Zookeeper?

  Zookeeper是一个高效的分布式协调服务,暴露了一些公用服务,比如命名/配置管理/同步控制/群组服务等

  • 需要注意的是Zookeeper不适合存储大量数据,通常就存储一些配置信息,动态的监听服务器的变更并且反馈给服务器

Zookeeper是一个高可用的分布式管理与协调框架,基于ZAB算法(原子消息广播协议)的实现,保证了分布式环境中数据的一致性,也正是基于这样的特性使得Zookeeper成为了解决分布式一致性问题的利器,Zookeeper最少需要3个节点,官方推荐为奇数个,偶数个会影响到paxos选举的结果

  • 顺序一致性:从一个客户端发起的事务请求,最终将会严格的按照其发起的顺序应用到Zookeeper中
  • 原子性:所有事务请求的处理结果在整个集群中所有的机器上应用情况是一致的,也就是说要么整个集群都应用了一个事务,要么都没有应用,绝对不会出现部分应用该事务,另一部分没有应用的情况出现
  • 可靠性:一旦服务器成功的应用了一个事务,并且完成对客户端的响应,那么该事务所引起的服务器端状态会被一直保留下来,除非有另外一个事务对其作出更改
  • 实时性:通常所说的实时性就是指一旦事务被成功的应用,那么客户端就能立刻从服务器上获取变更后的数据,Zookeeper仅仅只能保证在一段时间内,客户端最终一定可以从服务器端获取最新的数据状态

2、Zookeeper的设计目标

  • 简单的数据结构:Zookeeper就是按照属性结构来进行互相协调
  • 可以构建集群:一般Zookeeper集群通常由一组机器构成,一般3-5台机器就可以组成一个Zookeeper集群了,只要半数以上的机器可以正常工作,那么集群就可以继续提供服务,当然如果半数以上机器不能正常工作那么就无法提供服务了
  • 顺序访问:对于每个客户端的每一个请求,都会给其分配一个全局唯一的递增编号,这个编号决定了先后顺序,应用程序可以使用Zookeeper的特性来实现更高层次的同步
  • 高性能:Zookeeper的数据全量存储在内存中,并且直接服务于所有的非事务请求,尤其是在读操作为主的场景下非常突出,在jmeter压力测试(100%读请求的场景下),QPS可以达到12-13万

3、Zookeeper的组成

ZK server根据其身份特性分为三种:Leader,Follower,Observer,其中Follower和Observer又统称为Learner(学习者)

  • Leader:负责服务器的Writer类型请求
  • Follower:负责客户端的reader类型请求,参与leader选举
  • Observer:特殊的“Follower”,可以接受客户端的reader请求,但是不会参与选举

4、Zookeeper应用场景

从设计模式的角度来看,Zookeeper是一个基于观察者模式设计的分布式服务管理框架,负责存储和管理大家都很关心的数据,然后接受观察者的注册,一旦数据发生变化,Zookeeper就将负责通知已经在Zookeeper上注册的那些观察者做出相应的反应,从而实现了集群的Master/Slave管理模式

  • 配置管理

配置的管理在分布式应用环境中很常见,比如平常的应用系统中经常会遇到如机器的配置列表、运行时的开关配置、数据库配置信息等,这些全局配置信息通常具备3个特性

  1. 数据量比较小
  2. 数据内容在运行动态时会发生变化
  3. 集群中各个节点共享信息,配置一致
  • 集群管理

由Zookeeper来管理集群,不仅可以维护当前集群机器中的服务状态,并且可以为你选出一个“总管”来帮你管理集群,实现集群的容错功能

  1. 希望知道当前集群中究竟有多少机器工作
  2. 对集群中每天集群的运行状态进行数据收集
  3. 对集群中每台集群进行上下线的操作
  • 发布与订阅
  • 数据库切换
  • 分布式日志的收集
  • 分布式锁、队列管理等

zookeeper集群配置:

zookeeper解压完成后,复制三个zookeeper,分别是zookeeper1,zookeeper2,zookeeper3,进入zookeeper1的conf目录下,复制一份zoo.cfg(cp zoo_sample.cfg zoo.cfg),vi zoo.cfg,找到dataDir=/usr/lib/zookeeper1/data,配置成zookeeper1的安装路径创建个data目录,zookeeper的默认端口号是2181,如clientPort=2181,这个端口是代码连接的外部端口,在配置文件的最下面添加三个节点(集群),如下:

server.1=127.0.0.1:2880:3880

server.2=127.0.0.1:2881:3881

server.3=127.0.0.1:2882:3882

都是同一个ip,就是在一台机器上搭三个节点,要是有多台机器就在每个节点里写上每台机器的ip,前面的端口号是同步数据的端口号,后面的端口号是选举的端口号,保存退出后到zookeeper1目录,然后创建目录data(mkdir data),进入data目录(cd data),vi myid,输入1保存退出,同理zookeeper2和zookeeper3也是和zookeeper1相同的配置,dataDir=/usr/lib/zookeeper2/data,clientPort=2182,这个端口不能重复,dataDir=/usr/lib/zookeeper3/data,clientPort=2183,zookeeper2和zookeeper3里的myid分别是2和3,进入三个zookeeper的bin目录下,启动zookeeper1(./zkServer.sh),提示缺少参数,常用的参数有start、stop、restart和status

可以看到STARTED,证明zookeeper已经启动了

如果想停止zookeeper要执行./zkServer.sh stop

./zkServer.sh start,把三个zookeeper都起来,查看进程,如下图:

再执行./zkServer.sh status,可以看到哪个是leader,哪个是follower,我这里第三个zookeeper是leader,第一个和第二个是follower,如下图:

把是leader的zookeeper的进程杀掉,然后查看另外两个状态,其中一个选举为leader

在三个zookeeper任一个节点上,执行./zkCli.sh -h192.168.1.9 -p2181命令,zkCli是客户端,ip是虚机ip,端口2181是zookeeper1的对外端口,点击回车可以看到

[zk: localhost:2181(CONNECTED) 80]这种命令行,Ctrl+c可以退出到[root@besttest bin]#

查找:ls /

创建节点并赋值:create /ssj/test test184

要是没有test184不行,test184是赋值

获取:get /haha

ctime是创建时间,dataVersion是修改的版次数,修改一次加1,dataLength是hello的长度,numChildren=0,子节点为0,上面的numChildren=2,子节点是2

设置值:set /ssj 123

mtime是修改时间,可以看到dataVersion已经是1了,dataLength是123的长度,可以看到zk启动时注册的服务是haha,长度是多少,太长了会卡

删除节点:rmr /haha

删除某个指定节点:delete /path/child

创建/ssj赋值123,再创建/ssj/test赋值12345

先删除/ssj,报节点不为空,所以要先删除里面的节点,在删除外面的节点

转载于:https://www.cnblogs.com/laosun0204/p/11386981.html

代码交流 2021