redis replication 구성 및 haproxy를 통한 서비스

1. 서비스 개요

redis의 서비스 장애을 극복하기 위하여 redis를 이중화 하여 구성한다. 보통 마스터 1개에 여러 슬래이브로 구성을 하고
redis 서비스를 감시하는 Sentienl을 여러게 두어, redis 마스터 서비스 장애시 슬레이브중 하나를 자동으로 마스터로 승격시켜
장애가 없는 서비스 구성이 가능하다. 또한 라우터 스위칭을 담당하는 haproxy를 최상단에 두어 redis sendinel에서 변경한
redis 마스터 포토를 자동으로 감지 이를 서비스를 해줌으로서, redis-client에서는 서비스포트 변경없이 원활한 서비스가 가능하다.

2. redis replication 구성

redis의 환경설정을 통하여 포트별로 master/slave구성을 한 뒤, 해당서비스를 감시하는 sentinel를 설정하여
운영한다.

2.1 redis master/slave 구성
첫번째로 redis를 설치를 한다. 해당내용은 여기 블로그 Ubuntu 에 Redis 컴파일, 빌드및 서비스 환경구성
를 참조한다.
기본적으로 설치된 /etc/redis/redis.conf 설정파일 복사해서 여러포트로 운영할 경우, 쉽게 서비스구분을 위해
redis_<서비스포트>.conf로 파일명을 변경하여 구성한다.

– 기본구성
conf파일에서 서비스 접속보안을 위해 항목중 requirepass 를 설정한다. 또한 서비스 장애시 Sentinel에 의해 redis서버가 master에서 slave로
강등될 수 있기 때문에 masterauth 도 동일안 인증번호로 설정한다.

requirepass "pass1234"
masterauth "pass1234"

– slave 구성
기본구성된 conf파일을 copy하여 서비스할 포트만 변경한다. 포트를 변경후, slave에서는 대상 master를 설정하는
항목만 입력하면 된다.

# slaveof  
slaveof localhost 6379

– slave 서비스 자동시작
기존 구성된 master의 /etc/initd.d/redis_<서비스포트> 파일을 카피한 후 편집하면 된다.
내용중 서비스 할 포트만 변경하고, 주의할 점은 시비스 종료설정 부분에서 현재 redis서비스가 인증번호를 설정한 후, 가동하게 되면
서비스 종료시 반드시 인증번호를 입력애야 처리된다.
기본으로 제공한 서비스 재시작 스크립트에서 해당 내용을 반영하여 저장한다.
굵게 표시된 부분을 추가하면 된다.

...
stop)
        if [ ! -f $PIDFILE ]
        then
            echo "$PIDFILE does not exist, process is not running"
        else
            PID=$(cat $PIDFILE)
            echo "Stopping ..."
            $CLIEXEC -p $REDISPORT -a pass1234 shutdown
            while [ -x /proc/${PID} ]
            do
                echo "Waiting for Redis to shutdown ..."
                sleep 1
            done
            echo "Redis stopped"
        fi
        ;;
...

– 서비스 확인
redis 를 접속하거나 테스트할수 있는 redis-cli를 이용하여 현재 서비스 되고 있는 master 및 slave를 확인한다.
우선 마스터 확인을 하여 굵게 표시된 항목이 나나타는지 확인한다.

moram:/etc/redis$ redis-cli -p 6379 -a pass1234
127.0.0.1:6379> info replication
# Replication
role:master
connected_slaves:1
slave0:ip=127.0.0.1,port=6380,state=online,offset=431055865,lag=1
master_replid:369d2a1176cf484f172c62b4ea0fe95a27d39a69
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:431055998
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:430007423
repl_backlog_histlen:1048576
127.0.0.1:6379> 

redis 슬레이브도 마찬가지로 굵게표시된 부분을 확인한다.

moram:/etc/redis$ redis-cli -p 6380 -a pass1234
127.0.0.1:6380> info replication
# Replication
role:slave
master_host:127.0.0.1
master_port:6379
master_link_status:up
master_last_io_seconds_ago:2
master_sync_in_progress:0
slave_repl_offset:431067009
slave_priority:100
slave_read_only:1
connected_slaves:0
master_replid:369d2a1176cf484f172c62b4ea0fe95a27d39a69
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:431067009
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:430018434
repl_backlog_histlen:1048576

2.2 redis sentinel 구성
redis의 서비스를 모니터링 한후, 서비스 장애시, 자동으로 master를 변경해주는 redis sentinel의 구성은
인증번호와 대성마스터 서버의 정보만 변경하여 사용하면 된다.
redis설치 후, 자동적으로 sentinel.conf파일이 만들어 지며 해당 내용을 변경한다. 환경설정 항목중 기본으로
설정되어진 이름은 mymaster이며 redis설치시 설정한 인정정보를 동일하게 등록하면 된다.

# Default is 30 seconds.
sentinel monitor mymaster 127.0.0.1 6379 1
sentinel down-after-milliseconds mymaster 5000
sentinel auth-pass mymaster pass1234

3. haproxy 구성
redis서비스 포트 앞에 haproxy를 두어서 로드발렌싱을 처리할 수 있으며, haproxy설정을 통하여 자동적으로 redis서비스
master/slave가 변경될 경우, 장애없이 원활하게 서비스 할 수 있도록 구성할 수 있다.
보통 haproxy가 설치되면 환경설정 파일은 /etc/haproxy/haproxy.conf 에 있으며, 해당 파일을 구성하여 운영한다.
특별히 주의할 점은 앞에서 redis replication 구성시 인증번호를 설정하는 부분을 추가하면 된다.

frontend mosaic_ft_redis
        bind *:6378 name redis
        default_backend mosaic_bk_redis

backend mosaic_bk_redis
        option tcp-check
        tcp-check connect
        tcp-check send AUTH\ pass1234\r\n
        tcp-check expect string +OK
        tcp-check send PING\r\n
        tcp-check expect string +PONG
        tcp-check send info\ replication\r\n
        tcp-check expect string role:master
        tcp-check send QUIT\r\n
        tcp-check expect string +OK
        server redis_6379 localhost:6379 check inter 1s
        server redis_6380 localhost:6380 check inter 1s