李欣:ZooKeeper在携程的使用及前景.pdf

上传人:爱问知识人 文档编号:3333876 上传时间:2019-08-13 格式:PDF 页数:43 大小:5.69MB
返回 下载 相关 举报
李欣:ZooKeeper在携程的使用及前景.pdf_第1页
第1页 / 共43页
李欣:ZooKeeper在携程的使用及前景.pdf_第2页
第2页 / 共43页
李欣:ZooKeeper在携程的使用及前景.pdf_第3页
第3页 / 共43页
李欣:ZooKeeper在携程的使用及前景.pdf_第4页
第4页 / 共43页
李欣:ZooKeeper在携程的使用及前景.pdf_第5页
第5页 / 共43页
点击查看更多>>
资源描述

《李欣:ZooKeeper在携程的使用及前景.pdf》由会员分享,可在线阅读,更多相关《李欣:ZooKeeper在携程的使用及前景.pdf(43页珍藏版)》请在三一文库上搜索。

1、ZooKeeperZooKeeperZooKeeperZooKeeper在携程的使用和场景在携程的使用和场景 介绍介绍 携程技术研发中心 Li, Bruce 2012/09/05 议程 序 携程技术研发中心简介 第一部分 Zookeeper的一般介绍 第二部分 在携程的应用和使用场景介绍 Q&A 携程技术研发中心 对技术研发投入不断增大 对基础框架愈发重视 鼓励内部使用更多优秀的开源软件 同开发社区的互动将不断加强 第一部分 Zookeeper的一般介绍 Apache Zookeeper项目简介 自2010年10月升级成Apache Software Foundation(ASF)顶级项目 分

2、布式协调服务,提供以下功能: 组管理服务 分布式配置服务 分布式同步服务 分布式命名服务 谁在使用Zookeeper 开源软件: HBase Solr Storm Neo4j 公司 Yahoo Rackspace LinkedIn Twitter Taobao Ctrip Zookeeper架构 客户端随机连接集群中任何一台server 集群内所有server基于Zab(ZooKeeper Atomic Broadcast)协议进 行通信 集群内部根据算法自动选举出一个leader,负责向follower(其他 server)广播所有变化消息 集群中每个follower都和leader通信 F

3、ollower接收来自leader的所有变化消息,保存在自己内存 Follower转发来自客户端的写请求给leader 客户端的读请求会在follower端直接服务,无需转发给leader ZAB(ZooKeeper Atomic Broadcast)协议 2011年Yahoo公开了Zab协议论文 选举leader,只有leader才能提出决议 没有abort的两段式提交 基于状态增量的消息传输 高可用高性能 参考:http:/ ZooKeeper数据模型 基于树形结构的命名空间,与文件系统类似 节点(znode)都可以存数据,可以有子节点 节点不支持重命名 数据大小不超过1MB(可配置) 数

4、据读写要保证完整性 ZooKeeper基本API string create(path, data, acl, flags) delete(path, expected_version) stat set_data(path, data, expected_version) (data, stat) get_data(path, watch) stat exists(path, watch) string get_children(path, watch) Znode节点类型 Sequential节点和non-sequential节点 Ephemeral节点和persistent节点 Sequ

5、ential/non-sequential节点类型 Non-sequential节点不能有重名 Sequential节点 创建时可重名 实际生成节点名末尾自动添加一个10位长度、左边以0填充的单调递增数 字 Ephemeral/Persistent节点类型 Ephemeral节点在客户端session结束或超时后自 动删除 Persistent节点生命周期和session无关,只能显 式删除 ZooKeeper Session 客户端和server间采用长连接 连接建立后,server产生session ID(64位)返还 给客户端 客户端定期发送ping包来检查和保持和server的 连接

6、一旦session结束或超时,所有ephemeral节点会 被删除 客户端可根据情况设置合适的session超时时间 ZooKeeper Watches Watch是客户端安装在server的事件侦听方法 当侦听的变化发生时,server发消息给客户端进行通知 客户端使用单线程对所有事件按顺序同步回调 触发回调条件: 客户端连接、断开连接 节点数据发生改变 节点本身发生变化 ZooKeeper Watches续 Watch是单发的,每次触发后会被自动删除 如果需要再次侦听事件,必须重新安装 watch 无法保证跟踪到每一个变化 避免安装大量watches侦听在同一个节点 Watch的创建和触发

