[后台]分布式基础概念
CAP
CAP理论是分布式系统的基石,他指出了分布式系统的以下特性:
- Consistency 强一致性(返回的数据时刻一致)
- Availability 高可用性(服务一直可用,响应时间正常)
- Tolerance of network Partition 分区容错性(保证有机器宕机服务依然正常)
CAP理论表明,一个分布式系统不可能同时满足一致性,可用性和分区容错性这三个需求,
最多只能同时满足两个。证明可以看上面的链接。
所以架构师往往要做出牺牲某一特性的选择:
CP:金融行业的数据库,价格昂贵,符合ACID
CA:传统关系型数据库,用于小型系统或单机系统
AP:key-value数据库,现代UGC服务基本都是这种架构,用最终一致性来换取高可用和分区容错性。
电商:牺牲少量的可用性和一致性,比较平衡,符合BASE
ACID
老生常谈的数据库事务的特性:
原子性(Atomicity) 事务中有失败,立即回滚到执行前。没有失败,全部成功
一致性(Consistency) 事务执行后数据的约束没有被破坏
隔离性(Isolation) 事务之间不交叉进行
持久性(Durability) 事务完成,永久储存
BASE
BASE理论是对CAP理论的延伸,核心思想是即使无法做到强一致性(CAP的Consistency),但应用可以采用适合的方式达到最终一致性,来保证系统的容量和可用性。
Basically Availble (基本可用)
基本可用是指系统只保证核心可用,在访问量突增时采用有损服务的策略,让部分用户使用降级的服务。
什么是基本可用的服务?以秒杀为例:
逻辑有损:秒杀时只执行重要逻辑,加载资源可以先使用预加载的或者小图等
业务有损:秒杀需要会员、抢秒杀资格
流程有损:比如秒杀时前段丢掉大部分请求,从后端少量请求中选取中奖的请求处理
Soft-state (软状态/柔性事务)
“Soft state” 可以理解为"无连接"的, 而 “Hard state” 是"面向连接"的。换句话说,软状态的数据库可能存在很多中间状态,不同节点到达最终统一的状态前会有延迟(如异步复制)。
Eventual Consistency (最终一致性)
并非时刻保持一致,所有复制节点在某段时间后保持一致。
最终一致性是弱一致性的一种特例:
Step 1. A首先write了一个值到存储系统
Step 2. 存储系统保证在A,B,C后续读取之前没有其它写操作更新同样的值
Step 3. 最终所有的读取操作都会读取到最A写入的最新值
从A写入到读取操作读取成功有一定的时间,即不一致性窗口。如果没有失败发生的话,“不一致性窗口”的大小依赖于以下的几个因素:交互延迟,系统的负载,以及备机slave的个数。最终一致性方面最出名的系统可以说是DNS系统,当更新一个域名的IP以后,根据配置策略以及缓存控制策略的不同,最终所有的客户都会看到最新的值。
在下一篇文章的中,会表明只要集群$V_r + V_w \leq N$,即此时读取和写入操作是不重叠的, 就能保证最终一致性。这个时候不一致性的窗口依赖于存储系统的异步实现方式,不一致性的窗口大小就等于从更新开始到所有的节点都异步更新完成之间的时间。
Sharding 分片
当单库单表中的数据量特别大,查询就会非常慢。这个时候就要切分数据库存放在不同的Server上:
水平切分:行切分。比如按id的范围分表,或者hash分表
垂直切分:列切分。把一张表(库)中关系紧密的列(表)单独放入别的表(Server)中
I/O五分钟法则
在一个内存页中维护一个内存页(64KB)的成本相当于在磁盘中维护五分钟的成本。
不要删除数据
在数据库中删除数据会破坏数据库的完整性。比如删除一个商品会导致关联的订单也要删除,引发连锁反应。打个下架标记即可,不要删除数据。