分布式架构是中心化的设计。就是一个主控机连接多个处理节点,因此保证主控机高可用性十分关键.分布式锁是解决该问题的较好方案,多主控机抢一把锁.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:
获取Zookeeperclient。Zookeeper同一时候提供了C和Java的client訪问接口,主要框架是用Java语言实现。Javaclient使用举例,调用程序须要指定zookeeper连接地址和port号。实例化时client会自己主动创建session并连接zookeeper集群。代码例如以下:
ZooKeeper zooKeeper=new ZooKeeper(ip:port,timeout,null);
通过以上方式获取zookeeper的client就能够进行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中取到。
兴许会不断完好更新……