Redis常见架构
Redis 实现高可用有三种部署模式:主从模式,哨兵模式,集群模式。
主从模式
主从模式中,Redis部署了多台机器,主节点负责读写操作,从节点只负责读操作。从节点的数据来自主节点,实现原理就是主从复制机制。主从复制包括全量复制,增量复制两种。一般当slave第一次启动连接master,或者认为是第一次连接,就采用全量复制;slave与master全量同步之后,master上的数据,如果再次发生更新,就会触发增量复制。但无法做到故障自动切换,需要人工将从节点晋升为主节点,同时还要通知应用方更新主节点地址。
哨兵模式
由一个或多个Sentinel实例组成的Sentinel系统,它可以监视所有的Redis主节点和从节点,并在被监视的主节点进入下线状态时,自动将下线主服务器属下的某个从节点升级为新的主节点。但是一个哨兵进程对Redis节点进行监控,就可能会出现问题(单点问题),因此,可以使用多个哨兵来进行监控Redis节点,并且各个哨兵之间还会进行通讯。
故障切换过程:假设主服务器宕机,哨兵1先检测到这个结果,系统并不会马上进行 failover 过程,仅仅是哨兵1主观的认为主服务器不可用,这个现象称为主观下线。当后面的哨兵也检测到主服务器不可用,并且数量达到一定值时,那么哨兵之间就会进行一次投票,投票的结果由一个哨兵发起,进行 failover 操作。切换成功后,就会通过发布订阅模式,让各个哨兵把自己监控的从服务器实现切换主机,这个过程称为客观下线。这样对于客户端而言,一切都是透明的。
- Sentinel 集群通过给定的配置文件发现 master,启动时会监控 master。通过向 master 发送 info 信息获得主节点下面的所有从节点。
- Sentinel 集群通过命令连接向被监视的主从服务器发送 hello 信息 (每秒一次),该信息包括 Sentinel 本身的 IP、端口、id 等内容,以此来向其他 Sentinel 宣告自己的存在。
- Sentinel 集群通过订阅连接接收其他 Sentinel 发送的 hello 信息,以此来发现监视同一个主服务器的其他 Sentinel;集群之间会互相创建命令连接用于通信,因为已经有主从服务器作为发送和接收 hello 信息的中介,Sentinel 之间不会创建订阅连接。
- Sentinel 集群使用 ping 命令来检测实例的状态,如果在指定的时间内(down-after-milliseconds)没有回复或则返回错误的回复,那么该实例被判为下线。
- 当 failover 主备切换被触发后,failover 并不会马上进行,还需要 Sentinel 中的大多数 Sentinel 授权后才可以进行 failover,即进行 failover 的 Sentinel 会去获得指定 quorum 个的 Sentinel 的授权,成功后进入 ODOWN 状态。如在 5 个 Sentinel 中配置了 2 个 quorum,等到 2 个 Sentinel 认为 master 死了就执行 failover。
- Sentinel 向选为 master 的 slave 发送 SLAVEOF NO ONE 命令,选择 slave 的条件是 Sentinel 首先会根据 slaves 的优先级来进行排序,优先级越小排名越靠前。如果优先级相同,则查看复制的下标,哪个从 master 接收的复制数据多,哪个就靠前。如果优先级和下标都相同,就选择进程 ID 较小的。
- Sentinel 被授权后,它将会获得宕掉的 master 的一份最新配置版本号 (config-epoch),当 failover 执行结束以后,这个版本号将会被用于最新的配置,通过广播形式通知其它 Sentinel,其它的 Sentinel 则更新对应 master 的配置。
1 到 3 是自动发现机制:
- 以 10 秒一次的频率,向被监视的 master 发送 info 命令,根据回复获取 master 当前信息。
- 以 1 秒一次的频率,向所有 redis 服务器、包含 Sentinel 在内发送 PING 命令,通过回复判断服务器是否在线。
- 以 2 秒一次的频率,通过向所有被监视的 master,slave 服务器发送当前 Sentinel master 信息的消息。
4 是检测机制,5 和 6 是 failover 机制,7 是更新配置机制。
Cluster集群模式
(待补充)
实际应用
redis哨兵模式部署架构图
数据持久化
RDB(快照)和AOF(追加文件)两种持久化机制。
RDB 是一个压缩的二进制文件,保存的是 Redis 数据库的 key-value 数据。AOF 是保存 Redis 执行的写命令的文本文件。当 Redis 服务器宕机的时候,可以通过这两种文件进行恢复,Redis 启动时会优先加载 AOF 文件,如果 AOF 文件不存在,则加载 RDB 文件。
主从复制
- 初始同步:
- 从节点发送
PSYNC
命令到主节点,主节点接收到后,会开始生成一个 RDB 快照并将其发送到从节点。 - 从节点接收到 RDB 文件后,加载数据并初始化自己的数据集。
- 从节点发送
- 增量同步:
- 主节点命令传播
- 命令日志:在 Redis 中,主节点会为每个写操作(如
SET
、DEL
等)生成一个命令,并将这些命令记录在一个叫做 复制缓冲区(replication buffer)的内存结构中。 - 命令传播:主节点会在执行写操作后,将这些命令发送到所有连接的从节点。每个从节点都与主节点保持一个持久的 TCP 连接,主节点会通过这个连接将命令传递给从节点。
- 命令日志:在 Redis 中,主节点会为每个写操作(如
- 从节点接收命令
- 接收命令:从节点在与主节点的连接中会持续监听来自主节点的命令,这些命令是以文本形式发送的。
- 执行命令:从节点接收到命令后,会立即执行这些命令,以保持数据与主节点的一致性。例如,当主节点执行
SET key value
时,从节点也会执行相同的命令来更新自己的数据。
- 主节点命令传播
配置文件相关
主(从)redis配置文件
##NETWORK
bind 0.0.0.0 #允许所有ip连接
port 6379
##GENERAL
daemonize yes
##SNAPSHOTTING
dir "/redis"
pidfile "redis.pid"
loglevel notice
logfile "redis.log"
##REPLICATION
masterauth "password"
repl-backlog-size 800mb #设置复制缓冲区大小
repl-backlog-ttl 7200 #设置复制缓冲区超时时间
replica-priority 15 #设置从节点优先级
repl-timeout 600 #设置复制超时时间
##SECURITY
requirepass "password"
rename-command FLUSHALL ""
rename-command KEYS ""
##APPEND ONLY MODE
appendonly yes #开启 AOF 持久化
appendfsync everysec # 每秒同步一次
# RDB 快照保存条件
save 900 1 # 900秒内至少有1个key被修改
save 300 100 # 300秒内至少有100个key被修改
save 60 1000 # 60秒内至少有1000个key被修改
##################从节点配置#####################
#设置客户端输出缓冲区大小
client-output-buffer-limit normal 0 0 0
#设置从节点输出缓冲区大小
client-output-buffer-limit replica 800mb 256mb 600
no-appendfsync-on-rewrite yes #在AOF重写期间禁用fsync操作
replicaof 1.1.1.1 6379 #建立主从复制
哨兵配置文件
bind 0.0.0.0
port 6378
daemonize yes
dir "/sentinel"
pidfile "./sentinel.pid"
logfile "./sentinel.log"
sentinel myid * #唯一标识,用*代替
sentinel deny-scripts-reconfig yes
requirepass "password"
#监控的主节点,需要至少2个 Sentinel 同意才能进行故障转移
sentinel monitor redismaster 1.1.1.1 6379 2
sentinel auth-pass redismaster password
#配置纪元,用于在 Sentinel 之间传播配置变更
sentinel config-epoch redismaster 2065140
#领导者纪元,用于在 Sentinel 之间选举领导者
sentinel leader-epoch redismaster 2065141
maxclients 4064
protected-mode no
supervised systemd
#未配置down-after-milliseconds和failover-timeout
#down-after-milliseconds 默认值为 30000 毫秒(30秒)
#failover-timeout 默认值为 180000 毫秒(3分钟)
#已知从节点信息
sentinel known-replica redismaster 2.2.2.2 6379
sentinel known-replica redismaster 3.3.3.3 6379
sentinel known-replica redismaster 4.4.4.4 6379
#已知其他sentinel信息
sentinel known-sentinel redismaster 11.11.11.11 6378 *
sentinel known-sentinel redismaster 22.22.22.22 6378 *
参考链接:
标签:命令,可用,部署,Redis,sentinel,master,Sentinel,节点 From: https://blog.csdn.net/2301_76171195/article/details/144432730