分布式架构是中心化的设计,就是一个主控机连接多个处理节点,因此保证主控机高可用性十分关键.分布式锁是解决该问题的较好方案,多主控机抢一把锁.Zookeeper就是一套分布式锁管理系统,用于高可靠的维护元数据.
一、应用
1、集群模式
集群模式下配置多个Zookeeper节点,启动Zookeeper集群,Zookeeper会根据配置投票选举一个节点获得分布式锁。
关键配置举例:
# The Cluster servers
#server.1=192.168.1.10:2887:3887
#server.2=192.168.1.11:2888:3888
#server.3=192.168.1.12:2889:3889
以上配置的几个Zookeeper节点会相互投票,直到选举出一个Leader,其他节点为follower.
2、单机模式
不配置信息,启动时会自动选取当前节点为Zookeeper主控节点.
使用Zookeeper:
获取Zookeeper客户端,Zookeeper同时提供了C和Java的客户端访问接口,主要框架是用Java语言实现。Java客户端使用举例,调用程序需要指定zookeeper连接地址和端口号,实例化时客户端会自动创建session并连接zookeeper集群,代码如下:
ZooKeeper zooKeeper=new ZooKeeper(ip:port,timeout,null);
通过以上方式获取zookeeper的客户端就可以进行zookeeper的操作了,示例操作检查节点是否存在,不存在则创建该节点并赋值:
Stat stat=zooKeeper.exists(path,false);
byte[] bytes=values;
if(stat==null)
{
zooKeeper.create(path,bytes,Ids.OPEN_ACL_UNSAFE,CreateMode.PERSISTENT);
}
else
{
zooKeeper.setData(path,bytes,-1);
}
删除某节点:
zooKeeper.delete(path,version);
更新某个节点数据:
byte[] bytes=values;
zooKeeper.setData(path,bytes,-1);
二、投票算法
集群模式下有如下配置:
# The Cluster servers
#server.1=192.168.1.10:2887:3887
#server.2=192.168.1.11:2888:3888
#server.3=192.168.1.12:2889:3889
每一个Zookeeper节点上有一个唯一的id,投票算法可以在配置文件中自行指定采用哪种投票算法,选择优先级最高的是先比较事务序列.向其他节点发送投票时需要将投票的id与事务序列发送出去,先比较事务序列,事务序列最大的首先被选择,如果事务序列相同则考虑id中最大的选取出来作为leader,其他节点被选为follower,操作数据会以leader为主,其他节点将数据从leader中merge过来。
关键代码:
if((newZxid>curZxid)||(newZxid==curZxid)&&(newId>curId))
return true;
else
return false;
启动时:
1、每个节点向集群中所有节点包括发送节点自身发送投票,投票推荐自己为主控机.
2、将接受到的票中最大的ID的选出推荐为自己节点的投票.本地保存各个节点发来的投票,并计算,将ID最大的挑出,计算投该ID的票数,如果超过半数则终止投票选举此ID为主控,并向其他节点发送通知,如果没有超过半数则向各个节点发送自己推荐的投票并重复第二步操作.
三、元数据
1、元数据数据模型
2、操作
ZooKeeper中元数据的组织结构是树形的,用户可以使用/a/b/c的形式来使用元数据,它提供了create,exists,delete,getData,setData,getChildren.
create:创建节点
exsits:检查是否有指定名称的节点
delete:删除某个节点
getData:获取某个节点的值,返回的是字节流
setData:给某个节点上赋值,参数是字节流
getChildren:得到指定节点下的子节点
3、元数据的存储
从整体架构上看,zookeeper存储元数据上就是一个分布式文件系统,但是有不同之处,zookeeper的每个节点上保存的数据都是整个系统所有数据独立完整的一份,可以说是follower节点上的数据都是leader节点上的数据备份。
在确定了leader与follower之后,数据都去操作leader,并同时将数据备份到follower中,这样一来即使leader挂掉,可以再次自动投票从follower中选出leader,同时数据也是最新的,最大可能的保证了可用性。
4、通信协议
Zookeeper中投票时需要不同节点之间进行通信投票,而投票不需要确认对方是否一定每个投票都收到,并且为了提高投票的效率节约时间,投票通信时采用的通信方式是UDP,示例如下:
byte responseBytes[]=new byte[48];
ByteBuffer responseBuffer=ByteBuffer.wrap(responseBytes);
DatagramPacket responsePacket=new DatagramPacket(responseBytes,responseBytes.length);
mySocket=new DatagramSocket(port);
5、zooKeeper节点配置信息维护——JMX
为了方便zookeeper节点管理,zookeeper的节点管理采用了JMX,示例:
在MBeanRegistry注册节点:注册节点实现ZKMBeanInfo接口:
当需要修改或调用节点相关信息可以直接从本地JMX中取到。
后续会不断完善更新……
Hadoop学习笔记(二)——zookeeper使用和分析