火山引擎 Redis 云原生实践( 三 )


Redis 云原生功能介绍Redis 云原生化以后,Operator 组件是基于 Operator Pattern 实现的一个 custom controller,主要用于编排 Redis Cluster resource,管理 Redis 集群的一些变更 。Configserver 也部署在 K8s 上,所有跟 Redis 相关的组件都是云原生化的 。
新建集群

火山引擎 Redis 云原生实践

文章插图
 
  1. 对于常见的新建集群的请求,会先发给 ApiServer 。ApiServer 接收到请求之后,会通过 client go 的 watch 机制让 Operator 感知到 。
  2. 随后 Operator 会请求 ApiServer 创建对应 Server 的 StatefulSet 。
  3. K8s 把所有 Server 的 StatefulSet 创建成功之后,等所有的 Pod 都处于 ready 状态,这时所有分片内的 Server Pod 之间是没有主从关系的 。
  4. Operator 感知到所有的 StatefulSet 都已经处于 ready 的状态之后,会获取所有 Server Pod 信息,并注册到 Configserver 。
  5. Configserver 接下来会连接到所有分片内的 Slave 节点,执行实际的 SLAVEOF 命令,保证建立真正的主从关系 。
  6. Operator 会定期查询 Configserver 里建立主从关系的进度 。等所有分片的主从关系建立成功之后, Operator 会请求 ApiServer 把对应的 Proxy 创建出来 。
  7. Proxy 创建出来之后,会去 Configserver 拉取最新的拓扑,保证对外提供服务的时候可以把请求打给后端正常的分片 。
 
分片扩容
火山引擎 Redis 云原生实践

文章插图
 
在实际使用的过程中如果遇到容量不足的情况,需要进行水平扩容 。分片扩容的请求也是类似的:
  1. 请求发给 ApiServer 。
  2. ApiServer 把请求推送给 Operator 。
  3. Operator 感知到之后,会先给 ApiServer 发请求,把新的分片对应的 StatefulSet 创建出来 。
  4. K8s 会把新分片的 StatefulSet 创建好,在处于 ready 状态之后,一个 StatefulSet 下的每个 Pod 也都是独立的状态,没有建立真正的主从关系 。
  5. Operator 获知新创建的 Server StatefulSet 分片已经处于 ready 状态之后,会把新的 Server 分片的实例地址注册到 Configserver 。Configserver 现在会有两个阶段:
  6. 第一步:指导新分片内真实主从关系的建立 。即连到所有的新分片的 Slave 上,执行 SLAVEOF 的命令;
  7. 第二步:指导数据从老分片迁移到新分片 。这样新的分片才能发挥作用,这一步很重要 。
  8. Operator 会一直检查数据迁移或者 rebalance 的进度 。等进度结束之后,Operator 会更新 Redis Cluster 里 status 的字段,反映出来当前的分片扩容的操作已经结束了 。
 
分片缩容
火山引擎 Redis 云原生实践

文章插图
【火山引擎 Redis 云原生实践】 
分片缩容的流程和分片扩容类似:请求先发送给 ApiServer,Operator 会感知到请求,然后把缩容分片的请求发送给 Configserver 。
Configserver 此时做的事情是:
 
  1. 先指导数据迁移 。考虑到后边的一些分片下线,需要把分片上的数据先迁移到其他可用分片上,保证数据不丢 。
  2. Operator 会一直查询 Configserver 指导的数据 rebalance 的进度 。等缩容操作在 Configserver 完成之后,Operator 会请求 ApiServer 执行真正的 Server StatefulSet 删除,这时才是安全的删除操作 。
 
组件升级
火山引擎 Redis 云原生实践

文章插图
 
一个 Redis 集群会涉及到两个组件:Proxy 和 Server 。
 
无状态的 Proxy 用 Deployment 托管,如果要进行组件升级,直接升级对应的 image 即可 。
 
Server 是一个有状态的组件,它的升级流程相对来说复杂一点 。为了简化流程,我们以 Server 只有 1 分片的 Redis 集群为例,介绍升级过程 。
  1. Server 组件的升级请求发送给 ApiServer,ApiServer 接收到这个请求之后会把它推送给 Operator 。
  2. Operator 首先会按照分片内 Pod 编号从大到小的顺序选择要升级的 Pod 。
  3. 选定 Pod 之后,会把它从 Configserver 的读拓扑里摘掉 。(如果要摘除的这个 Pod 在集群拓扑里是 Master,我们会先调用 Configserver 的 API,执行 Failover,把它变成 Slave,然后再把它从读的拓扑里边给摘除掉 。)


    推荐阅读