分布式化网站遇到的典型问题
在年夜型散布式互联网体系中,Session问题是典范的散布式化进程中会碰到的难题。因为Session数据必需在办事端的机械中共享,并要包管状况的一致性。
ZooKeeper是一个散布式的,开放源码的散布式运用法式调和办事,它是一个为散布式运用供给一~致性办事的软件,所供给的功效包含:设置装备摆设保护、域名办事、散布式同步、组办事等。下面我们介绍一下典范的散布式情况下碰到的一些典范问题的解决方法。
1.集群治理(Group Membership)
ZooKeeper可以或许很轻易地实现集群治理的功效,如图1.15所示。假如多台Server构成一个办事集群,那么必需有一个“总管”知道当前集群中每台机械的办事状况,一旦有机械不克不及供给办事,就必需知会合群中的其他集群,并从新分派办事策略。同样,当集群的办事才能增长时,就会增长一台或多台Server, 这些也必需让“总管”知道。
Zo0 Keeper不仅可以或许保护当前集群中机械的办事状况,并且可以或许选出一个“总管”,让“总管”来治理集群一这就是 Zookeeper I的另一个功效 Leader Election。
它的实现方法是在 Zookeeper上创立一个 EPHEMERAL类型的目次节点,然后每个 Server在它们创立目次节点的父目次节点上挪用 getchildrenf String path, Boolean watch)办法并设置 watch为true。因为是 EPHEMERAL目次节点,当创立它的 Server逝世去时,这个目次节点也随之被删除,所以 Children将会变更;这时 get Children上的Watch将会被挪用,通知其他 Server某台 Server已逝世了。新增 Server也是同样的道理。
那么,Z0 Keeper若何实现 Leader Election,也就是选出一个 Master Server呢?和前面的一样,每台 Server创立一个 EPHIEMERAL目次节点,分歧的是它照样一个SEQUENTIAL目次节点,所以它是个 EPHEMERAL SEQUENTIAL目次节点。之所以它是 EPHEMERAL SEQUENTIAL目次节点,是因为我们可以给每台 Server g编号。
我们可以选择当前最小编号的 Server为 Master,假如这个最小编号的 Server逝世去,因为它是 EPHEMERAL节点,逝世去的 Server对应的节点也被删除,所以在当前的节点列表中又涌现一个最小编号的节点,我们就选择这个节点为当前 Master。如许就实现了动态选择 Master,避免传统上单 Master轻易涌现的单点故障问题。
2.共享锁( Locks)
在统一个过程中,共享锁很轻易实现,然则在跨过程或者分歧 Server的情形下就欠好实现了。然而 Zookeeper能很轻易地实现这个功效,它的实现方法也是经由过程获得锁的 Server创立一个 EPHEMERAL SEQUENTIAL目次节点,再经由过程挪用 getchildren办法,查询当前的目次节点列表中最小的目次节点是否是本身创立的目次节点,假如是本身创立的,那么它就获得了这个锁;假如不是,那么它就挪用 exists(String path,Boolean watch)办法,并监控 Zookeeper上目次节点列表的变更,直到使本身创立的节点是列表中最小编号的目次节点,从而获得锁。释放锁很简略,只要删除前面它本身所创立的目次节点即可。
3.队列治理
Keener可以外理以下两种型的队列
其一,同队伍列。即当一个队列的成员都聚齐时,这个队列才可用,不然一向期待所有成员达到。
其二,队列依照FIFO方法进行入队和出队操作,例如实现临盆者和花费者模子。用Zo0 Keeper实现同队伍列的实现思绪如下。
创立一个父目次/ synchronizing,每个成员都监控标记( Set Watch)位目次/ synchronizing/start是否存在,然后每个成员都加人这个队列;
加人队列的方法就是创立 /synchronizing/member i的暂时目次节点,之后每个成员获取/ synchronizing目次的所有目次节点,也就是 member_i;?断定i的值是否已经是成员的个数,假如小于成员个数期待/ 'synchronizing/ start的涌现,假如已经相等就创立 /synchronizing/star。
用 Zookeeper实现FIFO队列的思绪如下。
在特定的网站制造目次下创立 SEQUENTIAL类型的子目次 queue I,如许就能包管所有成员参加队列时都是有编号的;出队列时经由过程 get Children()办法返回当前所有队列中元素,再花费个中最小的一个,如许就能包管FIFO。