1주차 로그

이태형·2024년 5월 22일

Growth Log

목록 보기
1/18

로그 목표

  • 앞으로 배우고 싶은 것에 대해 잘 이해하고 있는지, 어느 정도 진행이 됐는지 확인하기 위함
  • 한 주 동안 배웠던 것을 돌아보며 놓치고 있는 것은 없는지 다시 확인하고 정리
  • 다른 전문가분들이 내 글을 보고 틀린 걸 찾아주길 바람

세션 클러스터링에 대한 이해

현재 포탈은 사용자 수 관계 없이 이중화로 배포되고 있다.
앞단에 LB 가 위치하여, Sticky Session 방식으로 세션 관리를 하고 있었다.

서버1 로 들어와서 로그인을 하면, LB는 해당 사용자를 계속 서버1 로 연결을 해주는 데, 이때 많은 사용자들이 한번에 들어오는 경우, 서버1과 서버2로 분산되어 접속을 하겠지만, 이후에 서버2에 사용자들은 다 종료해도, 서버1을 사용한 사용자들은 계속 서버1로 접속을 하게되어 트래픽이 집중되는 현상이 발생한다.

또한 서버1이 장애가 발생하면, 서버1을 사용하던 사용자들은 서버2로 다시 접속을 하게되는데, 세션 정보가 없어서 재로그인을 해야하는 문제가 생긴다.

위 문제로 인해 Redis를 사용하여 세션정보를 다른 서버에 저장해서 서버1, 서버2가 공용으로 사용할 수 있도록 구성했다.

Reids

  • In-Memory 방식에 DB 로 보조기억장치가 아닌 주기억장치에 데이터를 저장한다.
  • 기존에 사용하는 데이베이스 ( MySQL, MSSQL 등 ) 보다 속도가 빠른것이 장점이다.

아래 도면처럼 서버를 구성함, 고객사 자원 제공현황을 봤을 때, 가상머신 2대만 이용 가능할 것이라고 예상

Master

  • RW 가 전부 가능한 DB
  • 데이터를 실제로 저장
  • 애플리케이션과 통신하는 주체

Slave

  • R 만 가능한 DB
  • Master에 저장된 정보를 가져와 동기화 하는 역할

Sentinel

  • 자동 FailOver 기능을 제공하는 Redis
  • Master 에 장애가 발생했다고 판단하는 경우, Slave 로 지정된 DB 를 Master 로 변경함
  • 구성은 홀수개로 구성하는 것이 좋음
    1. Master 에 장애 판단은 Sentinel 끼리 다수결로 결정
    2. 과반수 이상으로 장애 판단이 되어야 Master 가 장애가 발생했다고 인정하고, Slave 를 Master 로 변경함
  • Master 와 Slave 만 구성하면, Master 에 데이터가 Slave 로 자동 동기화 되지만, Master 가 장애가 발생해도 자동 복구는 되지 않음
  • 고가용성을 제공하는 솔루션

구성방법

Redis 설치

sudo apt-get install redis-server

Master 설정

sudo vi /etc/redis/redis.conf

--------------redis.conf 내용 중 일부 수정-------------------
bind 0.0.0.0 ::1 
logfile "/var/log/redis/redis-server.log"
databases 2
requirepass "password"
masterauth "password"
maxmemory 256mb
  • bind
    • 모든 IP 요청에 대해서 허용, 보안상 좋지 않음, VM 에 특정 IP 를 지정해주는 것이 좋음
    • 외부에서 연결을 요청할 때, 지정하는 IP 를 LISTEN 할 IP를 지정
    • 127.0.0.1 이면, 내부에서 요청만 가능
  • databases
    • Redis Server 에서 생성할 데이터베이스 개수를 지정
    • 세션 정보만 사용할 것이기 때문에 많이 필요 없음
  • requirepass
    • 인증에 사용할 비밀번호 지정
    • 외부에서 접근 시, protect-mode 로 되어있기 때문에 인증이 필요함
    • 이 설정이 없으면 외부에서 접근이 불가함
  • masterauth
    • Slave 가 접근할 때 사용하는 인증값
    • failover를 위해서 requirepass 와 동일하게 지정하는 것이 좋음
  • maxmemory
    • Redis 가 사용할 수 있는 메모리 최대 양을 제한

