Удаление модуля для StatefulSet кластера Redis не восстанавливает состояние кластера Redis - PullRequest
0 голосов
/ 14 июня 2019

Я использовал redis: 5.0.1-alpine в моем наборе состояний, набор состояний имеет 6 пакетов, и формирование кластера redis выполняется с помощью следующей команды

redis-cli --cluster create {IPlist размещенздесь} --cluster-replicas 1

Теперь, в случае, если блоки были случайно удалены или AKS выходит из строя, то блоки при создании после возобновления работы AKS будут иметь разные IP.

Iпопытка преднамеренного удаления модулей, когда они воссоздаются, а затем состояние кластера меняется на «сбой» (что было «хорошо» при первоначальном создании кластера)

Также, когда я пытаюсь получить старый набор данныхв кластер появляется сообщение о том, что «кластер не работает»

Я отобразил код для файла redis.conf, используемого для создания кластера

apiVersion: v1
kind: ConfigMap
metadata:
  name: redis-cluster
  namespace: redis
data:
  update-node.sh: |
    #!/bin/sh
    REDIS_NODES="/data/nodes.conf"
    sed -i -e "/myself/ s/[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0- 
    9]\{1,3\}/${POD_IP}/" ${REDIS_NODES}
    exec "$@"
  redis.conf: |+
    cluster-enabled yes
    cluster-require-full-coverage no
    cluster-node-timeout 15000
    cluster-config-file /data/nodes.conf
    cluster-migration-barrier 1
    appendonly yes
    protected-mode no

снимок описания проблемы

Данные, связанные с узлами и слотами Redis Cluster, как прикрепленные Узлы и слоты Redis кластеров

1 Ответ

0 голосов
/ 23 июля 2019

Когда вы перезапускаете один модуль, модуль запускается с новым IP-адресом, публикует его для других модулей и все они обновляют свою конфигурацию, касающуюся изменения IP-адреса.

В случае, если все модули отключаются и включаютсяВ то же время (например, в случае перезагрузки всех узлов в кластере) модули не могут общаться друг с другом, поскольку IP-адреса в их узлах.conf неверны.

Возможное решение заключается в обновлении IP-адресов вnode.conf на всех запущенных модулях и перезапустите их один за другим.

Я сделал это, внедрив этот скрипт в каждый модуль:

recover-pod.sh

#!/bin/sh
set -e

REDIS_NODES_FILE="/data/nodes.conf"
for redis_node_ip in "$@"
do
  redis_node_id=`redis-cli -h $redis_node_ip -p 6379 cluster nodes | grep myself | awk '{print $1}'`
  sed -i.bak -e "/^$redis_node_id/ s/[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}/${redis_node_ip}/" ${REDIS_NODES_FILE}
done

И запуск его с одного из узлов Kubernetes:

recover-cluster.sh

#!/bin/bash

for i in {0..5}
do
  echo "Updating the correct IPs in nodes.conf on redis-cluster-redis-cluster-statefulset-$i"
  kubectl exec -it redis-cluster-redis-cluster-statefulset-$i /readonly-config/recover-pod.sh $(kubectl get pods -l app=redis-cluster -o jsonpath='{range.items[*]}{.status.podIP} ' )
done

kubectl patch statefulset redis-cluster-redis-cluster-statefulset --patch '{"spec": {"template": {"metadata": {"labels": {"date": "'`date +%s`'" }}}}}'

Это приводит к тому, что кластер Redis возвращается в работоспособное состояние.

...