2) Redis Operator for Redis Cluster (by opstree) - jangjaelee/tutorials-redis-operator GitHub Wiki
2022.06. ์ด์ฅ์ฌ ๐ง [email protected] ๐ https://github.com/jangjaelee ๐ http://www.awx.kr
Opstree Solutions์์ ์ ์ํ Redis Operator๋ Kubernetes cluster์์ Redis Standalone/Cluster mode ์ค์ ์ ๋ง๋ค๊ณ ๊ฐ๋ ํ๋ Open Source๋ฅผ ์ง์ํ๋ Redis Community๋ฅผ ์ํ Golang-based Redis Operator ์ ๋๋ค.
Cloud ๋ฐ Bare-metal ํ๊ฒฝ์์ ๋ชจ๋ฒ ์ฌ๋ก๋ฅผ ์ฌ์ฉํ์ฌ Redis Cluster ์ค์ ์ ์์ฑํ ์ ์์ผ๋ฉฐ, redis-exporter๋ฅผ ์ฌ์ฉํ์ฌ ๋ด์ฅ๋ ๋ชจ๋ํฐ๋ง ๊ธฐ๋ฅ์ ์ ๊ณตํฉ๋๋ค.
์ง์ํ๋ Redis ์ค์ ์ ํ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
- Redis Standalone
- Redis Cluster (in-build leader follower with sharding and replication mode)
Redis Operator๊ฐ ์ง์ํ๋ ๊ธฐ๋ฅ์ผ๋ก ๋ค์๊ณผ ๊ฐ์ ๊ฒ๋ค์ด ์์ต๋๋ค.
- Redis Cluster (sharding ๋ฐ replication mode์ leader-follower) ๋ฐ Standalone ์ค์
- Redis Exporter๋ฅผ ์ฌ์ฉํ ๋ด์ฅ ๋ชจ๋ํฐ๋ง ์ง์์ผ๋ก ์์ธํ ํต์ฐฐ๋ ฅ ์ ๊ณต
- PVC Template์ ์ฌ์ฉํ ๋์ ์คํ ๋ฆฌ์ง ํ๋ก๋น์ ๋
- Redis ๊ตฌ์ฑ์ ์ฑ๋ฅ ์กฐ์ ๋ชจ๋ฒ ์ฌ๋ก
- Cluster ๋ฐ Standalone ์ค์ ์ ๋ํ ์ํธ ๋ฐ ์ํธ ์๋ ์ง์
- ๋ค์๊ณผ ๊ฐ์ ๋ช ๊ฐ์ง Kubernetes ๊ธฐ๋ฐ object ์ง์
- NodeSelector
- Affinity
- Resource and Limits
- Tolerations
- SecutiryContext
- Storage
- Kubernetes cluster v1.11+
- kubectl command-line tool
- helm command-line tool v3.0+
- Persistent Volume
- Prometheus Operator (option - to use ServiceMonitor)
- Grafana (option - to view metric on Grafana Dashboard)
- External Load Balancer (option - to use External Endpoint of Redis) - ํ์๋ MetalLB๋ฅผ ์ฌ์ฉํจ
โ Prometheus Operator ์ค์น์ ์๊ฐ๋ ์๋ ๋งํฌ๋ฅผ ์ฐธ์กฐํ์ธ์.
Prometheus Operator for Beginner
โ MetalLB ์ค์น์ ์๊ฐ๋ ์๋ ๋งํฌ๋ฅผ ์ฐธ์กฐํ์ธ์.
Redis Operator ์ค์น๋ YAML manifest์ Helm chart๋ฅผ ์ด์ฉํ ๋ ๊ฐ์ง ์ค์น ๋ฐฉ๋ฒ์ ์ ๊ณตํ๊ณ ์์ผ๋ฉฐ ํธํ ๋ฐฉ๋ฒ์ ์ฌ์ฉํ์ฌ Redis Operator๋ฅผ ์ค์นํ์ธ์.
Redis์ redis-exporter์ ๊ธฐ๋ณธ ๋ฒ์ ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
- Redis v6.2.5 (default)
- redis-exporter v1.0 (default)
์ ๊ณต๋๋ YAML manifest๋ฅผ ์ฌ์ฉํ์ฌ Redis Operator๋ฅผ ์ค์นํ๋ ๋ฐฉ๋ฒ ์ ๋๋ค.
manager.yaml์ namespace ์์ฑ์ ์ํ manifest ๋ด์ฉ์ด ํฌํจ๋์ด ์์ด redis-operator
namespace๊ฐ ํจ๊ป ์์ฑ ๋ฉ๋๋ค.
$ kubectl apply -f https://raw.githubusercontent.com/OT-CONTAINER-KIT/redis-operator/master/config/crd/bases/redis.redis.opstreelabs.in_redis.yaml
$ kubectl apply -f https://raw.githubusercontent.com/OT-CONTAINER-KIT/redis-operator/master/config/crd/bases/redis.redis.opstreelabs.in_redisclusters.yaml
$ kubectl apply -f https://raw.githubusercontent.com/OT-CONTAINER-KIT/redis-operator/master/config/rbac/serviceaccount.yaml
$ kubectl apply -f https://raw.githubusercontent.com/OT-CONTAINER-KIT/redis-operator/master/config/rbac/role.yaml
$ kubectl apply -f https://raw.githubusercontent.com/OT-CONTAINER-KIT/redis-operator/master/config/rbac/role_binding.yaml
$ kubectl apply -f https://raw.githubusercontent.com/OT-CONTAINER-KIT/redis-operator/master/config/manager/manager.yaml
Redis Operator๋ฅผ ์ข๋ ์ฝ๊ฒ ํ๊ธฐ ์ํด Helm chart๋ฅผ ์ ๊ณตํ๋ฉฐ values.yaml ํ์ผ์ ์ฌ์ฉํ์ฌ ์ฌ์ฉ์ ์ ์ํ ์ ์์ต๋๋ค.
๋๋ helm show ๋ช ๋ น์ ์ฌ์ฉํ์ฌ ๊ธฐ๋ณธ values๋ฅผ ํ์ผ๋ก ์์ฑํ์ฌ ์ฌ์ฉํ ์ ์์ต๋๋ค.
$ helm show values ot-helm/redis-operator > values.yaml
Redis Operator Helm chart ์ ์ฅ์๋ฅผ ๋ฑ๋กํ๊ณ ์ค์นํฉ๋๋ค.
$ helm repo add ot-helm https://ot-container-kit.github.io/helm-charts/
$ helm repo update
$ helm install redis-operator ot-helm/redis-operator -n redis-operator --create-namespace
์ด์ operator ์ค์น๋ฅผ ์๋ฃ ํ์์ผ๋ ์์ฑ๋ objects๊ณผ ๊ตฌ๋์ค์ธ pod๋ฅผ ํ์ธํฉ๋๋ค.
$ kubectl get all -n redis-operator
NAME READY STATUS RESTARTS AGE
pod/redis-operator-78c6c95b78-wzkrb 1/1 Running 1 50s
NAME READY UP-TO-DATE AVAILABLE AGE
deployment.apps/redis-operator 1/1 1 1 1m
NAME DESIRED CURRENT READY AGE
replicaset.apps/redis-operator-78c6c95b78 1 1 1 1m
์์ฑ๋ CRD๋ ํจ๊ป ํ์ธํ๋ฉด redis์ redisclusters CRD๋ค์ด ์์ฑ๋ ๊ฒ์ ์ ์ ์์ต๋๋ค.
redis
CRD๋ Redis Standalone ์ค์ ์ ํ์ ์ํจ์ด๋ฉฐ, redisclusters
CRD๋ Redis Cluster ์ค์ ์ ํ์ ์ํ ๊ฒ ์
๋๋ค.
$ kubectl api-resources | egrep '^NAME|redis'
NAME SHORTNAMES APIVERSION NAMESPACED KIND
redis redis.redis.opstreelabs.in/v1beta1 true Redis
redisclusters redis.redis.opstreelabs.in/v1beta1 true RedisCluster
kubectl plugin manager์ธ Krew์ get-all
plugins์ ์ค์นํ๋ฉด ์ข๋ ์ฝ๊ฒ ์์ฑ๋ objects๋ฅผ ๋ณผ ์ ์์ต๋๋ค.
๐ https://github.com/corneliusweig/ketall
$ kubectl get-all -n redis-operator
NAME NAMESPACE AGE
configmap/6cab913b.redis.opstreelabs.in redis-operator 9s
configmap/kube-root-ca.crt redis-operator 18s
pod/redis-operator-78c6c95b78-wzkrb redis-operator 18s
secret/default-token-gjvhs redis-operator 18s
secret/redis-operator-token-6n5hd redis-operator 18s
secret/sh.helm.release.v1.redis-operator.v1 redis-operator 18s
serviceaccount/default redis-operator 18s
serviceaccount/redis-operator redis-operator 18s
deployment.apps/redis-operator redis-operator 18s
replicaset.apps/redis-operator-78c6c95b78 redis-operator 18s
lease.coordination.k8s.io/6cab913b.redis.opstreelabs.in redis-operator 9s
์ด๋ฒ ๋จ๊ณ์์๋ Redis๋ฅผ ๋ฐฐํฌํ๊ณ CR์ ๊ตฌ์ฑ์ ํ๋ฒ ์ดํด ๋ณด๊ฒ ์ต๋๋ค.
์ค์น์ ์์ Redis ๋ด์์ password ๊ธฐ๋ฐ ์ธ์ฆ์ ์ฌ์ฉํ๋ ค๋ ๊ฒฝ์ฐ secret
์ ์ฌ์ฉํ์ฌ ์ฌ์ฉํ ์ ์์ผ๋ฉฐ, secret
์ ๊ธฐ๋ณธ ์ด๋ฆ์ redis-secret
์ด๋ฉฐ, key ์ด๋ฆ์ password
์
๋๋ค. ๊ทธ๋ฆฌ๊ณ helm chart๋ฅผ ์ฌ์ฉํ๋ค๋ฉด override๋ ๊ฐ๋ฅํฉ๋๋ค.
redis auth๋ฅผ ์ํ secret
object๋ฅผ ์์ฑ ํฉ๋๋ค.
$ kubectl create secret generic redis-secret --from-literal=password=redispassword -n redis-system
secret/redis-secret created
$ kubectl describe secret/redis-secret -n redis-system
Name: redis-secret
Namespace: redis-system
Labels: <none>
Annotations: <none>
Type: Opaque
Data
====
password: 13 bytes
Redis Standalone mode์์๋ Redis๋ฅผ ๋จ์ผ Pod๋ก ๋ฐฐํฌํ๋ฏ๋ก StatefulSets์ replicas: 1 ์ ๋๋ค. ๊ทธ๋ฆฌ๊ณ ์ค์ ์ด ๊ฐํธํ๊ณ ๋ณต์ก์ฑ์ด ์์ง๋ง, ๊ณ ๊ฐ์ฉ์ฑ(HA) ๋ฐ ๋ณต์๋ ฅ(resilience)์ ์ ๊ณต๋์ง ์์ต๋๋ค.
๋ค์ ๋ช ๋ น์ ์ฌ์ฉํ์ฌ Redis๋ฅผ Standalone mode๋ก ๋ฐฐํฌ ํฉ๋๋ค.
Prometheus Operator์ ServiceMonitor
CR์ ์์ฑํ๊ธฐ ์ํด --set serviceMonitor.enabled=true
value๋ฅผ ์ฌ์ฉํ์์ผ๋ฉฐ Prometheus Operator๋ฅผ ์ฌ์ฉํ์ง ์๋๋ค๋ฉด ํด๋น value๋ ์๋ต ๊ฐ๋ฅํฉ๋๋ค.
๐ Redis Standalone์ Helm chart ๋ด์ฉ์ [๋งํฌ]์์ ํ์ธ ๊ฐ๋ฅํฉ๋๋ค.
$ helm install redis-standalone ot-helm/redis \
-n redis-system --create-system \
--set redisCluster.redisSecret.secretName="redis-secret" \
--set redisCluster.redisSecret.secretKey="password" \
--set serviceMonitor.enabled=true \
--set serviceMonitor.namespace="redis-system"
๋ฐฐํฌ๋ objects๋ฅผ ํ์ธํด๋ณด๊ฒ ์ต๋๋ค.
$ kubectl get-all -n redis-system
NAME NAMESPACE AGE
configmap/kube-root-ca.crt redis-system 1m
endpoints/redis-standalone redis-system 1m
endpoints/redis-standalone-headless redis-system 1m
persistentvolumeclaim/redis-standalone-redis-standalone-0 redis-system 1m
pod/redis-standalone-0 redis-system 1m
secret/default-token-kbmwd redis-system 1m
secret/redis-secret redis-system 1m
secret/sh.helm.release.v1.redis-standalone.v1 redis-system 1m
secret/sh.helm.release.v1.redis-standalone.v2 redis-system 1m
serviceaccount/default redis-system 1m
service/redis-standalone redis-system 1m
service/redis-standalone-headless redis-system 1m
controllerrevision.apps/redis-standalone-7fbb5dd9fc redis-system 1m
statefulset.apps/redis-standalone redis-system 1m
endpointslice.discovery.k8s.io/redis-standalone-hccd9 redis-system 1m
endpointslice.discovery.k8s.io/redis-standalone-headless-rvxhs redis-system 1m
servicemonitor.monitoring.coreos.com/redis-standalone-prometheus-monitoring redis-system 1m
redis.redis.redis.opstreelabs.in/redis-standalone redis-system 1m
Redis Operator Controller๋ redis
CR์ ์์ฑ์ ๊ฐ์งํ์ฌ StatefulSet
object๋ฅผ ์๋์ผ๋ก ์์ฑํ๊ฒ ๋ฉ๋๋ค.
Redis Standalone์ ๊ตฌ์ฑํ๋ redis CR์ configuration์ ๋ค์์ ๋งํฌ์์ Helm Parameters๋ฅผ ์ฌ์ฉํ์ฌ ์ค์ ์ด ๊ฐ๋ฅํฉ๋๋ค.
๐ https://ot-container-kit.github.io/redis-operator/guide/redis-config.html
Redis Cluster๋ ๋ฐ์ดํฐ ์ค๋ฉ ์ ๋ต์ผ๋ก ์ฌ๋ฌ Redis node์ ๋ฐ์ดํฐ๋ฅผ ์๋์ผ๋ก ๋ถํ ํด์ค๋๋ค. ๋ถ์ฐ ์คํ ๋ฆฌ์ง๋ฅผ ๊ตฌํํ๊ณ ๋จ์ผ ์ฅ์ ์ง์ (SPOF) ๋ฐฉ์งํ๋ Redis์ ๊ณ ๊ธ ๊ธฐ๋ฅ ์ ๋๋ค.
๋ค์ ๋ช ๋ น์ ์ฌ์ฉํ์ฌ Redis๋ฅผ Cluster mode๋ก ๋ฐฐํฌ ํฉ๋๋ค.
Prometheus Operator์ ServiceMonitor
CR์ ์์ฑํ๊ธฐ ์ํด --set serviceMonitor.enabled=true
value๋ฅผ ์ฌ์ฉํ์์ผ๋ฉฐ Prometheus Operator๋ฅผ ์ฌ์ฉํ์ง ์๋๋ค๋ฉด ํด๋น value๋ ์๋ต ๊ฐ๋ฅํฉ๋๋ค.
๐ Redis Cluster์ Helm chart ๋ด์ฉ์ [๋งํฌ]์์ ํ์ธ ๊ฐ๋ฅํฉ๋๋ค.
$ helm install redis-cluster ot-helm/redis-cluster \
-n redis-system --create-system \
--set redisCluster.clusterSize=3 \
--set redisCluster.leader.replicas=3 \
--set redisCluster.follower.replicas=3 \
--set redisCluster.redisSecret.secretName="redis-secret" \
--set redisCluster.redisSecret.secretKey="password" \
--set serviceMonitor.enabled=true \
--set serviceMonitor.namespace="redis-system"
์ด์ ๋ฐฐํฌ๋ objects๋ฅผ ํ์ธํด๋ณด๊ฒ ์ต๋๋ค.
$ kubectl get all -n redis-system
NAME READY STATUS RESTARTS AGE
pod/redis-cluster-follower-0 2/2 Running 0 4m4s
pod/redis-cluster-follower-1 2/2 Running 0 3m46s
pod/redis-cluster-follower-2 2/2 Running 0 3m13s
pod/redis-cluster-leader-0 2/2 Running 0 3m10s
pod/redis-cluster-leader-1 2/2 Running 0 2m46s
pod/redis-cluster-leader-2 2/2 Running 0 2m11s
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
service/redis-cluster-follower ClusterIP 10.103.232.239 <none> 6379/TCP,9121/TCP 4m4s
service/redis-cluster-follower-headless ClusterIP None <none> 6379/TCP 4m4s
service/redis-cluster-leader ClusterIP 10.101.133.245 <none> 6379/TCP,9121/TCP 3m10s
service/redis-cluster-leader-headless ClusterIP None <none> 6379/TCP 3m10s
NAME READY AGE
statefulset.apps/redis-cluster-follower 3/3 4m
statefulset.apps/redis-cluster-leader 3/3 4m
$ kubectl get rediscluster -n redis-system
NAME CLUSTERSIZE LEADERREPLICAS FOLLOWERREPLICAS AGE
redis-cluster 3 3 3 1m
$ kubectl get-all -n redis-system
NAME NAMESPACE AGE
configmap/kube-root-ca.crt redis-system 14h
endpoints/redis-cluster-follower redis-system 88m
endpoints/redis-cluster-follower-headless redis-system 88m
endpoints/redis-cluster-leader redis-system 88m
endpoints/redis-cluster-leader-headless redis-system 88m
persistentvolumeclaim/redis-cluster-follower-redis-cluster-follower-0 redis-system 88m
persistentvolumeclaim/redis-cluster-follower-redis-cluster-follower-1 redis-system 88m
persistentvolumeclaim/redis-cluster-follower-redis-cluster-follower-2 redis-system 88m
persistentvolumeclaim/redis-cluster-leader-redis-cluster-leader-0 redis-system 88m
persistentvolumeclaim/redis-cluster-leader-redis-cluster-leader-1 redis-system 88m
persistentvolumeclaim/redis-cluster-leader-redis-cluster-leader-2 redis-system 88m
pod/redis-cluster-follower-0 redis-system 88m
pod/redis-cluster-follower-1 redis-system 88m
pod/redis-cluster-follower-2 redis-system 87m
pod/redis-cluster-leader-0 redis-system 88m
pod/redis-cluster-leader-1 redis-system 87m
pod/redis-cluster-leader-2 redis-system 87m
secret/default-token-kbmwd redis-system 14h
secret/redis-secret redis-system 14h
secret/sh.helm.release.v1.redis-cluster.v1 redis-system 91m
serviceaccount/default redis-system 14h
service/redis-cluster-follower redis-system 88m
service/redis-cluster-follower-headless redis-system 88m
service/redis-cluster-leader redis-system 88m
service/redis-cluster-leader-headless redis-system 88m
controllerrevision.apps/redis-cluster-follower-5444b5bdcf redis-system 88m
controllerrevision.apps/redis-cluster-leader-5699997689 redis-system 88m
statefulset.apps/redis-cluster-follower redis-system 88m
statefulset.apps/redis-cluster-leader redis-system 88m
endpointslice.discovery.k8s.io/redis-cluster-follower-b4vsl redis-system 88m
endpointslice.discovery.k8s.io/redis-cluster-follower-headless-l46zg redis-system 88m
endpointslice.discovery.k8s.io/redis-cluster-leader-headless-dtskw redis-system 88m
endpointslice.discovery.k8s.io/redis-cluster-leader-xb2cd redis-system 88m
servicemonitor.monitoring.coreos.com/redis-cluster-follower-prometheus-monitoring redis-system 88m
servicemonitor.monitoring.coreos.com/redis-cluster-leader-prometheus-monitoring redis-system 88m
rediscluster.redis.redis.opstreelabs.in/redis-cluster redis-system 88m
Redis Standalone์๋ ๋ค๋ฅด๊ฒ Redis Cluster mode์์๋ rediscluster
CR์ด ์์ฑ๋๋ฉด Leader์ Follow๋ฅผ ์ํ StatefulSet์ด ๊ฐ๊ฐ ๋ฐฐํฌ ๋๊ฒ์ ์ ์ ์์ผ๋ฉฐ, ๊ทธ์ ๋ฐ๋ผ Service์ Prometheus Operator์ ServiceMonitor๋ ํจ๊ป ์์ฑ ๋์์ต๋๋ค.
Redis leader pod์ ์ฐ๊ฒฐํ์ฌ redis cluster ์ ๋ณด์ node ์ฐ๊ฒฐ ์ํ๋ฅผ ํ์ธํฉ๋๋ค.
$ kubectl exec -it redis-cluster-leader-0 -n redis-system -- redis-cli -a redispassword cluster info
Defaulted container "redis-cluster-leader" out of: redis-cluster-leader, redis-exporter
Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe.
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:376
cluster_stats_messages_pong_sent:375
cluster_stats_messages_sent:751
cluster_stats_messages_ping_received:372
cluster_stats_messages_pong_received:376
cluster_stats_messages_meet_received:3
cluster_stats_messages_received:751
$ kubectl exec -it redis-cluster-leader-0 -n redis-system -- redis-cli -a redispassword cluster nodes
Defaulted container "redis-cluster-leader" out of: redis-cluster-leader, redis-exporter
Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe.
5483f9be46324b9e8f48b431fc4128c788525cdc 172.16.10.103:6379@16379 master - 0 1655908354065 2 connected 5461-10922
4d0bd6e99c00cddd6f9858da371526f39fef157a 172.16.10.75:6379@16379 slave 5483f9be46324b9e8f48b431fc4128c788525cdc 0 1655908352043 2 connected
87fe6e67e43ddb9f9ad6acd830d360b83250c630 172.16.84.121:6379@16379 slave 7ded434ed7be8db05a7851dc44e082e38bbf398b 0 1655908353559 1 connected
a956b4aaf4a04957bc6b0a42bdb62122c91fb44e 172.16.84.115:6379@16379 slave 742149aba5d2e572b6f85ea59a964880fa79b367 0 1655908352545 3 connected
7ded434ed7be8db05a7851dc44e082e38bbf398b 172.16.84.122:6379@16379 myself,master - 0 1655908351000 1 connected 0-5460
742149aba5d2e572b6f85ea59a964880fa79b367 172.16.78.67:6379@16379 master - 0 1655908352547 3 connected 10923-16383
redis cluster nodes ์ํ์์ IP ์ ๋ณด์ Redis instance์ pod IP๋ฅผ ๋์กฐํ๋ฉด ์ด๋ค leader์ follower๊ฐ ๊ฐ๊ฐ ์ด๋ค pod๋ผ๋ฆฌ master-replica๋ก ์ฐ๊ฒฐ๋์ด ์๋์ง ์ ์ ์์ต๋๋ค.
$ kubectl get pod -n redis-system -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
redis-cluster-follower-0 2/2 Running 0 6m1s 172.16.84.121 k8s-w3-dragon <none> <none>
redis-cluster-follower-1 2/2 Running 0 7m38s 172.16.10.75 k8s-w2-dragon <none> <none>
redis-cluster-follower-2 2/2 Running 0 7m5s 172.16.84.115 k8s-w3-dragon <none> <none>
redis-cluster-leader-0 2/2 Running 0 6m16s 172.16.84.122 k8s-w3-dragon <none> <none>
redis-cluster-leader-1 2/2 Running 0 7m53s 172.16.10.103 k8s-w2-dragon <none> <none>
redis-cluster-leader-2 2/2 Running 0 7m20s 172.16.78.67 k8s-w1-dragon <none> <none>
๊ทธ๋ฆฌ๊ณ pod์ log๋ฅผ ์ฐ์ด๋ณด๋ฉด master-replica์ replication ์ํ๋ฅผ ํ์ธํ ์ ์์ต๋๋ค.
# Redis leader-0 node (master-0)
$ kubectl logs -f pod/redis-cluster-leader-0 -n redis-system -c redis-cluster-leader
Starting redis service in cluster mode.....
11:C 22 Jun 2022 14:27:20.230 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
11:C 22 Jun 2022 14:27:20.230 # Redis version=6.2.5, bits=64, commit=00000000, modified=0, pid=11, just started
11:C 22 Jun 2022 14:27:20.230 # Configuration loaded
11:M 22 Jun 2022 14:27:20.230 * monotonic clock: POSIX clock_gettime
11:M 22 Jun 2022 14:27:20.231 * Node configuration loaded, I'm 7ded434ed7be8db05a7851dc44e082e38bbf398b
11:M 22 Jun 2022 14:27:20.231 * Running mode=cluster, port=6379.
11:M 22 Jun 2022 14:27:20.231 # Server initialized
11:M 22 Jun 2022 14:27:20.231 * Ready to accept connections
11:M 22 Jun 2022 14:28:40.238 # configEpoch set to 1 via CLUSTER SET-CONFIG-EPOCH
11:M 22 Jun 2022 14:28:45.207 # Cluster state changed: ok
11:M 22 Jun 2022 14:28:57.589 * Replica 172.16.84.121:6379 asks for synchronization
11:M 22 Jun 2022 14:28:57.589 * Partial resynchronization not accepted: Replication ID mismatch (Replica asked for '8e3ffd79b9f7370b05effda9a837c2956e5fabed', my replication IDs are 'd8bea88fcebd4c90442116e74a15a7fd2a3935d4' and '0000000000000000000000000000000000000000')
11:M 22 Jun 2022 14:28:57.589 * Replication backlog created, my new replication IDs are '8e2dab8037c5e9c194cf0c659c9c28f77c08614e' and '0000000000000000000000000000000000000000'
11:M 22 Jun 2022 14:28:57.589 * Starting BGSAVE for SYNC with target: disk
11:M 22 Jun 2022 14:28:57.589 * Background saving started by pid 109
109:C 22 Jun 2022 14:28:57.591 * DB saved on disk
109:C 22 Jun 2022 14:28:57.591 * RDB: 0 MB of memory used by copy-on-write
11:M 22 Jun 2022 14:28:57.619 * Background saving terminated with success
11:M 22 Jun 2022 14:28:57.619 * Synchronization with replica 172.16.84.121:6379 succeeded
# Redis follower-0 node (replica-0)
$ kubectl logs -f pod/redis-cluster-follower-0 -n redis-system -c redis-cluster-follower
Starting redis service in cluster mode.....
13:C 22 Jun 2022 14:27:35.559 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
13:C 22 Jun 2022 14:27:35.559 # Redis version=6.2.5, bits=64, commit=00000000, modified=0, pid=13, just started
13:C 22 Jun 2022 14:27:35.559 # Configuration loaded
13:M 22 Jun 2022 14:27:35.560 * monotonic clock: POSIX clock_gettime
13:M 22 Jun 2022 14:27:35.560 * Node configuration loaded, I'm 87fe6e67e43ddb9f9ad6acd830d360b83250c630
13:M 22 Jun 2022 14:27:35.561 * Running mode=cluster, port=6379.
13:M 22 Jun 2022 14:27:35.561 # Server initialized
13:M 22 Jun 2022 14:27:35.561 * Ready to accept connections
13:S 22 Jun 2022 14:28:57.588 * Before turning into a replica, using my own master parameters to synthesize a cached master: I may be able to synchronize with the new master with just a partial transfer.
13:S 22 Jun 2022 14:28:57.588 * Connecting to MASTER 172.16.84.122:6379
13:S 22 Jun 2022 14:28:57.588 * MASTER <-> REPLICA sync started
13:S 22 Jun 2022 14:28:57.588 # Cluster state changed: ok
13:S 22 Jun 2022 14:28:57.588 * Non blocking connect for SYNC fired the event.
13:S 22 Jun 2022 14:28:57.589 * Master replied to PING, replication can continue...
13:S 22 Jun 2022 14:28:57.589 * Trying a partial resynchronization (request 8e3ffd79b9f7370b05effda9a837c2956e5fabed:1).
13:S 22 Jun 2022 14:28:57.590 * Full resync from master: 8e2dab8037c5e9c194cf0c659c9c28f77c08614e:0
13:S 22 Jun 2022 14:28:57.590 * Discarding previously cached master state.
13:S 22 Jun 2022 14:28:57.619 * MASTER <-> REPLICA sync: receiving 175 bytes from master to disk
13:S 22 Jun 2022 14:28:57.619 * MASTER <-> REPLICA sync: Flushing old data
13:S 22 Jun 2022 14:28:57.619 * MASTER <-> REPLICA sync: Loading DB in memory
13:S 22 Jun 2022 14:28:57.620 * Loading RDB produced by version 6.2.5
13:S 22 Jun 2022 14:28:57.620 * RDB age 0 seconds
13:S 22 Jun 2022 14:28:57.620 * RDB memory usage when created 2.60 Mb
13:S 22 Jun 2022 14:28:57.620 * MASTER <-> REPLICA sync: Finished with success
13:S 22 Jun 2022 14:28:57.621 * Background append only file rewriting started by pid 83
13:S 22 Jun 2022 14:28:57.650 * AOF rewrite child asks to stop sending diffs.
83:C 22 Jun 2022 14:28:57.650 * Parent agreed to stop sending diffs. Finalizing AOF...
83:C 22 Jun 2022 14:28:57.650 * Concatenating 0.00 MB of AOF diff received from parent.
83:C 22 Jun 2022 14:28:57.651 * SYNC append only file rewrite performed
83:C 22 Jun 2022 14:28:57.651 * AOF rewrite: 0 MB of memory used by copy-on-write
13:S 22 Jun 2022 14:28:57.725 * Background AOF rewrite terminated with success
13:S 22 Jun 2022 14:28:57.725 * Residual parent diff successfully flushed to the rewritten AOF (0.00 MB)
13:S 22 Jun 2022 14:28:57.725 * Background AOF rewrite finished successfully
Redis Cluster์ ๊ตฌ์ฑํ๋ rediscluster CR์ configuration์ ๋ค์์ ๋งํฌ์์ Helm Parameters๋ฅผ ์ฌ์ฉํ์ฌ ์ค์ ์ด ๊ฐ๋ฅํฉ๋๋ค.
๐ https://ot-container-kit.github.io/redis-operator/guide/redis-cluster-config.html
Redis Operator๋ ๊ธฐ๋ณธ์ ์ผ๋ก Redis Standalone์ Cluster ๋ชจ๋ Service Endpoint๋ Kubernetes cluster๋ด๋ก ์ ํ๋ฉ๋๋ค. ๊ทธ๋ฌ๋ Service
object์ Type์ NodePort
๋๋ LoadBalancer
์ ํ์ผ๋ก ์๋น์ค๋ฅผ ์ธ๋ถ๋
ธ์ถ ์ํฌ ์ ์์ต๋๋ค.
Redis Standalone์ Cluster๋ Helm chart์ external Service๋ฅผ ์ํ ๊ตฌ์ฑ ์ค์ ์ helm value๋ฅผ ํตํด ์ ๊ณตํ๊ณ ์์ด Redis๋ฅผ Kubernetes cluster ์ธ๋ถ๋ก ๋ ธ์ถ์ํฌ ์ ์์ต๋๋ค.
externalService:
enabled: true
annotations:
metallb.universe.tf/address-pool: "default"
serviceType: LoadBalancer
port: 6379
๋๋, helm ๋ช ๋ น์ด์ set value๋ฅผ ์ฌ์ฉํ์ฌ CLI์์๋ ๊ตฌ์ฑ์ด ๊ฐ๋ฅํฉ๋๋ค.
Redis Cluster์ Redis๋ฅผ ์ธ๋ถ๋ ธ์ถ ์์ผ ๋ณด๊ฒ ์ต๋๋ค.
$ helm upgrade redis-cluster ot-helm/redis-cluster \
-n redis-system --install \
--set redisCluster.clusterSize=3 \
--set redisCluster.leader.replicas=3 \
--set redisCluster.follower.replicas=3 \
--set redisCluster.redisSecret.secretName="redis-secret" \
--set redisCluster.redisSecret.secretKey="password" \
--set serviceMonitor.enabled=true \
--set serviceMonitor.namespace="redis-system" \
--set externalService.enabled=true \
--set externalService.annotation."metallb\.universe\.tf/address-pool"="default"
externalService.annotation
์๋ external LoadBalancer๋ฅผ ๋ช
์ํ๋ ๋ถ๋ถ์ผ๋ก ์ฌ์ฉํ๋ LoadBalancer๋ฅผ ํ์ธํ ์ ์ ํ๊ฒ ๊ธฐ์ฌํ์ฌ ์ฌ์ฉํ์๊ธฐ ๋ฐ๋๋๋ค. ํ์๋ MetalLB๋ฅผ ์ฌ์ฉ ํ๊ณ ์์ต๋๋ค.
service
object ์ด๋ฆ์ StatefulSets ์ด๋ฆ์ prefix๋ก ์ฌ์ฉํ์ฌ <statefulset name>-external-service
์ ๊ฐ์ด ์์ฑ ๋ฉ๋๋ค.
$ kubectl get svc -n redis-system | egrep '^NAME|external-service'
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
redis-cluster-follower-external-service LoadBalancer 10.105.17.6 192.168.1.184 6379:32311/TCP 19m
redis-cluster-leader-external-service LoadBalancer 10.96.173.154 192.168.1.185 6379:32114/TCP 19m
external Service๋ฅผ ์์ฑํ๊ณ redis-cli๋ก ์๋ฒ์ ์ ์ํ๋ฉด ์ ์์ด ์๋ฉ๋๋ค.
$ redis-cli -h 192.168.1.184 -a redispassword cluster nodes
Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe.
Could not connect to Redis at 192.168.1.184:6379: No route to host
$ redis-cli -h 192.168.1.185 -a redispassword cluster nodes
Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe.
Could not connect to Redis at 192.168.1.185:6379: No route to host
์ด์ ๋ฅผ ์ฐพ์๋ณด๋ service
object์ ๋ช
์๋ Label selector์์ ๋ฌธ์ ๋ฅผ ๋ฐ๊ฒฌ ํ์ต๋๋ค.
ํ์ธ์ ํด๋ณด๋ฉด redis-cluster-leader-external-service
์ redis-cluster-follow-external-service
์ Label selector์ redis_setup_type
์ ๊ฐ์ด ๊ฐ๊ฐ leader
์ follower
๋ก ๋์ด ์์ต๋๋ค.
$ kubectl get svc/redis-cluster-leader-external-service -n redis-system -o=jsonpath='{.spec.selector}' | jq
{
"app": "redis-cluster-leader",
"redis_setup_type": "leader",
"role": "leader"
}
$ kubectl get svc/redis-cluster-follower-external-service -n redis-system -o=jsonpath='{.spec.selector}' | jq
{
"app": "redis-cluster-follower",
"redis_setup_type": "follower",
"role": "follower"
}
์ด๋ Redis Cluster์ Helm template์์ ์ค๋ฅ์ ์์ธ์ ์ฐพ์ ์ ์์์ต๋๋ค. leader์ follow์ external-service๋ฅผ ์์ฑํ๋ template๋ฅผ ๋ณด๋ฉด ์ด๋ฏธ ์์์ ํ์ธ ํ๋ฐ์ ๊ฐ์ด redis_setup_type์ ๊ฐ์ด leader
์ follower
๋ก ์ ์ ๋์ด ์์ต๋๋ค.
-
Helm template - leader-service.yaml
-
Helm template - follower-service.yaml
๊ทธ๋ ์ง๋ง Redis Operator Controller๊ฐ rediscluster CR์ ์์ฑ์ ๊ฐ์งํ๊ณ StatefulSet์ ์์ฑ ํ ๋ Label์ด ์๋์ผ๋ก ์ฝ์ ๋๋๋ฐ Redis Cluster ๋ถ๋ถ์ controller ์์ค์ฝ๋๋ฅผ ๋ณด๋ฉด redis_setup_type์ label ๊ฐ์ด cluster๋ก prefix ๋์ด ์์์ต๋๋ค.
๊ฒฐ๊ตญ Helm chart์ redis_setup_type์ label์ ์ค๋ฅ๊ฐ ์๋ค๋ ๊ฒ์ ํ์ธํ๊ณ service
object์ Label selector๋ฅผ ๋ณ๊ฒฝํ๋ ๊ฒ์ผ๋ก ํด๊ฒฐ์ ํ ์ ์์์ต๋๋ค.
$ kubectl patch svc/redis-cluster-leader-external-service -n redis-system -p '{"spec":{"selector":{"redis_setup_type":"cluster"}}}'
service/redis-cluster-leader-external-service patched
$ kubectl patch svc/redis-cluster-follower-external-service -n redis-system -p '{"spec":{"selector":{"redis_setup_type":"cluster"}}}'
service/redis-cluster-follower-external-service patched
$ redis-cli -h 192.168.1.184 -a redispassword cluster nodes
Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe.
ba736d6a0fe48cf54290fd78ac3670079df7fe95 172.16.84.92:6379@16379 slave cb557203cc8779da78234cda345863db6ddca3ba 0 1655878128074 1 connected
7d5511d537ec147a6cb15cdd0c14a8d9d5d73044 172.16.10.88:6379@16379 master - 0 1655878130103 2 connected 5461-10922
162ed69a7cf46f58ff0d6c0dc5e80173a0999c36 172.16.78.111:6379@16379 myself,slave ae65d3acf8c9003ce07496b6d7d5ef4ef9e9f3a9 0 1655878129000 3 connected
39d7391b7ba0085513a5b7ed1d00f66f2cdbd425 172.16.10.93:6379@16379 slave 7d5511d537ec147a6cb15cdd0c14a8d9d5d73044 0 1655878129000 2 connected
cb557203cc8779da78234cda345863db6ddca3ba 172.16.84.81:6379@16379 master - 0 1655878129085 1 connected 0-5460
ae65d3acf8c9003ce07496b6d7d5ef4ef9e9f3a9 172.16.78.84:6379@16379 master - 0 1655878129084 3 connected 10923-16383
$ redis-cli -h 192.168.1.185 -a redispassword cluster nodes
Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe.
7d5511d537ec147a6cb15cdd0c14a8d9d5d73044 172.16.10.88:6379@16379 master - 0 1655878134035 2 connected 5461-10922
cb557203cc8779da78234cda345863db6ddca3ba 172.16.84.81:6379@16379 myself,master - 0 1655878134000 1 connected 0-5460
ae65d3acf8c9003ce07496b6d7d5ef4ef9e9f3a9 172.16.78.84:6379@16379 master - 0 1655878135048 3 connected 10923-16383
162ed69a7cf46f58ff0d6c0dc5e80173a0999c36 172.16.78.111:6379@16379 slave ae65d3acf8c9003ce07496b6d7d5ef4ef9e9f3a9 0 1655878134542 3 connected
39d7391b7ba0085513a5b7ed1d00f66f2cdbd425 172.16.10.93:6379@16379 slave 7d5511d537ec147a6cb15cdd0c14a8d9d5d73044 0 1655878134000 2 connected
ba736d6a0fe48cf54290fd78ac3670079df7fe95 172.16.84.92:6379@16379 slave cb557203cc8779da78234cda345863db6ddca3ba 0 1655878135556 1 connected
โ Redis Standalone mode๋ ๋ฌธ์ ์์ด ์ ์๋์ ํ๋ ๊ฒ์ ํ์ธํ์ต๋๋ค.
Redis Operator๋ redis-exporter๋ฅผ ์ฌ์ฉํ์ฌ Prometheus ํ์์ผ๋ก redis ์ค์ ์ metric์ ๋ ธ์ถ์ํฌ ์ ์์ผ๋ฉฐ, Redis Standalone/Cluster ๋ชจ๋ ์ง์ํฉ๋๋ค.
Helm chart๋ฅผ ํตํด redis-exporter๋ฅผ ํ์ฑํํ์ฌ ๋ฐฐํฌํ ์ ์์ผ๋ฉฐ ์ฌ์ฉ์ ์ง์ values.yaml ํ์ผ์ ์์ฑํ์ฌ ์์ธํ ์ค์ ์ override๋ก ๊ตฌ์ฑํ ์ ์์ต๋๋ค. (redisExporter ํ์ฑํ ๊ธฐ๋ณธ๊ฐ์ true ์ ๋๋ค.)
redisExporter:
enabled: true
image: quay.io/opstree/redis-exporter:1.0
imagePullPolicy: Always
resources:
requests:
cpu: 100m
memory: 128Mi
limits:
cpu: 100m
memory: 128Mi
env:
- name: REDIS_EXPORTER_INCL_SYSTEM_METRICS
value: "true"
- name: REDIS_EXPORTER_PING_ON_CONNECT
value: "true"
- name: REDIS_EXPORTER_INCL_CONFIG_METRICS
value: "true"
- name: REDIS_EXPORTER_EXPORT_CLIENT_LIST
value: "true"
redis-export๋ฅผ ํ์ฑํํ๊ณ leader์ follower์ Redis instance pod๋ฅผ describeํด๋ณด๋ฉด redis-exporter๊ฐ sidecar container๋ก ๋์ํ๋ ๊ฒ์ด ๋ณด์ ๋๋ค.
$ kubectl describe pod/redis-cluster-leader-0 -n redis-system
Name: redis-cluster-leader-0
Namespace: redis-system
Priority: 0
Node: k8s-w3-dragon/192.168.1.113
Start Time: Wed, 22 Jun 2022 17:31:09 +0900
.
.
Containers:
redis-exporter:
Container ID: containerd://7acdf990af25a47975938d3a528c0c80c08502558f55c3b9e8a25df9922b10a0
Image: quay.io/opstree/redis-exporter:1.0
Image ID: quay.io/opstree/redis-exporter@sha256:d52aebf0ff162b5b953dfe7dfcb8a319748654fd7325007d93d2884e027edd2d
Port: <none>
Host Port: <none>
State: Running
Started: Wed, 22 Jun 2022 17:31:11 +0900
Ready: True
Restart Count: 0
Limits:
cpu: 100m
memory: 128Mi
Requests:
cpu: 100m
memory: 128Mi
Environment:
PERSISTENCE_ENABLED: true
REDIS_ADDR: redis://localhost:6379
REDIS_EXPORTER_EXPORT_CLIENT_LIST: true
REDIS_EXPORTER_INCL_CONFIG_METRICS: true
REDIS_EXPORTER_INCL_SYSTEM_METRICS: true
REDIS_EXPORTER_INCL_SYSTEM_METRICS: true
REDIS_EXPORTER_PING_ON_CONNECT: true
REDIS_PASSWORD: <set to the key 'password' in secret 'redis-secret'> Optional: false
SERVER_MODE: cluster
SETUP_MODE: cluster
Mounts:
/var/run/secrets/kubernetes.io/serviceaccount from kube-api-access-kdwfs (ro)
.
.
.
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Normal Scheduled 45m default-scheduler Successfully assigned redis-system/redis-cluster-leader-0 to k8s-w3-dragon
Normal Pulled 45m kubelet Container image "quay.io/opstree/redis:v6.2.5" already present on machine
Normal Created 45m kubelet Created container redis-cluster-leader
Normal Started 45m kubelet Started container redis-cluster-leader
Normal Pulling 45m kubelet Pulling image "quay.io/opstree/redis-exporter:1.0"
Normal Pulled 44m kubelet Successfully pulled image "quay.io/opstree/redis-exporter:1.0" in 841.273976ms
Normal Created 44m kubelet Created container redis-exporter
Normal Started 44m kubelet Started container redis-exporter
redis-exporter ๋ฐฐํฌ ๋ฐ ๊ตฌ์ฑ์ด ์๋ฃ ๋๋ฉด endpoint๋ฅผ ๋ชจ๋ํฐ๋งํ๊ธฐ ์ํด Prometheus Target Configuration ์ ๋ฐ์ดํธ ํด์ผ ํฉ๋๋ค.
service endpoint๋ฅผ ์๋์ผ๋ก Prometheus ๋์ ๊ตฌ์ฑํ๋ ๊ฒ์ ๋ณดํต ์ด๋ ค์ด๊ฒ ์๋๋๋ค. ๊ทธ๋์ Prometheus Operator์ ServiceMonitor
CR๋ฅผ ์ฌ์ฉํ์ฌ endpoint๋ค์ ๋ํ ๋์ ๊ตฌ์ฑ์ ์๋์ผ๋ก ์ค์ ํ ์ ์์ผ๋ฉฐ, Redis Standalone/Cluster์ Helm chart์์ ServiceMonitor๋ฅผ ์ง์ํ๊ณ ์์ด ์ฌ์ฉ์ ์ง์ value.yaml ํ์ผ์ ์์ฑํ์ฌ override ๋ฐฉ์์ผ๋ก ๊ตฌ์ฑํ ์ ์์ต๋๋ค.
serviceMonitor:
enabled: false
interval: 30s
scrapeTimeout: 10s
namespace: redis-system # redis instance์ service object๊ฐ ๋ฐฐํฌ๋ namespace
๋๋, ServiceMonitor CR์ yaml ํ์ผ๋ก ์ ์ํ์ฌ ์ ์ฉํ ์ ์์ต๋๋ค.
-
Redis Standalone
apiVersion: monitoring.coreos.com/v1 kind: ServiceMonitor metadata: labels: app.kubernetes.io/component: middleware app.kubernetes.io/instance: redis-cluster app.kubernetes.io/name: redis-cluster app.kubernetes.io/version: 0.10.0 name: redis-standalone-prometheus-monitoring namespace: redis-system spec: endpoints: - interval: 30s port: redis-exporter scrapeTimeout: 10s namespaceSelector: matchNames: - redis-system selector: matchLabels: app: redis-standalone redis_setup_type: standalone
-
Redis Cluster
apiVersion: monitoring.coreos.com/v1 kind: ServiceMonitor metadata: labels: app.kubernetes.io/component: middleware app.kubernetes.io/instance: redis-cluster app.kubernetes.io/name: redis-cluster app.kubernetes.io/version: 0.10.0 name: redis-cluster-leader-prometheus-monitoring namespace: redis-system spec: endpoints: - interval: 30s port: redis-exporter scrapeTimeout: 10s namespaceSelector: matchNames: - redis-system selector: matchLabels: app: redis-cluster-leader redis_setup_type: cluster role: leader
Prometheus Dashboard์ ์ ์ํ๋ฉด Targets์ด ์ถ๊ฐ๋์๊ณ ์งํ(metric)๋ค์ ์์ง๋๊ณ ์์ต๋๋ค.
Redis Cluster์ ํต๊ณ๋ฅผ ๋ชจ๋ํฐ๋งํ๊ธฐ ์ํด Grafana Dashboard๋ฅผ ์ ๊ณตํ๊ณ ์์ด ์๋ ๋งํฌ์์ ๋ค์ด๋ก๋ ๋ฐ์ Grafana์ ๋ฑ๋ก ํ์ฌ ์ฌ์ฉํ์๋ฉด ๋ฉ๋๋ค.
๐ https://ot-container-kit.github.io/redis-operator/guide/grafana.html
Redis Cluster์ master node 3๊ฐ, replica node 3๊ฐ๊ฐ ์๋ ์ํฉ์์ 1๋ฒ master node (redis-cluster-leader-0)๋ฅผ ์ญ์ ํ๋ฉด, 1๋ฒ replica node (redis-cluster-follower-01)๊ฐ master๋ก ์น๊ฒฉ๋์ด ์ง์์ ์ผ๋ก ๋ฐ์ดํฐ์ ์ผ๊ด์ฑ์ ๋ณด์ฅํฉ๋๋ค. ํ์ง๋ง cluster-node-time ์๊ฐ์ ํฌํจํด์ ์ ์์ผ๋ก ๋์์ค๊ธฐ๊น์ง๋ ๋ช ์ด์ ์๊ฐ์ด ์์๋ฉ๋๋ค.
redis-cli ๋ช ๋ น์ ์ฌ์ฉํ์ฌ Redis Cluster์ 1๋ฒ master node์์ dummy data๋ฅผ write ํฉ๋๋ค.
$ kubectl exec -it redis-cluster-leader-0 -n redis-system -c redis-cluster-leader -- redis-cli -a redispassword -c set doik gradute
Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe.
OK
๊ทธ๋ฆฌ๊ณ ๋ค๋ฅธ master(leader)์ replica(follower) nodes์์ data๋ฅผ read ํ๋ฉด ๋์ผํ ๋ฐ์ดํฐ๋ฅผ ์ฝ์ ์ ์์ต๋๋ค.
$ kubectl exec -it redis-cluster-follower-0 -n redis-system -c redis-cluster-follower -- redis-cli -a redispassword -c get doik
Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe.
"gradute"
$ kubectl exec -it redis-cluster-leader-2 -n redis-system -c redis-cluster-leader -- redis-cli -a redispassword -c get doik
Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe.
"gradute"
$ kubectl exec -it redis-cluster-follower-1 -n redis-system -c redis-cluster-follower -- redis-cli -a redispassword -c get doik
Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe.
"gradute"
dummy data๋ฅผ writeํ์ redis log๋ฅผ ๋ณด๋ฉด master node์์ data writeing transition์ด ๋ฐ์๊ณผ ๋์์ replica node์ data๊ฐ replication ๋์๋ค๋ ๊ฒ์ ์ ์ ์์ต๋๋ค.
-
master 1๋ฒ ๋ ธ๋(redis-cluster-leader-0 pod)์ redis log
$ kubectl logs -f redis-cluster-leader-0 -n redis-system Defaulted container "redis-cluster-leader" out of: redis-cluster-leader, redis-exporter Starting redis service in cluster mode..... 11:C 22 Jun 2022 14:27:20.230 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo 11:C 22 Jun 2022 14:27:20.230 # Redis version=6.2.5, bits=64, commit=00000000, modified=0, pid=11, just started 11:C 22 Jun 2022 14:27:20.230 # Configuration loaded 11:M 22 Jun 2022 14:27:20.230 * monotonic clock: POSIX clock_gettime 11:M 22 Jun 2022 14:27:20.231 * Node configuration loaded, I'm 7ded434ed7be8db05a7851dc44e082e38bbf398b 11:M 22 Jun 2022 14:27:20.231 * Running mode=cluster, port=6379. 11:M 22 Jun 2022 14:27:20.231 # Server initialized 11:M 22 Jun 2022 14:27:20.231 * Ready to accept connections 11:M 22 Jun 2022 14:28:40.238 # configEpoch set to 1 via CLUSTER SET-CONFIG-EPOCH 11:M 22 Jun 2022 14:28:45.207 # Cluster state changed: ok 11:M 22 Jun 2022 14:28:57.589 * Replica 172.16.84.121:6379 asks for synchronization 11:M 22 Jun 2022 14:28:57.589 * Partial resynchronization not accepted: Replication ID mismatch (Replica asked for '8e3ffd79b9f7370b05effda9a837c2956e5fabed', my replication IDs are 'd8bea88fcebd4c90442116e74a15a7fd2a3935d4' and '0000000000000000000000000000000000000000') 11:M 22 Jun 2022 14:28:57.589 * Replication backlog created, my new replication IDs are '8e2dab8037c5e9c194cf0c659c9c28f77c08614e' and '0000000000000000000000000000000000000000' 11:M 22 Jun 2022 14:28:57.589 * Starting BGSAVE for SYNC with target: disk 11:M 22 Jun 2022 14:28:57.589 * Background saving started by pid 109 109:C 22 Jun 2022 14:28:57.591 * DB saved on disk 109:C 22 Jun 2022 14:28:57.591 * RDB: 0 MB of memory used by copy-on-write 11:M 22 Jun 2022 14:28:57.619 * Background saving terminated with success 11:M 22 Jun 2022 14:28:57.619 * Synchronization with replica 172.16.84.121:6379 succeeded
-
replica 1๋ฒ ๋ ธ๋(redis-cluster-follower-0 pod)์ redis log
$ kubectl logs -f redis-cluster-follower-0 -n redis-system Defaulted container "redis-cluster-follower" out of: redis-cluster-follower, redis-exporter Starting redis service in cluster mode..... 13:C 22 Jun 2022 14:27:35.559 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo 13:C 22 Jun 2022 14:27:35.559 # Redis version=6.2.5, bits=64, commit=00000000, modified=0, pid=13, just started 13:C 22 Jun 2022 14:27:35.559 # Configuration loaded 13:M 22 Jun 2022 14:27:35.560 * monotonic clock: POSIX clock_gettime 13:M 22 Jun 2022 14:27:35.560 * Node configuration loaded, I'm 87fe6e67e43ddb9f9ad6acd830d360b83250c630 13:M 22 Jun 2022 14:27:35.561 * Running mode=cluster, port=6379. 13:M 22 Jun 2022 14:27:35.561 # Server initialized 13:M 22 Jun 2022 14:27:35.561 * Ready to accept connections 13:S 22 Jun 2022 14:28:57.588 * Before turning into a replica, using my own master parameters to synthesize a cached master: I may be able to synchronize with the new master with just a partial transfer. 13:S 22 Jun 2022 14:28:57.588 * Connecting to MASTER 172.16.84.122:6379 13:S 22 Jun 2022 14:28:57.588 * MASTER <-> REPLICA sync started 13:S 22 Jun 2022 14:28:57.588 # Cluster state changed: ok 13:S 22 Jun 2022 14:28:57.588 * Non blocking connect for SYNC fired the event. 13:S 22 Jun 2022 14:28:57.589 * Master replied to PING, replication can continue... 13:S 22 Jun 2022 14:28:57.589 * Trying a partial resynchronization (request 8e3ffd79b9f7370b05effda9a837c2956e5fabed:1). 13:S 22 Jun 2022 14:28:57.590 * Full resync from master: 8e2dab8037c5e9c194cf0c659c9c28f77c08614e:0 13:S 22 Jun 2022 14:28:57.590 * Discarding previously cached master state. 13:S 22 Jun 2022 14:28:57.619 * MASTER <-> REPLICA sync: receiving 175 bytes from master to disk 13:S 22 Jun 2022 14:28:57.619 * MASTER <-> REPLICA sync: Flushing old data 13:S 22 Jun 2022 14:28:57.619 * MASTER <-> REPLICA sync: Loading DB in memory 13:S 22 Jun 2022 14:28:57.620 * Loading RDB produced by version 6.2.5 13:S 22 Jun 2022 14:28:57.620 * RDB age 0 seconds 13:S 22 Jun 2022 14:28:57.620 * RDB memory usage when created 2.60 Mb 13:S 22 Jun 2022 14:28:57.620 * MASTER <-> REPLICA sync: Finished with success 13:S 22 Jun 2022 14:28:57.621 * Background append only file rewriting started by pid 83 13:S 22 Jun 2022 14:28:57.650 * AOF rewrite child asks to stop sending diffs. 83:C 22 Jun 2022 14:28:57.650 * Parent agreed to stop sending diffs. Finalizing AOF... 83:C 22 Jun 2022 14:28:57.650 * Concatenating 0.00 MB of AOF diff received from parent. 83:C 22 Jun 2022 14:28:57.651 * SYNC append only file rewrite performed 83:C 22 Jun 2022 14:28:57.651 * AOF rewrite: 0 MB of memory used by copy-on-write 13:S 22 Jun 2022 14:28:57.725 * Background AOF rewrite terminated with success 13:S 22 Jun 2022 14:28:57.725 * Residual parent diff successfully flushed to the rewritten AOF (0.00 MB) 13:S 22 Jun 2022 14:28:57.725 * Background AOF rewrite finished successfully
์ด์ failover(์ฅ์ ์กฐ์น) ํ ์คํธ๋ฅผ ์งํ ํด๋ณผํ ๋ฐ ๊ทธ์ ์ pods์ IP๋ฅผ ๊ธฐ์ตํด๋์๊ธฐ ๋ฐ๋๋๋ค.
$ kubectl get pod -n redis-system -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
redis-cluster-follower-0 2/2 Running 0 1h 172.16.84.121 k8s-w3-dragon <none> <none>
redis-cluster-follower-1 2/2 Running 0 1h 172.16.10.75 k8s-w2-dragon <none> <none>
redis-cluster-follower-2 2/2 Running 0 1h 172.16.84.115 k8s-w3-dragon <none> <none>
redis-cluster-leader-0 2/2 Running 0 1h 172.16.84.101 k8s-w3-dragon <none> <none>
redis-cluster-leader-1 2/2 Running 0 1h 172.16.10.103 k8s-w2-dragon <none> <none>
redis-cluster-leader-2 2/2 Running 0 1h 172.16.78.67 k8s-w1-dragon <none> <none>
- Master nodes
- master 1 (redis-cluster-leader-0) : 172.16.84.101
- master 2 (redis-cluster-leader-1) : 172.16.10.103
- master 3 (redis-cluster-leader-2) : 172.16.78.67
- Replica nodes
- replica 1 (redis-cluster-follower-0) : 172.16.84.121
- replica 2 (redis-cluster-follower-1) : 172.16.10.78
- replica 3 (redis-cluster-follower-2) : 172.16.84.115
์ด์ 1๋ฒ master node (redis-cluster-leader-0 pod)
์ image tag๋ฅผ ์กด์ฌํ์ง ์๋ ๊ฒ์ผ๋ก ๋ณ๊ฒฝํ์ฌ ์์ผ๋ก ์ฅ์ ๋ฅผ ๋ฐ์์ํค๊ฒ ์ต๋๋ค.
$ kubectl patch pod/redis-cluster-leader-0 -n redis-system -p '{"spec":{"containers":[{"name": "redis-cluster-leader","image": "quay.io/opstree/redis:v6.2.9"}]}}'
[์ด๋ฏธ์ง ์ถ์ฒ] http://redisgate.kr/redis/cluster/cluster_failover.php
image tag๋ฅผ ๋ณ๊ฒฝํ 1๋ฒ master node(redis-cluster-leader-0 pod)
์ ์ํ๊ฐ ImagePullBackOff ์ํ๋ก ๋ณ๊ฒฝ๋์์ต๋๋ค.
$ kubectl get pod -n redis-system -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
redis-cluster-follower-0 2/2 Running 0 15h 172.16.84.121 k8s-w3-dragon <none> <none>
redis-cluster-follower-1 2/2 Running 0 15h 172.16.10.75 k8s-w2-dragon <none> <none>
redis-cluster-follower-2 2/2 Running 0 15h 172.16.84.115 k8s-w3-dragon <none> <none>
redis-cluster-leader-0 1/2 ImagePullBackOff 0 (47s ago) 2m21s 172.16.84.101 k8s-w3-dragon <none> <none>
redis-cluster-leader-1 2/2 Running 0 15h 172.16.10.103 k8s-w2-dragon <none> <none>
redis-cluster-leader-2 2/2 Running 0 15h 172.16.78.67 k8s-w1-dragon <none> <none>
1๋ฒ master node(redis-cluster-leader-0 pod) : 172.16.84.101
์์ redis cluster nodes ์ํ๋ฅผ ํ์ธํ๋ฉด, node fail ์ํ๋ก ์ฐ๊ฒฐ์ด ๋์ด์ก์ต๋๋ค.
๊ทธ๋ฆฌ๊ณ ***1๋ฒ replica node(redis-cluster-follower-0 pod) : 172.16.84.121***
๊ฐ master node๋ก leader ์ ์ถ์ ๋ฐ๋ผ ์น๊ฒฉ์ด ๋์์ต๋๋ค.
$ kubectl exec -it redis-cluster-leader-1 -n redis-system -c redis-cluster-leader -- redis-cli -a redispassword cluster nodes
Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe.
5483f9be46324b9e8f48b431fc4128c788525cdc 172.16.10.103:6379@16379 myself,master - 0 1655964724000 2 connected 5461-10922
742149aba5d2e572b6f85ea59a964880fa79b367 172.16.78.67:6379@16379 master - 0 1655964724000 3 connected 10923-16383
a956b4aaf4a04957bc6b0a42bdb62122c91fb44e 172.16.84.115:6379@16379 slave 742149aba5d2e572b6f85ea59a964880fa79b367 0 1655964724864 3 connected
4d0bd6e99c00cddd6f9858da371526f39fef157a 172.16.10.75:6379@16379 slave 5483f9be46324b9e8f48b431fc4128c788525cdc 0 1655964725573 2 connected
87fe6e67e43ddb9f9ad6acd830d360b83250c630 ***172.16.84.121:6379@16379 master*** - 0 1655964725000 4 connected 0-5460
7ded434ed7be8db05a7851dc44e082e38bbf398b ***172.16.84.101:6379@16379 master,fail*** - 1655964668967 1655964667000 1 ***disconnected***
master๋ก ์น๊ฒฉ๋ ***1๋ฒ replica node(redis-cluster-follower-0 pod) : 172.16.84.121***
์ redis log๋ฅผ ์ถ๋ ฅํ๋ฉด Failover election์ ๋ฐ๋ผ ์๊ธฐ๊ฐ master๊ฐ ๋์๋ค๋ ๊ฒ์ ์๋ฆฝ๋๋ค.
Failover election won: I'm the new master.
$ kubectl logs -f redis-cluster-follower-0 -n redis-system
.
.
.
13:S 23 Jun 2022 06:11:14.473 * Connecting to MASTER 172.16.84.101:6379
13:S 23 Jun 2022 06:11:14.473 * MASTER <-> REPLICA sync started
13:S 23 Jun 2022 06:11:14.473 # Error condition on socket for SYNC: Connection refused
13:S 23 Jun 2022 06:11:14.607 * FAIL message received from 742149aba5d2e572b6f85ea59a964880fa79b367 about 7ded434ed7be8db05a7851dc44e082e38bbf398b
13:S 23 Jun 2022 06:11:14.677 # Start of election delayed for 510 milliseconds (rank #0, offset 126).
13:S 23 Jun 2022 06:11:15.283 # Starting a failover election for epoch 4.
***13:S 23 Jun 2022 06:11:15.287 # Failover election won: I'm the new master.***
13:S 23 Jun 2022 06:11:15.287 # configEpoch set to 4 after successful failover
13:M 23 Jun 2022 06:11:15.287 * Discarding previously cached master state.
13:M 23 Jun 2022 06:11:15.287 # Setting secondary replication ID to 26d81a3e61a5425bfbab71716df5092c0d6deda8, valid up to offset: 127. New replication ID is 995090ede0799f7b0f13e5069b8ac40566902b0b
์ด์ 1๋ฒ master node๋ redis-cluster-leader-0 pod : 172.16.84.101
์์ redis-cluster-follower-0 pod : 172.16.84.121
๋ก ๋ณ๊ฒฝ ๋์์ต๋๋ค.
๊ทธ๋ฌ๋ฉด ์ด์ ์์๋ก ์ฅ์ ๋ฅผ ๋ฐ์์ํจ redis-cluster-leader-0 pod๋ฅผ ๋ณต์ํ๋ฉด ์ด๋ป๊ฒ ๋ ๊น์?
-
master๋ก ๋ณต์(์น๊ฒฉ)๋๋ค.
-
replica๋ก ๋ณต์๋๋ค.
-
์๋ฌด๋ฐ ์ํฅ๋ ์๋ค.
ํ๋ฒ ๋ณต์ํ์ฌ ์ํ๋ฅผ ์ดํด๋ณด๋๋ก ํ๊ฒ ์ต๋๋ค. image tag๋ฅผ ์๋์ v6.2.5๋ก ๋ณ๊ฒฝํฉ๋๋ค.
$ kubectl patch pod/redis-cluster-leader-0 -n redis-system -p '{"spec":{"containers":[{"name": "redis-cluster-leader","image": "quay.io/opstree/redis:v6.2.5"}]}}'
cluster_master_down_2.png
pod์ ์ํ๊ฐ ๋ณต์ ๋์๋์ง ํ์ธํฉ๋๋ค. ์ ๋ณต์ ๋์๋ค์.
$ kubectl get pod -n redis-system -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
redis-cluster-follower-0 2/2 Running 0 1h 172.16.84.121 k8s-w3-dragon <none> <none>
redis-cluster-follower-1 2/2 Running 0 1h 172.16.10.75 k8s-w2-dragon <none> <none>
redis-cluster-follower-2 2/2 Running 0 1h 172.16.84.115 k8s-w3-dragon <none> <none>
redis-cluster-leader-0 2/2 Running 1 (3m ago) 3m 172.16.84.101 k8s-w3-dragon <none> <none>
redis-cluster-leader-1 2/2 Running 0 1h 172.16.10.103 k8s-w2-dragon <none> <none>
redis-cluster-leader-2 2/2 Running 0 1h 172.16.78.67 k8s-w1-dragon <none> <none>
redis cluster nodes์ ์ํ๋ฅผ ํ์ธํด๋ด ๋๋ค.
$ kubectl exec -it redis-cluster-leader-0 -n redis-system -c redis-cluster-leader -- redis-cli -a redispassword cluster nodes
Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe.
5483f9be46324b9e8f48b431fc4128c788525cdc 172.16.10.103:6379@16379 master - 0 1655966203034 2 connected 5461-10922
7ded434ed7be8db05a7851dc44e082e38bbf398b 172.16.84.101:6379@16379 myself,slave 87fe6e67e43ddb9f9ad6acd830d360b83250c630 0 1655966203000 4 connected
87fe6e67e43ddb9f9ad6acd830d360b83250c630 172.16.84.121:6379@16379 master - 0 1655966202018 4 connected 0-5460
742149aba5d2e572b6f85ea59a964880fa79b367 172.16.78.67:6379@16379 master - 0 1655966204047 3 connected 10923-16383
a956b4aaf4a04957bc6b0a42bdb62122c91fb44e 172.16.84.115:6379@16379 slave 742149aba5d2e572b6f85ea59a964880fa79b367 0 1655966203000 3 connected
4d0bd6e99c00cddd6f9858da371526f39fef157a 172.16.10.75:6379@16379 slave 5483f9be46324b9e8f48b431fc4128c788525cdc 0 1655966203541 2 connected
๊ธฐ์กด node๋ฅผ ๋ณต์ํ๋๋ผ๋ master๋ก ๋ณต์๋๋ ๊ฒ์ด ์๋ replica๋ก ๋ณต์๋๋ ๊ฒ์ ์ ์ ์์ต๋๋ค.
์ฆ master๊ฐ ์ฅ์ ํ replica๊ฐ master๋ก ์น๊ฒฉ๋ ์ดํ์๋ ์ฅ์ ๊ฐ ๋ฌ๋ master๋ฅผ ๋ณต์ํ๋๋ผ๋ ์ด๋ฏธ failover election์ ๋ฐ๋ผ replica๊ฐ master๋ก ์น๊ฒฉ์ด ๋์ด๋ฒ๋ฆฐ ์ํ์์๋ ๋ณต์๋ node๋ replica์ ์ญํ ์ด ๋๋ค๋ ๊ฒ์ ์ ์์์ต๋๋ค.
๋ง์ง๋ง์ผ๋ก ์๋๋ redis-cluster-follower-0๊ณผ redis-cluster-leader-0์ redis logs ์ ๋๋ค.
$ kubectl logs -f redis-cluster-follower-0 -n redis-system -c redis-cluster-follower
.
.
.
13:M 23 Jun 2022 06:35:08.883 * Clear FAIL state for node 7ded434ed7be8db05a7851dc44e082e38bbf398b: master without slots is reachable again.
13:M 23 Jun 2022 06:35:08.885 * Replica 172.16.84.101:6379 asks for synchronization
13:M 23 Jun 2022 06:35:08.885 * Partial resynchronization not accepted: Replication ID mismatch (Replica asked for '6d26e33239942b867bb6df23cee2c2171d556b0b', my replication IDs are '995090ede0799f7b0f13e5069b8ac40566902b0b' and '26d81a3e61a5425bfbab71716df5092c0d6deda8')
13:M 23 Jun 2022 06:35:08.885 * Starting BGSAVE for SYNC with target: disk
13:M 23 Jun 2022 06:35:08.901 * Background saving started by pid 61429
61429:C 23 Jun 2022 06:35:08.903 * DB saved on disk
61429:C 23 Jun 2022 06:35:08.903 * RDB: 0 MB of memory used by copy-on-write
13:M 23 Jun 2022 06:35:08.982 * Background saving terminated with success
13:M 23 Jun 2022 06:35:08.982 * Synchronization with replica 172.16.84.101:6379 succeeded
$ kubectl logs -f redis-cluster-leader-0 -n redis-system -c redis-cluster-leader
Starting redis service in cluster mode.....
11:C 23 Jun 2022 06:35:08.878 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
11:C 23 Jun 2022 06:35:08.878 # Redis version=6.2.5, bits=64, commit=00000000, modified=0, pid=11, just started
11:C 23 Jun 2022 06:35:08.878 # Configuration loaded
11:M 23 Jun 2022 06:35:08.879 * monotonic clock: POSIX clock_gettime
11:M 23 Jun 2022 06:35:08.879 * Node configuration loaded, I'm 7ded434ed7be8db05a7851dc44e082e38bbf398b
11:M 23 Jun 2022 06:35:08.879 * Running mode=cluster, port=6379.
11:M 23 Jun 2022 06:35:08.879 # Server initialized
11:M 23 Jun 2022 06:35:08.881 * DB loaded from append only file: 0.000 seconds
11:M 23 Jun 2022 06:35:08.881 * Ready to accept connections
11:M 23 Jun 2022 06:35:08.882 # Configuration change detected. Reconfiguring myself as a replica of 87fe6e67e43ddb9f9ad6acd830d360b83250c630
11:S 23 Jun 2022 06:35:08.882 * Before turning into a replica, using my own master parameters to synthesize a cached master: I may be able to synchronize with the new master with just a partial transfer.
11:S 23 Jun 2022 06:35:08.882 * Connecting to MASTER 172.16.84.121:6379
11:S 23 Jun 2022 06:35:08.882 * MASTER <-> REPLICA sync started
11:S 23 Jun 2022 06:35:08.882 # Cluster state changed: ok
11:S 23 Jun 2022 06:35:08.883 * Non blocking connect for SYNC fired the event.
11:S 23 Jun 2022 06:35:08.884 * Master replied to PING, replication can continue...
11:S 23 Jun 2022 06:35:08.884 * Trying a partial resynchronization (request 6d26e33239942b867bb6df23cee2c2171d556b0b:1).
11:S 23 Jun 2022 06:35:08.901 * Full resync from master: 995090ede0799f7b0f13e5069b8ac40566902b0b:126
11:S 23 Jun 2022 06:35:08.901 * Discarding previously cached master state.
11:S 23 Jun 2022 06:35:08.982 * MASTER <-> REPLICA sync: receiving 194 bytes from master to disk
11:S 23 Jun 2022 06:35:08.982 * MASTER <-> REPLICA sync: Flushing old data
11:S 23 Jun 2022 06:35:08.983 * MASTER <-> REPLICA sync: Loading DB in memory
11:S 23 Jun 2022 06:35:08.983 * Loading RDB produced by version 6.2.5
11:S 23 Jun 2022 06:35:08.983 * RDB age 0 seconds
11:S 23 Jun 2022 06:35:08.984 * RDB memory usage when created 2.54 Mb
11:S 23 Jun 2022 06:35:08.984 * MASTER <-> REPLICA sync: Finished with success
11:S 23 Jun 2022 06:35:08.984 * Background append only file rewriting started by pid 16
11:S 23 Jun 2022 06:35:09.026 * AOF rewrite child asks to stop sending diffs.
16:C 23 Jun 2022 06:35:09.026 * Parent agreed to stop sending diffs. Finalizing AOF...
16:C 23 Jun 2022 06:35:09.026 * Concatenating 0.00 MB of AOF diff received from parent.
16:C 23 Jun 2022 06:35:09.026 * SYNC append only file rewrite performed
16:C 23 Jun 2022 06:35:09.026 * AOF rewrite: 0 MB of memory used by copy-on-write
11:S 23 Jun 2022 06:35:09.083 * Background AOF rewrite terminated with success
11:S 23 Jun 2022 06:35:09.083 * Residual parent diff successfully flushed to the rewritten AOF (0.00 MB)
11:S 23 Jun 2022 06:35:09.083 * Background AOF rewrite finished successfully
11:S 23 Jun 2022 06:50:09.009 * 1 changes in 900 seconds. Saving...
11:S 23 Jun 2022 06:50:09.010 * Background saving started by pid 969
969:C 23 Jun 2022 06:50:09.011 * DB saved on disk
969:C 23 Jun 2022 06:50:09.012 * RDB: 0 MB of memory used by copy-on-write
11:S 23 Jun 2022 06:50:09.111 * Background saving terminated with success
๋ชจ๋ Redis Cluster๋ ๋๊ฐ์ TCP connection์ ํ์๋ก ํ๋ฉฐ, Cluster๋ฅผ ๊ตฌ์ฑํ๋ ๊ฐ Redis instances๋ ๋ค๋ฅธ ๋ชจ๋ Redis instance๊ณผ Gassip Protocol์ ์ฌ์ฉํ์ฌ redis ์ํ ์ ๋ณด๋ฅผ ๊ตํํฉ๋๋ค.
๊ธฐ๋ณธ์ ์ผ๋ก Redis TCP Port(6379)๋ Client๋ฅผ ์ํด ์ฌ์ฉ๋๋ฉฐ, ์ฌ๊ธฐ์ 10000์ ๋ํด Redis instance(node)๊ฐ์ ํต์ ์ ์ํ Cluster Bus Port(16379)๋ฅผ ์ถ๊ฐ๋ก ์์ฑํฉ๋๋ค.
Master ๋ ธ๋๊ฐ ๋ค์ด๋๋ฉด gassip protocol์ ์ด์ฉํด redis ์ํ๋ฅผ ํ์ธํ๊ณ replica์ค ํ๋๋ฅผ master๋ก ์น๊ฒฉ์ํค๋๋ฐ ์ฌ์ฉ๋ฉ๋๋ค.
- Cluster Bus Port๋ node-to-node ํต์ ์ฑ๋๋ก ์ฌ์ฉ
- failure detection, configuration update, failover authorization ๋ฑ์ ์ฌ์ฉ
- Clint๋ Redis TCP Port(6379)๋ฅผ ์ฌ์ฉํ๋ฉด ๋์ง๋ง, Redis Cluster์ node-to-node ํต์ ์ ์ํด Cluster Bus Port(16379)๋ฅผ ๋ฐฉํ๋ฒฝ์์ ํ์ฉ ํ์
[์ด๋ฏธ์ง ์ถ์ฒ] https://alibaba-cloud.medium.com/understanding-the-failover-mechanism-of-redis-cluster-3b979dcf3441
- Website
- GitHub
- Artifact Hub
- Helm chart repository
- Redis Cluster 101 [๋งํฌ]
- Redis Cluster ์ฌ์ฉํ๊ธฐ์ Redis Cluster Proxy ํ์์ฑ [๋งํฌ]
- Redis Cluster์ Failover Mechanism ์ดํด [๋งํฌ]
- Redis Cluster ๊ณผ๋ฐ ์ด์ Master shutdown ๋์์๋ ๋์ ๋ฐฉ๋ฒ [๋งํฌ]
- Redis Cluster ์ฅ์ ๋ณต๊ตฌ ์๋ฎฌ๋ ์ด์ [๋งํฌ]
- Redis Cluster Failover ์ฅ์ ๋ณต๊ตฌ [๋งํฌ]
- Redis Cluster nodes.conf ํ์ผ์ ์ด์ฉํ ์ฅ์ ๋ณต๊ตฌ [๋งํฌ]
- Gassip protocol wiki [๋งํฌ]
- Gassip ํ๋กํ ์ฝ์ด๋? [๋งํฌ]
END