7、规则 触发事件触发事件 createcreatedeletedeletesetDatasetData znodechildznodechildznode 创建创建WatchWatch的的 APIAPI existexistNodeCreated NodeDeleted NodeDataChanged getDatagetData NodeDeleted NodeDataChanged getChildrengetChildren NodeChildrenChangedNodeDeleted NodeChildrenChange d ZooKeeper Observer Observer不参与选

8、举,永远是follower Observer数量增加 进一步提升集群的服务能力 不会增加重新选举leader的开销 很好地支持跨数据中心,本地读、异地写 ZooKeeper陷阱 在客户端事件回调实现有阻塞调用 试图跟踪每个状态变化 大量watch侦听同一个znode的状态变化 客户端会有需要长时间处理的GC(garbage collection) Session超时后上层应用不进行恢复处理 第二部分 ZooKeeper在携程的应用和使用 场景 携程.net ZooKeeper Stack ZooKeeper .net client (3rdparty) 携程携程客户端封装层客户端封装层 携程携

9、程ZooKeeperZooKeeper应用框架层应用框架层 把Java客户端移植到.net 封装成可靠API 基于.net封装,为不同用例提供 支持,如Master/Slave,Hot Standby,Sequence Generator,Distributed Locking Service,等等 第三方.net客户端 较成熟开源的zookeeper .net客户端 http:/ 能支持ZooKeeper最新的3.4.3版本 从Java的zookeeper客户端移植而来 相对于其他.net客户端实现,ewhauser代码质量较高 我们发现一些小bug,内部已经修正,正同原作者进行联 系,提交

10、bug报告 ZooKeeper封装层 为什么需要额外的封装层 .net客户端底层不提供可靠API支持 出现连接的问题时很难恢复 直接使用极易出错 封装层的连接管理 CONNECTION_LOSS的处理 底层会挑选下个服务器进行重连,以自动恢复 封装层必须有重试机制,确保在重连后检查状态并正确处理 封装层的恢复策略必须区分幂等调用与非幂等调用 要特别当心创建sequential节点调用 SESSION_EXPIRED的处理 向框架报告错误 由框架决定如何恢复所有的ephemeral节点 框架支持的场景 Master/Slave 解决单点故障问题 Hot Standby 解决一组服务器的HA问题

11、Distributed Configuration 配置管理 Sequence Generation 序列产生器 Distributed Locking Service 分布式锁方案 场景1:Job调度系统存在单点故障 关键组件(如JobScheduler)只有单实例运行,无HA保障 Job SchedulerJob SchedulerJob SchedulerJob Scheduler Job Config DBJob Config DBJob Config DBJob Config DB read Job WorkerJob WorkerJob WorkerJob WorkerJob Wo

12、rkerJob WorkerJob WorkerJob WorkerJob WorkerJob WorkerJob WorkerJob WorkerJob WorkerJob WorkerJob WorkerJob Worker JobJobJobJob SPOFSPOF schedule Master/Slave实现 只在无法做到active-active时考虑 父节点类型为persistent 子节点类型为ephemeral + sequential 客户端启动时创建子节点 序列号最小的子节点选为master,其他 子节点都是slave 每个slave侦听序列号比它小的子节点中 最大的子节

13、点的NodeDeleted事件 一旦NodeDeleted事件被触发,该slave 客户端会重新选定侦听对象,如果不存 在可侦听对象,该slave自动晋升成 master / / / / /MSGroupMembers/MSGroupMembers/MSGroupMembers/MSGroupMembers Zookeeper ServiceZookeeper ServiceZookeeper ServiceZookeeper Service /MR0000000023/MR0000000023/MR0000000023/MR0000000023 /MR0000000024/MR0000000

14、024/MR0000000024/MR0000000024 /MR0000000025 /MR0000000025 /MR0000000025 /MR0000000025 /MR/MR/MR/MR MasterMasterMasterMaster Client1Client1Client1Client1Client2Client2Client2Client2Client3Client3Client3Client3Client4Client4Client4Client4 Create Watch Job调度系统单点故障解决方案 Job SchedulerJob SchedulerJob Sche

15、dulerJob Scheduler (mastermastermastermaster) Job Config DBJob Config DBJob Config DBJob Config DB read Job WorkerJob WorkerJob WorkerJob WorkerJob WorkerJob WorkerJob WorkerJob WorkerJob WorkerJob WorkerJob WorkerJob WorkerJob WorkerJob WorkerJob WorkerJob Worker JobJobJobJob Job SchedulerJob Sched

