Maison  >  Article  >  base de données  >  Comment déployer un cluster Redis dans K8s

Comment déployer un cluster Redis dans K8s

WBOY
WBOYavant
2023-05-31 17:25:391501parcourir

Construction du cluster redis

1.1 Utilisez redis-cli pour créer un cluster

# 查看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.

Faites attention au nœud maître ci-dessus, l'identifiant du nœud correspondant sera généré : bcae187137a9b30d7dab8fe0d8ed4a46c6e39638, 287b90 927bcb214729 code>, 4367e4a45e557406a3112e7b79f82a44d4ce485e , utilisé pour créer des nœuds esclaves. bcae187137a9b30d7dab8fe0d8ed4a46c6e39638a2cec159bbe2efa11a8f60287b90927bcb2147294367e4a45e557406a3112e7b79f82a44d4ce485e,用于创建slave节点。

# 为每个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] All nodes agree about slots configuration.

[OK] All 16384 slots covered.

[OK] New node added correctly.

坑:

一开始是想用headless的域名创建redis集群的,这样节点重启后就不需要更新ip,但是redis不支持使用域名,所以只能绕了一圈又回到固定ip的方法,和容器环境很不协调。

1.2redis集群状态验证(可选)

  • cluster info

# 进入到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

注意:

现在进入集群中的任意一个Pod中都可以访问Redis服务,前面我们创建了一个headless类型的Service,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

  • cluster nodes

# 查看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个master,3个slave节点,都是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"

master节点进行set操作,slave节点复制。主从复制

1.3重启pod,验证集群(可选)

# 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的Headless Service,但该Service没有Cluster Ip,因此不能用于外界访问。因此,我们需要创建一个专门为Redis集群提供访问和负载均衡的Service。

这里可以使用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端口,并且会对labels namek8s.kuboard.cn/name: redis的pod进行负载均衡。

然后在K8S集群中,就可以通过redis-ss:6379

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

Les informations suivantes s'affichent, ce qui signifie que l'ajout est réussi :

[OK] Tous les nœuds sont d'accord sur la configuration des emplacements.

[OK] Tous les 16384 emplacements couverts.

[OK] Nouveau nœud ajouté correctement.

Piège :

Au début, je voulais utiliser un nom de domaine sans tête pour créer un cluster Redis, afin qu'il ne soit pas nécessaire de mettre à jour l'IP après le redémarrage du nœud. Cependant, Redis ne prend pas en charge l'utilisation de noms de domaine, je ne peux donc que faire le tour et revenir à la méthode IP fixe, qui est très différente de l'environnement de coordination des conteneurs.

1.2 Vérification de l'état du cluster Redis (facultatif)

  • infos sur le cluster🎜
spring.redis.cluster.nodes=redis-ss:6379
🎜Remarque : 🎜🎜Entrez maintenant dans le cluster The Redis Le service est accessible dans n'importe quel pod. Plus tôt, nous avons créé un service sans tête. Le cluster Kubernetes attribuera un enregistrement DNS au service au format : $(pod.name).$(headless. server.name).${namespace}.svc.cluster.local, chaque fois que vous accédez au nom du service, vous entrerez directement dans le nœud redis . svc.cluster.local peut être omis. Par exemple : 🎜🎜redis-cli -c -a jxbd -h redis-0.redis-hs.jxbp -p 6379🎜
  • 🎜nœuds de cluster🎜
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
🎜Vous pouvez voir 3 nœuds maîtres et 3 nœuds esclaves, tous en statut connecté. 🎜
  • 🎜get, set verify🎜
rrreee🎜Le nœud maître effectue l'opération de définition et le nœud esclave se réplique. Réplication maître-esclave🎜🎜1.3 Redémarrez le pod et vérifiez le cluster (facultatif)🎜rrreee🎜Vous pouvez voir le nœud redis-1 après le redémarrage Bien que l'IP ait changé, le cluster redis peut toujours reconnaître la nouvelle IP et le cluster. est toujours normal. 🎜🎜10.168.235.225 ---> 10.168.235.232🎜🎜1.4 Créer un service 🎜🎜 Plus tôt, nous avons créé un service sans tête pour implémenter StatefulSet, mais ce service n'a pas d'adresse IP de cluster, il ne peut donc pas être utilisé pour un accès externe. Par conséquent, nous devons créer un service spécifiquement pour fournir l'accès et l'équilibrage de charge au cluster Redis. 🎜🎜Vous pouvez utiliser ClusterIP et NodePort ici. Ici, j'utilise NodePort. 🎜🎜vi redis-ss.yaml🎜rrreee🎜Créez un service nommé : redis-ss. 🎜🎜Exposez le port 6379 dans le cluster K8S et équilibrez la charge des pods dont le nom des étiquettes est k8s.kuboard.cn/name: redis. 🎜🎜Ensuite, dans le cluster K8S, vous pouvez accéder au cluster redis via redis-ss:6379. 🎜rrreee🎜Configuration du projet Springboot 1.5🎜rrreee🎜Analyse des questions connexes 1.6🎜🎜À ce stade, vous vous demandez peut-être pourquoi Redis Pod peut-il basculer normalement sans utiliser l'indicateur stable ? Cela implique le mécanisme de Redis lui-même. Parce que chaque nœud du cluster Redis a son propre NodeId (enregistré dans le fichier nodes.conf généré automatiquement), et le NodeId ne changera pas avec l'IP. Il s'agit en fait d'un symbole de réseau fixe. En d'autres termes, même si un pod Redis est redémarré en raison d'un redémarrage, le pod utilisera toujours le NodeId enregistré pour conserver son identité. Vous pouvez afficher le fichier de configuration du nœud redis-0 nodes.conf via NFS🎜rrreee🎜 comme ci-dessus. La première colonne est NodeId, qui est stable ; la deuxième colonne contient les informations IP et de port, qui peuvent changer. 🎜🎜Ici, nous introduisons deux scénarios d'utilisation de NodeId : 🎜🎜Lorsqu'un Slave Pod est déconnecté et reconnecté, l'adresse IP change, mais le maître constate que son NodeId est toujours le même, il pense donc que l'esclave est toujours l'esclave précédent. . 🎜🎜Si un Master Pod est déconnecté, les autres Slaves du cluster éliront un nouveau Master. Si l'ancien maître est mis en ligne et que le cluster constate que son NodeId est toujours le même, il deviendra le nœud esclave du nouveau maître. 🎜

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer