zoo

阅读 / 问答 / 标签

zookeeper java watcher 在哪个包

就在zookeeper包下,org.apache.zookeeper.Watcher

一文了解Zookeeper的Watcher机制

Zookeeper系列介绍( 持续更新 ) u2002u2002Zookeeper提供了数据的发布/订阅功能,多个订阅者可同时监听某一特定主题对象,当该主题对象的自身状态发生变化时(例如节点内容改变、节点下的子节点列表改变等),会实时、主动通知所有订阅者。 u2002u2002Zookeeper采用了Watcher机制实现数据的发布/订阅功能。该机制在被订阅对象发生变化时会异步通知客户端,因此客户端不必在Watcher注册后轮询阻塞,从而减轻了客户端压力。 Watcher实现由三个部分组成: u2002u2002客户端首先将Watcher注册到服务端,同时将Watcher对象保存到客户端的Watch管理器中。当ZooKeeper服务端监听的数据状态发生变化时,服务端会主动通知客户端,接着客户端的Watch管理器会触发相关Watcher来回调相应处理逻辑,从而完成整体的数据发布/订阅流程。 u2002u2002Watcher是一个接口, 任何实现了Watcher接口的类就是一个新的Watcher 。Watcher内部包含了两个枚举类:KeeperState、EventType。 u2002u2002KeeperState是客户端与服务端连接状态发生变化时对应的通知类型。路径为org.apache.zookeeper.Watcher.Event.KeeperState,是一个枚举类,其枚举属性如下; u2002u2002EventType是数据节点(znode)发生变化时对应的通知类型。 EventType变化时KeeperState永远处于SyncConnected通知状态下;当KeeperState发生变化时,EventType永远为None 。其路径为org.apache.zookeeper.Watcher.Event.EventType,是一个枚举类,枚举属性如下; 注 :客户端接收到的相关事件通知中只包含状态及类型等信息,不包括节点变化前后的具体内容,变化前的数据需业务自身存储,变化后的数据需调用get等方法重新获取;

canon zoom lens ef-s 18-135mm 1:3.5-5.6 is stm是什么意思?

Canon:品牌 佳能zoom:表示为变焦镜头lens:镜头的意思EF-S:表示APS-C画幅机器专用镜头18-135mm:镜头焦距可以在18mm到135mm之间调整变化1:3.5-5.6:光圈广角端最大为3.5,长焦端最大为5.6IS:佳能防抖技术的名称,表示这支镜头支持光学防抖STM:步进马达(电机),即采用步进式对焦电机

什么是mongodb,zookeeper,redis,solr

MongoDB[1] 是一个基于分布式文件存储的数据库。由C++语言编写。旨在为WEB应用提供可扩展的高性能数据存储解决方案。ZooKeeper是一个分布式的,开放源码的分布式应用程序协调服务,是Google的Chubby一个开源的实现,是Hadoop和Hbase的重要组件。它是一个为分布式应用提供一致性服务的软件,提供的功能包括:配置维护、域名服务、分布式同步、组服务等。Redis是一个开源的使用ANSI C语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API。从2010年3月15日起,Redis的开发工作由VMware主持。从2013年5月开始,Redis的开发由Pivotal赞助。Solr是一个独立的企业级搜索应用服务器,它对外提供类似于Web-service的API接口。用户可以通过http请求,向搜索引擎服务器提交一定格式的XML文件,生成索引;也可以通过Http Get操作提出查找请求,并得到XML格式的返回结果。

前后掌分离ZOOM,全掌Lunar,前掌Lunar 后掌zoom,代表什么意思??不明白,求解。。

zoom在鞋里面的意思就是气垫,而Lunar指的是缓震橡胶。前后掌分离zoom就是前后掌的气垫是分开的,不是连着的;全掌Lunar 就是鞋整个底用的是缓震橡胶;前掌lunar后掌zoom 指的是该鞋用的技术是前掌采用缓震橡胶技术,而后掌采用的是气垫;希望对你有所帮助

英语作文:At the zoo(50词)?

写作思路:1. 宾语:At the zoo;2. 参观过程:看到了许多动物,有大象、狮子、长颈鹿、猴子、斑马等;3. 感受:非常有趣,了解了一些动物的习性和生活环境;4. 结论:建议大家多去动物园参观,增长知识同时也可以消磨一下时间。作文:Yesterday, I went to the zoo with my friends. At the zoo, we saw a lot of animals, such as elephants, lions, giraffes, monkeys, zebras, and so on. It was very interesting to learn about their habits and living environment. I think visiting the zoo is a great way to gain knowledge and have fun at the same time. I suggest everyone should go to the zoo more often.翻译:昨天,我和我的朋友去了动物园。在动物园里,我们看到了许多动物,例如大象、狮子、长颈鹿、猴子、斑马等。了解动物们的习性和生活环境非常有趣。我认为参观动物园是一个获取知识和娱乐结合的好方法。我建议大家应该多去动物园走走。

zoom共享屏幕黑屏怎么解决

原因一、电压问题(可能性较小);原因二、显卡驱动的问题,更新显卡驱动可解决;原因三、显卡有质量问题,拿电脑城修复或换一个新的;原因四、缺少DirectX软件或DirectX版本太低,重新安装最新版的DirectX程序可解决。对于一些较老或组装的电脑,黑屏是比较容易出现的故障。电脑出现黑屏的硬件原因有显示器损坏、显卡损坏、显卡接触不良等,排除掉硬件问题后可从软件方面找原因。

耐克有一双飞线的跑鞋,应该不是气垫,样子和zoom streak比较像,也是logo在脚背上,飞线

耐克zoomxstreak7适合跑800米吗

适合,脚感很好。这是一款适合跑1000米的无敌鞋款,很便宜。是体育考试的首选,也很适合立定跳远,短跑也能驾驭,丝毫不虚。但是尺码超窄,建议正常脚买大一码,不然在跑步的时候容易磨脚。

Nike zoom elite 8 和 streak 6 哪个适合中长跑

这两双鞋对技术都有较高要求,技术低两双都慎选,技术高随便

nike鞋上写zoom指什么?zoom air吗?

对...

zoom 和zoom could meeting有啥区别?

zoom could meetings 是会议软件,搞培训用的。我们都用它。其他含有zoom字样的软件,貌似没有这个功能。

zoom cloud meetings电脑安装后在哪

1、准备8G优盘一个,网上下载macos系统dmg文件5G多,UltraISO程序绿色版2、打开UltraISO读取dmg安装源文件,写入硬盘,选择U盘盘符3、启动U盘制作完成,在windows下无法读取4、mbp插U盘,启动按Option按键,出现启动U盘5、选择U盘启动,按提示完成安装

shh,丅hereszoom是什么意思

shh,there"s zoom嘘,还有变焦

let’s watch the monkeys in the zoo.

正确答案应该是 1 C let"s后跟动词原形 let"s to sth 让我们做某事 所以BD不对 look不及物动词,后要用at,所以不对,只有C 让我们去动物园看猴子去吧. 2A 这个男孩喜欢狗因为它们很可爱. 表示原因,用because.

zoom怎么翻译?/Zip怎么翻译?

zoom翻译为祖姆,Zip译为瑞普、泽普。一、zoom1、含义:v. 急速上升;嗡嗡作响;(镜头)拉近(拉远)。n. 急速上升;嗡嗡声;(摄影)变焦。2、用法作动词含有(使)发嗡嗡声,作嗡嗡声,【空】(使)陡直上升,(使)直线上升,(使)急剧上升,跃升,【电视】用可变焦距镜头迅速将摄像机对准(目标),迅速接近被摄对象,将(画面)推近,嗡嗡地活动,发出嗡嗡声而移动,(使)迅速上升,激增,急升,猛增大受欢迎,大成功,价格直线上涨等意思。作名词含有嗡嗡声,隆隆声,激增,直线上升,急跃升,急剧上升,陡直上升,迅速上升,【摄】可变焦距镜头,图形变化,图像电子放大,推拉摄影,变焦摄影,活力,热情,疾驰的声音等意思。We heard a jet plane zooming overhead.我们听见喷射机在头上嗡嗡作响。二、Zip1、含义:n. 拉链。n. 活力;飞射声。v. 拉拉链。v. 飕飕飞过;注入活力。2、用法作名词含有尖啸声,撕裂声,活力,精力,精神,<英>拉链,拉锁,零,零分,嘘,咻,【计】压缩,<口>无,乌有,没有,毫无,能量,速度等意思。作动词含有以尖啸声行进,有力而迅速地行动,拉开拉链,用拉链拉开; 用拉链锁上,使增加热情,使增加活力,嘘地响,嘘地飞,突进,直冲,将...嘘的一下送出去,逮捕,给...以速度,精力充沛地干,使(对手)得零分,快速到达某地等意思。She caught her hair in the zip of the dress.她的头发被裙子的拉链钩住了。扩展资料:Zip近义词:energy、vigor、vitality、vigour、nil。一、energy1、含义:n. 精力;活力;能源。2、举例Young people usually have more energy than the old.青年人通常比老年人精力充沛。二、vigor1、含义:n. 活力;精力。2、举例They are here to drink in vigor from the youth.他们来这里是想从年轻人身上得到活力。三、vitality1、含义:n. 活力;生命力。2、举例She is full of youth and vitality.她充满了青春和活力。四、vigour1、含义:n. 精力=vigor(美).。2、举例He was noted for his vigour.他以精力充沛而出名。五、nil1、含义:n. 无;零。2、举例Our immediate capacity for an offensive was nil.我们尚无立刻进攻的时机。

佳能primazoom70f为什么按快门没反应?

3,快门问题:可能是相机快门出现故障或损坏。这种 情况下需要将相机送到专业的维修站修理或更换配件。 4,其他问题:可能还会有其他问题导致相机无法正常 工作,例如相机失去了功能、拍摄功能因为误操作而关 闭、指示灯关闭等。这种情况下需要根据具体情况进行 诊断和处理。 总之,如果按下快门没有反应,建议检查电池和胶卷是 否正常安装,如果没有发现问题,可能是相机快门故 障,需要寻求专业维修帮助。

zoom是什么意思?英文名字。

翻译成;族欧姆 如何? 供参考。。

zoom音译歌词jessi

zoom音译歌词jessi如下:lightscameraactioniseeyoulookinatmypiciknowud06cuac8cub561uaca8ub561uaca8uc880ub354ub561uaca8ubd10ubd10uae30ub625ucc28uc9c0zoominzoomoutokzoominzoomoutokzoominzoomoutokbabyud655uac00uac8cud655ub300ud655uc2e4ud558uac8cowwi"mfeelinlikeamillionbucksyeahmustbethemillionbucksyeahuc624ub298ub530ub77cube5buc774ub098selfieucc30uce75ud558uba74ube5buc774ub098alwaystalkinuc27fknowyoulikethatucac4uc9c0ub9c8uc559ubb3cuc9c0ub294uc54auc744uac8cyeait"slikethatheyheyprettylilthangdoyathangi"llberightbackwoouc6b0ub9b0ubaa8ub450uc0acuc9c4ucc0duae30uc704ud574uc0b4uc544ub098ub3c4uadf8ub798ub124ub9d8uc54cuc544aightwoouc6b0ub9b0ubaa8ub450uad00uc2ecubc1buae30uc704ud574uc0b4uc544ub098ub3c4uadf8ub798ub124ub9d8uc54cuc544aightlightscameraactionbabyiseeyoulookinatmypiciknowud06cuac8cub561uaca8ub561uaca8uc880ub354ub561uaca8ubd10ubd10uae30ub625ucc28uc9c0zoominzoomoutokzoominzoomoutokzoominzoomoutokbabyud655uac00uac8cud655ub300ud655uc2e4ud558uac8cowwdoyoulikeallmyclothesandmybagsuc637uc744uc785uace0uac00ubc29uba68uc744ubfd0uc778ub370whyyoulikeitwheni"msadori"mmadidon"tgiveuhcuzi"mabadube5buc774ube5buc774ub098ub294wishlistud56duc0c1uc77cpickubb3cuc5b4ubcf4uc9c0uc880ub9c8uc5b8ub2c8ubb50uc57cub9bduc2a4ud2f1it"sfunnyhowyoualwaystalkingmoneybutalwaysplayinadummyyousabummybegginyomummyformoneyohhelookingoodinthatlouislouisohsheacutiewithab***yb***yscreenshotuc800uc7a5ud574ub194ub458ub798godd**nuc2e4ud654ub0d0ud5c8ub9acub458ub808ub410uc5b4ub2e4uc74cub2e4uc74cub09cubb34ub364ub364eatitupuba39ubc29watchyouchowdownuc14bub458ud558ub098cheesetakeacouplepicsandacoupleofflickswoouc6b0ub9b0ubaa8ub450uc0acuc9c4ucc0duae30uc704ud574uc0b4uc544ub098ub3c4uadf8ub798ub124ub9d8uc54cuc544aightwoouc6b0ub9b0ubaa8ub450uad00uc2ecubc1buae30uc704ud574uc0b4uc544ub098ub3c4uadf8ub798ub124ub9d8uc54cuc544aightlightscameraactionbabyiseeyoulookinatmypiciknowud06cuac8cub561uaca8ub561uaca8uc880ub354ub561uaca8ubd10ubd10uae30ub625ucc28uc9c0zoominzoomoutokzoominzoomoutokzoominzoomoutokbabyud655uac00uac8cud655ub300ud655uc2e4ud558uac8cowwwaitomgi"msuchacatfish

NIKE AIR ZOOM PEGASUS 31的气垫在哪

NIKE AIR ZOOM PEGASUS 31的气垫是在中底里面。这款是内置气垫的。外面是看不到的呢。

nike air zoom pegasus怎么读

nike air zoom pegasus使用中文字来音译就是耐克 哎呀 松 皮格斯这样发音差不多接近了。

Nike Air Zoom Pegasus 36 Shield 黑紫 冬天穿会冷吗?

不会的,这鞋子也暖的呢,不会那么凉爽了,不必担心。还是可以直接冬天穿了,这鞋子好看的

今天在网上看到一双耐克air zoom pegasus37的鞋子,我是扁平足,不知道能不能穿?

淘宝上“尾单”就是假货的代名词

Nike Air Zoom Pegasus 36 Shield 黑紫有没有气垫?

当然有气垫的,要知道这个鞋子名称带air zoom就是表示有气垫。并且这种气垫更加舒服,更加不错呀。所以鞋底的缓震减震还是非常舒服的。

耐克zoom pegasus trail2跑一千米可以嘛

耐克zoom pegasus trail2是适合跑一千米的。耐克zoom是一种超薄、超轻的气垫技术,全称zoom air,似于弹性材料的意思。耐克将这种技术制造的气垫广泛运用在各种篮球鞋,跑步鞋及训练鞋上,与MAX AIR,AIR-SOLE相比,这种气垫显得更软,同时也提供了更好的弹性。耐克首创的气垫技术给体育界带来了一场革命。运用这项技术制造出的运动鞋可以很好地保护运动员的膝盖,在其在作剧烈运动落地时减小对膝盖的影响。

请大神帮忙鉴定NIKE AIR ZOOM PEGASUS 33真伪

airzoomspeed2是飞马吗?

airzoomspeed2是飞马。airzoomspeed2是Pegasus37飞马系列。airzoomspeed2是Pegasus37飞马系列的一种超薄,超轻的气垫技术,用这种技术制造的气垫被广泛运用在该公司设计的各种篮球鞋,跑步鞋及训练鞋上。所以airzoomspeed2是飞马。

耐克 AIR ZOOM Pegasus 32鞋标是ve是真的还是xe是真的

鞋标 上图

买了双耐克Nike Air Zoom Pegasus 34求真假

假的 假的太明显了

为什么耐克zoom+pegasus配色不同价格不同?

同款式不同配色,价格不同一般就是炒起来的。因为正常来说材质一样的那么发售价格都相同才对的,现在出现不对应该只能说有人炒鞋子导致了,一般那种好看颜色的鞋子价格会贵一些,毕竟多人喜欢,而冷门配色就没有那么多人喜欢,自然价格就不会涨了。当然,如果鞋子同款式但是材质使用的不同,那么也可以说明价格不同哦。重点需要区分是不是材质不同,或者是否有合作款。

耐克Air Zoom Pegasus 38女款是全掌气垫吗?

Nike Air Zoom Pegasus38鞋面采用透气网眼布,舒适耐用,宽大的前掌设计让脚趾更加舒适,配备全掌React泡棉以及前掌ZoomAir科技,为长跑、短跑和日常跑步都提供持久的舒适感。

Nike Air Zoom Pegasus 37和Nike Zoom Pegasus turbo 2有什么区别?

我不同意楼上的观点,turbo2是环保材料十分不耐穿,本来我是想买超级飞马的但是由于上面的原因我才放弃的。相反的37十分耐磨,而且相对前面的几代有很大的提升,下面就是我鞋的图片

如何评价Nike Air Zoom Pegasus 38?

NIKE AIR PEGASUS 83男子运动鞋为现代跑者匠心打造。经典的复古轮廓和轻量化的鞋身设计造就出一双舒适感与保护性完美并存的疾驰之靴,轻盈质感为你激活更快飞驰。每一代都是在进步。定位是一双日常综合训练慢跑鞋,适应的配速范围也比较广,总的来说这双37终于一改前几代的全掌zoom了。NIKE官方对Pegasus的定义就是为跑者服务,turbo2鞋面整体运用了大面积类似蝉翼材料,目的是减重和增加透气性,中底还是zoom x。NIKE公司总部位于美国俄勒冈州波特兰市。公司生产的体育用品包罗万象,例如服装、鞋类、运动器材等。NIKE是全球著名的体育运动品牌,英文原意指希腊胜利女神,中文译为耐克。耐克商标图案是个小钩子。耐克一直将激励全世界的每一位运动员并为其献上最好的产品视为光荣的任务。耐克首创的气垫技术给体育界带来了一场革命。运用这项技术制造出的运动鞋可以很好地保护运动员的膝盖,在其在作剧烈运动落地时减小对膝盖的影响。

Nike zoom pegasus36女鞋男生可以穿吗?

nike zoom pegasus好还是zoom nike zoom pegasus好。这款鞋型好看,并且减震更不错的。穿去跑步都没问题呢 选择nike zoom pegasus,这款不错的!!

脚宽穿Nike Air Zoom Pegasus 38 这个跑步鞋可以吗?

Nike Air Zoom Pegasus38 透气网眼鞋面搭配加宽鞋头设计,打造理想的舒适度和耐穿性。Nike React泡绵轻盈耐穿富有弹性。泡绵增多缓震性能也随之增强,大大有效减少滞重感。Zoom Air缓震配置缔造弹力升级的迈步体验。缓震配置贴近双足,塑就出众回弹效果。中足织带设计,在收紧鞋带时营造舒适贴合感。

Nike Air Zoom Pegasus飞马跑步鞋哪个款比较不错?

我比较喜欢Nike Air Zoom Pegasus39飞马跑步鞋女款白浅粉轻盈透气的鞋面融入工程网眼,增加强韧度和灵活性,适合四季穿着。中足板带结合Flywire技术,提供出色支撑力,帮助稳固双足。中底采用React泡绵轻盈耐穿,铸就出众回弹的顺畅迈步体验,不妨百度一下。

耐克的Zoom Pegasus Turbo 35代和阿迪的UB4.0四代谁更好?

Nike Zoom Pegasus Turbo跑鞋的主要 科技 有:ZoomX中底,鞋面由半透明鞋面组织成,橡胶外底凸起设计,增强缓震,并提供很强的抓地力!经常参加比赛的跑者对轻量跑鞋都非常熟悉,不管是马拉松跑鞋还是日常训练时鞋子,都采用了超薄中底设计,Nike的这双超级飞马的中底并不是特别薄,但非常的轻。 Zoom泡棉也是耐克最轻质的泡棉材料,女款鞋子重量更为轻!除了足够轻之外,Nike缓震同样很突出,Nike 能提供更好的能量反馈,弹性更为突出。非常适合于比赛时使用,Zoom Pegasus Turbo则更适合日常训练时使用。 UB4.0的鞋面类似编织技术,纹理更加好。加入了透气孔。透气性非常好,耐磨性非常强!从功能性上来说,鞋子有很好的包裹性,鞋内织物让鞋子穿在脚上,脚感非常的有保障。另外从UB4.0整体的一些设计理念来看,非常不错! 一个爱鞋如命的我 一个会定时给你带来专业鞋类咨询的我 Zoom Pegasus Turbo 35代和UB 4.0谁更优秀? 其实两双鞋子各有所长,功能性不同,所以很难说到底谁强谁弱。 先来说说Zoom Pegasus Turbo 35代, 众多 科技 的运用,包括了最新的React以及ZoomX的缓震结合,回弹和支撑性都很不错。 尤其是对于喜欢跑步的朋友来说,是一双不错的实战款。 再来说说UB 4.0 . UB 4.0依旧延续了Boost 科技 以往的脚感。 所以UB4.0的脚感会比Zoom Pegasus Turbo 35 好上不少,但是Boost的支撑性一般,跑步的话,容易崴脚,并且跑到后期有点泄力,膝盖负担较重,容易酸痛。 所以,如果是平时上班穿的话,UB 4.0更加舒适,但是如果是跑步的话,那么Zoom Pegasus Turbo 35代则更加适合。 各有千秋吧。 跑步的话,肯定是飞马35,36是官方指定训练用鞋,升级版。 跑一两公里,UB可以的,底软短距离的可以的。 跑步飞马,散步ub,妥妥的 我有ultra boost 3.0,pegasus 35,pegasus turbo,这三双相比:pegasus turbo 软弹兼有,不考虑价格的话,无疑是最佳选择,pegasus 35反馈好,如果还能找到库存,价格应该在400以内,性价比最高,boost 一开始穿,脚感非常软,讨人喜欢,但反馈最差,而且耐久度不好,穿过一段时间就踩塌了。所以结论,不差钱买pegasus turbo(近期官网有活动,彩虹限定色折后783,非常超值),讲究性价比买pegasus 35 有没有人买,尺码太小,建议260穿 飞马35脚感肯定比UB4.0好,但是只适合跑步运动穿,平时压马路不是很好配裤子,UB的话压马路会好看不少 飞马耐久太差 35差ub几条街呢

NikeAirZoomRivalFly3会泄力吗

不会。NikeAirZoomRivalFly3属于速读训练跑鞋今年会推出新款速度训练跑鞋,可以与顶级的竞速跑鞋AlphaflyNext相媲美。前掌两个AirZoom气垫,中前足的ZoomX缓震泡棉,后掌React缓震泡棉,内置复合纤维板,脚感也是很激进的的,又软又弹,但是跑步的声音特别响而且脚后跟容易磨脚,建议穿长一点的袜子。

Nike Air Zoom Rival Fly 3有哪些优势?

目前来说是我拿上手最惊讶的跑鞋很早就入手了 Zoom Rival Fly3,这鞋子各方面我都非常满意。鞋面薄如蝉翼之余支撑性还相当不错,熟悉的Zoom X泡绵中底就不用多说了脚感实在是一如既往的舒服,它的定位是5公里-10公里内的竞速比赛属于中短距离的竞速类跑鞋。

Zoom Rival D 10适合中长跑吗?

也适合的,这个款式的鞋底减震也是不错的,抓力也相当可以,所以你可以考虑一下咯,主要就是中长跑的鞋子确实很多选择呢。如果你穿着感觉不适合,到时可以考虑换其他的鞋子嘛,又不是只能穿一双而已。

Zoom Rival D 10适合中长跑吗?

您好,这双鞋在官方定义上就是一双长跑鞋,它的设计就是追求着轻量,包裹性好,钉少,抓地力优秀等 从鞋底看,五颗钉子的设计可以减轻很多重量,鞋身大孔的网布,皮革还有热压,从中都能看出这是长跑鞋 这双鞋我经常穿,跑短跑就那个样子,八百米朝上一直到五公里都试过,很不错 但这只是nike的中低端跑鞋,但同样适合长跑

nike zoom rival s9有气垫吗

Nike Zoom Rival S 9是一款钉鞋,没有气垫。Nike Zoom Rival S 9 男/女跑步鞋带来舒适贴合、顺畅迈步和轻盈体验。专为参加 60 米至 400 米短跑比赛,包括跨栏和跳远比赛的运动员设计。NIKE耐克是由比尔·鲍尔曼和菲尔·奈特于1972年成立的运动品品牌。其总部位于美国俄勒冈州波特兰市。其产品包括服装,鞋履,运动器材等。NIKE是全球著名的体育运动品牌,英文原意指希腊胜利女神,中文译为耐克。

nikezoomrivald10是短跑鞋还是长跑鞋

nike zoom rival d 10是属于长跑鞋,不适用于短跑。短跑鞋和长跑鞋不仅从外观上来讲不一样,功能也各不相同。短跑鞋,一般底部有鞋钉,对地面有更高地抓取力。中长跑鞋一般底部很正常,穿起来也很舒适。短跑鞋普遍都比较轻,这对于爆发来说是个强力辅助。中长跑鞋有的是轻的,有的却有点重,但相对于短跑鞋来讲,穿起来很舒服。短跑鞋鞋型更紧一些,尤其是足弓的位置,鞋钉长度也比长跑鞋要长。中长跑鞋还提供短跑鞋不具备的缓震的功能。

为什么dubbo使用ZkClient作为zookeeper的客户端

1 ) ZooKeeper的Watcher是一次性的,用过了需要再注册;2 ) session的超时后没有自动重连,生产环境中如果网络出现不稳定情况,那么这种情况出现的更加明显;3) 没有领导选举机制,集群情况下可能需要实现stand by,一个服务挂了,另一个需要接替的效果;4) 客户端只提供了存储byte数组的接口,而项目中一般都会使用对象。5 )客户端接口需要处理的异常太多,并且通常,我们也不知道如何处理这些异常。

zoo的《Soulmate》 歌词

歌曲名:Soulmate歌手:zoo专辑:ZoologySoulmateJosh TurnerSoulmateUntil the end of timeYou"re my soulmateI"ll love you till I get to Heaven"s gateAnd if I go first sweetheartI"ll wait"Cause I know I"ll never find anotherSoulmateYour loveThere"s no telling where I"d beWithout your loveStumbling in the darkWould be pretty roughWhen I get down you"re the oneThat lifts me upI thank the Lord aboveFor your loveIn this day and timeThe right one is hard to findGirl, that"s why I"m holding on to youEach and every nightWhen we turn out the lightThere"s no mistaking what we have is trueSoulmateI hope that we grow old togetherSoulmateIn the good and badEven through the heartacheWe"ve got a special bondThat"ll never break"Cause darling you and I areSoulmatesIn this day and timeThe right one is hard to findGirl, that"s why I"m holding on to youEach and every nightWhen we turn out the lightThere"s no mistaking what we have is trueSoulmateUntil the end of timeYou"re my soulmateI"ll love you till i get toHeaven"s gateWe"ve got a special bondThat"ll never break"Cause darling you and I areSoulmatesYeah, I know I"ll never find anotherSoulmatehttp://music.baidu.com/song/8530763

zookeeper的snapshot可以删除吗

2006年的时候Google出了Chubby来解决分布一致性的问题(distributed consensus problem),所有集群中的服务器通过Chubby最终选出一个Master Server ,最后这个Master Server来协调工作。简单来说其原理就是:在一个分布式系统中,有一组服务器在运行同样的程序,它们需要确定一个Value,以那个服务器提供的信息为主/为准,当这个服务器经过n/2+1的方式被选出来后,所有的机器上的Process都会被通知到这个服务器就是主服务器 Master服务器,大家以他提供的信息为准。很想知道Google Chubby中的奥妙,可惜人家Google不开源,自家用。但是在2009年3年以后沉默已久的Yahoo在Apache上推出了类似的产品ZooKeeper,并且在Google原有Chubby的设计思想上做了一些改进,因为ZooKeeper并不是完全遵循Paxos协议,而是基于自身设计并优化的一个2 phase commit的协议,如图所示:ZooKeeper跟Chubby一样用来存放一些相互协作的信息(Coordination),这些信息比较小一般不会超过1M,在zookeeper中是以一种hierarchical tree的形式来存放,这些具体的Key/Value信息就store在tree node中。当有事件导致node数据,例如:变更,增加,删除时,Zookeeper就会调用 triggerWatch方法,判断当前的path来是否有对应的监听者(watcher),如果有watcher,会触发其process方法,执行process方法中的业务逻辑

JAVA 为什么不同注册中心(zookeeper,Eurake) 注册的服务不能互相调用

底层实现服务注册与发现的原理都不一样。。。你要改狠多东西才可以互相调用的。。

为什么不使用ZooKeeper

ZooKeeper作为发现服务的问题ZooKeeper(注:ZooKeeper是著名Hadoop的一个子项目,旨在解决大规模分 布式应用场景下,服务协调同步(Coordinate Service)的问题;它可以为同在一个分布式系统中的其他服务提供:统一命名服务、配置管理、分布式锁服务、集群管理等功能)是个伟大的开源项目,它很成熟,有相当大的社区来支持它的发展,而且在生产环境得到了广泛的使用;但是用它来做Service发现服务解决方案则是个错误。在分布式系统领域有个著名的 CAP定理(C- 数据一致性;A-服务可用性;P-服务对网络分区故障的容错性,这三个特性在任何分布式系统中不能同时满足,最多同时满足两个);ZooKeeper是个CP的,即任何时刻对ZooKeeper的访问请求能得到一致的数据结果,同时系统对网络分割具备容错性;但是它不能保证每次服务请求的可用性(注:也就是在极端环境下,ZooKeeper可能会丢弃一些请求,消费者程序需要重新请求才能获得结果)。但是别忘了,ZooKeeper是分布式协调服务,它的职责是保证数据(注:配置数据,状态数据)在其管辖下的所有服务之间保持同步、一致;所以就不难理解为什么ZooKeeper被设计成CP而不是AP特性的了,如果是AP的,那么将会带来恐怖的后果(注:ZooKeeper就像交叉路口的信号灯一样,你能想象在交通要道突然信号灯失灵的情况吗?)。而且,作为ZooKeeper的核心实现算法 Zab,就是解决了分布式系统下数据如何在多个服务之间保持同步问题的。作为一个分布式协同服务,ZooKeeper非常好,但是对于Service发现服务来说就不合适了;因为对于Service发现服务来说就算是 返回了包含不实的信息的结果也比什么都不返回要好;再者,对于Service发现服务而言,宁可返回某服务5分钟之前在哪几个服务器上可用的信息,也不能因为暂时的网络故障而找不到可用的服务器,而不返回任何结果。所以说,用ZooKeeper来做Service发现服务是肯定错误的,如果你这么用就惨了!而且更何况,如果被用作Service发现服务,ZooKeeper本身并没有正确的处理网络分割的问题;而在云端,网络分割问题跟其他类型的故障一样的确会发生;所以最好提前对这个问题做好100%的准备。就像 Jepsen在 ZooKeeper网站上发布的博客中所说:在ZooKeeper中,如果在同一个网络分区(partition)的节点数(nodes)数达不到 ZooKeeper选取Leader节点的“法定人数”时,它们就会从ZooKeeper中断开,当然同时也就不能提供Service发现服务了。如果给ZooKeeper加上客户端缓存(注:给ZooKeeper节点配上本地缓存)或者其他类似技术的话可以缓解ZooKeeper因为网络故障造成节点同步信息错误的问题。 Pinterest与 Airbnb公 司就使用了这个方法来防止ZooKeeper故障发生。这种方式可以从表面上解决这个问题,具体地说,当部分或者所有节点跟ZooKeeper断开的情况下,每个节点还可以从本地缓存中获取到数据;但是,即便如此,ZooKeeper下所有节点不可能保证任何时候都能缓存所有的服务注册信息。如果 ZooKeeper下所有节点都断开了,或者集群中出现了网络分割的故障(注:由于交换机故障导致交换机底下的子网间不能互访);那么ZooKeeper会将它们都从自己管理范围中剔除出去,外界就不能访问到这些节点了,即便这些节点本身是“健康”的,可以正常提供服务的;所以导致到达这些节点的服务请求被丢失了。(注:这也是为什么ZooKeeper不满足CAP中A的原因)更深层次的原因是,ZooKeeper是按照CP原则构建的,也就是说它能保证每个节点的数据保持一致,而为ZooKeeper加上缓存的做法的 目的是为了让ZooKeeper变得更加可靠(available);但是,ZooKeeper设计的本意是保持节点的数据一致,也就是CP。所以,这样一来,你可能既得不到一个数据一致的(CP)也得不到一个高可用的(AP)的Service发现服务了;因为,这相当于你在一个已有的CP系统上强制栓了一个AP的系统,这在本质上就行不通的!一个Service发现服务应该从一开始就被设计成高可用的才行!如果抛开CAP原理不管,正确的设置与维护ZooKeeper服务就非常的困难;错误会 经常发生, 导致很多工程被建立只是为了减轻维护ZooKeeper的难度。这些错误不仅存在与客户端而且还存在于ZooKeeper服务器本身。Knewton平台很多故障就是由于ZooKeeper使用不当而导致的。那些看似简单的操作,如:正确的重建观察者(reestablishing watcher)、客户端Session与异常的处理与在ZK窗口中管理内存都是非常容易导致ZooKeeper出错的。同时,我们确实也遇到过 ZooKeeper的一些经典bug: ZooKeeper-1159 与 ZooKeeper-1576; 我们甚至在生产环境中遇到过ZooKeeper选举Leader节点失败的情况。这些问题之所以会出现,在于ZooKeeper需要管理与保障所管辖服务群的Session与网络连接资源(注:这些资源的管理在分布式系统环境下是极其困难的);但是它不负责管理服务的发现,所以使用ZooKeeper当Service发现服务得不偿失。做出正确的选择:Eureka的成功我们把Service发现服务从ZooKeeper切换到了Eureka平台,它是一个开 源的服务发现解决方案,由Netflix公司开发。(注:Eureka由两个组件组成:Eureka服务器和Eureka客户端。Eureka服务器用作服务注册服务器。Eureka客户端是一个java客户端,用来简化与服务器的交互、作为轮询负载均衡器,并提供服务的故障切换支持。)Eureka一开始就被设计成高可用与可伸缩的Service发现服务,这两个特点也是Netflix公司开发所有平台的两个特色。( 他们都在讨论Eureka)。自从切换工作开始到现在,我们实现了在生产环境中所有依赖于Eureka的产品没有下线维护的记录。我们也被告知过,在云平台做服务迁移注定要遇到失败;但是我们从这个例子中得到的经验是,一个优秀的Service发现服务在其中发挥了至关重要的作用!首先,在Eureka平台中,如果某台服务器宕机,Eureka不会有类似于ZooKeeper的选举leader的过程;客户端请求会自动切换 到新的Eureka节点;当宕机的服务器重新恢复后,Eureka会再次将其纳入到服务器集群管理之中;而对于它来说,所有要做的无非是同步一些新的服务注册信息而已。所以,再也不用担心有“掉队”的服务器恢复以后,会从Eureka服务器集群中剔除出去的风险了。Eureka甚至被设计用来应付范围更广的网络分割故障,并实现“0”宕机维护需求。当网络分割故障发生时,每个Eureka节点,会持续的对外提供服务(注:ZooKeeper不会):接收新的服务注册同时将它们提供给下游的服务发现请求。这样一来,就可以实现在同一个子网中(same side of partition),新发布的服务仍然可以被发现与访问。但是,Eureka做到的不止这些。正常配置下,Eureka内置了心跳服务,用于淘汰一些“濒死”的服务器;如果在Eureka中注册的服务, 它的“心跳”变得迟缓时,Eureka会将其整个剔除出管理范围(这点有点像ZooKeeper的做法)。这是个很好的功能,但是当网络分割故障发生时,这也是非常危险的;因为,那些因为网络问题(注:心跳慢被剔除了)而被剔除出去的服务器本身是很”健康“的,只是因为网络分割故障把Eureka集群分割成了独立的子网而不能互访而已。幸运的是,Netflix考虑到了这个缺陷。如果Eureka服务节点在短时间里丢失了大量的心跳连接(注:可能发生了网络故障),那么这个 Eureka节点会进入”自我保护模式“,同时保留那些“心跳死亡“的服务注册信息不过期。此时,这个Eureka节点对于新的服务还能提供注册服务,对于”死亡“的仍然保留,以防还有客户端向其发起请求。当网络故障恢复后,这个Eureka节点会退出”自我保护模式“。所以Eureka的哲学是,同时保留”好数据“与”坏数据“总比丢掉任何”好数据“要更好,所以这种模式在实践中非常有效。最后,Eureka还有客户端缓存功能(注:Eureka分为客户端程序与服务器端程序两个部分,客户端程序负责向外提供注册与发现服务接口)。 所以即便Eureka集群中所有节点都失效,或者发生网络分割故障导致客户端不能访问任何一台Eureka服务器;Eureka服务的消费者仍然可以通过Eureka客户端缓存来获取现有的服务注册信息。甚至最极端的环境下,所有正常的Eureka节点都不对请求产生相应,也没有更好的服务器解决方案来解决这种问题时;得益于Eureka的客户端缓存技术,消费者服务仍然可以通过Eureka客户端查询与获取注册服务信息,这点很重要。Eureka的构架保证了它能够成为Service发现服务。它相对与ZooKeeper来说剔除了Leader节点的选取或者事务日志机制,这 样做有利于减少使用者维护的难度也保证了Eureka的在运行时的健壮性。而且Eureka就是为发现服务所设计的,它有独立的客户端程序库,同时提供心跳服务、服务健康监测、自动发布服务与自动刷新缓存的功能。但是,如果使用ZooKeeper你必须自己来实现这些功能。Eureka的所有库都是开源的,所有人都能看到与使用这些源代码,这比那些只有一两个人能看或者维护的客户端库要好。维护Eureka服务器也非常的简单,比如,切换一个节点只需要在现有EIP下移除一个现有的节点然后添加一个新的就行。Eureka提供了一个 web-based的图形化的运维界面,在这个界面中可以查看Eureka所管理的注册服务的运行状态信息:是否健康,运行日志等。Eureka甚至提供了Restful-API接口,方便第三方程序集成Eureka的功能。

