程序员@IT·互联网

Redis集群

2024-01-09  本文已影响0人  我可能是个假开发

一、主从同步

单节点的Redis并发能力有上限,要进一步提升Redis的并发能力,就需要搭建主从集群,实现读写分离。


image.png

1.全量同步

主从第一次同步是全量同步:


image.png

因此,slave做数据同步时,必须向master声明自己的Replication id和offset,master才可以判断到底需要同步哪些数据。


image.png

2.全量同步流程

3.增量同步

slave重启后同步,执行增量同步。


image.png

repl_baklog大小有上限,写满后会覆盖最早的数据。如果slave断开时间过久,导致尚未备份的数据被覆盖,则无法基于log做增量同步,只能再次全量同步。

4.同步优化

image.png

5.总结

全量同步和增量同步区别:

执行全量同步时机:

执行增量同步时机:
slave节点断开又恢复,并且在repl_baklog中能找到offset时

二、Redis哨兵💂

1.哨兵的作用和原理

Redis提供了哨兵机制来实现主从集群的自动故障恢复。

image.png

作用:

2.服务状态监控

Sentinel基于心跳机制监测服务状态,每隔1秒向集群的每个实例发送ping命令:

image.png

3.选举master

一旦发现master故障,sentinal需要在slave中选择一个作为新的master,依据:

4.故障转移

image.png

当选择了其中一个slave为新的master后,故障转移步骤:

5.RedisTemplate的哨兵模式

在Sentinel集群监管下的Redis主从集群,其节点会因为自动故转移而发生变化,Redis的客户端必须感知这种变化及时更新连接信息。Spring的RedisTemplate底层利用lettuce实现了节点的感知和自动切换。

1.在pom文件中引入redis的starter依赖:

<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>

2.在配置文件application.yml中指定sentinel相关信息:

spring:
  redis:
    sentinel:
    master: mymaster # 指定master名称
    nodes: # 指定redis-sentinel集群信意
      - 192.168.150.101:27001
      - 192.168.150.101:27002
      - 192.168.150.101:27003

3.配置主从读写分离

@Bean
public LettuceClientConfigurationBuilderCustomizer configurationBuilderCustomizer(){
  return configBuilder -> configBuilder.readFrom(ReadFrom.REPLICA PREFERRED);
}

ReadFrom配置redis的读取策略:

三、Redis分片集群

主从和哨兵可以解决高可用、高并发读的问题。但是依然有两个问题没有解决:

使用分片集群可以解决上述问题,分片集群特征:

image.png

1.散列插槽

Redis会把每一个master节点映射到0~16383共16384个插槽(hash slot)上


image.png

数据kev不是与节点绑定,而是与插槽绑定。
redis会根据key的有效部分计算插槽值,分两种情况:

例如: key是num,那么就根据num计算,如果是{hcx}num,则根据hcx计算。计算方式是利用CRC16算法得到个hash值,然后对16384取余,得到的结果就是slot值。

2.集群伸缩

添加节点:redis -cli --cluster add-node ip:port ip:port
分配插槽:redis -cli --cluster reshard ip:port

3.故障转移

自动故障转移

手动故障转移
利用cluster failover命令可以手动让集群中的某个master宕机,切换到执行cluster failover命令的这个slave节点,实现无感知的数据迁移。其流程如下:

image.png

手动的Failover支持三种不同模式

4.RedisTemplate访问分片集群

RedisTemplate底层同样基于lettuce实现了分片集群的支持,而使用的步骤与哨兵模式基本一致
1.引入redis的starter依赖

  1. 配置分片集群地址
    3.配置读写分离

与哨兵模式相比,其中只有分片集群的配置方式略有差异,如下:

spring:
  redis:
    cluster:
      nodes: # 指定分片集群的每一个节点信息
        - 192.168.150.101:7001192.168,150.101:7002
        - 192.168.150.101:7003
        - 192.168.150.101:8001
        - 192.168.150.101:8002
        - 192.168.150.101:8003
上一篇 下一篇

猜你喜欢

热点阅读