2-Redis持久化、主从、哨兵、集群
2021-06-05 11:43:47 0 举报
AI智能生成
Redis持久化、主从、哨兵、集群
作者其他创作
大纲/内容
持久化
1、RDB
概念:在<font color="#f15a23">默认情况</font>下, Redis 将内存数据库快照保存在名字为 dump.rdb 的二进制文件中。
两种方式
save
<ul><li>同步方式,会阻塞客户端命令</li></ul>
<font color="#c41230">bgsave(默认)</font>
<ul><li>异步方式,在主线程<b><font color="#c41230">fork子线程时会短暂阻塞命令</font></b></li></ul>
命令
<font color="#c41230">save 60 1000</font>(60 秒内有至少有 1000 个键被改动)<br>
2、AOF
概念:AOF 持久化,将修改的每一条指令记录进文件appendonly.aof中(先写入os cache,每隔一段时间 fsync到磁盘)<br>
三种方式
<ul><li>appendfsync <font color="#f15a23">always</font>:每次有新命令追加到 AOF 文件时就执行一次 fsync ,非常慢,也非常安全。</li></ul>
<ul><li>appendfsync everysec(<font color="#c41230"><b>推荐</b></font>):<font color="#c41230">每秒 fsync 一次</font>,足够快,并且在故障时只会丢失 1 秒钟的数据。</li></ul>
<ul><li>appendfsync no:从不 fsync ,将数据交给操作系统来处理。更快,也更不安全的选择。</li></ul>
AOF重写
针对同一个缓存,只取最终状态的值。(只关注最终结果)
3、混合持久(<font color="#c41230">4.0以后</font>)
前置:必须开启AOF
架构
1、主从
2、哨兵
缺点
<ul><li>主从切换的瞬间存在<font color="#c41230"><b>访问瞬断</b></font>的情况</li></ul>
<ul><li>单个主节点不能存配置过大的内存,以免导致RDB文件过大</li></ul>
<ul><li>并发不是特别高</li></ul>
3、集群
通讯机制(gossip)
<ul><li>meet</li></ul>
新节点加入时,发送meet,然后新节点开始和其他节点进行通信<br>
<ul><li>ping</li></ul>
每个节点都会频繁给其他节点发送ping,其中包含自己的状态还有自己维护的集群元数据,互相通过 ping交换元数据(类似自己感知到的集群节点增加和移除,hash slot信息等);
<ul><li>pong</li></ul>
对ping和meet消息的返回,包含自己的状态和其他信息,也可以用于信息广播和更新;
<ul><li>fail</li></ul>
某个节点判断另一个节点fail之后,就发送fail给其他节点,通知其他节点,指定的节点宕机了。
网络抖动<br>
<font color="#c41230">cluster-node-timeout</font>
表示当某个节点持续 timeout 的时间失联时,才可以认定该节点出现故障,需要进行主从切换。<br>
集群选取原理
1、slave节点发现<font color="#f15a23">master变为fail,广播给其他节点。</font><br>
2、只有<font color="#c41230">master节点会响应</font>,并发送FAILOVER_AUTH_ACK,对每一个 从节点(会有多个从节点)<font color="#c41230">只发送一次ack</font>
<span style="font-size: inherit;">3、slave当接受到<font color="#c41230">半数以上master的ack</font>返回,这时该节点会被选举为新的master。</span><br>
<font color="#c41230"><b>为什么集群节点的时基数的原因</b></font>
多个节点接受一样的ack返回时
避免:延迟计算公式: DELAY = 500ms + random(0 ~ 500ms) + SLAVE_RANK * 1000ms
否则:进入下一轮周期选举
4、该选举成功的节点,以Pong消息通知其他集群节点。
集群脑裂问题
概念:出现多个主节点
避免:min‐replicas‐to‐write 1 :主节点至少同步给一个从节点,才算命令执行成功
批量操作命令<br>
例:mset,mget这样的多个key的原生批量操作命令,需支持所有key落在<font color="#c41230">同一槽点</font>的情况<br>
在对应key前面<b><font color="#c41230">加上{user1}类似前缀</font></b>,这样计算槽位时只会计算{}内的内容。<br>
0 条评论
下一页