以 Redis 为例,分析一下单点缓存如何扩展到集群,以及集群部署的几种常见模式
缓存集群的高可用
Redis 的主从复制
主从复制——各个副本之间的快速数据同步
任何节点都可以成为主节点,通过 Slaveof 命令可以开启复制
主从复制可以作为数据备份
从节点可以扩展主节点的读请求支持能力,实现读写分离
MySQL的选主——故障转移机制
同步方式包括半同步,全同步,关于 GTID 的复制等方式
MySQL 缺少一个选择决策的节点,一般是人工干预选主流程
当主节点发送故障宕机,需要运维工程师手动从从节点服务器列表中,选择一个晋升为主节点,并且需要更新上游客户端的配置。
如何实现自动故障转移——自动实现 Failover
Redis Sentinel —— Redis 哨兵
Redis-Sentinel 是一个独立运行的进程,假如主节点宕机
主要实现的功能:
- 不定期监控 Redis 服务运行状态
- 发现 Redis 节点宕机,可以通知上游的客户端进行调整
- 当 Master 节点不可用时,可以选择一个 Slave 节点,作为新的 Master 机器,并且更新集群中的数据同步关系。
使用 Sentinel 来管理 Redis 集群高可用,假如 Sentinel 宕机,那么整个系统还可以按照预期的方式运行吗?
答案是否定的,所以 Sentinel 也存在单点问题
Redis Sentine 方案是一个包含了多个 Sentienl 节点,以及 多个数据节点的分布式结构。
Sentinel 节点之间会互相监控
- 当发现某个 Redis 数据节点不可达时, Sentinel 会对这个节点做下线处理
- 如果是 Master 节点,会通过投票选择是否下线 Master 节点,完成故障发现和 故障转移
Redis Cluster 集群
Redis Cluster 是官方的集群方案,是一种无中心的架构,可以整体对外提供服务
在 Redis Cluster 集群中,所有的 Redis 节点都可以对外提供服务
包括路由分片,负载信息,节点状态维护等功能
Redis 各个实例间通过 Gossip 通信,好处是 架构清晰,依赖组件少,方便横向扩展
Redis Cluster 是客户端直接连接服务器,可以最大限度的保证读写性能
Redis Cluster 划分了 16384 个槽位,每个节点负责其中的一部分数据,都会存储槽位的信息,访问某个具体的数据 Key,可以根据本地的槽位来确定需要连接的节点。
总结
- Redis 集群高可用的几种配置方式,包括主从复制,Redis 的哨兵机制
- 简单介绍了 Redis Cluster 和 Codis 的集群方式