第二章 NoSQL的数据一致性与水平扩展
一、 关系型数据库ACID特征
- 事务是描述数据库处理的一个完整的逻辑过程
是一个操作序列,是一个不可分割的工作单位 - ACID特性
- 原子性(Atomicity)
事务是一个不可再分割的工作单位,事务中的操作要么都发生,要么都不发生 - 一致性(Consistency)
在事务开始之前和事务结束以后,数据库的完整性约束没有被破坏 - 隔离性(Isolation)
多个事务并发访问时,事务之间是隔离的,一个事务不影响其它事务运行效果 - 持久性(Durability)
一旦事务执行成功,则该事务对数据库进行的所有的更新都是持久的,即使数据库故障而受破坏,数据库管理系统也能恢复
二、 CAP理论
- CAP特性(最多满足两个特性)
- 强一致性:系统在执行某项操作后仍然处于一致的状态
在分布式系统中,更新操作执行成功之后所有的用户都应该读取到最新的值 - 可用性:每一个操作总是能够在一定的时间内返回结果
- 分区容错性:分布式系统中的某个节点或者网络分区出现故障时,整个系统仍然能对外提供满足一致性和可用性的服务
- CA: 优先保证强一致性和可用性,放弃分区容错
这也意味着放弃系统的扩展性,系统不再是分布式的,有违设计的初衷 - CP: 优先保证强一致性和分区容错性,放弃可用性
一旦发生网络故障或者消息丢失,就会牺牲用户体验,等恢复后用户才逐渐能访问 - AP: 优先保证可用性和分区容错性,放弃强一致性
跟CP一样,放弃强一致性不是说一致性就不保证了,保证最终一致性
三、 DNS系统(Domain Name System)
- DNS:可以将域名和IP地址相互映射的一个分布式数据库
- 层次域名空间:英特网采用层次树状结构的命名方法
- 域名服务器
一个域名服务器所负责(或者有权限的)的管辖范围称为区
- 域名的解析过程——解析器
- 递归查询方式
- 迭代查询方式
四、 数据一致性模型和BASE
- 基本可用(Basically Available): 系统能够基本运行、一直提供服务
- 软状态(Soft-state):系统不要求一直保持强一致状态
- 最终一致性(Eventual consistency)
- 因果一致性
- 读自写一致性
- 会话一致性
- 单调一致性
- 时间轴一致性
五、 NoSQL数据水平扩展
- 分片:
将数据分成几部分,每部分放在一个服务器上,这个服务器处理这个分片数据所有的读和写请求 - 主从复制(避免了写入的冲突)
在主从架构中,数据被复制到多个节点,一个节点被指定为主,其他都是从
主通常负责处理数据的更新,并启动单独的进程将数据同步到从
- 对等复制(避免了单点写入的故障):所有副本地位都是相同的,没有主从
- 分片和复制可以只使用一种,也可以同时使用两种技术
- 分区方案Sharding
- 概述:
Sharding是指将大数据库分布到多个物理节点上的分区方案
Sharding系统是shared-nothing系统,指各个处理单元都有自己的CPU/内存/盘等,不存在共享资源
数据分片方法:区间划分、轮流放置和一致性哈希 - 区间划分
a) 情况1:数据分配不均,调整导致的连锁迁移
b) 情况2:增加或者删除节点导致的连锁迁移
c) MongoDB采取每个节点多个区间方案 - 轮流划分
轮流放置是指每个键都会被依次放置在下一个节点上,以此进行循环。通常按照主键的值来决定次序从而进行划分
缺点:数据迁移量大 - 一致性Hash算法
a) 一致性Hash算法基本场景
把一个对象object映射到N个高速缓冲服务器cache
一台高速缓冲服务器坏掉;增加一台高速缓冲服务器
【单调性】如果已经有一些内容通过哈希分派到相应的缓冲中,又有新的缓冲加入到系统中。哈希结果能够保证原有已分配的内容可以被映射到旧的缓冲中,而不会被映射到新的缓冲集合中
b) 步骤
c) 优点
均匀:由于采用的哈希函数是与输入无关的均匀函数,因此当键值和节点都非常的多的时候,一致性哈希可以达到很好的分布式均匀性
迁移时数量小:由于特殊的放置规则,一致性哈希在节点数据发生变动时可以将影响控制在局部区间内,从而保证非常少的数据迁移(接近理论上的最小值)