一、主從簡單配置
系統環境: 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進行開啓或關閉操作