0%

轻松搞定 Redis 的主从复制和高可用

关于 Redis 运维 系列其他文章的传送门

  1. 《 我不要你觉得!我要我觉得!学习 Redis 中实用的命令和配置,就看这篇! 》

  2. 《 轻松搞定 Redis 的主从复制和高可用 》      您当前所在位置

  3. 《 手把手教你理解 Redis Cluster 》


关于 Redis 开发 系列其他文章的传送门

  1. 《 Python 和 Redis 的那点事 》

  2. 《 用了 Scrapy-Redis 分布式爬虫后,一个能打的都没有! 》



logo

一、主从复制

Redis 的持久化保证了即使 Redis 服务重启也不会丢失数据,因为 Redis 服务重启后会将硬盘上持久化的数据恢复到内存中,但是当 Redis 服务器的硬盘损坏了可能会导致数据丢失,如果通过 Redis 的主从复制机制就可以避免这种单点故障。

Redis 虽然读取写入的速度都特别快,但是也会产生读压力特别大的情况。为了分担读压力,Redis 支持主从复制,Redis 的主从结构可以采用一主多从或者级联结构:Redis 主从复制可以根据是否是全量分为全量同步和增量同步。

关于复制功能的运作原理,建议查看复制功能的运作原理

关于 Redis 主从复制的其他更多细节,可以查看:
Redis 官网(英文)
Redis 命令参考 中文翻译

REPLICATION 主从复制的配置

启用 Redis 的主从复制有两种方法:

  1. 在配置文件中的 REPLICATION 配置段内配置;
  2. 使用客户端连接后在命令行中配置。

1. 从配置文件配置

  • slaveof <masterrip> <masterport>:在从节点指定主节点的 ip 和 port;
  • masterauth <master-assword>:如果主节点需要认证,输出认证信息;
  • slave-read-only yes:定义从节点是否为只读;
  • slave-server-stale-data yes:从节点是否可以将过期的数据响应给客户端;

2. 从 redis-cli 通过指令配置

  1. CONFIG SET masterauth PASSWORD:配置主节点的认证信息;
  2. SLAVEOF host port:在从节点指定主节点的 ip 和 port 信息;
  3. CONFIG SET requirepass PASSWORD:指定主节点的认证信息;
  4. CONFIG REWRITE:将刚才的配置同步至配置文件中;

主从配置相关的其他参数

  • repl-diskless-sync no:主节点与从节点进行同步时,数据的同步方式有两种:
    • no:不基于磁盘做快照;
    • Disk-backend:主节点新创建的快照文件先放置于磁盘中,而后将其发送给从节点;
    • Diskless:主节点新创建快照后直接通过网络套接字文件发送给从节点;为了实现并行复制,通常需要在复制启动前延迟一个时间段;
  • repl-diskless-sync-delay 5:创建快照后延迟几秒发送,延迟等待时如果有新的节点接入,可将快照发给多个节点;
  • repl-ping-slave-period 10:主节点每隔多久检测从节点是否在线;
  • repl-timeout 60:判断从节点的超时时间,超过此时间后从节点再同步就要 “full synchronization”。
  • repl-disable-tcp-nodelay no:定义是否开启 nodelaydelay 的意思就是延迟发送过小的数据包,攒一攒一起发送,nodelay 就是不开启延迟,此处的 nodelay no 就是负负得正即为开启 delay 功能;
  • repl-backlog-size 1mb:从节点同步时点后援队列的大小;
  • slave-priority 100:复制集群中,主节点故障时,优先级高的从节点会被选举为主节点;数字越小优先级越高,但 0 表示不参与选举;
  • min-slaves-to-write 3:主节点仅允许其能够通信的从节点数量大于等于此处的值时才接受写操作;主要防止当多个从节点故障时,读请求都跑到主上,导致主节点的压力太大,
  • min-slaves-max-lag 10:从节点延迟时长超出此处指定的时长时,主节点会拒绝写入操作;

客户端命令

  • CLIENT LIST:列出所有连接的客户端;列出的信息中,如果最后的 cmdcmd=replconf 则一般为 slave 节点;
  • CONFIG KILL:关闭客户端连接;
  • INFO Replication:查看 Redis 统计数据。包括主从同步的状态信息;
1
2
3
4
5
6
7
8
9
## Replication
role:master // 当前服务器的角色
connected_slaves:1 // 连接了几个从节点
slave0:ip=192.168.50.12,port=6379,state=online,offset=1,lag=1 // 从节点的同步状态,lag 为从库多少秒未向主库发送 REPLCONF 命令
master_repl_offset:1 // 主从同步偏移量,此值如果和上一行中的 offset 相同说明主从一致没延迟
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:2
repl_backlog_histlen:0

