redis主從方案

一、主從簡單配置

系統環境: CentOS Linux release 7.6.1810 (Core)
redis版本: 4.1

主從配置明細

| IP | 端口 | 描述 | 配置文件 |
| 127.0.0.1 | 6379 | 主redis | redisMaster.conf |
| 127.0.0.1 | 6380 | 從redis-1 | – |
| 127.0.0.1 | 6381 | 從redis-2 | – |
| 127.0.0.1 | 6382 | 從redis-3 | – |

主redis配置文件redisMaster.conf

port 6379
requirepass qazwsxedcrfvtgbyhnujmik

從redis配置文件redisSlaveOne.conf

port 6381
slaveof 127.0.0.1 6379
masterauth qazwsxedcrfvtgbyhnujmik
slave-read-only yes  #開啓只讀
requirepass qazwsxedcrfvtgbyhnujmik

啓動redis

 redis/redis-server ./redisMaster.conf
 redis/redis-server ./redisSlaveOne.conf
 redis/redis-server ./redisSlaveTwo.conf 
 redis/redis-server ./redisSlaveThree.conf  

查看各redis主從狀態

命令: ./redis/redis-cli -h 127.0.0.1 -p 6379 -a qazwsxedcrfvtgbyhnujmik INFO replication
6379端口:

# Replication
role:master
connected_slaves:3
slave0:ip=127.0.0.1,port=6382,state=online,offset=588275,lag=1
slave1:ip=127.0.0.1,port=6381,state=online,offset=588275,lag=1
slave1:ip=127.0.0.1,port=6380,state=online,offset=588275,lag=1

6380/6381/6382端口:

# Replication
role:slave
master_host:127.0.0.1
master_port:6380
master_link_status:down
master_last_io_seconds_ago:-1
master_sync_in_progress:0

測試(從redis不支持寫入操作)

[root@oracle redisGroup]# ./redis/redis-cli -h 127.0.0.1 -p 6379 -a qazwsxedcrfvtgbyhnujmik 
127.0.0.1:6380> set tome eggs
OK
127.0.0.1:6380> exit
[root@oracle redisGroup]# ./redis/redis-cli -h 127.0.0.1 -p 6382 -a qazwsxedcrfvtgbyhnujmik  
127.0.0.1:6382> get tome
"eggs"
127.0.0.1:6382> set tome rops
(error) READONLY You can't write against a read only slave.

二、主從高可用方案

一、Redis Sentinel(哨兵機構)方案

原理:

Sentinel(哨兵)是用於監控redis集羣中Master狀態的工具,是Redis 的高可用性解決方案,sentinel哨兵模式已經被集成在redis2.4之後的版本中。sentinel是redis高可用的解決方案,sentinel系統可以監視一個或者多個redis master服務,以及這些master服務的所有從服務;當某個master服務下線時,自動將該master下的某個從服務升級爲master服務替代已下線的master服務繼續處理請求。

sentinel可以讓redis實現主從複製,當一個集羣中的master失效之後,sentinel可以選舉出一個新的master用於自動接替master的工作,集羣中的其他redis服務器自動指向新的master同步數據。一般建議sentinel採取奇數臺,防止某一臺sentinel無法連接到master導致誤切換。

優點:

Redis Sentinel 集羣部署簡單;
能夠解決 Redis 主從模式下的高可用切換問題;
很方便實現 Redis 數據節點的線形擴展,輕鬆突破 Redis 自身單線程瓶頸,可極大滿足 Redis 大容量或高性能的業務需求;
可以實現一套 Sentinel 監控一組 Redis 數據節點或多組數據節點。

缺點:

部署相對 Redis 主從模式要複雜一些,原理理解更繁瑣;
資源浪費,Redis 數據節點中 slave 節點作爲備份節點不提供服務;
Redis Sentinel 主要是針對 Redis 數據節點中的主節點的高可用切換,對 Redis 的數據節點做失敗判定分爲主觀下線和客觀下線兩種,對於 Redis 的從節點有對節點做主觀下線操作,並不執行故障轉移。
不能解決讀寫分離問題,實現起來相對複雜。