为什么不使用ZooKeeper

为什么不使用?我们公司项目就使用zookeeper,包括阿里的现在很多项目也使用zookeeper做分布式应用程序数据的一致性处理方案。

zookeeper 用到哪些设计模式

  ZooKeeper作为发现服务的问题  ZooKeeper(注:ZooKeeper是著名Hadoop的一个子项目,旨在解决大规模分 布式应用场景下,服务协调同步(Coordinate Service)的问题;它可以为同在一个分布式系统中的其他服务提供:统一命名服务、配置管理、分布式锁服务、集群管理等功能)是个伟大的开源项目,它 很成熟,有相当大的社区来支持它的发展,而且在生产环境得到了广泛的使用;但是用它来做Service发现服务解决方案则是个错误。  在分布式系统领域有个著名的 CAP定理(C- 数据一致性;A-服务可用性;P-服务对网络分区故障的容错性,这三个特性在任何分布式系统中不能同时满足,最多同时满足两个);ZooKeeper是个CP的,即任何时刻对ZooKeeper的访问请求能得到一致的数据结果,同时系统对网络分割具备容错性;但是它不能保证每次服务请求的可用性(注:也就是在极端环境下,ZooKeeper可能会丢弃一些请求,消费者程序需要重新请求才能获得结果)。但是别忘了,ZooKeeper是分布式协调服务,它的职责是保证数据(注:配置数据,状态数据)在其管辖下的所有服务之间保持同步、一致;所以就不难理解为什么ZooKeeper被设计成CP而不是AP特性的了,如果是AP的,那么将会带来恐怖的后果(注:ZooKeeper就像交叉路口的信号灯一样,你能想象在交通要道突然信号灯失灵的情况吗?)。而且, 作为ZooKeeper的核心实现算法 Zab,就是解决了分布式系统下数据如何在多个服务之间保持同步问题的。  作为一个分布式协同服务,ZooKeeper非常好,但是对于Service发现服务来说就不合适了;因为对于Service发现服务来说就算是 返回了包含不实的信息的结果也比什么都不返回要好;再者,对于Service发现服务而言,宁可返回某服务5分钟之前在哪几个服务器上可用的信息,也不能 因为暂时的网络故障而找不到可用的服务器,而不返回任何结果。所以说,用ZooKeeper来做Service发现服务是肯定错误的,如果你这么用就惨 了!  而且更何况,如果被用作Service发现服务,ZooKeeper本身并没有正确的处理网络分割的问题;而在云端,网络分割问题跟其他类型的故障一样的确会发生;所以最好提前对这个问题做好100%的准备。就像 Jepsen在 ZooKeeper网站上发布的博客中所说:在ZooKeeper中,如果在同一个网络分区(partition)的节点数(nodes)数达不到 ZooKeeper选取Leader节点的逗法定人数地时,它们就会从ZooKeeper中断开,当然同时也就不能提供Service发现服务了。  如果给ZooKeeper加上客户端缓存(注:给ZooKeeper节点配上本地缓存)或者其他类似技术的话可以缓解ZooKeeper因为网络故障造成节点同步信息错误的问题。 Pinterest与 Airbnb公 司就使用了这个方法来防止ZooKeeper故障发生。这种方式可以从表面上解决这个问题,具体地说,当部分或者所有节点跟ZooKeeper断开的情况 下,每个节点还可以从本地缓存中获取到数据;但是,即便如此,ZooKeeper下所有节点不可能保证任何时候都能缓存所有的服务注册信息。如果 ZooKeeper下所有节点都断开了,或者集群中出现了网络分割的故障(注:由于交换机故障导致交换机底下的子网间不能互访);那么ZooKeeper会将它们都从自己管理范围中剔除出去,外界就不能访问到这些节点了,即便这些节点本身是逗健康地的,可以正常提供服务的;所以导致到达这些节点的服务请求 被丢失了。(注:这也是为什么ZooKeeper不满足CAP中A的原因)  更深层次的原因是,ZooKeeper是按照CP原则构建的,也就是说它能保证每个节点的数据保持一致,而为ZooKeeper加上缓存的做法的 目的是为了让ZooKeeper变得更加可靠(available);但是,ZooKeeper设计的本意是保持节点的数据一致,也就是CP。所以,这样一来,你可能既得不到一个数据一致的(CP)也得不到一个高可用的(AP)的Service发现服务了;因为,这相当于你在一个已有的CP系统上强制栓了 一个AP的系统,这在本质上就行不通的!一个Service发现服务应该从一开始就被设计成高可用的才行!  如果抛开CAP原理不管,正确的设置与维护ZooKeeper服务就非常的困难;错误会 经常发生, 导致很多工程被建立只是为了减轻维护ZooKeeper的难度。这些错误不仅存在与客户端而且还存在于ZooKeeper服务器本身。Knewton平台 很多故障就是由于ZooKeeper使用不当而导致的。那些看似简单的操作,如:正确的重建观察者(reestablishing watcher)、客户端Session与异常的处理与在ZK窗口中管理内存都是非常容易导致ZooKeeper出错的。同时,我们确实也遇到过 ZooKeeper的一些经典bug: ZooKeeper-1159 与 ZooKeeper-1576; 我们甚至在生产环境中遇到过ZooKeeper选举Leader节点失败的情况。这些问题之所以会出现,在于ZooKeeper需要管理与保障所管辖服务 群的Session与网络连接资源(注:这些资源的管理在分布式系统环境下是极其困难的);但是它不负责管理服务的发现,所以使用ZooKeeper当 Service发现服务得不偿失。  做出正确的选择:Eureka的成功  我们把Service发现服务从ZooKeeper切换到了Eureka平台,它是一个开 源的服务发现解决方案,由Netflix公司开发。(注:Eureka由两个组件组成:Eureka服务器和Eureka客户端。Eureka服务器用作服务注册服务器。Eureka客户端是一个java客户端,用来简化与服务器的交互、作为轮询负载均衡器,并提供服务的故障切换支持。)Eureka一开 始就被设计成高可用与可伸缩的Service发现服务,这两个特点也是Netflix公司开发所有平台的两个特色。( 他们都在讨论Eureka)。自从切换工作开始到现在,我们实现了在生产环境中所有依赖于Eureka的产品没有下线维护的记录。我们也被告知过,在云平台做服务迁移注定要遇到失败;但是我们从这个例子中得到的经验是,一个优秀的Service发现服务在其中发挥了至关重要的作用!  首先,在Eureka平台中,如果某台服务器宕机,Eureka不会有类似于ZooKeeper的选举leader的过程;客户端请求会自动切换 到新的Eureka节点;当宕机的服务器重新恢复后,Eureka会再次将其纳入到服务器集群管理之中;而对于它来说,所有要做的无非是同步一些新的服务注册信息而已。所以,再也不用担心有逗掉队地的服务器恢复以后,会从Eureka服务器集群中剔除出去的风险了。Eureka甚至被设计用来应付范围更广的网络分割故障,并实现逗0地宕机维护需求。当网络分割故障发生时,每个Eureka节点,会持续的对外提供服务(注:ZooKeeper不会):接收新 的服务注册同时将它们提供给下游的服务发现请求。这样一来,就可以实现在同一个子网中(same side of partition),新发布的服务仍然可以被发现与访问。  但是,Eureka做到的不止这些。正常配置下,Eureka内置了心跳服务,用于淘汰一些逗濒死地的服务器;如果在Eureka中注册的服务, 它的逗心跳地变得迟缓时,Eureka会将其整个剔除出管理范围(这点有点像ZooKeeper的做法)。这是个很好的功能,但是当网络分割故障发生时,这也是非常危险的;因为,那些因为网络问题(注:心跳慢被剔除了)而被剔除出去的服务器本身是很地健康逗的,只是因为网络分割故障把Eureka集群分割 成了独立的子网而不能互访而已。  幸运的是,Netflix考虑到了这个缺陷。如果Eureka服务节点在短时间里丢失了大量的心跳连接(注:可能发生了网络故障),那么这个 Eureka节点会进入地自我保护模式逗,同时保留那些逗心跳死亡逗的服务注册信息不过期。此时,这个Eureka节点对于新的服务还能提供注册服务,对于地死亡逗的仍然保留,以防还有客户端向其发起请求。当网络故障恢复后,这个Eureka节点会退出地自我保护模式逗。所以Eureka的哲学是,同时保 留地好数据逗与地坏数据逗总比丢掉任何地好数据逗要更好,所以这种模式在实践中非常有效。  最后,Eureka还有客户端缓存功能(注:Eureka分为客户端程序与服务器端程序两个部分,客户端程序负责向外提供注册与发现服务接口)。 所以即便Eureka集群中所有节点都失效,或者发生网络分割故障导致客户端不能访问任何一台Eureka服务器;Eureka服务的消费者仍然可以通过Eureka客户端缓存来获取现有的服务注册信息。甚至最极端的环境下,所有正常的Eureka节点都不对请求产生相应,也没有更好的服务器解决方案来解 决这种问题时;得益于Eureka的客户端缓存技术,消费者服务仍然可以通过Eureka客户端查询与获取注册服务信息,这点很重要。  Eureka的构架保证了它能够成为Service发现服务。它相对与ZooKeeper来说剔除了Leader节点的选取或者事务日志机制,这 样做有利于减少使用者维护的难度也保证了Eureka的在运行时的健壮性。而且Eureka就是为发现服务所设计的,它有独立的客户端程序库,同时提供心 跳服务、服务健康监测、自动发布服务与自动刷新缓存的功能。但是,如果使用ZooKeeper你必须自己来实现这些功能。Eureka的所有库都是开源 的,所有人都能看到与使用这些源代码,这比那些只有一两个人能看或者维护的客户端库要好。  维护Eureka服务器也非常的简单,比如,切换一个节点只需要在现有EIP下移除一个现有的节点然后添加一个新的就行。Eureka提供了一个 web-based的图形化的运维界面,在这个界面中可以查看Eureka所管理的注册服务的运行状态信息:是否健康,运行日志等。Eureka甚至提供 了Restful-API接口,方便第三方程序集成Eureka的功能。

为什么要使用ZooKeeper

记得在大约在2006年的时候Google出了Chubby来解决分布一致性的问题(distributed consensus problem),所有集群中的服务器通过Chubby最终选出一个Master Server ,最后这个Master Server来协调工作。简单来说其原理就是:在一个分布式系统中,有一组服务器在运行同样的程序,它们需要确定一个Value,以那个服务器提供的信息为主/为准,当这个服务器经过n/2+1的方式被选出来后,所有的机器上的Process都会被通知到这个服务器就是主服务器 Master服务器,大家以他提供的信息为准。很想知道Google Chubby中的奥妙,可惜人家Google不开源,自家用。 但是在2009年3年以后沉默已久的Yahoo在Apache上推出了类似的产品ZooKeeper,并且在Google原有Chubby的设计思想上做了一些改进,因为ZooKeeper并不是完全遵循Paxos协议,而是基于自身设计并优化的一个2 phase commit的协议,如图所示:ZooKeeper跟Chubby一样用来存放一些相互协作的信息(Coordination),这些信息比较小一般不会超过1M,在zookeeper中是以一种hierarchical tree的形式来存放,这些具体的Key/Value信息就store在tree node中。当有事件导致node数据,例如:变更,增加,删除时,Zookeeper就会调用 triggerWatch方法,判断当前的path来是否有对应的监听者(watcher),如果有watcher,会触发其process方法,执行process方法中的业务逻辑

zookeeper什么意思

zookeeper是动物管理员的意思。ZooKeeper是一个分布式的,开放源码的分布式应用程序协调服务,是Google的Chubby一个开源的实现,是Hadoop和Hbase的重要组件。它是一个为分布式应用提供一致性服务的软件,提供的功能包括:配置维护、域名服务、分布式同步、组服务等。ZooKeeper的目标就是封装好复杂易出错的关键服务,将简单易用的接口和性能高效、功能稳定的系统提供给用户。ZooKeeper包含一个简单的原语集,提供Java和C的接口。ZooKeeper代码版本中,提供了分布式独享锁、选举、队列的接口,代码在$zookeeper_homesrc ecipes。其中分布锁和队列有Java和C两个版本,选举只有Java版本。它的原理:ZooKeeper是以Fast Paxos算法为基础的,Paxos 算法存在活锁的问题,即当有多个proposer交错提交时,有可能互相排斥导致没有一个proposer能提交成功,而Fast Paxos做了一些优化,通过选举产生一个leader (领导者),只有leader才能提交proposer,具体算法可见Fast Paxos。因此,要想弄懂ZooKeeper首先得对Fast Paxos有所了解。ZooKeeper的基本运转流程:1、选举Leader。2、同步数据。3、选举Leader过程中算法有很多,但要达到的选举标准是一致的。4、Leader要具有最高的执行ID,类似root权限。5、集群中大多数的机器得到响应并接受选出的Leader。

etcd是什么东西?它和ZooKeeper有什么区别

etcdetcd作为最近很火的一个高可用性?键值对服务发现系统被Kubernetes等系统广泛使用他相比与zookeeper来说更加简单,在面对较小集群时可能会效率更高些?,而且他的编写语言Go本身就是一种多线程编程语言,确实有很大吸引人的地方(虽然我不懂Go语言,但是在学习docker时也是一睹其风采了)在Raft中,任何时候一个服务器可以扮演下面角色之一:Leader: 处理所有客户端交互,日志复制等,一般一次只有一个Leader.Follower: 类似选民,完全被动Candidate候选人: 类似Proposer律师,可以被选为一个新的领导人。leader选举阶段消息同步阶段Leader要求Followe遵从他的指令,都将这个新的日志内容追加到他们各自日志中:大多数follower服务器将日志写入磁盘文件后,确认追加成功,发出Commited Ok:在下一个心跳heartbeat中,Leader会通知所有Follwer更新commited 项目。对于每个新的日志记录,重复上述过程。zookeeper:zookeeper是基于paxos的简化版zab,我觉得确实很难理解?,以前看了好多遍《从paxos到zookeper》才感觉似懂非懂了,然而过了几个月发现又一脸蒙蔽了,在这里在整理一下(仅表示我自己的理解)ZAB协议中存在着三种状态,每个节点都属于以下三种中的一种:Looking :系统刚启动时或者Leader崩溃后正处于选举状态Following :Follower节点所处的状态,Follower与Leader处于数据同步阶段;Leading :Leader所处状态,当前集群中有一个Leader为主进程;在开始时,所有的节点都是looking状态并且每个节点都希望自己能成为leader节点,所有每个节点都会向集群中发送一个提案内容是选取自己作为leader节点,提案编号是ZXID(ZAB协议中使用ZXID作为事务编号,ZXID为64位数字,低32位为一个递增的计数器,每一个客户端的一个事务请求时Leader产生新的事务后该计数器都会加1,高32位为Leader周期epoch编号,当新选举出一个Leader节点时Leader会取出本地日志中最大事务Proposal的ZXID解析出对应的epoch把该值加1作为新的epoch,将低32位从0开始生成新的ZXID;ZAB使用epoch来区分不同的Leader周期),如果得到的提案的zxid比自己的大则说明发出这个题案的节点数据更新,则进行同意的投票,否则继续投自己,先得到多数的同意的节点当选为leader现在leader就可以进行管理了,zookeeper也是两段提交的实现,客户端提交事务请求时Leader节点为每一个请求生成一个事务Proposal,将其发送给集群中所有的Follower节点,收到过半Follower的反馈后开始对事务进行提交,ZAB协议使用了原子广播协议

阿里P8推荐:《Netty、Redis、Zookeeper高并发实战》看完真不错

