Redis 高可用 基於Sentinel + keepalived 實現

1  概述redis

redis做爲緩存工具,若是僅僅單機,一旦掛掉,將對業務形成嚴重的影響,所以建議生產環境上部署redis高可用環境,本文將基於Sentinel + keepalived 實現redis的高可用。vim

本文主要介紹實現的步驟和配置文件,不作原理上的介紹緩存

注意,redis的Sentinel高可用有一個很關鍵的點,只有master節點能夠寫入,其餘節點都只能讀,不能寫,因此,vip必須配置在master節點上bash

三臺redis ip 分別爲服務器

主節點: 192.168.70.32app

備節點1:192.168.70.33curl

備節點2:192.168.70.34ide

VIP:192.168.70.35工具

注意,時間必定要同步,不然集羣功能異常,如不能啓動集羣,或者集羣master不會轉移測試

若是sentinel日誌中有以下的報錯,則多是服務器時間不對,致使了節點不會轉移,檢查服務器時間問題,若是是虛擬機,如esxi系統,多是esxi系統時間異常致使該esxi上服務器時間所有異常,要重點檢查。

1926:X 26 Aug 01:02:09.334 # +tilt #tilt mode entered
1926:X 26 Aug 01:02:39.402 # -tilt #tilt mode exited

只要服務器時間正確,按照如下的配置,基本能夠實現高可用,即故障轉移。

2  部署keepalived

這裏採用編譯安裝來實現。

服務包:keepalived-1.4.3.tar.gz

步驟以下

yum -y install curl gcc openssl-devel libnl3-devel net-snmp-devel popt-devel libnfnetlink-devel
tar xf keepalived-1.4.3.tar.gz -C /usr/local/
cd /usr/local/keepalived-1.4.3/
./configure --prefix=/app/keepalived
make
make install
mkdir /etc/keepalived
vim /etc/keepalived/keepalived.conf 
#注意,keepalived.conf的配置文件很關鍵,是實現高可用的關鍵環節,內容太多,這裏把配置文件做爲附件放着文章後面,配置文件裏主要是 要對redis的主節點進行監控
cp /usr/local/keepalived-1.4.3/keepalived/etc/init.d/keepalived /etc/rc.d/init.d/keepalived
cp /app/keepalived/etc/sysconfig/keepalived /etc/sysconfig/
ln -s /app/keepalived/sbin/keepalived /usr/sbin/
chown root:root /etc/init.d/keepalived 
chmod u+s /app/keepalived/sbin/keepalived
chkconfig --add keepalived 
chkconfig keepalived on

到這裏keepalived配置完成

3  redis部署

3.1 redis編譯安裝

服務包:redis-4.0.8.tar.gz

tar -xzf redis-4.0.8.tar.gz  -C /app

#添加make 

cd /app/redis-4.0.8/src
make
make test

#若是以上步驟遇到 You need tcl 8.5 or newer in order to run the Redis test 的報錯,安裝tcl,命令yum install tcl -y

#設置開機啓動

vim /etc/rc.d/rc.local
/app/redis-4.0.8/src/redis-server /app/redis-4.0.8/redis.conf

#添加PATH

vim /etc/profile.d/redis.sh 
export PATH=/app/redis-4.0.8/src:$PATH
source /etc/profile.d/redis.sh

#編輯配置文件

主節點配置修改以下:

vim /app/redis-4.0.8/redis.conf
bind 0.0.0.0
daemonize yes 
requirepass redis
dir "/appdata/redis"   #指定數據持久化保持的路徑
appendonly yes  #是否持久化數據
appendfilename "appendonly.aof"  #持久化數據的文件名稱
masterauth "redis"     #指定密碼

備用節點

bind 0.0.0.0
daemonize yes 
requirepass redis
dir "/appdata/redis"   #指定數據持久化保持的路徑
appendonly yes  #是否持久化數據
appendfilename "appendonly.aof"  #持久化數據的文件名稱
masterauth "redis"     #指定密碼
slave-priority 90       #和主節點的區別,主節點不須要配置這條命令,當配置了這個命令,則優先級高的redis就必定會成功主節點,不建議配置這個選項
slaveof 192.168.70.32 6379

