Redis的主从复制和哨兵模式

Redis的主从复制和哨兵模式

Redis集群搭建(一主二从)

replication 主从复制配置文件 redis.conf

主从复制相关的配置项在redis.conf中的replication一栏中

以下是与 Redis 复制相关的配置项及其解释:

  1. replicaof <masterip> <masterport> :
  • 这个配置项用于设置 Redis 服务器作为从服务器(slave),并指定其主服务器(master)的 IP 地址和端口。
  • 例如,replicaof 192.168.1.100 6379 意味着这台 Redis 服务器将从 IP 地址为 192.168.1.100,端口为 6379 的 Redis 服务器复制数据。
  1. masterauth <masterr-password>:
  • 如果主服务器设置了密码,那么从服务器需要使用这个配置项来提供密码,以便能够连接到主服务器并进行数据复制。
  • 例如,masterauth mysecretpassword 将会设置从服务器的主服务器密码为 mysecretpassword
  1. repl-ping-slave-period :
  • 从服务器会每隔指定的秒数向主服务器发送一个 PING,用于确保连接是活动的。默认值是 10 秒。
  • 你可以通过调整这个值来平衡网络流量和确保连接的稳定性。
  1. repl-timeout :
  • 这是一个超时时间,用于定义从服务器等待主服务器的响应的最长时间。如果在这个时间内没有收到响应,从服务器将断开连接。默认值是 60 秒。
  • 如果网络不稳定或主服务器负载很高,可能需要增加这个值。
  1. repl-disable-tcp-nodelay:
  • 这个选项控制 TCP NoDelay 选项是否应用于从服务器与主服务器之间的连接。
  • 默认情况下,该选项是关闭的,这意味着 TCP NoDelay 是启用的。启用 TCP NoDelay 可以减少网络延迟,但可能会增加 CPU 使用率。
  • 在某些情况下,禁用 TCP NoDelay 可能会提高性能,尤其是在高延迟的网络环境中。
  1. repl-backlog-size :
  • 这个配置项设置了复制积压缓冲区的大小。复制积压是一个缓冲区,用于保存最近被主服务器写入的数据,以便从服务器可以进行部分同步。
  • 默认值是 1MB。如果你的数据集很大,或者从服务器经常断开连接并重新连接,可能需要增加这个值。
  1. repl-backlog-ttl :
  • 这个配置项设置了复制积压缓冲区的存活时间。当缓冲区中的数据超过这个指定的秒数没有被从服务器取走时,这些数据将被移除。
  • 默认值是 3600 秒(1 小时)。如果网络环境不稳定,或者从服务器经常离线,可能需要减少这个值。

Redis主从复制工作原理

Redis的主从复制可以根据是否是全量分为全量复制增量复制

全量复制

Redis的全量复制发生在Slave(从节点)初始化阶段,此时slave需要将master主机上的所有数据都复制一份。

  • 从服务器连接主服务器,发送SYNC同步命令
  • 主服务器收到sync同步命令后,开始执行bgsave命令生成.rdb文件,并使用缓冲区记录此后执行的所有写命令。
  • 主服务器bgsave执行完成之后,向所有从服务器发送快照,并在发送快照期间继续记录被执行的写命令。
  • 从服务器收到快照文件后,丢弃所有的旧数据,载入收到的快照
  • 主服务器快照发送完毕之后开始向从服务器发送缓冲区中的写命令
  • 从服务器完成对快照的载入,开始接收命令请求,并执行来着主服务器缓冲区的写命令。

下面是从网上拿来的两张图,可以更清晰的了解主从复制原理及流程


增量复制

redis的增量复制发生在slave(从节点)初始化后开始正常工作时,主服务器发生的写操作同步到从服务器的过程。

增量复制:主服务器每执行一个写命令就会向从服务器发送一个相同的写命令,从服务器接收并执行收到的写命令。

redis主从复制策略

主从刚刚连接的时候,进行全量同步;全同步结束后,进行增量同步。当然,如果有需要,slave 在任何时候都可以发起全量同步。

redis 策略是,无论如何,首先会尝试进行增量同步,如不成功,要求从机进行全量同步。

搭建集群 (主从复制引入)

步骤如下:

  1. 拷贝redis.conf配置文件,我们一共需要三台redis-server,所以拷贝三份即可。
  2. 修改配置文件,因为每个redis-server都是不同的实例,所以需要修改配置文件
    • 修改port端口
    • 修改pidfile文件名
    • 后台启动服务
    • 修改rdb或者aof文件存放位置(具体看你的持久化使用的是rdb还是aof)
    • 修改logfile文件存放位置
    • 修改replication中的配置 replicaof masterip masterport(配置文件是永久有效,命令是临时有效 slaveof masterip masterport)
  3. 启动每个服务,并且查看不同redis-server的配置信息info replication

