Once in a Lifetime

04. Redis - HaProxy 스위치 설정 본문

Develope Diary

04. Redis - HaProxy 스위치 설정

riceworld 2016. 3. 2. 08:25

Sentinel 을 이용하여 Master 서버가 Down 되더라도 Slave 를 자동으로 Master 로 승격시켜 Failover 처리를 할수 있게 되었지만, 클라이언트측에서는 어떤 Slave 가 Master 로 승격되었는지 알 길이 없습니다. 동일한 접속을 보장하기 위해서 HaProxy 를 사용하여 Master 서버는 5000 번, Slave 서버는 5001 번으로 바인딩 해주는 작업을 해보겠습니다.


HaProxy 설치


yum -y install haproxy


HaProxy 가 설치되는 서버에 필요한 방화벽 Port 들을 열어줍니다. Redis 접속을 위한 6379, 클라이언트 접속을 위한 5000, 5001과 모니터링툴을 위한 80 포트까지 열어 줍니다.


firewall-cmd --permanent --zone=public --add-port=6379/tcp

firewall-cmd --permanent --zone=public --add-port=5000/tcp

firewall-cmd --permanent --zone=public --add-port=5001/tcp
firewall-cmd --permanent --zone=public --add-port=80/tcp
firewall-cmd --reload


HaProxy 설정 파일을 구성합니다. 설정파일의 구성은 크게 프런트엔드와 백엔드의 구성으로 나뉩니다.

프런트엔드는 실제로 클라이언트가 접속하는 5000, 5001번 포트에 대한 구성이고, 백엔드는 각각의 프런트엔드의 하위에 실제로 물려있는 서버들의 정보들을 구성해 줍니다.


nano /etc/haproxy/haproxy.cfg


- 디폴트 설정

defaults REDIS

mode tcp

timeout connect 4s

timeout server 15s

timeout client 15s

timeout tunnel 365d


- 프런트엔드 설정 (Master)

frontend ft_redis_master

bind *:5000 name redis

default_backend bk_redis_master


- 백엔드 설정 (Master)

backend bk_redis_master

option tcp-check

tcp-check send AUTH\ mypassword\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 R1 192.168.xx.xxx:6379 check inter 1s

server R2 192.168.xx.xxx:6379 check inter 1s

server R3 192.168.xx.xxx:6379 check inter 1s


- 프런트엔드 설정 (Slave)

frontend ft_redis_slave

bind *:5001 name redis

default_backend bk_redis_slave


- 백엔드 설정 (Slave)

backend bk_redis_slave

option tcp-check

tcp-check send AUTH\ mypassword\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:slave

tcp-check send QUIT\r\n

tcp-check expect string +OK

server R1 192.168.xx.xxx:6379 check inter 1s

server R2 192.168.xx.xxx:6379 check inter 1s

server R3 192.168.xx.xxx:6379 check inter 1s


- 헬스체크 모니터링 페이지

listen stats 0.0.0.0:80

mode http

blance

timeout client 5000

timeout connect 4000

timeout server 300000

stats uri /stats

stats realm HAProxy\ Statistics

stats auth myadminid:myadminpassword

stats admin if TRUE



HaProxy 가 Master/Slave 판단을 위해서 간단한 스크립트(tcp-check)를 실행하여 Master/Slave 유무를 판단하고 있습니다. 이때 서버 인증을 위한 패스워드가 스크립트 실행에 영향을 줄수 있는 문자(Ex. $)가 있는 경우 체크에 실패하니 유의하시길 바랍니다.


HaProxy 는 별도의 로그 파일을 자동으로 생성하지 않기에, Log 파일 생성을 위해 아래와 같이 구성해 줍니다.


nano /etc/rsyslog.conf


$ModLoad imudp

$UDPServerRun 514

$UDPServerAddress 127.0.0.1


nano /etc/rsyslog.d/haproxy.conf


local2.* /var/log/haproxy.log

local2.=info /var/log/haproxy-info.log

local2.notice /var/log/haproxy-allbutinfo.log


로그 구성을 위한 설정 파일을 수정했으니, rsyslog 를 재시작 해줍니다.


systemctl restart rsyslog


HaProxy 의 모든 설정이 끝났습니다. 서비스를 시작해 봅니다.


systemctl start haproxy.service

systemctl enable haproxy.service


이상없이 서비스가 실행되었으면, 모니터링 페이지에서 확인해 봅니다.


http://local/stats



이제 클라이언트에서 5000 을 통해 Master 서버에, 5001 을 통해서 Slave 서버에 연결할 수 있게 되었습니다.

다음 포스트에서는 HaProxy 의 HA 구성을 위해 Keepalived 를 사용하여 이중화 하도록 하곘습니다.



Comments