zookeeper简介
-
zookeeper是一个开源的分布式协调服务,是由雅虎创建的,基于google chubby
-
zookeeper是什么 : 分布式数据一致性的解决方案
-
zookeeper能做什么
- 数据的发布/订阅(配置中心:disconf), 类似MQ
- 负载均衡(dubbo利用了zookeeper机制实现负载均衡)
- 命名服务
- master选举(kafka、hadoop、hbase)
- 分布式队列
- 分布式锁
- 统一配置文件管理
- 集群管理, 及群众保证数据的强一致性
- …
-
zookeeper的特性
- 顺序一致性 : 从同一个客户端发起的事务请求,最终会严格按照顺序被应用到zookeeper中
- 原子性 : 所有的事务请求的处理结果在整个集群中的所有机器上的应用情况是一致的,也就是说,要么整个集群中的所有机器都成功应用了某一事务、要么全都不应用
- 可靠性 : 一旦服务器成功应用了某一个事务数据,并且对客户端做了响应,那么这个数据在整个集群中一定是同步并且保留下来的
- 实时性 : 一旦一个事务被成功应用,客户端就能够立即从服务器端读取到事务变更后的最新数据状态;(zookeeper仅仅保证在一定时间内,近实时)
- **单一视图 ?*客户端连接集群中的任一zk节点, 数据都是一致的
zookeeper安装
- 博主的环境是Centos7
安装步骤
-
下载zookeeper安装包, 可以根据版本自行选择, 官网找下载地址, 这里选择3.4.10的版本
-
解压zookeeper
tar -zxvf zookeeper-3.4.10.tar.gz
-
cd 到 ZK_HOME/conf , copy一份zoo.cfg
cp zoo_sample.cfg zoo.cfg
-
启动服务端
sh zkServer.sh {start|start-foreground|stop|restart|status|upgrade|print-cmd}
-
客户端连接
sh zkCli.sh -server ip:port
集群环境
概述
- zookeeper集群中包含三种角色 : leader/follower/observer
- 这里我使用了3台Centos的虚拟机来演示安装
observer
observer 是一种特殊的zookeeper节点。可以帮助解决zookeeper的扩展性(如果大量客户端访问我们zookeeper集群,需要增加zookeeper集群机器数量。从而增加zookeeper集群的性能。 导致zookeeper写性能下降, zookeeper的数据变更需要半数以上服务器投票通过。造成网络消耗增加投票成本)
- observer不参与投票。 只接收投票结果。
- 不属于zookeeper的关键组成部分。
observer 节点配置:
#1. 在zoo.cfg里面增加
peerType=observer
#2.server配置的最后面添加":observer"
server.1=192.168.72.135:2888:3181:observer
集群环境搭建
-
修改配置文件, server.id=host:port1:port2
id : 取值范围1-255; 用id来标识该机器在集群中的机器序号
port1: 表示follower节点与leader节点交换信息的端口号
port2 : 表示leader选举的端口, 如果leader节点挂掉了, 需要一个端口来重新选举
我本地虚拟机实际配置如下:
server.1=192.168.72.135:2888:3181 server.2=192.168.72.136:2888:3181 server.3=192.168.72.137:2888:3181
-
创建myid
在每一个服务器的dataDir目录下创建一个myid的文件,文件就一行数据,数据内容是每台机器对应的server ID的数字
-
启动zookeeper, 就完成集群搭建了
zoo.cfg配置文件分析
# zookeeper中最小的时间单位长度 (ms), 用于计算的时间单元
tickTime=2000
# follower节点启动后与leader节点完成数据同步的时间, 10表示10 * tickTime
initLimit=10
# leader节点和follower节点进行心跳检测的最大延时时间, 同样5表示5 * tickTime
syncLimit=5
# 必须配置,表示zookeeper服务器存储快照文件的目录
dataDir=/data/zookeeper
# 配置 zookeeper事务日志的存储路径,默认指定在dataDir目录下
dataLogDir=/data/zookeeper
# 表示客户端和服务端建立连接的端口号, 默认2181
clientPort=2181