《Designing Data-Intensive Applications》第5章 读书笔记(2):备份之多leader模式

1.前言

前面讲了单leader模型,本节讲解多leader备份

2.多leader备份

之前讲的单leader有一个大的缺陷:
由于只有一个leader,client和leader连不上,就不能写了

那么一个拓展就是单leader变成多leader,每个leader都允许写,备份过程基本不变,如下:

接收写请求的节点把数据发送给其他所有节点。
此时,每个leader都会作为其他leader的follower角色

2.1 何时用多leader模型

根据数据中心的个数决定
如果只有一个,那么就是单leader(此时多leader太复杂了且无必要)
如果有多个,就用多leader

多leader模式下,每个数据中心都能有一个leader
在每个数据中心内部,就是常规的单leader模型
在数据中心之间,则是每个leader和其他leader互相备份。

如下图


多数据中心的多leader备份

注意数据中心之间,leader间进行冲突解决以及备份

在多数据中心的情况下比较单leader和多leader:

1.单leader配置接收所有写,延迟高,违背了单多数据中心的意愿。而多leader则能在最近的leader进行写,并且异步备份。
2.单leader挂了重选的leader可能在另外一个数据中心。而多leader模型中每个数据中心能够相对独立工作(只有leader间互相备份)
3.单leader对网络问题更敏感,多leader不会

但是多leader有一个缺点:
一个数据同时在两个不同的数据中心修改,需要解决冲突
这个问题很复杂但又很常见,比如
同一个app在不同客户端上离线设置,重新联网后需要同步数据

2.2 处理写冲突

上面讲解的冲突触发的场景可以如下图所示


各leader同时修改数据

2.2.1 冲突检测:同步还是异步

同步异步冲突检测都有各自问题

同步检测的话,损失了多leader允许同时写的优势。好处是能让用户知道发生了冲突及时修改
异步检测的话,会有延迟,也不能再让用户改。好处是快。

2.2.2 避免冲突

最简单的办法是避免冲突:对每个特定的记录写的请求会通通给同一个leader
比如把每个user分配到特定的 home数据中心。
当然,还得考虑这个数据中心leader挂掉的情况

2.2.3 收敛到一致性状态

单leader能够使得所有写按顺序执行
但是在多leader的配置中,不保证这个顺序,但是要保证最后一个最终的结果应用到所有的备份中去,有以下方法:

1.给写请求分配ID,谁大以谁为准
2.给节点分配ID,谁大以谁为准
3.把结果合并起来如B/C
4.记录结果,后面写业务代码去解决

2.2.4 冲突解决的策略

很多多leader的工具允许自己写冲突解决的方案,包括写的执行以及读的执行两个方面

写时
  检测到冲突了之后,调用conflict handler,能执行自己写的PERL脚本
读时
  检测到冲突后,所有冲突的数据都会被记录。下次这个数据被读取时,多个版本的数据都会返回给应用,应用自己决定如何处理

2.2.5 什么是冲突

有些冲突明显,修改同一条记录同一个字段。
有些则不明显,比如一个预订系统,两人同时预定一个位置。
(这里不是很理解这一节是干吗的,这个例子只是db换一个方式冲突,而且也能用2.2.4的方案解决啊)

2.3 多leader备份的拓扑关系

需要一个拓扑关系来表识写请求在节点之间的传递,有下面几种


三种多leader备份模型

最常见的是all-to-all这种,所有leader之间互相通信。
MySQL则默认用circular模型。是一个环状结构。
另外星形结构可以看做是树形结构,由一个root节点向所有其他节点通信。

在环形和星形中间,一个写可能要经过多次传输到达其他节点(星形的话可能是叶子-根-叶子这样传输)
为了避免传递时出现死循环,每个节点都会有一个唯一id。每个传递的消息会记录传递路径的节点的id。

环形和星形的问题是如果一个节点挂了,整个通信结构都可能受到影响,往往需要人为的修复。

另一方面,all-to-all的结构,受到网络通信的影响,可能造成备份的数据会出现 改动顺序颠倒的情况(之前提到的前缀一致性问题),如下图


破坏了前缀一致性,造成了错误顺序

为了保证顺序性,称为“version vectors”的技术被提出,后面再讲。

3.思考

星形网络

换一个角度看就是一棵树

多leader的主要问题

就是写会有冲突,要尽量避免冲突,收束到一致性,再检测冲突,解决冲突
但是感觉解决冲突的成就还是比较poor的。

4.问题

解决冲突造成的倾向性问题

2.2.3里面说比如给节点分配ID,谁大以谁为准,这也是有倾向性的
而2.2.5中提出的 “什么是冲突”感觉完全可以解决掉,不知道书中这样编排的目的是啥

5.总结

这部分主要讲解:
多leader适用的场景
然后面对的主要问题是写冲突,如何检测,避免,解决冲突
最后讲解了多leader中,各个leader互相备份的三种模型

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,590评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 86,808评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,151评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,779评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,773评论 5 367
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,656评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,022评论 3 398
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,678评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 41,038评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,659评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,756评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,411评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,005评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,973评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,203评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,053评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,495评论 2 343

推荐阅读更多精彩内容