作者:余生大大,大資料開發工程師,云原生愛好者,KubeSphere 社區用戶,
前言
Redis 是在開發程序中經常用到的快取中間件,在生產環境中為了考慮穩定性和高可用一般為集群模式的部署,
常規部署在虛擬機上的方式配置繁瑣并且需要手動重啟節點,而使用 K8s 進行 Redis 集群的部署有以下優點:
- 安裝便捷:使用鏡像或者
yaml組態檔即可一件安裝 - 自動調度:容器掛掉后會自動調度重啟和資源分配
- 縮擴容方便:在
擴容、縮容方面的優點無需多說,一鍵伸縮 - 穩定高效:
K8s在整個集群上進行調度,只要整個集群不掛掉總會調度到合適節點重啟容器服務
安裝 Redis 集群
我這里新建了一個 test-project 的專案空間來做 Redis 集群所有安裝資源的放置,后續在 DNS 上會用到專案空間名稱,會標注這一部分,需要注意用自己的專案空間名,
安裝集群大概分為以下幾步:
- 配置
redis.conf字典; - 創建
redis服務; - 容器組配置;
- 存盤設定;
- 高級設定,
現在從第一步開始,
1.1 配置 redis.conf 字典
在專案空間的 配置 → 配置字典 → 創建 進行配置字典的創建,

名稱就叫 redis-conf 然后下一步 添加鍵值對資料,

key 值的內容為 redis.conf,value 值為:
cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 5000
cluster-require-full-coverage no
cluster-migration-barrier 1
appendonly yes
創建 Redis 服務
在專案空間的 應用負載 → 服務 → 創建 進行 Redis 服務的創建,

選擇有狀態服務,需要資料存盤的服務基本都是有狀態的服務,

基本設定里名稱就叫 redis-cluster 然后進行重頭戲,下一步的容器組配置,
容器組配置
這一步的核心就是配置 Redis 的容器,集群數量就選擇常規的三主三從,那容器的副本數量就是 6 個,

容器組副本數量調到 6 個,點擊添加容器,

鏡像選擇 docker hub 中 redis 的 6.2.3 版本,并選擇使用默認埠,CPU 和記憶體可以選擇性預留,如果不預留就是調度公共資源,

選擇使用默認埠的話下面的埠設定就是如上圖一樣都會使用 6379,還有就是配置啟動命令,
如上圖配置:
- 命令:
redis-server - 引數:
/etc/redis/redis.conf
引數指向的就是之前字典配置的內容,但是需要下一步存盤設定里進行配置字典才能使用,

其他內容沒有什么需要配置的,選擇對勾完成容器配置,

更新策略就是推薦的滾動更新,其他也沒什么需要修改的,點擊下一步配置存盤設定,
存盤設定
在這一步有兩個操作
添加持久卷宣告模板掛載配置字典

添加持久卷宣告模板
PVC 名稱前綴:redis-pvc
容量:10G
掛載路徑:
-
權限:讀寫
-
地址:/data

主要是掛載路徑選好,配置好后點擊對勾完成配置
掛載配置字典
這一步是掛載我們之前配置的字典 redis-conf,也是我們 redis 啟動命令的引數內容,

選擇 redis 的配置字典,

掛載權限為:只讀,地址為:/etc/redis;跟上面的命令引數的配置相對應,

特定鍵選擇 redis.conf 后面同名 redis.conf,完成后點擊對勾回到存盤設定,

配置好后就入上圖,點擊下一步進入最后的高級設定,

高級設定里是一些額外配置,可以根據自己場景選擇調整配置,調成完成后點擊創建 進行 Redis 集群容器的創建,
初始化 Redis 集群
創建完 Redis 服務后點擊 redis 的服務名稱進入 redis 服務詳情,詳情如下圖:

6 個 redis 的容器組都啟動成功了,接下來就是初始化集群;因為我們配置的 redis 的服務是有狀態服務 (Headless) 所以訪問模式可以通過內部 DNS,訪問格式是:(容器名稱).( 容器 DNS).svc.cluster.local,

按上圖示例 比如訪問集群 1 節點訪問地址就是 redis-cluster-v1-1 加 DNS 地址 redis-cluster.test-project 加 svc.cluster.local,完整地址如下:
redis-cluster-v1-1.redis-cluster.test-project.svc.cluster.local
在 redis 集群的非第一節點的其他節點終端內通過這個地址進行訪問驗證他們是否互通,進入 3 節點的終端,如下圖:

進入終端,執行命令:
redis-cli -h redis-cluster-v1-1.redis-cluster.test-project.svc.clusterredis.local
如果能如下圖一樣跳轉到 v1-1 的節點上就代表這兩個節點互通,

執行命令:cluster info 查看節點的集群情況,

