Redis主从复制

1、Redis 主从复制

主从复制,是指将一台Redis服务器的数据,复制到其他的Redis服务器。前者称为主节点(Master),后者称为从节点(Slave);数据的复制是单向的,只能由主节点到从节点。

1.主从复制流程

1.1、若启动一个Slave机器进程,则它会向Master机器发送一个“sync command”命令,请求同步连接。
1.2、无论是第一次连接还是重新连接,Master机器都会启动一个后台进程,将数据快照保存到数据文件中(执行rdb操作),同时Master还会记录修改数据的所有命令并缓存在数据文件中。
1.3、后台进程完成缓存操作之后,Master机器就会向Slave机器发送数据文件,Slave端机器将数据文件保存到硬盘上,然后将其加载到内存中,接着Master机器就会将修改数据的所有操作一并发送给Slave端机器。若Slave出现故障导致宕机,则恢复正常后会自动重新连接。
1.4、Master机器收到Slave端机器的连接后,将其完整的数据文件发送给Slave端机器,如果Mater同时收到多个Slave发来的同步请求,则Master会在后台启动一个进程以保存数据文件,然后将其发送给所有的Slave端机器,确保所有的Slave端机器都正常


image.png

2.搭建Redis 主从复制

docker启动三个reids容器

docker run --name redis1 --network redis_net -d -v D:\www\redis\redis1\config\redis.conf:/usr/local/etc/redis/redis.conf -v D:\www\redis\redis1\data\redis:/data  redis  redis-server /usr/local/etc/redis/redis.conf
image.png

将redis1作为主库,查看redis1的ip地址,
编辑redis.conf文件


#设置密码
requirepass 123123
masterauth 123123

slaveof 192.168.31.3 6379
daemonize yes   #开启守护进程
appendonly yes #开启AOF持久化功能

重启redis2 和redis3容器
进入redis3容器使用命令查看主从关系

info replication
image.png

master_link_status:up 代表主库在线状态
进入redis1查看从库状态,可以看到两个从库的详细信息


image.png

操作主库和从库,可以发现主库的的数据同步到了从库, 从库不能写入数据。


image.png

停掉redis1主库,进入redis2从库,数据可以读,但不能写了。
这个时候如果想恢复数据写入就要手动重新绑定主库了。所以就有哨兵模式出现了。

2.redis哨兵模式

Redis哨兵机制(Sentinel)是一种高可用性解决方案,用于监控和管理Redis集群中的多个节点。

2.1.基本概念

定义:Redis Sentinel是一个分布式系统,由一个或多个Sentinel进程组成,这些进程会监控Redis集群中的主节点和从节点的健康状态。
功能:主要负责监控、故障转移、通知和配置管理。

2.2.工作原理

监控:每个Sentinel进程定期通过PING命令检查主节点和从节点的状态。如果发现某个节点不可用,它会将其标记为主观下线状态。
故障判断:当多数Sentinel实例确认某个主节点无法访问时,它们会开始进行故障转移过程。
故障转移:通过选举机制,选举出一个新的主节点,并将原主节点的从节点重新配置为新的从节点。
通知:当Redis实例的状态发生变化时,Sentinel可以通过通知机制将故障或恢复信息发送给管理员或其他系统。


image.png

2.2、搭建Redis 哨兵模式

在各节点的配置文件创建sentinel.conf,并增加配置

sentinel monitor mymaster 192.168.31.2 6379 2 #指定该哨兵节点监控192.168.31.2:6379这个主节点,该主节点的名称是mymaster,最后的2的含义与主节点的故障判定有关:至少需要2个哨兵节点同意,才能判定主节点故障并进行故障转移
sentinel down-after-milliseconds mymaster 3000  #判定服务器down掉的时间周期,默认3000毫秒(3秒)

启动哨兵模式 先启master,再启slave,进入redis容器
redis-sentinel /usr/local/etc/redis/sentinel.conf &

image.png

连接哨兵 查看哨兵模式状态

redis-cli -p 26379   #26379 为哨兵模式默认端口

info sentinel 查看哨兵状态
image.png

上图可以看到哨兵的数量,主从库的信息等。
分别进入redis1和redis2 主库和从库 测试,主库可以读写,从库只能读数据。这时候redis主从复制的哨兵模式就搭建成功了。


image.png

2.3、模拟主库挂掉

我们将主库容器停掉,在进入redis3查看主从信息。这时候看到master变成了192.168.31.4也就是redis2


image.png

我们进入redis2,可以看到redis2 已经成为master


