Maison > Article > base de données > Comment déployer un cluster Redis dans K8s
# 查看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 '-a' or '-u' 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 'yes' 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. bcae187137a9b30d7dab8fe0d8ed4a46c6e39638
、a2cec159bbe2efa11a8f60287b90927bcb214729
、4367e4a45e557406a3112e7b79f82a44d4ce485e
,用于创建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的方法,和容器环境很不协调。
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节点复制。主从复制
# 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
前面我们创建了用于实现StatefulSet的Headless Service,但该Service没有Cluster Ip,因此不能用于外界访问。因此,我们需要创建一个专门为Redis集群提供访问和负载均衡的Service。
这里可以使用ClusterIP
,NodePort
。这里,我使用的是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 name
为k8s.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 2sLes 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)
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🎜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é
. 🎜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!