开始搭建集群!6379为主节点,其余6380,6381为从节点。

bash 复制代码
cp redis7.conf redis6379.conf
cp redis7.conf redis6380.conf
cp redis7.conf redis6381.conf

主节点6379

bash 复制代码
vim redis6379.conf

# 改动内容如下
bind 0.0.0.0 # 我这里是为了允许任意远程登录
protected-mode no # 关闭保护模式
port 6379  # 服务启动端口
daemonize yes # 后台启动
pidfile /var/run/redis_6379.pid # 指定pidfile文件
logfile "/myredis/redis6379.log" # 指定Logfile文件
dbfilename dump6379.rdb # 指定rdb文件名
dir /myredis/ # 指定工作目录
requirepass robin # 设定redis服务器的密码

# 保存退出
ESC shift: wq

从节点6380

bash 复制代码
vim redis6380.conf

# 改动内容如下
bind 0.0.0.0 # 我这里是为了允许任意远程登录
protected-mode no # 关闭保护模式
port 6380  # 服务启动端口
daemonize yes # 后台启动
pidfile /var/run/redis_6380.pid # 指定pidfile文件
logfile "/myredis/redis6380.log" # 指定Logfile文件
dbfilename dump6380.rdb # 指定rdb文件名
dir /myredis/ # 指定工作目录
replicaof 127.0.0.1 6379 # 指定从机的主机
masterauth robin # 从机的主机的密码验证

requirepass robin # 设定redis服务器的密码

# 保存退出
ESC shift: wq

从节点6381

bash 复制代码
vim redis6381.conf

# 改动内容如下
bind 0.0.0.0 # 我这里是为了允许任意远程登录
protected-mode no # 关闭保护模式
port 6381  # 服务启动端口
daemonize yes # 后台启动
pidfile /var/run/redis_6381.pid # 指定pidfile文件
logfile "/myredis/redis6381.log" # 指定Logfile文件
dbfilename dump6381.rdb # 指定rdb文件名
dir /myredis/ # 指定工作目录
replicaof 127.0.0.1 6379 # 指定从机的主机
masterauth robin # 从机的主机的密码验证

requirepass robin # 设定redis服务器的密码

# 保存退出
ESC shift: wq

启动三个服务

bash 复制代码
# redis-server redis配置文件路径
redis-server redis6379.conf
redis-server redis6380.conf
redis-server redis6381.conf

使用ps -ef | grep redis查看一下进程

登录到三台服务器上观察下:

bash 复制代码
# 开启三个窗口,然后进行不同服务器的登录

redis-cli -a robin -p 6379

redis-cli -a robin -p 6380

redis-cli -a robin -p 6381

测试一下,基础的操作把!主节点用于写数据,从节点用于读数据不能写数据。

至此,一主二从的主从复制已经搭建完毕,但是正常业务中,并不是这么简单的。

当前我们只有一台主节点,那当我们的主节点意外宕机断开连接怎么办?

难道我们要一直等着主节点启动吗?当然不是,这个时候就需要哨兵模式来完成了(当然,手动也可以,但是比较繁琐,而且真实情况下也没人会用手动切换主从),当我们的主节点意外断开连接宕机,我们应该在剩下的从节点中,选出一台服务器作为主节点!!!

哨兵模式

概念

哨兵模式是一种特殊的模式,redis提供了哨兵的命令redis-sentinel,**哨兵是一个独立的进程,即独立运行。

哨兵模式的原理:哨兵通过发送命令,等待redis服务器响应,从而监控多个redis实例。

哨兵通过发送命令,监控主从服务器的运行状态

当哨兵检测到master宕机时,会自动将slave切换成master(根据哨兵的配置去切换),然后通过发布订阅模式publishsubcribe通知其他的从服务器,修改配置文件,让它们切换主机。

哨兵配置文件 sentinel.conf

下面是redis提供的哨兵配置文件例子 ,在redis的安装目录下sentinel.conf

sentinel.conf 是 Redis Sentinel 的配置文件,用于配置和管理 Sentinel 系统。

Sentinel 是 Redis 的一个高可用性解决方案,它可以监视任意多个 Redis 主服务器,以及这些主服务器属下的所有从服务器,并在被监视的主服务器进入下线状态时,自动将下线主服务器属下的某个从服务器升级为新的主服务器,代替已下线的主服务器继续处理请求。

