《Designing Data-Intensive Applic

2019-05-20  本文已影响0人  lionel880

分布式的数据

为了更高的负载,更高的可用性,更低的延迟,分布式的架构被利用起来,scale out,扩展能力是一个系统必须考虑的因素

Chapter 5 复制

单独考虑复制的前提是每一个节点可以包含所有的数据,而不需要分片。复制的难点在于各个副本的数据一致性。有3种算法去处理节点数据变化,single-leader, multi-leader, and leaderless replication,各自有利有弊,需要权衡
其他的考虑要素,诸如同步/异步,处理失败副本

1.1、leader和follows

Leader-based(master-slave)replication

1.2、同步和异步

同步和异步是一个重要的属性,指 复制这个过程是同步还是异步的


image.png

2者的区别很明显,同步保证副本和主上的同时更新,但延迟可能因为网络等很大,但异步速度快,确不能保证副本更新成功。因此有时候,也会有所谓的semi-synchronous,半同步,即在异步的节点上,选出一个要求同步,当这个同步节点挂掉时,在选一个异步节点改为同步

1.3、创建一个新follower流程

常规的操作是
1.创建一个主的快照
2.拷贝快到到新follower
3.新follower加载快照后,再向主订阅快照后的变化,通常使用一个位点,如mysql的binlog position
4.追上后即变成了一个正常的副本节点

1.4.节点宕机

1.5 复制日志的实现

  1. 非确定语句,如now(),rand()等在不同机器上执行可能会有不同结果
  2. 所有的设置主副需要一致,如主单数递增,副双数递增,则有些查询需要进行特殊处理
    很多的边界条件需要考虑,因此,一般现在不采用这个方式

1.6 复制日志带来的问题

单节点接入,扩展靠通过增加follower实现,一般用读写分离。这时候同步可能会导致写入过慢,异步的话,各个follower的数据一致性会受到影响。
这里只能说,我们保证最终数据一致性,即当停止写入后,随着时间,各个follower的数据会满足一致性
此时若网络出现问题,或写入接近处理能力,可能会造成数十秒,甚至分钟级的影响,在这实际汇中是需要注意的
问题举例1:read-after-write consistency
异步时,follower还没有写入,收到了读取请求

image.png

read-after-write consistency, also known as read-your-writes consistency
这个一致性,只是保证你的修改和你读取,你的读取一定是你修改后的数据,但不保证其他用户

实现方式
1.当只有自己能修改自己的数据时
每个用户读取自己的数据时,在leader上读,读取其他数据时,在follower上读
2.当别人也能修改自己的数据时
这个相对复杂,当异步时无法保证,只能记录key的更新时间,请求判断如一分钟以内更新到转发到主节点,一分钟以后到任意follow

还有目前的所谓跨设备一致性,同一个用户,在手机,pad,pc上的访问数据保持一致

问题举例2:monotonic read 单调读一致性


image.png

因为读不同的follow,导致读取结果不一致

解决方案,哪怕是读follower,同一个用户也要定位到同一个follower上

问题举例3:prefix read,保证结果的因果性,其实就是顺序


image.png

当旁观者,从不同的节点,可能先改变的后读到,违反了因果性。

解决这个问题,需要保证的是一系列的写入,读取的时候也必须能按顺序读取。
实际中常常通过制定partition解决,因为依赖算法去解决这个成本一般较高

1.7 muti-leader replication

master–master or active/active replication,每一个都是其他节点的follower,但自己也是可以写入的
首先要明确使用场景:

多中心的问题---冲突
multi-leader,是的写入可以在多个leader上进行,随之而来的,write conflict是最主要的问题

典型的冲突处理方式
写入时如果有冲突,调用提前写好的handler
读取时进行提示

多节点复制

多节点的复制拓扑.png
传送给所有节点是最简单的,但问题是,各个节点网络可能会延迟不同,节点A和节点C同一份数据同步到节点B可能会违反因果性,此时需要一些特殊处理,如版本号管理
而环形和星形需要给uuid,以避免循环。

1.7 leaderless replication

这个很陌生,amason有 in-house Dynamo system,工作中暂时没有碰到这种架构的,只做简单了解

leaderless
有节点宕机,就当没发生过,读和写都需要达到法定的投票数,当宕机节点恢复后,仍然每一个读取发到各个节点,通过数据的版本号决定拿哪一个
辅助机制
上一篇下一篇

猜你喜欢

热点阅读