1: zookeeper 是什么
是一个针对大型分布式系统的可靠协调系统;
提供的功能包括:配置维护、名字服务、分布式同步、组服务等;
zookeeper已经成为Hadoop生态系统中的基础组件。
2: zookeeper 特点
最终一致性:为客户端展示同一视图,这是Zookeeper最重要的性能;
可靠性:如果消息被一台服务器接受,那么它将被所有的服务器接受;
原子性:更新只能成功或失败,没有中间状态;
3: zookeeper都能做什么
3.1 统一命名服务
背景:在我们的应用中也会存在很多这类问题,特别是在我们的服务特别多的时候,如果我们在本地保存服务的地址的时候将非常不方便,但是如果我们只需要访问一个大家都熟知的访问点,这里提供统一的入口,那么维护起来将方便得多了。
我们可以在概括为以下几点场景:
1)分布式环境下,经常需要对应用/服务进行统一命名,便于识别不同的服务
类似于域名与ip之间对应关系,域名容易记住;
通过名称来获取资源或服务的地址,提供者信息。
2) 按照层次结构组织服务/应用名称
解决方案: 采用zookeeper
可将服务名称以及地址信息写在Zookeeper上,客户端通过Zookeeper获取可用服务列表。
3.2 配置管理
背景:如果我们配置非常多,有很多服务器都需要这个配置,而且还可能是动态的话使用配置文件就不是个好主意了。这个时候往往需要寻找一种集中管理配置的方法,我们在这个集中的地方修改了配置,所有对这个配置感兴趣的都可以获得变更。
我们可以用一个集群来提供这个配置服务,但是用集群提升可靠性,那如何保证配置在集群中的一致性呢? 这个时候就需要使用一种实现了一致性协议的服务了。Zookeeper就是这种服务。
解决方案:采用zookeeper
原因如下:
1) 配置管理可交由Zookeeper实现
2) 可将配置信息写入Zookeeper的一个znode上;
3) 各个节点监听这个znode
4) 一旦znode中的数据被修改,Zookeeper将会通知各个节点。
3.3 分布式锁
背景: 在一个分布式环境中,为了提高可靠性,我们的集群的每台服务器上都部署着同样的服务。但是,一件事情如果集群中的每个服务器都进行的话,那相互之间就要协调,编程起来将非常复杂。而如果我们只让一个服务进行操作,那又存在单点。通常还有一种做法就是使用分布式锁,在某个时刻只让一个服务去干活,当这台服务出问题的时候锁释放,立即fail over到另外的服务
解决方案: 采用zookeeper
原因如下:
(1)Zookeeper是强一致性的
多个客户端同时在Zookeeper上创建相同znode,只有一个创建成功。
(2)实现锁的独占性
多个客户端同时在Zookeeper上创建相同znode,创建成功的那个客户端得到锁,其他客 户端等待。
(3)控制锁的时序
各个客户端在某个znode下创建临时znode(类型为CreateMode.EPHEMERAL_SEQUENTIAL),这样,该znode可掌握全局访问时序。
3.4 集群管理
背景:在分布式的集群中,经常会由于各种原因,比如硬件故障,软件故障,网络问题,有些节点会进进出出。有新的节点加入进来,也有老的节点退出集群。这个时候,集群中其他机器需要感知到这种变化,然后根据这种变化做出对应的决策。比如我们是一个分布式存储系统,有一个中央控制节点负责存储的分配,当有新的存储进来的时候我们要根据现在集群目前的状态来分配存储节点。这个时候我们就需要动态感知到集群目前的状态
解决方案: 采用zookeeper
原因如下:
1)分布式环境下,实时掌握每个节点的状态是必要的
可根据节点实时状态做出一些调整。
2)可交由Zookeeper实现
可将节点信息写入Zookeeper的一个znode上;
监听这个znode可获得它的实时状态变化。
3)典型应用
HBase中Master状态的监控与选举。
3.5 分布式通知/协调
原理其实就是发布/订阅。
1)分布式环境下经常存在一个服务需要知道它所管理的子服务的状态
NameNode需要知道各DataNode的状态
2)心跳检测机制可通过Zookeeper实现
3)信息推送可由Zookeeper实现(发布/订阅模式)
4: 配置zookeeper集群过程
1) tar zxf zookeeper-3.4.6.tar.gz
2) cd zookeeper-3.4.6
3) mkdir -p dataDir //创建快照日志存放目录
4) mkdir dataLogDir //创建事务日志存放目录
5) cd conf
6) mv zoo_sample.cfg zoo.cfg
7) vim zoo.cfg
添加如下内容:
dataDir=/usr/local/zookeeper-3.4.6/dataDir
dataLogDir=/usr/local/zookeeper-3.4.6/dataLogDir
server.1=console:2888:3888
server.2=log1:2888:3888
server.3=log2:2888:3888
8) 在我们配置的dataDir指定的目录下面,创建一个myid文件,里面内容为一个数字,用来标识当前主机,conf/zoo.cfg文件中配置的server.X中X为什么数字,则myid文件中就输入这个数字
9) 远程复制第一台的zk到另外两台上,并修改myid文件为2和3
scp -rp zookeeper-3.4.6 root@114.55.29.86:/usr/local/
scp -rp zookeeper-3.4.6 root@114.55.29.241:/usr/local/
10) 启动和关闭zk
./zkServer.sh start
./zkServer.sh stop
./zkServer.sh status
5: zookeeper 中几个重要配置
tickTime: zookeeper中使用的基本时间单位, 毫秒值.
dataDir: 数据目录. 可以是任意目录.
dataLogDir: log目录, 同样可以是任意目录. 如果没有设置该参数, 将使用和dataDir相同的设置.
clientPort: 监听client连接的端口号.
dataDir和 dataLogDir有什么区别:dataDir用来存储ZKDatabase的快照文件(Snapshot File);而dataLogDir用来存储对ZKDatabase所做操作的操作日志文件(Transaction Log File),如果不配置dataLogDir,则dataLogDir=dataDir。
6: zookeeper应用到的系统
HDFS YARN Storm HBase Flume Dubbo metaq
参考资料:
1) http://blog.chinaunix.net/uid-29792372-id-5785351.html
2) https://www.cnblogs.com/yuyijq/p/3424473.html