DDIA Distributed Data: Replicati

2018-09-29  本文已影响0人  vickeex

正文之前小吐槽下:上课很心累,作业太多了,而且很多作业的意义不大(mei you yi yi)。某课程的实验要求写的莫名其妙,连给的镜像资源也莫名其妙。不过好像这样也许有让我更为珍惜和利用可以自主学习的时间吧。最近还有简单看(仅限于了解)强化学习,希望后面也能写一点小记录。

这两天看了些数据的备份方式,总结下leader-based replication(主从复制)和leaderless replication(去中心复制),前者又包括single-leader和multi-leader两类。先说说为什么需要副本。
scalability: 数据集过大或读写请求过多时,单节点负载过大,通过多节点来均衡负载。
fault tolerance / high availability: 系统中一个或多个节点崩溃、网络或某个datacenter故障时,冗余备份的节点可以接任其工作,系统继续正常运行。
latency: 物理上更靠近用户的数据备份能有效减少延时。

Leader-based Replication

每个存储了一份数据拷贝的节点被称作replica。某个replica被指定为leader(master / primary),负责客户端的写请求,并最先进行数据更新。其他的副本则被称为followers(slaves / secondaries)。leader会将writes以replicaton log或change stream的方式发送给followers,以便各从节点进行本地的数据修改。读请求可发送给leader或followers。

小八卦:在 Twitter 炮轰下,Redis 作者被迫将 Master/Slave 架构改名为 Master/Replica,以避免让人联想到奴隶制。有趣的知乎链接:https://www.zhihu.com/question/294200413/answer/489899388

synchronously and asynchronously replication

一个系统中可能会有一些从节点采用同步复制方式,另一些采用异步复制方式。
sync: 主节点等待从节点完成数据写入并返回写的确认回执,才向写请求的客户端发送回执。主从一致,但从节点崩溃或网络故障都容易导致主节点被阻塞。
async: 主节点发送给从节点写的信息后,立即向客户端发送确认回执,不需要等待从节点的回复。主节点崩溃后,还未写入从节点的writes永久丢失。
[ semi-sync: 系统中有一个节点为同步复制,其余为异步,若同步的节点down掉了,则选择一个异步节点改为同步设置。 ]

setting up new followers

扩大数据备份量或有节点崩溃时,需要加入新的从节点,一般不会直接通过拷贝所有数据来完成新的从节点的设置。通常步骤如下:

handling node outages

若从节点故障,通过catch-up recovery,即根据本地log文件,向leader请求错失过的操作,补回来。主节点故障,就麻烦了,通过failover(故障转移)修复:

replication logs

replication logs的实现有多种方法,将常用的几种简单介绍下。


助教下课太早了,这两个小时的收获就是骑了两趟自行车当运动,以及王一多帮我做了两张专属表情包。回来继续。


Single-leader Replication

没有什么需要特别单独说的了,基本同上,在leader-based中讲了。

Multi-leader Replication

系统中有多个数据中心(datacenters),每个datacenter有一个leader。
[建议了解下概念:cluster, datacenter, cloud。没错,我没写就是因为我还没弄明白。]

conflict resolution

在多个leader的情况下,若vickee同学更改了某条数据为“你很漂亮”,写请求由leader A完成,同时xu同学更改了该条数据为“你很帅”并且写请求发送到leader B处理,那么AB都会在写完后向对方发送自己的write操作进行更新,冲突就来了!到底是漂亮还是帅?
解决冲突一般以单行或一个单独的文档作为基本单位,而不是基于transaction,即transaction里的writes被认为是解决数据冲突时相互独立的单位。

topologies

节点之间发送writes的路径结构,有circular topology(一个单向路径圈),star topology(一个中心节点,与其他所有节点互相传送),all-to-all topology(两两之间全是路径)。

comparison

performance: single-leader中,所有writes都经过一个leader,延迟会很大。multi-leader中,writes请求由本地的datacenter请求,并异步复制到其它datacenters。
tolerance of datacenter outages: single-leader中,leader一旦挂掉,需要另推选一个leader,会很难受。而multi-leader中,某个leader挂掉了,其他的datacenter还能继续独立完成工作。
tolerance of network problems: datacenter之间网络堵塞时,single-leader中的leader会比较难受,因为有同步写操作。而multi-leader就无所谓了,采用异步复制,不会受什么影响。

Leaderless Replication

去中心化复制中,客户端写请求会发送给多个节点,多数写成功则视为成功。同样地,读请求也会从多个节点上读取,通过版本对比采纳最新的那份数据。那么多少个节点写成功算成功了,读的时候请求几个节点又该有多少份数据为最新的才能认为数据可以采用呢?Quorums for reading and writing,了解一下,这儿我就先不写了,可能以后也不会写......
如果一个节点崩溃了(leaderless没有failover),恢复正常时有以下两种方式进行数据修复:
read repair: 读请求会发送给多个节点,读请求操作会自带检测操作,若发现某节点的数据版本过时了,就将刚读到的最新数据发送给它进行更新。
anti-entropy: 后台有个进程会持续地检查各副本间的数据差异,并通过复制拷贝消除这种不一致,但数据复制前会有明显的间隔时间。

上一篇 下一篇

猜你喜欢

热点阅读