후니의 IT인프라 사전

1주차 - Deploying PHP Guestbook application with Redis (도전과제) 본문

프로젝트&&스터디/DOIK 스터디

1주차 - Deploying PHP Guestbook application with Redis (도전과제)

james_janghun 2022. 6. 24. 15:15

1. 실습가이드 (링크)

  Redis를 이용한 PHP 방명록 애플리케이션을 구성합니다.

  해당 실습을 통해서 deploy 형태의 pod 배포, Redis의 Leader-Follower 구성, service를 통한 배포, frontend web과 연결, 파드 스케일 증가를 확인할 수 있다.

 

2. Redis는 무엇인가? 

  In Memory Cache 시스템으로 메모리 속에 자료를 저장하여 처리 속도가 매우 빠른 장점이 있다. 

  Key-Value 저장소로, 다양한 형식의 데이터를 지원하며 NoSQL 형태이다. (참고블로그)

  Redis는 메모리 상의 DB라는 점에서 영속성을 문제를 가질 수 밖에 없는데, 이를 보완하기 위해서 데이터를 Disk에 저장할 수 있도록 하여 영속성을 보장하도록 했다. 데이터를 DISK에 저장하는 방식은 크게 2가지이다.

 

SnapShot 방식

  snapshot을 뜨는 것  처럼, 메모리에 있는 데이터를 특정 시점에 그대로 Disk로 옮겨 담는다. 

  이때, Redis의 쓰기를 잠시 멈추는(Blocking) Save 방식 / 쓰기를 멈추지 않는 BGSave 방식으로 또 나뉜다.

  다만, 특정 시점에 유효하기 때문에 만약 snapshot을 하고 난 뒤 새로 메모리에 올라간 데이터가 있는 상태에서 redis가 죽으면 해당 데이터는 날라간다.

 

AOF(Append On File) 방식

  모든 Write/Update의 연산을 모두 log에 남기고, 서버 재시작시 write/update 작업을 순차적으로 재실행해 데이터를 복구하는 방식이다.

  다만, 서버가 죽는 그 순간까지도 로그 파일은 실시간으로 남기 때문에 데이터 보존에는 용이하나 모든 log을 남겨 점점 그 용량이 비대해지게 되고, 재시작시 write/update 작업을 다시 하기 때문에 그 양이 많을 수록 레이턴시가 발생할 수 있다.

3. 실습 배포

3.1 Redis Leader Pod 생성

  데이터 작성을 위해서 Redis Leader를 생성합니다.

apiVersion: apps/v1
kind: Deployment
metadata:
  name: redis-leader
  labels:
    app: redis
    role: leader
    tier: backend
spec:
  replicas: 1
  selector:
    matchLabels:
      app: redis
  template:
    metadata:
      labels:
        app: redis
        role: leader
        tier: backend
    spec:
      containers:
      - name: leader
        image: "docker.io/redis:6.0.5"
        resources:
          requests:
            cpu: 100m
            memory: 100Mi
        ports:
        - containerPort: 6379

 

3.2 Redis Leader Service 생성

  방명록 애플리케이션에 데이터를 쓰려면 애플리케이션이 Redis에 접근할 수 있어야 하므로 서비스를 생성합니다.

apiVersion: v1
kind: Service
metadata:
  name: redis-leader
  labels:
    app: redis
    role: leader
    tier: backend
spec:
  ports:
  - port: 6379
    targetPort: 6379
  selector:
    app: redis
    role: leader
    tier: backend

 

3.3 Redis 팔로워 생성

  Redis Leader에 Follwer 2개를 추가하여 클러스터를 구성합니다. 이는  deploy를 통해 구성하므로 pod가 죽어도 재생성됩니다.

apiVersion: apps/v1
kind: Deployment
metadata:
  name: redis-follower
  labels:
    app: redis
    role: follower
    tier: backend
spec:
  replicas: 2
  selector:
    matchLabels:
      app: redis
  template:
    metadata:
      labels:
        app: redis
        role: follower
        tier: backend
    spec:
      containers:
      - name: follower
        image: gcr.io/google_samples/gb-redis-follower:v2
        resources:
          requests:
            cpu: 100m
            memory: 100Mi
        ports:
        - containerPort: 6379

