Redis 高可用架构最佳实践

作者:温国兵
来源:
1 、题记
Redis 是一个开源的使用 ANSI C 语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value 数据库 , 并提供多种语言的 API 。
如今 , 互联网业务的数据正以更快的速度在增长 , 数据类型越来越丰富 , 这对数据处理的速度和能力提出了更高要求 。 Redis 是一种开源的内存非关系型数据库 , 给开发人员带来的体验是颠覆性的 。 在自始至终的设计过程中 , 都充分考虑高性能 , 这使得 Redis 成为当今速度最快的 NoSQL 数据库 。
考虑高性能的同时 , 高可用也是很重要的考虑因素 。 互联网 7x24 无间断服务 , 在故障期间以最快的速度 Failover , 能给企业带来最小的损失 。
【Redis 高可用架构最佳实践】那么 , 在实际应用中 , 都有哪些高可用架构呢?架构之间有何优劣?我们应该怎么取舍?有哪些最佳实践?
二、Sentinel (哨兵)原理
在讲解 Redis 高可用方案之前 , 我们先来看看 Redis Sentinel 原理()是怎么样的 。

  1. Sentinel 集群通过给定的配置文件发现 master , 启动时会监控 master 。 通过向 master 发送 info 信息获得该服务器下面的所有从服务器 。
  2. Sentinel 集群通过命令连接向被监视的主从服务器发送 hello 信息 (每秒一次) , 该信息包括 Sentinel 本身的 IP、端口、id 等内容 , 以此来向其他 Sentinel 宣告自己的存在 。
  3. Sentinel 集群通过订阅连接接收其他 Sentinel 发送的 hello 信息 , 以此来发现监视同一个主服务器的其他 Sentinel;集群之间会互相创建命令连接用于通信 , 因为已经有主从服务器作为发送和接收 hello 信息的中介 , Sentinel 之间不会创建订阅连接 。
  4. Sentinel 集群使用 ping 命令来检测实例的状态 , 如果在指定的时间内(down-after-milliseconds)没有回复或则返回错误的回复 , 那么该实例被判为下线 。
  5. 当 failover 主备切换被触发后 , failover 并不会马上进行 , 还需要 Sentinel 中的大多数 Sentinel 授权后才可以进行 failover , 即进行 failover 的 Sentinel 会去获得指定 quorum 个的 Sentinel 的授权 , 成功后进入 ODOWN 状态 。 如在 5 个 Sentinel 中配置了 2 个 quorum , 等到 2 个 Sentinel 认为 master 死了就执行 failover 。
  6. Sentinel 向选为 master 的 slave 发送 SLAVEOF NO ONE 命令 , 选择 slave 的条件是 Sentinel 首先会根据 slaves 的优先级来进行排序 , 优先级越小排名越靠前 。 如果优先级相同 , 则查看复制的下标 , 哪个从 master 接收的复制数据多 , 哪个就靠前 。 如果优先级和下标都相同 , 就选择进程 ID 较小的 。
  7. 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 是更新配置机制 。 [1]
三、Redis 高可用架构
讲解完 Redis Sentinel 原理之后 , 接下来讲解常用的 Redis 高可用架构 。
  • Redis Sentinel 集群 + 内网 DNS + 自定义脚本
  • Redis Sentinel 集群 + VIP + 自定义脚本
  • 封装客户端直连 Redis Sentinel 端口
    • JedisSentinelPool , 适合 Java
    • PHP 基于 phpredis 自行封装
  • Redis Sentinel 集群 + Keepalived/Haproxy
  • Redis M/S + Keepalived
  • Redis Cluster
  • Twemproxy
  • Codis
接下来配合图文逐个讲解 。
1、Redis Sentinel 集群 + 内网 DNS + 自定义脚本
Redis 高可用架构最佳实践文章插图
Redis Sentinel 集群 + 内网 DNS + 自定义脚本
上图是已经在线上环境应用的方案 。 底层是 Redis Sentinel 集群 , 代理着 Redis 主从 , Web 端连接内网 DNS 提供服务 。 内网 DNS 按照一定的规则分配 , 比如 xxxx.redis.cache/queue.port.xxx.xxx , 第一个段表示业务简写 , 第二个段表示这是 Redis 内网域名 , 第三个段表示 Redis 类型 , cache 表示缓存 , queue 表示队列 , 第四个段表示 Redis 端口 , 第五、第六个段表示内网主域名 。