redis主從+keepalived實現(xiàn)高可用技術(shù)(轉(zhuǎn))

redis主從+keepalived實現(xiàn)高可用技術(shù)
keepalive+redis 主從高可用

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

所以今天總結(jié)了下redis主從高可用的搭建,參考了網(wǎng)上一些大神的博客文章,發(fā)現(xiàn)很多都是有坑的,所以本人在此分享一次,希望能幫助到大家。

Redis特點

Redis 是完全開源免費的,遵守BSD協(xié)議,是一個高性能的key-value數(shù)據(jù)庫。

Redis 與其他 key - value 緩存產(chǎn)品有以下三個特點:

Redis支持數(shù)據(jù)的持久化,可以將內(nèi)存中的數(shù)據(jù)保持在磁盤中,重啟的時候可以再次加載進行使用。

Redis不僅僅支持簡單的key-value類型的數(shù)據(jù),同時還提供如:字符串(String), 哈希(Map), 列表(list), 集合(sets) 和有序集合(sorted sets)等數(shù)據(jù)結(jié)構(gòu)的存儲。

Redis支持數(shù)據(jù)的備份,即master-slave模式的數(shù)據(jù)備份。

Redis 優(yōu)勢

性能極高 – Redis能讀的速度是100K+次/s,寫的速度是80K+次/s 。

豐富的數(shù)據(jù)類型 – Redis支持二進制案例的 Strings, Lists, Hashes, Sets 及 Ordered Sets 數(shù)據(jù)類型操作。

原子 – Redis的所有操作都是原子性的,同時Redis還支持對幾個操作全并后的原子性執(zhí)行。

豐富的特性 – Redis還支持 publish/subscribe, 通知, key 過期等等特性。

準備環(huán)境

實驗過程的問題:未解決

(當master的redis掛了再重啟后,主和從的redis的主從關(guān)系混亂,未正確對應(yīng))

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、提前準備好的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</pre>

2、配置redis啟動腳本

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端口號
REDISPORT=6379
#配置redis啟動命令路徑
EXE=/usr/local/redis/bin/redis-server
#配置redis連接命令路徑
CLIEXE=/usr/local/redis/bin/redis-cli
#配置redis運行PID路徑
PIDFILE=/var/run/redis_6379.pid
#配置redis的配置文件路徑
CONF="/etc/redis/redis.conf"
#配置redis的連接認證密碼
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

添加開機啟動:

chkconfig --add redis

chkconfig redis on

查看:chkconfig --list | grep redis

此次試驗事先關(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</pre>

4、啟動redis服務(wù)

service redis start
#檢查啟動情況
ps -ef | grep redis</pre>

注:在我們兩臺服務(wù)器上先執(zhí)行同樣的操作安裝完成redis,接下來安裝完成后,就直接進入配置主從環(huán)境。

Redis主從配置

引申回到前面的設(shè)計模式,我們的思路是以140作為主,141作為從,139作為VIP飄逸地址,應(yīng)用通過139的6379端口訪問redis數(shù)據(jù)庫。

正常運行下,當主節(jié)點140宕機后,VIP飄逸到141上,這時141就會接管140成為主節(jié)點,140就會成為從節(jié)點,繼續(xù)提供讀寫操作。

當140恢復(fù)正常后,這時140會與141進行一次數(shù)據(jù)同步,140原有的數(shù)據(jù)不會丟失,還會同步宕機之間已經(jīng)寫入到141的數(shù)據(jù),數(shù)據(jù)同步完成之后,

VIP會因為權(quán)重的原因重新回到140節(jié)點上并成為主節(jié)點,141會因為失去VIP會重新成為從節(jié)點,恢復(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ù)!驗證主從是否正常。

主節(jié)點140終端登錄測試:

[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</pre>

從節(jié)點141終端登錄測試:

[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</pre>

3、同步測試

主節(jié)點140

從節(jié)點141

到此redis的主從已經(jīng)完成!

KeepAlived配置實現(xiàn)雙機熱備

使用Keepalived實現(xiàn)VIP,并且通過notify_master、notify_backup、notify_fault、notify_stop來實現(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ù)被對方同步完成之后再切換主從角色 

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ù)被對方同步完成之后再切換主從角色 

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、啟動服務(wù)

systemctl start keepalived

systemctl enable keepalived

4、測試服務(wù)是否正常

ps -ef | grep keepalived
ping 172.16.81.139

查看VIP地址

image

測試連接redis是否正常

redis-cli -h 172.16.81.139 -p 6379 -a 123456

image

Keepalived測試完成!!

測試故障轉(zhuǎn)移情況

關(guān)閉主redis服務(wù),查看從redis是否會接管VIP變成主?然后再新的主redis141上插入數(shù)據(jù),測試當140恢復(fù),數(shù)據(jù)是否存在?141的是否會變成從節(jié)點?

1、主140關(guān)閉redis

service redis stop

2、查看141狀態(tài)

測試VIP連接遠程連接

通過INFO可以查看狀態(tài)信息

可以看到從節(jié)點的141已經(jīng)變成master節(jié)點了。

3、插入數(shù)據(jù)

4、開啟140主節(jié)點

service redis start

5、查看140和141的主從狀態(tài)

141的狀態(tài),變回了從

140的狀態(tài),變回了主

我們在140上查看剛剛在141上插入的新數(shù)據(jù)

數(shù)據(jù)存在,證明主從切換是正常的!?。?/p>

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容