1.ZooKeeper概述
1.1 背景
随着互联网技术的高速发展,企业对计算机系统的计算、存储能力要求越来越高,最简单的证明就是出现了一些诸如:高并发,海量存储这样的词汇。在这样的背景下,单纯依靠少量高性能主机来完成计算任务已经不能满足企业的需求,企业的IT架构逐步从集中式向分布式过渡,所谓的分布式是指:把一个计算任务分解成若干个计算单元,并且分派到若干不同的计算机中去执行,然后汇总计算结果的过程!
1.2 ZooKeeper是什么
ZooKeeper是源代码开放的分布式协调服务,由雅虎创建,是Google Chubby的开源实现。ZooKeeper是一个高性能的分布式数据一致性解决方案,它将那些复杂的、容易出错的分布式一致性服务封装起来,构成一个高效可靠的原语集,并提供一系列简单易用的接口给用户使用
1.3 ZooKeeper的应用场景
---数据发布/订阅
数据发布/订阅 顾名思义就是一方把数据发布出来,另一方通过某种手段可以得到这些数据
通常数据订阅有两种方式:推模式和拉模式,推模式一般是服务器主动向客户端推送信息, 拉模式是客户端主动去服务器获取数据(通常是采用定时轮询的方式),
ZK采用两种方式相结合
发布者将数据发布到ZK集群节点上,订阅者通过一定的方法告诉服务器,我对哪个节点的数据感兴趣,那服务器在这些节点的数据发生变化时,就通知客户端,客户端得到通知后可以去服务器获取数据信息
---负载均衡
步骤:
1、首先DB在启动的时候先把自己在ZK上注册成一个临时节点,ZK的节点后面我们会讲到有两种,一种是永久节点,一类是临时节点临时节点在服务器出现问题的时候,节点会自动的从ZK上删除,那么这样ZK上的服务器列表就是最新的可用的列表
2、客户端在需要读写数据库的时候首先它去ZooKeeper得到所有可用的DB的连接信息(一张列表)
3、客户端随机选择一个与之建立连接
4、当客户端发现连接不可用的时候可再次从ZK上获取可用的DB连接信息,当然也可以在刚获取的那个列表里移除掉不可用的连接后再随机选择一个DB与之连接
---命名服务
顾名思义,就是提供名称的服务,例如数据库表格ID,一般用得比较多的有两种ID,一种是自动增长的ID,一种是UUID(9291d71a-0354-4d8e-acd8-64f7393c64ae),两种ID各自都有缺陷,自动增长的ID局限在单库单表中使用,不能在分布式中使用,UUID可以在分布式中使用但是由于ID没有规律难于理解,我们可以借用ZK来生成一个顺序增长的,可以在集群环境下使用的,命名易于理解的ID
---分布式协调/通知
心跳检测
在分布式系统中,我们常常需要知道某个机器是否可用,传统的开发中,可以通过Ping某个主机来实现,Ping得通说明对方是可用的,相反是不可用的,ZK 中我们让所有的机其都注册一个临时节点,我们判断一个机器是否可用,我们只需要判断这个节点在ZK中是否存在就可以了,不需要直接去连接需要检查的机器 ,降低系统的复杂度
------------------
2.Zookeeper的环境搭建
Zookeeper使用java语言编写,所以它的运行环境需要java环境的支持
2.1 下载Zookeeper的安装包
下载地址 http://mirrors.hust.edu.cn/apache/zookeeper/
下载stable路径下的版本
Zookeeper有两种运行模式,集群模式和单机模式
集群模式
现在使用三台虚拟机搭建一个Zookeeper集群,准备好三台互相联网的linux机器,它们的IP地址分别为
192,168.0.109;192,168.0.110;192,168.0.111
1.准备java的运行环境,我使用的jdk的版本是java1.7.
2.下载Zoopeeper的安装包
我使用的版本是zookeeper-3.4.8.tar.gz,解压到/opt目录下(我们通常将自己的软件安装到这个目录下)
解压得到的目录结构如下
3.配置Zookeeper(两处:zoo.cfg,myid)
初次使用Zookeeper,需要将%ZK_HOME%/conf目录下的zoo-sample.cfg文件重命名为zoo.cfg.并且按照如下代码简单配置
在集群模式下。集群中的每一台机器都需要感知到整个集群是由哪几台机器组成,在配置文件中,可以按照这样的格式进行配置。每一行代表一个机器的配置
server.id=host:port:port
其中,id被称为server id,用来标识该机器在集群中的机器序号,同时在每台zookeeper机器上,我们都需要在数据目录(即dataDir参数指定的那个目录)下创建一个myid文件,该文件只有一行内容,并且是一个数字,就是对应于每个机器的server id 的数字
在Zookeeper的设计中,集群中所有机上的zoo.cfg文件的内容都应该是一直的,因此最好使用svn或是git把此文件管理起来,确保每个机器都能共享到一份相同的配置。
上面也提到了,myid文件中只有一个数字,就是一个server id ,例如server.1的myid文件内容就是1,注意,请确保每个服务器的myid文件中的数字不同,并且和自己所在机器的zoo.cfg中server.id的id值一致。
在dataDir所配置的目录下,创建一个名为myid的文件,在该文件的第一行写上一个数字,和zoo.cfg中当前机器的编号对应上。
其他两台机器做相同配置(myid的值不同哟)
4.启动服务器
可以使用%ZK_HOME%/bin目录下的zkServer.sh脚本进行服务器的启动。如下
在192.168.0.109机器上执行
把192.168.0.110;192.168.0.111这两台机器也按照相同的方式启动
5.验证服务器
启动完成以后,可以使用如下命令来检查服务器启动是否正常
[root@localhost bin]# telnet 192.168.0.109 2181
Trying 192.168.0.109...
Connected to 192.168.0.109.
Escape character is '^]'.
stat
Zookeeper version: 3.4.8--1, built on 02/06/2016 03:18 GMT
Clients:
/192.168.0.110:43829[0](queued=0,recved=1,sent=0)
Latency min/avg/max: 0/0/0
Received: 2
Sent: 1
Connections: 1
Outstanding: 0
Zxid: 0x100000000
Mode: follower
Node count: 4
Connection closed by foreign host.
[root@localhost bin]# telnet 192.168.0.110 2181
Trying 192.168.0.110...
Connected to 192.168.0.110.
Escape character is '^]'.
stat
Zookeeper version: 3.4.8--1, built on 02/06/2016 03:18 GMT
Clients:
/192.168.0.110:33756[0](queued=0,recved=1,sent=0)
Latency min/avg/max: 0/0/0
Received: 2
Sent: 1
Connections: 1
Outstanding: 0
Zxid: 0x100000000
Mode: leader
Node count: 4
Connection closed by foreign host.
[root@localhost bin]# telnet 192.168.0.111 2181
Trying 192.168.0.111...
Connected to 192.168.0.111.
Escape character is '^]'.
stat
Zookeeper version: 3.4.8--1, built on 02/06/2016 03:18 GMT
Clients:
/192.168.0.110:44753[0](queued=0,recved=1,sent=0)
Latency min/avg/max: 0/0/0
Received: 2
Sent: 1
Connections: 1
Outstanding: 0
Zxid: 0x100000000
Mode: follower
Node count: 4
Connection closed by foreign host.
单机模式
单机模式和集群模式唯一的区别就在机器列表上,在单机模式的zoo.cfg文件中,只有server.1这一项,修改完这个文件后就可以启动服务器了
验证服务器的情况
集群模式和单机模式的输出的服务器验证信息基本一致,只有Mode的属性不一样,在集群模式中,Mode显示的可能是leader,或者是follower,它们用来标识当前服务器在集群中的角色,而在单机模式中,Mode显示的属性是standalone.
伪集群模式
我们来看一种情况,如果你手上有且只有一台比较好的机器,那么这个时候,如果作为单机模式进行部署,资源明显显得有点浪费,而如果想要按照集群模式来部署的话,需要借助于硬件上的虚拟化技术,把一台物理机转换成几台虚拟机,不过这样操作成本太高,Zookeeper允许在一台机器上完成一个为集群的搭建。
所谓的伪集群,用一句话说就是,集群所有的机器都在一台机器上,但是以集群的特性对外提供服务,这种模式和集群模式很类似,zoo.cfg的配置是
在zoo.cfg的配置中,每一行的机器列表配置都是同一个IP地址,但是后面的端口配置都已经不一样了,这其实不难理解,在同一台机上上启动多个进程,必须绑定不同的端口。
停止服务
./zkServer.sh stop
---------------