Redis DB의 master-slave 구성하기

이eun·2024년 12월 19일

redis-deployment.yaml

apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: redis
  namespace: default
spec:
  selector:
    matchLabels:
      svc: redis # has to match .spec.template.metadata.labels
  serviceName: redis
  replicas: 3 # by default is 1
  template: # pod의 사양
    metadata:
      labels:
        svc: redis # has to match .spec.selector.matchLabels
    spec:
      containers:
      - name: redis
        image: redis
        command:
        - sh
        - -c 
        - | 
          if [ `hostname` = redis-0 ]; then
            redis-server
          else
            redis-server --replicaof redis-0.redis.default.svc.cluster.local 6379
          fi
        ports:
        - containerPort: 6397
        volumeMounts:
        - name: data
          mountPath: /data
  volumeClaimTemplates: # persistent volume 생성을 위한 template임
  - metadata:
      name: data
    spec:
      accessModes: 
      - ReadWriteOnce
      resources:
        requests:
          storage: 10Ki
---
apiVersion: v1
kind: Service
metadata:
  name: redis
spec:
  type: ClusterIP
  selector:
    svc: redis
  ports:
  - port: 6379


server.js

var http = require('http');
var redis = require('redis');


http.createServer(function (request, response) {
    // url이 /inc로 들어오면 값을 증가시키고
    if (request.url == '/inc'){
        var redisClient = redis.createClient({
            url: 'redis://redis-0.redis.default.svc.cluster.local:6379', // redis service의 도메인 네임, redis는 서비스 이름, default는 네임스페이스 이름
            //svc라는 것이 쿠버네티스 service의 의미, cluster.local이 로컬 클러스터인 minikube의 도메인 네임임
            legacyMode:true, // 기존 콜백 방식으로 redis 클라이언트가 동작하며, false인 경우에는 promise로 동작작
        });
        redisClient.connect();
        
        redisClient.incr('count', function (err, count) {        
            response.writeHead(200, {'Content-Type': 'text/plain'});
            response.end(count.toString());
        });
    }
    // 아니면 값을 호출한다다
    else {
        var redisClient = redis.createClient({
            url: 'redis://redis.default.svc.cluster.local:6379',
            legacyMode:true, 
        });
        redisClient.connect();
        
        redisClient.get('count', function (err, data) {        
            response.writeHead(200, {'Content-Type': 'text/plain'});
            response.end(data);
        });
    }
}).listen(8081);

console.log('Server running at http://127.0.0.1:8081/');

명령어 :
kubectl exec -ti redis-0 -- redis-cli

새로운 터미널을 열어서
kubectl exec -ti redis-1 -- redis-cli

또 터미널을 열어서
kubectl exec -ti redis-2 -- redis-cli

즉, master로 설정된 redis-0은 변경이 가능하지만, redis-1부터 2, 또는 증가되는 3,4,5 .... slave모드이기 때문에 read만 가능합니다.

redis-service로 요청하면 service가 redis-0부터 2까지 분배해서 로드밸런싱해서 처리할 수 있음을 알 수 있습니다.

read operation은 로드밸런싱이 된다는 것을 알 수 있습니다.

0개의 댓글