Тема: Redis cluster

Замечательный KV storage с кислой HA реализацией, пример как можно сделать правильную, дуракоупорную репликацию

3 сервера (на сам редис хватит и 2) Redis3 и 3 арбитра, на тех же серверах Sentinel3. Суть простая, настраивается репликация, и после этого sentinel начинает по ситуации обновлять конфиги, Свой тоже.

1 - 1.1.1.1
2 - 1.1.1.2
3 - 1.1.1.3

r1_redis.conf

#bind 127.0.0.1
protected-mode no
port 6379
...

r2_redis.conf

#bind 127.0.0.1
protected-mode no
port 6379
...
slaveof 1.1.1.1 6379

r3_redis.conf

#bind 127.0.0.1
protected-mode no
port 6379
...
slaveof 1.1.1.1 6379

То что закоментировано при старте не нужно и должно появится само, тут как пример оставил. Чем то напоминает конфигурацию CephFS.

r1_sentinel.conf

daemonize yes
pidfile "/var/run/redis/redis-sentinel.pid"
logfile "/var/log/redis/redis-sentinel.log"
port 16379
dir "/var/lib/redis"
protected-mode no
#sentinel myid 4809b5ae33b617b24e4ee061222a3cb11f4457cd
sentinel monitor redis-ha 1.1.1.1 6379 2
sentinel down-after-milliseconds redis-ha 3000
sentinel failover-timeout redis-ha 6000
#sentinel config-epoch redis-ha 24
#sentinel leader-epoch redis-ha 24
#sentinel known-slave redis-ha 1.1.1.2 6379
#sentinel known-slave redis-ha 1.1.1.3 6379
#sentinel known-sentinel redis-ha 1.1.1.2 16379 1316ff79cb3a4558119c53ca5038f86271683fa7
#sentinel known-sentinel redis-ha 1.1.1.3 16379 e36c6b59c49cbdc8f8056877a410644cda7a6255
#sentinel current-epoch 24

r2_sentinel.conf

daemonize yes
pidfile "/var/run/redis/redis-sentinel.pid"
logfile "/var/log/redis/redis-sentinel.log"
port 16379
dir "/var/lib/redis"
protected-mode no
#sentinel myid 1316ff79cb3a4558119c53ca5038f86271683fa7
sentinel monitor redis-ha 1.1.1.1 6379 2
sentinel down-after-milliseconds redis-ha 3000
sentinel failover-timeout redis-ha 6000
#sentinel config-epoch redis-ha 24
#sentinel leader-epoch redis-ha 24
#sentinel known-slave redis-ha 1.1.1.2 6379
#sentinel known-slave redis-ha 1.1.1.3 6379
#sentinel known-sentinel redis-ha 1.1.1.3 16379 e36c6b59c49cbdc8f8056877a410644cda7a6255
#sentinel known-sentinel redis-ha 1.1.1.1 16379 4809b5ae33b617b24e4ee061222a3cb11f4457cd
#sentinel current-epoch 24

r3_sentinel.conf

daemonize yes
pidfile "/var/run/redis/redis-sentinel.pid"
logfile "/var/log/redis/redis-sentinel.log"
port 16379
dir "/var/lib/redis"
protected-mode no
#sentinel myid e36c6b59c49cbdc8f8056877a410644cda7a6255
sentinel monitor redis-ha 1.1.1.1 6379 2
sentinel down-after-milliseconds redis-ha 3000
sentinel failover-timeout redis-ha 6000
#sentinel config-epoch redis-ha 24
#sentinel leader-epoch redis-ha 24
#sentinel known-slave redis-ha 1.1.1.2 6379
#sentinel known-slave redis-ha 1.1.1.3 6379
#sentinel known-sentinel redis-ha 1.1.1.2 16379 1316ff79cb3a4558119c53ca5038f86271683fa7
#sentinel known-sentinel redis-ha 1.1.1.1 16379 4809b5ae33b617b24e4ee061222a3cb11f4457cd
#sentinel current-epoch 24

Дальше нам нужен Haproxy, либо на самих редисах, либо на серврах аппликации, дело вкуса и политики.

...
listen redis-cluster-rw
        bind 127.0.0.10:6379
        mode tcp
        balance leastconn
        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 redis1-cluster1 1.1.1.1:6379 check inter 1s
        server redis2-cluster1 1.1.1.2:6379 check inter 1s
        server redis3-cluster1 1.1.1.3:6379 check inter 1s

listen redis-cluster-ro
        bind 127.0.0.11:6379
        mode tcp
        balance leastconn
        option tcp-check
        tcp-check connect
        tcp-check send PING\r\n
        tcp-check expect string +PONG
        tcp-check send QUIT\r\n
        tcp-check expect string +OK
        server redis1-cluster1 1.1.1.1:6379 check inter 1s
        server redis2-cluster1 1.1.1.2:6379 check inter 1s
        server redis3-cluster1 1.1.1.3:6379 check inter 1s
...

Все, проверка RW

# redis-cli -h 127.0.0.10 info replication | grep role
role:master
# redis-cli -h 127.0.0.10 info replication | grep role
role:master
# redis-cli -h 127.0.0.10 info replication | grep role
role:master

Проверка RO

# redis-cli -h 127.0.0.11 info replication | grep role
role:master
# redis-cli -h 127.0.0.11 info replication | grep role
role:slave
# redis-cli -h 127.0.0.11 info replication | grep role
role:slave
# redis-cli -h 127.0.0.11 info replication | grep role
role:master
# redis-cli -h 127.0.0.11 info replication | grep role
role:slave

Добавлено: 21-05-2018 10:01:15

Давно что-то я не писал, работает на ура, внес несколько изменений.

1. Чтобы уменьшить траффик - поставил локальный редис
2. Отделил слайв и мастер

но вот фрэймворк не умеет с такой конструкцией работать, пришлось ему помочь.

Haproxy:

listen redis-cluster-rw
        bind 127.0.0.1:6379
        mode tcp
        balance leastconn
        option tcplog
        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 redis-1 1.1.1.1:6379 check inter 2s backup
        server redis-2 1.1.1.2:6379 check inter 2s backup
        server redis-3 1.1.1.3:6379 check inter 2s backup

listen redis-cluster-ro
        bind 127.0.0.2:6379
        mode tcp
        balance leastconn
        option tcplog
        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 master_link_status:up
        tcp-check send QUIT\r\n
        tcp-check expect string +OK
        server redis-1 1.1.1.1:6379 check inter 2s
        server redis-2 1.1.1.2:6379 check inter 2s
        server redis-3 1.1.1.3:6379 check inter 2s
        server redis-rw 127.0.0.1:6379 backup

listen redis-local-ro
        bind 127.0.0.3:6379
        mode tcp
        balance leastconn
        option tcplog
        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 master_link_status:up
        tcp-check send QUIT\r\n
        tcp-check expect string +OK
        server redis-local 127.0.0.4:6379 check inter 2s
        server redis-ro 127.0.0.2:6379 backup

Ну и слайв редис на 127.0.0.4 который за мастер берет 127.0.0.2. APPS должен использовать

127.0.0.1 - rw
127.0.0.3 - ro