Redis主從+KeepAlived實現高可用

来源:https://www.cnblogs.com/JeremyWYL/archive/2018/03/14/8562388.html
-Advertisement-
Play Games

Redis是我們當下比較流行使用的非關係資料庫,可支持多樣化的數據類型,多線程高併發支持,redis運行在記憶體擁有更快的讀寫。因為redis的表現如此出色,如何能保障redis在運行中能夠應對宕機故障, 所以今天總結了下redis主從高可用的搭建,參考了網上一些大神的博客文章,發現很多都是有坑的,所 ...


Redis是我們當下比較流行使用的非關係資料庫,可支持多樣化的數據類型,多線程高併發支持,redis運行在記憶體擁有更快的讀寫。因為redis的表現如此出色,如何能保障redis在運行中能夠應對宕機故障,

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

Redis特點

Redis 是完全開源免費的,遵守BSD協議,是一個高性能的key-value資料庫。

Redis 與其他 key - value 緩存產品有以下三個特點:

Redis支持數據的持久化,可以將記憶體中的數據保持在磁碟中,重啟的時候可以再次載入進行使用。

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

Redis支持數據的備份,即master-slave模式的數據備份。

Redis 優勢

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

豐富的數據類型 – Redis支持二進位案例的 Strings, Lists, Hashes, Sets 及 Ordered Sets 數據類型操作。

原子 – Redis的所有操作都是原子性的,同時Redis還支持對幾個操作全並後的原子性執行。

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

準備環境

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

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

授予執行許可權:chmod +x /etc/init.d/redis

添加開機啟動:

chkconfig --add redis

chkconfig redis on

查看:chkconfig --list | grep redis

此次試驗事先關閉了防火牆和selinux,生產環境建議開啟防火牆。

3、添加redis命令環境變數

#vi /etc/profile
#添加下一行參數 exportPATH="$PATH:/usr/local/redis/bin"
#環境變數生效
source /etc/profile

4、啟動redis服務

service redis start
#檢查啟動情況
ps -ef | grep redis

註:在我們兩台伺服器上先執行同樣的操作安裝完成redis,接下來安裝完成後,就直接進入配置主從環境。

Redis主從配置

 引申回到前面的設計模式,我們的思路是以140作為主,141作為從,139作為VIP飄逸地址,應用通過139的6379埠訪問redis資料庫。

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

 當140恢復正常後,這時140會與141進行一次數據同步,140原有的數據不會丟失,還會同步宕機之間已經寫入到141的數據,數據同步完成之後,

 VIP會因為權重的原因重新回到140節點上併成為主節點,141會因為失去VIP會重新成為從節點,恢復到初始狀態繼續提供不間斷的讀寫服務。

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服務!驗證主從是否正常。

主節點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

從節點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

3、同步測試

主節點140

從節點141

到此redis的主從已經完成!

KeepAlived配置實現雙機熱備

使用Keepalived實現VIP,並且通過notify_master、notify_backup、notify_fault、notify_stop來實現容災。

1、配置Keepalived配置文件

主Keepalived配置文件

vim /etc/keepalived/keepalived.conf
! Configuration File for keepalived

global_defs {
   notification_email {
     [email protected]
     [email protected]
     [email protected]
   }
   notification_email_from [email protected]
   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 {
     [email protected]
     [email protected]
     [email protected]
   }
   notification_email_from [email protected]
   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

創建存放腳本目錄: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秒以後待數據同步完成後再取消同步狀態 

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秒待數據被對方同步完成之後再切換主從角色 

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

創建存放腳本目錄: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秒以後待數據同步完成後再取消同步狀態 

 

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秒待數據被對方同步完成之後再切換主從角色 

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、啟動服務

systemctl start keepalived

systemctl enable keepalived

4、測試服務是否正常

ps -ef | grep keepalived

ping 172.16.81.139

 

查看VIP地址

測試連接redis是否正常

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

Keepalived測試完成!!

測試故障轉移情況

關閉主redis服務,查看從redis是否會接管VIP變成主?然後再新的主redis141上插入數據,測試當140恢復,數據是否存在?141的是否會變成從節點?

1、主140關閉redis

service redis stop

2、查看141狀態

測試VIP連接遠程連接

 通過INFO可以查看狀態信息

 

可以看到從節點的141已經變成master節點了。

3、插入數據

 

4、開啟140主節點

service redis start

5、查看140和141的主從狀態

141的狀態,變回了從

140的狀態,變回了主

我們在140上查看剛剛在141上插入的新數據

數據存在,證明主從切換是正常的!!!

上面是本人親測過的,如有問題請留言!!!


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 1.登錄CentOS。 2.# dhclient 自動獲取IP地址 3.# ip addr 1).第一個地址127.0.0.1是迴環地址,網卡名叫做lo,Windows操作系統也有該地址,用來和自己通信。 2).第二個192.168.123.130就是剛剛自動獲取的IP地址。ens33就是網卡的名字 ...
  • 今天安裝mongodb後發現apache無法啟動 命令行 services.msc 打開服務 在服務里啟動Apache2a服務,報錯誤碼1 網上查有很多情況都報的1 可以通過命令行下 執行apache bin 下的 httpd.exe進一步瞭解 AH00548: NameVirtualHost ha ...
  • linux的安裝問題 預備: 我開始學習Linux使用的是《鳥哥的Linux私房菜 基礎學習篇》,在書中提到的安裝方法是光碟安裝。 問題是,我沒有光碟,這就很僵硬了。 通過網路的掃蕩,我選擇了一個非常簡單的方法——U盤安裝。 需要:1、UltraISO工具(製作啟動U盤)(https://www.l ...
  • 1.新建虛擬機==》典型==》稍後安裝操作系統==》選擇linux==>centos 64位 2.填寫虛擬機名字以及安裝位置。 3.磁碟容量採用預設即可。 4. 自定義硬體: 1) 記憶體:如果電腦記憶體小於等於4G,設為1G;否則設為2G 2)CD/DVD 先預設。 3)網路適配器:NAT 4)其他選 ...
  • 由於實驗室擬態存儲的項目需要通過NAT模式來映射NFS伺服器已實現負載均衡的目的,通過調研了多種負載均衡機制,筆者最終選擇了 LVS的NAT模式 來實現需求,接下來通過博客來記錄一下LVS NAT模式的配置流程。 1.LVS服務的簡介: LVS 是 Linux Virtual Server 的簡寫, ...
  • 驅動的完成步驟: ~~~~ 1. 分配一個 gendisk 結構體 2. 註冊塊設備 3. 分配一個 request_queue 隊列 4. 配置 gendisk 5. 完成上一篇框架中提到的 "處理函數" 6. 添加磁碟 add_disk ~~~~ 初始化程式如下 ~~~~ static int ...
  • 系統的輸入與輸出: 方式 | 描述符 | 含義 | | stdin | 0 | 標準輸入 stdout | 1 | 標準輸出 stderr | 2 | 標準錯誤輸出 把 make 輸出的全部信息重定向到某個文件中: ~~~~ make build_output ~~~~ 把錯誤信息都輸出到一個文件中 ...
  • 監控原理: ActiveMQ作為依賴java環境的中間件,同樣可以像tomcat一樣用JMX(java擴展程式)監控。並且與tomcat不同的是,ActiveMQ自帶了JMX,只需在配置文件中開啟即可,在配置好JMX之後,可以通過Jconsole(監控java環境的工具)監控ActiveMQ 環境: ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...