CentOS下Redis高可用安裝筆記
(WJW)Redis高可用安裝筆記
[x] 安裝環境介紹:
Master: T1
</blockquote>
Slave: T2
VIP: 192.168.68.45
[x] 安裝Redis(Master,Slave)
注意: 安裝redis前flushall的修改
查找src/redis.c文件,把
`{"flushdb",flushdbCommand,1,"w",0,NULL,0,0,0,0,0},` `{"flushall",flushallCommand,1,"w",0,NULL,0,0,0,0,0},`修改成:
`{"xflushdb",flushdbCommand,1,"w",0,NULL,0,0,0,0,0},` `{"xflushall",flushallCommand,1,"w",0,NULL,0,0,0,0,0},`</blockquote>vi /etc/sysctl.conf 添加一行:vm.overcommit_memory=1
mkdir /opt/redis mkdir /opt/redis/log mkdir /opt/redis/db
tar zxvf ./redis-2.8.17.tar.gz cd redis-2.8.17 make PREFIX=/opt/redis install</pre>
[x] Redis啟動腳本(Master,Slave):/opt/redis/bin/startRedis.sh
#!/bin/bashbasedir=
dirname $0
echo "Redis BASE DIR:$basedir" cd $basedirnohup ./redis-server ./redis.conf > /dev/null 2>&1 &</pre>
[x] Redis停止腳本(Master,Slave):/opt/redis/bin/StopRedis.sh
#!/bin/shbasedir=
dirname $0
echo "Redis BASE DIR:$basedir" cd $basedir./redis-cli -h localhost -a 123456 shutdown</pre>
[x] Redis配置文件(Master,Slave):/opt/redis/bin/redis.conf
#requirepass 123456pidfile /opt/redis/bin/redis.pid logfile /opt/redis/log/redis.log dir /opt/redis/db/
daemonize yes port 6379 timeout 300 loglevel warning databases 16 maxmemory 1g
不要快照
save 900 1
save 300 10
save 60 10000
rdbcompression yes
dbfilename dump.rdb
使用AOF
appendonly yes appendfsync everysec</pre>
[x] 安裝Keepalived(Master,Slave):
#wget http://www.keepalived.org/software/keepalived-1.2.13.tar.gz tar zxvf keepalived-1.2.13.tar.gz cd ./keepalived-1.2.13 ./configure make make installcp /usr/local/etc/rc.d/init.d/keepalived /etc/rc.d/init.d/ cp /usr/local/etc/sysconfig/keepalived /etc/sysconfig/ cp /usr/local/sbin/keepalived /usr/sbin/ mkdir /etc/keepalived cp /usr/local/etc/keepalived/keepalived.conf /etc/keepalived/ chkconfig --add keepalived
chkconfig --level 35 keepalived on
service keepalived start</pre>
[x] notify_*解釋
Keepalived在轉換狀態時會依照狀態來呼叫: 當進入Master狀態時會呼叫notify_master 當進入Backup狀態時會呼叫notify_backup 當發現異常情況時(track_script,track_interface失敗)進入Fault狀態呼叫notify_fault 當Keepalived程序終止時則呼叫notify_stop[x] 在Master上創建如下配置文件:
vim /etc/keepalived/keepalived.conf
! Configuration File for keepalivedglobal_defs { notification_email { root@localhost } notification_email_from root@localhost smtp_server localhost smtp_connect_timeout 30 router_id LVS_REDIS }
vrrp_script chk_redis { script "/etc/keepalived/scripts/redis_check.sh" ###監控腳本 interval 2 ###監控時間 }
vrrp_instance VI_1 { nopreempt ###不搶占,防止腦裂 state MASTER #備的是BACKUP interface br0 virtual_router_id 51 priority 100 #備的是90 advert_int 1 authentication { auth_type PASS auth_pass redis } virtual_ipaddress { 192.168.68.45 }
track_script { chk_redis ###執行上面定義的chk_redis } notify_master /etc/keepalived/scripts/redis_master.sh notify_backup /etc/keepalived/scripts/redis_backup.sh notify_fault /etc/keepalived/scripts/redis_fault.sh notify_stop /etc/keepalived/scripts/redis_stop.sh
}</pre>
[x] 在Slave上創建如下配置文件:
vim /etc/keepalived/keepalived.conf
! Configuration File for keepalivedglobal_defs { notification_email { root@localhost } notification_email_from root@localhost smtp_server localhost smtp_connect_timeout 30 router_id LVS_REDIS }
vrrp_script chk_redis { script "/etc/keepalived/scripts/redis_check.sh" ###監控腳本 interval 2 ###監控時間 }
vrrp_instance VI_1 { nopreempt ###不搶占,防止腦裂 state BACKUP #備的是BACKUP interface br0 virtual_router_id 51 priority 90 #備的是90 advert_int 1 authentication { auth_type PASS auth_pass redis } virtual_ipaddress { 192.168.68.45 }
track_script { chk_redis ###執行上面定義的chk_redis } notify_master /etc/keepalived/scripts/redis_master.sh notify_backup /etc/keepalived/scripts/redis_backup.sh notify_fault /etc/keepalived/scripts/redis_fault.sh notify_stop /etc/keepalived/scripts/redis_stop.sh
}</pre>
[x] 在Master和Slave上創建監控Redis的腳本:
mkdir /etc/keepalived/scripts/
vi /etc/keepalived/scripts/redis_check.sh#!/bin/bashC_DATE=
date +"[%Y-%m-%d %H:%M:%S]"
ALIVE=/opt/redis/bin/redis-cli PING
if [ "$ALIVE" == "PONG" ]; then echo "${C_DATE} $ALIVE" exit 0 else echo "${C_DATE} $ALIVE" exit 1 fi</pre>
[x] 在Master與Slave創建如下腳本notify_fault和notify_stop:
vim /etc/keepalived/scripts/redis_fault.sh
#!/bin/bashC_DATE=
date +"[%Y-%m-%d %H:%M:%S]"
LOGFILE=/var/log/keepalived-redis-state.logecho "${C_DATE} [fault]" >> $LOGFILE</pre>
vim /etc/keepalived/scripts/redis_stop.sh
#!/bin/bashC_DATE=
date +"[%Y-%m-%d %H:%M:%S]"
LOGFILE=/var/log/keepalived-redis-state.logecho "${C_DATE} [stop]" >> $LOGFILE</pre>
[x] 在Master上創建notity_master與notify_backup腳本:
vim /etc/keepalived/scripts/redis_master.sh
#!/bin/bashC_DATE=
date +"[%Y-%m-%d %H:%M:%S]"
REDISCLI="/opt/redis/bin/redis-cli" LOGFILE="/var/log/keepalived-redis-state.log"echo "${C_DATE} [master]" >> $LOGFILE
當keepalived配置為"搶占式"時,打開下面注釋
echo "Being master...." >> $LOGFILE 2>&1
echo "Run SLAVEOF cmd ..." >> $LOGFILE
$REDISCLI SLAVEOF T2 6379 >> $LOGFILE 2>&1
sleep 10 #延遲10秒以后待數據同步完成后再取消同步狀態
echo "Run SLAVEOF NO ONE cmd ..." >> $LOGFILE $REDISCLI SLAVEOF NO ONE >> $LOGFILE 2>&1</pre>
vim /etc/keepalived/scripts/redis_backup.sh
#!/bin/bashC_DATE=
date +"[%Y-%m-%d %H:%M:%S]"
REDISCLI="/opt/redis/bin/redis-cli" LOGFILE="/var/log/keepalived-redis-state.log"echo "${C_DATE} [backup]" >> $LOGFILE
當keepalived配置為"搶占式"時,打開下面注釋
echo "Being slave...." >> $LOGFILE 2>&1
sleep 15 #延遲15秒待數據被對方同步完成之后再切換主從角色
echo "Run SLAVEOF cmd ..." >> $LOGFILE $REDISCLI SLAVEOF T2 6379 >> $LOGFILE 2>&1</pre>
[x] 在Slave上創建notity_master與notify_backup腳本:
vim /etc/keepalived/scripts/redis_master.sh
#!/bin/bashC_DATE=
date +"[%Y-%m-%d %H:%M:%S]"
REDISCLI="/opt/redis/bin/redis-cli" LOGFILE="/var/log/keepalived-redis-state.log"echo "${C_DATE} [master]" >> $LOGFILE
當keepalived配置為"搶占式"時,打開下面注釋
echo "Being master...." >> $LOGFILE 2>&1
echo "Run SLAVEOF cmd ..." >> $LOGFILE
$REDISCLI SLAVEOF T1 6379 >> $LOGFILE 2>&1
sleep 10 #延遲10秒以后待數據同步完成后再取消同步狀態
echo "Run SLAVEOF NO ONE cmd ..." >> $LOGFILE $REDISCLI SLAVEOF NO ONE >> $LOGFILE 2>&1</pre>
vim /etc/keepalived/scripts/redis_backup.sh
#!/bin/bashC_DATE=
date +"[%Y-%m-%d %H:%M:%S]"
REDISCLI="/opt/redis/bin/redis-cli" LOGFILE="/var/log/keepalived-redis-state.log"echo "${C_DATE} [backup]" >> $LOGFILE
當keepalived配置為"搶占式"時,打開下面注釋
echo "Being slave...." >> $LOGFILE 2>&1
sleep 15 #延遲15秒待數據被對方同步完成之后再切換主從角色
echo "Run SLAVEOF cmd ..." >> $LOGFILE $REDISCLI SLAVEOF T1 6379 >> $LOGFILE 2>&1</pre>
[x] 在Master和Slave上,給監控腳本都加上可執行權限:
chmod +x /etc/keepalived/scripts/*.sh
[x] 啟動步驟:
啟動Master上的Redis
/opt/redis/bin/startRedis.sh啟動Slave上的Redis
/opt/redis/bin/startRedis.sh啟動Master上的Keepalived
service keepalived start啟動Slave上的Keepalived
service keepalived start