搭建環境看了很多帖子,因爲諸多原因都有些原因導致,失敗,因此記錄一下自己的搭建步驟。
爲了提高程序響應效率,用到了redis作爲存放緩存數據的地方,但是隻運行一臺redis無疑對線上環境是一種挑戰,萬一服務器宕機,那生成環境就沒法玩了,因此需要對redis做集羣配置,由於公司業務量不是很大,所以採用主從雙機熱備的方案。
主要核心思想,如果master 和 salve 全部存活的情況,VIP就漂移到 master。讀寫都從master操作,如果master宕機,VIP就會漂移到salve,並將之前的salve切換爲master,當宕機的master可以繼續服務的時候,首先會從salve同步數據,然後VIP漂移到master服務器上面,持續提供服務。
一、準備環境
1.兩臺服務器
192.168.0.55
master
192.168.0.56
slave
192.168.0.99
VIP
2.redis安裝包
下載地址:redis下載
(本人下載的穩定版 4.0.9)
3.keeplived安裝包
二、安裝redis(兩臺服務器都按照此方式安裝)
1、解壓安裝包
tar
-zxvf redis-stable.tar.gz
2、將文件放於
/usr/local
mv
redis-stable /usr/local/
3、進入redis目錄並重命名
cd
/usr/local/
mv redis-stable/ redis
4、進入
redis目錄,編譯
cd
redis
make
到這步就編譯成功了、但是發現 有個錯誤,經檢測發現是時間不對
所以修改時間
date -s "2018-3-31 15:24:00"
讓系統時間和硬件時間同步:
hwclock --systohc
最後通過date
查看時間無誤了。再編譯一次 在 redis目錄中再次make
5、 然後執行
make test
測試的時候報錯了,需要安裝
tcl8.5
5.1
、去下載tcl8.5
5.2、解壓並放入
/usr/local
5.3、進入tcl
下的unix 編譯安裝
cd
tcl8.6.1/unix/
./configure
make
&& make install
6、進入
/usr/local/redis/src 執行 make install
7、新建
redis 下新建 bin 及 etc目錄 存放redis 服務相關文件和配置文件
mkdir
/usr/local/redis/etc /usr/local/redis/bin
8、移動相關文件
mv
/usr/local/redis/redis.conf /usr/local/redis/etc/
cd /usr/local/redis/src
mv mkreleasehdr.sh redis-benchmark redis-check-aof redis-cli redis-server /usr/local/redis/bin/
9、修改配置文件、讓服務可以後臺啓動
vim
/usr/local/redis/etc/redis.conf
daemonize yes
requirepass
123456 (連接密碼)
10、啓動
redis(後臺啓動)
[root@jonyLinux1 redis]# ./bin/redis-server ./etc/redis.conf
11、測試是否成功(保存、查找)
12、配置服務
12.1、創建文件
touch /etc/init.d/redis
12.2、編寫啓動文件
vim /etc/init.d/redis
12.3、文件內容
#!/bin/sh
# chkconfig: 2345 10 90
# description: Start and Stop redis
REDISPORT=6379
EXEC=/usr/local/redis/bin/redis-server
CLIEXEC=/usr/local/redis/bin/redis-cli
PIDFILE=/var/run/redis_${REDISPORT}.pid
CONF="/usr/local/redis/etc/redis.conf"
REDISPASS=123456
case "$1" in
start)
if [ -f $PIDFILE ]
then
echo "$PIDFILE exists, process is already running or crashed"
else
echo "Starting Redis server..."
$EXEC $CONF &
fi
;;
stop)
if [ ! -f $PIDFILE ]
then
echo "$PIDFILE does not exist, process is not running"
else
PID=$(cat $PIDFILE)
echo "Stopping ..."
$CLIEXEC -p $REDISPORT -a $REDISPASS shutdown
while [ -x /proc/${PID} ]
do
echo "Waiting for Redis to shutdown ..."
sleep 1
done
echo "Redis stopped"
fi
;;
restart)
"$0" stop
sleep 3
"$0" start
;;
*)
echo "Please use start or stop or restart as first argument"
;;
esac
12.4、配置開機啓動
chmod +x /etc/init.d/redis
chkconfig --add redis
chkconfig redis on 三、redis雙機熱備配置
1、相關配置
192.168.0.55 master中配置
daemonize
yes
requirepass 123456
bind 0.0.0.0
slave-serve-stale-data
yes
slave-read-only
no
192.168.0.56 slave中配置
daemonize
yes
slaveof 192.168.0.55 6379
masterauth 123456
slave-serve-stale-data yes
slave-read-only no2、驗證是否成功
192.168.0.55 master 中
192.168.0.56 slave 中(先get weater 無值、master set 成功之後 slave 中 有值)
四、keepalived安裝
1、解壓壓縮包
tar -zxvf keepalived-1.4.0.tar.gz
2、安裝所需鏡像
yum install -y openssl openssl-devel
3、編譯安裝
cd keepalived-1.4.0
./configure -prefix=/usr/local/keepalived/
make && make install
4、拷貝keepalived配置文件
cp /opt/keepalived-1.4.0/keepalived/etc/init.d/keepalived /etc/init.d/
cp /usr/local/keepalived/etc/sysconfig/keepalived /etc/sysconfig/keepalived
cp /usr/local/keepalived/sbin/keepalived /usr/sbin/keepalived
mkdir -p /etc/keepalived/scripts/
cp /usr/local/keepalived/etc/keepalived/samples/keepalived.conf.virtualhost
/etc/keepalived/keepalived.conf
5、修改配置文件及腳本
5.1、修改master keepalived配置文件
vim /etc/keepalived/keepalived.conf
vrrp_script chk_redis {
script "killall -0 redis-server"
interval 2
}
#網卡需要注意,使用ifconfig查看一下當前活動網卡
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 {
chk_redis
}
virtual_ipaddress {
192.168.0.99 #VIP地址
}
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
}
5.2、修改salve keepalived配置文件
vim /etc/keepalived/keepalived.conf
vrrp_script chk_redis {
# script "killall -0 redis-server"
interval 2
}
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 {
chk_redis
}
virtual_ipaddress {
192.168.0.99
}
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
}
6、編寫監控腳本
6.1、master中腳本
6.1.1 redis_master.sh文件
touch /etc/keepalived/scripts/redis_master.sh
vim /etc/keepalived/scripts/redis_master.sh
#!/bin/bash
REDISCLI="/usr/local/redis/bin/redis-cli -a 123456"
LOGFILE="/var/log/keepalived-redis-state.log"
sleep 15
echo "[master]" >> $LOGFILE
date >> $LOGFILE
echo "Being master...." >>$LOGFILE 2>&1
echo "Run SLAVEOF cmd ...">> $LOGFILE
$REDISCLI SLAVEOF 192.168.0.58 6379 >>$LOGFILE 2>&1
if [ $? -ne 0 ];then
echo "data rsync fail." >>$LOGFILE 2>&1
else
echo "data rsync OK." >> $LOGFILE 2>&1
fi
sleep 10 #延遲10秒以後待數據同步完成後再取消同步狀態
echo "Run SLAVEOF NO ONE cmd ...">> $LOGFILE
$REDISCLI SLAVEOF NO ONE >> $LOGFILE 2>&1
if [ $? -ne 0 ];then
echo "Run SLAVEOF NO ONE cmd fail." >>$LOGFILE 2>&1
else
echo "Run SLAVEOF NO ONE cmd OK." >> $LOGFILE 2>&1
fi
6.1.2 redis_backup.sh文件touch /etc/keepalived/scripts/redis_backup.sh
vim /etc/keepalived/scripts/redis_backup.sh
#!/bin/bash
REDISCLI="/usr/local/redis/bin/redis-cli -a 123456"
LOGFILE="/var/log/keepalived-redis-state.log"
echo "[backup]" >> $LOGFILE
date >> $LOGFILE
echo "Being slave...." >>$LOGFILE 2>&1
sleep 15 #延遲15秒待數據被對方同步完成之後再切換主從角色
echo "Run SLAVEOF cmd ...">> $LOGFILE
$REDISCLI SLAVEOF 192.168.0.56 6379 >>$LOGFILE 2>&1
6.2、slave中腳本
6.2.1、redis_master.sh 腳本
touch /etc/keepalived/scripts/redis_master.sh
vim /etc/keepalived/scripts/redis_master.sh
#!/bin/bash
REDISCLI="/usr/local/redis/bin/redis-cli -a 123456"
LOGFILE="/var/log/keepalived-redis-state.log"
echo "[master]" >> $LOGFILE
date >> $LOGFILE
echo "Being master...." >>$LOGFILE 2>&1
echo "Run SLAVEOF cmd ...">> $LOGFILE
$REDISCLI SLAVEOF 192.168.0.55 6379 >>$LOGFILE 2>&1
sleep 10 #延遲10秒以後待數據同步完成後再取消同步狀態
echo "Run SLAVEOF NO ONE cmd ...">> $LOGFILE
$REDISCLI SLAVEOF NO ONE >> $LOGFILE 2>&1
6.2.2、redis_backup.sh 腳本
touch /etc/keepalived/scripts/redis_backup.sh
vim /etc/keepalived/scripts/redis_backup.sh
#!/bin/bash
REDISCLI="/usr/local/redis/bin/redis-cli -a 123456"
LOGFILE="/var/log/keepalived-redis-state.log"
echo "[backup]" >> $LOGFILE
date >> $LOGFILE
echo "Being slave...." >>$LOGFILE 2>&1
sleep 15 #延遲15秒待數據被對方同步完成之後再切換主從角色
echo "Run SLAVEOF cmd ...">> $LOGFILE
$REDISCLI SLAVEOF 192.168.0.55 6379 >>$LOGFILE 2>&1
6.3、master 和 salve 中同時創建腳本
6.3.1 創建 redis_fault.sh
touch /etc/keepalived/scripts/redis_fault.sh
vim /etc/keepalived/scripts/redis_fault.sh
LOGFILE=/var/log/keepalived-redis-state.log
echo "[fault]" >> $LOGFILE
date >> $LOGFILE
6.3.2、創建 redis_stop.sh
touch /etc/keepalived/scripts/redis_stop.sh
vim /etc/keepalived/scripts/redis_stop.sh
lOGFILE=/var/log/keepalived-redis-state.log
echo "[stop]" >> $LOGFILE
date >> $LOGFILE
7、keepalived 最終腳本目錄如下
master(55) 中
salve(56) 中
到此所有配置文件全部設置完畢
然後再 maseter和 salve 中 執行:
chmod +x /etc/keepalived/scripts/*.sh
五、驗證成功
1、啓動master 和 salve中 的redis
service redis restart
2、啓動master 和 salve中的 keepalived
service keepalived restart
3、用VIP連接redis
redis-cli -h 192.168.0.99 -a 123456
3.1、輸入 info查看redis信息
可以看到當前狀態爲master 以及 salve (圖中IP58,由於內網56被佔用了,只好將salve的IP改爲58)
4、同步測試
4.1、master服務器中
salve 服務器中
數據已同步。
4.2、停掉master redis 服務,測試同步
查看replication slaves 爲0
4.3、新增 redis key
4.4、重啓 master 中的redis,並查看redis 數據同步狀態
啓動master中的redis,然後查看keys 還未同步,稍等片刻發現 剛剛再slave中新增的數據已同步。
以上爲本人 使用keepalived+redis 雙機熱備實際操作步驟,以留記錄,方便以後再次使用,也方便看到此文的同學。
本環境搭建成功,要感謝諸多同學的貢獻,以下爲主要參考的一些帖子內容:
http://abcve.com/redis-keepalived/
http://blog.51cto.com/wangfeng7399/1591272
https://www.cnblogs.com/davidwang456/p/3525090.html
https://www.cnblogs.com/JeremyWYL/p/8562388.html