新聞中心
Redis是我們當(dāng)下比較流行使用的非關(guān)系數(shù)據(jù)庫,可支持多樣化的數(shù)據(jù)類型,多線程高并發(fā)支持,redis運(yùn)行在內(nèi)存擁有更快的讀寫。因?yàn)閞edis的表現(xiàn)如此出色,如何能保障redis在運(yùn)行中能夠應(yīng)對(duì)宕機(jī)故障,

創(chuàng)新互聯(lián)公司專注于企業(yè)營銷型網(wǎng)站、網(wǎng)站重做改版、黑山網(wǎng)站定制設(shè)計(jì)、自適應(yīng)品牌網(wǎng)站建設(shè)、H5響應(yīng)式網(wǎng)站、購物商城網(wǎng)站建設(shè)、集團(tuán)公司官網(wǎng)建設(shè)、外貿(mào)網(wǎng)站建設(shè)、高端網(wǎng)站制作、響應(yīng)式網(wǎng)頁設(shè)計(jì)等建站業(yè)務(wù),價(jià)格優(yōu)惠性價(jià)比高,為黑山等各大城市提供網(wǎng)站開發(fā)制作服務(wù)。
Redis特點(diǎn)
Redis 是完全開源免費(fèi)的,遵守BSD協(xié)議,是一個(gè)高性能的key-value數(shù)據(jù)庫。
Redis 與其他 key - value 緩存產(chǎn)品有以下三個(gè)特點(diǎn):
Redis支持?jǐn)?shù)據(jù)的持久化,可以將內(nèi)存中的數(shù)據(jù)保持在磁盤中,重啟的時(shí)候可以再次加載進(jìn)行使用。
Redis不僅僅支持簡單的key-value類型的數(shù)據(jù),同時(shí)還提供如:字符串(String), 哈希(Map), 列表(list), 集合(sets) 和有序集合(sorted sets)等數(shù)據(jù)結(jié)構(gòu)的存儲(chǔ)。
Redis支持?jǐn)?shù)據(jù)的備份,即master-slave模式的數(shù)據(jù)備份。
Redis 優(yōu)勢(shì)
性能極高 – Redis能讀的速度是100K+次/s,寫的速度是80K+次/s 。
豐富的數(shù)據(jù)類型 – Redis支持二進(jìn)制案例的 Strings, Lists, Hashes, Sets 及 Ordered Sets 數(shù)據(jù)類型操作。
原子 – Redis的所有操作都是原子性的,同時(shí)Redis還支持對(duì)幾個(gè)操作全并后的原子性執(zhí)行。
豐富的特性 – Redis還支持 publish/subscribe, 通知, key 過期等等特性。
準(zhǔn)備環(huán)境
CentOS7 --> 172.16.81.140 -->主Redis -->主Keepalived
CentOS7 --> 172.16.81.141 -->從Redis -->備Keepalived
VIP --> 172.16.81.139
redis(一般3.0版本以上都行)
KeepAlived(直接在線安裝的)
Redis編譯安裝
1、提前準(zhǔn)備好的redis軟件放在/opt目錄下:redis-4.0.6.tar.gz
cd /opt
tar -zxvf redis-4.0.6.tar.gz
mv redis-4.0.6 redis
cd redis
makeMALLOC=libc
make PREFIX=/usr/local/redis install
2、配置redis啟動(dòng)腳本
vim /etc/init.d/redis
#!/bin/sh
#chkconfig:2345 80 90
# Simple Redisinit.d script conceived to work on Linux systems
# as it doeSUSE of the /proc filesystem.
#配置redis端口號(hào)
REDISPORT=6379
#配置redis啟動(dòng)命令路徑
EXE=/usr/local/redis/bin/redis-server
#配置redis連接命令路徑
CLIEXE=/usr/local/redis/bin/redis-cli
#配置redis運(yùn)行PID路徑
PIDFILE=/var/run/redis_6379.pid
#配置redis的配置文件路徑
CONF="/etc/redis/redis.conf"
#配置redis的連接認(rèn)證密碼
REDISPASSWORD=123456
function start () {
if [ -f $PIDFILE ]
then
echo "$PIDFILE exists,process is already running or crashed"
else
echo "Starting Redisserver..."
$EXE $CONF &
fi
}
function stop () {
if [ ! -f $PIDFILE ]
then
echo "$PIDFILE does not exist, process is not running"
else
PID=$(cat $PIDFILE)
echo "Stopping ..."
$CLIEXE -p $REDISPORT -a $REDISPASSWORD shutdown
while [ -x /proc/${PID} ]
do
echo "Waiting forRedis to shutdown ..."
sleep 1
done
echo "Redis stopped"
fi
}
function restart () {
stop
sleep 3
start
}
case "$1" in
start)
start
;;
stop)
stop
;;
restart)
restart
;;
*)
echo -e "\e[31m Please use $0 [start|stop|restart] asfirst argument \e[0m"
;;
esac
授予執(zhí)行權(quán)限:
chmod +x /etc/init.d/redis
添加開機(jī)啟動(dòng):
chkconfig --add redis
chkconfig redis on
查看:chkconfig --list | grep redis
此次試驗(yàn)事先關(guān)閉了防火墻和selinux,生產(chǎn)環(huán)境建議開啟防火墻。
3、添加redis命令環(huán)境變量
#vi /etc/profile
#添加下一行參數(shù)
exportPATH="$PATH:/usr/local/redis/bin"
#環(huán)境變量生效
source /etc/profile
4、啟動(dòng)redis服務(wù)
service redis start
#檢查啟動(dòng)情況
ps -ef | grep redis
注:在我們兩臺(tái)服務(wù)器上先執(zhí)行同樣的操作安裝完成redis,接下來安裝完成后,就直接進(jìn)入配置主從環(huán)境。
Redis主從配置
引申回到前面的設(shè)計(jì)模式,我們的思路是以140作為主,141作為從,139作為VIP飄逸地址,應(yīng)用通過139的6379端口訪問redis數(shù)據(jù)庫。
正常運(yùn)行下,當(dāng)主節(jié)點(diǎn)140宕機(jī)后,VIP飄逸到141上,這時(shí)141就會(huì)接管140成為主節(jié)點(diǎn),140就會(huì)成為從節(jié)點(diǎn),繼續(xù)提供讀寫操作。
當(dāng)140恢復(fù)正常后,這時(shí)140會(huì)與141進(jìn)行一次數(shù)據(jù)同步,140原有的數(shù)據(jù)不會(huì)丟失,還會(huì)同步宕機(jī)之間已經(jīng)寫入到141的數(shù)據(jù),數(shù)據(jù)同步完成之后,
VIP會(huì)因?yàn)闄?quán)重的原因重新回到140節(jié)點(diǎn)上并成為主節(jié)點(diǎn),141會(huì)因?yàn)槭IP會(huì)重新成為從節(jié)點(diǎn),恢復(fù)到初始狀態(tài)繼續(xù)提供不間斷的讀寫服務(wù)。
1、配置redis的配置文件
Master-140配置文件
vim /etc/redis/redis.conf
bind 0.0.0.0
port 6379
daemonize yes
requirepass 123456
slave-serve-stale-data yes
slave-read-only no
Slave-141配置文件
vim /etc/redis/redis.conf
bind 0.0.0.0
port 6379
daemonize yes
slaveof 172.16.81.140 6379
masterauth 123456
slave-serve-stale-data yes
slave-read-only no
2、配置完成后重啟redis服務(wù)!驗(yàn)證主從是否正常。
主節(jié)點(diǎn)140終端登錄測(cè)試:
[root@localhost ~]# redis-cli -a 123456
127.0.0.1:6379> INFO
.
.
.
# Replication
role:master
connected_slaves:1
slave0:ip=172.16.81.141,port=6379,state=online,offset=105768,lag=1
master_replid:f83fcc3c98614d770f2205831fef1e877fa3f482
master_replid2:1f25604997a4ad3eb8344e8155990e78acd93312
master_repl_offset:105768
second_repl_offset:447
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:447
repl_backlog_histlen:105322
從節(jié)點(diǎn)141終端登錄測(cè)試:
[root@localhost ~]# redis-cli -a 123456
127.0.0.1:6379> info
.
.
.
# Replication
role:slave
master_host:172.16.81.140
master_port:6379
master_link_status:up
master_last_io_seconds_ago:5
master_sync_in_progress:0
slave_repl_offset:105992
slave_priority:100
slave_read_only:0
connected_slaves:0
master_replid:f83fcc3c98614d770f2205831fef1e877fa3f482
master_replid2:1f25604997a4ad3eb8344e8155990e78acd93312
master_repl_offset:105992
second_repl_offset:447
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:239
repl_backlog_histlen:105754
3、同步測(cè)試
主節(jié)點(diǎn)140
從節(jié)點(diǎn)141
到此redis的主從已經(jīng)完成!
KeepAlived配置實(shí)現(xiàn)雙機(jī)熱備
使用Keepalived實(shí)現(xiàn)VIP,并且通過notify_master、notify_backup、notify_fault、notify_stop來實(shí)現(xiàn)容災(zāi)。
1、配置Keepalived配置文件
主Keepalived配置文件
vim /etc/keepalived/keepalived.conf
! Configuration File for keepalived
global_defs {
notification_email {
acassen@firewall.loc
failover@firewall.loc
sysadmin@firewall.loc
}
notification_email_from Alexandre.Cassen@firewall.loc
smtp_server 192.168.200.1
smtp_connect_timeout 30
router_id redis01
}
vrrp_script chk_redis {
script "/etc/keepalived/script/redis_check.sh"
interval 2
}
vrrp_instance VI_1 {
state MASTER
interface eno16777984
virtual_router_id 51
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
track_script {
chk_redis
}
virtual_ipaddress {
172.16.81.139
}
notify_master /etc/keepalived/script/redis_master.sh
notify_backup /etc/keepalived/script/redis_backup.sh
notify_fault /etc/keepalived/script/redis_fault.sh
notify_stop /etc/keepalived/script/redis_stop.sh
}
備用Keepalived配置文件
vim /etc/keepalived/keepalived.conf
! Configuration File for keepalived
global_defs {
notification_email {
acassen@firewall.loc
failover@firewall.loc
sysadmin@firewall.loc
}
notification_email_from Alexandre.Cassen@firewall.loc
smtp_server 192.168.200.1
smtp_connect_timeout 30
router_id redis02
}
vrrp_script chk_redis {
script "/etc/keepalived/script/redis_check.sh"
interval 2
}
vrrp_instance VI_1 {
state BACKUP
interface eno16777984
virtual_router_id 51
priority 99
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
track_script {
chk_redis
}
virtual_ipaddress {
172.16.81.139
}
notify_master /etc/keepalived/script/redis_master.sh
notify_backup /etc/keepalived/script/redis_backup.sh
notify_fault /etc/keepalived/script/redis_fault.sh
notify_stop /etc/keepalived/script/redis_stop.sh
}
2、配置腳本
Master KeepAlived -- 140
創(chuàng)建存放腳本目錄:mkdir -p /etc/keepalived/script/
cd /etc/keepalived/script/
[root@localhost script]# cat redis_check.sh
#!/bin/bash
ALIVE=`/usr/local/redis/bin/redis-cli -a 123456 PING`
if [ "$ALIVE" == "PONG" ];then
echo $ALIVE
exit 0
else
echo $ALIVE
exit 1
fi
[root@localhost script]# cat 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 172.16.81.141 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秒以后待數(shù)據(jù)同步完成后再取消同步狀態(tài)
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
[root@localhost script]# cat 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秒待數(shù)據(jù)被對(duì)方同步完成之后再切換主從角色
echo "Run SLAVEOF cmd ...">> $LOGFILE
$REDISCLI SLAVEOF 172.16.81.141 6379 >>$LOGFILE 2>&1
[root@localhost script]# cat redis_fault.sh
#!/bin/bash
LOGFILE=/var/log/keepalived-redis-state.log
echo "[fault]" >> $LOGFILE
date >> $LOGFILE
[root@localhost script]# cat redis_stop.sh
#!/bin/bash
LOGFILE=/var/log/keepalived-redis-state.log
echo "[stop]" >> $LOGFILE
date >> $LOGFILE
Slave KeepAlived -- 141
創(chuàng)建存放腳本目錄:mkdir -p /etc/keepalived/script/
cd /etc/keepalived/script/
[root@localhost script]# cat redis_check.sh
#!/bin/bash
ALIVE=`/usr/local/redis/bin/redis-cli -a 123456 PING`
if [ "$ALIVE" == "PONG" ]; then
echo $ALIVE
exit 0
else
echo $ALIVE
exit 1
fi
[root@localhost script]# cat 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 172.16.81.140 6379 >>$LOGFILE 2>&1
sleep 10 #延遲10秒以后待數(shù)據(jù)同步完成后再取消同步狀態(tài)
echo "Run SLAVEOF NO ONE cmd ...">> $LOGFILE
$REDISCLI SLAVEOF NO ONE >> $LOGFILE 2>&1
[root@localhost script]# cat 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秒待數(shù)據(jù)被對(duì)方同步完成之后再切換主從角色
echo "Run SLAVEOF cmd ...">> $LOGFILE
$REDISCLI SLAVEOF 172.16.81.140 6379 >>$LOGFILE 2>&1
[root@localhost script]# cat redis_fault.sh
#!/bin/bash
LOGFILE=/var/log/keepalived-redis-state.log
echo "[fault]" >> $LOGFILE
date >> $LOGFILE
[root@localhost script]# cat redis_stop.sh
#!/bin/bash
LOGFILE=/var/log/keepalived-redis-state.log
echo "[stop]" >> $LOGFILE
date >> $LOGFILE
3、啟動(dòng)服務(wù)
systemctl start keepalived
systemctl enable keepalived
4、測(cè)試服務(wù)是否正常
ps -ef | grep keepalived
ping 172.16.81.139
查看VIP地址
測(cè)試連接redis是否正常
redis-cli -h 172.16.81.139 -p 6379 -a 123456
Keepalived測(cè)試完成!!
測(cè)試故障轉(zhuǎn)移情況
關(guān)閉主redis服務(wù),查看從redis是否會(huì)接管VIP變成主?然后再新的主redis141上插入數(shù)據(jù),測(cè)試當(dāng)140恢復(fù),數(shù)據(jù)是否存在?141的是否會(huì)變成從節(jié)點(diǎn)?
1、主140關(guān)閉redis
service redis stop
2、查看141狀態(tài)
測(cè)試VIP連接遠(yuǎn)程連接
通過INFO可以查看狀態(tài)信息
可以看到從節(jié)點(diǎn)的141已經(jīng)變成master節(jié)點(diǎn)了。
3、插入數(shù)據(jù)
4、開啟140主節(jié)點(diǎn)
service redis start
5、查看140和141的主從狀態(tài)
141的狀態(tài),變回了從
140的狀態(tài),變回了主
我們?cè)?40上查看剛剛在141上插入的新數(shù)據(jù)
數(shù)據(jù)存在,證明主從切換是正常的!??!
上面是本人親測(cè)過的,如有問題請(qǐng)留言!??!
網(wǎng)站名稱:Redis主從+KeepAlived實(shí)現(xiàn)高可用
網(wǎng)址分享:http://www.dlmjj.cn/article/cdscihs.html


咨詢
建站咨詢