移动时代、5G时代、物联网时代的大幕已经开启,它们对于 高性能、高并发 的开发知识和技术的要求,抬升了 Java工程师的学习台阶和面试门槛。 大公司的面试题从某个侧面映射出生产场景中对专项技术的要求。高并发的面试题以前基本是BAT等大公司的专利,现在几乎蔓延至与Java项目相关的整个行业。例如,与 Java NIO、Reactor模式、高性能通信、分布式锁、分布式ID、分布式缓存、高并发架构等 技术相关的面试题,从以前的加分题变成了现在的基础题,这也映射出开发Java项目所必需的技术栈: 分布式Java框架、Redis缓存、分布式搜索ElasticSearch、分布式协调ZooKeeper、消息队列Kafka、高性能通信框架Netty。 《Netty、Redis、Zookeeper高并发实战》为了让大家扎稳高性能基础,浅显易懂地剖析高并发IO的底层原理,细致细腻地解析Reactor高性能模式,图文并茂地介绍Java异步回调模式。掌握这些基础原理,能够帮助大家解决Java后台开发的一些实际问题。 本书共12章,主要介绍高性能通信框架Netty,并详尽介绍Netty的EventLoop、Handler、Pipeline、ByteBuf、Decoder、Encoder等重要组件,然后介绍单体IM的实战设计和模块实现。本书对ZooKeeper、 Curator API、Redis、Jedis API的使用也进行详尽的介绍,让大家具备高并发、可扩展系统的设计和开发能力。 由于内容较多,本次将展示部分截图,如果看得不过瘾想更加深入地了解本笔记彻底掌握,只需转发后私信回复【666】即可来获取免费领取方式了!

ZooKeeper在HBase中的应用

ZooKeeper是一个开源的分布式协调服务,由雅虎创建,是Google Chubby的开源实现。分布式应用程序可以基于ZooKeeper实现诸如数据发布/订阅、负载均衡、命名服务、分布式协调/通知、集群管理、Master选举、分布式锁和分布式队列等功能。 既然ZooKeeper的作用这么大,那我们就来详细说说ZooKeeper在HBase中的应用叭! 一个分布式HBase系统安装依赖于一个运行着的ZooKeeper集群,所有参与的节点和客户端必须能够正常访问运行着的ZooKeeper集群。HBase默认为你提供一个节点的ZooKeeper集群,它会伴随着HBase start/stop进程的启动/停止而启动/停止。那么HBase主要用ZooKeeper来干什么呢?HBase主要用ZooKeeper来实现HMaster选举与主备切换、系统容错、RootRegion管理、Region状态管理和分布式SplitWAL任务管理等。 一,HMaster选举与主备切换 HMaster选举与主备切换的原理和HDFS中NameNode及YARN中ResourceManager的HA原理相同。 二,系统容错 当HBase启动时,每个RegionServer都会到ZooKeeper的/hbase/rs节点下创建一个信息节点(下文中,我们称该节点为”rs状态节点”),例如/hbase/rs/[Hostname],同时,HMaster会对这个节点注册监听。当某个 RegionServer 挂掉的时候,ZooKeeper会因为在一段时间内无法接受其心跳(即 Session 失效),而删除掉该 RegionServer 服务器对应的 rs 状态节点。与此同时,HMaster 则会接收到 ZooKeeper 的 NodeDelete 通知,从而感知到某个节点断开,并立即开始容错工作。 按照上面所说,那为什么HBase不直接让HMaster来负责RegionServer的监控呢?如果HMaster直接通过心跳机制等来管理RegionServer的状态,随着集群越来越大,HMaster的管理负担会越来越重,另外它自身也有挂掉的可能,因此数据还需要持久化。在这种情况下,ZooKeeper就成了理想的选择。 三,Region管理 对于大的HBase集群来说,Region的数量可能会多达十万级别,甚至更多,这样规模的Region状态管理交给ZooKeeper来做也是一个非常nice的选择。 四,分布式SplitWAL任务管理 当某台RegionServer服务器挂掉时,由于总有一部分新写入的数据还没有持久化到HFile中,因此在迁移该RegionServer的服务时,一个重要的工作就是从WAL中恢复这部分还在内存中的数据,而这部分工作最关键的一步就是SplitWAL,即HMaster需要遍历该RegionServer服务器的WAL,并按Region切分成小块移动到新的地址下,并进行日志的回放(replay)。 由于单个RegionServer的日志量相对庞大(可能有上千个Region,上GB的日志),而用户又往往希望系统能够快速完成日志的恢复工作。因此一个可行的方案是将这个处理WAL的任务分给多台RegionServer服务器来共同处理,而这就又需要一个持久化组件来辅助HMaster完成任务的分配。当前的做法是,HMaster会在ZooKeeper上创建一个SplitWAL节点(默认情况下,是/hbase/SplitWAL节点),将“哪个RegionServer处理哪个Region”这样的信息以列表的形式存放到该节点上,然后由各个RegionServer服务器自行到该节点上去领取任务并在任务执行成功或失败后再更新该节点的信息,以通知HMaster继续进行后面的步骤。ZooKeeper在这里担负起了分布式集群中相互通知和信息持久化的角色。 u200b 综上,就是ZooKeeper在HBase中的应用,在这里只列举出了一部分,相对说比较突出的作用,其实ZooKeeper在HBase中的应用远不止这些,比如HMaster还依赖ZooKeeper来完成Table的enable/disable状态记录,以及HBase中几乎所有的元数据存储都是放在ZooKeeper上的等等。

Zookeeper客户端Curator使用详解