以下是 sentinel.conf 文件中一些常见的配置项及其解释:

  1. sentinel monitor <master-name> <ip> <port> <quorum>
  • <master-name>:主服务器的名称,用于在 Sentinel 集群中唯一标识一个主服务器。
  • <ip><port>:主服务器的 IP 地址和端口号。
  • <quorum>:判断主服务器是否下线的最小 Sentinel 数量。
  1. **sentinel down-after-milliseconds **
  • 设置判断主服务器是否下线的超时时间。如果在指定的毫秒数内,Sentinel 没有收到主服务器的有效回复,则认为该主服务器已下线。
  1. **sentinel failover-timeout **
  • 设置故障转移的超时时间。如果在指定的毫秒数内,Sentinel 没有完成故障转移的操作,则放弃故障转移。
  1. **sentinel parallel-syncs **
  • 设置在进行故障转移时,可以有多少个从服务器同时对新的主服务器进行同步。
  1. sentinel can-failover <yes|no>
  • 设置 Sentinel 是否可以对指定的主服务器进行故障转移。
  1. sentinel deny-scripts-reconfig <yes|no>
  • 设置是否允许通过 SENTINEL RECONFIGURE 命令来修改 Sentinel 的配置。
  1. **sentinel auth-pass **
  • 设置与 Redis 主服务器进行通信时所使用的密码。
  1. **sentinel announcement-ip **
  • 设置 Sentinel 公告的 IP 地址。当 Sentinel 与其他 Sentinel 或 Redis 服务器通信时,将使用这个 IP 地址。
  1. **sentinel down-after-script **
  • 设置一个自定义的脚本,当 Sentinel 检测到主服务器下线时,会执行该脚本。
哨兵配置文件模板【入门】
bash 复制代码
# 设置sentinel的工作目录,注意这个路径必须是存在的  
dir /tmp  
  
# 哨兵的默认端口为26379 我们配置多个哨兵就需要改成不同的端口
port 26379

# 和redis-server一样。哨兵也需要维护唯一的pidfile
pidfile /var/run/redis-sentinel.pid


# 6379表示要监听的服务器的端口  2 表示当两个哨兵认为master不可达时,才会发生故障转移
sentinel monitor mymaster 127.0.0.1 6379 2  
  
# 设置判定主服务器下线的超时时间,默认是30秒  
sentinel down-after-milliseconds mymaster 30000  
  
# 如果在指定时间内未能完成故障转移,则认为故障转移失败  
sentinel failover-timeout mymaster 180000  
  
# 设置在故障转移时,最多可以有多少个从服务器同时对新的主服务器进行同步,默认是1  
sentinel parallel-syncs mymaster 1  
  
# 设置密码,如果你的redis主服务器设置了密码,这里也需要设置  
sentinel auth-pass mymaster yourpassword  
  
# 允许通过SENTINEL RECONFIGURE命令来修改Sentinel的配置,默认为no  
sentinel deny-scripts-reconfig yes  
  
# Sentinel公告的IP地址,当Sentinel与其他Sentinel或Redis服务器通信时,将使用这个IP地址  
# 如果未设置,将使用Sentinel绑定的IP地址  
# sentinel announcement-ip <ip>  
  
# 当Sentinel检测到主服务器下线时,会执行该脚本  
# sentinel down-after-script mymaster /path/to/your/script.sh  
  
# 其他配置项...

配置哨兵模式(一主二从三哨兵)

① 先配置redis的主从服务器

步骤如下:

  1. 拷贝redis.conf配置文件,我们一共需要三台redis-server,所以拷贝三份即可。
  2. 修改配置文件,因为每个redis-server都是不同的实例,所以需要修改配置文件
    • 修改port端口
    • 修改pidfile文件名
    • 后台启动服务
    • 修改rdb或者aof文件存放位置(具体看你的持久化使用的是rdb还是aof)
    • 修改logfile文件存放位置
    • 修改replication中的配置 replicaof masterip masterport(配置文件是永久有效,命令是临时有效 slaveof masterip masterport)
  3. 启动每个服务,并且查看不同redis-server的配置信息info replication

拷贝redis.conf配置文件

bash 复制代码
cp redis7.conf redis6379.conf
cp redis7.conf redis6380.conf
cp redis7.conf redis6381.conf

主节点6379

bash 复制代码
vim redis6379.conf

# 改动内容如下
bind 0.0.0.0 # 我这里是为了允许任意远程登录
protected-mode no # 关闭保护模式
port 6379  # 服务启动端口
daemonize yes # 后台启动
pidfile /var/run/redis_6379.pid # 指定pidfile文件
logfile "/myredis/redis6379.log" # 指定Logfile文件
dbfilename dump6379.rdb # 指定rdb文件名
dir /myredis/ # 指定工作目录
requirepass robin # 设定redis服务器的密码

# 保存退出
ESC shift: wq

从节点6380

bash 复制代码
vim redis6380.conf

# 改动内容如下
bind 0.0.0.0 # 我这里是为了允许任意远程登录
protected-mode no # 关闭保护模式
port 6380  # 服务启动端口
daemonize yes # 后台启动
pidfile /var/run/redis_6380.pid # 指定pidfile文件
logfile "/myredis/redis6380.log" # 指定Logfile文件
dbfilename dump6380.rdb # 指定rdb文件名
dir /myredis/ # 指定工作目录
replicaof 127.0.0.1 6379 # 指定从机的主机
masterauth robin # 从机的主机的密码验证

