在Kubernetes的3個node上部署rediscluster
目的
redis clustor 需要6臺伺服器才能正常運⾏,由於種種原因,開發或者某些特別的需求,只能在3臺伺服器上運⾏redis clustor。在不使用哨兵模式情況下,而使⽤最新的clustor模式運行redis。
本文僅作為redis部署方式的研究及理解
準備工作
製作redis docker.latest映象其中包含以下元件:
1. redis-cli
2. ruby
3. redis-trib
打包到映象上傳到阿里映象伺服器中cluster-redis:latest
建立叢集操作
3臺伺服器上各自運行兩個redis容器
使用以下編寫好的redis-cluster部署檔案,可在一臺部署出兩個不同埠,不同角⾊的redis容器。
redis-cluster.yaml
apiVersion: extensions/v1beta1 kind: Deployment metadata: name: redis-blue labels: app: redis member: redis-blue spec: replicas: 3 template: metadata: labels: app: redis member: redis-blue spec: hostNetwork: true containers: - name: redis image: registry.cn-hangzhou.aliyuncs.com/wise2c/cluster-redis:latest command: ["/bin/sh", "-c"] args: ["echo `dir /tmp/data` >> /root/redis.conf && /usr/local/bin/redis-server /root/redis.conf"] #- /usr/local/bin/redis-server #- /root/redis.conf ports: - name: redis-port containerPort: 6379 - name: cluster-port containerPort: 16379 volumeMounts: - mountPath: /tmp/data name: data volumes: - name: data hostPath: path: /tmp/redis-blue --- apiVersion: extensions/v1beta1 kind: Deployment metadata: name: redis-green labels: app: redis member: redis-green spec: replicas: 3 template: metadata: labels: app: redis member: redis-green spec: hostNetwork: true containers: - name: redis image: registry.cn-hangzhou.aliyuncs.com/wise2c/cluster-redis:latest command: ["/bin/sh", "-c"] args: ["sed -i `s/6379/6380/g` /root/redis.conf && echo `dir /tmp/data` >> /root/redis.conf && /usr/local/ports: - name: redis-port containerPort: 6380 - name: cluster-port containerPort: 16380 volumeMounts: - mountPath: /tmp/data name: data volumes: - name: data hostPath: path: /tmp/redis-green
kubectl create -f redis-cluster.yaml
執行以下指令碼,建立出整個redis叢集。redis會自動分配雜湊槽,使得master與其對應的slave不會出現在同一臺伺服器上。
create_cluster.sh
#!/usr/bin/env bash redis_count=`kubectl get pod -o wide -l app=redis | grep Running | wc -l` #echo "redis_count:"$redis_count if [ $redis_count -ne 6 ]; then echo "the running redis count: ${redis_count} is error" exit 1 fi redis_blue_ips=`kubectl get pod -o wide -l app=redis -l member=redis-blue | awk `NR>1{printf $6":6379 "}` redis_green_ips=`kubectl get pod -o wide -l app=redis -l member=redis-green | awk `NR>1{printf $6":6380 "}` redis_ips=$redis_blue_ips" "$redis_green_ips echo "redis_ips:"$redis_ips redis_blue_name=`kubectl get pod -o wide -l app=redis -l member=redis-blue | grep Running | awk `{printf $1" "}` #echo $redis_ips | awk -F` ` `{for( i=1;i<NF; i++ ) print $i}` `` kubectl create -f redis-cluster.yaml bash create_cluster.sh
關掉其中一臺機器 由於master和slave 不在同一臺機器上,當我們直接關掉其中⼀一臺vm,比如vm2
這時vm3上,由redis cluster自動恢復vm3slave2(6380) —> master2(6380) 提升為master,叢集工作正常,業務不中斷。
恢復關掉的的機器
當我們重新啟動vm2, 這時候叢集的狀態:
這時叢集工作正常,此時vm3有2個master。如果我們關掉vm3,會讓叢集中2個master同時下線,導致叢集無法自動恢復。
重點:執行以下指令碼,提升slave2到master2,恢復叢集的自動修復功能。
failover.sh
#!/usr/bin/env bash redis_blue_name=`kubectl get pod -o wide -l app=redis -l member=redis-blue | grep Running | awk `{printf $1":6379 redis_names=`kubectl get pod -o wide -l app=redis -l member=redis-blue | grep Running | awk `{printf $1","}` redis_array=${redis_names//,/ } for redis_name in $redis_array do kubectl exec -it ${redis_name} -- redis-cli cluster failover done
bash failover.sh
叢集自動恢復,變成下面的狀態。
叢集工作正常,業務不中斷。
作者後話
以上的操作,目的是讓各臺虛擬上不出現有2個master。當其中一臺虛擬機器出現當機,叢集就不能正常工作.。如果是3臺master和3臺slave分別在不同的機器剛好錯開,redis cluster能自動恢復.。最好的解決方案,依然是有6臺虛擬機器、3臺master、3臺slave的redis cluster。
To do
我們可以進⼀一步將
- create-redis.sh
- failover.sh
- kubectl
製作為映象, k8s deployment運行此映象。實現:
- 建立叢集
- 恢復叢集的自動修復功能(任意關掉其中一臺伺服器,業務不中斷。每過一秒,檢查叢集中是否有slave需要提升許可權,叢集都能正常工作.業務不中斷。)
本文轉自中文社群-在Kubernetes的3個node上部署redis cluster
相關文章
- 在 Kubernetes 上部署 llama3
- 帶你理解Kubernetes,部署一個Node應用
- 在 Kubernetes 中基於 StatefulSet 部署 MySQL(上)MySql
- 在 Kubernetes 中部署 Alertmanager
- 6個在本地機器上執行 Kubernetes 的工具
- Helm, 在Kubernetes中部署應用的利器
- Kettle 在 linux 上的部署Linux
- ssl 在nginx上的部署示例Nginx
- 3.部署kubernetes 網路元件元件
- SpringCloud 應用在 Kubernetes 上的最佳實踐 — 部署篇(工具部署)SpringGCCloud
- 在 Kyma 雲原生平臺上開發並部署 Node.js 應用Node.js
- Jenkins 在 Kubernetes 上的實踐Jenkins
- 在GCP的Kubernetes上安裝daprGC
- SpringCloud 應用在 Kubernetes 上的最佳實踐 — 部署篇(開發部署)SpringGCCloud
- 在 heroku 平臺部署 node.js 程式Node.js
- 部署一個支援Dapr 的Kubernetes APISIX IngressAPI
- oracle在linux系統上的部署OracleLinux
- kubernetes部署第一個應用案例
- RedisCluster架構優化Redis架構優化
- kubernetes ingress 在物理機上的nodePort和hostNetwork兩種部署方式解析及比較
- ZabbixAgent在Windows上安裝部署Windows
- 在Kubernetes上對Java的微調研究 - brunoborgesJava
- 幽默:K8S沒有那麼難,部署在Kubernetes上個人部落格K8S
- 使用Rancher在Kubernetes上部署EMQ X叢集MQ
- 在AWS上的架構部署與設計架構
- Typecho在Ubuntu 22.04上的安裝部署Ubuntu
- OpenFaaS的Kubernetes 部署指南
- 在Windows上安裝Node.js模組WindowsNode.js
- 在本地執行Kubernetes的3種主流方式
- 怎樣在 Kubernetes 上執行 PostgreSQLSQL
- 在kubernetes上執行WASM負載ASM負載
- 在 Kubernetes 叢集中部署現代應用的通用模式模式
- predis連線redissentinel和redisclusterRedis
- 在Ubuntu上安裝Node.js的Upstream版本UbuntuNode.js
- 在Ubuntu上使用Jetty部署War包UbuntuJetty
- 在Kubernetes上執行SAP UI5應用(上)UI
- 容器化 | 在 Kubernetes 上部署 RadonDB MySQL 叢集MySql
- 為什麼RedisCluster會設計成16384個槽呢?Redis