[TOC] 维护多个博客比较麻烦,和博客园放弃维护,后续在个人博客持续更新: Curator是Netflix公司开源的一套zookeeper客户端框架,解决了很多Zookeeper客户端非常底层的细节开发工作,包括连接重连、反复注册Watcher和NodeExistsException异常等等。Patrixck Hunt(Zookeeper)以一句“Guava is to Java that Curator to Zookeeper”给Curator予高度评价。 引子和趣闻: Zookeeper名字的由来是比较有趣的,下面的片段摘抄自《从PAXOS到ZOOKEEPER分布式一致性原理与实践》一书: Zookeeper最早起源于雅虎的研究院的一个研究小组。在当时,研究人员发现,在雅虎内部很多大型的系统需要依赖一个类似的系统进行分布式协调,但是这些系统往往存在分布式单点问题。所以雅虎的开发人员就试图开发一个通用的无单点问题的分布式协调框架。在立项初期,考虑到很多项目都是用动物的名字来命名的(例如著名的Pig项目),雅虎的工程师希望给这个项目也取一个动物的名字。时任研究院的首席科学家Raghu Ramakrishnan开玩笑说:再这样下去,我们这儿就变成动物园了。此话一出,大家纷纷表示就叫动物园管理员吧——因为各个以动物命名的分布式组件放在一起,雅虎的整个分布式系统看上去就像一个大型的动物园了,而Zookeeper正好用来进行分布式环境的协调——于是,Zookeeper的名字由此诞生了。 Curator无疑是Zookeeper客户端中的瑞士军刀,它译作"馆长"或者""管理者"",不知道是不是开发小组有意而为之,笔者猜测有可能这样命名的原因是说明Curator就是Zookeeper的馆长(脑洞有点大:Curator就是动物园的园长)。 Curator包含了几个包: curator-framework: 对zookeeper的底层api的一些封装 curator-client: 提供一些客户端的操作,例如重试策略等 curator-recipes: 封装了一些高级特性,如:Cache事件监听、选举、分布式锁、分布式计数器、分布式Barrier等 Maven依赖(使用curator的版本:2.12.0,对应Zookeeper的版本为:3.4.x, 如果跨版本会有兼容性问题,很有可能导致节点操作失败 ): 一个例子如下: newClient静态工厂方法包含四个主要参数: 核心参数变为流式设置,一个列子如下: 为了实现不同的Zookeeper业务之间的隔离,需要为每个业务分配一个独立的命名空间( NameSpace ),即指定一个Zookeeper的根路径(官方术语: 为Zookeeper添加“Chroot”特性 )。例如(下面的例子)当客户端指定了独立命名空间为“/base”,那么该客户端对Zookeeper上的数据节点的操作都是基于该目录进行的。通过设置Chroot可以将客户端应用与Zookeeper服务端的一课子树相对应,在多个应用共用一个Zookeeper集群的场景下,这对于实现不同应用之间的相互隔离十分有意义。 当创建会话成功,得到client的实例然后可以直接调用其start( )方法: Zookeeper的节点创建模式: **创建一个节点,初始内容为空 ** 注意:如果没有设置节点属性,节点创建模式默认为持久化节点,内容默认为空 创建一个节点,附带初始化内容 创建一个节点,指定创建模式(临时节点),内容为空 创建一个节点,指定创建模式(临时节点),附带初始化内容 创建一个节点,指定创建模式(临时节点),附带初始化内容,并且自动递归创建父节点 这个creatingParentContainersIfNeeded()接口非常有用,因为一般情况开发人员在创建一个子节点必须判断它的父节点是否存在,如果不存在直接创建会抛出NoNodeException,使用creatingParentContainersIfNeeded()之后Curator能够自动递归创建所有所需的父节点。 删除一个节点 注意,此方法只能删除 叶子节点 ,否则会抛出异常。 删除一个节点,并且递归删除其所有的子节点 删除一个节点,强制指定版本进行删除 删除一个节点,强制保证删除 guaranteed()接口是一个保障措施,只要客户端会话有效,那么Curator会在后台持续进行删除操作,直到删除节点成功。 注意: 上面的多个流式接口是可以自由组合的,例如: 读取一个节点的数据内容 注意,此方法返的返回值是byte[ ]; 读取一个节点的数据内容,同时获取到该节点的stat 更新一个节点的数据内容 注意:该接口会返回一个Stat实例 更新一个节点的数据内容,强制指定版本进行更新 注意:该方法返回一个Stat实例,用于检查ZNode是否存在的操作. 可以调用额外的方法(监控或者后台处理)并在最后调用forPath( )指定要操作的ZNode 注意:该方法的返回值为List<String>,获得ZNode的子节点Path列表。 可以调用额外的方法(监控、后台处理或者获取状态watch, background or get stat) 并在最后调用forPath()指定要操作的父ZNode CuratorFramework的实例包含inTransaction( )接口方法,调用此方法开启一个ZooKeeper事务. 可以复合create, setData, check, and/or delete 等操作然后调用commit()作为一个原子操作提交。一个例子如下: 上面提到的创建、删除、更新、读取等方法都是同步的,Curator提供异步接口,引入了 BackgroundCallback 接口用于处理异步接口调用之后服务端返回的结果信息。 BackgroundCallback 接口中一个重要的回调值为CuratorEvent,里面包含事件类型、响应吗和节点的详细信息。 CuratorEventType 响应码(#getResultCode()) 一个异步创建节点的例子如下: 注意:如果#inBackground()方法不指定executor,那么会默认使用Curator的EventThread去进行异步处理。 提醒:首先你必须添加curator-recipes依赖,下文仅仅对recipes一些特性的使用进行解释和举例,不打算进行源码级别的探讨 重要提醒:强烈推荐使用ConnectionStateListener监控连接的状态,当连接状态为LOST,curator-recipes下的所有Api将会失效或者过期,尽管后面所有的例子都没有使用到ConnectionStateListener。 Zookeeper原生支持通过注册Watcher来进行事件监听,但是开发者需要反复注册(Watcher只能单次注册单次使用)。Cache是Curator中对事件监听的包装,可以看作是对事件监听的本地缓存视图,能够自动为开发者处理反复注册监听。Curator提供了三种Watcher(Cache)来监听结点的变化。 Path Cache用来监控一个ZNode的子节点. 当一个子节点增加, 更新,删除时, Path Cache会改变它的状态, 会包含最新的子节点, 子节点的数据和状态,而状态的更变将通过PathChildrenCacheListener通知。 实际使用时会涉及到四个类: 通过下面的构造函数创建Path Cache: 想使用cache,必须调用它的 start 方法,使用完后调用 close 方法。 可以设置StartMode来实现启动的模式 ......to be continue

【Zookeeper系列】ZK命令基本使用

在了解 ZK 底层原理之前,咱们先简单了解常用的 ZK 命令,熟悉常用 ZK 命令有利于排查相关问题或了解基于 ZK 自研系统等场景。比如在开发的时候,发现有些Dubbo服务无法被调用,这有可能是服务没有注册到ZK或者断开连接;也有可能公司有自研的系统使用 ZK 作为配置中心,熟悉 ZK 命令就能知道是如何做到服务发现注册和配置动态更新。 话不多说,咱们先来了解常见的 ZK 命令吧! 实际上,ZK并没有help命令,你可以随意敲一两个字符也会这样显示,只不过基于使用Linux的习惯,姑且认为输入help能打印出ZK支持的命令吧。 ls 命令可以查看指定目录下的节点,使用可选的参数,能够更加详细的看到节点的相关信息 stat / 等价于 ls -s / 和 ls 命令相似的,加上-w参数添加监听 在ZK 3.5版本之后,新增了容器和TTL节点,分别是使用 -c 和 -t 创建。所以读者们要注意你当前使用的版本,如果版本低于3.5的,是没有容器和TTL节点。 特别说明一下容器节点和TTL节点的使用: 另外关于 TTL节点 的使用,需要特别注意的是,如果使用默认的配置文件启动zk,想创建有存活时间的节点,比如执行 create -t 10 /test 是会报 KeeperErrorCode = Unimplemented for XXX 这样的错误。解决办法是需要在ZK启动前,先在配置文件加上 extendedTypesEnabled=true 然后重启ZK(集群部署的话,所有ZK都需要修改配置文件再重启) 配置后重启,执行 create -t 10 /test 这样的命令就不会报错啦 例子:get -s /demo 例子:先查询节点版本号,模拟并发下修改同一节点 get -s /demo 可知当前 dataVersion = 1 客户端1:set -v 1 /demo demo-data1 客户端2:set -v 1 /demo demo-data2 客户端1比客户端2先执行,客户端2再执行的话,这时显示报错 -v version:和 set 命令相似,-v 参数用于判断当前操作的版本 例子:先创建一个delNode节点,然后删除 在前面使用create命令的时候,有一个acl参数是设置节点权限的,那么我们应该怎么设置? 举个例子: create /testAcl demo world:anyone:crwda 这行命令的意思是,创建 testAcl 这个节点,节点值为demo,其权限策略是所有人都可以执行 crwda 操作。那么接下来,咱们先看下 ACL 是什么东东? ACL 全称是 Access Control List ,也就是访问控制列表,ACL可以设置节点的操作权限。那么控制权限的粒度是怎样呢? 对于节点 ACL 权限控制,是通过使用: scheme:id:perm 来标识(也就是例子中的格式 -> world:anyone:crwda),其含义是: Scheme 有哪些授权策略? ID 授权对象有哪些? Permission 权限有哪些? 根据上面的参数可知,我们可以通过给所有人、特定的账号密码、特定的 ip 设置节点权限,这样能够更加方面地管理节点的访问。 值得注意的是,节点可以设置多种授权策略,但对于上下节点而言,权限的设置只对当前节点有效。换言之,权限不存在继承关系,即使节点被设置权限,但不会影响上下节点原来的权限! 上面执行了 create /testAcl demo world:anyone:crwda 命令给节点设置权限,那怎么看节点的权限咧? 很简单,执行 getAcl 节点路径 就可以查看对应节点的权限,比如 getAcl /testAcl,执行结果如下 除了在执行create命令创建节点的时候设置权限,还可以通过 setAcl 指定节点设置权限,比如我想指定/testAcl这个节点只可以通过特定 IP操作,并且限制执行权限为crdw,那么可以执行 setAcl /testAcl ip:127.0.0.1:crwd ,再次执行 getAcl /testAcl 结果如下: ZK 的命令还有部分没有演示,这并不阻碍咱们学习ZK的原理,先掌握常见的命令,如果日后有其他场景的话,再根据特定的命令学习就可以啦。 无意中发现有 Zookeeper的客户端,感兴趣的读者可以玩一下~ 友情提醒,可能在节点数量很多的时候,打开很慢,甚至卡死,所以这个可视化工具可以在自己本地玩玩,不建议应用在生产上哈。这也侧面的说明,学会 ZK 命令的重要性(认真脸.jpg) 解压缩后,进入ZooInspector的build目录,执行 java -jar zookeeper-dev-ZooInspector.jar 就可以启动工具。 连接上 ZK 后,就可以看到节点的信息和节点的ACL,具体玩法,可以再自己摸索哈~ 好了,以上是 ZK 常见命令的基本使用和可视化工具的基本使用。 参考资料: 《从Paxos到Zookeeper分布式一致性原理与实践》 如果觉得文章不错的话,麻烦点个赞哈,你的鼓励就是我的动力!对于文章有哪里不清楚或者有误的地方,欢迎在评论区留言~

《ZooKeeper:分布式过程协同技术详解分布式过程协同技术详解》pdf下载在线阅读,求百度网盘云资源

《ZooKeeper:分布式过程协同技术详解》(Flavio Junqueira)电子书网盘下载免费在线阅读资源链接:链接:https://pan.baidu.com/s/1HrACV0QnQUAmm9oK2Bw13w 提取码:y237书名:ZooKeeper:分布式过程协同技术详解作者:Flavio Junqueira译者:谢超豆瓣评分:7.0出版社:机械工业出版社出版年份:2016-1-1页数:208内容简介:本书分三部分,共10章。第一部分(第1~2章)阐述ApacheZooKeeper这类系统的设计目的和动机,并介绍分布式系统的一些必要背景知识。第1章介绍ZooKeeper可以做什么,以及其设计如何支撑这些任务。第2章介绍基本概念和基本组成模块,并通过命令行工具的具体操作介绍了ZooKeeper可以做什么。第二部分(第3~8章)阐述开发人员所需要掌握的ZooKeeper库调用方法和编程技巧。第3章介绍Java语言的API.第4章解释如何跟踪和处理ZooKeeper中的状态变更情况。第5章介绍如何在系统或网络故障时恢复应用。第6章介绍需要注意来避免故障的一些繁杂却很重要的场景。第7章介绍C语言版的API接口,也可以作为非Java语言实现的ZooKeeperAPI的基础,对非Java语言的开发人员非常有帮助。第8章介绍一款更高层级的封装的ZooKeeper接口。第三部分(第9~10章)主要介绍ZooKeeper内部原理及如何运行ZooKeeper.第9章介绍ZooKeeper的作者们在设计时所采用的方案。第10章介绍如何对ZooKeeper进行配置。作者简介:作者介绍Flavio Junqueira 是微软研究院在英国剑桥大学的研究人员之一。他拥有美国加州大学圣地亚哥分校计算机科学博士学位。他的研究范围涉及分布式系统的各个方面,包括分布式算法、并发性和可扩展性。他是Apache项目如Apache ZooKeeper(PMC主席和提交者)和Apache BookKeeper(提交者)的积极贡献者。他一有空就喜欢睡觉。Benjamin Reed 是一位负责Facebook中所有细节工作的软件工程师。他以前的职位包括雅虎研究院首席研究科学家(负责所有大的方向)和IBM Almaden Research的研究人员(负责所有事情,无论大小)。他拥有加州大学圣克鲁斯分校计算机科学博士学位。他从事的工作涉及分布式计算、大数据处理、分布式存储、系统管理和嵌入式框架等领域。他参加了各种开源项目,如Hadoop和Linux操作系统等。他帮助启动了由Apache软件基金会主办的项目如Pig、ZooKeeper和BookKeeper。

zookeeper怎么实现分布式锁

很多使用Zookeeper的情景是需要我们嵌入Zookeeper作为自己的分布式应用系统的一部分来提供分布式服务,此时我们需要通过程序的方式来启动Zookeeper。此时可以通过Zookeeper API的ZooKeeperServerMain类来启动Zookeeper服务。

如何使用zookeeper实现程序重启

记得在大约在2006年的时候Google出了Chubby来解决分布一致性的问题(distributed consensus problem),所有集群中的服务器通过Chubby最终选出一个Master Server ,最后这个Master Server来协调工作。简单来说其原理就是:在一个分布式系统中,有...

SpringCloud + Zookeeper + Feign整合及Feign原理

Spring Cloud 与 Zookeeper的整合只需要添加相关的starter依赖和增加相关注解即可完成。 pom.xml 如下: bootstrap.yml 如下: 最后开启服务的注册与发现 service 和controller实现 笔者加入了swagger,如果需要只需加入如下依赖和配置: 至此,spring cloud与zookeeper的整合就完成了,调用结果如下: 为了测试与Feign的整合,再构建一个消费者:与上述构建的过程类似。 pom.xml 增加spring-cloud-starter-openfeign依赖 bootstrap.yaml: 开启服务注册与发现,@EnableFeignClients注解注册FeignClient @FeignClient注册声明定义FeignClient,笔者以两种方式定义了两个FeignClient: 1.通过请求路径定义FeignClient 2.通过生产者(即上述构建的helloService)暴露出来的接口定义FeignClient controller 测试: 测试结果如下: 知道了如何将SpringCloud, Zookeeper 和Feign进行整合,我们知道了怎么使用,更重要的是要知道里面的原理,做到知其然更要知其所以然。 通过上述对整合过程的描述中可以发现,@EnableFeignClients和@FeignClient两个注解是将Feign整合进Spring Cloud的重要组成部分,因此,从这两个注解入手来了解Feign。 @EnableFeignClients注解通过@Import引入了FeignClientsRegistrar进行feign客户端的注册, 同时FeignClientsRegistrar通过实现ImportBeanDefinitionRegistrar来将bean注册spring容器中: 至此,我们知道了通过@EnableFeignClients和@FeignClient两个注解以及其相关属性,在服务启动时,将每个feign client 以及其对应的配置和每个客户端通用的配置以bean的方式注册完到spring容器中。 当使用@Autowired注解自动注入FeignClient时,Spring容器会使用注册FeignClient用到的FeignClientFactoryBean为其生成FeignClient实例。 默认使用的targeter是HystrixTargeter,根据builder的类型设置不同的属性,并生产Feign client 从上面的分析可以得出,当服务启动时,通过@EnableFeignClients注解,启动对标注了@FeignClient注解的类进行扫描和注册,通过FeignClientFactoryBean将FeignClient注册到Spring容器中。当使用@Autowired注解进行自动注入时,注册到Spring容器中FeignClient会以动态代理的形式注入,这些动态代理中包含了接口方法的methodHandler用以处理调用转发。

Zookeeper在哪些系统中使用,又是怎么用的

  ZooKeeper作为发现服务的问题   ZooKeeper(注:ZooKeeper是著名Hadoop的一个子项目,旨在解决大规模分 布式应用场景下,服务协调同步(Coordinate Service)的问题;它可以为同在一个分布式系统中的其他服务提供:统一命名服务、配置管理、分布式锁服务、集群管理等功能)是个伟大的开源项目,它 很成熟,有相当大的社区来支持它的发展,而且在生产环境得到了广泛的使用;但是用它来做Service发现服务解决方案则是个错误。   在分布式系统领域有个著名的 CAP定理(C- 数据一致性;A-服务可用性;P-服务对网络分区故障的容错性,这三个特性在任何分布式系统中不能同时满足,最多同时满足两个);ZooKeeper是个 CP的,即任何时刻对ZooKeeper的访问请求能得到一致的数据结果,同时系统对网络分割具备容错性;但是它不能保证每次服务请求的可用性(注:也就 是在极端环境下,ZooKeeper可能会丢弃一些请求,消费者程序需要重新请求才能获得结果)。但是别忘了,ZooKeeper是分布式协调服务,它的 职责是保证数据(注:配置数据,状态数据)在其管辖下的所有服务之间保持同步、一致;所以就不难理解为什么ZooKeeper被设计成CP而不是AP特性 的了,如果是AP的,那么将会带来恐怖的后果(注:ZooKeeper就像交叉路口的信号灯一样,你能想象在交通要道突然信号灯失灵的情况吗?)。而且, 作为ZooKeeper的核心实现算法 Zab,就是解决了分布式系统下数据如何在多个服务之间保持同步问题的。   作为一个分布式协同服务,ZooKeeper非常好,但是对于Service发现服务来说就不合适了;因为对于Service发现服务来说就算 是 返回了包含不实的信息的结果也比什么都不返回要好;再者,对于Service发现服务而言,宁可返回某服务5分钟之前在哪几个服务器上可用的信息,也不能 因为暂时的网络故障而找不到可用的服务器,而不返回任何结果。所以说,用ZooKeeper来做Service发现服务是肯定错误的,如果你这么用就惨 了!   而且更何况,如果被用作Service发现服务,ZooKeeper本身并没有正确的处理网络分割的问题;而在云端,网络分割问题跟其他类型的 故障一样的确会发生;所以最好提前对这个问题做好100%的准备。就像 Jepsen在 ZooKeeper网站上发布的博客中所说:在ZooKeeper中,如果在同一个网络分区(partition)的节点数(nodes)数达不到 ZooKeeper选取Leader节点的“法定人数”时,它们就会从ZooKeeper中断开,当然同时也就不能提供Service发现服务了。   如果给ZooKeeper加上客户端缓存(注:给ZooKeeper节点配上本地缓存)或者其他类似技术的话可以缓解ZooKeeper因为网 络故障造成节点同步信息错误的问题。 Pinterest与 Airbnb公 司就使用了这个方法来防止ZooKeeper故障发生。这种方式可以从表面上解决这个问题,具体地说,当部分或者所有节点跟ZooKeeper断开的情况 下,每个节点还可以从本地缓存中获取到数据;但是,即便如此,ZooKeeper下所有节点不可能保证任何时候都能缓存所有的服务注册信息。如果 ZooKeeper下所有节点都断开了,或者集群中出现了网络分割的故障(注:由于交换机故障导致交换机底下的子网间不能互访);那么ZooKeeper 会将它们都从自己管理范围中剔除出去,外界就不能访问到这些节点了,即便这些节点本身是“健康”的,可以正常提供服务的;所以导致到达这些节点的服务请求 被丢失了。(注:这也是为什么ZooKeeper不满足CAP中A的原因)   更深层次的原因是,ZooKeeper是按照CP原则构建的,也就是说它能保证每个节点的数据保持一致,而为ZooKeeper加上缓存的做法 的 目的是为了让ZooKeeper变得更加可靠(available);但是,ZooKeeper设计的本意是保持节点的数据一致,也就是CP。所以,这样 一来,你可能既得不到一个数据一致的(CP)也得不到一个高可用的(AP)的Service发现服务了;因为,这相当于你在一个已有的CP系统上强制栓了 一个AP的系统,这在本质上就行不通的!一个Service发现服务应该从一开始就被设计成高可用的才行!   如果抛开CAP原理不管,正确的设置与维护ZooKeeper服务就非常的困难;错误会 经常发生, 导致很多工程被建立只是为了减轻维护ZooKeeper的难度。这些错误不仅存在与客户端而且还存在于ZooKeeper服务器本身。Knewton平台 很多故障就是由于ZooKeeper使用不当而导致的。那些看似简单的操作,如:正确的重建观察者(reestablishing watcher)、客户端Session与异常的处理与在ZK窗口中管理内存都是非常容易导致ZooKeeper出错的。同时,我们确实也遇到过 ZooKeeper的一些经典bug: ZooKeeper-1159 与 ZooKeeper-1576; 我们甚至在生产环境中遇到过ZooKeeper选举Leader节点失败的情况。这些问题之所以会出现,在于ZooKeeper需要管理与保障所管辖服务 群的Session与网络连接资源(注:这些资源的管理在分布式系统环境下是极其困难的);但是它不负责管理服务的发现,所以使用ZooKeeper当 Service发现服务得不偿失。   做出正确的选择:Eureka的成功   我们把Service发现服务从ZooKeeper切换到了Eureka平台,它是一个开 源的服务发现解决方案,由Netflix公司开发。(注:Eureka由两个组件组成:Eureka服务器和Eureka客户端。Eureka服务器用作 服务注册服务器。Eureka客户端是一个java客户端,用来简化与服务器的交互、作为轮询负载均衡器,并提供服务的故障切换支持。)Eureka一开 始就被设计成高可用与可伸缩的Service发现服务,这两个特点也是Netflix公司开发所有平台的两个特色。( 他们都在讨论Eureka)。自从切换工作开始到现在,我们实现了在生产环境中所有依赖于Eureka的产品没有下线维护的记录。我们也被告知过,在云平 台做服务迁移注定要遇到失败;但是我们从这个例子中得到的经验是,一个优秀的Service发现服务在其中发挥了至关重要的作用!   首先,在Eureka平台中,如果某台服务器宕机,Eureka不会有类似于ZooKeeper的选举leader的过程;客户端请求会自动切 换 到新的Eureka节点;当宕机的服务器重新恢复后,Eureka会再次将其纳入到服务器集群管理之中;而对于它来说,所有要做的无非是同步一些新的服务 注册信息而已。所以,再也不用担心有“掉队”的服务器恢复以后,会从Eureka服务器集群中剔除出去的风险了。Eureka甚至被设计用来应付范围更广 的网络分割故障,并实现“0”宕机维护需求。当网络分割故障发生时,每个Eureka节点,会持续的对外提供服务(注:ZooKeeper不会):接收新 的服务注册同时将它们提供给下游的服务发现请求。这样一来,就可以实现在同一个子网中(same side of partition),新发布的服务仍然可以被发现与访问。   但是,Eureka做到的不止这些。正常配置下,Eureka内置了心跳服务,用于淘汰一些“濒死”的服务器;如果在Eureka中注册的服 务, 它的“心跳”变得迟缓时,Eureka会将其整个剔除出管理范围(这点有点像ZooKeeper的做法)。这是个很好的功能,但是当网络分割故障发生时, 这也是非常危险的;因为,那些因为网络问题(注:心跳慢被剔除了)而被剔除出去的服务器本身是很”健康“的,只是因为网络分割故障把Eureka集群分割 成了独立的子网而不能互访而已。   幸运的是,Netflix考虑到了这个缺陷。如果Eureka服务节点在短时间里丢失了大量的心跳连接(注:可能发生了网络故障),那么这个 Eureka节点会进入”自我保护模式“,同时保留那些“心跳死亡“的服务注册信息不过期。此时,这个Eureka节点对于新的服务还能提供注册服务,对 于”死亡“的仍然保留,以防还有客户端向其发起请求。当网络故障恢复后,这个Eureka节点会退出”自我保护模式“。所以Eureka的哲学是,同时保 留”好数据“与”坏数据“总比丢掉任何”好数据“要更好,所以这种模式在实践中非常有效。   最后,Eureka还有客户端缓存功能(注:Eureka分为客户端程序与服务器端程序两个部分,客户端程序负责向外提供注册与发现服务接 口)。 所以即便Eureka集群中所有节点都失效,或者发生网络分割故障导致客户端不能访问任何一台Eureka服务器;Eureka服务的消费者仍然可以通过 Eureka客户端缓存来获取现有的服务注册信息。甚至最极端的环境下,所有正常的Eureka节点都不对请求产生相应,也没有更好的服务器解决方案来解 决这种问题时;得益于Eureka的客户端缓存技术,消费者服务仍然可以通过Eureka客户端查询与获取注册服务信息,这点很重要。   Eureka的构架保证了它能够成为Service发现服务。它相对与ZooKeeper来说剔除了Leader节点的选取或者事务日志机制, 这 样做有利于减少使用者维护的难度也保证了Eureka的在运行时的健壮性。而且Eureka就是为发现服务所设计的,它有独立的客户端程序库,同时提供心 跳服务、服务健康监测、自动发布服务与自动刷新缓存的功能。但是,如果使用ZooKeeper你必须自己来实现这些功能。Eureka的所有库都是开源 的,所有人都能看到与使用这些源代码,这比那些只有一两个人能看或者维护的客户端库要好。   维护Eureka服务器也非常的简单,比如,切换一个节点只需要在现有EIP下移除一个现有的节点然后添加一个新的就行。Eureka提供了一 个 web-based的图形化的运维界面,在这个界面中可以查看Eureka所管理的注册服务的运行状态信息:是否健康,运行日志等。Eureka甚至提供 了Restful-API接口,方便第三方程序集成Eureka的功能。

【Zookeeper系列】基本介绍

在学习一样技术之前,咱们需要先想一下,为什么需要学这一门技术? 许多分布式系统都是基于ZK作为底层核心组件对外提供服务,比如Kafka中,将Broker注册到ZK中,此时ZK充当着多重角色,比如注册中心、选举等;再比如说,我公司目前很多项目都是Dubbo,都是需要基于ZK实现服务发现和注册。 另外,ZK内其实也有很多优秀的算法和设计思想,熟悉ZK源码,也可以提升自己的“内功”。 如何快速入门Zookeeper呢?最简单的方式就是直接看 Zookeeper官网 啦!建议读者多参考官方文档和博客内容一起食用,效果更佳噢~ Zookeeper的 Logo 看起来就像个“铲屎官”,服务动物园内的动物们。 “A Distributed Coordination Service for Distributed Applications”,这是摘取官方的解释,我们可以得知Zookeeper 是一个为 分布式框架 提供协调服务的东东。 举些例子,有哪些分布式框架使用Zookeeper: ZK的作用不止上面几个,其实还可以做到负载均衡、统一配置、分布式队列等,但使用场景相对少,企业级系统中,会使用其他更加专业的框架组件。 分布式锁、注册中心、Leader选举将会是ZK系列中,重点分享的内容,敬请期待哈~ 在ZK中,需要先了解一些专业名词的概念,但不会一下子都列出来,当之后遇到的时候,再重点分析... 在ZK集群中,会分为 Leader 、 Follower 和 Observer 角色。 Leader作为集群的大佬,承担写请求和部分读请求;Follower作为Leader的小弟,将会承担部分读请求,当接收到写请求的时候会转发给Leader,由Leader处理写请求;Observer就有点特殊,Observer节点不参与选举和消息过半机制,这个不清楚的读者可以暂时有个记忆就行,之后遇到会重点说明。 实际上,节点只分为持久节点和临时节点,但有些场景需要保证顺序,所以就会在持久或临时节点的基础上,添加序号(递增的方式),形成持久顺序节点和临时顺序节点。</br> 那么什么是持久节点,什么是临时节点呢?最直观的一个现象就是,每个ZK客户端连接ZK集群后,都会产生一个节点,如果ZK客户端下线后,节点还存在的就是持久节点,若ZK客户端下线后节点也随着消失,那么该节点就是临时节点。 在ZK客户端启动前,可以自定义监听回调函数,这个有什么作用呢?客户端启动后会将监听事件发送给Zookeeper集群,Zookeeper集群中有一个用于记录监听事件的列表,当客户端监听的目录节点发生变化,如节点数据变更、节点增删等,就会通过ZK集群的监听列表,找到对应的客户端回调监听函数,那么客户端这边就可以根据业务场景,做出相应的动作。 ZAB协议的全称是:ZooKeeper Atomic Broadcast。ZAB是Zookeeper保证数据一致性的核心算法。借鉴了Paxos算法的思想,特地为Zookeeper设计的支持崩溃恢复的原子广播协议。其包括两种基本模式: 消息广播 和 崩溃恢复 消息广播指的是,集群中只有一个Leader处理写请求,并将写请求的事件广播给所有Follower,且能够保证数据不丢失。(也就是说,消息的写入是原子性的,因为只能有leader写入) 崩溃恢复指的是,当ZK集群刚启动还没选举出Leader或Leader因故障、重启、网络等原因的时候,ZAB协议会进入崩溃恢复模式,其目的就是为了选举新的Leader,且保证新Leader的数据是最新的,这样就能够避免因为Leader故障而导致单点丢失消息的情况,至于ZAB具体的原理,各位可以先看下以下参考文章,后续有机会我再专门写一篇关于 ZAB 协议的文章~ ZAB 协议参考文章 ZK内的数据模型结构和Unix文件系统非常相似,是一个有层级关系的树形数据结构。在ZK内,树形的数据结构使用称为ZNode节点保存数据,ZNode是ZK中数据结构最小单元,不仅能够保存数据,还能挂载子节点,形成一个有层次关系的树。 值得注意的是,ZNode的创建是纯内存操作的,所以速度很快,然后在ZK内部会定期将ZNode的数据持久化到磁盘上。 众所周知,在实际的企业应用,面对高并发的场景下,肯定是不能单节点部署,而是通过集群部署保证 高并发、高性能、高可用 (简称三高)。 高性能 :由于ZNode节点是纯内存操作,只要ZK部署在高配置的服务器中,三台ZK服务器抗住每秒几万的请求都是没问题的。 高可用 :只要部署奇数的服务器集群(比如3台、5台、11台机器),只要不超过一半的服务器宕机,都能保证ZK集群可用。 高并发 :因为ZNode是纯内存操作,所以在写数据的时候,速度是很快;而ZK集群中Leader和Follower节点都能处理读请求,所以ZK集群高并发能力是很强的。 基于ZAB协议,写请求统一由Leader服务器处理,然后由Leader将写数据的请求广播给其他Follower。 但会不会由于种种原因,如网络波动、Leader脑裂、Follower宕机等,导致消息不一致? 实际上,在ZK中采用2PC两阶段提交的思想,结合ZAB消息广播保证数据一致性。值得注意的是,Zookeeper只能保证最终一致性,并不能保证强一致性 那么具体是怎么保证数据最终一致性的呢?感兴趣的读者可以看下我另外一篇拙作【TODO...】 参考资料: 《从Paxos到Zookeeper分布式一致性原理与实践》 如果觉得文章不错的话,麻烦点个赞哈,你的鼓励就是我的动力!对于文章有哪里不清楚或者有误的地方,欢迎在评论区留言~

为什么要使用zookeeper?有什么功能吗?

2006年的时候Google出了Chubby来解决分布一致性的问题(distributed consensus problem),所有集群中的服务器通过Chubby最终选出一个Master Server ,最后这个Master Server来协调工作。简单来说其原理就是:在一个分布式系统中,有一组服务器在运行同样的程序,它们需要确定一个Value,以那个服务器提供的信息为主/为准,当这个服务器经过n/2+1的方式被选出来后,所有的机器上的Process都会被通知到这个服务器就是主服务器 Master服务器,大家以他提供的信息为准。很想知道Google Chubby中的奥妙,可惜人家Google不开源,自家用。但是在2009年3年以后沉默已久的Yahoo在Apache上推出了类似的产品ZooKeeper,并且在Google原有Chubby的设计思想上做了一些改进,因为ZooKeeper并不是完全遵循Paxos协议,而是基于自身设计并优化的一个2 phase commit的协议,如图所示:ZooKeeper跟Chubby一样用来存放一些相互协作的信息(Coordination),这些信息比较小一般不会超过1M,在zookeeper中是以一种hierarchical tree的形式来存放,这些具体的Key/Value信息就store在tree node中。当有事件导致node数据,例如:变更,增加,删除时,Zookeeper就会调用 triggerWatch方法,判断当前的path来是否有对应的监听者(watcher),如果有watcher,会触发其process方法,执行process方法中的业务逻辑

zookeeper服务注册和发现原理

zk的好处就是,服务注册和发现都是事实的。 微服务会对zk进行监听,如果服务有变动,则会实时更新注册信息。 集群建议部署单数个,集群可用服务器超过一半,zk才能对外提供服务。 最少部署3台。 集群模式下, 会有一个leader,和多个follower 。 leader会将服务注册的表同步到各个follower。 leader宕机后, follower会进行选举, 选举的过程中, zk是不对外提供服务的。 这时候,就保证不了可用性(A)。 这样的机制就可以保证一致性。 选举完成后, zk再对外提供服务。

Zookpeer是什么?在系统中如何起作用?

Zookeeper分布式服务框架是Apache Hadoop的一个子项目,它主要是用来解决分布式应用中经常遇到的一些数据管理问题。如:统一命名服务、状态同步服务、集群管理、分布式应用配置项的管理等。 我们先看看它都提供了哪些功能,然后再看看使用它的这些功能能做点什么。 简单的说,zookeeper=文件系统+通知机制。 Zookeeper维护一个类似文件系统的数据结构: 每个子目录项如 NameService 都被称作为 znode,和文件系统一样,我们能够自由的增加、删除znode,在一个znode下增加、删除子znode,唯一的不同在于znode是可以存储数据的。 客户端注册监听它关心的目录节点,当目录节点发生变化(数据改变、被删除、子目录节点增加删除)时,zookeeper会通知客户端。 这个似乎最简单,在zookeeper的文件系统里创建一个目录,即有唯一的path。在我们使用tborg无法确定上游程序的部署机器时即可与下游程序约定好path,通过path即能互相探索发现,不见不散了。 程序总是需要配置的,如果程序分散部署在多台机器上,要逐个改变配置就变得困难。 可以把这些配置全部放到zookeeper上去,保存在 Zookeeper 的某个目录节点中,然后所有相关应用程序对这个目录节点进行监听,一旦配置信息发生变化,每个应用程序就会收到 Zookeeper 的通知,然后从 Zookeeper 获取新的配置信息应用到系统中就好。 集群管理无在乎两点:是否有机器退出和加入、选举master。 对于第一点,所有机器约定在父目录GroupMembers下创建临时目录节点,然后监听父目录节点的子节点变化消息。一旦有机器挂掉,该机器与 zookeeper的连接断开,其所创建的临时目录节点被删除,所有其他机器都收到通知:某个兄弟目录被删除,于是,所有人都知道:它下船了。当然又会有新机器加入,也是类似:所有机器收到通知---新兄弟目录加入,highcount又有了,有人上船了。 对于第二点,我们假设机器创建临时顺序编号目录节点,每次选取编号最小的机器作为master就好。 有了zookeeper的一致性文件系统,锁的问题变得容易。锁服务可以分为两类,一个是保持独占,另一个是控制时序。 对于第一类,我们将zookeeper上的一个znode看作是一把锁,通过createznode的方式来实现。所有客户端都去创建 /distribute_lock 节点,最终成功创建的那个客户端也即拥有了这把锁。厕所有言:来也冲冲,去也冲冲,用完删除掉自己创建的distribute_lock 节点就释放出锁。 对于第二类, /distribute_lock 已经预先存在,所有客户端在它下面创建临时顺序编号目录节点,和选master一样,编号最小的获得锁,用完删除,依次方便。 两种类型的队列: 1、 同步队列,当一个队列的成员都聚齐时,这个队列才可用,否则一直等待所有成员到达。 2、队列按照 FIFO 方式进行入队和出队操作。 第一类,在约定目录下创建临时目录节点,监听节点数目是否是我们要求的数目。 第二类,和分布式锁服务中的控制时序场景基本原理一致,入列有编号,出列按编号。 Zookeeper中的角色主要有以下三类: 系统模型如图所示: Zookeeper的核心是原子广播,这个机制保证了各个Server之间的同步。实现这个机制的协议叫做Zab协议。Zab协议有两种模式,它们分 别是恢复模式(选主)和广播模式(同步)。当服务启动或者在领导者崩溃后,Zab就进入了恢复模式,当领导者被选举出来,且大多数Server完成了和 leader的状态同步以后,恢复模式就结束了。状态同步保证了leader和Server具有相同的系统状态。 为了保证事务的顺序一致性,zookeeper采用了递增的事务id号(zxid)来标识事务。所有的提议(proposal)都在被提出的时候加上 了zxid。实现中zxid是一个64位的数字,它高32位是epoch用来标识leader关系是否改变,每次一个leader被选出来,它都会有一个 新的epoch,标识当前属于那个leader的统治时期。低32位用于递增计数。 每个Server在工作过程中有三种状态: 当leader崩溃或者leader失去大多数的follower,这时候zk进入恢复模式,恢复模式需要重新选举出一个新的leader,让所有的 Server都恢复到一个正确的状态。Zk的选举算法有两种:一种是基于basic paxos实现的,另外一种是基于fast paxos算法实现的。系统默认的选举算法为fast paxos。先介绍basic paxos流程: 通过流程分析我们可以得出:要使Leader获得多数Server的支持,则Server总数必须是奇数2n+1,且存活的Server的数目不得少于n+1. 选完leader以后,zk就进入状态同步过程。 Leader主要有三个功能: PING消息是指Learner的心跳信息;REQUEST消息是Follower发送的提议信息,包括写请求及同步请求;ACK消息是 Follower的对提议的回复,超过半数的Follower通过,则commit该提议;REVALIDATE消息是用来延长SESSION有效时间。 Leader的工作流程简图如下所示,在实际实现中,流程要比下图复杂得多,启动了三个线程来实现功能。 Follower主要有四个功能: Follower的消息循环处理如下几种来自Leader的消息: Follower的工作流程简图如下所示,在实际实现中,Follower是通过5个线程来实现功能的。 https://blog.csdn.net/xinguan1267/article/details/38422149 https://blog.csdn.net/gs80140/article/details/51496925 https://www.2cto.com/kf/201708/668587.html https://blog.csdn.net/milhua/article/details/78931672 P.S. 这篇文章是本人对网络上关于ZK的文章阅读之后整理所得,作为入门级的了解。个人觉得看了上面的内容就能基本了解Zookeeper的作用了,后面在结合实际项目使用加深自己的了解。 end

Zookeeper深入原理(3) - Zab协议

Zab协议全称是 Zookeeper Atomic BroadCast (Zookeeper 原子广播),Zookeeper是通过Zab协议来保证分布式事务的一致性。 1.Zab协议是zookeeper专门设计的一种 支持崩溃恢复 的 原子广播协议, 是Zookeeper保证数据一致性的核心算法。 2.在Zookeeper当中依赖Zab协议来保证数据的一致性,基于这个协议,zookeeper实现了一种主备模型,(Leader+Follower)的架构在保证集群中各个副本之间数据的一致性。 Leader负责处理写事务请求,然后Leader将数据同步到Follower节点上。 3.zookeeper客户端会随机连接到集群中的一个节点上,如果是读请求,就会从当前节点进行读取数据,如果是写的请求,就会将事务请求提交到Leader节点,leader节点接收到事务提交,就会广播该事务,如果超过一半节点写入成功,那么该事务就会被提交。1.Zab协议需要确保那些已经在leader服务器上提交的事务最终被所有服务器提交。 2.Zab协议需要确保那些在leader服务器上被提出而没有被提交的事务。 1.使用主进程(leader)来接受客户端并处理客户端的事务请求,并采用Zab的原子广播协议,将服务器数据变更的状态以事务提议的形式广播到所有的follower副本上去。 2.当主进程出现异常,整个zk集群依然能够正常运行。 Zab协议每个leader需要经过三个阶段:发现、同步、广播 发现 :要求Zookeeper集群必须选取出一个leader进程,同时leader需要维护一个follower可用客户端列表,将来客户端可以和这些follower进行通信。 同步 :Leader要将本身的数据与follower进行同步,实现多副本存储,也体现了CAP中的高可用和分区容错。follower将队列中未处理完的消息消费完成后,写入到本地日志中。 广播 :leader接受客户端提出的事务请求,将新的事务请求广播给follower节点。 Zab协议核心:定义了事务请求的处理方式。 1.所有的事务请求必须由一个全局唯一的服务器来协调处理(Leader 服务器),其余的服务器是follower服务器。 2.leader服务器负责将客户端提出的事务请求,转换成一个事务proposal,并将事务proposal分发给集群中follower服务器,也就是向所有follower节点发送数据广播请求。 3.分发之后leader服务器需要等待follower服务器的反馈,在Zab协议中,只要超过半数的follower服务器进行确认了,那么leader就会再次向所有的follower发送commit消息,要求将上一个事务进行提交。 Zab协议包括两种模式: 崩溃恢复 和 消息广播 协议过程 当整个集群启动过程中,或者leader服务器出现宕机或者网络终端等异常时,Zab协议就会进入崩溃恢复模式,选举出新的leader。 当选举出新的leader之后,同时集群中有过半的服务器与该leader服务器完成了状态同步(数据同步),Zab协议就会退出崩溃恢复模型,进入消息广播模式。 如果新增一台服务器加入集群中,当前集群中已经选举出leader,那么加入进来的服务器自动进入恢复模式,找到leader服务器进行状态同步,完成同步后,与其他follower一起参与到广播流程中。 Zookeeper集群中,数据副本的传递策略采用的是消息广播模式。Zab协议中Leader等待follower 的ACK反馈消息,当到达半数以上follower成功反馈即可,不需要等所有的follower全部反馈。leader服务器出现宕机和网络原因等导致leader与过半的follower服务器不能联系,就会自动进入崩溃恢复模式。 在Zab协议中,为了保证程序的正常运行,整个恢复过程结束后需要重新选出一个leader服务器,因此Zab协议需要一个高效且可靠的算法,来保证快速选举出leader。 Leader算法不仅让leader自己知道自己已经被选取为leader,还需要让集群中的所有服务器快速的感知到选举出的新leader服务器。 崩溃恢复包括两个部分: Leader选举 和 数据恢复 Zab 协议如何保证数据一致性假设两种异常情况: 1、一个事务在 Leader 上提交了,并且过半的 Folower 都响应 Ack 了,但是 Leader 在 Commit 消息发出之前挂了。 2、假设一个事务在 Leader 提出之后,Leader 挂了。 要确保如果发生上述两种情况,数据还能保持一致性,那么 Zab 协议选举算法必须满足以下要求: Zab 协议崩溃恢复要求满足以下两个要求 : 1) 确保已经被 Leader 提交的 Proposal 必须最终被所有的 Follower 服务器提交 。 2) 确保丢弃已经被 Leader 提出的但是没有被提交的 Proposal 。 根据上述要求 Zab协议需要保证选举出来的Leader需要满足以下条件: 1) 新选举出来的 Leader 不能包含未提交的 Proposal 。 即新选举的 Leader 必须都是已经提交了 Proposal 的 Follower 服务器节点。 2) 新选举的 Leader 节点中含有最大的 zxid 。 这样做的好处是可以避免 Leader 服务器检查 Proposal 的提交和丢弃工作。 Zab 如何数据同步 1)完成 Leader 选举后(新的 Leader 具有最高的zxid),在正式开始工作之前(接收事务请求,然后提出新的 Proposal),Leader 服务器会首先确认事务日志中的所有的 Proposal 是否已经被集群中过半的服务器 Commit。 2)Leader 服务器需要确保所有的 Follower 服务器能够接收到每一条事务的 Proposal ,并且能将所有已经提交的事务 Proposal 应用到内存数据中。等到 Follower 将所有尚未同步的事务 Proposal 都从 Leader 服务器上同步过啦并且应用到内存数据中以后,Leader 才会把该 Follower 加入到真正可用的 Follower 列表中。 Zab 数据同步过程中,如何处理需要丢弃的 Proposal 在 Zab 的事务编号 zxid 设计中,zxid是一个64位的数字。 其中低32位可以看成一个简单的单增计数器,针对客户端每一个事务请求,Leader 在产生新的 Proposal 事务时,都会对该计数器加1。而高32位则代表了 Leader 周期的 epoch 编号。 epoch 编号可以理解为当前集群所处的年代,或者周期。每次Leader变更之后都会在 epoch 的基础上加1,这样旧的 Leader 崩溃恢复之后,其他Follower 也不会听它的了,因为 Follower 只服从epoch最高的 Leader 命令。 每当选举产生一个新的 Leader ,就会从这个 Leader 服务器上取出本地事务日志充最大编号 Proposal 的 zxid,并从 zxid 中解析得到对应的 epoch 编号,然后再对其加1,之后该编号就作为新的 epoch 值,并将低32位数字归零,由0开始重新生成zxid。 Zab 协议通过 epoch 编号来区分 Leader 变化周期 ,能够有效避免不同的 Leader 错误的使用了相同的 zxid 编号提出了不一样的 Proposal 的异常情况。 基于以上策略 当一个包含了上一个 Leader 周期中尚未提交过的事务 Proposal 的服务器启动时,当这台机器加入集群中,以 Follower 角色连上 Leader 服务器后,Leader 服务器会根据自己服务器上最后提交的 Proposal 来和 Follower 服务器的 Proposal 进行比对,比对的结果肯定是 Leader 要求 Follower 进行一个回退操作,回退到一个确实已经被集群中过半机器 Commit 的最新 Proposal 。 本文根据https://www.jianshu.com/p/2bceacd60b8a进行编写。