主備其餘的配置選擇默認便可

#啓動redis服務

/app/redis-4.0.8/src/redis-server /app/redis-4.0.8/redis.conf
#關閉redis
/app/redis-4.0.8/src/redis-cli -h 127.0.0.1 -p 6379  -a redis shutdown

3.2  配置sentinel

主備節點都是同樣的配置

vim  /app/redis-4.0.8/sentinel.conf 
protected-mode yes #很關鍵,若是protected-mode和bind兩行沒有配置,將致使redis的master節點故障後不會轉移
bind 0.0.0.0
daemonize yes #後臺運行
port 26379
dir "/tmp"
sentinel monitor mymaster 192.168.70.32 6379 2   #配置主節點的ip,另外2表示有3臺sentinel,若是5臺sentinel,這裏配置5
sentinel down-after-milliseconds mymaster 3000  #故障轉移時間,單位ms
sentinel failover-timeout mymaster 18000
sentinel auth-pass mymaster redis
logfile "/tmp/26379.log" #日誌路徑,可不寫,排查故障時建議寫
loglevel debug  #調試時使用,通常不配置

其餘配置能夠保持不變

另外,該文件,會跟進master故障轉移,自動寫入一部分配置,以下截圖

image.png

啓動sentinel
/app/redis-4.0.8/src/redis-sentinel  /app/redis-4.0.8/sentinel.conf 
寫入配置自啓動文件
vim /etc/rc.local
/app/redis-4.0.8/src/redis-sentinel  /app/redis-4.0.8/sentinel.conf

4  測試

全部的節點都啓動後,就能夠 測試高可用

從任意機器鏈接vip

[root@redis-01 ~]# redis-cli -a redis -h 192.168.70.35

192.168.70.35:6379> get key

"abc"

192.168.70.35:6379> set key abcd

OK

192.168.70.35:6379> get key

"abcd"

192.168.70.35:6379> 

假設,vip 配置在 192.168.70.32服務器上,把這臺服務器的redis進程殺掉後,vip會轉移到其餘兩臺的任意同樣,而且vip能夠正常訪問

則高可用實現

以上實現高可用,對vip的轉移,還有bind的ip配置很關鍵,會成功環境不成功的問題所在

5  附件

keepalived配置文件

主從配置就四點不同

router_id不同

優先級不同

state主從不同

從節點配置不搶佔ip ,nopreempt,能夠 配置在 track_script配置段下

以下

    track_script {
            chk_redis_master
          }
        nopreempt

主配置文件以下

vim /etc/keepalived/keepalived.conf
#Keepalived配置文件
global_defs {
        router_id NodeA                 #路由ID, 主備的ID不能相同
}
vrrp_script chk_redis_master {
    script "/app/redis-4.0.8/src/redis-cli -a redis info | grep role:master >/dev/null 2>&1"
#以上這個命令是整個高可用的關鍵,保證了當本節點不是master時,vip進行轉移到role 爲master的節點上,若是不成功,redis-cli須要寫絕對路徑
    interval 1
    timeout 2
    fall 2
    rise 1
}
vrrp_sync_group VG_1 {
    group {
        VI_1
    }
}
vrrp_instance VI_1 {
        state MASTER #Keepalived的角色。Master表示主服務器,從服務器設置爲BACKUP
        interface eth0          #指定監測網卡
        virtual_router_id 35
        priority 100            #優先級,BACKUP機器上的優先級要小於這個值
        advert_int 1            #設置主備之間的檢查時間,單位爲s
        authentication {        #定義驗證類型和密碼
                auth_type PASS
                auth_pass Pass123456789
        }
        virtual_ipaddress {     #VIP地址,能夠設置多個:
                192.168.70.35
        }
        track_script {
            chk_redis_master
          }
}
相關文章
相關標籤/搜索