image.png

image.png

可以看到此时数据还存在,而且redis2可以写入数据了。

3、Redis 群集模式

集群,即Redis Cluster,是Redis 3.0开始引入的分布式存储方案。
集群由多个节点(Node)组成,Redis的数据分布在这些节点中。集群中的节点分为主节点和从节点:只有主节点负责读写请求和集群信息的维护;从节点只进行主节点数据和状态信息的复制。

3.1、集群的作用

数据分区:数据分区(或称数据分片)是集群最核心的功能。
集群将数据分散到多个节点,一方面突破了Redis单机内存大小的限制,存储容量大大增加;另一方面每个主节点都可以对外提供读服务和写服务,大大提高了集群的响应能力。
Redis单机内存大小受限问题,在介绍持久化和主从复制时都有提及;例如,如果单机内存太大,bgsave和bgrewriteaof的fork操作可能导致主进程阻塞,主从环境下主机切换时可能导致从节点长时间无法提供服务,全量复制阶段主节点的复制缓冲区可能溢出。
高可用:集群支持主从复制和主节点的自动故障转移(与哨兵类似);当任一节点发生故障时,集群仍然可以对外提供服务。

3.2、集群模式的数据分片

1、Redis集群引入了哈希槽的概念
2、Redis集群有 16384 个哈希槽( 编号0-16383)
3、集群的每个节点负责一部分哈希槽
4、每个Key 通过 CRC16校验后对16384取余来决定放置哪个哈希槽,通过这个值,去找到对应的插槽所对应的节点,然后直接自动跳转到这个对应的节点上进行存取操作
<- - -以3个节点组成的集群为例- - ->
节点A 包含0到5460号哈希槽
节点B 包含5461到10922号哈希槽
节点C 包含10923到16383号哈希槽

3.3、Redis集群的主从复制模型

集群中具有A、B、C三个节点,如果节点B失败了,整个集群就会因缺少5461-10922这个范围的槽而不可以用。
为每个节点添加一个从节点A1、B1、C1整个集群便有三个Master节点和三个slave节点组成,在节点B失败后,集群选举B1位为的主节点继续服务。当B和B1都失败后,集群将不可用。

3.5、搭建Redis 群集模式

redis的集群一般需要6个节点,3主3从。方便起见,这里我们启动6个redis容器:
首先依次在redis的本地配置文件redis.conf中,开启集群模式。

cluster-enabled yes     
cluster-config-file nodes-1.conf
cluster-node-timeout 15000
appendonly yes          

依次挂载配置文件并启动:

docker run --name redis1 --network redis_net -d -v D:\www\redis\redis1\config:/usr/local/etc/redis -v D:\www\redis\redis1\data\redis:/data  redis  redis-server /usr/local/etc/redis/redis.conf

启动集群

redis-cli --cluster create redis1:6379 redis2:6379 redis3:6379 redis4:6379 192.168.31.6:6379 192.168.31.7:6379 --cluster-replicas 1
#六个实例分为三组,容器使用的同一个网络使用容器名称或者ip都可以,记得机上端口号,每组一主一从,前面的做主节点,后面的做从节点。下面交互的时候 需要输入 yes 才可以创建。
--replicas 1 表示每个主节点有1个从节点。

测试群集,进入容器中

redis-cli -c                    #加-c参数,节点之间就可以互相跳转
cluster slots           #查看节点的哈希槽编号范围
image.png

可以看到有三个节点,每个节点包含一个主从服务。


image.png

查询数据可以看到根据key调到对应的节点。name存在ip为192.168.31.3的redis2容器里。

cluster keyslot name  #查看name键的槽编号

进入redis2容器,查看存储的所有数据


image.png

进入redis2的从服务容器redis6,查看存储的所有数据


image.png

可以看到主从的数据一致。现在可以把redis2 容器stop掉 再测试一下
第一次连接还是连接的是主数据库192.168.31.3
image.png

再次连接就是连的是从服务192.168.31.7


image.png

再次查看集群状态:第二个节点变为了一台服务。
image.png

小结:
总的来说redis主从复制是解决了redis数据安全的问题。主库挂掉数据在从库上还存在。可以手动将从库切换为主库。
哨兵模式解决了主从复制中主从切换的问题,在主库挂掉时候,通过选举算法,切换到新的主库。
集群是更高级的模式,增加了数据库的分片存储,每个节点可以在主库挂掉时候进行哨兵模式选举出新的主库。避免单机数据过大以及数据安全的问题

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容