Zookeeper的功能以及工作原理_功能原理

1.ZooKeeper是什么? ZooKeeper是一个分布式的,开放源码的分布式应用程序协调服务,是Google的Chubby一个开源的实现,它是集群的管理者,监视着集群中各个节点的状态根据节点提交的反馈进行下一步合理操作。最终,将简单易用的接口和性能高效、功能稳定的系统提供给用户 2.ZooKeeper提供了什么? 1)文件系统 2)通知机制 3.Zookeeper文件系统 每个子目录项如 NameService 都被称作为znode,和文件系统一样,我们能够自由的增加、删除znode,在一个znode下增加、删除子znode,唯一的不同在于znode是可以存储数据的。 有四种类型的znode: 1、PERSISTENT-持久化目录节点 客户端与zookeeper断开连接后,该节点依旧存在 2、PERSISTENT_SEQUENTIAL-持久化顺序编号目录节点 客户端与zookeeper断开连接后,该节点依旧存在,只是Zookeeper给该节点名称进行顺序编号 3、EPHEMERAL-临时目录节点 客户端与zookeeper断开连接后,该节点被删除 4、EPHEMERAL_SEQUENTIAL-临时顺序编号目录节点 客户端与zookeeper断开连接后,该节点被删除,只是Zookeeper给该节点名称进行顺序编号4.Zookeeper通知机制 客户端注册监听它关心的目录节点,当目录节点发生变化(数据改变、被删除、子目录节点增加删除)时,zookeeper会通知客户端。 5.Zookeeper做了什么? 1.命名服务 2.配置管理 3.集群管理 4.分布式锁 5.队列管理 6.Zookeeper命名服务 在zookeeper的文件系统里创建一个目录,即有唯一的path。在我们使用tborg无法确定上游程序的部署机器时即可与下游程序约定好path,通过path即能互相探索发现。 7.Zookeeper的配置管理 程序总是需要配置的,如果程序分散部署在多台机器上,要逐个改变配置就变得困难。现在把这些配置全部放到zookeeper上去,保存在 Zookeeper 的某个目录节点中,然后所有相关应用程序对这个目录节点进行监听,一旦配置信息发生变化,每个应用程序就会收到 Zookeeper 的通知,然后从 Zookeeper 获取新的配置信息应用到系统中就好8.Zookeeper集群管理 所谓集群管理无在乎两点:是否有机器退出和加入、选举master。 对于第一点,所有机器约定在父目录GroupMembers下创建临时目录节点,然后监听父目录节点的子节点变化消息。一旦有机器挂掉,该机器与 zookeeper的连接断开,其所创建的临时目录节点被删除,所有其他机器都收到通知:某个兄弟目录被删除,于是,所有人都知道:它上船了。 新机器加入也是类似,所有机器收到通知:新兄弟目录加入,highcount又有了,对于第二点,我们稍微改变一下,所有机器创建临时顺序编号目录节点,每次选取编号最小的机器作为master就好。9.Zookeeper分布式锁 有了zookeeper的一致性文件系统,锁的问题变得容易。锁服务可以分为两类,一个是保持独占,另一个是控制时序。 对于第一类,我们将zookeeper上的一个znode看作是一把锁,通过createznode的方式来实现。所有客户端都去创建 /distribute_lock 节点,最终成功创建的那个客户端也即拥有了这把锁。用完删除掉自己创建的distribute_lock 节点就释放出锁。 对于第二类, /distribute_lock 已经预先存在,所有客户端在它下面创建临时顺序编号目录节点,和选master一样,编号最小的获得锁,用完删除,依次方便。10.Zookeeper队列管理 两种类型的队列: 1、同步队列,当一个队列的成员都聚齐时,这个队列才可用,否则一直等待所有成员到达。 2、队列按照 FIFO 方式进行入队和出队操作。 第一类,在约定目录下创建临时目录节点,监听节点数目是否是我们要求的数目。 第二类,和分布式锁服务中的控制时序场景基本原理一致,入列有编号,出列按编号。 11.分布式与数据复制 Zookeeper作为一个集群提供一致的数据服务,自然,它要在所有机器间做数据复制。数据复制的好处: 1、容错:一个节点出错,不致于让整个系统停止工作,别的节点可以接管它的工作;2、提高系统的扩展能力 :把负载分布到多个节点上,或者增加节点来提高系统的负载能力;3、提高性能:让客户端本地访问就近的节点,提高用户访问速度。 从客户端读写访问的透明度来看,数据复制集群系统分下面两种: 1、写主(WriteMaster) :对数据的修改提交给指定的节点。读无此限制,可以读取任何一个节点。这种情况下客户端需要对读与写进行区别,俗称读写分离;2、写任意(Write Any):对数据的修改可提交给任意的节点,跟读一样。这种情况下,客户端对集群节点的角色与变化透明。 对zookeeper来说,它采用的方式是写任意。通过增加机器,它的读吞吐能力和响应能力扩展性非常好,而写,随着机器的增多吞吐能力肯定下降(这也是它建立observer的原因),而响应能力则取决于具体实现方式,是延迟复制保持最终一致性,还是立即复制快速响应。 12.Zookeeper角色描述13.Zookeeper与客户端14.Zookeeper设计目的 1.最终一致性:client不论连接到哪个Server,展示给它都是同一个视图,这是zookeeper最重要的性能。 2.可靠性:具有简单、健壮、良好的性能,如果消息被到一台服务器接受,那么它将被所有的服务器接受。 3.实时性:Zookeeper保证客户端将在一个时间间隔范围内获得服务器的更新信息,或者服务器失效的信息。但由于网络延时等原因,Zookeeper不能保证两个客户端能同时得到刚更新的数据,如果需要最新数据,应该在读数据之前调用sync()接口。 4.等待无关(wait-free):慢的或者失效的client不得干预快速的client的请求,使得每个client都能有效的等待。 5.原子性:更新只能成功或者失败,没有中间状态。 6.顺序性:包括全局有序和偏序两种:全局有序是指如果在一台服务器上消息a在消息b前发布,则在所有Server上消息a都将在消息b前被发布; 偏序是指如果一个消息b在消息a后被同一个发送者发布,a必将排在b前面。 15.Zookeeper工作原理 Zookeeper 的核心是原子广播,这个机制保证了各个Server之间的同步。实现这个机制的协议叫做Zab协议。Zab协议有两种模式,它们分别是恢复模式(选主)和广播模式(同步)。当服务启动或者在领导者崩溃后,Zab就进入了恢复模式,当领导者被选举出来,且大多数Server完成了和 leader的状态同步以后,恢复模式就结束了。状态同步保证了leader和Server具有相同的系统状态。 为了保证事务的顺序一致性,zookeeper采用了递增的事务id号(zxid)来标识事务。所有的提议(proposal)都在被提出的时候加上了zxid。实现中zxid是一个64位的数字,它高32位是epoch用来标识leader关系是否改变,每次一个leader被选出来,它都会有一个新的epoch,标识当前属于那个leader的统治时期。低32位用于递增计数。 16.Zookeeper 下 Server工作状态 每个Server在工作过程中有三种状态: LOOKING:当前Server不知道leader是谁,正在搜寻 LEADING:当前Server即为选举出来的leader FOLLOWING:leader已经选举出来,当前Server与之同步 17.Zookeeper选主流程(basic paxos) 当leader崩溃或者leader失去大多数的follower,这时候zk进入恢复模式,恢复模式需要重新选举出一个新的leader,让所有的Server都恢复到一个正确的状态。Zk的选举算法有两种:一种是基于basic paxos实现的,另外一种是基于fast paxos算法实现的。系统默认的选举算法为fast paxos。 1.选举线程由当前Server发起选举的线程担任,其主要功能是对投票结果进行统计,并选出推荐的Server;2.选举线程首先向所有Server发起一次询问(包括自己);3.选举线程收到回复后,验证是否是自己发起的询问(验证zxid是否一致),然后获取对方的id(myid),并存储到当前询问对象列表中,最后获取对方提议的leader相关信息(id,zxid),并将这些信息存储到当次选举的投票记录表中;4.收到所有Server回复以后,就计算出zxid最大的那个Server,并将这个Server相关信息设置成下一次要投票的Server;5.线程将当前zxid最大的Server设置为当前Server要推荐的Leader,如果此时获胜的Server获得n/2 + 1的Server票数,设置当前推荐的leader为获胜的Server,将根据获胜的Server相关信息设置自己的状态,否则,继续这个过程,直到leader被选举出来。 通过流程分析我们可以得出:要使Leader获得多数Server的支持,则Server总数必须是奇数2n+1,且存活的Server的数目不得少于n+1. 每个Server启动后都会重复以上流程。在恢复模式下,如果是刚从崩溃状态恢复的或者刚启动的server还会从磁盘快照中恢复数据和会话信息,zk会记录事务日志并定期进行快照,方便在恢复时进行状态恢复。选主的具体流程图所示:18.Zookeeper选主流程(fast paxos) fast paxos流程是在选举过程中,某Server首先向所有Server提议自己要成为leader,当其它Server收到提议以后,解决epoch和 zxid的冲突,并接受对方的提议,然后向对方发送接受提议完成的消息,重复这个流程,最后一定能选举出Leader。19.Zookeeper同步流程 选完Leader以后,zk就进入状态同步过程。 1. Leader等待server连接;2 .Follower连接leader,将最大的zxid发送给leader;3 .Leader根据follower的zxid确定同步点;4 .完成同步后通知follower 已经成为uptodate状态;5 .Follower收到uptodate消息后,又可以重新接受client的请求进行服务了。20.Zookeeper工作流程-Leader 1 .恢复数据;2 .维持与Learner的心跳,接收Learner请求并判断Learner的请求消息类型;3 .Learner的消息类型主要有PING消息、REQUEST消息、ACK消息、REVALIDATE消息,根据不同的消息类型,进行不同的处理。 PING 消息是指Learner的心跳信息;REQUEST消息是Follower发送的提议信息,包括写请求及同步请求;ACK消息是 Follower的对提议的回复,超过半数的Follower通过,则commit该提议;REVALIDATE消息是用来延长SESSION有效时间。21.Zookeeper工作流程-Follower Follower主要有四个功能: 1.向Leader发送请求(PING消息、REQUEST消息、ACK消息、REVALIDATE消息);2.接收Leader消息并进行处理;3.接收Client的请求,如果为写请求,发送给Leader进行投票;4.返回Client结果。 Follower的消息循环处理如下几种来自Leader的消息: 1 .PING消息: 心跳消息;2 .PROPOSAL消息:Leader发起的提案,要求Follower投票;3 .COMMIT消息:服务器端最新一次提案的信息;4 .UPTODATE消息:表明同步完成;5 .REVALIDATE消息:根据Leader的REVALIDATE结果,关闭待revalidate的session还是允许其接受消息;6 .SYNC消息:返回SYNC结果到客户端,这个消息最初由客户端发起,用来强制得到最新的更新。

