Еще раз про Redis
В этот раз необходим Master-Slave с переключением роли. Коротко об этой СУБД - хранит все в памяти, но в отличии от memcache умеет скидывать на диск, Master-Slave и с версии 3 Redis-Cluster.
Установка из исходников
1) RDB - такой себе снапшот раз в определенный промежуток, удобство в том что на выходе у нас один файл находящийся в /var/lib/redis/6379, который можно бекапить, переносить и прочее. Также, согласно доке, из него быстро все поднимается. Из недостатков - это потеря последних данных.
2) AOF - лог изменений, который пишется согласно настройкам (по дефолту каждую сек), при восстановлении оно просто читает файл и выполняет все что там есть.
RDB
Сохранять каждые 60 сек если 1000 или более ключей изменилось
Всякий раз когда редис делает дамп он:
1) Делает форк
2) Форкнутый процесс пишет во временный rdb файл
3) По окончанию меняет старый на новый
AOF
После этой опции каждое изменение будет добавляться в лог, fsync для сброса на диск, можно настроить отдельно.
Для настройки слейва нужно указать в конфиге только
Узлы, запущеные без
На этом slave готов, но в данном виде оно мало пригодно. Нужен еще какой-то failover, для этого есть sentinel - это отдельный процесс, который мониторит redis и оповещает о его состоянии. Самое крутое что при падении мастера он занимается выбором нового мастера, оповещает клиентов о новом мастере, и обладает возможностью шаринга конфигов между узлами. Еще согласно доке, не рекомендуется использовать 2 sentinel'a/redis'a.
Стандартный конфиг есть в каталоге redis-3.0.3/sentinel.conf, в него достаточно добавить мастер который необходимо мониторить, все остальное добавится после обнаружения.
или
/etc/init.d/sentinel start
С помощью redis-cli также можно подключиться к sentinel'у и посмотреть состояние
И последнее, необходим балансировщик который будет направлять запросы к мастеру, для этого использую haproxy
Установка из исходников
apt-get install -y tk8.5 tcl8.5 wget http://download.redis.io/releases/redis-3.0.3.tar.gz tar xvfz redis-3.0.3.tar.gz cd redis-3.0.3/ make make test make install cd utils ./install_server.shНемного про сохранение данных, существует 2 варианта:
1) RDB - такой себе снапшот раз в определенный промежуток, удобство в том что на выходе у нас один файл находящийся в /var/lib/redis/6379, который можно бекапить, переносить и прочее. Также, согласно доке, из него быстро все поднимается. Из недостатков - это потеря последних данных.
2) AOF - лог изменений, который пишется согласно настройкам (по дефолту каждую сек), при восстановлении оно просто читает файл и выполняет все что там есть.
RDB
save 60 1000
Сохранять каждые 60 сек если 1000 или более ключей изменилось
Всякий раз когда редис делает дамп он:
1) Делает форк
2) Форкнутый процесс пишет во временный rdb файл
3) По окончанию меняет старый на новый
AOF
appendonly yes
После этой опции каждое изменение будет добавляться в лог, fsync для сброса на диск, можно настроить отдельно.
Для настройки слейва нужно указать в конфиге только
slaveof 192.168.1.1 6379
Узлы, запущеные без
slaveof
, являются мастером. После перезапускаем redis, и смотримredis-cli info replication
На этом slave готов, но в данном виде оно мало пригодно. Нужен еще какой-то failover, для этого есть sentinel - это отдельный процесс, который мониторит redis и оповещает о его состоянии. Самое крутое что при падении мастера он занимается выбором нового мастера, оповещает клиентов о новом мастере, и обладает возможностью шаринга конфигов между узлами. Еще согласно доке, не рекомендуется использовать 2 sentinel'a/redis'a.
Стандартный конфиг есть в каталоге redis-3.0.3/sentinel.conf, в него достаточно добавить мастер который необходимо мониторить, все остальное добавится после обнаружения.
/etc/redis/sentinel.conf
port 26379 dir /tmp logfile "/var/log/sentinel.log" sentinel monitor mymaster 192.168.1.1 6379 2 sentinel down-after-milliseconds mymaster 10000 sentinel failover-timeout mymaster 60000 sentinel parallel-syncs mymaster 1Для запуска
redis-sentinel /etc/redis/sentinel.conf
или
/etc/init.d/sentinel start
С помощью redis-cli также можно подключиться к sentinel'у и посмотреть состояние
redis-cli -p 26379
127.0.0.1:26379> sentinel master mymaster
127.0.0.1:26379> info
И последнее, необходим балансировщик который будет направлять запросы к мастеру, для этого использую haproxy
/etc/haproxy/haproxy.conf
global log 127.0.0.1 local0 log 127.0.0.1 local1 notice maxconn 4096 user haproxy group haproxy daemon defaults log global mode http option tcplog option dontlognull retries 3 option redispatch maxconn 2000 timeout connect 5000 timeout client 1800000 timeout server 1800000 frontend stats-front bind *:81 mode http default_backend stats-back backend stats-back mode http balance roundrobin stats uri /haproxy/stats stats auth user:password frontend ft_redis bind 127.0.0.1:6380 name redis mode tcp default_backend bk_redis backend bk_redis mode tcp option tcp-check tcp-check connect 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.1.1:6379 check inter 1s server R2 192.168.1.2:6379 check inter 1s