副问题[/!--empirenews.page--]
布式体系为担保数据高可用,必要为数据生涯多个副本,随之而来的题目是如安在差异副本间同步数据?差异的同步机制有差异的结果和价钱,本文实行对常见漫衍式组件的同步机制做一个小结。

常识趣制
有一些常用的同步机制,对它们也有很多评价的维度,先看看大神的 经典总结 :

上图给出了常用的同步方法(小我私人领略,请品评指正):
- Backup,即按期备份,对现有的体系的机能根基没有影响,但节点宕机时只能始末规复
- Master-Slave,主从复制,异步复制每个指令,可以看作是粒度更细的按期备份
- Multi-Muster,多主,也称“主主”,MS 的增强版,可以在多个节点上写,过后再想步伐同步
- 2 Phase-Commit,二阶段提交,同步先确保关照到全部节点再写入,机能轻易卡在“主”节点上
- Paxos,相同 2PC,统一时候有多个节点可以写入,也只必要关照到大大都节点,有更高的吞吐
同步方法分两类,异步的机能好但也许稀有据丢失,同步的能担保不丢数据但机能较差。同种方法的算法也能有所晋升(如 Paxos 对付 2PC),但实现的难度又很高。实现上只能在这几点长举办衡量。
思量同步算法时,必要思量节点宕机、收集阻断等妨碍气象。下面,我们来看看一些漫衍式组件的数据同步机制,首要思量数据写入哀求怎样被处理赏罚,时代也许会涉及怎样读数据。
Redis
Redis 3.0 开始引入 Redis Cluster 支持集群模式,小我私人以为它的计划很大度,各人可以看看 官方文档 。
- 回收的是主从复制,异步同步动静,极度环境会丢数据
- 只能从主节点读写数据,从节点只会拒绝并让客户端重定向,不会转发哀求
- 假如主节点宕机一段时刻,从节点中会自动选主
- 假准时代稀有据纷歧致,以最新选出的主节点的数据为准。
一些计划细节:
- HASH_SLOT = CRC16(Key) mod 16384
- MEET
- WAIT
Kafka
Kafka 的分片粒度是 Partition,每个 Partition 可以有多个副本。副本同步计划参考 官方文档
- 相同于 2PC,节点分主从,同步更新动静,除非节点全挂,不然不会丢动静
- 动静发到主节点,主节点写入后守候“全部”从节点拉取该动静,之后关照客户端写入完成
- “全部”节点指的是 In-Sync Replica(ISR),相应太慢或宕机的从节点会被踢除
- 主节点宕机后,从节点推举成为新的主节点,继承提供处事
- 主节点宕机时正在提交的修改没有做担保(动静也许没有 ACK 却提交了)
一些计划细节:
- 当前斲丧者只能从主节点读取数据,将来也许会改变
- 主从的粒度是 partition,每个 broker 对付某些 Partition 而言是主节点,对付另一些而言是从节点
- Partition 建设时,Kafka 会只管让 preferred replica 匀称漫衍在各个 broker
- 选主由一个 controller 跟 zookeeper 交互后“内定”,再通过 RPC 关照详细的主节点 ,此举能防备 partition 过多,同时选主导致 zk 过载。

ElasticSearch
ElasticSearch 对数据的存储需求和 Kafka 很相同,计划也很相同,具体可见 官方文档 。
ES 中有 master node 的观念,它现实的浸染是对集群状态举办打点,跟数据的哀求无关。为了上下文同等性,我们称它为打点节点,而称 primary shard 为“主节点”, 称 replica shard 为从节点。ES 的计划:
- 相同于 2PC,节点分主从,同步更新动静,除非节点全挂,不然不会丢动静
- 动静发到主节点,主节点写入乐成后并行发给从节点,比及从节点所有写入乐成,关照客户端写入完成
- 打点节点会维护每个分片必要写入的从节点列表,称为 in-sync copies
- 主节点宕机后,从节点推举成为新的主节点,继承提供处事
- 提交阶段从节点不行用的话,主节点会要求打点节点将从节点从 in-sync copies 中移除
一些计划细节:
- 写入只能通过只主节点举办,读取可以从恣意从节点举办
- 每个节点均可提供处事,它们会转发哀求到数据分片地址的节点,但提议轮回会见各个节点以均衡负载
- 数据做分片: shard = hash(routing) % number_of_primary_shards
- primary shard 的数目是必要在建设 index 的时辰就确定好的
- 主从的粒度是 shard,每个节点对付某些 shard 而言是主节点,对付另一些而言是从节点
- 选主算法行使了 ES 本身的 Zen Discovery
Hadoop
Hadoop 行使的是链式复制,参考 Replication Pipelining
- 数据的多个复本写入多个 datanode,只要有一个存活数据就不会丢失
- 数据拆分成多个 block,每个 block 由 namenode 抉择命据写入哪几个 datanode
- 链式复制要求数据发往一个节点,该节点发往下一节点,待下个节点返回及当地写入成 功后返回,以此类推形成一条写入链。
- 写入进程中的宕机节点会被移除 pineline,纷歧致的数据之后由 namenode 处理赏罚。
实现细节:
- 实现中优化了链式复制:block 拆分成多个 packet,节点 1 收到 packet, 写入当地 的同时发往节点 2,守候节点 2 完成及当地完成后返回 ACK。节点 2 以此类推将 packet 写入当地及发往节点 3……
TiKV
(编辑:湖南网)
【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!
|