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故障轉移,自動寫入一部分配置,以下截圖
啓動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 } }