Redis主从+KeepAlived实现高可用
Redis是我們當(dāng)下比較流行使用的非關(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支持?jǐn)?shù)據(jù)的持久化,可以將內(nèi)存中的數(shù)據(jù)保持在磁盤中,重啟的時候可以再次加載進(jìn)行使用。
Redis不僅僅支持簡單的key-value類型的數(shù)據(jù),同時還提供如:字符串(String), 哈希(Map), 列表(list), 集合(sets) 和有序集合(sorted sets)等數(shù)據(jù)結(jié)構(gòu)的存儲。
Redis支持?jǐn)?shù)據(jù)的備份,即master-slave模式的數(shù)據(jù)備份。
Redis 優(yōu)勢
性能極高?– Redis能讀的速度是100K+次/s,寫的速度是80K+次/s 。
豐富的數(shù)據(jù)類型 – Redis支持二進(jìn)制案例的 Strings, Lists, Hashes, Sets 及 Ordered Sets 數(shù)據(jù)類型操作。
原子 – Redis的所有操作都是原子性的,同時Redis還支持對幾個操作全并后的原子性執(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 install2、配置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的連接認(rèn)證密碼 REDISPASSWORD=123456function start () {if [ -f $PIDFILE ]thenecho "$PIDFILE exists,process is already running or crashed"elseecho "Starting Redisserver..."$EXE $CONF &fi }function stop () {if [ ! -f $PIDFILE ]thenecho "$PIDFILE does not exist, process is not running"elsePID=$(cat $PIDFILE)echo "Stopping ..."$CLIEXE -p $REDISPORT -a $REDISPASSWORD shutdownwhile [ -x /proc/${PID} ]doecho "Waiting forRedis to shutdown ..."sleep 1doneecho "Redis stopped"fi }function restart () {stopsleep 3start }case "$1" instart)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
4、啟動redis服務(wù)
service redis start #檢查啟動情況ps -ef | grep redis
注:在我們兩臺服務(wù)器上先執(zhí)行同樣的操作安裝完成redis,接下來安裝完成后,就直接進(jìn)入配置主從環(huán)境。
Redis主從配置
?引申回到前面的設(shè)計模式,我們的思路是以140作為主,141作為從,139作為VIP飄逸地址,應(yīng)用通過139的6379端口訪問redis數(shù)據(jù)庫。
?正常運行下,當(dāng)主節(jié)點140宕機后,VIP飄逸到141上,這時141就會接管140成為主節(jié)點,140就會成為從節(jié)點,繼續(xù)提供讀寫操作。
?當(dāng)140恢復(fù)正常后,這時140會與141進(jìn)行一次數(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.confbind 0.0.0.0port 6379daemonize yesrequirepass 123456slave-serve-stale-data yesslave-read-only noSlave-141配置文件
vim /etc/redis/redis.confbind 0.0.0.0port 6379daemonize yesslaveof 172.16.81.140 6379masterauth 123456slave-serve-stale-data yesslave-read-only no2、配置完成后重啟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從節(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:1057543、同步測試
主節(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 keepalivedglobal_defs {notification_email {acassen@firewall.locfailover@firewall.locsysadmin@firewall.loc}notification_email_from Alexandre.Cassen@firewall.locsmtp_server 192.168.200.1smtp_connect_timeout 30router_id redis01 }vrrp_script chk_redis {script "/etc/keepalived/script/redis_check.sh"interval 2 }vrrp_instance VI_1 {state MASTERinterface eno16777984virtual_router_id 51priority 100advert_int 1authentication {auth_type PASSauth_pass 1111}track_script {chk_redis}virtual_ipaddress {172.16.81.139}notify_master /etc/keepalived/script/redis_master.shnotify_backup /etc/keepalived/script/redis_backup.shnotify_fault /etc/keepalived/script/redis_fault.sh notify_stop /etc/keepalived/script/redis_stop.sh }備用Keepalived配置文件
vim /etc/keepalived/keepalived.conf ! Configuration File for keepalivedglobal_defs {notification_email {acassen@firewall.locfailover@firewall.locsysadmin@firewall.loc}notification_email_from Alexandre.Cassen@firewall.locsmtp_server 192.168.200.1smtp_connect_timeout 30router_id redis02 }vrrp_script chk_redis {script "/etc/keepalived/script/redis_check.sh"interval 2 }vrrp_instance VI_1 {state BACKUPinterface eno16777984virtual_router_id 51priority 99advert_int 1authentication {auth_type PASSauth_pass 1111}track_script {chk_redis}virtual_ipaddress {172.16.81.139}notify_master /etc/keepalived/script/redis_master.shnotify_backup /etc/keepalived/script/redis_backup.shnotify_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" ];thenecho $ALIVE exit 0 elseecho $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 15echo "[master]" >> $LOGFILEdate >> $LOGFILEecho "Being master...." >>$LOGFILE 2>&1echo "Run SLAVEOF cmd ...">> $LOGFILE$REDISCLI SLAVEOF 172.16.81.141 6379 >>$LOGFILE 2>&1 if [ $? -ne 0 ];thenecho "data rsync fail." >>$LOGFILE 2>&1 elseecho "data rsync OK." >> $LOGFILE 2>&1 fisleep 10 #延遲10秒以后待數(shù)據(jù)同步完成后再取消同步狀態(tài) echo "Run SLAVEOF NO ONE cmd ...">> $LOGFILE$REDISCLI SLAVEOF NO ONE >> $LOGFILE 2>&1 if [ $? -ne 0 ];thenecho "Run SLAVEOF NO ONE cmd fail." >>$LOGFILE 2>&1 elseecho "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]" >> $LOGFILEdate >> $LOGFILEecho "Being slave...." >>$LOGFILE 2>&1sleep 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.logecho "[fault]" >> $LOGFILEdate >> $LOGFILE [root@localhost script]# cat redis_stop.sh #!/bin/bash LOGFILE=/var/log/keepalived-redis-state.logecho "[stop]" >> $LOGFILEdate >> $LOGFILESlave 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" ]; thenecho $ALIVE exit 0 elseecho $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]" >> $LOGFILEdate >> $LOGFILEecho "Being master...." >>$LOGFILE 2>&1echo "Run SLAVEOF cmd ...">> $LOGFILE$REDISCLI SLAVEOF 172.16.81.140 6379 >>$LOGFILE 2>&1sleep 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]" >> $LOGFILEdate >> $LOGFILEecho "Being slave...." >>$LOGFILE 2>&1sleep 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.logecho "[fault]" >> $LOGFILEdate >> $LOGFILE [root@localhost script]# cat redis_stop.sh #!/bin/bash LOGFILE=/var/log/keepalived-redis-state.logecho "[stop]" >> $LOGFILEdate >> $LOGFILE3、啟動服務(wù)
systemctl start keepalived
systemctl enable keepalived
4、測試服務(wù)是否正常
ps -ef | grep keepalived
ping 172.16.81.139
?
查看VIP地址
測試連接redis是否正常
redis-cli -h 172.16.81.139 -p 6379 -a 123456
Keepalived測試完成!!
測試故障轉(zhuǎn)移情況
關(guān)閉主redis服務(wù),查看從redis是否會接管VIP變成主?然后再新的主redis141上插入數(shù)據(jù),測試當(dāng)140恢復(fù),數(shù)據(jù)是否存在?141的是否會變成從節(jié)點?
1、主140關(guān)閉redis
service redis stop
2、查看141狀態(tài)
測試VIP連接遠(yuǎn)程連接
?通過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ù)存在,證明主從切換是正常的!!!
上面是本人親測過的,如有問題請留言!!!
Just Do It轉(zhuǎn)載于:https://www.cnblogs.com/lywJ/p/10833496.html
總結(jié)
以上是生活随笔為你收集整理的Redis主从+KeepAlived实现高可用的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: (23)zabbix单位符号Unit s
- 下一篇: 读写File