从单机到分布式系统,数据一致性相关。
1 RAID
硬盘冗余阵列(RAID, Redundant Array of Independent Disks),简称磁盘阵列。
利用虚拟化存储技术把多个硬盘组合起来,成为一个或多个硬盘阵列组,目的为提升性能或数据冗余,或是两者同时提升。
在运作中,取决于 RAID 层级不同,数据会以多种模式分散于各个硬盘,RAID 层级的命名会以 RAID 开头并带数字,
例如:RAID 0、RAID 1、RAID 5、RAID 6、RAID 7、RAID 01、RAID 10、RAID 50、RAID 60。每种等级都有其理论上的优缺点,不同的等级在两个目标间获取平衡,分别是增加数据可靠性以及增加存储器(群)读写性能。
简单来说,RAID把多个硬盘组合成为一个逻辑硬盘,因此,操作系统只会把它当作一个实体硬盘。RAID常被用在服务器电脑上,并且常使用完全相同的硬盘作为组合。由于硬盘价格的不断下降与RAID功能更加有效地与主板集成,它也成为普通用户的一个选择,特别是需要大容量存储空间的工作,如:视频与音频制作。
一句话:磁盘高可用,容错
图示:
详细:
- raid0 数据分片
将两个以上的磁盘并联起来,成为一个大容量的磁盘。在存放数据时,分段后分散存储在这些磁盘中,因为读写时都可以并行处理,所以在所有的级别中,RAID 0的速度是最快的。但是RAID 0既没有冗余功能,也不具备容错能力,如果一个磁盘(物理)损坏,所有数据都会丢失,危险程度与#JBOD相当。
- raid1 数据分片复本
其原理为在主硬盘上存放数据的同时也在镜像硬盘上写一样的数据。当主硬盘(物理)损坏时,镜像硬盘则代替主硬盘的工作。因为有镜像硬盘做数据备份,所以RAID 1的数据安全性在所有的RAID级别上来说是最好的。但无论用多少磁盘做RAID 1,仅算一个磁盘的容量,是所有RAID中磁盘利用率最低的一个级别。
- raid5 奇偶检验
RAID Level 5是一种储存性能、数据安全和存储成本兼顾的存储解决方案。它使用的是Disk Striping(硬盘分割)技术。
RAID 5至少需要三个硬盘,RAID 5不是对存储的数据进行备份,而是把数据和相对应的奇偶校验信息存储到组成RAID5的各个磁盘上,并且奇偶校验信息和相对应的数据分别存储于不同的磁盘上。当RAID5的一个磁盘数据发生损坏后,可以利用剩下的数据和相应的奇偶校验信息去恢复被损坏的数据。RAID 5可以理解为是RAID 0和RAID 1的折衷方案。
raid10 raid0+raid1
raid01 raid1+raid0
其他raid,参考链接:https://zh.wikipedia.org/wiki/RAID
2 ACID
事务(Transaction)是由一系列对系统中数据进行访问与更新的操作所组成的一个程序执行逻辑单元。
当多个应用程序并发访问在数据库时,事务可以在这些应用程序间提供隔离,防止彼此的操作互相影响。
事务为数据库序列提供了从失败中恢复到正常状态的方式,同时提供了数据库即使在异常状态下仍能保持数据一致性的方法。
详细:
1. 原子性(Atomicity)
事务的原子性是指事务必须是一个原子的操作序列单元。事务中包含的各项操作在一次执行过程中,只允许出现两种状态之一。
- 全部成功执行
- 全部不执行
任何一项操作都会导致整个事务的失败,同时其它已经被执行的操作都将被撤销并回滚,只有所有的操作全部成功,整个事务才算是成功完成。
2. 一致性(Consistency)
事务的一致性是指事务的执行不能破坏数据库数据的完整性和一致性,一个事务在执行之前和执行之后,数据库都必须处以一致性状态。
比如:如果从A账户转账到B账户,不可能因为A账户扣了钱,而B账户没有加钱。
3. 隔离性(Isolation)
事务的隔离性是指在并发环境中,并发的事务是互相隔离的,一个事务的执行不能被其它事务干扰。也就是说,不同的事务并发操作相同的数据时,每个事务都有各自完整的数据空间。
一个事务内部的操作及使用的数据对其它并发事务是隔离的,并发执行的各个事务是不能互相干扰的。
标准SQL规范,定义了4个事务隔离级别,Read Uncommitted、Read committed、Repeatable Read、Serializable。
4. 持久性(Duration)
事务的持久性是指事务一旦提交后,数据库中的数据必须被永久的保存下来。即使服务器系统崩溃或服务器宕机等故障。只要数据库重新启动,那么一定能够将其恢复到事务成功结束后的状态。
2.1 Read phenomena
事务并发可能产生的问题:
user table
id | name | age |
---|---|---|
1 | Joe | 20 |
2 | Jill | 25 |
1.脏读(Dirty reads)
But in this case no row exists that has an id of 1 and an age of 21.
读到了另一个事务在处理中还未提交的数据
2.不可重复读(Non-repeatable reads)
A non-repeatable read occurs when, during the course of a transaction, a row is retrieved twice and the values within the row differ between reads.
t1第二次读的时候,读到了t2刚才提交的修改
3.幻读(Phantom reads)
其他t的操作影响了t1的查询结果集
4.其他(可忽略)
- 第一类丢失更新(Lost Update),数据库不支持事务时会发生这种情况,不用关心
两个事务同时修改一个数据项,但后一个事务中途失败回滚,则前一个事务已提交的修改都可能丢失。
Transaction 1 | Transaction 2 |
---|---|
start transaction | |
start transaction | |
query Joe's age 20 | |
query Joe's age 20 | |
change Joe's age, add 20, result 40 | |
commit | |
change Joe's age, minus 10, result 10 | |
roll back | |
Joe's age roll back to 20(Lost Update) |
T1 事务撤销时,把已经提交的T2事务的更新数据覆盖了。
T1 | T2 |
---|---|
R(A) | |
W(A) | |
W(A) |
Here is a blind write that means write without a read.
Here the changes made by transaction T1 are lost which is updated by a transaction T2.
- 第二类丢失更新(Second Lost Update Problem),不可重复读的特殊情况
两个并发事务同时读取和修改同一数据项,则后面的修改可能使得前面的修改失效。
Transaction 1 | Transaction 2 |
---|---|
start transaction | |
start transaction | |
query Joe's age 20 | |
query Joe's age 20 | |
change Joe's age, minus 10, result 10 | |
commit | |
change Joe's age, add 10, result 30 | |
commit | |
Joe's age 30(Lost Update) |
T1事务覆盖T2事务已经提交的数据,造成T2事务所做操作丢失
2.2 Isolation levels
隔离级别:
忽视 Lost updates这列,只要db支持事务,就不可能出现第一类丢失更新
1.Read Uncommitted
2.Read Committed
不会出现 Dirty reads,因为只有另一个事务提交了才会读出结果。
用 悲观锁、乐观锁 可解 Non-repeatable reads 和 Phantoms
3.Repeatable Read
类似与 select for update,事务执行过程中其他事务无法执行修改或插入操作,较为安全
4.Serializable
序列化,所有事务都依次顺序执行,不并发,实际中很少使用。
refer link:
https://en.wikipedia.org/wiki/Isolation_%28database_systems%29#Non-repeatable_reads
2.3 Other nit-pick
- Consistent Read
- ITL(Interested Transaction List)
- undo、redo
- Two-phase locking - 2PL
- Multiversion concurrency control (MVCC)
There is some good stuff called 'Google', go suck it yourself !
3 Partition
数据的分片,类似数据库的分库分表
3.1 Ranged Sharding
Horizontal or Vertical
数据平均分片
固定range,新增、移除(宕机)机器,rebalance 不好做,因为会影响 range
3.2 hash
数据不均衡
新增、移除(宕机)机器,rebalance 不好做,新增了节点本想降低负载、数据均衡,但却导致了大量数据迁移,增加了overhead。
3.3 consistent hash
根据key计算hash值,在hash环上顺时针找距离最近的服务器节点。
当要扩容时,将新的节点的hash放到环中,因为key是顺时针找距离最近的节点,所以新加入的节点只影响整个环中的一小段。
新增、移除(宕机)机器,rebalance 只影响部分。
负载均衡,过度平滑
问题:如果数据不均衡分布,导致同样节点却承受不一样的数据,负载压力大?机器宕机等情况怎么办?
google it
3.4 Other nit-pick
- round robin
- random
- weight round robin
- weight random
- least connections
- ...
Go google it!
注意:
- 热点数据
- rebalance
- replica 有效性(lock; version; timestamp; and so on.)
refer link:
https://medium.com/@jeeyoungk/how-sharding-works-b4dec46b3f6