k8s部署redis集群搭建過程示例詳解
寫在前面
在上一篇文章中,我們已經(jīng)做到了已經(jīng)創(chuàng)建好6個redis副本了。
具體的詳情,可以查看這里:k8s部署redis集群(一)
那么接下來,我們就繼續(xù)實現(xiàn)redis集群的搭建過程。
一、redis集群搭建
1.1使用redis-cli創(chuàng)建集群
# 查看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 # 創(chuàng)建master節(jié)點(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.
注意上面的master節(jié)點,會生成對應節(jié)點id:bcae187137a9b30d7dab8fe0d8ed4a46c6e39638
、a2cec159bbe2efa11a8f60287b90927bcb214729
、4367e4a45e557406a3112e7b79f82a44d4ce485e
,用于創(chuàng)建slave節(jié)點。
# 為每個master節(jié)點添加slave節(jié)點 # 10.168.235.196:6379的位置可以是任意一個master節(jié)點,一般我們用第一個master節(jié)點即redis-0的ip地址 # --cluster-master-id參數(shù)指定該salve節(jié)點對應的master節(jié)點的id # -a參數(shù)指定redis的密碼 # redis-0的master節(jié)點,添加redis-1為slave節(jié)點 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節(jié)點,添加redis-3為slave節(jié)點 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節(jié)點,添加redis-5為slave節(jié)點 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的域名創(chuàng)建redis集群的,這樣節(jié)點重啟后就不需要更新ip,但是redis不支持使用域名,所以只能繞了一圈又回到固定ip的方法,和容器環(huán)境很不協(xié)調(diào)。
1.2redis集群狀態(tài)驗證(可選)
- 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
注意:
現(xiàn)在進入集群中的任意一個Pod中都可以訪問Redis服務,前面我們創(chuàng)建了一個headless類型的Service,kubernetes集群會為該服務分配一個DNS記錄,格式為:$(pod.name)
.$(headless server.name)
.${namespace}
.svc.cluster.local
,每次訪問該服務名時,將會直接進入到redis的節(jié)點上。svc.cluster.local
可省略。 例如:
redis-cli -c -a jxbd -h redis-0.redis-hs.jxbp -p 6379
- cluster nodes
# 查看redis集群狀態(tài) 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節(jié)點,都是connected
狀態(tài)。
- get,set驗證
# 會找到對應的槽進行set操作,去到10.168.235.222節(jié)點 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節(jié)點進行set操作,slave節(jié)點復制。主從復制
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節(jié)點,雖然ip變了,但是redis集群,還是可以識別到新的ip,集群還是正常的。
10.168.235.225 ---> 10.168.235.232
1.4創(chuàng)建Service服務
前面我們創(chuàng)建了用于實現(xiàn)StatefulSet的Headless Service,但該Service沒有Cluster Ip,因此不能用于外界訪問。所以,我們還需要創(chuàng)建一個Service,專用于為Redis集群提供訪問和負載均衡。
這里可以使用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
創(chuàng)建名稱為:redis-ss
的服務。
在K8S集群中暴露6379端口,并且會對labels name
為k8s.kuboard.cn/name: redis
的pod進行負載均衡。
然后在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相關疑問分析
至此,大家可能會疑惑,那為什么沒有使用穩(wěn)定的標志,Redis Pod也能正常進行故障轉(zhuǎn)移呢?這涉及了Redis本身的機制。因為,Redis集群中每個節(jié)點都有自己的NodeId(保存在自動生成的nodes.conf中),并且該NodeId不會隨著IP的變化和變化,這其實也是一種固定的網(wǎng)絡標志。也就是說,就算某個Redis Pod重啟了,該Pod依然會加載保存的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,穩(wěn)定不變;第二列為IP和端口信息,可能會改變。
這里,我們介紹NodeId的兩種使用場景:
當某個Slave Pod斷線重連后IP改變,但是Master發(fā)現(xiàn)其NodeId依舊, 就認為該Slave還是之前的Slave。
當某個Master Pod下線后,集群在其Slave中選舉重新的Master。待舊Master上線后,集群發(fā)現(xiàn)其NodeId依舊,會讓舊Master變成新Master的slave。
對于這兩種場景,大家有興趣的話還可以自行測試,注意要觀察Redis的日志。
redis這種有狀態(tài)的應用到底應不應該使用k8s部署,還是使用外部服務器部署redis集群?
以上就是k8s部署redis集群搭建過程示例詳解的詳細內(nèi)容,更多關于k8s部署redis集群的資料請關注腳本之家其它相關文章!
相關文章
Redis中的String類型及使用Redis解決訂單秒殺超賣問題
這篇文章主要介紹了Redis中的String類型及使用Redis解決訂單秒殺超賣問題,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-11-11Redis 實現(xiàn)分布式鎖時需要考慮的問題解決方案
本文詳細探討了使用Redis實現(xiàn)分布式鎖時需要考慮的問題,包括鎖的競爭、鎖的釋放、超時管理、網(wǎng)絡分區(qū)等,并提供了相應的解決方案和代碼實例,有助于開發(fā)者正確且安全地使用Redis實現(xiàn)分布式鎖2024-09-09redis輕松處理經(jīng)緯度坐標點數(shù)據(jù)的實現(xiàn)方法
這篇文章主要介紹了redis輕松處理經(jīng)緯度坐標點數(shù)據(jù)的實現(xiàn)方法,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下2021-10-10