java架构师课程学习心得-第3篇-Redis集群的三种模式

Redis集群的三种模式


前言

目前已经学完专题三,里面有很多干货,例如负载均衡,redis,mysql的优化和mycat中间件等,本文先讲讲redis集群方面的学习心得。


一、Redis主从复制模式

1.使用主从复制模式的好处

1)避免redis服务出现单点故障
2)单节点QPS有限

2.主要应用场景

1)读写分离场景,规避redis单机瓶颈
2)故障切换,master出现问题后还有slave节点可以使用,需要手动切换

3.如何配置主从模式

两种方式
1.直接在命令行执行slaveof [master_ip] [port]
2.在配置文件中增加slaveof [master_ip] [port]
还可以指定从服务器为只读:slave-read-only yes
退出主从模式:slaveof no one

4.主从复制流程

1.从服务器通过psync命令发送已有的同步进度(同步源ID和同步offset)
2.master收到请求,同步源为当前master,则根据offset进行增量同步
3.同步源非当前master,则进行全量同步

5.主从复制模式的优化

为了减小master执行持久化造成的开销,可以让master关闭持久化,slave配置
为不定期保存或是启用AOF

6.主从复制模式下的数据恢复

两种方式
1.将原来的从服务器,变为主服务器,将宕机的master重启,并同步刚刚转为master的服务器
2.将slave上的备份文件,拷贝到master的redis安装目录或是配置文件中指定的数据存储目录

二、Redis哨兵高可用模式

1.什么是哨兵

Sentinel(哨兵)是Redis的高可用性解决方案:由一个或多个Sentinel实例组成的Sentinel系统可以监视任意多个主服务器,以及这些主服务器属下的所有从服务器,并在被监视的主服务器进入下线状态时,自动将下线主服务器属下的某个从服务器升级为新的主服务器

2.哨兵可以干啥

1.通过发送命令,让Redis服务器返回监控其运行状态,包括主服务器和从服务器
2.当哨兵监测到master宕机,会自动将slave切换成master,然后通过发布订阅模式通知其他的从服务器,修改配置文件,让它们切换主机

3.服务发现和健康检查流程

启动redis主从集群–>>启动哨兵(客户端通过哨兵发现redis实例信息)–>>哨兵通过master发现集群内所有实例信息–>>哨兵监控redis实例的监控状况

4.故障切换流程

1.哨兵一旦发现master不能正常提供服务(叫做主观下线),则通知给其他哨兵
2.当一定数量的哨兵都认为该master挂了(叫做客观下线),就会选举一个哨兵leader来执行故障转移
3.负责执行的哨兵在slave中选取一个座位新的master,将其他slave重新设定为新master的从属

5.故障切换过程中的选举

1).哨兵leader的选举机制

基于raft算法实现选举机制,详情可见http://thesecretlivesofdata.com/raft/,流程如下:
1.拉票阶段:每个哨兵都希望自己成为leader
2.哨兵节点收到拉票命令后,如果没有收到或同意其他哨兵节点的拉票请求,则把票投给该哨兵节点(每个哨兵节点只有1票)
3.如果哨兵节点发现自己的票数已经超过一半,那么它将成为leader,去执行故障转移
4.投票结束后,如果超过failover-timeout的时间内,没有进行实际的故障转移,则从新进行投票选举
在这里插入图片描述

2).slave升级master的选取机制

1.slave要是正常状态,非S_DOWN,O_DOWN,DISCONNECTED
2.按照slave-priority配置的优先级,进行选曲
3.优先级相同,则按照数据同步情况选举,拥有数据最完善的slave将成为master
4.第3个条件相同,则按照run id选取,id为字典顺序

6.哨兵模式的部署方案

建议为一主两从、或多从,哨兵数量建议为3个及以上,最好为奇数个

三 Redis集群分片模式

1.官方集群方案

redis cluster是Redis的分布式集群解决方案,在3.0版本退出后有效的解决了redis分布式方面的需求,实现了数据在多个redis节点之间自动分片、故障自动转移、扩容机制等功能。在这里插入图片描述

2.为什么要使用分片存储

redis中缓存数据很大,可能在10GB以上,单台服务器内存资源不足,也影响读写效率,故此引入分片存储技术。

3.如何理解槽slot

如果有三台服务器组成的redis集群,将每台服务器比作高铁的车厢,就可以把槽理解为每个车厢的座位,它的作用就是让每个客户端的读写请求可以找到对应的车厢

4.槽slot是如何发挥作用的

1.slot位置信息计算在服务端进行,客户端随机连接一台服务器,若位置信息不属于该服务器,
则告诉客户端应该去连接哪一台服务器,然后客户端再向正确的服务器发送请求
在这里插入图片描述

2.客户端可以缓存服务端中的slot位置信息,然后将每条要存储的数据所在的位置信息的计算过程,迁移到客户端去,这样就可以一次性准确的找到对应的服务器了
在这里插入图片描述

3.当新增了一台服务器时,服务端的slot信息会发生变化,此时客户端发送的请求可能会被重定向,
当客户端收到重定向信息时,就会刷新本地缓存的slot信息
在这里插入图片描述

5.面试中可能会问的问题

1)槽的个数为什么是16834个

slots槽计算方式:HASH_SLOT = CRC16(key) mod 16384,CRC16算法产生的hash值有16bit,该算法可以产生2^16-=65536个值,那作者在做mod运算的时候,为什么不mod 65536,而选择16384?原因如下:

(1)为了节省带宽,集群节点之间会定期发送ping/pong消息,而消息的主要大小是槽的数量/8,如果是16384个槽,消息大小是2k,如果是65536个槽,消息大小是8k,按照配置,节点间每秒中会发送10次消息,这样就节省了带宽
(2)Redis主节点的配置信息中,它所负责的哈希槽是通过一张bitmap的形式来保存的,在传输过程中,会对bitmap进行压缩,但是如果bitmap的填充率slots / N很高的话(N表示节点数),bitmap的压缩率就很低。如果节点数很少,而哈希槽数量很多的话,bitmap的压缩率就很低。
(3)当需要增加节点时,只需要把其他节点的某些哈希槽挪到新节点就可以了;当需要移除节点时,只需要把移除节点上的哈希槽挪到其他节点就行了。在这一点上,我们以后新增或移除节点的时候不用先停掉所有的 redis 服务。

2)ask和moved重定向的区别

重定向包括两种情况
如果是确定slot不属于当前节点,redis会返回moved
如果当前redis节点正在处理slot迁移,则代表此处请求对应的key暂时不在此节点,返回ask,告诉客户端本次请求重定向

3)数据倾斜和访问倾斜的问题

集群建立初期,数据量较小时,可以使用reshard,后期数据量大了,就要做迁移
解决办法 调整key的策略 + slot迁移
迁移过程如下,完整的迁移流程:
在迁移目的节点执行cluster setslot IMPORTING 命令,指明需要迁移的slot和迁移源节点。
在迁移源节点执行cluster setslot MIGRATING 命令,指明需要迁移的slot和迁移目的节点。
在迁移源节点执行cluster getkeysinslot获取该slot的key列表。
在迁移源节点执行对每个key执行migrate命令,该命令会同步把该key迁移到目的节点。
在迁移源节点反复执行cluster getkeysinslot命令,直到该slot的列表为空。
在迁移源节点和目的节点执行cluster setslot NODE ,完成迁移操作。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值