16、ulerJob SchedulerJob Scheduler (slaveslaveslaveslave) ZooKeeper ZooKeeper ServiceService schedule 场景2:Forever Running Job 需求: 调度太频繁,需要把此类Job转变成Forever Running Job 不断发心跳请求到JobWorker以监控Job运行状态,负担 较重 能处理以下情况: Job实例意外退出 机器意外宕机情况 Forever Running Job的组管理实现 JobWorker在启动forever running job实例时,先试图创建以JobId命名的

17、 ephemeral/non-sequential的Job子节点 如果无法创建该子节点,说明已有同名Job实例在运行,本次实例启动中止 如果Job子节点创建成功,则JobScheduler侦听该节点的NodeDeleted事件 如果NodeDeleted事件发生, JobScheduler将能接受到通知,并重新调度启 动新Job实例 / / / / /ForeverRunningJobs/ForeverRunningJobs/ForeverRunningJobs/ForeverRunningJobs Zookeeper ServiceZookeeper ServiceZookeeper Ser

18、viceZookeeper Service /Job1/Job1/Job1/Job1 / Job2/ Job2/ Job2/ Job2 /Job3 /Job3 /Job3 /Job3 /Job/Job/Job/Job Job SchedulerJob SchedulerJob SchedulerJob Scheduler (master)(master)(master)(master) Job SchedulerJob SchedulerJob SchedulerJob Scheduler (slave)(slave)(slave)(slave) Job WorkerJob WorkerJob

19、 WorkerJob Worker Job WorkerJob WorkerJob WorkerJob Worker Job WorkerJob WorkerJob WorkerJob Worker Create Watch 场景3: Job调度系统继续演化 问题:太多Job需要处理,导致单个JobScheduler成为瓶颈,需要做 sharding。多个JobScheduler实例同时运行,则需要HA保护 Job SchedulerJob SchedulerJob SchedulerJob Scheduler (instance1instance1instance1instance1) Jo

20、b Config DBJob Config DBJob Config DBJob Config DB read Job WorkerJob WorkerJob WorkerJob WorkerJob WorkerJob WorkerJob WorkerJob WorkerJob WorkerJob WorkerJob WorkerJob WorkerJob WorkerJob WorkerJob WorkerJob Worker Job=9Job=9Job=9Job=9 Job SchedulerJob SchedulerJob SchedulerJob Scheduler (instance

21、2instance2instance2instance2) JobId mod 2 = 0JobId mod 2 = 0JobId mod 2 = 0JobId mod 2 = 0JobId mod 2 = 1JobId mod 2 = 1JobId mod 2 = 1JobId mod 2 = 1 Job=10Job=10Job=10Job=10 Job=13Job=13Job=13Job=13 schedule Hot Standby实现 预定义X个角色,Y个hot standby,因此一共需要 X+Y个客户端 创建X个persistent/non-seq节点作为角色节点, 其数据将存放某

22、个客户端子节点的序列号 客户端启动时,创建ephemeral+sequential子节点 ,然后检查并获得当前活动的其他客户端的子节 点 客户端扫描每个角色节点的数据,如果某个角色 节点的数据中存放的序列号已关联到某个活动客 户端的子节点,或序列号比自己的大,那么跳过 该角色节点 否则,就用自己的序列号更新该角色节点的数据 (带期望版本号)。如果赋值成功,则客户端运 行该角色的应用逻辑 如果无法找到任何角色节点进行赋值,则客户端 自动成为hot standby,删除其创建的子节点,监 控所有其他执行角色任务的客户端子节点的 NodeDeleted事件 Zookeeper ServiceZook

23、eeper ServiceZookeeper ServiceZookeeper Service Client1Client1Client1Client1Client2Client2Client2Client2Client3Client3Client3Client3 / / / / /Instances/Instances/Instances/Instances /HS0000000024/HS0000000024/HS0000000024/HS0000000024 /HS0000000025 /HS0000000025 /HS0000000025 /HS0000000025 /HS000000

24、0026/HS0000000026/HS0000000026/HS0000000026 /Roles/Roles/Roles/Roles /Role1/Role1/Role1/Role1 /Role2/Role2/Role2/Role2 Data = Data = Data = Data = “ “ “ “HS0000000024HS0000000024HS0000000024HS0000000024” ” ” ” Data = Data = Data = Data = “ “ “ “HS0000000025“HS0000000025“HS0000000025“HS0000000025“ St

25、andbyStandbyStandbyStandby Create Watch Job调度系统Hot Standby解决方案 Job SchedulerJob SchedulerJob SchedulerJob Scheduler (instance1instance1instance1instance1) Job Config DBJob Config DBJob Config DBJob Config DB read Job SchedulerJob SchedulerJob SchedulerJob Scheduler (instance2instance2instance2instan

26、ce2) JobId mod 2 = 0JobId mod 2 = 0JobId mod 2 = 0JobId mod 2 = 0 JobId mod 2 = 1JobId mod 2 = 1JobId mod 2 = 1JobId mod 2 = 1 Job WorkerJob WorkerJob WorkerJob WorkerJob WorkerJob WorkerJob WorkerJob WorkerJob WorkerJob WorkerJob WorkerJob WorkerJob WorkerJob WorkerJob WorkerJob Worker Job=9Job=9Jo

27、b=9Job=9 Job=10Job=10Job=10Job=10 Job=13Job=13Job=13Job=13 schedule Job SchedulerJob SchedulerJob SchedulerJob Scheduler (standbystandbystandbystandby) ZooKeeperZooKeeperZooKeeperZooKeeper ServiceServiceServiceService 场景4:分配订单号 需求: 分配全局唯一的连续单调递增序列值 32位序列号产生器实现 为每一个sequence对象创建一个 persisent节点 调用set_da

28、ta,把期望的数据版本号 设成-1,zookeeper将不做期望版本 号校验,调用总会成功,该节点的数 据版本号自动+1 调用返回时,同时会返回当前的数据 版本号 客户端把返回的数据版本号作为序列 号 优点:一次调用即可分配序列号 缺点:受限于数据版本号,只能分配 32位序列号 SetData / / / / /Sequences/Sequences/Sequences/Sequences /Sequence2/Sequence2/Sequence2/Sequence2 /Sequence1/Sequence1/Sequence1/Sequence1 ZooKeeper ServiceZooK

29、eeper ServiceZooKeeper ServiceZooKeeper Service Version = 24Version = 24Version = 24Version = 24 Client1Client1Client1Client1 Client2Client2Client2Client2 Version = 25Version = 25Version = 25Version = 25 Version = -1Version = -1Version = -1Version = -1 return 更高位序列号产生器实现 为每一个sequence对象创建一个 persisent

30、节点 在节点的数据中存放最后分配的序列号 调用get_data,得到当前的节点数据的版 本号和节点数据(即最后分配的序列号) 将取回的节点数据和版本号同时+1,调 用set_data,把新的数据版本号作为期望 版本号,把新的数据作为期望数据 如果set_data成功,则客户端就可以直接 将新数据作为新的序列号进行分配。反之 ,如果失败,则重新开始get_data过程 优点:可以产生大于32位的序列号 缺点:多步调用,且有竞争可能。如果竞 争过多,可考虑使用分布式锁 SetData / / / / /Sequences/Sequences/Sequences/Sequences /Sequenc

31、e2/Sequence2/Sequence2/Sequence2 /Sequence1/Sequence1/Sequence1/Sequence1 ZooKeeper ServiceZooKeeper ServiceZooKeeper ServiceZooKeeper Service Data = 25,Data = 25,Data = 25,Data = 25, Version = 25 Version = 25 Version = 25 Version = 25 Client1Client1Client1Client1 Client2Client2Client2Client2 Data =

32、 26Data = 26Data = 26Data = 26 Version = 26 Version = 26 Version = 26 Version = 26 场景5:网站操作任务许可系统 需求: 众多网站操作任务,同时运行可能会相互 冲突,需要互斥,如: 基于依赖关系的发布任务 一些正常的日程运营维护任务 对于某pool的维护 对于单台机器的维护 网站紧急维护 分布式锁实现 每个锁对象节点是persistent节点 客户端申请锁时,先在锁对象节点下 创建ephemeral + sequential子节点 客户端检查该锁对象节点下的所有子 节点 如果客户端发现自己的子节点拥有最 小的序列

