Redis是一個開源,先進的key-value存儲,並用於構建高性能,可擴展的Web應用程序的完美解決方案。redis
Redis從它的許多競爭繼承來的三個主要特色:數據庫
Redis數據庫徹底在內存中,使用磁盤僅用於持久性。vim
相比許多鍵值數據存儲,Redis擁有一套較爲豐富的數據類型。緩存
Redis能夠將數據複製到任意數量的從服務器。bash
異常快速:Redis的速度很是快,每秒能執行約11萬集合,每秒約81000+條記錄。服務器
支持豐富的數據類型:Redis支持最大多數開發人員已經知道像列表,集合,有序集合,散列數據類型。這使得它很是容易解決各類各樣的問題,由於咱們知道哪些問題是能夠處理經過它的數據類型更好。工具
操做都是原子性:全部Redis操做是原子的,這保證了若是兩個客戶端同時訪問的Redis服務器將得到更新後的值。性能
多功能實用工具:Redis是一個多實用的工具,能夠在多個用例如緩存,消息,隊列使用(Redis原生支持發佈/訂閱),任何短暫的數據,應用程序,如Web應用程序會話,網頁命中計數等。測試
在redis官網下載最新的源碼包ui
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
# echo $?
# redis-server
第一次啓動時可能會有提示的warning信息;能夠忽略,但最好是按照提示的處理辦法修改。
# redis-cli
# redis> set iom dtsoft
OK
# redis> get iom
「dtsoft」
假設有兩臺服務器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兩節點回到初始狀態
1,4,5能夠用keepalived的配置腳本解決,2,3能夠本身編寫主從啓動腳本控制。
紅字爲手工加的備註,原文件裏沒有。
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)後執行的腳本
}
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)後執行的腳本
}
咱們是根據keepalived自動切換VIP的原理來實現redis主從切換,每次切換,主從角色都會調換,所以兩臺兩臺機子上都要編寫主從配置文件。
# 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以外的命令,至關重要
# 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以外的命令,至關重要
#!/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
#/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
#!/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
#!/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
VIP:192.168.10.251
A機器IP:192.168.10.2
B機器IP:192.168.10.2
客戶機IP:192.168.10.1
A機器啓動redis和keepalived
# redis-server redis.conf
# service keepalived start
B機器啓動redis和keepalived
# redis-server redis_slave.conf
# service keepalived start
客戶機運行redis客戶端:
# redis-cli –h 192.168.10.251 –p 6379
redis:6379> auth system –第一次須要輸入密碼
OK
客戶機上作些寫(增,刪,改)操做,看A-redis和B-redis是否數據同步。
關掉redis主機,查看A-keepalived是否自動中止
# ps –ef|grep keep
B機器是否得到VIP
# ip a
B-redis是否變爲主機狀態
# info
客戶機上作些寫(增,刪,改)操做,看B-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