异步同步的情况下出出现最终一致性效应复制滞后会导致:用户提交了修改到主节点,但是从从节点没有读取到最新的变更,比如看不到自己提交的评论等。
读写一致性:读自己的写
一旦用户的数据最近发生改变则路由用户请求从主节点进行读取,规避复制滞后的问题。
缺点:只保证单一用户写后读的的一致性,但是不保证多个用户的一致性。比如发了一条评论,自己能刷新到但是同在身边的朋友可能就刷新不到。
单调读一致性
前缀一致读
解决方案
- 应用层可以提供比数据库更强有力的保证。
- 事务是数据库提供的更强保证的一种方式。
异步同步的情况下出出现最终一致性效应复制滞后会导致:用户提交了修改到主节点,但是从从节点没有读取到最新的变更,比如看不到自己提交的评论等。
一旦用户的数据最近发生改变则路由用户请求从主节点进行读取,规避复制滞后的问题。
缺点:只保证单一用户写后读的的一致性,但是不保证多个用户的一致性。比如发了一条评论,自己能刷新到但是同在身边的朋友可能就刷新不到。
没有主节点,允许任何节点接受来自客户端的写请求。 实现方式 客户端直接将其写请求发送到多节点 一个协调者代表客户端进行写入,与主节点的数据库不同,协调者并不负责写入顺序的维护。 节点失效时写入数据库 客户端将写请求并行发送给三个节点,两个可用节点接受写请求,而不可用副本则无法处理该请求。 现在失效的节点重新上线,客户端可能会读取到旧的值。 为了解决这个问题客户端并行的向多个节点发送读请求,并通过版本号来确定哪个值更新。 读修复与反熵 读修复;客户端并行读取多个节点,检测到过期的返回值,然后用新的返回值写入到返回旧值的副本。 反熵过程:后台不断查找副本之间的差异,将任何缺少的数据从一个节点复制到另一个节点。不保证特定顺序的复制写入,并且会引入明显的复制滞后问题。 Quorum 一致性 检测并发写
主节点与从节点 复制 单个节点可以完整存放所有数据副本,节点间进行主从复制。 配置新从节点 可以通过快照来加速新从节点复制: 对主节点的数据副本产生一个一致性快照,避免长时间锁定数据库。 拷贝快照到从节点 请求快照后面的更改日志 应用数据变更 节点失效 从节点失效:追赶式恢复 主节点失效:节点切换 自动切换 确认失效 选举新的主节点 使主节点生效 挑战 从节点复制不完整 各个数据层数据不一致,如 MySQL 和 Redis 之间 多个主节点选举:脑裂 如何有效检测主节点失效 复制日志实现 复制滞后问题 多主节点复制 使用场景 多数据中心 优点: 性能 容忍数据中心失效 容忍网络问题 缺点:写冲突 离线客户端操作 协作编辑 处理写冲突 同步与异步冲突检测 同步:等待写请求完成对所有主节点的同步再通知用户写入成功。 异步:等待单一主节点写入成功后通知用户卸乳成功,稍后多主节点数据同步的时候才能检测到冲突 避免冲突 收敛于一致的状态 自定义冲突解决逻辑 写入时解决 读取时解决 拓扑结构 环形拓扑 星型拓扑 全部-至-全部型拓扑 无主节点复制