Redis集群

99 阅读6分钟

redis有哪几种集群

主从模式

CPA原理

  1. CPA原理是分布式存储理论的基石: C(一致性); A(可用性); P(分区容忍性)
  2. 当主从网络无法连通时,修改操作无法同步到节点,所以“一致性”无法满足
  3. 除非我们牺牲“可用性”,也就是暂停分布式节点服务,不再提供修改数据功能,直到网络恢复

一句话概括CAP: 当网络分区发生时,一致性 和 可用性 两难全

redis主动同步机制

  • 和MySQL主从复制的原因一样,Redis虽然读取写入的速度都特别快,但是也会产生读压力特别大的情况
  • 为了分担读压力,Redis支持主从复制,Redis的主从结构可以采用一主多从或者级联结构
  • Redis主从复制可以根据是否是全量分为全量同步增量同步
    注:redis主节点Master挂掉时,运维让从节点Slave接管(redis主从默认无法自动切换,需要运维手动切换)

在这里插入图片描述

全量同步RDB(快照同步)

全量同步:从服务器把有的数据全部丢弃,让主服务把所有数据全部发给他

注:Redis全量复制一般发生在Slave初始化阶段,这时Slave需要将Master上的所有数据都复制一份。具体步骤如下:

1)从服务器连接主服务器,发送SYNC命令;

2)主服务器接收到SYNC命名后,开始执行BGSAVE命令生成RDB文件并使用缓冲区记录此后执行的所有写命令;

3)主服务器BGSAVE执行完后,向所有从服务器发送快照文件,并在发送期间继续记录被执行的写命令;

4)从服务器收到快照文件后丢弃所有旧数据,载入收到的快照;

5)主服务器快照发送完毕后开始向从服务器发送缓冲区中的写命令;

6)从服务器完成对快照的载入,开始接收命令请求,并执行来自主服务器缓冲区的写命令;

7)完成上面几个步骤后就完成了从服务器数据初始化的所有操作,从服务器此时可以接收来自用户的读请求。
在这里插入图片描述
增量同步AOF

增量同步:主服务器只发送从服务器缺少的数据

  1. 主节点会将那些对自己状态产生修改性影响的指令记录在本地内存buffer中,然后异步将buffer中指令同步到从节点
  2. 从节点一边执行同步指令达到主节点状态,一边向主节点反馈自己同步到哪里(偏移量)
  3. 当网络状态不好时,从节点无法和主节点进行同步,当网络恢复时需要进行快照同步

redis主从同步策略

  1. 主从刚刚连接的时候,进行全量同步;全同步结束后,进行增量同步
  2. 当然,如果有需要,slave 在任何时候都可以发起全量同步
  3. redis 策略是,无论如何,首先会尝试进行增量同步,如不成功,要求从机进行全量同步

redis主从优缺点
优点:
写主库、读从库,减轻服务器读压力

缺点:
但是redis主从不能自动切换master,所以master如果挂掉了,整个集群都不可以写入

哨兵模式

哨兵模式如何解决主从问题

  1. 当用Redis做主从方案时,假如master宕机,Redis本身无法自动进行主备切换
  2. Redis-sentinel本身也是一个独立运行的进程,它能监控多个master-slave集群,发现master宕机后能进行自动切换。

sentinel原理

  1. sentinel负责持续监控主节点的健康,当主节挂掉时,自动选择一个最优的从节点切换成主节点
  2. 从节点来连接集群时会首先连接sentinel,通过sentinel来查询主节点的地址
  3. 当主节点发生故障时,sentinel会将最新的主节点地址告诉客户端,可以实现无需重启自动切换redis

Sentinel支持集群

  1. 只使用单个sentinel进程来监控redis集群是不可靠的,当sentinel进程宕掉后sentinel本身也有单点问题
  2. 如果有多个sentinel,redis的客户端可以随意地连接任意一个sentinel来获得关于redis集群中的信息

Sentinel版本

  1. Sentinel当前稳定版本称为Sentinel 2,Redis2.8和Redis3.0附带稳定的哨兵版本
  2. 安装完redis-3.2.8后,redis-3.2.8/src/redis-sentinel启动程序 redis-3.2.8/sentinel.conf是配置文件

运行sentinel两种方式(效果相同)

法1:redis-sentinel /path/to/sentinel.conf
法2:redis-server /path/to/sentinel.conf --sentinel

  1. 以上两种方式,都必须指定一个sentinel的配置文件sentinel.conf,如果不指定,将无法启动sentinel。
  2. sentinel默认监听26379端口,所以运行前必须确定该端口没有被别的进程占用。

sentinel缺点

  • redis的slave和master数据时完全一样的,但是有个问题,redis数据时存储在内存中
  • 内存空间有限,所以哨兵模式不能处理大的数据量

codis

为什么会出现codis

  1. 在大数据高并发场景下,单个redis实例往往会无法应对
  2. 首先redis内存不易过大,内存太大会导致rdb文件过大,导致主从同步时间过长
  3. 其次在CPU利用率中上,单个redis实例只能利用单核,数据量太大,压力就会特别大

什么是codis

  1. codis是redis集群解决方案之一,codis是GO语言开发的代理中间件
  2. 当客户端向codis发送指令时,codis负责将指令转发给后面的redis实例来执行,并将返回结果转发给客户端

codis部署方案

  1. 单个codis代理支撑的QPS比较有限,通过启动多个codis代理可以显著增加整体QPS
  2. 多codis还能起到容灾功能,挂掉一个codis代理还有很多codis代理可以继续服务
    在这里插入图片描述

codis分片的原理

  1. codis负责将特定key转发到特定redis实例,codis默认将所有key划分为1024个槽位
  2. 首先会对客户端传来的key进行crc32计算hash值,然后将hash后的整数值对1024进行取模,这个余数就是对应的key槽位
  3. 每个槽位都会唯一映射到后面的多个redis实例之一,codis会在内存中维护槽位和redis实例的映射关系
  4. 这样有了上面key对应的槽位,那么它应该转发到那个redis实例就很明确了
  5. 槽位数量默认是1024,如果集群中节点较多,建议将这个数值大一些,比如2048,4096
    在这里插入图片描述

不同codis槽位如何同步

1. 如果codis槽位值存在内存中,那么不同的codis实例间的槽位关系得不到同步

2. 所以codis还需要一个分布式配置存储的数据库专门来持久化槽位关系

3. codis将槽位关系存储在zookeeper中,并且提供一个dashboard可以来观察和修改槽位关系

原址参考:不做大哥好多年