Zookeeper算法原理

zk算法的演进过程 1.Write-all-read-one 先讨论最简单的副本控制规则 Write-all-read-one(简称 WARO)是一种最简单的副本控制规则,顾名思义即在更新时写所有 的副本, 只有在所有的副本上更新成功,才认为更新成功, 从而保证所有的副本一致,这样在读取数据时可以读任一副本上的数据。 先做这样的约定 :更新操作(write)是一系列顺序的过程,通过其他机制 确定更新操作的顺序(例如 primary-secondary 架构中由 primary 决定顺序),每个更新操作记为 wi, i 为更新操作单调递增的序号,每个 wi执行成功后副本数据都发生变化,称为不同的数据版本,记作 vi。假设每个副本都保存了历史上所有版本的数据。 假设有一种 magic 的机制,当某次更新操作 wi一旦在所有 N 个副本上都成功,此时 全局都能知 道这个信息(现实情况是比较难的) ,此后读取操作将指定读取数据版本为 vi的数据,称在所有 N 个副本上都成功的更新操作为“成功提交的更新操作”,称对应的数据为“成功提交的数据”。 在 WARO 中,如果某次更新操作 wi在某个副本上失败,此时该副本的最新的数据只有 vi-1,由于不满足在所有 N 个副本上都成功, 则 wi 不是一个“成功提交的更新操作”,此时,虽然其他 N-1 个副本上最新的数据是 vi,但 vi不是一个“成功提交的数据”,最新的成功提交的数据只是 vi-1 。 在工程实践中,这种 magic 的机制往往较难实现或效率较低。通常实现这种 magic 机制的方式就是 将版本号信息存放到某个或某组元数据服务器上 。假如更新操作非常频繁,那么记录更新成功的版本号 vi的操作将成为一个关键操作,容易成为瓶颈。另外,为了实现强一致性,在读取数据的前必须首先读取元数据中的版本号,在大压力下也容易因为元数据服务器的性能造成瓶颈。 缺点: WARO 的可用性。 由于更新操作需要在所有的 N 个副本上都成功,更新操作才能成功,所以一旦有一个副本异常,更新操作失败,更新服务不可用。对于更新服务,虽然有 N 个副本, 但系统无法容忍任何一个副本异常。另一方面, N 个副本中只要有一个副本正常,系统就可以提供读服务。对于读服务而言,当有 N 个副本时,系统可以容忍 N-1 个副本异常。 从上述分析可以发现 WARO 读服务的可用性较高,但更新服务的可用性不高 ,甚至虽然使用了 副本,但更新服务的可用性等效于没有副本. 2.Quorum 机制 将 WARO 的条件进行松弛,从而使得可以在 读写服务可用性之间做折中 ,得出 Quorum 机制. 在 Quorum 机制下,当某次更新操作 wi一旦在所有 N 个副本中的 W 个副本上都成功,则就称 该更新操作为“成功提交的更新操作”,称对应的数据为“成功提交的数据”。令 R>N-W,由于更新 操作 wi仅在 W 个副本上成功,所以在读取数据时,最多需要读取 R 个副本则一定能读到 wi 更新后的数据 vi 。如果某次更新 wi在 W 个副本上成功,由于 W+R>N,任意 R 个副本组成的集合一定与成功的 W 个副本组成的集合有交集,所以读取 R 个副本一定能读到 wi更新后的数据 vi。 例一: 某系统有 5 个副本, W=3, R=3,最初 5 个副本的数据一致,都是 v1, 某次更新操作 w2 在前 3 副本上成功,副本情况变成(v2 v2 v2 v1 v1)。此时, 任意 3 个副本组成的集合中一定包括v2。 例二: N=5, W=2, R=3 时,若 4 个副本异常,更新操作始终无法完成。若 3 个副本异常时, 剩下的两个副本虽然可以提供更新服务,但对于读取者而言,在缺乏某些 magic 机制的,即如果读取者不知道当前最新已成功提交的版本是什么的时候,仅仅读取 2 个副本并不能保证一定可以读到最新的已提交的数据。 得出一个简单的结论: 仅 仅依赖 quorum 机制 是无法保证强一致性的。因为仅有 quorum 机制时 无法确定最新已成功提交的版本号 ,除非将最新已提交的版本号作为元数据由特定的元数据服务器或元数据集群管理,否则很难确定最新成功提交的版本号。 Quorum 机制只需成功更新 N 个副本中的 W 个,在读取 R 个副本时,一定可以读到 最新的成功 提交的数据。 但由于有不成功的更新情况存在,仅仅读取 R 个副本却不一定能确定哪个版本的数据是最新的已提交的数据(简而言之,就是说我读到的结果中包含了v1,v2我可以肯定最新的数据一定是他们两种的一个,但我却没办法确定是哪一个的) 例三: 在 N=5, W=3, R=3 的系统中,某时刻副本最大版本号为(v2 v2 v2 v1 v1)。注意,这里继续假设有 v2 的副本也有 v1,上述列出的只是最大版本号。此时,最新的成功提交的副本应该 是 v2,因为从全局看 v2已经成功更新了 3 个副本。 读取任何 3 个副本,一定能读到 v2。 但仅读 3 个副本时,有可能读到(v2 v1 v1)。 此时,由于 v2蕴含 v1, 可知 v1是一个成功提交的 版本, 但却不能判定 v2一定是一个成功提交的版本。 这是因为 ,假设**副本最大版本号为(v2 v1 v1 v1 v1), 当读取 3 个副本时也可能读到v2 v1 v1) ,此时 v2是一个未成功提交的版本。 所 以在本例中,仅仅读到(v2 v1 v1)时,可以肯定的是最新的成功提交的数据要么是 v1要么是 v2,却没办法确定究竟是哪一个。 对于一个强一致性系统,应该始终读取返回最新的成功提交的数据,在 quorum 机制下,要达 到这一目的需要对读取条件做进一步加强。 1. 限制提交的 更新操作必须严格递增 ,即只有在前一个更新操作成功提交后才可以提交后一 个更新操作,从而成功提交的数据版本号必须是连续增加的。 2. 读取 R 个副本,对于 R 个副本中版本号最高的数据, 2.1 若已存在 W 个,则该数据为最新的成功提交的数据 2.2 若存在个数据少于 W 个, 假设为 X 个, 则继续读取其他副本,直若成功读取到 W 个 该版本的副本,则该数据为最新的成功提交的数据;如果在所有副本中该数据的个数肯定不满 足 W 个,则 R 中版本号第二大的为最新的成功提交的副本。 例四: 依旧接例三,在读取到(v2 v1 v1)时,继续读取剩余的副本,若读到剩余两个副本为(v2 v2)则 v2 是最新的已提交的副本;若读到剩余的两个副本为(v2 v1)或(v1 v1)则 v1是最新成功提交的版本;若读取后续两个副本有任一超时或失败,则无法判断哪个版本是最新的成功提交的版本。 可以看出,在单纯使用 Quorum 机制时,若要确定最新的成功提交的版本,最多需要读取 R+ (W-R-1)=N 个副本,当出现任一副本异常时,读最新的成功提交的版本这一功能都有可能不可用。 实际工程中,应该尽量通过其他技术手段,回避通过 Quorum 机制读取最新的成功提交的版本。例如,当 quorum 机制与 primary-secondary 控制协议结合使用时,可以通过读取 primary 的方式读取到最新的已提交的数据。 在 primary-secondary 协议中,当 primary 异常时,需要选择出一个新的 primary,之后 secondary副本与 primary 同步数据。 通常情况下,选择新的 primary 的工作是由某一中心节点完成的,在引入quorum 机制后,常用的 primary 选择方式与读取数据的方式类似,即中心节点读取 R 个副本,选择R 个副本中版本号最高的副本作为新的 primary。新 primary 与至少 W 个副本完成数据同步后作为新的 primary 提供读写服务。首先, R 个副本中版本号最高的副本一定蕴含了最新的成功提交的数据。再者,虽然不能确定最高版本号的数是一个成功提交的数据,但新的 primary 在随后与 secondary 同步数据,使得该版本的副本个数达到 W,从而使得该版本的数据成为成功提交的数据。 以上这段其实就是zk的原理 简述下就是先用Quorum 机制选择出primary(版本号最高的,版本号是严格递增的),然后再用primary-secondary来同步数据,(我一定可以读取到版本号最高的,虽然此时有可能是已提交也有可能为未提交),但我同步之后可以保证该版本号的副本数达到w,从而使得该版本号的数据成为成功提交的数据. 例五: 在 N=5, W=3, R=3 的系统中,某时刻副本最大版本号为(v2 v2 v1 v1 v1),此时 v1是 系统的最新的成功提交的数据, v2 是一个处于中间状态的未成功提交的数据。假设此刻原 primary副本异常,中心节点进行 primary 切换工作。 这类“中间态”数据究竟作为“脏数据”被删除,还是作为新的数据被同步后成为生效的数据,完全取决于这个数据能否参与新 primary 的选举。此时有以下两种情况 情况一: 若中心节点与其中 3 个副本通信成功,读取到的版本号为(v1 v1 v1),则任 选一个副本作为 primary,新 primary以 v1 作为最新的成功提交的版本并与其他副本同步,当与第 1、第 2 个副本同步数据时,由于第 1、第 2 个副本版本号大于 primary,属于脏数据,删除脏数据,然后重新同步。 情况二: 若中心节点与其他 3 个副本通信成功,读取到的版本号为(v2 v1 v1), 则选取版本号为v2 的副本作为新的 primary,之后,一旦新 primary 与其他 2 个副本完成数据同步,则符合 v2 的副本个数达到 W 个,成为最新的成功提交的副本,新 primary 可以提供正常的读写服务。 一致性算法在实现状态机这种应用时,有以下常见的问题: 1.1 一般的leader选举过程 选举的轮次 1.2 leader选举的效率 1.3 加入一个已经完成选举的集群 怎么发现已完成选举的leader? 1.4 leader选举的触发 3.3.2 异常过程的顺序 follower挂掉又连接 raft与zk的对比 1 leader选举 为什么要进行leader选举? 在实现一致性的方案,可以像base-paxos那样不需要leader选举,这种方案达成一件事情的一致性还好,面对多件事情的一致性就比较复杂了,所以通过选举出一个leader来简化实现的复杂性。 1.1 一般的leader选举过程 更多的有2个要素: 1.1.1 选举投票可能会多次轮番上演,为了区分,所以需要定义你的投票是属于哪个轮次的。 他们都需要在某个轮次内达成过半投票来结束选举过程 1.1.2 投票PK的过程,更多的是日志越新越多者获胜 在选举leader的时候,通常都希望 选举出来的leader至少包含之前全部已提交的日志 自然想到包含的日志越新越大那就越好。 通常都是比较最后一个日志记录,如何来定义最后一个日志记录? 有2种选择,一种就是所有日志中的最后一个日志,另一种就是所有已提交中的最后一个日志。目前Raft和ZooKeeper都是采用前一种方式。日志的越新越大表示:轮次新的优先,然后才是同一轮次下日志记录大的优先 ZooKeeper:peerEpoch大的优先,然后zxid大的优先 但是有一个问题就是:通过上述的日志越新越大的比较方式能达到我们的上述希望吗? 特殊情况下是不能的,这个特殊情况详细可参见我们上面描述的 这个案例就是这种比较方式会 选举出来的leader可能并不包含已经提交的日志(和我们例三分析的一样) ,而Raft的做法则是对于日志的提交多加一个限制条件,即不能直接提交之前term的已过半的entry,即把这一部分的日志限制成未提交的日志,从而来实现上述的希望。 ZooKeeper呢?会不会出现这种情况?又是如何处理的? ZooKeeper是不会出现这种情况的,因为ZooKeeper在每次leader 选举完成之后,都会进行数据之间的同步纠正,所以每一个轮次,大家都日志内容都是统一的 而Raft在leader选举完成之后没有这个同步过程,而是靠之后的AppendEntries RPC请求的一致性检查来实现纠正过程,则就会出现上述案例中隔了几个轮次还不统一的现象 1.2 leader选举的效率 Raft中的每个server在某个term轮次内只能投一次票,哪个candidate先请求投票谁就可能先获得投票,这样就可能造成split vote,即各个candidate都没有收到过半的投票,Raft通过candidate设置不同的超时时间,来快速解决这个问题,使得先超时的candidate(在其他人还未超时时)优先请求来获得过半投票** ZooKeeper中的每个server,在某个electionEpoch轮次内,可以投多次票,只要遇到更大的票就更新,然后分发新的投票给所有人。这种情况下不存在split vote现象,同时有利于选出含有更新更多的日志的server,但是选举时间理论上相对Raft要花费的多。 1.3 加入一个已经完成选举的集群 1.3.1 怎么发现已完成选举的leader? 一个server启动后(该server本来就属于该集群的成员配置之一,所以这里不是新加机器),如何加入一个已经选举完成的集群 1.3.2 加入过程是否阻塞整个请求? 这个其实还要 看对日志的设计是否是连续的 如果 是连续的,则leader中只需要保存每个follower上一次的同步位置,这样在同步的时候就会自动将之前欠缺的数据补上,不会阻塞整个请求过程(****所以为什么redis的选举算法是raft?毕竟redis单线程****) 如果 不是连续的,则在确认follower和leader当前数据的差异的时候,是需要获取leader当前数据的读锁,禁止这个期间对数据的修改。差异确定完成之后,释放读锁,允许leader数据被修改,每一个修改记录都要被保存起来,最后一一应用到新加入的follower中。 1.4 leader选举的触发 触发一般有如下2个时机 2 上一轮次的leader 2.1 上一轮次的leader的残留的数据怎么处理? 首先看下上一轮次的leader在挂或者失去leader位置之前,会有哪些数据? 一个日志是否被过半复制,是否被提交,这些信息是由leader才能知晓的,那么下一个leader该如何来判定这些日志呢? 下面分别来看看Raft和ZooKeeper的处理策略: Raft的保守策略更多是因为Raft在leader选举完成之后,没有同步更新过程来保持和leader一致(在可以对外处理请求之前的这一同步过程)。而ZooKeeper是有该过程的 2.2 怎么阻止上一轮次的leader假死的问题 这其实就和实现有密切的关系了。 3 请求处理流程 3.1 请求处理的一般流程 这个过程对比Raft和ZooKeeper基本上是一致的,大致过程都是过半复制 先来看下Raft: 再来看看ZooKeeper: 备注:数据同步过程就有点类似于两阶段提交了。 假装是图2 3.2 日志的连续性问题 在需要保证顺序性的前提下,在利用一致性算法实现状态机的时候,到底是实现连续性日志好呢还是实现非连续性日志好呢? 还有在复制和提交的时候: 其他有待后续补充 3.3 如何保证顺序 具体顺序是什么? 这个就是先到达leader的请求,先被应用到状态机。这就需要看正常运行过程、异常出现过程都是怎么来保证顺序的 3.3.1 正常同步过程的顺序 3.3.2 异常过程的顺序保证 如follower挂掉又重启的过程: ZooKeeper:重启之后,需要和当前leader数据之间进行差异的确定,同时期间又有新的请求到来,所以需要暂时获取leader数据的读锁,禁止此期间的数据更改,先将差异的数据先放入队列,差异确定完毕之后,还需要将leader中已提交的议案和未提交的议案也全部放入队列,即ZooKeeper的如下2个集合数据 ConcurrentMap<Long, Proposal> outstandingProposals ConcurrentLinkedQueue<Proposal> toBeApplied 如果是leader挂了之后,重新选举出leader,会不会有乱序的问题? 3.4 请求处理流程的异常 一旦leader发给follower的数据出现超时等异常 4 分区的应对 目前ZooKeeper和Raft都是过半即可,所以对于分区是容忍的。如5台机器,分区发生后分成2部分,一部分3台,另一部分2台,这2部分之间无法相互通信 其中,含有3台的那部分,仍然可以凑成一个过半,仍然可以对外提供服务,但是它不允许有server再挂了,一旦再挂一台则就全部不可用了。 含有2台的那部分,则无法提供服务,即只要连接的是这2台机器,都无法执行相关请求。 所以ZooKeeper和Raft在一旦分区发生的情况下是是牺牲了高可用来保证一致性,即CAP理论中的CP。但是在没有分区发生的情况下既能保证高可用又能保证一致性,所以更想说的是所谓的CAP二者取其一,并不是说该系统一直保持CA或者CP或者AP,而是一个会变化的过程。在没有分区出现的情况下,既可以保证C又可以保证A,在分区出现的情况下,那就需要从C和A中选择一样。ZooKeeper和Raft则都是选择了C。

