??xml version="1.0" encoding="utf-8" standalone="yes"?>丁香另类激情小说,成人av在线网,亚洲激情小视频http://blogjava.net/stevenjohn/category/54675.html那些青春的岁?/description>zh-cnFri, 08 May 2015 16:30:03 GMTFri, 08 May 2015 16:30:03 GMT60Zookeeper 基本机制http://www.aygfsteel.com/stevenjohn/archive/2015/05/08/424957.htmlabinabinFri, 08 May 2015 14:10:00 GMThttp://www.aygfsteel.com/stevenjohn/archive/2015/05/08/424957.htmlhttp://www.aygfsteel.com/stevenjohn/comments/424957.htmlhttp://www.aygfsteel.com/stevenjohn/archive/2015/05/08/424957.html#Feedback0http://www.aygfsteel.com/stevenjohn/comments/commentRss/424957.htmlhttp://www.aygfsteel.com/stevenjohn/services/trackbacks/424957.html

实现

Zookeeper有两U运行模式:

独立模式Qstandalone mode):只运行在一台服务器上,适合试环境

复制模式Qreplicated mode)Q运行于一个集上Q适合生环境Q这个计机集群被称Z?#8220;集合?#8221;QensembleQ。Zookeeper通过复制来实现高可用性,只要集合体中半数以上的机器处于可用状态,它就能够保证服务l箋。ؓ什么一定要过半数呢?q跟Zookeeper的复制策略有养Izookeeper保对znode?wi)的每一个修攚w会被复制到集合体中超q半数的机器上?/p>

生环境Qzookeeper集群的服务器数目应该是奇数?/p>

Zookeeper集群中的角色及其职责

领导?/p>

  1.理写请?/p>

跟随?/p>

  1.响应客户端的读请?/p>

  2.负责把客L(fng)提交的写h转发l领D?/p>

 

znode的观察机?/p>

 

znode以某U方式发生变化时Q?#8220;观察”QwatchQ机制可以让客户端得到通知。可以针对ZooKeeper服务?#8220;操作”来设|观察,该服务的其他操作可以触发观察。比如,客户端可以对某个客户端调用exists操作Q同时在它上面设|一个观察,如果此时q个znode不存在,则existsq回falseQ如果一D|间之后,q个znode被其他客L(fng)创徏Q则q个观察会被触发Q之前的那个客户端就会得到通知?br />

syncQ?客L(fng)的znode视图与ZooKeeper同步
SYNC消息Q返回SYNCl果到客L(fng)Q这个消息最初由客户端发P用来强制得到最新的更新?/div>

跨客L(fng)视图的ƈ发一致性:

ZooKeeperq不保证在某时刻Q两个不同的客户端具有一致的数据视图。因为网lgq的原因Q一个客L(fng)可能在另一个客L(fng)得到修改通知之前q行更新。假定有两个客户?/span>A?/span>B。如果客L(fng)A一个节?/span>/a的g0修改?/span>1Q然后通知客户?/span>Bd/aQ客L(fng)Bd到的值可能还?/span>0Q这取决于它q接C哪个服务器。如果客L(fng)A?/span>Bd到相同的值很重要Q那么客L(fng)B应该在执行读取之前调?/span>sync()Ҏ(gu)?/span>

所以,ZooKeeper本n不保证修改在多个服务器间同步地发生,但是可以使用ZooKeeper原语来构建高层功能,提供有用的客L(fng)同步?br />


 设计目的
