Skip to content

集群实现原理

gaoshengL edited this page Jan 5, 2022 · 16 revisions

架构


架构释义:

  • 整个部署形态遵从Redis Cluster集群拓扑并引入Predixy作为集群的代理层
  • Redis Cluster的group对应一个statfulset,比如XX-0,那么group中的主备将名为XX-0-0和XX-0-1,而在CR对象中的status会动态记录对应group对应的槽位
  • Redis实例的底层存储是可选的,结合storageclass可以接入本地盘(empty dir)或者ceph(pvc)等
  • 每个Redis Pod具备sidecar exporter镜像,可以流畅接入prometheus

Redis Cluster CR定义示例

apiVersion: cache.tongdun.net/v1alpha1
  kind: RedisCluster
  metadata:
    name: redis-cluster-rat
    namespace: redis-cluster
  spec:
    app: cluster-rat
    capacity: 32768
    dc: hz
    env: production
    image: tongduncloud/redis-cluster:0.2
    monitorimage: tongduncloud/redis-exporter:1.0
    netmode: ClusterIP
    proxyimage: tongduncloud/predixy:1.0
    proxysecret: abc
    realname: dba
    secret: abc
    size: 3
    storageclass: ""
    vip: ""

集群创建

集群的组织过程完全有Operator负责,整个流程是将运维部署过程编码化

以下是几个关键步骤:

  • 前台服务通过用户键入的存储大小计算group数量以及单节点的maxmemroy
  • 根据group数量创建sts的过程中,会等待所有(group数量*2)的Redis Pod正常提供服务后,此时Pod均是独立且不存在角色,此时调用cluster创建API命令组织X-N-0成为集群
  • X-N-1作为slave分别加入集群中对应的group中

集群扩容

集群扩容是个复杂的过程一方面扩容分为横向扩容和纵向扩容,另一方面作为在线扩容如何对线上的影响最小化也是需要考虑的

1. 纵向扩容

  • 纵向扩容对在线服务影响是最小的,只有存储需求大小未超过当前group数量*32G(单节点存储上限)即实施纵向扩容
  • 只要被Opertor识别为纵向扩容需求,那么计算好单节点新容量,将通过config set和configmap更新持久化

2. 横向扩容

  • 当存储寻求超过当前group数量*32G,那么将进入横向扩容逻辑
  • 计算好需要新增的group数量,创建对应的statefulset,并依次加入集群后,通过Rebalance来达到数据均衡
  • 数据平衡好后新的slot信息将会被记录到CR对象的status中

故障切换

处理流程

  • 单点故障的发生的时候,故障节点将被识别而删除
  • 对于group中新创建的Redis实例将被识别出对应sts对应的group将其与对应group当前的master建立主从同步
Clone this wiki locally