簡體   English   中英

Redis Kubernetes 上的前哨 HA

[英]Redis sentinel HA on Kubernetes

我正在嘗試將 1 個 redis 主控與 2 個 redis 副本綁定到 Kubernetes 上的 3 個仲裁哨兵。 我對 Kubernetes 很陌生。

我最初的計划是讓主節點在綁定到 1 Kubernetes SVC 的 Pod 上運行,而在自己的 Pod 上運行的 2 個副本綁定到另一個 Kubernetes SVC。 最后,3 個 Sentinel pod 將綁定到它們自己的 SVC。 副本將綁定到主 SVC(因為沒有 svc,ip 會發生變化)。 哨兵也將被配置並綁定到主 SVC 和副本 SVC。 但我不確定這是否可行,因為當主 pod 崩潰時,其中一個副本 pod 將如何移動到主 SVC 並成為主? 那可能嗎?

我采用的第二種方法是將 redis pod 包裝在復制 controller 中,對於哨兵也是如此。 但是,我不確定如何使用復制 controller 使其中一個 pod 成為 master 和其他副本。

這兩種方法中的任何一種都行得通嗎? 如果沒有,我可以采用更好的設計嗎? 任何線索將不勝感激。

您可以使用Helm package 管理器和Redis Helm Chart部署 Redis Sentinel。
如果你還沒有安裝Helm3 ,你可以使用這個文檔來安裝它。

我將提供一些解釋來說明它是如何工作的。


首先我們需要從 Redis Helm Chart 中獲取values.yaml文件來自定義我們的安裝:

$ wget https://raw.githubusercontent.com/bitnami/charts/master/bitnami/redis/values.yaml

我們可以在values.yaml文件中配置很多參數,但是為了演示,我只啟用了 Sentinel 並設置了 redis 密碼:
注意:有關可在安裝期間配置的參數列表,請參閱Redis Helm Chart 參數文檔。

# values.yaml

global:
  redis:
    password: redispassword
...
replica:
  replicaCount: 3
...
sentinel:
  enabled: true
...

然后我們可以使用values.yaml文件中的配置部署 Redis:
注意:它將部署一個由StatefulSets管理的三個 Pod 集群(一個主和兩個從),每個 Pod 內運行一個sentinel容器。

$ helm install redis-sentinel bitnami/redis --values values.yaml

請務必仔細閱讀圖表安裝 output 的NOTES部分。 它包含許多有用的信息(例如如何從集群外部連接到您的數據庫)

安裝完成后,檢查 redis StatefulSetPodsServices (內部訪問可以使用headless 服務):

$ kubectl get pods -o wide
NAME                    READY   STATUS    RESTARTS   AGE     IP
redis-sentinel-node-0   2/2     Running   0          2m13s   10.4.2.21
redis-sentinel-node-1   2/2     Running   0          86s     10.4.0.10
redis-sentinel-node-2   2/2     Running   0          47s     10.4.1.10


$ kubectl get sts
NAME                  READY   AGE
redis-sentinel-node   3/3     2m41s

$ kubectl get svc
NAME                      TYPE        CLUSTER-IP    EXTERNAL-IP   PORT(S)              AGE
redis-sentinel            ClusterIP   10.8.15.252   <none>        6379/TCP,26379/TCP   2m
redis-sentinel-headless   ClusterIP   None          <none>        6379/TCP,26379/TCP   2m

如您所見,每個redis-sentinel-node Pod 都包含redissentinel容器:

$ kubectl get pods redis-sentinel-node-0 -o jsonpath={.spec.containers[*].name}
redis sentinel

我們可以查看sentinel容器日志,找出哪個redis-sentinel-node是主節點:

$ kubectl logs -f redis-sentinel-node-0 sentinel
...
1:X 09 Jun 2021 09:52:01.017 # Configuration loaded
1:X 09 Jun 2021 09:52:01.019 * monotonic clock: POSIX clock_gettime
1:X 09 Jun 2021 09:52:01.019 * Running mode=sentinel, port=26379.
1:X 09 Jun 2021 09:52:01.026 # Sentinel ID is 1bad9439401e44e749e2bf5868ad9ec7787e914e
1:X 09 Jun 2021 09:52:01.026 # +monitor master mymaster 10.4.2.21 6379 quorum 2
...
1:X 09 Jun 2021 09:53:21.429 * +slave slave 10.4.0.10:6379 10.4.0.10 6379 @ mymaster 10.4.2.21 6379
1:X 09 Jun 2021 09:53:21.435 * +slave slave 10.4.1.10:6379 10.4.1.10 6379 @ mymaster 10.4.2.21 6379
...

從上面的日志可以看出, redis-sentinel-node-0 Pod 是 master, redis-sentinel-node-1 & redis-sentinel-node-2 Pod 是 slave。

為了測試,讓我們刪除 master 並檢查 sentinel 是否會將 master 角色切換為 slave 之一:

    $ kubectl delete pod redis-sentinel-node-0
    pod "redis-sentinel-node-0" deleted
    
    $ kubectl logs -f redis-sentinel-node-1 sentinel
    ...                                                                                           
    1:X 09 Jun 2021 09:55:20.902 # Executing user requested FAILOVER of 'mymaster'
    ...
    1:X 09 Jun 2021 09:55:22.666 # +switch-master mymaster 10.4.2.21 6379 10.4.1.10 6379
    ...
    1:X 09 Jun 2021 09:55:50.626 * +slave slave 10.4.0.10:6379 10.4.0.10 6379 @ mymaster 10.4.1.10 6379
    1:X 09 Jun 2021 09:55:50.632 * +slave slave 10.4.2.22:6379 10.4.2.22 6379 @ mymaster 10.4.1.10 6379

已經選擇了一個新的主節點( redis-sentinel-node-2 10.4.1.10 ),所以一切都按預期工作。

此外,我們可以通過連接到 Redis 節點之一來顯示更多信息:

$ kubectl run --namespace default redis-client --restart='Never' --env REDIS_PASSWORD=redispassword --image docker.io/bitnami/redis:6.2.1-debian-10-r47 --command -- sleep infinity
pod/redis-client created
$ kubectl exec --tty -i redis-client --namespace default -- bash
I have no name!@redis-client:/$ redis-cli -h redis-sentinel-node-1.redis-sentinel-headless -p 6379 -a $REDIS_PASSWORD
Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe.
redis-sentinel-node-1.redis-sentinel-headless:6379> info replication
# Replication
role:slave
master_host:10.4.1.10
master_port:6379
master_link_status:up
...

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM