Zookeeper简介:
官网地址:http://zookeeper.apache.org/doc/current/zookeeperOver.html
ZooKeeper(后面称为zk)是一种用于分布式应用程序的分布式开源协调服务。主要是用来解决分布式应用中经常遇到的一些问题,假如你公司的项目还是处于单机状态,那可能用不到zk,一旦涉及到分布式应用,很多问题都可以利用zk解决。
ZooKeeper集群模型
在多台机器上部署ZooKeeper后,通过ip互通,在初次启动的时候,ZooKeeper多台机器会进行选举,选举产生一台作为Leader,其余的全部是Follower。
一、ZooKeeper中的服务器角色
1、Leader服务器:
1.Leader服务器是zk集群工作机制的核心.
2.Leader服务器通过ZooKeeper内部算法通过投票选举产生,当某台机器投票数过半时,即产生Leader服务器;
3.事务请求的唯一调度者和处理者,保证集群事务请求处理的顺序性.
对所有的事务性请求做全局可控制,当有增删改的请求到达Follower服务器时,Follower服务器不会进行任何操作,而是将请求通知到Leader服务器,通过Leader服务器对相应的操作进行处理,处理结束之后广播所有变化消息到Follower服务器,及时更新数据;
4.当Leader服务器宕机的时候,选举重新进行,在剩下所有的Follower服务器中重新选举产生出一台新的Leader服务器。
2、Follower服务器
1.Follower服务器是zk集群状态的跟随者.
2.Follower服务器只处理非事务性请求(读请求),事务性请求转发给Leader服务器处理;
3.参与事务请求的proposal投票
3.参与Leader选举投票
3、Observer观察者
Observer是一种新型的zk节点,Observer服务器只提供非事务服务.通常用于不影响集群事务处理能力的前提下提升集群的非事务的处理能力,Observer有另外一个优势,因为它不参与投票,所以他们不属于zk集群的关键部位,即使他们Failed,或者从集群中断开,也不会影响集群的可用性。
二、ZooKeeper特性:
1、高可靠
ZooKeeper像需要协调的分布式系统一样,它本身就是具有冗余结构,它构建在一系列主机之上,构成zk服务的各服务器之间必须相互知道,它们维护着一个状态信息的内存映像,以及在持久化存储中维护着事务日志和快照。只要大部分服务器正常工作,zk服务就能正常工作。客户端连接到一台zk服务器。客户端维护这个TCP连接,通过这个连接,客户端可以发送请求、得到应答,得到监视事件以及发送心跳。如果这个连接断了,客户端可以连接到另一个zk服务器。
2、有序性
zk给每次更新附加一个数字标签,表明zk中的事务顺序,后续操作可以利用这个顺序来完成更高层次的抽象功能,例如同步原语操作。
3、高性能
zk特别适合于以读为主要负荷的场合。zk可以运行在数千台机器上,如果大部分操作为读,例如读写比例为10:1,zk的效率会很高。
简单的数据模型
zk允许各分布式应用通过一个共享的命名空间相互联系,该命名空间类似于一个标准的文件系统:由若干注册了的数据节点构成(用zk的术语叫znode),这些节点类似于文件和目录。与专为存储而设计的典型文件系统不同,zk数据保存在内存中,这意味着zk可以实现高吞吐量和低延迟数量。
三、ZooKeeper的配置及启动
1、ZooKeeper的运行需要java环境的支持,所以首先检查环境中时候有java环境;没有的话,需要先安装
2、下载ZooKeeper
下载链接:http://mirror.bit.edu.cn/apache/zookeeper/zookeeper-3.5.5/apache-zookeeper-3.5.5-bin.tar.gz
下载的版本:apache-zookeeper-3.5.5-bin.tar.gz
3、解压配置
解压之后放到自己的文件规划目录下,打开conf文件目录,复制 zoo_sample.cfg 文件,并命名未 zoo.cfg,因为 Zookeeper 在启动时会找这个文件作为默认配置文件。
四、单机模式配置
zoo.cfg配置 是从解压后的zoo_sample.cfg 复制出来的一份,因为zookeeper启动的时候,默认读取的是zoo.cfg文件
参数说明
tickTime=2000
dataDir=/programs/apache-zookeeper/data (原始的/tmp 目录zk不建议使用)
clientPort=2181
- tickTime:这个时间是作为 Zookeeper 服务器之间或客户端与服务器之间维持心跳的时间间隔,也就是每个 tickTime 时间就会发送一个心跳。
- dataDir:顾名思义就是 Zookeeper 保存数据的目录,默认情况下,Zookeeper 将写数据的日志文件也保存在这个目录里。
- clientPort:这个端口就是客户端连接 Zookeeper 服务器的端口,Zookeeper 会监听这个端口,接受客户端的访问请求。
以上配置完成,就可以启动zk了
启动zk命令:
进入到zk的bin目录下:使用 ./zkServer.sh start 命令启动ZooKeeper
查看zk运行状态命令
还可以通过 ./zkServer.sh status 来查看zk的运行情况
停止zk命令 ./zkServer.sh stop
五、集群模式配置
Zookeeper 不仅可以单机提供服务,同时也支持多机组成集群来提供服务。实际上 Zookeeper 还支持另外一种伪集群的方式,也就是可以在一台物理机上运行多个 Zookeeper 实例,下面将介绍集群模式的安装和配置。
集群模式安装前需要做一些必须的检查工作:
1.检测java环境,因为zk运行需要java环境的支持
java -version
2.检测集群机组的时间是否同步
集群中的各个机组的时间必须保持同步,如果时间不同步,在分布式环境中机组间在沟通协调的过程,就会造成数据错误
3.检测防火墙是否关闭
集群中的所有机组需要通过端口进行通信,如果防火墙打开,在没有配置防火墙规则的情况下,服务通过端口访问不同,不能进行协调沟通。
查看防火墙:service iptables status
关闭防护墙:service iptables stop
如果想永久关闭防火墙,可以通过 chkconfig iptables off 可以永久关闭防火墙,除非手动开启,否则永远关闭。执行命令后,可以通过chkconfig iptables --list 查看是否关闭成功。
在学习测试的时候,可以通过直接关闭防火墙的方式,直接达到zk机组间通信不受阻。
4.检测主机 ip 映射有没有配置
Zookeeper 的集群模式的安装和配置也不是很复杂,所要做的就是增加几个配置项。集群模式除了上面的三个配置项还要增加下面几个配置项:
-
initLimit=5
-
syncLimit=2
-
server.1=192.168.211.1:2888:3888
-
server.2=192.168.211.2:2888:3888
initLimit:这个配置项是用来配置 Zookeeper 接受客户端(这里所说的客户端不是用户连接 Zookeeper 服务器的客户端,而是 Zookeeper 服务器集群中连接到 Leader 的 Follower 服务器)初始化连接时最长能忍受多少个心跳时间间隔数。当已经超过 10 个心跳的时间(也就是 tickTime)长度后 Zookeeper 服务器还没有收到客户端的返回信息,那么表明这个客户端连接失败。总的时间长度就是 5*2000=10 秒 server.1=hostname:2888:3888 就是ip映射,有多少台机器,就需要在每个zk配置文件中配置多少条这样的 server.*=xxxxxx:2888:3888的配置
- syncLimit:这个配置项标识 Leader 与 Follower 之间发送消息,请求和应答时间长度,最长不能超过多少个 tickTime 的时间长度,总的时间长度就是 2*2000=4 秒
- server.A=B:C:D:
A 是一个数字,表示这个是第几号服务器;
B 是这个服务器的 ip 地址;
C 表示的是这个服务器与集群中的 Leader 服务器交换信息的端口;
D 表示的是万一集群中的 Leader 服务器挂了,需要一个端口来重新进行选举,选出一个新的 Leader,而这个端口就是用来执行选举时服务器相互通信的端口。如果是伪集群的配置方式,由于 B 都是一样,所以不同的 Zookeeper 实例通信端口号不能一样,所以要给它们分配不同的端口号。
除了修改 zoo.cfg 配置文件,集群模式下还要配置一个文件 myid,这个文件在 dataDir 目录下(也就是存放zk数据目录),这个文件里面就有一个数据就是 A 的值,代表当前服务器编号。Zookeeper 启动时会读取这个文件,拿到里面的数据与 zoo.cfg 里面的配置信息比较从而判断到底是那个 server。
到这里zk的集群配置就告一段落了。
六、ZooKeeper环境变量配置------非必须配置
如果想在任意目录下都能执行zkServer.sh start 等命令,那就需要配置zookeeper的环境变量
vi /etc/profile
添加:
export ZOOKEEPER_HOME=/zk的安装目录
export PATH=$PATH:$ZOOKEEPER_HOME/bin
最后执行一下:source /etc/profile 命令使之生效。