Redis - Keepalived + redis 主備熱備切換


1. 熱備方案

硬件:server兩台,分別用於master-redis及slave-redis

軟件:redis、keepalived

實現目標:

  • 由keepalived對外提供虛擬IP(VIP)進行redis訪問
  • 主從redis正常工作,主負責處理業務,從進行數據備份
  • 當主出現故障時,從切換為主,接替主的業務進行工作
  • 當主恢復后,拷貝從的數據,恢復主身份,從恢復從身份

數據采用aof方式進行持久化存儲,秒級備份,當出現故障后,損失數據不超過1s

clip_image002

Keepalived提供以下服務:

  • 對用戶提供VIP訪問,屏蔽redis實際IP,當主機出現故障,仍可用VIP訪問到從。
  • 對redis狀態進行監控,將監控頻率設置在1s。當主出現故障后能及時處理,切換從機提供業務。

 

2. 環境准備

利用虛擬機進行測試,安裝ubuntu,安裝完成后克隆ubuntu,利用兩個虛擬機來構造服務器環境。

在兩台虛擬機分別執行sudo apt-get redis-server和sudo apt-get keepalived安裝redis和keepalived軟件。

配置兩個虛擬機的redis主從關系:

1. 保證兩個虛擬機ip不一致且能互相ping通

2. 打開slave下/etc/redis/redis.conf文件

3. 找到slaveof配置項配置指定的master ip port,有密碼則還需配置masterauth

4. Save “”取消注釋,關閉RDB方式,配置appendonly項,配置為yes,持久化采用AOF方式

5. 主從執行service redis restart重啟下redis服務。

6. redis-cli info查看主從redis信息。

Maste:

clip_image004

Slave:

clip_image006

測試主從環境:

Master:

clip_image008

Slave:

clip_image010

查看默認db目錄/var/lib/redis/  

clip_image012

 

3. keepalived配置

keepalived配置包含兩部分,一部分是keepalived配置文件,另一部分是腳本。

主從/etc/keepalived/目錄下新建keepalived.conf文件。

Keepalived配置文件

Master

 1 vrrp_script chk_redis {
 2 
 3 script "/etc/keepalived/scripts/redis_check.py" ###監控腳本
 4 
 5 interval 1 ###監控時間設置為1s
 6 
 7 }
 8 
 9 vrrp_instance VI_1 {
10 
11 state MASTER ###設置為MASTER
12 
13 interface ens33 ###監控網卡
14 
15 virtual_router_id 51
16 
17 priority 101 ###權重值
18 
19 authentication {
20 
21 auth_type PASS ###加密
22 
23 auth_pass redis ###密碼
24 
25 }
26 
27 track_script {
28 
29 chk_redis ###調用上面定義的chk_redis
30 
31 }
32 
33 virtual_ipaddress {
34 
35 192.168.133.188 ###對外的虛擬IP
36 
37 }
38 
39 notify_master /etc/keepalived/scripts/redis_master.py
40 
41 notify_backup /etc/keepalived/scripts/redis_backup.py
42 
43 notify_fault /etc/keepalived/scripts/redis_fault.py
44 
45 notify_stop /etc/keepalived/scripts/redis_stop.py
46 
47 }

 

Slave

與master基本一致,修改以下兩項即可

1 state MASTER ###設置為MASTER
2 
3 state BACKUP ###設置為BACKUP
4 
5 priority 101 ###權重值
6 
7 priority 100 ###slave權重值比master小

 

監控腳本包含5個,主要關注redis_check.py 、redis_master.py和redis_backup.py。

  • redis_check.py用於監控redis運行狀態,反饋redis是否運行正常信息。
  • redis_master.py將當前redis切換為master
  • redis_backup.py將當前redis切換為slave

keepalived根據配置的監控時間,執行redis_check.py查看redis運行狀態,出現異常則主從依次調用腳本完成主從倒換。將這些腳本放在/etc/keepalived/scripts/目錄下,並且給所有腳本加上執行權限chmod +x *

redis_check.py主從內容一致:

 1 #!/usr/bin/python
 2 
 3 import os
 4 
 5 import sys
 6 
 7 import time
 8 
 9 PING = 'redis-cli ping' #redis ping command, observe network state
