Redis 云原生功能介绍Redis 云原生化以后,Operator 组件是基于 Operator Pattern 实现的一个 custom controller,主要用于编排 Redis Cluster resource,管理 Redis 集群的一些变更 。Configserver 也部署在 K8s 上,所有跟 Redis 相关的组件都是云原生化的 。
新建集群
文章插图
- 对于常见的新建集群的请求,会先发给 ApiServer 。ApiServer 接收到请求之后,会通过 client go 的 watch 机制让 Operator 感知到 。
- 随后 Operator 会请求 ApiServer 创建对应 Server 的 StatefulSet 。
- K8s 把所有 Server 的 StatefulSet 创建成功之后,等所有的 Pod 都处于 ready 状态,这时所有分片内的 Server Pod 之间是没有主从关系的 。
- Operator 感知到所有的 StatefulSet 都已经处于 ready 的状态之后,会获取所有 Server Pod 信息,并注册到 Configserver 。
- Configserver 接下来会连接到所有分片内的 Slave 节点,执行实际的 SLAVEOF 命令,保证建立真正的主从关系 。
- Operator 会定期查询 Configserver 里建立主从关系的进度 。等所有分片的主从关系建立成功之后, Operator 会请求 ApiServer 把对应的 Proxy 创建出来 。
- Proxy 创建出来之后,会去 Configserver 拉取最新的拓扑,保证对外提供服务的时候可以把请求打给后端正常的分片 。
分片扩容
文章插图
在实际使用的过程中如果遇到容量不足的情况,需要进行水平扩容 。分片扩容的请求也是类似的:
- 请求发给 ApiServer 。
- ApiServer 把请求推送给 Operator 。
- Operator 感知到之后,会先给 ApiServer 发请求,把新的分片对应的 StatefulSet 创建出来 。
- K8s 会把新分片的 StatefulSet 创建好,在处于 ready 状态之后,一个 StatefulSet 下的每个 Pod 也都是独立的状态,没有建立真正的主从关系 。
- Operator 获知新创建的 Server StatefulSet 分片已经处于 ready 状态之后,会把新的 Server 分片的实例地址注册到 Configserver 。Configserver 现在会有两个阶段:
- 第一步:指导新分片内真实主从关系的建立 。即连到所有的新分片的 Slave 上,执行 SLAVEOF 的命令;
- 第二步:指导数据从老分片迁移到新分片 。这样新的分片才能发挥作用,这一步很重要 。
- Operator 会一直检查数据迁移或者 rebalance 的进度 。等进度结束之后,Operator 会更新 Redis Cluster 里 status 的字段,反映出来当前的分片扩容的操作已经结束了 。
分片缩容
文章插图
【火山引擎 Redis 云原生实践】
分片缩容的流程和分片扩容类似:请求先发送给 ApiServer,Operator 会感知到请求,然后把缩容分片的请求发送给 Configserver 。
Configserver 此时做的事情是:
- 先指导数据迁移 。考虑到后边的一些分片下线,需要把分片上的数据先迁移到其他可用分片上,保证数据不丢 。
- Operator 会一直查询 Configserver 指导的数据 rebalance 的进度 。等缩容操作在 Configserver 完成之后,Operator 会请求 ApiServer 执行真正的 Server StatefulSet 删除,这时才是安全的删除操作 。
组件升级
文章插图
一个 Redis 集群会涉及到两个组件:Proxy 和 Server 。
无状态的 Proxy 用 Deployment 托管,如果要进行组件升级,直接升级对应的 image 即可 。
Server 是一个有状态的组件,它的升级流程相对来说复杂一点 。为了简化流程,我们以 Server 只有 1 分片的 Redis 集群为例,介绍升级过程 。
- Server 组件的升级请求发送给 ApiServer,ApiServer 接收到这个请求之后会把它推送给 Operator 。
- Operator 首先会按照分片内 Pod 编号从大到小的顺序选择要升级的 Pod 。
- 选定 Pod 之后,会把它从 Configserver 的读拓扑里摘掉 。(如果要摘除的这个 Pod 在集群拓扑里是 Master,我们会先调用 Configserver 的 API,执行 Failover,把它变成 Slave,然后再把它从读的拓扑里边给摘除掉 。)
推荐阅读
- 一篇详解Redis -- 延时队列
- python 手把手教你基于搜索引擎实现文章查重
- 克柳切夫火山喷发 克柳切夫火山喷出6000米高灰柱
- 历史上火山最大的喷发 世界上最大的一次火山喷发
- 哪座火山爆发毁灭了古罗马的庞贝城 哪个火山摧毁了古罗马的庞贝城
- 哪个火山的爆发毁灭了古罗马帝国的庞贝城?
- 马达加斯加岛是火山岛吗 阿拉斯加湖泊的形成
- 开发人员如何快速定制化实现一个基于Solr的搜索引擎
- 网易考拉规则引擎平台架构设计与实践
- Redis集群的5种使用方式,及各自优缺点对比分析