Еще раз про Redis

В этот раз необходим Master-Slave с переключением роли. Коротко об этой СУБД - хранит все в памяти, но в отличии от memcache умеет скидывать на диск, Master-Slave и с версии 3 Redis-Cluster.
Установка из исходников
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