/images/avatar.png

DDIA-5

复制意味着在通过网络连接的多台机器上保留相同数据的副本。 复制的动机: 使数据离用户更近->减少延迟 容错->提高可用性 横向、纵向扩展方便->提高吞吐量 复制的难点: 多份数据的一致性->即数据会变更,如何让多节点数据一致 复制的方式: 单主 无主 多主 权衡:使用同步复制还是异步复制?如何处理失败的副本? 有主的复制 同步复制: 数据发送后持久化才返回 优点:从库能保证有与主库一致的最新数据副本 缺点: 从库无响应会导致主库无法处理写入 半同步(semi-synchronous: 一个从库是同步的,而其他的从库则是异步的 异步复制: 数据不保证在副本上落盘 优点:低延迟 缺点:一致性不强 成员变更-新增从节点 流程: 在某个时刻获取主库的一致性快照(如果可能,不必锁定整个数据库)。大多数数据库都具有这个功能,因为它是备份必需的。对于某些场景,可能需要第三方工具,例如用于 MySQL 的 innobackupex 将快照复制到新的从库节点。 1从库连接到主库,并拉取快照之后发生的所有数据变更。这要求快照与主库复制日志中的位置精确关联。该位置有不同的名称,例如 PostgreSQL 将其称为 日志序列号(log sequence number,LSN),MySQL 将其称为 二进制日志坐标(binlog coordinates)。 当从库处理完快照之后积累的数据变更,我们就说它 赶上(caught up) 了主库,现在它可以继续及时处理主库产生的数据变化了。 处理节点失效 从库失效->catch up 主库失效->故障切换 确认主库失效。 选一个新的主库 重新配置系统以启用新的主库 故障切换的难点: 存在旧主的已提交未提交的数据如何处理? 新主的数据是否正确 主库被宣告死亡之前的正确超时应该怎么配置?在主库失效的情况下,超时时间越长意味着恢复时间也越长。但是如果超时设置太短,又可能会出现不必要的故障切换。例如,临时的负载峰值可能导致节点的响应时间增加到超出超时时间,或者网络故障也可能导致数据包延迟。如果系统已经处于高负载或网络问题的困扰之中,那么不必要的故障切换可能会让情况变得更糟糕。 单主集群出现脑裂,却没有多主集群的冲突处理机制 屏障(fencing) 爆彼之头(Shoot The Other Node In The Head, STONITH) 我们将在 “领导者和锁” 中对屏障进行详细讨论。 All in all: 节点故障、不可靠的网络、对副本一致性、持久性、可用性和延迟的权衡,这些问题实际上是分布式系统中的基本问题。

Test3

why no comments? 1 why no comments? 1 print(hello) why no comments?why no comments?why no comments?why no comments?why no comments? why no comments?why no comments? why no comments?

Todo2

Project2 RaftKV 这一节需要我们实现 Raft,TinyKV Raft 这部分很多都是抄 Etcd 的 Raft 模块。你可以注意到连测试用例都很像。所以这一节我拿到手就会做啊,首先去 Etcd clone 一份源码。我抄的是 Etcd 3.5.1 版本,也就是目前最新版。 TinyKV 中的 Raft 和 6.824 中的 Raft 有很大的不同。这里将整个 Raft 设计为一个状态机,从一端输入消息,从另一端输出消息,整一个过程是线性的,你不需要考虑并发的情况,这能极大降低心智负担。 在这一节实验中,大家一定可以参考 https://www.codedump.info/post/20180922-etcd-raft/ 这个网站,会有很大的帮助。 这里我将 Project2 中 3 个实验合在一起讲,同时有些内容是在 Project3 中才会遇到,如果在这里你不懂,可以先直接跳过。 在 Part A 实验中,我们需要实现三个模块。分别是 RawNode,Raft 和 RaftLog。三个模块分别对应 rawnode.go,raft.go 和 log.go 三个文件。三个模块的结构图如下所示:

TinyKV White Paper

TinyKV White Paper todo 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 // findConflict finds the index of the conflict. // It returns the first pair of conflicting entries between the existing // entries and the given entries, if there are any. // If there is no conflicting entries, and the existing entries contains // all the given entries, zero will be returned.
本站总访问量