ホームページ  >  記事  >  データベース  >  k8s に Redis クラスターをデプロイする方法

k8s に Redis クラスターをデプロイする方法

WBOY
WBOY転載
2023-05-31 17:25:391541ブラウズ

redis クラスターの構築

1.1 redis-cli を使用してクラスターを作成します

# 查看redis的pod对应的ip
kubectl get pod -n jxbp -o wide
>NAME                             READY   STATUS    RESTARTS   AGE    IP               NODE         NOMINATED NODE   READINESS GATES
 redis-0                          1/1     Running   0          18h    10.168.235.196   k8s-master   <none>           <none>
 redis-1                          1/1     Running   0          18h    10.168.235.225   k8s-master   <none>           <none>
 redis-2                          1/1     Running   0          18h    10.168.235.239   k8s-master   <none>           <none>
 redis-3                          1/1     Running   0          18h    10.168.235.198   k8s-master   <none>           <none>
 redis-4                          1/1     Running   0          18h    10.168.235.222   k8s-master   <none>           <none>
 redis-5                          1/1     Running   0          18h    10.168.235.238   k8s-master   <none>           <none>
# 进入到redis-0容器
kubectl exec -it redis-0 /bin/bash -n jxbp
# 创建master节点(redis-0、redis-2、redis-4)
redis-cli --cluster create 10.168.235.196:6379 10.168.235.239:6379 10.168.235.222:6379 -a jxbd
    > Warning: Using a password with &#39;-a&#39; or &#39;-u&#39; option on the command line interface may not be safe.
    >>> Performing hash slots allocation on 3 nodes...
    Master[0] -> Slots 0 - 5460
    Master[1] -> Slots 5461 - 10922
    Master[2] -> Slots 10923 - 16383
    M: bcae187137a9b30d7dab8fe0d8ed4a46c6e39638 10.168.235.196:6379
       slots:[0-5460] (5461 slots) master
    M: 4367e4a45e557406a3112e7b79f82a44d4ce485e 10.168.235.239:6379
       slots:[5461-10922] (5462 slots) master
    M: a2cec159bbe2efa11a8f60287b90927bcb214729 10.168.235.222:6379
       slots:[10923-16383] (5461 slots) master
    Can I set the above configuration? (type &#39;yes&#39; to accept): yes
    >>> Nodes configuration updated
    >>> Assign a different config epoch to each node
    >>> Sending CLUSTER MEET messages to join the cluster
    Waiting for the cluster to join
    .
    >>> Performing Cluster Check (using node 10.168.235.196:6379)
    M: bcae187137a9b30d7dab8fe0d8ed4a46c6e39638 10.168.235.196:6379
       slots:[0-5460] (5461 slots) master
    M: a2cec159bbe2efa11a8f60287b90927bcb214729 10.168.235.222:6379
       slots:[10923-16383] (5461 slots) master
    M: 4367e4a45e557406a3112e7b79f82a44d4ce485e 10.168.235.239:6379
       slots:[5461-10922] (5462 slots) master
    [OK] All nodes agree about slots configuration.
    >>> Check for open slots...
    >>> Check slots coverage...
    [OK] All 16384 slots covered.

上記のマスター ノードは、対応するノード ID を生成することに注意してください: bcae187137a9b30d7dab8fe0d8ed4a46c6e39638, a2cec159bbe2efa11a8f60287b90927bcb21 4729 4367e4a45e557406a3112e7b79f82a44d4ce485e、スレーブ ノードの作成に使用されます。

# 为每个master节点添加slave节点
# 10.168.235.196:6379的位置可以是任意一个master节点,一般我们用第一个master节点即redis-0的ip地址
# --cluster-master-id参数指定该salve节点对应的master节点的id
# -a参数指定redis的密码
# redis-0的master节点,添加redis-1为slave节点
redis-cli --cluster add-node 10.168.235.225:6379 10.168.235.196:6379 --cluster-slave --cluster-master-id bcae187137a9b30d7dab8fe0d8ed4a46c6e39638 -a jxbd
# redis-2的master节点,添加redis-3为slave节点
redis-cli --cluster add-node 10.168.235.198:6379 10.168.235.239:6379 --cluster-slave --cluster-master-id a2cec159bbe2efa11a8f60287b90927bcb214729 -a jxbd
# redis-4的master节点,添加redis-5为slave节点
redis-cli --cluster add-node 10.168.233.238:6379 10.168.235.222:6379 --cluster-slave --cluster-master-id 4367e4a45e557406a3112e7b79f82a44d4ce485e -a jxbd

次の情報が表示されます。これは追加が成功したことを意味します:

[OK] すべてのノードがスロット構成について同意しました。

[OK] すべての 16384 スロットがカバーされています。

[OK] 新しいノードが正しく追加されました。

落とし穴:

最初は、ヘッドレス ドメイン名を使用して Redis クラスターを作成したいと考えていました。ノードの再起動後に IP を更新する必要はありませんが、redis は更新しません。ドメイン名の使用をサポートしているため、一周して固定 IP 方式に戻ることしかできず、コンテナー環境と非常に矛盾しています。

1.2redis クラスターのステータスの確認 (オプション)

  • クラスター情報

# 进入到redis客户端,集群需要带上-c,有密码需要带上-a
redis-cli -c -a jxbd
# 查看redis集群信息
127.0.0.1:6379> cluster info
cluster_state:ok
cluster_slots_assigned:16384
cluster_slots_ok:16384
cluster_slots_pfail:0
cluster_slots_fail:0
cluster_known_nodes:6
cluster_size:3
cluster_current_epoch:3
cluster_my_epoch:1
cluster_stats_messages_ping_sent:7996
cluster_stats_messages_pong_sent:7713
cluster_stats_messages_sent:15709
cluster_stats_messages_ping_received:7710
cluster_stats_messages_pong_received:7996
cluster_stats_messages_meet_received:3
cluster_stats_messages_received:15709

注:

今すぐクラスター内の任意のポッドから Redis サービスにアクセスできます。以前にヘッドレス サービスを作成しました。kubernetes クラスターは、DNS レコードを次の形式でサービスに割り当てます: $(pod.name).$(headless server.name).${namespace}.svc.cluster.local、サービス名にアクセスするたびに、直接 Redis を入力しますノード。 svc.cluster.localは省略可能です。例:

redis-cli -c -a jxbd -h redis-0.redis-hs.jxbp -p 6379

  • クラスター ノード

# 查看redis集群状态
127.0.0.1:6379> cluster nodes
70220b45e978d0cb3df19b07e55d883b49f4127d 10.168.235.238:6379@16379 slave 4367e4a45e557406a3112e7b79f82a44d4ce485e 0 1670306292673 2 connected
122b89a51a9bf005e3d47b6d721c65621d2e9a75 10.168.235.225:6379@16379 slave bcae187137a9b30d7dab8fe0d8ed4a46c6e39638 0 1670306290558 1 connected
c2afcb9e83038a47d04bf328ead8033788548234 10.168.235.198:6379@16379 slave a2cec159bbe2efa11a8f60287b90927bcb214729 0 1670306291162 3 connected
4367e4a45e557406a3112e7b79f82a44d4ce485e 10.168.235.239:6379@16379 master - 0 1670306291561 2 connected 5461-10922
bcae187137a9b30d7dab8fe0d8ed4a46c6e39638 10.168.235.196:6379@16379 myself,master - 0 1670306291000 1 connected 0-5460
a2cec159bbe2efa11a8f60287b90927bcb214729 10.168.235.222:6379@16379 master - 0 1670306292166 3 connected 10923-16383

3 つのマスター ノードと 3 つのスレーブ ノードがすべて connected ステータスにあることがわかります。

  • get、set 検証

# 会找到对应的槽进行set操作,去到10.168.235.222节点
set name1 llsydn
-> Redirected to slot [12933] located at 10.168.235.222:6379
OK

# set name1成功
10.168.235.222:6379> set name1 llsydn
OK

# get name1成功
10.168.235.222:6379> get name1
"llsydn"

マスター ノードが set 操作を実行し、スレーブ ノードがレプリケートします。マスター/スレーブ レプリケーション

1.3 ポッドを再起動してクラスターを確認します (オプション)

# redis-1未重启之前
10.168.235.239:6379> cluster nodes
4367e4a45e557406a3112e7b79f82a44d4ce485e 10.168.235.239:6379@16379 myself,master - 0 1670307319000 2 connected 5461-10922
bcae187137a9b30d7dab8fe0d8ed4a46c6e39638 10.168.235.196:6379@16379 master - 0 1670307319575 1 connected 0-5460
70220b45e978d0cb3df19b07e55d883b49f4127d 10.168.235.238:6379@16379 slave 4367e4a45e557406a3112e7b79f82a44d4ce485e 0 1670307318000 2 connected
122b89a51a9bf005e3d47b6d721c65621d2e9a75 10.168.235.225:6379@16379 slave bcae187137a9b30d7dab8fe0d8ed4a46c6e39638 0 1670307319781 1 connected
c2afcb9e83038a47d04bf328ead8033788548234 10.168.235.198:6379@16379 slave a2cec159bbe2efa11a8f60287b90927bcb214729 0 1670307319071 3 connected
a2cec159bbe2efa11a8f60287b90927bcb214729 10.168.235.222:6379@16379 master - 0 1670307318000 3 connected 10923-16383

# 重启redis-1
kubectl delete pod redis-1 -n jxbp
pod "redis-1" deleted

# redis-1重启之后
10.168.235.239:6379> cluster nodes
4367e4a45e557406a3112e7b79f82a44d4ce485e 10.168.235.239:6379@16379 myself,master - 0 1670307349000 2 connected 5461-10922
bcae187137a9b30d7dab8fe0d8ed4a46c6e39638 10.168.235.196:6379@16379 master - 0 1670307349988 1 connected 0-5460
70220b45e978d0cb3df19b07e55d883b49f4127d 10.168.235.238:6379@16379 slave 4367e4a45e557406a3112e7b79f82a44d4ce485e 0 1670307349000 2 connected
122b89a51a9bf005e3d47b6d721c65621d2e9a75 10.168.235.232:6379@16379 slave bcae187137a9b30d7dab8fe0d8ed4a46c6e39638 0 1670307350089 1 connected
c2afcb9e83038a47d04bf328ead8033788548234 10.168.235.198:6379@16379 slave a2cec159bbe2efa11a8f60287b90927bcb214729 0 1670307350000 3 connected
a2cec159bbe2efa11a8f60287b90927bcb214729 10.168.235.222:6379@16379 master - 0 1670307348000 3 connected 10923-16383

再起動後、redis-1 ノードが表示されます。IP は変更されましたが、redis クラスターは新しい IP に対して、クラスターはまだ正常に動作しています。

10.168.235.225 ---> 10.168.235.232

1.4 サービスの作成 Service

先ほど、StatefulSet を実装するためのヘッドレス サービスを作成しましたが、このサービスにはクラスター IP であるため、外部アクセスには使用できません。したがって、Redis クラスターへのアクセスと負荷分散を提供するためのサービスを特に作成する必要があります。

ここでは ClusterIPNodePort を使用できます。ここでは NodePort を使用しています。

vi redis-ss.yaml

---
apiVersion: v1
kind: Service
metadata:
  labels:
    k8s.kuboard.cn/layer: db
    k8s.kuboard.cn/name: redis
  name: redis-ss
  namespace: jxbp
spec:
  ports:
    - name: imdgss
      port: 6379
      protocol: TCP
      targetPort: 6379
      nodePort: 6379
  selector:
    k8s.kuboard.cn/layer: db
    k8s.kuboard.cn/name: redis
  type: NodePort

redis-ss という名前のサービスを作成します。

K8S クラスターでポート 6379 を公開し、ラベル名 k8s.kuboard.cn/name: redis であるポッドの負荷分散を行います。

K8S クラスターでは、redis-ss:6379 を通じて Redis クラスターにアクセスできます。

kubectl get service -n jxbp

>NAME            TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)                                                         AGE
redis-hs        ClusterIP   None            <none>        6379/TCP                                                        76m
redis-ss        NodePort    10.96.54.201    <none>        6379:6379/TCP                                                   2s

