一,單實例模式linux
當系統中只有一臺redis運行時,一旦該redis掛了,會致使整個系統沒法運行。c++
二,主從模式redis
因爲單臺redis出現單點故障,就會致使整個系統不可用,因此想到的辦法天然就是備份。當一臺redis出現問題了,另外一臺redis能夠繼續提供服務。vim
三,自動故障轉移機制安全
四,redis的主從複製部署bash
4.1 環境描述服務器
這裏使用三臺服務器,每臺服務器上開啓一個redis-server和redis-sentinel服務,redis-server端口爲8000,redis-sentinel的端口爲6800,修改默認端口是安全的第一步。併發
redis-server測試 |
說明spa |
redis-sentinel |
10.1.1.153:8000 |
redis-master |
10.1.1.153: 6800 |
10.1.1.154:8000 |
redis-slaveA |
10.1.1.154: 6800 |
10.1.1.155:8000 |
redis-slaveB |
10.1.1.155: 6800 |
部署環境,關閉防火牆和selinux
4.2 redis-server端的部署
三臺服務器上都進行以下編譯安裝
[root@redis-master ~]# yum -y install gcc gcc-c++ make automake autoconf
[root@redis-master ~]# tar xf redis-4.0.11.tar.gz -C /usr/src/
[root@redis-master ~]# cd /usr/src/redis-4.0.11/
[root@redis-master redis-4.0.11]# make && make MALLOC=jemalloc && make PREFIX=/usr/local/redis install
[root@redis-master redis-4.0.11]# mkdir -p /usr/local/redis/conf
[root@redis-master redis-4.0.11]# cp redis.conf /usr/local/redis/conf/
[root@redis-master redis-4.0.11]# cp sentinel.conf /usr/local/redis/conf/
[root@redis-master conf]# ln -s /usr/local/redis/bin/* /usr/local/bin/
4.3 redis.conf配置文件修改
redis-master配置文件修改:(修改前可備份配置文件)
[root@redis-master ~]# cd /usr/local/redis/conf/
[root@redis-master conf]# ls
redis.conf sentinel.conf
[root@redis-master conf]# cp redis.conf{,.bak}
修改一下配置文件內容:
redis-slave配置文件修改:
4.4 redis-server的啓動
先啓動redis-master再啓動兩個從(都放後臺啓動,爲的是在前臺能直接看到日誌輸出信息)
[root@redis-master ~]# redis-server /usr/local/redis/conf/redis.conf &
經過命令查看主從複製狀況
[root@redis-master ~]# redis-cli -p 8000 info replication
五,redis的高可用部署(redis-sentinel)
(1)修改sentinel.conf配置文件
修改配置文件如下幾行
修改爲以下內容
[root@redis-master conf]# cat -n /usr/local/redis/conf/sentinel.conf | sed -n '21p;69p;98p;106p;131p'
注意:如今這個sentinel.conf是能夠scp的(沒啓動sentinel以前),可是當啓動了sentinel後就不能夠再scp了,啓動了sentinel,它會在配置文件里加不少東西,它會往裏面寫許多數據,行號就和以前的行號不同了,其中就會有sentinel的myid號,啓動以後再複製,會致使全部sentinel的myid號都同樣,它們之間都會認爲是本身,就找不着對方了。
配置文件說明:
再在sentinel.conf的最後追加如下四句話
(2)啓動redis-sentinel(先啓動master)
[root@redis-master ~]# redis-sentinel /usr/local/redis/conf/sentinel.conf &(後臺啓動)
雖然用redis客戶端鏈接sentinel 6800端口能夠鏈接,可是往裏面輸入命令是沒用的,sentinel是看info的
6800端口是sentinel之間互相訪問的,sentinel的使用是主從忽然發生切換,能夠經過訪問任何一臺機器的sentinel,就會知道把誰切換成主了(沒實現VIP漂移以前就是這麼查看)
啓動之後,查看sentinel信息
啓動完sentinel以後,查看它的配置文件多了哪些東西
再啓動redis-slaveA的sentinel
[root@redis-slaveA ~]# redis-sentinel /usr/local/redis/conf/sentinel.conf &
啓動之後,查看sentinel信息
再啓動redis-slaveB的sentinel
[root@redis-slaveB~]# redis-sentinel /usr/local/redis/conf/sentinel.conf &
啓動之後,查看sentinel信息
(3)進行redis-master的宕機測試
咱們宕掉redis-master的redis-server服務,而後查看sentinel信息
[root@redis-master conf]# redis-cli -p 8000 shutdown
查看redis-sentinel日誌
[root@redis-master conf]# cat /var/log/sentinel.log
日誌信息略,能看懂就行,看不懂百度翻譯
再把主的服務啓動,而後查看主的info信息
[root@redis-master conf]# redis-server /usr/local/redis/conf/redis.conf &
連續切換,試一下
[root@redis-slaveB conf]# redis-server /usr/local/redis/conf/redis.conf &
六,redis-sentinel的VIP漂移
假如在redis上,咱們也創建一個VIP機制,一旦redis-master宕機,那麼原本在master上的VIP就會漂移到新的master上。
如此一來開發在鏈接redis的時候,即使redis-master發生切換,那麼開發也不須要修改代碼了。
這裏咱們可使用redis sentinel的一個參數client-reconfig-script,這個參數配置執行腳本,sentinel在作failover的時候會執行這個腳本,而且傳遞7個參數<master-name>,<role>,<state>,<from-ip>,<from-port>,<to-ip>,<to-port>,其中<to-ip>是新主redis的IP地址,能夠在這個腳本里作VIP漂移操做
在sentinel.conf裏增長一句話
sentinel client-reconfig-script master8000 /usr/local/redis/notify_master6800.sh 增長漂移腳本路徑
寫一個漂移腳本
[root@redis-master redis]# pwd
/usr/local/redis
[root@redis-master redis]# vim notify_master6800.sh
[root@redis-master redis]# cat notify_master6800.sh
#!/bin/bash
MASTER_IP=$6 #第六個參數就是sentinel傳入進行來的新master的IP
LOCAL_IP="10.1.1.153" #腳本所在服務器的本地IP(每一個服務器都不一樣)
VIP="10.1.1.244"
NETMASK="24"
INTERFACE="ens32"
if [[ "${MASTER_IP}" == "${LOCAL_IP}" ]];then
/usr/sbin/ip addr add ${VIP}/${NETMASK} dev ${INTERFACE}
/usr/sbin/arping -q -c 3 -A ${VIP} -I ${INTERFACE}
exit 0
else
/usr/sbin/ip addr del ${VIP}/${NETMASK} dev ${INTERFACE}
exit 0
fi
exit 1
改一下服務器的IP
給腳本加x權限
[root@redis-master redis]# chmod +x notify_master6800.sh
從新啓動全部的redis-sentinel進程
[root@redis-master redis]# pkill redis-sentinel
[root@redis-master redis]# redis-sentinel /usr/local/redis/conf/sentinel.conf
第一次時手動給master添加VIP
[root@redis-master redis]# ip addr add 10.1.1.244/24 dev ens32
讓ip地址即刻生效
[root@redis-master redis]# arping -q -c 3 -A 10.1.1.244 -I ens32
接下來進行ip漂移測試
查看VIP所在服務器
查看redis-master所屬服務器
中止153服務器的redis-server服務
[root@redis-master ~]# redis-cli -p 8000 shutdown
查看redis-master的所屬服務器
在154服務器上查看VIP及主從複製狀況
再開啓153的redis-server服務
[root@redis-master ~]# redis-server /usr/local/redis/conf/redis.conf &
查看主從複製狀況
關掉154的服務,並查看154所屬服務器
[root@redis-slaveA conf]# redis-cli -p 8000 shutdown
在主服務器153上查看VIP及主從複製狀況
將154服務開啓,再看主從複製狀況
至此redis-sentinel的VIP漂移測試成功。redis-sentinel能夠持續高可用,能夠繼續測試。