Redis-2090225-Ubuntu Redis主従HAwith KeepAlived
Intro
前回の記事のデータベースHAに続き、今回はRedis主従モードを行います.
Problem & Mark
RedisにはHAのパターンがたくさんあります. Redis Centinelクラスタ+イントラネットDNS+カスタムスクリプト Redis Centinelクラスタ+VIP+カスタムスクリプト カプセル化クライアント直結Redis SentinelポートJedisSentinelPool、Java PHPに適したphpredisに基づく自己カプセル化 Redis Centinelクラスタ+Keepalived/Haproxy Redis M/S + Keepalived Redis Cluster Twemproxy Codis
以上の参考:Redis高可用性の実践
最も簡単な主を選んで2台のKeepAlivedから制御して、2台の機械だけが遊ぶことができて、一応このように設計しましょう.
Solution
以下のインストール方法の主な参考:Redis+Keepalived高可用性環境導入レコード
次のKeepAlivedセクションの主な参照:Redis+Keepalived高可用性スキームの詳細分析
前回の記事のデータベースHAに続き、今回はRedis主従モードを行います.
Problem & Mark
RedisにはHAのパターンがたくさんあります.
以上の参考:Redis高可用性の実践
最も簡単な主を選んで2台のKeepAlivedから制御して、2台の機械だけが遊ぶことができて、一応このように設計しましょう.
Solution
以下のインストール方法の主な参考:Redis+Keepalived高可用性環境導入レコード
# redis
apt-get -y install redis-server
# master /etc/redis/redis.conf
.......
port 6379
.......
daemonize yes # yes
.......
bind 0.0.0.0 # 。 ip redis。 0.0.0.0; 127.0.0.1, ! 0.0.0.0 ip
......
# slave /etc/redis/redis.conf
port 6379
daemonize yes
bind 0.0.0.0
slaveof master_ip 6379
# redis
systemctl restart redis
# redis
# master
root@master:~# redis-cli info|grep ^role
role:master
root@master:~# redis-cli info replication
# Replication
role:master
connected_slaves:1
slave0:ip=slave_ip,port=6379,state=online,offset=1275,lag=1
master_repl_offset:1275
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:2
repl_backlog_histlen:1274
# slave
root@slave:/var/log/mysql# redis-cli info|grep ^role
role:slave
root@slave:/var/log/mysql# redis-cli info replication
# Replication
role:slave
master_host:master_ip
master_port:6379
master_link_status:up
master_last_io_seconds_ago:9
master_sync_in_progress:0
slave_repl_offset:1275
slave_priority:100
slave_read_only:1
connected_slaves:0
master_repl_offset:0
repl_backlog_active:0
repl_backlog_size:1048576
repl_backlog_first_byte_offset:0
repl_backlog_histlen:0
次のKeepAlivedセクションの主な参照:Redis+Keepalived高可用性スキームの詳細分析
# master keepalived
global_defs {
router_id master
}
vrrp_script check_redis_run {
script "/opt/redis_ha/redis_check.sh"
interval 30
}
vrrp_instance redis {
state BACKUP
interface eth0
virtual_router_id 52
priority 100
advert_int 1
nopreempt
authentication {
auth_type PASS
auth_pass 2222
}
track_script {
check_redis_run
}
notify_master /opt/redis_ha/master.sh
notify_backup /opt/redis_ha/backup.sh
notify_stop /opt/redis_ha/stop.sh
virtual_ipaddress {
vip_x.x.x.x
}
}
# slave keepalived
global_defs {
router_id slave
}
vrrp_script check_redis_run {
script "/opt/redis_ha/redis_check.sh"
interval 30
}
vrrp_instance redis {
state BACKUP
interface eth0
virtual_router_id 52
priority 90
advert_int 1
nopreempt
authentication {
auth_type PASS
auth_pass 2222
}
track_script {
check_redis_run
}
notify_master /opt/redis_ha/master.sh
notify_backup /opt/redis_ha/backup.sh
notify_stop /opt/redis_ha/stop.sh
virtual_ipaddress {
vip_x.x.x.x
}
}
# redis_check.sh
#!/bin/bash
###/etc/keepalived/scripts/redis_check.sh
. /root/.bash_profile
HOST="local_ip"
ALIVE=`/usr/bin/redis-cli -h $HOST -p 6379 ping`
if [ "$ALIVE" == "PONG" ]; then
exit 0
else
systemctl stop keepalived
exit 1
fi
# master.sh
#!/bin/bash
REDISCLI="redis-cli"
LOGFILE="/var/keepalived/log/redis-state.log"
pid=$$
master="another_ip"
echo "`date +'%Y-%m-%d:%H:%M:%S'`|$pid|state:[slaver]" >> $LOGFILE
echo "`date +'%Y-%m-%d:%H:%M:%S'`|$pid|state:[slaver] Run 'SLAVEOF $master 6379'" >> $LOGFILE
$REDISCLI SLAVEOF $master 6379 >> $LOGFILE 2>&1
echo "`date +'%Y-%m-%d:%H:%M:%S'`|$pid|state:[slaver] wait 10 sec for data sync from old master" >> $LOGFILE
sleep 10
echo "`date +'%Y-%m-%d:%H:%M:%S'`|$pid|state:[slaver] data rsync from old mater ok..." >> $LOGFILE
echo "`date +'%Y-%m-%d:%H:%M:%S'`|$pid|state:[master] Run slaveof no one,close master/slave" >> $LOGFILE
$REDISCLI SLAVEOF NO ONE >> $LOGFILE 2>&1
echo "`date +'%Y-%m-%d:%H:%M:%S'`|$pid|state:[master] wait other slave connect...." >> $LOGFILE
# backup.sh / fault.sh / stop.sh
#!/bin/bash
REDISCLI="redis-cli"
LOGFILE="/var/keepalived/log/redis-state.log"
pid=$$
master="another_ip"
echo "`date +'%Y-%m-%d:%H:%M:%S'`|$pid|state:[master]" >> $LOGFILE
echo "`date +'%Y-%m-%d:%H:%M:%S'`|$pid|state:[master] Being slave state..." >> $LOGFILE 2>&1
echo "`date +'%Y-%m-%d:%H:%M:%S'`|$pid|state:[master] wait 10 sec for data sync from old master" >> $LOGFILE
sleep 10
echo "`date +'%Y-%m-%d:%H:%M:%S'`|$pid|state:[master] data rsync from old mater ok..." >> $LOGFILE
echo "`date +'%Y-%m-%d:%H:%M:%S'`|$pid|state:[slaver] Run 'SLAVEOF $master 6379'" >> $LOGFILE
$REDISCLI SLAVEOF $master 6379 >> $LOGFILE 2>&1
echo "`date +'%Y-%m-%d:%H:%M:%S'`|$pid|state:[slaver] slave connect to $master ok..." >> $LOGFILE
# KeepAlived , ,/var/log/messages ; systemctl status keepalived -l
systemctl restart keepalived
2 23 14:47:46 hostname Keepalived_vrrp[11203]: VRRP_Instance(mysql) Entering BACKUP STATE
2 23 14:47:46 hostname Keepalived_vrrp[11203]: Opening script file /opt/mysql_ha/backup.sh
2 23 14:47:46 hostname Keepalived_vrrp[11203]: VRRP_Instance(redis) Entering BACKUP STATE
2 23 14:47:46 hostname Keepalived_vrrp[11203]: Opening script file /opt/redis_ha/backup.sh
2 23 14:47:46 hostname Keepalived_healthcheckers[11202]: Registering Kernel netlink reflector
2 23 14:47:46 hostname Keepalived_healthcheckers[11202]: Registering Kernel netlink command channel
2 23 14:47:46 hostname Keepalived_healthcheckers[11202]: Opening file '/etc/keepalived/keepalived.conf'.
2 23 14:47:46 hostname Keepalived_healthcheckers[11202]: Using LinkWatch kernel netlink reflector...
2 23 14:47:46 hostname Keepalived_vrrp[11203]: VRRP_Script(check_redis_run) succeeded
2 23 14:47:46 hostname Keepalived_vrrp[11203]: VRRP_Script(check_mysql_run) succeeded