requirepass robin # 设定redis服务器的密码

# 保存退出
ESC shift: wq

从节点6381

bash 复制代码
vim redis6381.conf

# 改动内容如下
bind 0.0.0.0 # 我这里是为了允许任意远程登录
protected-mode no # 关闭保护模式
port 6381  # 服务启动端口
daemonize yes # 后台启动
pidfile /var/run/redis_6381.pid # 指定pidfile文件
logfile "/myredis/redis6381.log" # 指定Logfile文件
dbfilename dump6381.rdb # 指定rdb文件名
dir /myredis/ # 指定工作目录
replicaof 127.0.0.1 6379 # 指定从机的主机
masterauth robin # 从机的主机的密码验证

requirepass robin # 设定redis服务器的密码

# 保存退出
ESC shift: wq
② 配置哨兵

拷贝redis安装目录下的sentinel.conf

bash 复制代码
cp /opt/redis-7.2.4/sentinel.conf  /myredis/sentinel1.conf
cp /opt/redis-7.2.4/sentinel.conf  /myredis/sentinel2.conf
cp /opt/redis-7.2.4/sentinel.conf  /myredis/sentinel3.conf

接下来的步骤基本相同,每个哨兵的配置文件改动基本都是一致的:

  • 禁止保护模式
  • 配置哨兵启动端口(不同哨兵的端口不同 26379 26380 26381)
  • 配置哨兵后台启动
  • 配置logfile(为了方便log)
  • 配置要监听的主服务器
  • 配置要监听的主服务器的密码(有则配置,没密码不用配置)
  • 配置哨兵的工作目录(为了方便演示观察,改动一下)
  • ... 其他配置

修改sentinel1.conf的配置

bash 复制代码
protected-mode no

port 26379

daemonize yes

logfile "/myredis/sentinel.log"

dir /myredis/

sentinel monitor mymaster 127.0.0.1 6379 2

sentinel auth-pass mymaster robin
③ 启动服务

启动主从服务器

bash 复制代码
# redis-server redis配置文件路径
redis-server redis6379.conf
redis-server redis6380.conf
redis-server redis6381.conf

启动三个哨兵

bash 复制代码
# redis-sentinel sentinel配置文件路径
redis-sentinel sentinel1.conf 
redis-sentinel sentinel2.conf 
redis-sentinel sentinel3.conf 

查看一下进程 ps -ef | grep redis

④ 访问验证

创建三个远程终端,分别连接不同的redis-server

bash 复制代码
redis-cli -a robin -p 6379 

redis-cli -a robin -p 6380

redis-cli -a robin -p 6381


⑤ 主从服务器数据插入验证
bash 复制代码
# master 6379
flushdb # 先清空一下数据
set k1 v1

# slave 6380
get k1 # v1

# slave 6381
get k1 # v1
⑥ 验证主节点宕机,集群故障自动转移

我们手动的停止掉master 6379主服务器,看哨兵是否会从salve6380和slave6381中选择出一台新的服务器

查看sentinel.log日志,日志显示当前6379宕机了,6381变成了新的master主机

去分别查看一下6380和6381的主从状态

查看下redis.conf配置文件

6381:

6380:

至此,哨兵模式已经ok啦,最后再次测试一下当我们的6379重新上线时,master会是谁?

答案:👻master仍然是6381

那么启动6379的服务,再次连接客户端查看一下把!

bash 复制代码
redis-server redis6379.conf

redis-cli -a robin -p 6379

如有错误,请各位同学指正😃

相关推荐
水月梦镜花5 小时前
redis:list列表命令和内部编码
数据库·redis·list
掘金-我是哪吒6 小时前
微服务mysql,redis,elasticsearch, kibana,cassandra,mongodb, kafka
redis·mysql·mongodb·elasticsearch·微服务
ketil278 小时前
Ubuntu 安装 redis
redis
王佑辉9 小时前
【redis】redis缓存和数据库保证一致性的方案
redis·面试
Karoku06610 小时前
【企业级分布式系统】Zabbix监控系统与部署安装
运维·服务器·数据库·redis·mysql·zabbix
gorgor在码农10 小时前
Redis 热key总结
java·redis·热key
想进大厂的小王10 小时前
项目架构介绍以及Spring cloud、redis、mq 等组件的基本认识
redis·分布式·后端·spring cloud·微服务·架构
Java 第一深情10 小时前
高性能分布式缓存Redis-数据管理与性能提升之道
redis·分布式·缓存
王解12 小时前
Jest项目实战(4):将工具库顺利迁移到GitHub的完整指南
单元测试·github
油泼辣子多加12 小时前
2024年11月4日Github流行趋势
github