10 
11 os.chdir("/etc/redis/") #set log file path
12 
13 fp = open("redis_dump.log",'a') #open log file with append mode
14 
15 result = os.system(PING) #exec command
16 
17 if 0 == result: #network state ok
18 
19 logtime = time.strftime("%Y-%m-%d %H:%M:%S",time.localtime())
20 
21 fp.write("[check]" + logtime + ":" + 'redis running!\n')
22 
23 sys.exit(0)
24 
25 else:
26 
27 logtime = time.strftime("%Y-%m-%d %H:%M:%S",time.localtime())
28 
29 fp.write("[check]" + logtime + ":" + 'redis stop service!\n')
30 
31 sys.exit(1)
32 
33 fp.close()

 

網絡狀態良好時表示redis運行正常,日志記錄可以注釋,防止日志打印過多。在redis配置鑒權需修改所有的命令執行腳本內容,帶上鑒權信息。

當網絡不通,即redis服務掛掉后,可以增加os.system(“service redis start”)或者os.system(“service redis restart”)嘗試重啟redis服務。

redis_master.py主機配置:

 1 #!/usr/bin/python
 2 
 3 import os
 4 
 5 import time
 6 
 7 SLAVEOF = 'redis-cli slaveof 192.168.133.131 6379' #backup data form slave
 8 
 9 SLAVENO = 'redis-cli slaveof no one' #being master
10 
11 os.chdir("/etc/redis/") #set log file path
12 
13 fp = open("redis_dump.log",'a') #open log file with append mode
14 
15 result = os.system(SLAVEOF) #exec command
16 
17 logtime = time.strftime("%Y-%m-%d %H:%M:%S",time.localtime()) #get time info
18 
19 if 0 == result: #backup data from slave
20 
21 fp.write("[master]" + logtime + ":" + 'start copy data from slave!\n')
22 
23 else:
24 
25 fp.write("[master]" + logtime + ":" + 'copy data from slave falue!\n')
26 
27 time.sleep(10) #set backup time
28 
29 result = os.system(SLAVENO) #being master
30 
31 logtime = time.strftime("%Y-%m-%d %H:%M:%S",time.localtime())
32 
33 if 0 == result:
34 
35 fp.write("[master]" + logtime + ":" + 'stop copy data, being master!\n')
36 
37 else:
38 
39 fp.write("[master]" + logtime + ":" + 'being master falue!\n')
40 
41 fp.close()

 

從機redis_master.py內容與主機基本一致,修改備份數據對端地址為master ip即可。

1 SLAVEOF = 'redis-cli slaveof 192.168.133.131 6379' #backup data form slave
2 
3 SLAVEOF = 'redis-cli slaveof 192.168.133.130 6379' #backup data form master

 

執行這個腳本,redis狀態將從主機變為從機,先從指定的ip對端進行數據備份,備份完成后切換自身狀態為主機。

redis_backup.py主機配置

#!/usr/bin/python

import os

import time

time.sleep(15) #set data backup time

SLAVEOF = 'redis-cli slaveof 192.168.133.131 6379'

os.chdir("/etc/redis/") #set log file path

fp = open("redis_dump.log",'a') #open log file with append mode

result = os.system(SLAVEOF) #exec command

logtime = time.strftime("%Y-%m-%d %H:%M:%S",time.localtime())

if 0 == result:

fp.write("[backup]" + logtime + ":" + 'being slave!\n')

else:

fp.write("[backup]" + logtime + ":" + 'being slave falue!\n')

fp.close()

從機redis_master.py內容與主機基本一致,修改備份數據對端地址為master ip即可。

1 SLAVEOF = 'redis-cli slaveof 192.168.133.131 6379' #backup data form slave
2 
3 SLAVEOF = 'redis-cli slaveof 192.168.133.130 6379' #backup data form master

執行這個腳本,redis將從主機狀態變為從機,先從指定的對端ip進行數據備份,備份完成后切換狀態為該對端從機。

上述用到的所有keepalived配置文件及腳本:

https://github.com/binchen-china/keepalived-redis

 

4. 熱備測試

1. 主從啟動所有服務

Service redis start

Service keepalived start

2. 在master執行ip a查看虛擬IP是否綁定成功

clip_image016

3. 查看日志,keepalived運行是否正常

clip_image018

4. 停止master的redis服務

Service redis stop,查看從機ip a,虛擬IP已經在1秒內切換到從機綁定了。

clip_image020

5. 查看從機信息

從機已經切換為主機

clip_image022

6. 重啟主機redis服務

虛擬IP重新與主機綁定,主從恢復狀態

clip_image024

clip_image026

7. 查看數據是否丟失

clip_image028


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM