Master选举
1 什么是Master选举
集群是分布式系统中不可或缺的组成部分,是为了解决分布式系统中计算单元的单点问题,水平扩展计算单元的处理能力的一种解决方案。
一般情况下,会在群集中选举出一个Master,用于协调集群中的其它Slave主机,对于Slave主机的状态具有决定权。
例如,读写分离集群,Master处理写请求,Slave处理读请求(主从集群)
再如,对于复杂处理逻辑的系统,Master负责处理复杂逻辑计算,然后将计算结果写入到一个中间存储系统(DB,或DFS等),Slave负责从中间存储系统中读取结果,并向读请求进行响应。
2 广告推荐系统(举例)
需求:系统会根据用户画像,将用户归结为不同的种类。系统会为不同种类的用户推荐不同的广告。每个用户前端需要从广告推荐系统中获取到不同的广告ID。
分析:这个向前端提供服务的广告推荐系统一定是一个集群,这样可以更加快速高效的为前端进行响应。需要注意,推荐系统对于广告ID的计算是一个相对复杂且消耗CPU等资源的过程。如果让集群中每一台主机都可以执行这个计算逻辑的话,那么势必会形成资源浪费,且降低了响应效率。此时,可以只让其中的一台主机去处理计算逻辑,然后将计算的结果写入到某中间存储系统中,并通知集群中的其它主机从该中间存储系统中共享该计算结果。那么,这个运行计算逻辑的主机就是Master,而其它主机则为Slave。
Master选举:这个广告推荐系统集群中的Master是如何选举出来的呢?使用zk可以完成。使用zk中多个客户端对同一节点创建时,只有一个客户端可以成功的特性实现。
- Step1:多个客户端同时发起对同一个临时节点进行创建的请求,最终只能有一个创建成功,这个创建成功的客户端就是Master,其它客户端就是Slave
- Step2:让所有Slave都向这个临时节点的父节点注册一个子节点列表的watcher监听。
- Step3:一旦该Master宕机,临时节点就会消失,zk服务器就会向所有Slave发送事件,Slave在接收到事件后会调用相应的回调,该回调会重新向这个父节点创建相应的临时子节点。谁创建成功,则谁就是新的Master。
注:使用DBMS也可以完成Master的选举,但Master宕机后,无法实现自动Master重选。
分布式同步
1 什么是分布式同步
分布式同步,也称为分布式协调,是分布式系统中不可缺少的环节,是将不同的分布式组件有机结合起来的关键。对于一个在多台机器上运行的应用而言,通常需要一个协调者来控制整个系统的运行流程,例如执行的先后顺序,或执行与不执行等。
2 MySQL数据复制总线(举例)
以“MySQL数据复制总线”为例来分析zk的分布式同步服务。
1)数据复制总线组成
MySQL数据复制总线是一个实时数据复制框架,用于在不同的MySQL数据库实例间进行异步数据复制,其核心部分由三部分组成:生产者、复制管道、消费者。
MySQL数据复制总线系统中哪里需要使用zk的分布式同步功能呢?以上结构中可以显示看到存在的问题:replicator存在单点问题。为了解决这个问题,就需要为其设置多个热备主机。这些热备主机协调工作就需要使用zk来做,即由zk来完成分布式同步工作。
2)数据复制总线工作原理
MySQL复制总线的工作步骤,总的来说分为三步:
A、复制任务注册
复制任务注册实际就是指不同的复制任务在zk中创建不同的znode,即将复制任务注册到zk中。
- 在复制总结系统启动时,首先会在zk中创建相应的复制任务总节点/mysql/tasks
- 当replicator线程启动时,就会在/mysql/tasks/pay
B、replicator热备
复制任务是由replicator主机完成,为了防止replicator在复制过程中出现故障,replicator采用热备容灾方案,即将同一个复制任务部署到多个不同的replicator主机上,但仅使一个处于RUNNING状态,而其它的主机则处于STANDBY状态。当RUNNING状态的主机出现故障,无法完成复制任务时,使某一个STANDBY状态主机转换为RUNNING状态,继续完成复制任务。
具体实现步骤:
- 在相应任务节点下创建一个用于管理replicator主机的节点/mysql/tasks/pay/instances
- 在/mysql/tasks/pay/instances节点下为每一台replicator主机创建一个相应的临时顺序节点,将序号最小的节点设置为RUNNING,其它设置为STANDBY。
- 在任务节点/mysql/tasks/pay下创建一个状态子节点,将当前replicator主机的状态信息写入到该节点内容中。
C、主备切换
当RUNNING态的主机出现宕机,则该主机对应的子节点马上就被删除了,然后在当前处于STANDBY状态中的replicator中找到序号最小的子节点,然后将其状态马上修改为RUNNING,完成“主备切换”。