首先,我们提出一个问题,Redis做缓存性能这么好,如果挂了怎么办?
因此,我们提出来的第一个解决方案就是主从复制原则
一、主从复制
什么是主从复制:是指将一台Redis服务器的数据,复制到其他的Redis服务器。前者称为主节点(Master/Leader),后者称为从节点(Slave/Follower)数据的复制是单向的!只能由主节点复制到从节点(主节点以写为主、从节点以读为主)
主从复制的作用:
- 读写分离,性能扩展(主节点负责写入、从节点负责读取)
- 容灾快速恢复(一般建议配置一主多从的方式、当从服务器A出现问题,可以快速切换到从服务器B)
- 如果当主服务器出现问题呢?这个时候可以配置一主多从集群模式A、B,A、B之间建立某种联系,当主A出现问题,马上可以切换到主B
主从复制的缺点:由于所有的写操作都是在Master上执行的,然后同步更新到Slave上,所以从Master同步到Slave机器有一定延迟,当系统繁忙时,延迟会增大
二、哨兵
怎么知道主机挂掉了呢,我们可以用哨兵机制
哨兵模式是Redis的高可用方式,哨兵节点是特殊的redis服务,不提供读写服务,主要用来监控redis实例节点。 哨兵架构下client端第一次从哨兵找出redis的主节点,后续就直接访问redis的主节点,不会每次都通过sentinel代理访问redis的主节点,当redis的主节点挂掉时,哨兵会第一时间感知到,并且在slave节点中重新选出来一个新的master,然后将新的master信息通知给client端,从而实现高可用。
那么哨兵如何判断master节点是否下线?
- 每个 sentinel 哨兵节点每隔1s 向所有的master、slave以及其他 sentinel 节点发送一个PING命令,作用是通过心跳检测,检测主从服务器的网络连接状态
- 如果多个哨兵节点判断master无心跳,则启动故障切换
三、集群
背景:容量不够,redis如何进行扩容?并发写操作, redis如何分摊?
Redis集群实现了对Redis的水平扩容,即启动N个redis节点,将整个数据库分布存储在这N个节点中,每个节点存储总数据的1/N
Redis集群要使用数据分片来实现,一个Redis集群包含16384哥哈希槽,数据库中的每个键都属于这16384个哈希槽的其中一个,集群使用公式 CRC16(key) % 16384 来计算键 key 属于哪个槽, 其中 CRC16(key) 语句用于计算键 key 的 CRC16 校验和 。
集群中的每个节点负责处理一部分哈希槽。 举个例子, 一个集群可以有三个哈希槽, 其中:
- 节点 A 负责处理 0 号至 5500 号哈希槽。
- 节点 B 负责处理 5501 号至 11000 号哈希槽。
- 节点 C 负责处理 11001 号至 16384 号哈希槽。
为什么是16384(2^14)个哈希槽?
1、普通心跳数据包携带节点的完整配置,该配置可以用旧配置以幂等方式替换,以便更新旧配置。这意味着它们包含原始形式的节点的槽配置,16k的槽配置需要使用2k内存空间,但是使用65k槽将使用8k的内存空间。
2、同时,由于其他设计折衷,Redis集群不可能扩展到超过1000个节点。
标签:主从复制,Redis,redis,哨兵,集群,哈希,节点 From: https://www.cnblogs.com/wintermist/p/17229609.html