Redis学习笔记

持久机制

rdb快照(snapshot):默认情况下,redis将快照保存在名字为dump.rdb的二进制文件中,可以配置在"N秒有M个改动"自动保存一次,比如说 :save 60 100 意思就是在60秒内,至少有100个修改,就回执行一次保存。rdb快照还可以手动执行save或者bgsave命令来手动保存。此命令会将redis当前内中中的数据快照保存至一个新的rbd文件,并覆盖原有的快照文件。

aof(append-only file):会将每条修改命令保存至appendonly.aof文件中,此功能不会默认开启,需要配置 appendonly yes来打开此功能,备份机制有三个选项分别是

appendfsync always :每次有新命令追加到 AOF 文件时就执行一次 fsync ,非常慢,也非常安全。
appendfsync everysec :每秒 fsync 一次,足够快,并且在故障时只会丢失 1 秒钟的数据。
appendfsync no :从不 fsync ,将数据交给操作系统来处理。更快,也更不安全的选择。
       推荐(并且也是默认)的措施为每秒 fsync 一次, 这种 fsync 策略可以兼顾速度和安全性。
 
 
RDB和AOF对比
命令
RDB
AOF
启动优先级
体积
恢复速度
数据安全性
容易丢数据
根据策略决定
在Redis4.0后推出了 混合持久化通过 aofuserdbpreamble yes 此配置来开启(必须要先开启aof)。 AOF在重写时,不再是单纯将内存数据转换为RESP命令写入AOF文件,而是将 重写 这一刻之前的内存做RDB快照处理,并且将RDB快照内容和 增量的AOF修改内存数据的命令存在一 起,都写入新的AOF文件,新的文件一开始不叫appendonly.aof,等到重写完新的AOF文件才会进行改 名,覆盖原有的AOF文件,完成新旧两个AOF文件的替换。
 
 
Redis主从原理
salve连接上master后,会发送一个PSYNC命令给master请求复制数据。master收到PSYNC命令后会执行gbsave生成一份快照发给savle(在生成快照这个期间,会有一个 replication buffer来存储新来的命令,master将快照发送完成给savle后,会将这个buffer的数据也发给savle)。后面就是一直长连接,将master执行的命令发一份给savle。                                                                                                              

 
部分数据复制恢复机制(也就是savle宕机后的恢复机制)
当savle从新连接到master后,savles发送PSYNC的同事会带上一个偏移量offset,如果master节点能从自己的 replication buffer中能定位到这个偏移量则会将这个偏移量的后面的数据同步给savles,如果找不到则会全量复制。  

主从风暴
多个从节点同时复制主节点导致主节点压力过大。
解决方案:让部分从节点与从节点(与主节点同步)同步数据
 
Redis集群原理
redis将所有的数据划分为16384个槽位(slots),每个节点都负责一部分,槽位信息存储在节点中,当有客户端来连接redis时,会先拿取一份槽位信息缓存起来,这样当要查找某个key时,会在客户端进行一次 槽位定位算法来算出所在的槽位,定位到具体是属于哪个节点。
槽位定位算法:使用CRC16算出一个整数,然后取模(也就是取余[16384])
 
Redis集群选举原理
当slave发现自己的master变为FAIL状态时,便尝试进行Failover,以期成为新的master。由于挂掉的master 可能会有多个slave,从而存在多个slave竞争成为master节点的过程, 其过程如下:
1.savle发现自己的master状态为FAIL
2.将自己记录的集群currentEpoch加1(类似一个版本号),并广播FAILOVER_AUTH_REQUEST 信息
3.其他master节点收到该信息,会判断这个请求是否合法,如果合法会发送FAILOVER_AUTH_ACK(这里只会回复一次)
4.收集其他master节点返回FAILOVER_AUTH_ACK的数量
5.slave收到 超过半数master的ack 后变成新Master(这里解释了集群为什么至少需要三个主节点),如果每个savle收到的ack相同,则重新执行一遍流程,直到选举成功
6.选举成功后,广播自己当前节点的元信息
从节点发现主节点FAIL后,并不是马上就选举的,而是有一段延时。(这样做是防止其他savle还未发现master已经FAIL了)
 
 
延迟计算公式(各版本可能会有差异):
DELAY = 500ms + random(0 ~ 500ms) + SLAVE_RANK * 1000ms
•SLAVE_RANK表示此slave已经从master复制数据的总量的rank。Rank越小代表已复制的数据越新。这种方 式下,持有最新数据的slave将会首先发起选举(理论上)。
 
脑裂导致数据丢失问题
 
master收到新的数据后,还未及时同步给savle节点,导致丢失数据。
解决方式min replicas to write 1    // 写数据成功最少同步的 slave 数量,这个数量可以模仿大于半数机制配置,比如 集群总共三个节点可以配置 1 ,加上 leader 就是 2 ,超过了半数
注意:此配置可能会影响可用性,比如savle要是少于一个,就算master没宕机,可能也会影响使用
 
 
 
 
 
 
 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

苏克。

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值