Deploy 배포의 경우 항시 2개의 replicas를 유지합니다. describe를 통해서 살펴보면, Replicas 2 desired라는 모습을 확인할 수 있습니다.

만약 pod를 없앨 경우, 다른 pod가 생성되며 맨 마지막 랜덤 이름 값은 변경됩니다.

기존에 6nfq4라는 pod가 존재했으나 삭제시에 별도로 thxzl이라는 redis가 등장하였습니다.

 

3.4 Redis Follower 서비스 구성

  - 데이터를 읽기 위해서 Redis Follower도 서비스를 통해서 개통시켜야한다.

 

apiVersion: v1
kind: Service
metadata:
  name: redis-follower
  labels:
    app: redis
    role: follower
    tier: backend
spec:
  ports:
    # the port that this service should serve on
  - port: 6379
  selector:
    app: redis
    role: follower
    tier: backend

 

 

3.5 Redis cluster 확인

  kubectl logs -f deploy/redis-follower 을 통해서 cluster log를 확인하고, 동기화 상태를 확인할 수 있다.

 

 

3.6. 방명록 Frontend 구축

  - 저장소인 Redis를 구성했으므로, 실제 방명록 애플리케이션을 구동한다. deploy를 통해 배포해 안정성을 유지한다.

apiVersion: apps/v1
kind: Deployment
metadata:
  name: frontend
spec:
  replicas: 3
  selector:
    matchLabels:
        app: guestbook
        tier: frontend
  template:
    metadata:
      labels:
        app: guestbook
        tier: frontend
    spec:
      containers:
      - name: php-redis
        image: gcr.io/google_samples/gb-frontend:v5
        env:
        - name: GET_HOSTS_FROM
          value: "dns"
        resources:
          requests:
            cpu: 100m
            memory: 100Mi
        ports:
        - containerPort: 80

3.7 Frontend Service 배포

  LodePort를 기본으로하나, 외부로 서비스 배포시에 LoadBalancer 타입으로 배포가 가능하다. 서비스에서 제공되는 32065 포트를 통해서 접근하였다.

apiVersion: v1
kind: Service
metadata:
  name: frontend
  labels:
    app: guestbook
    tier: frontend
spec:
  #type: LoadBalancer  # 외부 오픈시는 로드밸런서 타입으로 진행
  ports:
    # the port that this service should serve on
  - port: 80
  selector:
    app: guestbook
    tier: frontend

3.8 방명록 웹 pod 확장

  - 방문자가 많아 트래픽에 대한 분산이 필요할 경우, 존재하는 pod의 숫자를 늘릴 수 있다.

kubectl scale deployment frontend --replicas=5

kubectl scale deployment frontend --replicas=1

만약 이렇게 frontend pod가 줄어들어도 자료나 방명록 등록에는 전혀 문제 없었다. Redis에 자료를 저장하기 때문이다.

 

3.9 Redis 정보확인하기

# redis tools 설치
apt install redis-tools

# 서비스 IP 및 포트 확인
kubectl get service

NAME              TYPE           CLUSTER-IP     EXTERNAL-IP   PORT(S)        AGE
redis-follower   ClusterIP      10.200.1.185   <none>        6379/TCP       4h37m
redis-leader     ClusterIP      10.200.1.13    <none>        6379/TCP       4h37m

# redis 접근
redis-cli -h 10.200.1.13 # 6379가 기본포트라서 별도 입력안함. 다를 경우 -p 사용

# info 확인
10.200.1.13:6379> info

(...)
# Replication
role:master
connected_slaves:2
slave0:ip=172.16.2.10,port=6379,state=online,offset=2114,lag=1
slave1:ip=172.16.1.17,port=6379,state=online,offset=2114,lag=0
master_replid:def716e7a6f3ed69dec6e960c8ffe61861c138ef
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:2114
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:2114

 

이상으로 Redis를 활용한 방명록 애플리케이션 배포 실습을 마무리 하겠습니다. 감사합니다.