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