Redis HaProxy Failover
Привет,
Отдавна не съм писал нещо смислено в сайта… просто нямах муза :/
Днес ще споделя как бързо и лесно направих redis haproxy failover схема, а ето и цялата концепция :
- Два redis сървъра работещи на принцип master -> slave
- HaProxy което да следи за евентуално отпадане на master сървъра, и пускането на трафика към бекъпа (slave)
Конфигуриране на redis
За направата на 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
Тук нещата изглеждат доста прости. Използвам 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.
Това е!