驗證

每一個配置文件對應一個redis進程:
啓動四個sentinel進程,端口分別是:26379/26380/26381/26382

port 26379 #26379/26380/26381/26382
daemonize yes
sentinel monitor mymaster 127.0.0.1 6379 1
sentinel auth-pass mymaster qazwsxedcrfvtgbyhnujmik
sentinel down-after-milliseconds mymaster 5000
logfile /chroot/bak/redisGroup/logs/26379.log
sentinel parallel-syncs mymaster 1
sentinel failover-timeout mymaster 180000

啓動命令:

./redis/redis-sentinel ./sentinelMaster.conf 
./redis/redis-sentinel ./sentinelSlaveOne.conf 
./redis/redis-sentinel ./sentinelSlaveTwo.conf 
./redis/redis-sentinel ./sentinelSlaveThree.conf 

查看狀態:

./redis/redis-cli -h 127.0.0.1 -p 26379 info Sentinel
./redis/redis-cli -h 127.0.0.1 -p 26380 info Sentinel
./redis/redis-cli -h 127.0.0.1 -p 26381 info Sentinel
./redis/redis-cli -h 127.0.0.1 -p 26382 info Sentinel

試驗:

注: 主從切換後sentinel.conf及redis.conf配置文件會被系統修改
sentinel模板:

port 26379
daemonize yes
sentinel monitor mymaster 127.0.0.1 6379 1
sentinel auth-pass mymaster qazwsxedcrfvtgbyhnujmik
sentinel down-after-milliseconds mymaster 5000
logfile /chroot/bak/redisGroup/logs/26379.log
sentinel parallel-syncs mymaster 1
sentinel failover-timeout mymaster 180000

正常啓動master及Slave後狀態:
查看master狀態:

[root@oracle redisGroup]# ./redis/redis-cli -h 127.0.0.1 -p 6379 -a qazwsxedcrfvtgbyhnujmik INFO replication  
# Replication
role:master
connected_slaves:3
slave0:ip=127.0.0.1,port=6380,state=online,offset=56,lag=0
slave1:ip=127.0.0.1,port=6381,state=online,offset=56,lag=0
slave2:ip=127.0.0.1,port=6382,state=online,offset=56,lag=0
master_replid:fe7261ac48b048c8bd7a208d0b76fe78530d2c85
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:56
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:56

查看Slave狀態:

[root@oracle redisGroup]# ./redis/redis-cli -h 127.0.0.1 -p 6382 -a qazwsxedcrfvtgbyhnujmik INFO replication 
# Replication
role:slave
master_host:127.0.0.1
master_port:6379
master_link_status:up
master_last_io_seconds_ago:4
master_sync_in_progress:0
slave_repl_offset:42
slave_priority:100
slave_read_only:1
connected_slaves:0
master_replid:fe7261ac48b048c8bd7a208d0b76fe78530d2c85
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:42
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:42

啓動sentinel,進程狀態:

[root@oracle redisGroup]# ps -ef | grep redis
root     28897     1  0 14:04 ?        00:00:00 redis/redis-server *:6379
root     28963     1  0 14:04 ?        00:00:00 redis/redis-server *:6380
root     28980     1  0 14:04 ?        00:00:00 redis/redis-server *:6381
root     28996     1  0 14:04 ?        00:00:00 redis/redis-server *:6382
root     29600     1  0 14:08 ?        00:00:00 ./redis/redis-sentinel *:26379 [sentinel]
root     29650     1  0 14:08 ?        00:00:00 ./redis/redis-sentinel *:26380 [sentinel]
root     29662     1  0 14:08 ?        00:00:00 ./redis/redis-sentinel *:26381 [sentinel]
root     29678     1  0 14:08 ?        00:00:00 ./redis/redis-sentinel *:26382 [sentinel]

sentinel狀態:

