一、CAP原理
CAP是分布式存储理论的基石。
C:Consistent 一致性
A:Availability 可用性
P:Partition tolerance 分区容忍性
分布式系统的节点往往都是分布在不同的机器上进行网络隔离开的,这意味着必然会有网络断开的风险,这个网络断开的场景的专业词汇叫做网络分区。
在网络分区发生时,两个分布式节点之间无法进行通信,我们对一个节点进行的修改操作将无法同步到另一个节点,所以数据一致性将无法满足,因为两个分布式节点的数据不再保持一致。除非我们牺牲可用性,也就是暂停分布式节点服务,在网络分区发生时,不再提供数据修改数据的功能,直到网络状况完全恢复正常再继续提供服务。
用一句话概括下CAP的原理就是:当网络分区发生时 一致性和可用性两难全。
二、主从复制
1.一主一从
2.一主多从
由上面两张图可以看出在主从复制中一个master可以有多个slave,但是一个slave只能有一个master 并且数据流向是单向的 master--->slave
偏移量:数据写入的字节,当主从偏移量一致时达到主从复制
run_id:一个redis服务器的标识,当从节点发现主节点的 run_id 发生变化时会进行全量复制
Redis的主从数据是异步同步的,所以分布式的Redis系统并不满足一致性要求,当客户端在Redis的主节点修改了数据后立即返回,即使在主从网络断开的情况下主节点依旧可以正常对外提供修改服务,所以Redis满足可用性。
Resdis保证最终一致性,从节点会努力追赶主节点,最终从节点的状态会和主节点的状态保持一致。如果网络断开了主节点的数据将会出现大量不一致,但一旦网络恢复,从节点会采用多种策略努力追赶继续努力保持和主节点一致。
主从复制的作用:
- 数据副本
- 扩展读性能
三、主从复制实现方式
1. slaveof 命令
复制命令:
- slaveof 127.0.0.1 6379
- 127.0.0.1 6379:为要复制节点的ip和端口号
取消复制命令:
- slaveof no one
2. 配置
可以在redis启动时可以修改下面的配置
- slaveof ip port
- slave-read-only yes
两种方式比较
方式 | 命令 | 配置 |
优点 | 无需重启 | 统一配置 |
缺点 | 不便于管理 | 需要重启 |
四、主从同步与从从同步
Redis 同步支持主从同步和丛丛同步,如下图所示,丛丛同步功能是Redis后续版本增加的功能,以减轻主节点的同步负担。
五、全量复制
由上图可以看出全量复制可以产生以下开销:
- bgsave 开销
- RDB 文件网络传输时间
- 从节点清空数据时间
- 从节点加载RDB时间
- 可能的AOF重写时间
部分复制
六、增量复制
Redia 同步的是指令流,主节点会将那些对自己的状态产生修改性影响的指令记录在本地的内存的buffer中,然后异步将buffer中的指令同步到从节点,从节点一边执行同步的指令流来达到和主节点一样的状态,一边向主节点反馈自己同步到哪里了(偏移量)。
因为内存的buffer是有限的,所以Redis主机诶单 不能将所有的指令都记录到内存buffer中。Redis的复制内存buffer是一个定长的环形数组,如下图所示,如果数组内容满了就会从头开始覆盖前面的内容。
如果因为网络状况不好,从节点在短时间内无法和 主节点进行同步,那么当网络状况恢复时,Redis的主节点中那些没有同步的指令在buffer中有可能已经被后续的指令覆盖掉了,从节点将无法直接通过指令流来进行同步,这个时候就需要用到更加复杂的同步机制----快照同步
七、快照同步
快照同步是一个非常耗费资源的操作如下图所示,它首先需要在主节点上进行一次bgsave,将当前内存的数据全部快照到磁盘文件中,然后再将快照文件的内容全部传送到从节点中。从节点将快照文件接受完毕后,立即执行一次全量加载,加载 之前先要将内存的数据清空,加载完毕后通知主节点继续进行增量同步。
在整个快照同步进行的过程中,主节点的复制buffer还在不停地往前移动,如果快照同步的时间过长或者buffer太小,都会导致同步期间的增量指令在复制buffer中覆盖,这样就会导致快照同步完成后无法进行增量复制,然后会再次发起快照同步,如此极有可能会陷入快照同步的死循环,所以务必配置一个合适的复制buffer大小参数,避免快照复制的死循环。
八、无盘复制
主节点在进行快照同步时会进行很耗时的文件IO操作,在非SSD次磁盘存储时快照同步会对系统的负载产生较大的影响。特别是当系统进行AOF的fsync操作时,如果发生快照同步,fsync将会被推迟执行,这就会严重影响主节点的服务效率。
所以从Redis 2.8.18 版本开始,Redis 支持无盘复制。所谓的无盘复制是指主服务器直接通过套接字将快照内容发送到从节点,生成快照是一个遍历的过程,主节点会一边遍历内存,一边将序列化的内容发送到从节点,从节点还是跟之前一样,先将接收到的内容存储到磁盘文件中再进行一次加载。
九、wait指令
Redis的复制是异步进行的,wait指令可以让异步复制变身同步复制,确保系统的强一致性(不严格)。wait指令是Redis 3.0 版本以后才出现的。
set key value
wait 1 0
wait 提供两个参数,第一个参数是从节点的数量N,第二个参数是时间 t,以毫秒为单位。两个参数的含义是:等待 wait 指令之前的所有写操作同步到 N 个从节点(也就是确保N从节点的同步没有滞后),最多等待时间 t ,如果 t=0 ,表示无限等待直到 N 个节点同步完成。
假设此时出现了网络分区,wait指令第二个参数时间 t=0,主从同步无法继续进行,wait 指令会永远阻塞,Redis 服务器将丧失可用性。