二、利用 Sentinel 使主从复制高可用

什么是 Sentinel ?

在 MariaDB 中,可以使用第三放软件如 MHA 在主节点宕机后提升一个从节点为新的主节点;而在 Redis 中有一个组件叫 Sentinel,也能实现这种功能,它可以同时管理多个 Redis 集群,在主节点宕机后从备节点选出新的主节点。

Sentinel 主要负载三个功能:

  • 监控:Sentinel 会不断地检查你的主服务器和从服务器是否运作正常。
  • 通知:当被监控的某个 Redis 服务器出现问题时,Sentinel 可以通过 API 向管理员或者其他应用程序发送通知。
  • 自动故障迁移:当一个主服务器不能正常工作时,Sentinel 会开始一次自动故障迁移操作,它会将失效主服务器的其中一个从服务器升级为新的主服务器,并让失效主服务器的其他从服务器改为复制新的主服务器;当客户端试图连接失效的主服务器时,集群也会向客户端返回新主服务器的地址,使得集群可以使用新主服务器代替失效服务器。

available

Sentinel 的工作逻辑

SENTINEL 使用 Raft 协议来选举 Leader ,所以节点数应为奇数个,并且最少使用三个节点。当任意节点检测到从节点疑似宕机时便发起投票,达到半数则确认宕机,开始根据配置文件中设置的优先级 slave-priority,从其余从节点中选举新的主节点,选出新主后,会将新主上 redis.conf 配置文件中关于从节点的 slaveof <masterrip> <masterport> 配置自动删除,随后新主开始工作,而其他的从节点会放弃自己现有的数据,从新主同步全部数据。当旧主可以继续工作时,不能使用主节点的角色工作,而应当在 redis.conf 配置文件中使用 slaveof <masterrip> <masterport> 手动指定当前的新主,以从服务器的角色上线。

sentinel

配置 Sentinel

Sentinel 的配置文件为:/etc/redis-sentinel.conf

  • port 26379:Sentinel 独立监听在一个套接字上,默认是 26379
  • bind 0.0.0.0:定义监听的地址;
  • sentinel auth-pass <master-name> <password>:输入主节点的认证信息;
  • sentinel monitor <master-name> <ip> <redis-port> <quorum>:指定要连接的主节点的信息;
    • <master-name>:别名,用于区分;
    • <ip>:主节点 IP;
    • <redis-port>:主节点端口;
    • <quorum>:法定人数;表示 Sentinel 集群的 quorum 机制,即至少有 quorum 个 Sentinel 节点同时判定主节点故障时,才认为其真的故障;
      • s_down:主观 down (subjectively down);
      • o_down:客观 down (objectively down);
  • sentinel down-after-milliseconds <master-name> <milliseconds>:监控到指定的集群的主节点异常状态持续多久方才将标记为“故障”;
  • sentinel parallel-syncs <master-name> <numslaves>:指在 failover 过程中,能够被 Sentinel 并行配置的从节点的数量;主要防止重新同步时从节点的数量过多而导致新主同步压力过大;
  • sentinel failover-timeout <master-name> <milliseconds>:Sentinel 必须在此指定的时长内完成故障转移操作,否则,将视为故障转移操作失败;
  • sentinel notification-script <master-name> <script-path>:通知脚本,此脚本被自动传递多个参数;

在客户端中可使用的 Sentinel 命令

redis-cli -h SENTINEL_HOST -p SENTINEL_PORT:连接至 Sentinel;

  • SENTINEL masters:列出所有被监视的主服务器,以及这些主服务器的当前状态;
  • SENTINEL slaves <MASTER_NAME>:列出给定主服务器的所有从服务器,以及这些从服务器的当前状态;
  • SENTINEL failover <MASTER_NAME>:当主服务器失效时,在不询问其他 Sentinel 意见的情况下,强制开始一次自动故障迁移(不过发起故障转移的 Sentinel 会向其他 Sentinel 发送一个新的配置,其他 Sentinel 会根据这个配置进行相应的更新)。
  • SENTINEL get-master-addr-by-name <MASTER_NAME>:返回给定名字的主服务器的 IP 地址和端口号。如果这个主服务器正在执行故障转移操作,或者针对这个主服务器的故障转移操作已经完成,那么这个命令返回新的主服务器的 IP 地址和端口号。

启用 Sentinel

1
systemctl start redis-sentinel

接下来就可以试试停止一台 Redis,然后使用客户端命令 INFO 看看关于 # Replication 的状态中,哪台从节点会被提升为主节点了。