在 KubeSphere 中部署高可用 Redis 叢集
作者:餘生大大,大資料開發工程師,雲原生愛好者,KubeSphere 社群使用者。
前言
Redis
是在開發過程中經常用到的快取中介軟體,在生產環境中為了考慮穩定性和高可用一般為叢集模式的部署。
常規部署在虛擬機器上的方式配置繁瑣並且需要手動重啟節點,而使用 K8s
進行 Redis
叢集的部署有以下優點:
- 安裝便捷:使用映象或者
yaml
配置檔案即可一件安裝 - 自動排程:容器掛掉後會自動排程重啟和資源分配
- 縮擴容方便:在
擴容
、縮容
方面的優點無需多說,一鍵伸縮 - 穩定高效:
K8s
在整個叢集上進行排程,只要整個叢集不掛掉總會排程到合適節點重啟容器服務
安裝 Redis 叢集
我這裡新建了一個 test-project
的專案空間來做 Redis
叢集所有安裝資源的放置,後續在 DNS
上會用到專案空間名稱,會標註這一部分,需要注意用自己的專案空間名。
安裝叢集大概分為以下幾步:
- 配置
redis.conf
字典; - 建立
redis
服務; - 容器組配置;
- 儲存設定;
- 高階設定。
現在從第一步開始。
1.1 配置 redis.conf 字典
在專案空間的 配置
→ 配置字典
→ 建立
進行配置字典的建立。
名稱就叫 redis-conf
然後下一步 新增鍵值對資料。
key
值的內容為 redis.conf
,value
值為:
cpp
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
,完整地址如下:
powershell
redis-cluster-v1-1.redis-cluster.test-project.svc.cluster.local
在 redis 叢集的非第一節點的其他節點終端內通過這個地址進行訪問驗證他們是否互通,進入 3 節點的終端,如下圖:
進入終端,執行命令:
powershell
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
,初始化命令如下:
powershell
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
內容如下:
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
的域名就有用了。
cpp
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 節點
cpp
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 節點
cpp
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 節點
cpp
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 釋出!
- 雲原生週刊:開源“贏了”,但它可持續嗎?
- 在 KubeSphere 中開啟新一代雲原生數倉 Databend
- 修復 K8s SSL/TLS 漏洞(CVE-2016-2183)指南
- K8s系列-KubeSphere
- Curve 分散式儲存在 KubeSphere 中的實踐
- 基於 KubeSphere 的運管系統落地實踐
- 使用 Fluent Bit 實現雲邊統一可觀測性
- 在 KubeSphere 中部署高可用 Redis 叢集
- 雲原生愛好者週刊:在瀏覽器中執行 Linux 系統 | 2022-10-10
- 雲原生愛好者週刊:你對 K8s 叢集升級有信心嗎?
- 在 KubeSphere 中部署高可用 Redis 叢集
- 利用 Kubernetes 內建 PodTemplate 管理 Jenkins 構建節點
- KubeSphere 社群雙週報 | 功能亮點搶“鮮”看 | 2022-09-30
- KubeSphere 社群雙週報 | 功能亮點搶“鮮”看 | 2022-09-30
- 使用 KubeEdge 和 EdgeMesh 實現邊緣複雜網路場景下的節點通訊
- KubeSphere 閘道器的設計與實現(解讀)
- 基於 CoreDNS 和 K8s 構建雲原生場景下的企業級 DNS
- 如何用架構的思維為雲原生做減法?
- 雲原生愛好者週刊:使用 eBPF 實現 PostgreSQL 的可觀測性
- 一文讀懂 Prometheus 長期儲存主流方案