Qunar Redis 集群是一个分布式的高可用架构,整个架构主要由以下几个重要部分组成:
- Redis Server 节点:每个节点有一主一从两个实例,多个节点组成一份完整的集群数据,其中每个节点只有主库对外提供服务,从库仅仅用于节点高可用、数据持久化及定时备份。
- Zookeeper 集群:由五个 zk 节点组成,Redis 集群配置变更后,通知客户端进行重连。
- Redis Sentinel 集群:由五个 Sentinel 节点组成,用于 Reids Server 节点的高可用,主从切换、故障转移、配置更新等。
- 配置中心集群:由五个 MySQL 节点组成的 PXC 集群,用于存储 Redis 集群的分片信息,即每个节点的 Master 实例信息及分配 key 的一致性 hash 值范围。
- 应用程序客户端:监听 zk 变化,在配置中心获取 Redis 实例信息进行连接。
-
1)当客户端根据 Redis 集群的 namespace 建立连接时,会先从 zk 中查找/config_addr 节点, 该节点下存放的是配置中心集群的实例信息,从中随机选择一个数据库实例进行连接。
2)在配置中心的特定库表中,根据 Redis 的 namespace 查询集群的节点的连接配置,然后建立 Redis 连接。
3)客户端建立 Redis 连接后,会启动了两个线程:
- 一个用于监听 zk 的地址的变化。每个 Redis 集群在 zk 中都会有一个/redis/namespace 的节点 ,如果集群配置发生变化,哨兵会通知 zk 更新此节点的值,客户端感知到 zk 配置变化, 将会去配置中心获取新的连接配置,重新建立连接。
- 一个用于轮询配置中心的连接配置。为了防止 zk 通知失败,客户端会通过这个线程,每隔 10s 去轮询配置中心的配置信息,如果发现配置中心的配置和本地缓存的不一样,就会使用配置中心的配置建立新的连接。