本溪网站开发公司电话,建发公司简介,河北省石家庄市官网,网站备案信息怎么做前面我们提到了缓存集群的负载均衡策略#xff0c;保证缓存服务的高可用#xff0c;集群策略是最常用的#xff0c;本文我们以 Redis 为例#xff0c;分析一下单点缓存如何扩展到集群#xff0c;以及集群部署的几种常见模式。
Redis 的主从复制
集群实现依靠副本#x…前面我们提到了缓存集群的负载均衡策略保证缓存服务的高可用集群策略是最常用的本文我们以 Redis 为例分析一下单点缓存如何扩展到集群以及集群部署的几种常见模式。
Redis 的主从复制
集群实现依靠副本而副本技术有个非常关键的一点那就是各个副本之间的快速数据同步也就是我们常说的主从复制。
主从复制技术在关系型数据库、缓存等各类存储节点中都有比较广泛的应用。Redis 的主从复制可以将一台服务器的数据复制到其他节点在 Redis 中任何节点都可以成为主节点通过 Slaveof 命令可以开启复制。
主从复制一方面可以作为数据备份通过实现主从节点之间的最终数据一致性保证数据尽量不丢失。除了数据备份从节点还可以扩展主节点的读请求支持能力实现读写分离主节点作为写节点从节点支持读请求。当主节点的系统水位不能承担前台业务请求并发量时可以将请求路由到从节点实现集群内的动态均衡。
有了主从复制现在请你思考一个问题Redis 的主从复制如何选举呢
我们先来了解下 MySQL 的选主也就是故障转移机制和主从机器之间的数据同步方式有很大关系同步方式包括半同步、全同步关于 GTID 的复制等方式MySQL 缺少一个选举决策的节点一般是人工干预选主流程感兴趣的同学可以查阅相关资料了解一下。
我们再来看一下 Redis 的主从配置正常情况下当主节点发生故障宕机需要运维工程师手动从从节点服务器列表中选择一个晋升为主节点并且需要更新上游客户端的配置这种方式显然是非常原始的我们希望有一个机制可以自动实现 Failover也就是自动故障转移 。
在 Redis 集群中依赖 Sentinel就可以实现上面的需求。
Redis Sentinel——Redis 哨兵
Redis Sentinel 就是我们常说的 Redis 哨兵机制也是官方推荐的高可用解决方案上面我们提到的主从复制场景就可以依赖 Sentinel 进行集群监控。
Redis-Sentinel 是一个独立运行的进程假如主节点宕机它还可以进行主从之间的切换。主要实现了以下的功能 不定期监控 Redis 服务运行状态 发现 Redis 节点宕机可以通知上游的客户端进行调整 当发现 Master 节点不可用时可以选择一个 Slave 节点作为新的 Master 机器并且更新集群中的数据同步关系
现在思考一个场景我们使用 Sentinel 来管理 Redis 集群高可用假如 Sentinel 宕机那么整个系统还可以按照预期的方式运行吗
答案是否定的很明显Sentinel 也存在单点问题如果 Sentinel 宕机高可用也就无法实现了所以Sentinel 必须支持集群部署。
实际上Redis Sentine 方案是一个包含了多个 Sentinel 节点以及多个数据节点的分布式架构。除了监控 Redis 数据节点的运行状态Sentinel 节点之间还会互相监控当发现某个 Redis 数据节点不可达时Sentinel 会对这个节点做下线处理如果是 Master 节点会通过投票选择是否下线 Master 节点完成故障发现和故障转移。
Sentinel 在操作故障节点的上下线时还会通知上游的业务方整个过程不需要人工干预可以自动执行。
Redis Cluster 集群
Redis Cluster 是官方的集群方案是一种无中心的架构可以整体对外提供服务。 为什么是无中心呢因为在 Redis Cluster 集群中所有 Redis 节点都可以对外提供服务包括路由分片、负载信息、节点状态维护等所有功能都在 Redis Cluster 中实现。
Redis 各实例间通过 Gossip 通信这样设计的好处是架构清晰、依赖组件少方便横向扩展有资料介绍 Redis Cluster 集群可以扩展到 1000 个以上的节点。
Redis Cluster 另外一个好处是客户端直接连接服务器避免了各种 Proxy 中的性能损耗可以最大限度的保证读写性能。
除了 Redis Cluster另外一个应用比较多的是 Codis 方案Codis 是国内开源的一个 Redis 集群方案其作者是个大牛也是一位技术创业者不知道你有没有听过最近几年比较火的分布式关系型数据库 TiDB就来自于作者的公司 PingCAP。
Codis 的实现和 Redis Cluster 不同是一个“中心化的结构”同时添加了 Codis Proxy 和 Codis Manager。Codis 设计中是在 Proxy 中实现路由、数据分片等逻辑Redis 集群作为底层的存储引擎另外通过 ZooKeeper 维护节点状态可以参考下面这张 Codis 的官方架构图 之所以提到 Codis是因为 Codis 和官方的 Redis Cluster 实现思路截然不同使用 Redis Cluster 方式数据不经过 Proxy 层直接访问到对应的节点。
Codis 和 Redis Cluster 的集群细节比较复杂这里不展开讨论只要简单了解即可你也可以在课后分别去官网深入了解。就我自己而言Codis 的监控和数据迁移更加简便感觉 Codis 的设计更加合理不过也是见仁见智欢迎分享你的思考。
Redis Cluster 划分了 16384 个槽位每个节点负责其中的一部分数据都会存储槽位的信息当客户端链接时会获得槽位信息。如果需要访问某个具体的数据 Key就可以根据本地的槽位来确定需要连接的节点。
关于 Redis Cluster 为什么是 16384 个槽位网上也有很多讨论Redis 的作者也给出了他的思考 感兴趣的可点击这里查看。
总结
本文和你分享了 Redis 集群高可用的几种配置方式包括主从复制、Redis 的哨兵机制简单介绍了 Redis Cluster 和 Codis 的集群方式。
Redis 高可用集群也经历了一个发展过程从早期社区中 Twitter 开源的 Proxy 方案到现在官方的 Redis Cluster 集群方案中间还有很多公司或者组织贡献了开源方案比如开源的 Codis、阿里云的 Redis Labs 等。
在我的工作中一直是应用 Twitter 的代理方案后面就是公司内部开发的一些中间件在你的工作中应用了哪些集群方案呢欢迎留言进行分享。