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高可用性環境導入レコード
    #    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