[root@oracle redisGroup]# ./redis/redis-cli -h 127.0.0.1 -p 26380 info Sentinel  
# Sentinel
sentinel_masters:1
sentinel_tilt:0
sentinel_running_scripts:0
sentinel_scripts_queue_length:0
sentinel_simulate_failure_flags:0
master0:name=mymaster,status=ok,address=127.0.0.1:6379,slaves=3,sentinels=4

master異常掛掉後狀態
master異常掛掉後查看master情況, 127.0.0.1:6381被選舉爲master身份.

[root@oracle redisGroup]# ./redis/redis-cli -h 127.0.0.1 -p 6381 -a qazwsxedcrfvtgbyhnujmik INFO replication 
# Replication
role:master
connected_slaves:2
slave0:ip=127.0.0.1,port=6382,state=online,offset=43684,lag=0
slave1:ip=127.0.0.1,port=6380,state=online,offset=43684,lag=0

[root@oracle redisGroup]# ./redis/redis-cli -h 127.0.0.1 -p 6380 -a qazwsxedcrfvtgbyhnujmik INFO replication
# Replication
role:slave
master_host:127.0.0.1
master_port:6381
master_link_status:up
master_last_io_seconds_ago:1
master_sync_in_progress:0

master重啓後查看狀態:
重新啓動原master 6379程序,需要手動修改一下原master主進程配置文件爲從配置文件。

[root@oracle redisGroup]# ./redis/redis-cli -h 127.0.0.1 -p 6381 -a qazwsxedcrfvtgbyhnujmik INFO replication
# Replication
role:master
connected_slaves:3
slave0:ip=127.0.0.1,port=6382,state=online,offset=323299,lag=1
slave1:ip=127.0.0.1,port=6380,state=online,offset=323432,lag=0
slave2:ip=127.0.0.1,port=6379,state=online,offset=323299,lag=1
master_replid:ff5862a7809c4ef5b6e181cfb92d0a5cc9b1dbf7
master_replid2:fe7261ac48b048c8bd7a208d0b76fe78530d2c85
[root@oracle redisGroup]# ./redis/redis-cli -h 127.0.0.1 -p 6379 -a qazwsxedcrfvtgbyhnujmik INFO replication  
# Replication
role:slave
master_host:127.0.0.1
master_port:6381
master_link_status:up
master_last_io_seconds_ago:1
master_sync_in_progress:0

二、keepalived方案

原理

Keepalived爲負載平衡和高可用性提供了框架。負載平衡框架依賴於衆所周知且廣泛使用的Linux虛擬服務器(IPVS)內核模塊,該模塊提供第4層負載平衡。Keepalived實現了一組健康檢查器,以根據其健康動態地自適應地維護和管理負載平衡的服務器池。虛擬冗餘路由協議(VRRP)實現高可用性。VRRP是路由器故障轉移的基礎磚塊。此外,keepalived實現了一組掛鉤到VRRP有限狀態機,提供低級別和高速協議交互。每個Keepalived框架可以獨立使用或一起使用,以提供彈性基礎設施。
在這種情況下,負載平衡器也可以被稱爲導向器或LVS路由器。
簡而言之,Keepalived提供了兩個主要功能:
健康檢查LVS系統
實施VRRPv2堆棧以處理負載均衡器故障轉移
Vip(虛擬路由器的IP地址): 一個虛擬路由器可以擁有多個ip地址,由用戶進行設置;

驗證

1、keepalived安裝(Centos6.x安裝測試存在問題)
安裝依賴包

[root@localhost ~]# yum install -y curl gcc openssl-devel libnl3-devel net-snmp-devel
[root@localhost ~]# yum install -y keepalived

[root@localhost ~]# systemctl start keepalived   //啓動keepalived
[root@localhost ~]# systemctl enable keepalived  //加入開機啓動keepalived
[root@localhost ~]# systemctl restart keepalived  //重新啓動keepalived
[root@localhost ~]# systemctl status keepalived   //查看keepalived狀態

