知识卡片

主主复制看似简单实则有独特复杂性:哪些数据不能双向复制

普通读书笔记卡

内容

主主复制指两台机器都是主机,互相把数据复制给对方,客户端可以随便挑一台机器进行读写操作。相比[[双机切换三种架构:互连式、中介式与模拟式的取舍]],主主复制表面上看要简单得多——不存在”切换”这个概念,不需要状态信息传递、不需要状态决策、不需要状态切换,客户端也不用区分主备角色,随便发给哪台都行。但主主复制其实有自己独特的复杂性:既然是双向复制,就必须保证数据本身能够安全地做双向复制,而现实中很多类型的数据天生就不适合这样做。典型的反例有两个:一是用户注册生成的用户ID,如果按数字自增来分配,就绝对不能双向复制——因为X用户在主机A注册可能分到ID=100,同时Y用户在主机B注册也可能分到ID=100,双向复制后就会直接冲突;二是库存这类需要精确累计的数据,比如一件商品库存100件,主机A上被扣掉1件变成99,主机B上同时被扣掉2件变成98,如果主机A把自己的99复制给主机B、直接覆盖了主机B原本的98,结果变成99,但真实库存其实应该是97——同类问题也会出现在余额这类数据上。正因为这类”需要精确累计、不能简单覆盖”的数据天然和双向复制冲突,主主复制架构对数据本身的设计有严格要求,只适合那些临时性的、可以丢失的、可以被覆盖的数据场景——比如用户登录产生的session数据(丢了大不了重新登录生成一份)、用户行为的日志数据(丢了影响有限)、论坛的草稿数据(丢了用户重新编辑即可)这类容错度高、不需要精确一致性的场景。

参考来源

- 位置:《从零开始学架构》第25讲《高可用存储架构:双机架构》"主主复制"(源文件:_epub-src/OEBPS/text00002.html) - 结论依据:原文说明"如果采取主主复制架构,必须保证数据能够双向复制,而很多数据是不能双向复制的",并以用户ID自增冲突和库存/余额被覆盖导致数据错误为例,最后指出"主主复制架构对数据的设计有严格的要求,一般适合于那些临时性、可丢失、可覆盖的数据场景",直接支撑本卡片结论。 - 原始内容:用户注册后生成的用户 ID,如果按照数字增长,那就不能双向复制……库存不能双向复制……因此,主主复制架构对数据的设计有严格的要求,一般适合于那些临时性、可丢失、可覆盖的数据场景。