网页好看的网站设计,做微信支付的网站多少钱,常德网站公司,网站定制案例目录 zk的一些内部原理和应用请求#xff0c;事务和标识读写操作事务标识#xff08;zxid#xff09; 群首选举Zab协议#xff08;ZooKeeper Atomic Broadcast protocol#xff09;文件系统和监听通知机制分布式配置中心, 简单Demojava code 集群管理code 分布式锁 zk的一… 目录 zk的一些内部原理和应用请求事务和标识读写操作事务标识zxid 群首选举Zab协议ZooKeeper Atomic Broadcast protocol文件系统和监听通知机制分布式配置中心, 简单Demojava code 集群管理code 分布式锁   zk的一些内部原理和应用 
请求事务和标识 
读写操作 
只读请求exists, getData,getChildren会在zk服务其本地处理然后返回给客户端所以zk处理以只读请求为主要负载时性能会很高可以增加更多的服务器到zk集群这样能处理更多的读请求 
因为ZooKeeper集群中所有的server节点都拥有相同的数据所以读的时候可以在任意一台server节点上客户端连接到集群中某一节点读请求然后直接返回。当然因为ZooKeeper协议的原因一半以上的server节点都成功写入了数据这次写请求便算是成功读数据的时候可能会读到数据不是最新的server节点所以比较推荐使用watch机制在数据改变时及时感知到 
写操作(create, delete, setData) 将会被转发给群首群首会执行相应请求并形成状态更新我们称为事务(Transaction) Client向Zookeeper的server1发送一个写请求客户端写数据到服务器1上如果server1不是Leader那么server1会把接收到的写请求转发给Leader然后Leader会将写请求转发给每个server server1和server2负责写数据并且两个Follower的写入数据是一致的保存相同的数据副本server1和server2写数据成功后通知Leader 当Leader收到集群半数以上的节点写成功的消息后说明该写操作执行成功 这里是3台服务器只要2台Follower服务器写成功就ok因为client访问的是server1所以Leader会告知server1集群中数据写成功 被访问的server1进一步通知client数据写成功这时客户端就知道整个写操作成功了 
事务标识zxid 
当群首产生了一个事务就会为该事务分配一个标识符我们称之 为ZooKeeper会话IDzxid通过Zxid对事务进行标识就可以按照群 首所指定的顺序在各个服务器中按序执行 
zxid为一个long型64位整数分为两部分时间戳epoch部 分和计数器counter部分。每个部分为32位在我们讨论zab(Zookeeper Atomic Broadcast )协议 时我们就会发现时间戳epoch和计数器counter的具体作用 我们通过该协议来广播各个服务器的状态变更信息。 
eg: 
setData 加上事务版本和新数据值一个事务为一个单位以原子方式执行ZooKeeper集群以事务方式运行并确保所 有的变更操作以原子方式被执行同时不会被其他事务所干扰并不存在传统的关系数据库中所涉及的回滚机制而是 确保事务的每一步操作都互不干扰 
同时一个事务还具有幂等性也就是说我们可以对同一个事务执 行两次我们得到的结果还是一样的我们甚至还可以对多个事务执行 多次同样也会得到一样的结果前提是我们确保多个事务的执行顺序 每次都是一样的。事务的幂等性可以让我们在进行恢复处理时更加简单。 
实际上ZooKeeper的每个节点维护者两个Zxid值为别为cZxid、mZxid。 
1cZxid 是节点的创建时间所对应的Zxid格式时间戳。 
2mZxid是节点的修改时间所对应的Zxid格式时间戳。 
高32位是epoch用来标识Leader关系是否改变每次一个Leader被选出来它都会有一个新的epoch。低32位是个递增计数。 
群首选举 
群首为集群中的服务器选择出来的一个服务器并会一直被集群所 认可。设置群首的目的是为了对客户端所发起的ZooKeeper状态变更请 求进行排序包括create、setData和delete操作。群首将每一个请求转 换为一个事务将这些事务发送给追随者确保集 群按照群首确定的顺序接受并处理这些事务。 每个服务器启动后进入LOOKING状态开始选举一个新的群首或 查找已经存在的群首如果群首已经存在其他服务器就会通知这个新 启动的服务器告知哪个服务器是群首与此同时新的服务器会与群 首建立连接以确保自己的状态与群首一致。  如果集群中所有的服务器均处于LOOKING状态这些服务器之间 就会进行通信来选举一个群首通过信息交换对群首选举达成共识的选 择。在本次选举过程中胜出的服务器将进入LEADING状态而集群中 其他服务器将会进入FOLLOWING状态。  
当一个服务器进入LOOKING状态就会发送向集群中每个服 务器发送一个通知消息,如下 
投票服务器标识最近执行的事务的zxid信息
votesid, zxid快速群首选举的快速指的是什么 
Zab协议ZooKeeper Atomic Broadcast protocol 
在接收到一个写请求操作后追随者会将请求转发给群首群首将探索性地执行该请求并将执行结果以事务的方式对状态更新进行广播。一个事务中包含服务器需要执行变更的确切操作当事务提交时 服务器就会将这些变更反馈到数据树上其中数据树为ZooKeeper用于 保存状态信息的数据结构请参考DataTree类。 
之后我们需要面对的问题便是服务器如何确认一个事务是否已经提 交由此引入了我们所采用的协议ZabZooKeeper原子广播协议 ZooKeeper Atomic Broadcast protocol。 
propose: leader 广播给 followersaccept: followers收到广播信息给leader发送确认消息commit: leader收到确认仲裁数量后发送消息给follower进行提交操作  具体如下  
两个保障依靠了zxid 
一个被选举的群首确保在提交完所有之前的时间戳内需要提交的 事务之后才开始广播新的事务。在任何时间点都不会出现两个被仲裁支持的群首。 
为了实现第一个需求群首并不会马上处于活动状态直到确保仲 裁数量的服务器认可这个群首新的时间戳值。一个时间戳的最初状态必 须包含所有的之前已经提交的事务或者某些已经被其他服务器接受 但尚未提交完成的事务。这一点非常重要在群首进行时间戳e的任何 新的提案前必须保证自时间戳开始值到时间戳e1内的所有提案被提 交。如果一个提案消息处于时间戳e’e在群首处理时间戳e的第一个提 案消息前没有提交之前的这个提案那么旧的提案将永远不会被提交。 
文件系统和监听通知机制 
分布式配置中心, 简单Demo 
在zookeeper里增加一个目录节点并把配置信息存储在里面(作为配置中心存储) 多个客户端能够读取到 服务端配置改变客户端(所有注册监听的客户端)都能监听到事件   
java code 
package demo;import org.apache.zookeeper.WatchedEvent;
import org.apache.zookeeper.Watcher;
import org.apache.zookeeper.ZooKeeper;
import org.apache.zookeeper.data.Stat;
import org.apache.zookeeper.Watcher.Event.EventType;
import org.apache.zookeeper.Watcher.Event.KeeperState;import java.util.concurrent.CountDownLatch;/*** Author mubi* Date 2020/3/27 22:36*/
public class ZooKeeperProSync implements Watcher {private static CountDownLatch connectedSemaphore  new CountDownLatch(1);private static ZooKeeper zk  null;private static Stat stat  new Stat();public static void main(String[] args) throws Exception {// zookeeper配置数据的存放路径String path  /myconfig;// 连接zookeeper并且注册一个监听器zk  new ZooKeeper(127.0.0.1:2281, 5000, new ZooKeeperProSync());// 等待zk连接成功的通知等待connectedSemaphore.countDown()减少为0connectedSemaphore.await();// 获取path目录节点的配置数据并注册对节点的监听System.out.println(new String(zk.getData(path, true, stat)));Thread.sleep(Integer.MAX_VALUE);}Overridepublic void process(WatchedEvent event) {// zk连接成功通知事件if (KeeperState.SyncConnected  event.getState()) {if (EventType.None  event.getType()  null  event.getPath()) {connectedSemaphore.countDown();}else if (event.getType()  EventType.NodeDataChanged) {// zk目录节点数据变化通知事件try {System.out.println(配置已修改新值为  new String(zk.getData(event.getPath(), true, stat)));// TODO 具体业务} catch (Exception e) {}}}}
}集群管理 
集群管理原理机器的加入/退出选举leader节点 持久节点 / 临时节点有序节点 / 无序节点 
可以临时有序构成server然后最小编号节点作为leader节点 
创建集群节点目录持久节点 启动服务并加入和减少机器观察   
code 
AppMaster 
package demo;import java.util.ArrayList;
import java.util.List;import org.apache.zookeeper.WatchedEvent;
import org.apache.zookeeper.Watcher;
import org.apache.zookeeper.Watcher.Event.EventType;
import org.apache.zookeeper.ZooKeeper;/*** Author mubi* Date 2020/3/27 23:43*/
public class AppMaster {private String clusterNode  mycluster;private ZooKeeper zk;private volatile ListString serverList;public void connectZookeeper() throws Exception{// 注册全局默认watcherzk  new ZooKeeper(127.0.0.1:2281, 5000, new Watcher(){Overridepublic void process(WatchedEvent event){if (event.getType()  EventType.NodeChildrenChanged (/  clusterNode).equals(event.getPath())){try{updateServerList();}catch (Exception e){e.printStackTrace();}}}});updateServerList();}private void updateServerList() throws Exception{ListString newServerList  new ArrayListString();// watcher注册后只能监听事件一次参数true表示继续使用默认watcher监听事件ListString subList  zk.getChildren(/  clusterNode, true);for (String subNode : subList){// 获取节点数据byte[] data  zk.getData(/  clusterNode  /  subNode, false, null);newServerList.add(new String(data, utf-8));}serverList  newServerList;System.out.println(server list updated:   serverList);}public static void main(String[] args) throws Exception{AppMaster ac  new AppMaster();ac.connectZookeeper();Thread.sleep(Long.MAX_VALUE);}
} 
AppServer 
package demo;import org.apache.zookeeper.CreateMode;
import org.apache.zookeeper.WatchedEvent;
import org.apache.zookeeper.Watcher;
import org.apache.zookeeper.ZooDefs.Ids;
import org.apache.zookeeper.ZooKeeper;/*** Author mubi* Date 2020/3/27 23:44*/
public class AppServer extends Thread
{private String clusterNode  mycluster;private String serverNode  server_address;private String serverName;Overridepublic void run(){try {connectZookeeper(serverName);} catch (Exception e) {e.printStackTrace();}}public void connectZookeeper(String address) throws Exception{ZooKeeper zk  new ZooKeeper(127.0.0.1:2281, 5000, new Watcher() {Overridepublic void process(WatchedEvent event) {}});// 关键方法创建包含自增长id名称的目录这个方法支持了分布式锁的实现// 四个参数// 1、目录名称 2、目录文本信息// 3、文件夹权限Ids.OPEN_ACL_UNSAFE表示所有权限// 4、目录类型CreateMode.EPHEMERAL_SEQUENTIAL表示创建临时目录session断开连接则目录自动删除String createdPath  zk.create(/  clusterNode  /  serverNode,address.getBytes(utf-8),Ids.OPEN_ACL_UNSAFE,CreateMode.EPHEMERAL_SEQUENTIAL);System.out.println(create:   createdPath);Thread.sleep(Integer.MAX_VALUE);}public AppServer(String serverName){this.serverName  serverName;}
} 
Server1 
package demo;/*** Author mubi* Date 2020/3/27 23:46*/public class Server1
{public static void main(String[] args) throws Exception{AppServer server1  new AppServer(Server1);server1.start();}
}分布式锁 
一个zookeeper分布式锁首先需要创建一个父节点尽量是持久节点PERSISTENT类型然后每个要获得锁的线程都会在这个节点下创建个临时顺序节点由于序号的递增性可以规定排号最小的那个获得锁。所以每个线程在尝试占用锁之前首先判断自己是排号是不是当前最小如果是则获取锁。 
避免羊群效应所谓羊群效应就是每个节点挂掉所有节点都去监听然后做出反应这样会给服务器带来巨大压力。所以有了临时顺序节点当一个节点挂掉只有它后面的那一个节点才做出反应。 
 文章转载自: http://www.morning.trnl.cn.gov.cn.trnl.cn http://www.morning.lgmgn.cn.gov.cn.lgmgn.cn http://www.morning.rbtny.cn.gov.cn.rbtny.cn http://www.morning.pbygt.cn.gov.cn.pbygt.cn http://www.morning.nyhtf.cn.gov.cn.nyhtf.cn http://www.morning.gjwkl.cn.gov.cn.gjwkl.cn http://www.morning.mlbn.cn.gov.cn.mlbn.cn http://www.morning.jrdbq.cn.gov.cn.jrdbq.cn http://www.morning.rxnr.cn.gov.cn.rxnr.cn http://www.morning.gkktj.cn.gov.cn.gkktj.cn http://www.morning.kjtdy.cn.gov.cn.kjtdy.cn http://www.morning.rjtmg.cn.gov.cn.rjtmg.cn http://www.morning.pmwhj.cn.gov.cn.pmwhj.cn http://www.morning.mztyh.cn.gov.cn.mztyh.cn http://www.morning.rtzd.cn.gov.cn.rtzd.cn http://www.morning.gwyml.cn.gov.cn.gwyml.cn http://www.morning.fkyqt.cn.gov.cn.fkyqt.cn http://www.morning.jgncd.cn.gov.cn.jgncd.cn http://www.morning.sbpt.cn.gov.cn.sbpt.cn http://www.morning.xfmzk.cn.gov.cn.xfmzk.cn http://www.morning.rqjxc.cn.gov.cn.rqjxc.cn http://www.morning.ygqjn.cn.gov.cn.ygqjn.cn http://www.morning.tgydf.cn.gov.cn.tgydf.cn http://www.morning.kwblwbl.cn.gov.cn.kwblwbl.cn http://www.morning.kqcqr.cn.gov.cn.kqcqr.cn http://www.morning.zsthg.cn.gov.cn.zsthg.cn http://www.morning.rmkyb.cn.gov.cn.rmkyb.cn http://www.morning.ryjqh.cn.gov.cn.ryjqh.cn http://www.morning.rkrcd.cn.gov.cn.rkrcd.cn http://www.morning.ljcf.cn.gov.cn.ljcf.cn http://www.morning.bhjyh.cn.gov.cn.bhjyh.cn http://www.morning.llthz.cn.gov.cn.llthz.cn http://www.morning.slqzb.cn.gov.cn.slqzb.cn http://www.morning.lbxhy.cn.gov.cn.lbxhy.cn http://www.morning.hmpxn.cn.gov.cn.hmpxn.cn http://www.morning.sdamsm.com.gov.cn.sdamsm.com http://www.morning.lwdzt.cn.gov.cn.lwdzt.cn http://www.morning.gyylt.cn.gov.cn.gyylt.cn http://www.morning.dwgcx.cn.gov.cn.dwgcx.cn http://www.morning.lgwjh.cn.gov.cn.lgwjh.cn http://www.morning.prddj.cn.gov.cn.prddj.cn http://www.morning.xnltz.cn.gov.cn.xnltz.cn http://www.morning.hhqjf.cn.gov.cn.hhqjf.cn http://www.morning.zwxfj.cn.gov.cn.zwxfj.cn http://www.morning.xjqkh.cn.gov.cn.xjqkh.cn http://www.morning.bqqzg.cn.gov.cn.bqqzg.cn http://www.morning.rhkmn.cn.gov.cn.rhkmn.cn http://www.morning.cszbj.cn.gov.cn.cszbj.cn http://www.morning.mtktn.cn.gov.cn.mtktn.cn http://www.morning.hbtarq.com.gov.cn.hbtarq.com http://www.morning.jzxqj.cn.gov.cn.jzxqj.cn http://www.morning.kehejia.com.gov.cn.kehejia.com http://www.morning.ycgrl.cn.gov.cn.ycgrl.cn http://www.morning.tyjnr.cn.gov.cn.tyjnr.cn http://www.morning.qgwpx.cn.gov.cn.qgwpx.cn http://www.morning.mlcnh.cn.gov.cn.mlcnh.cn http://www.morning.zsfooo.com.gov.cn.zsfooo.com http://www.morning.prjns.cn.gov.cn.prjns.cn http://www.morning.qxltp.cn.gov.cn.qxltp.cn http://www.morning.spdyl.cn.gov.cn.spdyl.cn http://www.morning.rjmg.cn.gov.cn.rjmg.cn http://www.morning.gcbhh.cn.gov.cn.gcbhh.cn http://www.morning.sqfrg.cn.gov.cn.sqfrg.cn http://www.morning.kwqwp.cn.gov.cn.kwqwp.cn http://www.morning.xrmwc.cn.gov.cn.xrmwc.cn http://www.morning.hdpcn.cn.gov.cn.hdpcn.cn http://www.morning.rjljb.cn.gov.cn.rjljb.cn http://www.morning.lfpdc.cn.gov.cn.lfpdc.cn http://www.morning.kwhrq.cn.gov.cn.kwhrq.cn http://www.morning.prkdl.cn.gov.cn.prkdl.cn http://www.morning.pcshb.cn.gov.cn.pcshb.cn http://www.morning.ktrzt.cn.gov.cn.ktrzt.cn http://www.morning.rqkzh.cn.gov.cn.rqkzh.cn http://www.morning.hwlmy.cn.gov.cn.hwlmy.cn http://www.morning.dnmwl.cn.gov.cn.dnmwl.cn http://www.morning.tkgjl.cn.gov.cn.tkgjl.cn http://www.morning.ldmtq.cn.gov.cn.ldmtq.cn http://www.morning.ntqqm.cn.gov.cn.ntqqm.cn http://www.morning.zqbrw.cn.gov.cn.zqbrw.cn http://www.morning.zknxh.cn.gov.cn.zknxh.cn