由於需要監聽指定網絡信息,需要三臺虛擬主要進行測試,暫時沒有測試驗證成功。理論上用docker安裝也可以實現,待驗證
初步配置文件及配置結果如下:
1、查看keep運行日誌tail -f /var/log/messages

2、keep配置文件 /etc/keepalived/keepalived.conf

! Configuration File for keepalived

#全局配置
global_defs {
   router_id oracle      #機器標識
   script_user root root #script執行用戶名,如果這裏不設置可能報無執行腳本權限
   #enable_script_security
}

vrrp_script chk_redis {
   script "/chroot/bak/keep/scripts/master/redis_check.sh 127.0.0.1 6389 qazwsxed"#監控腳本
   interval 2  #腳本執行間隔(秒)
   weight 2    #腳本結果導致的優先級變更:10表示優先級+10;-10則表示優先級-10   
}

#網卡需要注意,使用ifconfig查看一下當前活動網卡
#VRRPD子進程,VRRPD子進程就是來實現VRRP協議的
vrrp_instance VI_1 {
    state BACKUP       #設置爲BACKUP
    nopreempt          #不搶佔MASTER
    #interface eth0    #監控網卡
    interface enp1s0   #監控網卡
    virtual_router_id 51
    priority 100       #權重值 
    advert_int 1       #檢查間隔,默認爲1秒
    #smtp_alert         #表示切換時給global defs中定義的郵件地址發送郵件通知
    authentication {       #認證配置
        auth_type PASS     #認證方式,可以是PASS或AH兩種認證方式
        auth_pass qazwsxed #認證密碼
    }
    virtual_ipaddress {  #虛擬IP
       192.168.11.124
    }
    #設置額外的監控,裏面的任意一個網卡出現問題,都會進入FAULT狀態
    #track_interface {
       #enp1s0
    #}

    track_script {#引用健康檢查腳本函數,執行上面定義的chk_redis 
       chk_redis
    }

    #當前節點成爲master時,通知腳本執行任務
    notify_master "/chroot/bak/keep/scripts/master/redis_master.sh 127.0.0.1 6389 qazwsxed"

    #當前節點成爲backup時
    notify_backup "/chroot/bak/keep/scripts/master/redis_backup.sh 127.0.0.1 6389 qazwsxed 6380"

    #當前節點出現故障,執行的任務
    notify_fault /chroot/bak/keep/scripts/master/redis_fault.sh

    #當前節點出現故障時,執行的任務
    notify_stop /chroot/bak/keep/scripts/master/redis_stop.sh
}

redis_check.sh腳本內容

#!/bin/bash  
ALIVE=`/chroot/bak/redisGroup/redisMaster/redis-cli -h $1 -p $2 -a $3 PING`
#ALIVE=`/chroot/bak/redisGroup/redisMaster/redis-cli -h 127.0.0.1 -p 6389 -a qazwsxed PING`
LOGFILE="/chroot/bak/keep/logs/keepalived-master-redis.log"
echo "———————————————–" >> $LOGFILE
echo "DATE:" $(date +"%Y-%m-%d %H:%M:%S") >> $LOGFILE
echo "PING: $ALIVE" >> $LOGFILE
echo "———————————————– " >> $LOGFILE
if [ "$ALIVE" == "PONG" ]; then
  echo $ALIVE
  exit 0
else
  echo $ALIVE 
  exit 1
fi

redis_master.sh腳本內容

#!/bin/bash
REDISCLI="/chroot/bak/redisGroup/redisMaster/redis-cli -h $1 -p $2 -a $3"
LOGFILE="/chroot/bak/keep/logs/keepalived-master-redis.log"
echo "———————————————–" >> $LOGFILE
echo "DATE:" $(date +"%Y-%m-%d %H:%M:%S") >> $LOGFILE
echo "[master]" >> $LOGFILE
#date >> $LOGFILE
echo "Being master...." >> $LOGFILE 2>&1
echo "Run SLAVEOF NO ONE cmd ..." >> $LOGFILE
#設置當前節點爲主節點
#slaveof no one 取消同步
$REDISCLI SLAVEOF NO ONE >> $LOGFILE 2>&1
echo "———————————————– " >> $LOGFILE

