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

  • 之后,Operator 等待 30 秒 。这个机制的出发点是:
  • 首先,Proxy 去 Configserver 拉取配置是异步过程,可能需要经过至少一轮的数据同步才能正常拿到数据 。等待 30 秒主要是为了保证所有的 Proxy 都已经拿到了最新的读拓扑,新的读请求不会再发送到要升级的 Server 节点上 。
  • 另外,我们要保证等待 30 秒的时间,让已经被要升级的 Server Pod 接收的这些请求都成功地被处理,并且返回之后,才能把要升级的 Server Pod kill 掉 。
  • 30 秒之后请求 ApiServer 执行实际的 Pod 删除操作 。删除之后 K8s 会重新调度一个新的 Pod 起来,这时新创建的 Server Pod 也是一个独立的 Server 的状态,没有跟任何节点建立主从关系 。Operator 感知到新的 Server Pod 已经处于 ready 的状态,会把它注册到 Configserver 。
  • Configserver 连到新的 Server Pod 上,根据它所处的分片跟所在分片的 Master 节点建立主从关系,同时进行数据同步 。
  • Operator 会定期检查新的 Server 分片在 Configserver 是否已经完成数据同步 。如果是,Operator 才会认为一个 Server Pod 完成了升级 。该分片内其他所有 Server pod 的升级流程都是类似的,直到该分片内所有 Server Pod 都升级完,才认为这个分片升级完成 。最后 Operator 会更新自己 Redis Cluster 的 CRD 里对应的 Status 状态信息,反映当前组件升级的流程和变更操作已经结束了 。
  • 总结展望本次分享的以 Redis 为例,介绍了有状态服务部署到 K8s 的抽象流程,并介绍了火山引擎在 Redis 云原生方向的一些探索和实践 。目前火山引擎对于 Redis 云原生已经完成了基本功能的构建,未来会在动态扩缩容、异常恢复、细粒度的资源分配和管理方面,结合 K8s 的特性,进行更多深层次的思考和实践,期望通过云原生化的方式,进一步提升运维自动化能力和资源的利用率 。
     
    Q&A
    Q1:没用 Cluster 的模式吗?
    A:没有,最早也使用过 Cluster 模式,后来业务体量变大,发现 Cluster 有集群规模上限,不能满足业务的需求 。
    Q2:Redis 的 Proxy 会计算 Key 在哪个分片吗?
    A:会的,Proxy 会参考类似 Redis Cluster 的 Key Hash 算法对 Key 进行 hash,之后分布到不同的 Server 分片上 。
    Q3:如何界定 Slave 可以提升为 Master?切换步骤是怎样的?
    A:Configserver 会定期给 Master 发送 health check 请求进行探活 。只有连续多次对一个 Master 的探活都失败时,才会认为 Master 不可用 。这时 Configserver 会从分片内所有 Slave 中选择可用的提升成新的 Master(不是所有的 Slave 都可用,可能某一个 Slave 也挂了,或者主从数据同步的延迟比较高) 。
    Q4:Proxy 是每个 Redis 集群独有还是所有集群共享的?
    A:Proxy 不是每个 Redis 集群独占的 。首先,所有集群共享一个 Proxy 集群,有隔离性的问题 。另外,Proxy 支持动态扩缩容,可以做到弹性资源扩缩容,所以不会导致资源浪费 。
    Q5:系统的稳定性如何,主从切换耗时怎样?
    A:稳定性挺好 。主从切换的耗时是一个策略问题,需要做一些 tradeoff 。如果判断策略太激进,可能会因为临时的网络抖动等因素频繁触发主从切换 。实际使用中我们的主从切换耗时在 10s 左右 。
    Q6:Redis 在什么规模等级下的 K8s 部署会需要修改较多默认配置或者直接更改源码? 在动态扩容的基础上建立 Redis 集群是否会加大困难?有什么方式可以让 Redis 集群无限扩容吗?最多到多少?
    A:Redis 目前部署的 K8s 集群规模可选,根据需要的 Redis 集群容量来选择 K8s 规模就可以 。适配云原生会需要调整一些组件之间的服务发现方式,但是不需要太多源码的修改 。我们目前只支持 Proxy 的动态扩缩容,Server 是有状态的服务,还不太好接入 HPA(因为可能会涉及到一些数据的迁移),虽然 HPA 也支持对 Statefulset 服务的自动化扩缩容 。我们的 Redis 架构理论上集群的规模可以很大,现在 CRD 的限制是一个 Redis 集群最多 1024 个分片 。
    关于火山引擎火山引擎是字节跳动旗下的数字服务与智能科技品牌,基于公司服务数亿用户的大数据、人工智能和基础服务等技术能力,为企业提供系统化的全链路解决方案,助力企业务实地创新,给企业带来持续、快速增长 。




    推荐阅读