Redis HaProxy Failover

Привет,

Отдавна не съм писал нещо смислено в сайта… просто нямах муза :/

Днес ще споделя как бързо и лесно направих redis haproxy failover схема, а ето и цялата концепция :

  1. Два redis сървъра работещи на принцип master -> slave
  2. HaProxy което да следи за евентуално отпадане на master сървъра, и пускането на трафика към бекъпа (slave)

Конфигуриране на redis

Redis HaProxy FailOver
За направата на redis master->slave използвах тази статия, като тук е хубаво да се уточни, че статията е написана уж за redis cluster, но реално тя представлява проста схема на репликация между master и slave сървър! Единствената разлика която е примен е , че redis-server2 не работи на режим read-only :

slave-read-only no

Важно е да се изтества всичко дали е ок.
Пример :

redis-cli -a password -h redis-server1 monitor
redis-cli -a password -h redis-server2 monitor

или

redis-cli -a password -h redis-server1 info

и информацията за #Replication при нас трябва да изглежда така :

# Replication
role:master
connected_slaves:1
slave0:ip=221.221.221.221,port=6379,state=online,offset=44430235644,lag=0
master_repl_offset:44430235644
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:44429187069
repl_backlog_histlen:1048576

Конфигуриране на HaProxy

Redis HaProxy FailOver
Тук нещата изглеждат доста прости. Използвам ubuntu 14.04 и версия на haproxy 1.6 stable. Повече инфо тук.

Конфигурационният файл на redis haproxy сървъра ми изглежда така :

global
log /dev/log local0
log /dev/log local1 notice
chroot /var/lib/haproxy
stats socket /run/haproxy/admin.sock mode 660 level admin
stats timeout 30s
user haproxy
group haproxy
daemon

# Default SSL material locations
ca-base /etc/ssl/certs
crt-base /etc/ssl/private

# Default ciphers to use on SSL-enabled listening sockets.
# For more information, see ciphers(1SSL). This list is from:
# https://hynek.me/articles/hardening-your-web-servers-ssl-ciphers/
ssl-default-bind-ciphers ECDH+AESGCM:DH+AESGCM:ECDH+AES256:DH+AES256:ECDH+AES128:DH+AES:ECDH+3DES:DH+3DES:RSA+AESGCM:RSA+AES:RSA+3DES:!aNULL:!MD5:!DSS
ssl-default-bind-options no-sslv3

defaults REDIS
mode tcp
timeout connect 2s
timeout server 15s
timeout client 15s

frontend ft_redis
bind 0.0.0.0:6379 name redis
default_backend bk_redis

backend bk_redis
# mode tcp
option tcp-check
tcp-check connect
tcp-check send AUTH\ password\r\n
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-server1 123.123.123.123:6379 check inter 1s
server redis-server2 221.221.221.221:6379 check inter 1s backup

listen haproxy-web
bind 0.0.0.0:8181
mode http
stats enable
stats uri /
stats realm Strictly\ Private
stats auth admin:adminpassword
stats refresh 30s
# stats admin if TRUE

Така нашият haproxy сървър слуша на всичките ни айпи адреси на порт 6379 и проверява master сървъра ни redis-server1 на принципа на ауторизацията чрез парола „password“.

Ако връзката до redis-server1 отпадне, до 15 секунди пуска трафика към redis-server2. Това се конфигурира от настройките за timeout, но по-ниските такива ще доведат до евентуални проблеми, ако има смущения по трасето. Когато връзката до redis-server1 се възтанови, трафика към него се връща по старо му.

На порт 8181 пък върви статистика, която позволява да наблюдаваме заявките към сървърите ни в реално време. Потребителското име за нея е admin, а паролата : adminpassword.

Това е!