复制
为什么复制数据?
- 使得数据与用户在地理上接近(从而减少延迟)
- 即使系统的一部分出现故障,系统也能继续工作(从而提高可用性)
- 扩展可以接受读请求的机器数量(从而提高读取吞吐量)
怎么进行数据复制?
日志
:通常指应用日志,即应用程序输出的描述发生事情的文本。本书在更 普遍的意义下使用日志这一词:一个仅追加的记录序列。它可能压根就不是给人类看 的,使用二进制格式,并仅能由其他程序读取。存储结构主要是LSM树和B树.
数据复制中面临的问题
- 在变更中保持一致性
由于真正与现实一致的数据一直在变化, 如果复制无法赶上变化,复制的数据其实是无效的. 即使这点得到解决, 我们无法保证所有节点都正常工作. 所以当任何一个节点宕机,应该有可以补救的措施. 这样才能保证分布式系统的效率.
- 领导者与追随者
- 同步和异步
从库1的复制是同步的:在向用户报告写入成功,并使结果对其他用户可 见之前,主库需要等待从库1的确认,确保从库1已经收到写入操作。以及在使写入对其他客 户端可见之前接收到写入。跟随者2的复制是异步的:主库发送消息,但不等待从库的响应。
同步与异步的优缺点
同步与异步的优缺点是显而易见的,同步意味着有发送有应答,异步只管发送,不管应答. 同步保证了数据的复制完全进行,但在等待应答的过程中失去了效率,异步无法保证数据同步成功,但如果它堵赢了,效率会很高.
失败节点的处理
- 从库故障: 追赶恢复
在其本地磁盘上,每个从库记录从主库收到的数据变更。如果从库崩溃并重新启动,或者, 如果主库和从库之间的网络暂时中断,则比较容易恢复:从库可以从日志中知道,在发生故 障之前处理的最后一个事务。因此,从库可以连接到主库,并请求在从库断开连接时发生的 所有数据变更。当应用完所有这些变化后,它就赶上了主库,并可以像以前一样继续接收数 据变更流。
- 主库失效: 故障切换
一旦主库失效,我们只能将一个从库提升成新的主库.这个过程十分麻烦,并且伴随很多问题,主要分为以下几步:
- 确认主库失效(除去计划内关闭主库)
- 选择新的主库(共识问题)
- 重新配置系统并启用新的主库(请求路由)
1.异步复制带来的问题
2.数据不一致带来数据泄漏
3.两个节点都以为自己是主库
三种流行的复制算法
分区
事务
分布式的麻烦
一致性与共识