Redis 集群部署

Redis 集群是一个可以在多个 Redis 节点之间进行数据共享的设施(installation)。

[TOC]

Redis 配置文件

创建 redis.conf 配置文件

# 开启 AOF
appendonly yes
# 开启集群
cluster-enabled yes
# 集群配置文件
cluster-config-file nodes.conf
# 集群节点间超时时间
cluster-node-timeout 5000

Headless Service

apiVersion: v1
kind: Service
metadata:
  name: redis-cluster-svc
  namespace: redis-cluster
spec:
  selector:
    app: redis-cluster
  ports:
  - port: 6379
  # 不设置集群 IP
  clusterIP: None

开始 Redis Standalone

...
  command: ["redis-server"]
  # 使用自定义的 redis.conf
  args: ["/usr/local/etc/redis/redis.conf"]
  volumeMounts:
    - name: cluster-cm
      mountPath: /usr/local/etc/redis
volumes:
  - name: cluster-cm
    configMap:
      # redis.conf 的 ConfigMap
      name: redis-cluster-cm
...

初始化集群

运行临时 Pod

kubectl run -it debian-tmp --image=debian --restart=Never --rm=true bash -n redis-cluster

安装软件

# dnsutils 提供 nslookup 和 dig 等工具
# redis-tools 提供 redis-cli 等
apt update && apt install -y dnsutils redis-tools

获取 Redis 的 IP

# redis-cluster-svc 为 Service 名
# 因为在同一命名空间(namespace),所以不需要完整 svc 名
nslookup redis-cluster-svc
1570683484454
# 单独获取 Pod 的 IP
# redis-cluster-0 为 Pod 名
nslookup redis-cluster-0.redis-cluster-svc

创建集群

本次使用的 Redis 的版本大于 5,因此直接使用 redis-cli 即可。版本小于 5 的,使用 redis-trib

使用 Headless svc 的方式,但是找不到 Pod IP,所以直接使用上一步操作的 IP。暂时不清楚为什么无头服务会有问题。可能 kube-dns 版本过低,已解决,看下方引用的文字。

The spec.serviceName field in the statefulSet manifest was wrong. It should match the metadata.name field in the headless service definition.

StatefulSet 中的 spec.serviceName 要和 Headless Service 中的 metadata.name 一致

# cluster-replicas 表示集群中的每个主节点创建一个从节点
# 如果使用 Headless Service
#redis-cli --cluster create $(dig +short redis-cluster-0.redis-cluster-svc):6379 \
#    $(dig +short redis-cluster-1.redis-cluster-svc):6379 \
#    $(dig +short redis-cluster-2.redis-cluster-svc):6379 \
#    $(dig +short redis-cluster-3.redis-cluster-svc):6379 \
#    $(dig +short redis-cluster-4.redis-cluster-svc):6379 \
#    $(dig +short redis-cluster-5.redis-cluster-svc):6379 \
#    --cluster-replicas 1
redis-cli --cluster create 10.244.1.8{0..2}:6379 10.244.2.17{1..3}:6379 --cluster-replicas 1
1570683864972

查看集群信息

redis-cli --cluster info 10.244.1.80:6379
1570683949598

操作集群

redis-cli -c -h 10.244.1.80
# 查看节点当前角色
10.244.1.80 > role
role

集群会自动按照算法将 key 放到合适的节点上。

1570684108564

测试主从切换

master 1 角色

1570685137927

Node 1 角色

1570685171398

停止 Master 1

# Master 1 对应的 Pod Name
kubectl delete pod redis-cluster-1 -n redis-cluster
1570685237276

查看 Node 1 当前的角色

Slave 角色已变成 Master。

1570685318685

详细 YAML 文件

Redis-Cluster

  • 使用了 NFS-Client,以持久化保存文件。

Redis集群的原理和搭建

在K8S上搭建Redis集群

从零开始搭建Kubernetes集群(六、在K8S上部署Redis 集群)

Last updated

Was this helpful?