redis_backup.sh腳本內容

#!/bin/bash  
REDISCLI="/chroot/bak/redisGroup/redisMaster/redis-cli  -h $1 -p $2 -a $3"
LOGFILE="/chroot/bak/keep/logs/keepalived-master-redis.log"
echo "———————————————–" >> $LOGFILE
echo "DATE:" $(date +"%Y-%m-%d %H:%M:%S") >> $LOGFILE
echo "[backup]" >> $LOGFILE
#date >> $LOGFILE
echo "Being slave...." >> $LOGFILE 2>&1
echo "Run SLAVEOF cmd ..." >> $LOGFILE
#設置主redis信息
$REDISCLI SLAVEOF $1 $4 >> $LOGFILE  2>&1  #IP爲指定主redis的IP
echo "———————————————– " >> $LOGFILE

redis_fault.sh腳本內容

#!/bin/bash 
LOGFILE="/chroot/bak/keep/logs/keepalived-master-redis.log"
echo "———————————————–" >> $LOGFILE
echo "DATE:" $(date +"%Y-%m-%d %H:%M:%S") >> $LOGFILE
echo "STATUS: [fault]" >> $LOGFILE
echo "———————————————– " >> $LOGFILE

redis_stop.sh腳本內容

#!/bin/bash 
LOGFILE="/chroot/bak/keep/logs/keepalived-master-redis.log"
echo "———————————————–" >> $LOGFILE
echo "DATE:" $(date +"%Y-%m-%d %H:%M:%S") >> $LOGFILE
echo "STATUS: [stop]" >> $LOGFILE
echo "———————————————– " >> $LOGFILE

腳本監控日誌:

[root@oracle logs]# tail -f keepalived-master-redis.log 
PING: 
———————————————– 
———————————————–
DATE: 2019-11-29 11:42:00
PING: 
———————————————– 
———————————————–
DATE: 2019-11-29 11:42:02
PING: 
———————————————– 
———————————————–
DATE: 2019-11-29 11:42:04
PING: 

keepalived運行日誌:

Nov 29 11:41:39 oracle Keepalived_vrrp[4516]: VRRP_Instance(VI_1) Sending/queueing gratuitous ARPs on enp1s0 for 192.168.11.124
Nov 29 11:41:39 oracle Keepalived_vrrp[4516]: Sending gratuitous ARP on enp1s0 for 192.168.11.124
Nov 29 11:41:39 oracle Keepalived_vrrp[4516]: Sending gratuitous ARP on enp1s0 for 192.168.11.124
Nov 29 11:41:39 oracle Keepalived_vrrp[4516]: Sending gratuitous ARP on enp1s0 for 192.168.11.124
Nov 29 11:41:39 oracle Keepalived_vrrp[4516]: Sending gratuitous ARP on enp1s0 for 192.168.11.124
Nov 29 11:41:40 oracle Keepalived_vrrp[4516]: /chroot/bak/keep/scripts/master/redis_check.sh 127.0.0.1 6389 qazwsxed exited with status 1
Nov 29 11:41:42 oracle Keepalived_vrrp[4516]: /chroot/bak/keep/scripts/master/redis_check.sh 127.0.0.1 6389 qazwsxed exited with status 1

三、cacheCloud簡單介紹

官網:https://cachecloud.github.io/
git地址: https://github.com/sohutv/cachecloud

CacheCloud提供一個Redis雲管理平臺:實現多種類型(Redis Standalone、Redis Sentinel、Redis Cluster)自動部署、解決Redis實例碎片化現象、提供完善統計、監控、運維功能、減少運維成本和誤操作,提高機器的利用率,提供靈活的伸縮性,提供方便的接入客戶端。

1、添加機器
2、添加/導入應用
注意: 這裏的應用停用與啓用是直接對實際的redis進行啓動功關閉
全局統計中的應用下線也是對redis進行開啓或關閉操作

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章