1.最l一致性:client不论q接到哪个ServerQ展C给它都是同一个视图,q是zookeeper最重要的性能?/div>
2 .可靠性:h单、健壮、良好的性能Q如果消息m被到一台服务器接受Q那么它?yu)被所有的服务器接受?/div>
3 .实时性:Zookeeper保证客户端将在一个时间间隔范围内获得服务器的更新信息Q或者服务器失效的信息。但׃|络延时{原因,Zookeeper不能保证两个客户端能同时得到刚更新的数据Q如果需要最新数据,应该在读数据之前调用sync()接口?/div>
4 .{待无关Qwait-freeQ:慢的或者失效的client不得q预快速的client的请求,使得每个client都能有效的等待?/div>
5.原子性:更新只能成功或者失败,没有中间状态?/div>
6 .序性:包括全局有序和偏序两U:全局有序是指如果在一台服务器上消息a在消息b前发布,则在所有Server上消息a都将在消息b前被发布Q偏序是指如果一个消息b在消息a后被同一个发送者发布,a必将排在b前面?/div>


节点宕机Q?br />

应用集群中,我们常常需要让每一个机器知道集中Q或依赖的其他某一个集)哪些机器是活着的,q且在集机器因为宕机,|络断链{原因能够不在h工介入的情况下迅速通知到每一个机器?/font>
Zookeeper同样很容易实现这个功能,比如我在zookeeper服务器端有一个znode?APP1SERVERS,那么集群中每一个机器启动的时候都去这个节点下创徏一个EPHEMERALcd的节点,比如server1创徏/APP1SERVERS/SERVER1(可以使用ip,保证不重?Qserver2创徏/APP1SERVERS/SERVER2Q然后SERVER1和SERVER2都watch /APP1SERVERSq个父节点,那么也就是这个父节点下数据或者子节点变化都会通知对该节点q行watch的客L(fng)。因为EPHEMERALcd节点有一个很重要的特性,是客户端和服务器端q接断掉或者sessionq期׃使节Ҏ(gu)失,那么在某一个机器挂掉或者断铄时候,其对应的节点׃消失Q然后集中所有对/APP1SERVERSq行watch的客L(fng)都会收到通知Q然后取得最新列表即可?/div>


zookeeper是一个高可用性,高性能的协调服?/font>
解决哪些问题
在分布式应用中,l常会出现部分失败的情况Q即当节炚w传递消息的时候由于网l或者接收者进E死掉等原因Q发送者无法知道接收者是否收到消息?/div>
׃部分p|是分布式pȝ固有的特征因此zookeeperq不能避免部分失败,但是它可以帮你在部分p|的时候进行正处?/div>
Z解决q个问题zookeeperh以下特征Q?/div>
1Qzookeeper提供丰富的构Ӟbuilding blockQ来实现很多协调数据l构和协?/div>
2Q访问原子性,客户端要么读到所有数据,要么dp|Q不会出现只d部分的情?/div>
3Qzookeeperq行在一l机器上Q具有高可用性,帮助pȝ避免单点故障Q同时删掉故障服务器
4Q顺序一致性:L客户端的更新h会被按照发送顺序提?/div>
5Q单一pȝ映像Q当一台服务器故障Q导致它的客L(fng)需要连接其它服务器的时候,所有更新晚于故障服务器的服务器都不会接收请求,一直到更新赶上故障服务?/div>
6Q及时性:M客户端能看到的滞后都是有限的Q不会超q几十秒Q且提供sync操作强制客户端所q的服务器与领导者同?/div>
7Q会话:每个客户端连接时会尝试连接到配置列表中的一台服务器Q一旦失败会自动q接另一台服务器依次cLQ知道成功连接一台服务器Q从而创Z个会话,客户端可以位每个会话讄时旉Q一旦会话过期,则所有短暂znode会丢失,因ؓzookeeper会自动发送心跛_Q所以很发?/div>
8Q约会机ӞrendezvousQ,在交互的q程中,被协调的各方不许要事先彼此了解,甚至不必同时存在
9QACLQzookeeper提供了digestQ通过用户名密码)QhostQ通过L名)QipQ通过ip地址Q?Un份验证模式,依赖与zookeeper的n份验证机制每个ACL都是一个n份对应一l权限,如果我们要给demo.com的客L(fng)域一个读权限在java语言中可以这样创建:
new ACL(Perms.READ, new Id("host", "demo.com"));
Ids.OPEN_ACL_UNSAFE是将所有ADMIN之外的权限授予每个h
另zookeeperq可以集成第三方的n份验证系l?/div>
10Q提供关于通用协调模式的开源共享资源库
11Q高性能的(官方数据Q对以写Z的工作负载来说?C错的机器基准吞吐量达?0000+






abin 2015-05-08 22:10 发表评论
]]>ZooKeeper典型应用场景一?/title><link>http://www.aygfsteel.com/stevenjohn/archive/2015/01/11/422171.html</link><dc:creator>abin</dc:creator><author>abin</author><pubDate>Sat, 10 Jan 2015 18:57:00 GMT</pubDate><guid>http://www.aygfsteel.com/stevenjohn/archive/2015/01/11/422171.html</guid><wfw:comment>http://www.aygfsteel.com/stevenjohn/comments/422171.html</wfw:comment><comments>http://www.aygfsteel.com/stevenjohn/archive/2015/01/11/422171.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.aygfsteel.com/stevenjohn/comments/commentRss/422171.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/stevenjohn/services/trackbacks/422171.html</trackback:ping><description><![CDATA[<p style="padding: 0px; margin: 0px; clear: both; height: auto; overflow: hidden; color: #2c2c2c; font-family: 宋体, 'Arial Narrow', arial, serif; line-height: 28px; background-color: #ffffff;"><span style="padding: 0px; margin: 0px; font-family: 'Comic Sans MS';">ZooKeeper是一个高可用的分布式数据理与系l协调框架。基于对Paxos法的实玎ͼ使该框架保证了分布式环境中数据的Z致性,也正是基于这L(fng)Ҏ(gu),使得ZooKeeper解决很多分布式问题。网上对ZK的应用场景也有不介l,本文结合作者n边的目例子Q系l地对ZK的应用场景进行一个分门归cȝ介绍?/span></p><p style="padding: 0px; margin: 0px; clear: both; height: auto; overflow: hidden; color: #2c2c2c; font-family: 宋体, 'Arial Narrow', arial, serif; line-height: 28px; background-color: #ffffff;"><span style="padding: 0px; margin: 0px; font-family: 'Comic Sans MS';">值得注意的是QZKq天生是些应用场景设计的Q都是后来众多开发者根据其框架的特性,利用其提供的一pdAPI接口Q或者称为原语集Q,摸烦出来的典型用方法。因此,也非常欢q读者分享你在ZK使用上的奇技淫y?/span></p><table cellspacing="0" cellpadding="0" style="padding: 0px; margin: 0px auto 10px; font-size: 12px; border-collapse: collapse; color: #2c2c2c; font-family: 宋体, 'Arial Narrow', arial, serif; border-style: solid; background-color: #ffffff;"><tbody style="padding: 0px; margin: 0px;"><tr style="padding: 0px; margin: 0px;"><td valign="top" bgcolor="#FF8F59" width="909" style="padding: 5px 10px; margin: 0px; border-style: solid; border-color: #dddddd; background-image: initial; background-attachment: initial; background-size: initial; background-origin: initial; background-clip: initial; background-position: initial; background-repeat: initial;"><p align="center" style="padding: 0px; margin: 0px; clear: both; height: auto; overflow: hidden;"> <span style="padding: 0px; margin: 0px; font-size: 28px;"><strong style="padding: 0px; margin: 0px;">ZooKeeper</strong><strong style="padding: 0px; margin: 0px;">典型应用场景一?/strong></span></p></td></tr><tr style="padding: 0px; margin: 0px;"><td valign="top" bgcolor="#8CEA00" width="909" style="padding: 5px 10px; margin: 0px; border-style: solid; border-color: #dddddd; background-image: initial; background-attachment: initial; background-size: initial; background-origin: initial; background-clip: initial; background-position: initial; background-repeat: initial;"><span style="padding: 0px; margin: 0px; font-family: 'Comic Sans MS';"><span style="padding: 0px; margin: 0px; font-size: 18px;"><strong style="padding: 0px; margin: 0px;">数据发布与订阅(配置中心Q?/strong></span></span></td></tr><tr style="padding: 0px; margin: 0px;"><td valign="top" bgcolor="#C2C287" width="909" style="padding: 5px 10px; margin: 0px; border-style: solid; border-color: #dddddd; background-image: initial; background-attachment: initial; background-size: initial; background-origin: initial; background-clip: initial; background-position: initial; background-repeat: initial;"><span style="padding: 0px; margin: 0px; font-family: 'Comic Sans MS';">发布与订阅模型,x谓的配置中心Q顾名思义是发布者将数据发布到ZK节点上,供订阅者动态获取数据,实现配置信息的集中式理和动态更新。例如全局的配|信息,服务式服务框架的服务地址列表{就非常适合使用?/span></td></tr><tr style="padding: 0px; margin: 0px;"><td valign="top" bgcolor="#D0D0D0" width="909" style="padding: 5px 10px; margin: 0px; border-style: solid; border-color: #dddddd; background-image: initial; background-attachment: initial; background-size: initial; background-origin: initial; background-clip: initial; background-position: initial; background-repeat: initial;"><span style="padding: 0px; margin: 0px; font-family: 'Comic Sans MS';">    <strong style="padding: 0px; margin: 0px;">1</strong>. 应用中用到的一些配|信息放到ZK上进行集中管理。这cd景通常是这P应用在启动的时候会d来获取一ơ配|,同时Q在节点上注册一个WatcherQ这样一来,以后每次配置有更新的时候,都会实时通知到订阅的客户端,从来辑ֈ获取最新配|信息的目的?/span><br style="padding: 0px; margin: 0px;" /><span style="padding: 0px; margin: 0px; font-family: 'Comic Sans MS';">    <strong style="padding: 0px; margin: 0px;">2</strong>. 分布式搜索服务中Q烦引的元信息和服务器集机器的节点状态存攑֜ZK的一些指定节点,供各个客L(fng)订阅使用?/span><br style="padding: 0px; margin: 0px;" /><span style="padding: 0px; margin: 0px; font-family: 'Comic Sans MS';">    <strong style="padding: 0px; margin: 0px;">3</strong>. 分布式日志收集系l。这个系l的核心工作是收集分布在不同机器的日志。收集器通常是按照应用来分配攉d单元Q因此需要在ZK上创Z个以应用名作为path的节点PQƈ这个应用的所有机器ipQ以子节点的形式注册到节点P上,q样一来就能够实现机器变动的时候,能够实时通知到收集器调整d分配?/span><br style="padding: 0px; margin: 0px;" /><span style="padding: 0px; margin: 0px; font-family: 'Comic Sans MS';">    <strong style="padding: 0px; margin: 0px;">4</strong>. pȝ中有些信息需要动态获取,q且q会存在人工手动M改这个信息的发问。通常是暴露出接口Q例如JMX接口Q来获取一些运行时的信息。引入ZK之后Q就不用自己实现一套方案了Q只要将q些信息存放到指定的ZK节点上即可?/span><br style="padding: 0px; margin: 0px;" /><span style="padding: 0px; margin: 0px; font-family: 'Comic Sans MS';"><strong style="padding: 0px; margin: 0px;">注意</strong>Q在上面提到的应用场景中Q有个默认前提是Q数据量很小Q但是数据更新可能会比较快的场景?/span></td></tr><tr style="padding: 0px; margin: 0px;"><td valign="top" bgcolor="#8CEA00" width="909" style="padding: 5px 10px; margin: 0px; border-style: solid; border-color: #dddddd; background-image: initial; background-attachment: initial; background-size: initial; background-origin: initial; background-clip: initial; background-position: initial; background-repeat: initial;"><span style="padding: 0px; margin: 0px; font-family: 'Comic Sans MS';"><span style="padding: 0px; margin: 0px; font-size: 18px;"><strong style="padding: 0px; margin: 0px;">负蝲均衡</strong></span></span></td></tr><tr style="padding: 0px; margin: 0px;"><td valign="top" bgcolor="#C2C287" width="909" style="padding: 5px 10px; margin: 0px; border-style: solid; border-color: #dddddd; background-image: initial; background-attachment: initial; background-size: initial; background-origin: initial; background-clip: initial; background-position: initial; background-repeat: initial;"><span style="padding: 0px; margin: 0px; font-family: 'Comic Sans MS';">q里说的负蝲均衡是指软负载均衡。在分布式环境中Qؓ了保证高可用性,通常同一个应用或同一个服务的提供斚w会部|多份,辑ֈ对等服务。而消费者就要在这些对{的服务器中选择一个来执行相关的业务逻辑Q其中比较典型的是消息中间g中的生者,消费者负载均衡?/span></td></tr><tr style="padding: 0px; margin: 0px;"><td valign="top" bgcolor="#D0D0D0" width="909" style="padding: 5px 10px; margin: 0px; border-style: solid; border-color: #dddddd; background-image: initial; background-attachment: initial; background-size: initial; background-origin: initial; background-clip: initial; background-position: initial; background-repeat: initial;"><p style="padding: 0px; margin: 0px; clear: both; height: auto; overflow: hidden;"><span style="padding: 0px; margin: 0px; font-family: 'Comic Sans MS';">消息中间件中发布者和订阅者的负蝲均衡Qlinkedin开源的KafkaMQ和阿里开源的</span><a style="padding: 0px; margin: 0px; color: #2c628d; text-decoration: none;"><span style="padding: 0px; margin: 0px; font-family: 'Comic Sans MS';">metaq</span></a><span style="padding: 0px; margin: 0px; font-family: 'Comic Sans MS';">都是通过zookeeper来做到生产者、消费者的负蝲均衡。这里以metaqZ如讲下:</span></p><p style="padding: 0px; margin: 0px; clear: both; height: auto; overflow: hidden;"><span style="padding: 0px; margin: 0px; font-family: 'Comic Sans MS';"><strong style="padding: 0px; margin: 0px;">生者负载均?/strong>Qmetaq发送消息的时候,生者在发送消息的时候必选择一台broker上的一个分区来发送消息,因此metaq在运行过E中Q会把所有broker和对应的分区信息全部注册到ZK指定节点上,默认的策略是一个依ơ轮询的q程Q生产者在通过ZK获取分区列表之后Q会按照brokerId和partition的顺序排列组l成一个有序的分区列表Q发送的时候按照从头到@环往复的方式选择一个分区来发送消息?/span></p><p style="padding: 0px; margin: 0px; clear: both; height: auto; overflow: hidden;"><span style="padding: 0px; margin: 0px; font-family: 'Comic Sans MS';"><strong style="padding: 0px; margin: 0px;">消费负蝲均衡Q?/strong> 在消费过E中Q一个消费者会消费一个或多个分区中的消息Q但是一个分区只会由一个消费者来消费。MetaQ的消费策略是Q?/span></p><span style="padding: 0px; margin: 0px; font-family: 'Comic Sans MS';">    <strong style="padding: 0px; margin: 0px;">1</strong>. 每个分区针对同一个group只挂载一个消费者?/span><br style="padding: 0px; margin: 0px;" /><span style="padding: 0px; margin: 0px; font-family: 'Comic Sans MS';">    <strong style="padding: 0px; margin: 0px;">2</strong>. 如果同一个group的消费者数目大于分区数目,则多出来的消费者将不参与消贏V?/span><br style="padding: 0px; margin: 0px;" /><span style="padding: 0px; margin: 0px; font-family: 'Comic Sans MS';">    <strong style="padding: 0px; margin: 0px;">3</strong>. 如果同一个group的消费者数目小于分区数目,则有部分消费者需要额外承担消费Q务?/span><br style="padding: 0px; margin: 0px;" /><span style="padding: 0px; margin: 0px; font-family: 'Comic Sans MS';">      在某个消费者故障或者重启等情况下,其他消费者会感知到这一变化Q通过 zookeeper watch消费者列表)Q然后重新进行负载均衡,保证所有的分区都有消费者进行消贏V?/span></td></tr><tr style="padding: 0px; margin: 0px;"><td valign="top" bgcolor="#8CEA00" width="909" style="padding: 5px 10px; margin: 0px; border-style: solid; border-color: #dddddd; background-image: initial; background-attachment: initial; background-size: initial; background-origin: initial; background-clip: initial; background-position: initial; background-repeat: initial;"><span style="padding: 0px; margin: 0px; font-family: 'Comic Sans MS';"><span style="padding: 0px; margin: 0px; font-size: 18px;"><strong style="padding: 0px; margin: 0px;">命名服务(Naming Service)</strong></span></span></td></tr><tr style="padding: 0px; margin: 0px;"><td valign="top" bgcolor="#C2C287" width="909" style="padding: 5px 10px; margin: 0px; border-style: solid; border-color: #dddddd; background-image: initial; background-attachment: initial; background-size: initial; background-origin: initial; background-clip: initial; background-position: initial; background-repeat: initial;"><span style="padding: 0px; margin: 0px; font-family: 'Comic Sans MS';">命名服务也是分布式系l中比较常见的一cd景。在分布式系l中Q通过使用命名服务Q客L(fng)应用能够Ҏ(gu)指定名字来获取资源或服务的地址Q提供者等信息。被命名的实体通常可以是集中的机器,提供的服务地址Q远E对象等{?#8212;—q些我们都可以统UC们ؓ名字QNameQ。其中较为常见的是一些分布式服务框架中的服务地址列表。通过调用ZK提供的创点的APIQ能够很Ҏ(gu)创徏一个全局唯一的pathQ这个path可以作Z个名U?/span></td></tr><tr style="padding: 0px; margin: 0px;"><td valign="top" bgcolor="#D0D0D0" width="909" style="padding: 5px 10px; margin: 0px; border-style: solid; border-color: #dddddd; background-image: initial; background-attachment: initial; background-size: initial; background-origin: initial; background-clip: initial; background-position: initial; background-repeat: initial;"><p style="padding: 0px; margin: 0px; clear: both; height: auto; overflow: hidden;"><span style="padding: 0px; margin: 0px; font-family: 'Comic Sans MS';">阉K巴巴集团开源的分布式服务框架Dubbo中用ZooKeeper来作为其命名服务Q维护全局的服务地址列表Q?/span><a style="padding: 0px; margin: 0px; color: #2c628d; text-decoration: none;"><span style="padding: 0px; margin: 0px; font-family: 'Comic Sans MS';">点击q里</span></a><span style="padding: 0px; margin: 0px; font-family: 'Comic Sans MS';">查看Dubbo开源项目。在Dubbo实现中:</span></p><p style="padding: 0px; margin: 0px; clear: both; height: auto; overflow: hidden;"><span style="padding: 0px; margin: 0px; font-family: 'Comic Sans MS';"><strong style="padding: 0px; margin: 0px;">服务提供?/strong>在启动的时候,向ZK上的指定节点/dubbo/${serviceName}/providers目录下写入自qURL地址Q这个操作就完成了服务的发布?/span></p><p style="padding: 0px; margin: 0px; clear: both; height: auto; overflow: hidden;"><span style="padding: 0px; margin: 0px; font-family: 'Comic Sans MS';"><strong style="padding: 0px; margin: 0px;">服务消费?/strong>启动的时候,订阅/dubbo/${serviceName}/providers目录下的提供者URL地址Q?q向/dubbo/${serviceName} /consumers目录下写入自qURL地址?/span></p><p style="padding: 0px; margin: 0px; clear: both; height: auto; overflow: hidden;"><span style="padding: 0px; margin: 0px; font-family: 'Comic Sans MS';"><strong style="padding: 0px; margin: 0px;">注意</strong>Q所有向ZK上注册的地址都是临时节点Q这样就能够保证服务提供者和消费者能够自动感应资源的变化?另外QDubboq有针对服务_度的监控,Ҏ(gu)是订?dubbo/${serviceName}目录下所有提供者和消费者的信息?/span></p></td></tr><tr style="padding: 0px; margin: 0px;"><td valign="top" bgcolor="#8CEA00" width="909" style="padding: 5px 10px; margin: 0px; border-style: solid; border-color: #dddddd; background-image: initial; background-attachment: initial; background-size: initial; background-origin: initial; background-clip: initial; background-position: initial; background-repeat: initial;"><span style="padding: 0px; margin: 0px; font-family: 'Comic Sans MS';"><span style="padding: 0px; margin: 0px; font-size: 18px;"><strong style="padding: 0px; margin: 0px;">分布式通知/协调</strong></span></span></td></tr><tr style="padding: 0px; margin: 0px;"><td valign="top" bgcolor="#C2C287" width="909" style="padding: 5px 10px; margin: 0px; border-style: solid; border-color: #dddddd; background-image: initial; background-attachment: initial; background-size: initial; background-origin: initial; background-clip: initial; background-position: initial; background-repeat: initial;"><span style="padding: 0px; margin: 0px; font-family: 'Comic Sans MS';">ZooKeeper中特有watcher注册与异步通知机制Q能够很好的实现分布式环境下不同pȝ之间的通知与协调,实现Ҏ(gu)据变更的实时处理。用方法通常是不同系l都对ZK上同一个znodeq行注册Q监听znode的变化(包括znode本n内容及子节点的)Q其中一个系lupdate了znodeQ那么另一个系l能够收到通知Qƈ作出相应处理</span></td></tr><tr style="padding: 0px; margin: 0px;"><td valign="top" bgcolor="#D0D0D0" width="909" style="padding: 5px 10px; margin: 0px; border-style: solid; border-color: #dddddd; background-image: initial; background-attachment: initial; background-size: initial; background-origin: initial; background-clip: initial; background-position: initial; background-repeat: initial;"><span style="padding: 0px; margin: 0px; font-family: 'Comic Sans MS';">    <strong style="padding: 0px; margin: 0px;">1</strong>. 另一U心x机Ӟ系l和被检系l之间ƈ不直接关联v来,而是通过zk上某个节点关联,大大减少pȝ耦合?/span><br style="padding: 0px; margin: 0px;" /><span style="padding: 0px; margin: 0px; font-family: 'Comic Sans MS';">    <strong style="padding: 0px; margin: 0px;">2</strong>. 另一U系l调度模式:某系l有控制台和推送系l两部分l成Q控制台的职责是控制推送系l进行相应的推送工作。管理h员在控制C的一些操作,实际上是修改了ZK上某些节点的状态,而ZK把q些变化通知l他们注册W(xu)atcher的客L(fng)Q即推送系l,于是Q作出相应的推送Q务?/span><br style="padding: 0px; margin: 0px;" /><span style="padding: 0px; margin: 0px; font-family: 'Comic Sans MS';">    <strong style="padding: 0px; margin: 0px;">3</strong>. 另一U工作汇报模式:一些类gd分发pȝQ子d启动后,到zk来注册一个(f)时节点,q且定时自qq度q行汇报Q将q度写回q个临时节点Q,q样d理者就能够实时知道dq度?/span><br style="padding: 0px; margin: 0px;" /><span style="padding: 0px; margin: 0px; font-family: 'Comic Sans MS';">MQ用zookeeper来进行分布式通知和协调能够大大降低系l之间的耦合</span></td></tr><tr style="padding: 0px; margin: 0px;"><td valign="top" bgcolor="#8CEA00" width="909" style="padding: 5px 10px; margin: 0px; border-style: solid; border-color: #dddddd; background-image: initial; background-attachment: initial; background-size: initial; background-origin: initial; background-clip: initial; background-position: initial; background-repeat: initial;"><span style="padding: 0px; margin: 0px; font-family: 'Comic Sans MS';"><span style="padding: 0px; margin: 0px; font-size: 18px;"><strong style="padding: 0px; margin: 0px;">集群理与Master选D</strong></span></span></td></tr><tr style="padding: 0px; margin: 0px;"><td valign="top" bgcolor="#C2C287" width="909" style="padding: 5px 10px; margin: 0px; border-style: solid; border-color: #dddddd; background-image: initial; background-attachment: initial; background-size: initial; background-origin: initial; background-clip: initial; background-position: initial; background-repeat: initial;"><span style="padding: 0px; margin: 0px; font-family: 'Comic Sans MS';">    <strong style="padding: 0px; margin: 0px;">1</strong>. 集群机器监控Q这通常用于那种寚w中机器状态,机器在线率有较高要求的场景,能够快速对集群中机器变化作出响应。这L(fng)场景中,往往有一个监控系l,实时集机器是否存?gu)zR过ȝ做法通常是:监控pȝ通过某种手段Q比如pingQ定时检每个机器,或者每个机器自己定时向监控pȝ汇报“我还?gu)zȝ”?q种做法可行Q但是存在两个比较明昄问题Q?/span><br style="padding: 0px; margin: 0px;" /><span style="padding: 0px; margin: 0px; font-family: 'Comic Sans MS';">        <strong style="padding: 0px; margin: 0px;">1</strong>. 集群中机器有变动的时候,牵连修改的东西比较多?/span><br style="padding: 0px; margin: 0px;" /><span style="padding: 0px; margin: 0px; font-family: 'Comic Sans MS';">        <strong style="padding: 0px; margin: 0px;">2</strong>. 有一定的延时?/span><br style="padding: 0px; margin: 0px;" /><p align="left" style="padding: 0px; margin: 0px; clear: both; height: auto; overflow: hidden;"><span style="padding: 0px; margin: 0px; font-family: 'Comic Sans MS';">        利用ZooKeeper有两个特性,可以实现另一U集机器存?gu)zL监控系l:</span></p><span style="padding: 0px; margin: 0px; font-family: 'Comic Sans MS';">        <strong style="padding: 0px; margin: 0px;">1</strong>. 客户端在节点 x 上注册一个WatcherQ那么如?x?的子节点变化了,会通知该客L(fng)?/span><br style="padding: 0px; margin: 0px;" /><span style="padding: 0px; margin: 0px; font-family: 'Comic Sans MS';">        <strong style="padding: 0px; margin: 0px;">2</strong>. 创徏EPHEMERALcd的节点,一旦客L(fng)和服务器的会话结束或q期Q那么该节点׃消失?/span><br style="padding: 0px; margin: 0px;" /><p align="left" style="padding: 0px; margin: 0px; clear: both; height: auto; overflow: hidden;"><span style="padding: 0px; margin: 0px; font-family: 'Comic Sans MS';">       例如Q监控系l在 /clusterServers 节点上注册一个WatcherQ以后每动态加机器Q那么就往 /clusterServers 下创Z?EPHEMERALcd的节点:/clusterServers/{hostname}. q样Q监控系l就能够实时知道机器的增减情况,至于后箋处理是监控pȝ的业务了?/span></p><span style="padding: 0px; margin: 0px; font-family: 'Comic Sans MS';">    <strong style="padding: 0px; margin: 0px;">2</strong>. Master选D则是zookeeper中最为经典的应用场景了?/span><br style="padding: 0px; margin: 0px;" /><p align="left" style="padding: 0px; margin: 0px; clear: both; height: auto; overflow: hidden;"><span style="padding: 0px; margin: 0px; font-family: 'Comic Sans MS';">在分布式环境中,相同的业务应用分布在不同的机器上Q有些业务逻辑Q例如一些耗时的计,|络I/O处理Q,往往只需要让整个集群中的某一台机器进行执行,其余机器可以׃nq个l果Q这样可以大大减重复劳动,提高性能Q于是这个master选D便是q种场景下的到的主要问题?/span></p><p align="left" style="padding: 0px; margin: 0px; clear: both; height: auto; overflow: hidden;"><span style="padding: 0px; margin: 0px; font-family: 'Comic Sans MS';">利用ZooKeeper的强一致性,能够保证在分布式高ƈ发情况下节点创徏的全局唯一性,卻I同时有多个客L(fng)h创徏 /currentMaster 节点Q最l一定只有一个客L(fng)h能够创徏成功。利用这个特性,p很轻易的在分布式环境中进行集选取了?/span></p><p align="left" style="padding: 0px; margin: 0px; clear: both; height: auto; overflow: hidden;"><span style="padding: 0px; margin: 0px; font-family: 'Comic Sans MS';">另外Q这U场景演化一下,是动态Master选D。这p用到EPHEMERAL_SEQUENTIALcd节点的特性了?/span></p><p align="left" style="padding: 0px; margin: 0px; clear: both; height: auto; overflow: hidden;"><span style="padding: 0px; margin: 0px; font-family: 'Comic Sans MS';">上文中提刎ͼ所有客L(fng)创徏hQ最l只有一个能够创建成功。在q里E微变化下,是允许所有请求都能够创徏成功Q但是得有个创徏序Q于是所有的h最l在ZK上创建结果的一U可能情冉|q样Q?/currentMaster/{sessionId}-1 ,/currentMaster/{sessionId}-2,/currentMaster/{sessionId}-3 ….. 每次选取序列h的那个机器作ؓMasterQ如果这个机器挂了,׃他创建的节点会马上小Ӟ那么之后最的那个机器是Master了?/span></p></td></tr><tr style="padding: 0px; margin: 0px;"><td valign="top" bgcolor="#D0D0D0" width="909" style="padding: 5px 10px; margin: 0px; border-style: solid; border-color: #dddddd; background-image: initial; background-attachment: initial; background-size: initial; background-origin: initial; background-clip: initial; background-position: initial; background-repeat: initial;"><span style="padding: 0px; margin: 0px; font-family: 'Comic Sans MS';">    <strong style="padding: 0px; margin: 0px;">1</strong>. 在搜索系l中Q如果集中每个机器都生成一份全量烦引,不仅耗时Q而且不能保证彼此之间索引数据一致。因此让集群中的Master来进行全量烦引的生成Q然后同步到集群中其它机器。另外,Master选D的容灾措施是Q可以随时进行手动指定masterQ就是说应用在zk在无法获取master信息Ӟ可以通过比如http方式Q向一个地方获取master?/span><br style="padding: 0px; margin: 0px;" /><span style="padding: 0px; margin: 0px; font-family: 'Comic Sans MS';">    <strong style="padding: 0px; margin: 0px;">2</strong>. 在Hbase中,也是使用ZooKeeper来实现动态HMaster的选D。在Hbase实现中,会在ZK上存储一些ROOT表的地址和HMaster的地址QHRegionServer也会把自׃临时节点QEphemeralQ的方式注册到Zookeeper中,使得HMaster可以随时感知到各个HRegionServer的存?gu)zȝ态,同时Q一旦HMaster出现问题Q会重新选DZ个HMaster来运行,从而避免了HMaster的单炚w?/span></td></tr><tr style="padding: 0px; margin: 0px;"><td valign="top" bgcolor="#8CEA00" width="909" style="padding: 5px 10px; margin: 0px; border-style: solid; border-color: #dddddd; background-image: initial; background-attachment: initial; background-size: initial; background-origin: initial; background-clip: initial; background-position: initial; background-repeat: initial;"><span style="padding: 0px; margin: 0px; font-family: 'Comic Sans MS';"><span style="padding: 0px; margin: 0px; font-size: 18px;"><strong style="padding: 0px; margin: 0px;">分布式锁</strong></span></span></td></tr><tr style="padding: 0px; margin: 0px;"><td valign="top" bgcolor="#C2C287" width="909" style="padding: 5px 10px; margin: 0px; border-style: solid; border-color: #dddddd; background-image: initial; background-attachment: initial; background-size: initial; background-origin: initial; background-clip: initial; background-position: initial; background-repeat: initial;"><p style="padding: 0px; margin: 0px; clear: both; height: auto; overflow: hidden;"><span style="padding: 0px; margin: 0px; font-family: 'Comic Sans MS';">分布式锁Q这个主要得益于ZooKeeper为我们保证了数据的强一致性。锁服务可以分ؓ两类Q一个是<strong style="padding: 0px; margin: 0px;">保持独占</strong>Q另一个是<strong style="padding: 0px; margin: 0px;">控制时序</strong>?/span></p><p style="padding: 0px; margin: 0px; clear: both; height: auto; overflow: hidden;"><span style="padding: 0px; margin: 0px; font-family: 'Comic Sans MS';">    <strong style="padding: 0px; margin: 0px;">1</strong>. 所谓保持独占,是所有试图来获取q个锁的客户端,最l只有一个可以成功获得这把锁。通常的做法是把zk上的一个znode看作是一把锁Q通过create znode的方式来实现。所有客L(fng)都去创徏 /distribute_lock 节点Q最l成功创建的那个客户端也x有了q把锁?/span><br style="padding: 0px; margin: 0px;" /><span style="padding: 0px; margin: 0px; font-family: 'Comic Sans MS';">    <strong style="padding: 0px; margin: 0px;">2</strong>. 控制时序Q就是所有视图来获取q个锁的客户端,最l都是会被安排执行,只是有个全局时序了。做法和上面基本cMQ只是这?/distribute_lock 已经预先存在Q客L(fng)在它下面创徏临时有序节点Q这个可以通过节点的属性控ӞCreateMode.EPHEMERAL_SEQUENTIAL来指定)。Zk的父节点Q?distribute_lockQ维持一份sequence,保证子节点创建的时序性,从而也形成了每个客L(fng)的全局时序?/span></p></td></tr><tr style="padding: 0px; margin: 0px;"><td valign="top" bgcolor="#8CEA00" width="909" style="padding: 5px 10px; margin: 0px; border-style: solid; border-color: #dddddd; background-image: initial; background-attachment: initial; background-size: initial; background-origin: initial; background-clip: initial; background-position: initial; background-repeat: initial;"><span style="padding: 0px; margin: 0px; font-family: 'Comic Sans MS';"><span style="padding: 0px; margin: 0px; font-size: 18px;"><strong style="padding: 0px; margin: 0px;">分布式队?/strong></span></span></td></tr><tr style="padding: 0px; margin: 0px;"><td valign="top" bgcolor="#C2C287" width="909" style="padding: 5px 10px; margin: 0px; border-style: solid; border-color: #dddddd; background-image: initial; background-attachment: initial; background-size: initial; background-origin: initial; background-clip: initial; background-position: initial; background-repeat: initial;"><span style="padding: 0px; margin: 0px; font-family: 'Comic Sans MS';">队列斚wQ简单地讲有两种Q一U是常规的先q先出队列,另一U是要等到队列成员聚齐之后的才统一按序执行。对于第一U先q先出队列,和分布式锁服务中的控制时序场景基本原理一_q里不再赘述?W二U队列其实是在FIFO队列的基上作了一个增强。通常可以?/queue q个znode下预先徏立一?queue/num 节点Qƈ且赋gؓnQ或者直接给/queue赋值nQ,表示队列大小Q之后每ơ有队列成员加入后,判断下是否已经到达队列大小Q决定是否可以开始执行了。这U用法的典型场景是,分布式环境中Q一个大dTask AQ需要在很多子Q务完成(或条件就l)情况下才能进行。这个时候,凡是其中一个子d完成Q就l)Q那么就?/taskList 下徏立自q临时时序节点QCreateMode.EPHEMERAL_SEQUENTIALQ,?/taskList 发现自己下面的子节点满指定个数Q就可以q行下一步按序进行处理了?/span></td></tr></tbody></table><p style="padding: 0px; margin: 0px; clear: both; height: auto; overflow: hidden; color: #2c2c2c; font-family: 宋体, 'Arial Narrow', arial, serif; line-height: 28px; background-color: #ffffff;"> </p><p style="padding: 0px; margin: 0px; clear: both; height: auto; overflow: hidden; color: #2c2c2c; font-family: 宋体, 'Arial Narrow', arial, serif; line-height: 28px; background-color: #ffffff;">本文 “<a style="padding: 0px; margin: 0px; color: #2c628d; text-decoration: none;">专栏QPaxos与ZooKeeper</a>” 博客Q请务必保留此出?a style="padding: 0px; margin: 0px; color: #2c628d; text-decoration: none;">http://nileader.blog.51cto.com/1381108/1040007</a></p><img src ="http://www.aygfsteel.com/stevenjohn/aggbug/422171.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/stevenjohn/" target="_blank">abin</a> 2015-01-11 02:57 <a href="http://www.aygfsteel.com/stevenjohn/archive/2015/01/11/422171.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss> <footer> <div class="friendship-link"> <a href="http://www.aygfsteel.com/" title="狠狠久久亚洲欧美专区_中文字幕亚洲综合久久202_国产精品亚洲第五区在线_日本免费网站视频">狠狠久久亚洲欧美专区_中文字幕亚洲综合久久202_国产精品亚洲第五区在线_日本免费网站视频</a> </div> </footer> վ֩ģ壺 <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">ɽ</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">Ѩ</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">ڽ</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">ƽ</a>| <a href="http://" target="_blank">Դ</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">䰲</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">¡</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">ʹ</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">۳</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">˲</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">̨ʡ</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">ַ</a>| <a href="http://" target="_blank">ײ</a>| <a href="http://" target="_blank">ױ</a>| <a href="http://" target="_blank">ˮ</a>| <a href="http://" target="_blank">Ľ</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">ɽ</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <script> (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })(); </script> </body>