欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

k8s部署redis集群搭建過程示例詳解

 更新時間:2023年02月21日 11:13:23   作者:llsydn  
這篇文章主要為大家介紹了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:bcae187137a9b30d7dab8fe0d8ed4a46c6e39638a2cec159bbe2efa11a8f60287b90927bcb214729、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 namek8s.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解決訂單秒殺超賣問題

    這篇文章主要介紹了Redis中的String類型及使用Redis解決訂單秒殺超賣問題,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-11-11
  • Linux下Redis集群搭建全過程(主從+哨兵)

    Linux下Redis集群搭建全過程(主從+哨兵)

    這篇文章主要介紹了Linux下Redis集群搭建全過程(主從+哨兵),具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-07-07
  • Redis 實現(xiàn)分布式鎖時需要考慮的問題解決方案

    Redis 實現(xiàn)分布式鎖時需要考慮的問題解決方案

    本文詳細探討了使用Redis實現(xiàn)分布式鎖時需要考慮的問題,包括鎖的競爭、鎖的釋放、超時管理、網(wǎng)絡分區(qū)等,并提供了相應的解決方案和代碼實例,有助于開發(fā)者正確且安全地使用Redis實現(xiàn)分布式鎖
    2024-09-09
  • Redis常見分布鎖的原理和實現(xiàn)

    Redis常見分布鎖的原理和實現(xiàn)

    這篇文章主要介紹了Redis常見分布鎖的原理和實現(xiàn),文章圍繞主題展開詳細的內(nèi)容介紹,具有一定的參考價值,需要的小伙伴可以參考一下
    2022-08-08
  • redis輕松處理經(jīng)緯度坐標點數(shù)據(jù)的實現(xiàn)方法

    redis輕松處理經(jīng)緯度坐標點數(shù)據(jù)的實現(xiàn)方法

    這篇文章主要介紹了redis輕松處理經(jīng)緯度坐標點數(shù)據(jù)的實現(xiàn)方法,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-10-10
  • Redis為什么要存兩次數(shù)據(jù)

    Redis為什么要存兩次數(shù)據(jù)

    這篇文章主要介紹了Redis為什么要存兩次數(shù)據(jù)的相關資料,需要的朋友可以參考下
    2021-02-02
  • Redis 哨兵集群的實現(xiàn)

    Redis 哨兵集群的實現(xiàn)

    Sentinel是Redis 的高可用性解決方案,本文詳細的介紹了redis哨兵集群的實現(xiàn),非常具有實用價值,需要的朋友可以參考下
    2021-06-06
  • SpringBoot 集成Redis 過程

    SpringBoot 集成Redis 過程

    redis是一個開源的、使用C語言編寫的、支持網(wǎng)絡交互的、可基于內(nèi)存也可持久化的Key-Value數(shù)據(jù)庫。本文給大家介紹SpringBoot 集成Redis 過程,感興趣的朋友一起看看吧
    2021-06-06
  • redis?lua限流算法實現(xiàn)示例

    redis?lua限流算法實現(xiàn)示例

    這篇文章主要為大家介紹了redis?lua限流算法實現(xiàn)示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-07-07
  • redis中key使用冒號分隔的原理小結(jié)

    redis中key使用冒號分隔的原理小結(jié)

    Redis是一種高性能的鍵值對非關系型數(shù)據(jù)庫,通過redis不同類型命令可以為其中的鍵指定不同的數(shù)據(jù)類型,其中每個鍵的命名規(guī)范通常使用冒號符號分隔字符串,本文主要介紹了redis中key使用冒號分隔的原理小結(jié),感興趣的可以了解一下
    2024-01-01

最新評論