1 Redis簡介及安裝
Redis是一個開源,先進的key-value存儲,並用於構建高性能,可擴展的Web應用程序的完美解決方案。
Redis從它的許多競爭繼承來的三個主要特點:
Redis數據庫完全在內存中,使用磁盤僅用於持久性。
相比許多鍵值數據存儲,Redis擁有一套較為豐富的數據類型。
Redis可以將數據復制到任意數量的從服務器。
1.1 REDIS優勢
異常快速:Redis的速度非常快,每秒能執行約11萬集合,每秒約81000+條記錄。
支持豐富的數據類型:Redis支持最大多數開發人員已經知道像列表,集合,有序集合,散列數據類型。這使得它非常容易解決各種各樣的問題,因為我們知道哪些問題是可以處理通過它的數據類型更好。
操作都是原子性:所有Redis操作是原子的,這保證了如果兩個客戶端同時訪問的Redis服務器將獲得更新后的值。
多功能實用工具:Redis是一個多實用的工具,可以在多個用例如緩存,消息,隊列使用(Redis原生支持發布/訂閱),任何短暫的數據,應用程序,如Web應用程序會話,網頁命中計數等。
1.2 REDIS安裝
在redis官網下載最新的源碼包
http://download.redis.io/releases/redis-2.8.3.tar.gz
- 解壓
# tar xzf redis-3.0.0.tar.gz
- 拷貝目錄
# mv redis-3.0.0 /usr/local/redis
- 進入目錄
# cd /usr/local/redis
- 編譯
# make && make install
- 查看命令運行結果,如果是0則是成功
# echo $?
1.3 REDIS啟動
# redis-server
第一次啟動時可能會有提示的warning信息;可以忽略,但最好是按照提示的處理辦法修改。
1.4 REDIS客戶端啟動
# redis-cli
1.5 驗證客戶端操作
# redis> set iom dtsoft
OK
# redis> get iom
“dtsoft”
2 主從自動切換原理
2.1 場景描述
假設有兩台服務器A,B,A為主節點,B為從節點,每台上都裝有keepalived和redis,並且已為keepalived分配一個VIP,下面分兩種情況討論:
B-redis掛掉
VIP仍為A服務器占用,用戶讀寫不受任何影響,B-keepalived檢測到B-redis掛掉后自動關掉本身服務(其實也可以不關掉keepalived服務,此處是為了盡量保持和A-keepalived相同的配置);問題修復后,以從機配置文件啟動B-redis,啟動B-keepalived, A、B兩節點回到初始狀態。
A-redis掛掉
A-keepalived檢測到A-redis掛掉后自動關掉本身服務,VIP被B服務器占用,B-redis設置為主節點;問題修復后,A-redis以從機配置文件重啟並自動同步B-redis數據,同步完成后開啟A-keepalived, VIP重回A 服務器,A-redis設置成主節點, B-redis設置為A-redis的從節點,A、B兩節點回到初始狀態
2.1 切換要求
- A,B上的keepalived要能在本服務器上的redis掛掉后關掉本身服務。
- 不論A-redis還是B-redis,都是以從機配置文件重啟(第一次安裝,或兩個服務都宕掉重啟等特殊情況例外);
- A-reids必須在同步完成后才能開啟keepalived;
- A-redis必須在本服務器獲得VIP后,設置為主節點;
- 丟失VIP的服務器要將本機上的redis置為從節點(如果redis還沒掛)。
1,4,5可以用keepalived的配置腳本解決,2,3可以自己編寫主從啟動腳本控制。
3 keepalived配置
3.1 A-keepalived配置
紅字為手工加的備注,原文件里沒有。
vi /etc/keepalived/keepalived.cnf文件
global_defs {
router_id LVS_MASTER
}
vrrp_script monitor_redis {
script “/etc/keepalived/script/redis_monitor.sh” –檢查redis服務狀態腳本;
interval 3
}
vrrp_instance VI_1 {
state MASTER
interface eth0
virtual_router_id 51
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
track_script {
monitor_redis –檢查redis服務狀態腳本;
}
virtual_ipaddress {
192.168.10.251 #virtual server
}
notify_backup /etc/keepalived/script/redis_backup.sh –keepalived變為從節點(丟失VIP)后執行的腳本
notify_master /etc/keepalived/script/redis_master.sh — keepalived變為主節點(獲得VIP)后執行的腳本
}
3.2 B-keepalived配置
vi /etc/keepalived/keepalived.cnf文件
global_defs {
router_id LVS_BACKUP
}
vrrp_script monitor_redis {
script “/etc/keepalived/script/redis_monitor.sh” –檢查redis服務狀態腳本;
interval 3
}
vrrp_instance VI_1 {
state BACKUP
interface eth0
virtual_router_id 51
priority 99
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
track_script {
monitor_redis –檢查redis服務狀態腳本;
}
virtual_ipaddress {
192.168.10.251 #virtual server
}
notify_backup /etc/keepalived/script/redis_backup.sh –keepalived變為從節點(丟失VIP)后執行的腳本
notify_master /etc/keepalived/script/redis_master.sh — keepalived變為主節點(獲得VIP)后執行的腳本
}
4 REDIS配置
我們是根據keepalived自動切換VIP的原理來實現redis主從切換,每次切換,主從角色都會調換,因此兩台兩台機子上都要編寫主從配置文件。
4.1 編輯主節點配置文件
# vim redis.conf
daemonize yes –進程后台啟動
logfile /usr/local/redis/redis.log –日志文件
syslog-enabled no –日志不寫進系統日志
dir /usr/local/redis/data –數據文件存放
requirepass system –認證密碼
slave-server-stale-data no –同步未完成從機不能接收除slaveof和info之外的命令,相當重要
4.2 編輯從節點配置文件
# vim redis_slave.conf
daemonize yes
logfile /usr/local/redis/redis.log
syslog-enabled no
dir /usr/local/redis/data
slaveof 192.168.10.3 6379 –主服務器的IP(兩台機器不同)地址和端口
masterauth system –主服務器上的認證密碼
slave-server-stale-data no –同步未完成從機不能接收除slaveof和info之外的命令,相當重要
5 編寫腳本
5.1 A服務器redis啟動腳本:
#!/bin/bash
export CONFIGPATH=/usr/local/redis/redis_slave.conf
export REDISPATH=/usr/local/redis/src
export REDISPASS=system
export result=123
export RESULT=0
export VIP=192.168.10.251
export SLAVEIP=192.168.10.3
killall -9 redis-server
#scp $REDISPATH/flag xf7023@$SLAVEIP:$REDISPATH
echo “start redis-server with $CONFIGPATH”
nohup $REDISPATH/redis-server $CONFIGPATH 2>nohup.out
until [ “$result” = “$RESULT” ]
do
export RESULT=`redis-cli -a $REDISPASS<<EOF
get iom
EOF`
echo “RESULT=$RESULT,SYNC…, wait 10s…”
sleep 10
done
killall -9 keepalived
sleep 5
echo “start keepalived”
service keepalived start
sleep 10
echo “VIP get?”
ip a|sed -n ‘/inet addr/p’|grep $VIP
#until [ “$?” = “0” ]
#do
#ip a|sed -n ‘/inet/p’|grep $VIP
#done
if [ “$?” == “0” ];then
echo $(ip a)
fi
echo “set slaveof master”
redis-cli -a $REDISPASS <<EOF
slaveof no one
EOF
exit 0
5.2 redis_monitor.sh
#/bin/bash
export LOGFILE=/etc/keepalived/log/alive_state.log
export ALIVE=$(/usr/local/redis/src/redis-cli -a system PING)
echo “ALIVE=$ALIVE” >>$LOGFILE
if [ “$ALIVE” = “PONG” ]; then
echo $ALIVE
exit 0
else
echo “killall -9 keepalived”>>$LOGFILE
echo $ALIVE
killall -9 keepalived
exit 1
fi
5.3 redis_master.sh
#!/bin/bash
export REDISPATH=/usr/local/redis/src
export REDISPASS=system
export LOGFILE=”/etc/keepalived/log/alive_state.log”
date >> $LOGFILE
echo “set master ” >> $LOGFILE
echo “run slaveof no one cmd …”
$REDISPATH/redis-cli -a $REDISPASS slaveof no one
5.4 redis_backup.sh
#!/bin/bash
export REDISPATH=/usr/local/redis/src
export REDISPASS=system
export REDISMASTER=”192.168.10.3 6379″ –redis主節點地址,A,B兩服務器不同,注意區別
export LOGFILE=”/etc/keepalived/log/alive_state.log”
date >> $LOGFILE
echo “set back up ” >> $LOGFILE
echo “MASTER:$REDISMASTER”>>$LOGFILE
echo “run slaveof cmd …”
$REDISPATH/redis-cli -a $REDISPASS slaveof $REDISMASTER
6 系統測試
6.1.1 測試環境
VIP:192.168.10.251
A機器IP:192.168.10.2
B機器IP:192.168.10.2
客戶機IP:192.168.10.1
6.1.2 測試過程
A機器啟動redis和keepalived
# redis-server redis.conf
# service keepalived start
B機器啟動redis和keepalived
# redis-server redis_slave.conf
# service keepalived start
測試客戶機與A,B集群連接
客戶機運行redis客戶端:
# redis-cli –h 192.168.10.251 –p 6379
redis:6379> auth system –第一次需要輸入密碼
OK
客戶機上做些寫(增,刪,改)操作,看A-redis和B-redis是否數據同步。
測試A-redis(主節點)掛掉后客戶機業務
關掉redis主機,查看A-keepalived是否自動停止
# ps –ef|grep keep
B機器是否獲得VIP
# ip a
B-redis是否變為主機狀態
# info
客戶機上做些寫(增,刪,改)操作,看B-redis是否數據同步。
測試A-redis重啟后客戶機業務
用命令腳本啟動A-redis主機
# sh ./script/redis_start.sh
查看A-redis是否將B-redis數據同步完全,分別在A,B redis運行
# keys * 看數量是否相等
查看A機器是否或得VIP
# ip a
查看A-redis是否變為主節點(keepalived獲得VIP會執行命令,將A-redis變為主節點),登陸A-redis,運行命令
# info
查看B-redis是否變為從節點(keepalived丟失VIP會執行命令,將B-redis變為從節點),登陸B-redis,運行命令
# info
客戶機連接redis客戶端,測試業務是否正常
# redis-cli –h 192.168.10.251 –p 6379
6.1.3 測試注意
- redis節點不能開啟從節點只讀模式,也就是slave-read-only要設置為 no。
- 如果AB服務器keepalived都掛掉,VIP有可能長久固定在某個上面。
- keepalived的配置文件里的腳本要注意執行權限,配置文件格式要完全正確,否則可能會無法綁定VIP。
- A,B服務器各腳本里的變量要注意區別,尤其是IP。
- A-redis掛掉后啟動要用啟動腳本,B-redis不需要。