Zookeeper深入原理

Zookeeper 的视图结构是一个树形结构,树上的每个节点称之为数据节点(即 ZNode),每个ZNode 上都可以保存数据,同时还可以挂载子节点。并且Zookeeper的根节点为 "/"。 在 Zookeeper 中,每个数据节点都是有生命周期的,其生命周期的长短取决于数据节点的节点类型。在 Zookeeper 中有如下几类节点: 每个数据节点中除了存储了数据内容之外,还存储了数据节点本身的一些状态信息(State)。 在Zookeeper 中,事务是指能够改变 Zookeeper 服务器状态的操作,我们也称之为事务操作或更新操作,一般包括数据节点创建与删除、数据节点内容更新和客户端会话创建与失效等操作。对于每一个事务请求,Zookeeper 都会为其分配一个全局唯一的事务ID,用 ZXID 来表示,通常是一个 64 位的数字。每一个 ZXID 对应一次更新操作,从这些 ZXID 中可以间接地识别出 Zookeeper 处理这些更新操作请求的全局顺序。 ZXID 是一个 64 位的数字,其中低 32 位可以看作是一个简单的单调递增的计数器,针对客户端的每一个事务请求,Leader 服务器在产生一个新的事务 Proposal 的时候,都会对该计数器进行加 1 操作;而高 32 位则代表了 Leader 周期 epoch 的编号,每当选举产生一个新的 Leader 服务器,就会从这个 Leader 服务器上取出其本地日志中最大事务 Proposal 的 ZXID,并从该 ZXID 中解析出对应的 epoch 值,然后再对其进行加 1 操作,之后就会以此编号作为新的 epoch,并将低 32 位置 0 来开始生成新的 ZXID。 Zookeeper 中为数据节点引入了版本的概念,每个数据节点都具有三种类型的版本信息(在上面的状态信息中已经介绍了三种版本信息代表的意思),对数据节点的任何更新操作都会引起版本号的变化。其中我们以 dataVersion 为例来说明。在一个数据节点被创建完毕之后,节点的dataVersion 值是 0,表示的含义是 ”当前节点自从创建之后,被更新过 0 次“。如果现在对该节点的数据内容进行更新操作,那么随后,dataVersion 的值就会变成 1。即表示的是对数据节点的数据内容的变更次数。 版本的作用是用来实现乐观锁机制中的 “写入校验” 的。例如,当要修改数据节点的数据内容时,带上版本号,如果数据节点的版本号与传入的版本号相等,就进行修改,否则修改失败。 Zookeeper 提供了分布式数据的发布/订阅功能。一个典型的发布/订阅模型系统定义了一种一对多的订阅关系,能够让多个订阅者同时监听某一个主题对象,当这个主题对象自身状态变化时,会通知所有订阅者,使它们能够做出相应的处理。在 Zookeeper 中,引入了 Watcher 机制来实现这种分布式的通知功能。Zookeeper 允许客户端向服务端注册一个 Watcher 监听,当服务端的一些指定事件触发了这个 Watcher,那么就会向指定客户端发送一个事件通知来实现分布式的通知功能。 从上图可以看出 Zookeeper 的 Watcher 机制主要包括客户端线程、客户端WatchMananger 和 Zookeeper 服务器三部分。在具体工作流程上,简单地讲,客户端在向 Zookeeper 服务器注册 Watcher 的同时,会将 Watcher 对象存储在客户端的 WatchMananger 中。当 Zookeeper 服务器端触发 Watcher 事件后,会向客户端发送通知,客户端线程从 WatchManager 中取出对应的 Watcher 对象来执行回调逻辑。 Watcher是一个接口,任何实现了Watcher接口的类就是一个新的Watcher。Watcher内部包含了两个枚举类:KeeperState、EventType 注 :客户端接收到的相关事件通知中只包含状态及类型等信息,不包括节点变化前后的具体内容,变化前的数据需业务自身存储,变化后的数据需调用get等方法重新获取; 上面讲到zookeeper客户端连接的状态和zookeeper对znode节点监听的事件类型,下面我们来讲解如何建立zookeeper的watcher监听。在zookeeper中采用zk.getChildren(path, watch)、zk.exists(path, watch)、zk.getData(path, watcher, stat)这样的方式为某个znode注册监听。 下表以node-x节点为例,说明调用的注册方法和可监听事件间的关系: Zookeeper 中提供了一套完善的 ACL(Access Control List)权限控制机制来保障数据的安全。 ACL 由三部分组成,分别是:权限模式(Scheme)、授权对象(ID)和权限(Permission),通常使用“scheme: u200bid:permission”来标识一个有效的ACL 信息。下面分别介绍: 1.7.4、ACL 超级管理员 zookeeper的权限管理模式有一种叫做super,该模式提供一个超管可以方便的访问任何权限的节点 假设这个超管是:super:admin,需要先为超管生成密码的密文 那么打开zookeeper目录下的/bin/zkServer.sh服务器脚本文件,找到如下一行: 这就是脚本中启动zookeeper的命令,默认只有以上两个配置项,我们需要加一个超管的配置项 那么修改以后这条完整命令变成了 之后启动zookeeper,输入如下命令添加权限 在服务器集群初始化阶段,我们以 3 台机器组成的服务器集群为例,当有一台服务器server1 启动的时候,它是无法进行 Leader 选举的,当第二台机器 server2 也启动时,此时这两台服务器已经能够进行互相通信,每台机器都试图找到一个 Leader,于是便进入了 Leader 选举流程。 在zookeeper运行期间,leader与非leader服务器各司其职,即便当有非leader服务器宕机或新加入,此时也不会影响leader,但是一旦leader服务器挂了,那么整个集群将暂停对外服务,进入新一轮leader选举,其过程和启动时期的Leader选举过程基本一致。 假设正在运行的有server1、server2、server3三台服务器,当前leader是server2,若某一时刻leader挂了,此时便开始Leader选举。选举过程如下: observer角色特点: 为了使用observer角色,在任何想变成observer角色的配置文件中加入如下配置: 并在所有server的配置文件中,配置成observer模式的server的那行配置追加:observer,例如:

zoo怎么读和解释

zoo(动物园); zag 急转; zany 滑稽的; zap 制服;打败; zapper 电视的遥控器; zax 石斧; zeal 热心; Zap 攻击,打败,快速移动; Zealous 热心的,积极的; Zebra 斑马; Zen 禅; Zenith 顶点,最高峰; Zest 风味,热心; 扩展资料   Zip 给……以速度,拉链;   Zit 青春痘,面包;   Zodiac 黄道带,十二宫图;   Zombie 僵尸;   Zone 区域;   Zonked 使惊呆;醉酒的;   Zoo 公园;   Zoom 急速上升,使摄像机移动;   Zucchini 西葫芦;

zoo的单词怎么写?

zoo(动物园); zag 急转; zany 滑稽的; zap 制服;打败; zapper 电视的遥控器; zax 石斧; zeal 热心; Zap 攻击,打败,快速移动; Zealous 热心的,积极的; Zebra 斑马; Zen 禅; Zenith 顶点,最高峰; Zest 风味,热心; 扩展资料   Zip 给……以速度,拉链;   Zit 青春痘,面包;   Zodiac 黄道带,十二宫图;   Zombie 僵尸;   Zone 区域;   Zonked 使惊呆;醉酒的;   Zoo 公园;   Zoom 急速上升,使摄像机移动;   Zucchini 西葫芦;

zoo的单词有哪些

zoo(动物园); zag 急转; zany 滑稽的; zap 制服;打败; zapper 电视的遥控器; zax 石斧; zeal 热心; Zap 攻击,打败,快速移动; Zealous 热心的,积极的; Zebra 斑马; Zen 禅; Zenith 顶点,最高峰; Zest 风味,热心; 扩展资料   Zip 给……以速度,拉链;   Zit 青春痘,面包;   Zodiac 黄道带,十二宫图;   Zombie 僵尸;   Zone 区域;   Zonked 使惊呆;醉酒的;   Zoo 公园;   Zoom 急速上升,使摄像机移动;   Zucchini 西葫芦;

zoo有哪些单词?

zoo(动物园); zag 急转; zany 滑稽的; zap 制服;打败; zapper 电视的遥控器; zax 石斧; zeal 热心; Zap 攻击,打败,快速移动; Zealous 热心的,积极的; Zebra 斑马; Zen 禅; Zenith 顶点,最高峰; Zest 风味,热心; 扩展资料   Zip 给……以速度,拉链;   Zit 青春痘,面包;   Zodiac 黄道带,十二宫图;   Zombie 僵尸;   Zone 区域;   Zonked 使惊呆;醉酒的;   Zoo 公园;   Zoom 急速上升,使摄像机移动;   Zucchini 西葫芦;

zoo有哪些单词?

zoo(动物园); zag 急转; zany 滑稽的; zap 制服;打败; zapper 电视的遥控器; zax 石斧; zeal 热心; Zap 攻击,打败,快速移动; Zealous 热心的,积极的; Zebra 斑马; Zen 禅; Zenith 顶点,最高峰; Zest 风味,热心; 扩展资料   Zip 给……以速度,拉链;   Zit 青春痘,面包;   Zodiac 黄道带,十二宫图;   Zombie 僵尸;   Zone 区域;   Zonked 使惊呆;醉酒的;   Zoo 公园;   Zoom 急速上升,使摄像机移动;   Zucchini 西葫芦;

goodmorningzoom中文怎么读?

古德猫宁唔

helloiimzoom怎么读

英文原文:hello,I"m Zoom英式音标:[hu0259u02c8lu0259u028a; he-] , [au026am] [zum] 美式音标:[hu025bu02c8lou02cc hu0259-] , [au026am] [zum]

ZOOM谐音

用英文代替一下吧:zoo木zoo(动物园)知道怎么读吧?加上个“木”就可以了“木”在这里发清音

zoom的读音是什么?

zoom读音:[zuu02d0m]。zoom,英语单词,动词、名词、感叹词,作动词时意为“(尤指汽车、飞机等)疾行;(价格、费用等)急剧增长,猛涨;(使镜头或摄影机)推近或拉远”。作名词时意为“(车辆等)疾驰的声音,嗡嗡声;变焦摄影;急速上升”,作感叹词时意为“(用于表示突然的快速移动)嗖地”。例句:At 100% zoom, you can see our little cracks.在100%变焦,你可以看到我们的小裂纹。You can rotate the chart and zoom in on areas of interest.您可以旋转和缩放图表,在对感兴趣的领域。After you zoom in to a picture, you can use a simple swiping motion with your mouse or finger to move to the next picture.在你放大一张照片之后,用你的鼠标或者用手指做一个简单的翻页手势就可以移到下一张图片了。

"2倍变焦"或"2x optical zoom"怎么用英语口语说出来,即"x"怎么读

二倍变焦是 2x zoom 读作 [tu:] [eks] [zu:m],2x optical zoom是二倍光学变焦的意思读作[tu:] [eks] ["u0254ptiku0259l] [zu:m],x就读[eks] 艾克斯。
 1 2 3 4 5 6  下一页  尾页