Redis

1、持久化方式:RDB/AOF,RDB保存当前数据的快照,AOF保存的是写入命令的追加

2、RDB创建时机:定时任务---每100ms根据配置文件中配置的多久内有多少次数据变更(save 60ms 5) 来进行决定RDB文件的创建 SAVE命令会在当前进程创建RDB快照,但是会阻塞当前线程处理任务;BGSAVE则会派生出一个子进程,子进程创建快照,不阻塞redis处理任务。

3、AOF创建时机:配置文件中appendfsync配置:always(每次写入都直接落盘)、everysec(每秒落盘一次,默认)、no(操作系统决定落盘时机)

      AOF重写时机:在aof文件体量超过64mb,且比上次重写后的体量增加了100%时自动触发重写。(都是在配置文件中配置的)

      AOF重写过程:BGRERWITEAOF命令,同样派生出一个子进程,基于服务器上的数据生成AOF文件,期间产生的增量数据会写入AOF重写缓冲区,待AOF重写完成后追加AOF重写缓冲区的命令,之后替换原有的AOF文件。

4、主从同步原理

     客户端给服务器发送salveof ip port命令,将作为主服务器IP的从服务器。

     1)从服务器如果第一次同步,则发送pysnc ? -1命令给主服务器,主服务器回复fullresync runid offset给从服务器,并且fork一个子进程生成RDB文件,之后传给从服务器进行下数据同步。

     2)如果从服务器不是第一次同步,则发送 psync runid offset给主服务器,主服务器判断之前同步的不是本服务器,则执行上面行为;如果是本服务器,则回复+contine?,执行部分冲同步,将复制积压缓冲区offset以后的数据同步给从服务器

     3)同步后进入到命令传播模式,即主服务器执行一个命令则同步到从服务器

     4)从服务器每秒向主服务器发送replconf ack命令进行心跳检测,目的是为了检测网络连接状态,再者为了检测命令丢失导致数据不一致。

    注:复制积压缓冲区默认大小为1M,大小

可以调整最好设置为从服务器断线到连接主服务器平均时间 * 主服务器每秒接收写命令数量。

5、哨兵检测服务器下线

      主观下线:哨兵服务器以每秒一次的频率向其他哨兵服务器以及主从服务器发送PING命令,如果有一个在down-after-millionseconds毫秒内连续向哨兵返回无效回复,那么这个实例就被认为主观下线

      客观下线:哨兵认为服务器主观下线后,向其他哨兵询问,当足够数据量的哨兵回复认为已下线,则该哨兵认为该服务器客观下线。

6、哨兵模式下选举领头哨兵

      当一个哨兵认为服务器客观下线后,会向其他哨兵发送命令请求成为领头哨兵,当有半数以上的哨兵支持,则选举为领头哨兵

7、哨兵模式下故障转移

      1)在下线主服务器所属的从服务器里,挑选一个从服务器作为主服务器。主服务器选取原则:

           a)剔除从服务器中下线或者断线状态的服务器

           b)剔除所有最近五秒内没有收到回复过领头哨兵INFO的从服务器

           c)剔除所有与已下线主服务器连接断开超过down-after-millionseconds * 10毫秒的从服务器

           d)剩余从服务器中选出优先级最高的从服务器;如果有多个相同最高优先级服务器,则选取偏移量最大的服务器(即保存最新数据的从服务器);如果有多个优先级最高、复制偏移量最大从服务器,则选取runId最小的从服务器

       2)其他从服务器改为复制新的主服务器

       3)将已下线的主服务器设置为新的主服务器

集群模式为啥是16384个槽?

  整个集群数据库分为16384个槽。计算键属于槽的公式:CRC16&(16384 - 1),CRC16产生的hash值有16位,最大位65536(2^16)个值。

      1)正常的心跳数据包会携带完整的节点配置信息,16384是2KB,65536是8KB,传输时65535更浪费带宽

      2)redis集群不太可能扩展到超过1000个主节点,否则会造成网络拥塞

Redis为什么快

 

posted @ 2022-04-14 22:17  韩哈哈哈  阅读(33)  评论(0)    收藏  举报