Slave 설정

sudo vi /etc/redis/redis.conf

--------------redis.conf 내용 중 일부 수정-------------------
bind 0.0.0.0 ::1 
logfile "/var/log/redis/redis-server.log"
databases 2
requirepass "password"
masterauth "password"
maxmemory 256mb
replicaof 192.168.60.32 6379
  • replicaof
    • Master 에 IP 와 Port 를 지정
    • 해당 IP/Port 로 동기화 요청을 진행함

Master-Slave 서비스 Unit 생성

  • 필수 동작인지는 확인 못함, 대신 생성할 때 conf 파일을 지정할 수 있음
  • Master 로 지정한 VM 과, Slave 로 지정한 VM 둘 다 동일하게 생성하면 됨
sudo vi /etc/systemd/system/redis.service

-------------------redis.service 내용-------------------------

[Unit]
Description=Redis data structure server
Documentation=https://redis.io/documentation
Wants=network-online.target
After=network-online.target

[Service]
ExecStart=/usr/bin/redis-server /etc/redis/redis.conf --supervised systemd --daemonize no
LimitNOFILE=10032
NoNewPrivileges=yes
Type=notify
TimeoutStartSec=infinity
TimeoutStopSec=infinity
UMask=0077
User=redis
Group=redis

[Install]
WantedBy=multi-user.target

Sentinel 설치

apt-get install redis-sentinel

Sentinel 구성

sudo vi /etc/redis/sentinel.conf

----------------------------sentinel.conf 내용 중 일부 변경------------------------
sentinel monitor mymaster 192.168.60.32 6379 2
sentinel auth-pass mymaster password
sentinel down-after-milliseconds mymaster 5000
sentinel failover-timeout mymaster 120000
  • monitor mymaster 지정
    • <master-name> <ip> <port> <quorum> 로 마스터 이름과 IP, Port 를 지정하고, quorum 을 지정
    • quorum 은 마스터가 장애 발생 시, 다수결을 진행할 때, 최저 투표수
    • 장애 발생 시, 투표하는 Sentinel 이 최소 2 개는 있어야함
  • auth-pass
    • master 에 접근할 때 사용할 인증
    • masterauth 로 지정한 값을 입력
  • down-after-milliseconds
    • master 가 장애라고 판정하는 시간
    • 즉 5000 밀리초 까지 반응이 없으면 장애가 발생했다고 판단함
  • failover-timeout
    • 장애 복구 진행 시 해당 시간이 지나가면 안됨

Sentinel 서비스 Unit 생성

sudo vi /etc/systemd/system/redis-sentinel.service

--------------------------redis-sentinel.service 내용-----------------------

[Unit]
Description=Redis sentinel
Documentation=https://redis.io/docs/management/sentinel/
Wants=network-online.target
After=network-online.target

[Service]
ExecStart=/usr/bin/redis-sentinel /etc/redis/sentinel.conf --supervised systemd --daemonize no
LimitNOFILE=10032
NoNewPrivileges=yes
Type=notify
TimeoutStartSec=infinity
TimeoutStopSec=infinity
UMask=0077
User=redis
Group=redis

[Install]
WantedBy=multi-user.target

느낀 점

  • 효율적인 개발자가 되려면 언어를 잘 짜는것도 중요하지만, 이런 구성도 정확히 알고있어야 솔루션을 제공할 때 사용자의 만족도를 높일 수 있을것 같다.
  • 너무나도 다양한 구성방식이 존재했다. 그 중 선택한 것이 Redis의 Sentinel 방식을 이용한 것이였지만, 이 외에도 Tomcat 에서 제공하는 방법, 다른 In-Memory DB 를 사용하는 방법 등등이 존재했고, 그 중에서 현재 제공될 환경에 맞는 방법을 고르는 것은 엄청 중요한 일이라고 생각한다.
  • 정해진 환경에 최적의 솔루션을 제공하기 위해서, 많은 방법 중 최선의 선택을 하기 위해서는 많은 지식이 필요하다는 것을 느꼈다.
  • 다음엔 도커 공부해야징

0개의 댓글