33、号,则说明该客户端拥有了 锁 解锁时,拥有锁的客户端只需删除自 己的子节点 如果客户端发现申请锁失败,就侦听 序列号比自己小的子节点中最大的子 节点的NodeDeleted事件 如果NodeDeleted事件触发,则客户 端重新检查锁对象节点下的所有子节 点 / / / / /Locks/Locks/Locks/Locks /Lock2/Lock2/Lock2/Lock2 /Lock0000000004/Lock0000000004/Lock0000000004/Lock0000000004 /Lock1/Lock1/Lock1/Lock1 /Lock0000000005/Lock000000

34、0005/Lock0000000005/Lock0000000005 /Lock0000000006/Lock0000000006/Lock0000000006/Lock0000000006 Lock OwnerLock OwnerLock OwnerLock Owner ZooKeeper ServiceZooKeeper ServiceZooKeeper ServiceZooKeeper Service Client1Client1Client1Client1 Client2Client2Client2Client2 Client3Client3Client3Client3 watch c

35、reate 场景6:生产配置发布系统 需求: 如果采用配置推送方式,步骤太多且易出错,排障困难 能控制一个pool内的配置更新速度 WebAppWebAppWebAppWebApp WebAppWebAppWebAppWebApp WebAppWebAppWebAppWebApp Pool 1 WebAppWebAppWebAppWebApp WebAppWebAppWebAppWebApp WebAppWebAppWebAppWebApp Pool X WebAppWebAppWebAppWebApp AgentAgentAgentAgent Release SystemRelease Sy

36、stemRelease SystemRelease System Config DBConfig DBConfig DBConfig DB read push config 分布式配置实现 为每个pool分配结构化的路径,除app的实例节点外,其余节点均为persistent节点 app实例在相应pool的相应版本节点下创建ephemeral子节点,并侦听该子节点的 NodeDataChanged通知 配置为key/value集合,存放在各个节点的数据中 需要app实例更新配置时,调用set_data以触发app实例节点的NodeDataChanged事件 app从根节点开始依次读取各个父节点

37、配置,将所有配置合并后,实时更新app配置 /BuildVer1/BuildVer1/BuildVer1/BuildVer1 /BuildVer2/BuildVer2/BuildVer2/BuildVer2 / / / / /DataCenter1/DataCenter1/DataCenter1/DataCenter1 /Pool2/Pool2/Pool2/Pool2 /WebApp1/WebApp1/WebApp1/WebApp1 / WebApp2/ WebApp2/ WebApp2/ WebApp2 /WebApp3/WebApp3/WebApp3/WebApp3 /Pool1/Pool

38、1/Pool1/Pool1 WebApp1 (v1)WebApp1 (v1)WebApp1 (v1)WebApp1 (v1) WebApp2 (v1)WebApp2 (v1)WebApp2 (v1)WebApp2 (v1) WebApp3 (v2)WebApp3 (v2)WebApp3 (v2)WebApp3 (v2) Pool 1 Create & watch ZooKeeper ServiceZooKeeper ServiceZooKeeper ServiceZooKeeper Service Key1=v1Key1=v1Key1=v1Key1=v1 key2= v2key2= v2key

39、2= v2key2= v2 Key1=v1Key1=v1Key1=v1Key1=v1 key3= v3key3= v3key3= v3key3= v3 Key1=v1Key1=v1Key1=v1Key1=v1 key4= v4key4= v4key4= v4key4= v4 Key1=v1Key1=v1Key1=v1Key1=v1 key2=v2key2=v2key2=v2key2=v2 Key3=v3Key3=v3Key3=v3Key3=v3 Key4=v4Key4=v4Key4=v4Key4=v4 生产配置发布系统解决方案 App Config DBApp Config DBApp Con

40、fig DBApp Config DB ConfigSyncConfigSyncConfigSyncConfigSync read sync ZooKeeperZooKeeperZooKeeperZooKeeper ServiceServiceServiceService WebAppWebAppWebAppWebApp WebAppWebAppWebAppWebApp WebAppWebAppWebAppWebApp Pool1 WebAppWebAppWebAppWebApp WebAppWebAppWebAppWebApp WebAppWebAppWebAppWebApp Pool X WebAppWebAppWebAppWebApp WebAppWebAppWebAppWebApp WebAppWebAppWebAppWebApp Pool2 watch Q&A

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 建筑/环境 > 装饰装潢


经营许可证编号:宁ICP备18001539号-1