Comment mettre en place la haute disponibilité pour Redis

Comment mettre en place la haute disponibilité pour Redis

Découvrez comment mettre en place une architecture haute disponibilité pour Redis avec Sentinel et Keepalived.

Vue globale de la configuration

  • Système
    • Debian stable ( 8.x )
  • Kernel :
    • Paramétrages TCP, mémoire et du système de fichiers.
  • Redis
    • Serveur : tous les serveurs Redis pourront être maîtres ou esclaves
    • Sentinel : gère la bascule master/slave entre les serveurs en cas de panne
  • Keepalived
    • Placez l’IP de service (VRRP) sur le serveur Redis maître.

Redis

Installation des paquets redis-server et redis-tools

apt-get install redis-server  redis-tools

Configuration commune Redis

daemonize yes
pidfile "/var/run/redis/redis-server.pid"
port 6379
tcp-backlog 65535
timeout 0
tcp-keepalive 0
loglevel notice
logfile "/var/log/redis/redis.log"
databases 16
save 900 1
save 300 10
save 60 10000
stop-writes-on-bgsave-error yes
rdbcompression yes
rdbchecksum yes
dbfilename "dump.rdb"
dir "/var/lib/redis"
slave-serve-stale-data yes
slave-read-only yes
repl-disable-tcp-nodelay no
slave-priority 100
maxclients 10000
appendonly yes
appendfilename "appendonly.aof"
appendfsync everysec
no-appendfsync-on-rewrite no
auto-aof-rewrite-percentage 100
auto-aof-rewrite-min-size 64mb
aof-load-truncated yes
lua-time-limit 5000
slowlog-log-slower-than 10000
slowlog-max-len 128
latency-monitor-threshold 0
notify-keyspace-events ""
hash-max-ziplist-entries 512
hash-max-ziplist-value 64
list-max-ziplist-entries 512
list-max-ziplist-value 64
set-max-intset-entries 512
zset-max-ziplist-entries 128
zset-max-ziplist-value 64
hll-sparse-max-bytes 3000
activerehashing yes
client-output-buffer-limit normal 0 0 0
client-output-buffer-limit slave 256mb 64mb 60
client-output-buffer-limit pubsub 32mb 8mb 60
hz 10
aof-rewrite-incremental-fsync yes

Configuration commune aux deux serveurs Sentinel

Remplacez 192.168.1.2 par l’IP de l’autre serveur.

port 26379
daemonize yes

pidfile "/var/run/redis/redis-sentinel.pid"
loglevel notice
logfile "/var/log/redis/redis-sentinel.log"

dir "/tmp"
sentinel monitor redis_master 192.168.1.2 6379 2
sentinel failover-timeout redis_master 6000
sentinel config-epoch redis_master 1
sentinel leader-epoch redis_master 1

Keepalived

J’ai mis la même configuration, sur les différents nœuds, ils auront donc tous le même poids, le fonctionnement fait, qu’il n’y aura qu’un seul nœud à la fois OK vu de keepalied, tous les autres seront en dans l’état " fault "

Paramètres à modifier :

  • router_id : doit être unique par cluster Keepalived
  • virtual_ipaddress : IP de votre VRRP Redis
  • interface : si vous avez plusieurs cartes réseau
global_defs {
   router_id VRRP_REDIS
}

vrrp_script chk_redis {
    script "redis-cli info replication| grep 'role:master' 1>/dev/null 2>1"
    interval 2
}
vrrp_instance redis {
  interface eth0
  state MASTER
  advert_int 2
  virtual_router_id 2
  priority 101
  track_interface {
    eth0
  }

  virtual_ipaddress {
    192.168.1.100 dev eth0 label eth0:redis
  }

  track_script {
    chk_redis
  }
  notify /usr/local/bin/keepalived_notif.sh
}

Mon script pour générer un fichier d’état de Keepalived :

##!/bin/sh
MAILTO='[email protected]'

echo "<p>Dernier changement d'état : $(date +"%Y/%m/%d %H:%M : ") -> <u>$3</u></p>" > /tmp/keepalived.$2.state

case $3 in
    MASTER )
        echo 00 >> /tmp/keepalived.$2.state
        echo "Dernier changement d'état : $(date +"%Y/%m/%d %H:%M : ") -> $3" | mail -s "$(hostname -s ) - $2 - $3" $MAILTO
    ;;
    BACKUP )
        echo 11 >> /tmp/keepalived.$2.state
        echo "Dernier changement d'état : $(date +"%Y/%m/%d %H:%M : ") -> $3" | mail -s "$(hostname -s ) - $2 - $3" $MAILTO
    ;;
    FAULT )
        echo 22 >> /tmp/keepalived.$2.state
        echo "Dernier changement d'état : $(date +"%Y/%m/%d %H:%M : ") -> $3" | mail -s "$(hostname -s ) - $2 - $3" $MAILTO
        pkill -9 keepalived
    ;;
    * )
        echo 44 >> /tmp/keepalived.$2.state
    ;;
esac

Paramètres kernel

Paramètres liés à Keepalived ( permet d’écouter sur une ip inexistante, utile lors de la bascule)

net.ipv4.ip_nonlocal_bind=1

Paramètres liés à Redis

fs.file-max = 1000000
fs.nr_open = 1000000

vm.overcommit_memory=1
net.core.somaxconn=512

vm.swappiness=0
net.ipv4.tcp_sack=1
net.ipv4.tcp_timestamps=1
net.ipv4.tcp_window_scaling=1
net.ipv4.tcp_congestion_control=cubic
net.ipv4.tcp_syncookies=1
net.ipv4.tcp_tw_recycle=1

Dépôt

Tous les fichiers sont ici -> https://gitlab.com/pad92/redis-ha

Catégories : Linux 
Tags: Debian Astuce 

Suggestions de lecture :