主要看上圖的這兩個引數,nodes 為 1 表明當前節點只有 1 個,cluster_size 表明當前沒有 master 節點,所以目前還不是集群結構,info 屬性的詳解在此列出:
cluster_state:ok 狀態表示集群可以正常接受查詢請求,fail 狀態表示,至少有一個哈希槽沒有被系結(說明有哈希槽沒有被系結到任意一個節點),或者在錯誤的狀態(節點可以提供服務但是帶有 FAIL 標記),或者該節點無法聯系到多數 master 節點,cluster_slots_assigned:已分配到集群節點的哈希槽數量(不是沒有被系結的數量),16384 個哈希槽全部被分配到集群節點是集群正常運行的必要條件,cluster_slots_ok:哈希槽狀態不是 FAIL 和 PFAIL 的數量,cluster_slots_pfail:哈希槽狀態是 PFAIL 的數量,只要哈希槽狀態沒有被升級到 FAIL 狀態,這些哈希槽仍然可以被正常處理,PFAIL 狀態表示我們當前不能和節點進行互動,但這種狀態只是臨時的錯誤狀態,cluster_slots_fail: 哈希槽狀態是 FAIL 的數量,如果值不是 0,那么集群節點將無法提供查詢服務,除非 cluster-require-full-coverage 被設定為 no,cluster_known_nodes:集群中節點數量,包括處于握手狀態還沒有成為集群正式成員的節點,cluster_size:至少包含一個哈希槽且能夠提供服務的 master 節點數量,cluster_current_epoch:集群本地 Current Epoch 變數的值,這個值在節點故障轉移程序時有用,它總是遞增和唯一的,cluster_my_epoch:當前正在使用的節點的 Config Epoch 值,這個是關聯在本節點的版本值,cluster_stats_messages_sent:通過 node-to-node 二進制總線發送的訊息數量,cluster_stats_messages_received:通過 node-to-node 二進制總線接收的訊息數量,
IP 地址初始化集群
先嘗試使用 ip + port 的方式初始化集群,但是在 K8s 中啟動服務 ip 都會變化,所以最終的結果還是要用 DNS 方式進行集群初始化,
執行本步后再想修改為 DNS 地址初始化需要從來一遍,如果不想麻煩的同學可以直接跳過,

記錄 redis 集群的所有 ip+port,初始化命令如下:
redis-cli --cluster create 10.233.70.30:6379 10.233.70.32:6379 10.233.90.41:6379 10.233.90.43:6379 10.233.96.47:6379 10.233.96.50:6379 --cluster-replicas 1
進入 redis 集群隨意一個節點的終端執行上面的命令,


如上圖集群初始化就完成了,再輸入命令 redis-cli 進入命令端,再執行 cluster info 查看集群資訊,

現在我們的集群節點有了 6 個,master 節點也有了三個,集群建立完成,后面的操作選擇 master 節點進行操作,

在對集群節點進行驗證的時候如果遇到上圖的錯誤 (error) MOVED 2589 10.233.70.30:6379 是因為 redis-cli 沒有開啟集群模式,將命令修改為 redis-cli -c 就切換為集群模式了,
使用內部 DNS 初始化
使用 ip 地址的方式在每次 K8s 調度 redis 后 ip 都會發生變化,所以在 K8s 集群中使用 ip 方式初始化集群并不太合適,但是如果使用內部 DNS 直接跟上面一樣初始化集群會出現錯誤,因為 redis 對域名的支持并不太好,所以這時候可以用 Redis-tribe,
創建 Redis-tribe 服務
創建自定義服務,選擇編輯 YAML,

引數 namespace 就寫專案名稱:

具體 YAML 內容如下:
apiVersion: apps/v1
kind: Deployment
metadata:
namespace: test-project
labels:
app: redis-cluster-tools
name: redis-cluster-tools
spec:
replicas: 1
selector:
matchLabels:
app: redis-cluster-tools
template:
metadata:
labels:
app: redis-cluster-tools
name: pos-redis
spec:
containers:
- name: pos-redis
image: sunnywang/redis-tools-ubuntu:v0.5.1
imagePullPolicy: IfNotPresent
args:
- /bin/bash
- -c
- sleep 3600
創建好后在容器組內找到 redis-cluster-tools,

初始化集群
點擊容器名稱進入容器詳情再進入到終端里,

先執行以下命令初始化 master 節點,這時候之前的內部 DNS 的域名就有用了,
redis-trib.py create `dig +short redis-cluster-v1-0.redis-cluster.test-project.svc.cluster.local`:6379 `dig +short redis-cluster-v1-1.redis-cluster.test-project.svc.cluster.local`:6379 `dig +short redis-cluster-v1-2.redis-cluster.test-project.svc.cluster.local`:6379
執行結果如下圖:

接下來給每個 master 節點系結對應的副本節點,總共三個:
0 節點->3 節點
redis-trib.py replicate --master-addr `dig +short redis-cluster-v1-0.redis-cluster.test-project.svc.cluster.local`:6379 --slave-addr `dig +short redis-cluster-v1-3.redis-cluster.test-project.svc.cluster.local`:6379
1 節點->4 節點
redis-trib.py replicate --master-addr `dig +short redis-cluster-v1-1.redis-cluster.test-project.svc.cluster.local`:6379 --slave-addr `dig +short redis-cluster-v1-4.redis-cluster.test-project.svc.cluster.local`:6379
2 節點->5 節點
redis-trib.py replicate --master-addr `dig +short redis-cluster-v1-2.redis-cluster.test-project.svc.cluster.local`:6379 --slave-addr `dig +short redis-cluster-v1-5.redis-cluster.test-project.svc.cluster.local`:6379
執行結果如下:

驗證
隨便進入一個集群節點的終端,還是執行 cluster info 命令,查看集群資訊,

使用基礎命令進行驗證,驗證集群模式的 redis-cli 需要加-c,

驗證集群模式可以正常使用,
本文由博客一文多發平臺 OpenWrite 發布!
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/509609.html
標籤:其他
上一篇:CPU 是如何與記憶體互動的