1.5 Springboot プロジェクトの構成

spring.redis.cluster.nodes=redis-ss:6379

1.6 関連する質問の分析

この時点で、なぜ安定フラグが使用されず、Redis ポッドでも使用できるのか疑問に思われるかもしれません。通常は失敗します。転送はどうなりますか?これには Redis 自体のメカニズムが関係します。 Redis クラスター内の各ノードには独自の NodeId (自動的に生成されたnodes.conf に保存) があり、NodeId は IP によって変更されないため、これは実際には固定のネットワーク シンボルです。つまり、再起動により Redis ポッドが再起動された場合でも、ポッドはその ID を維持するために保存された NodeId を引き続き使用します。 NFS を介して redis-0 ノード構成ファイルnodes.conf

vi /opt/nfs/pv1/nodes.conf
> f6d4993467a4ab1f3fa806f1122edd39f6466394 10.168.235.228:6379@16379 slave ebed24c8fca9ebc16ceaaee0c2bc2e3e09f7b2c0 0 1670316449064 2 connected
ebed24c8fca9ebc16ceaaee0c2bc2e3e09f7b2c0 10.168.235.240:6379@16379 myself,master - 0 1670316450000 2 connected 5461-10922
955e1236652c2fcb11f47c20a43149dcd1f1f92b 10.168.235.255:6379@16379 master - 0 1670316449565 1 connected 0-5460
574c40485bb8f6cfaf8618d482efb06f3e323f88 10.168.235.224:6379@16379 slave 955e1236652c2fcb11f47c20a43149dcd1f1f92b 0 1670316449000 1 connected
91bd3dc859ce51f1ed0e7cbd07b13786297bd05b 10.168.235.237:6379@16379 slave fe0b74c5e461aa22d4d782f891b78ddc4306eed4 0 1670316450672 3 connected
fe0b74c5e461aa22d4d782f891b78ddc4306eed4 10.168.235.253:6379@16379 master - 0 1670316450068 3 connected 10923-16383
vars currentEpoch 3 lastVoteEpoch 0

を表示できます。上記のように、最初の列は NodeId (安定しています) であり、2 番目の列は IP およびポート情報であり、変更される可能性があります。

ここでは、NodeId の 2 つの使用シナリオを紹介します。

スレーブ ポッドが切断されて再接続されると、IP は変わりますが、マスターはその NodeId が同じであることに気づき、次のように考えます。スレーブが以前と同じであることを確認します。

マスター ポッドが切断された場合、クラスター内の他のスレーブが新しい​​マスターを選択します。古いマスターがオンラインになり、クラスターの NodeId が同じであることが判明した場合、そのクラスターは新しいマスターのスレーブ ノードになります。

以上がk8s に Redis クラスターをデプロイする方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はyisu.comで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。