就寫給自己以后忘記的時候看看练链,不一定正確
安裝redis
wget http://download.redis.io/releases/redis-5.0.3.tar.gz
tar xzf redis-5.0.3.tar.gz
cd redis-5.0.3
make
cd src
cp redis-cli redis-sentinel redis-server /usr/sbin
#配置文件模板在redis-5.0.3目錄里面
cd ../
cp redis.conf sentinel.conf /etc/ #方便等下運行的時候,指定配置文件
一窟赏、搭建master-slave模式 (主備模式)
192.168.3.27 (master)
192.168.3.26 (slave)
修改master上的配置文件
vim /etc/redis.conf
然后在文件里面修改一下配置
bind 127.0.0.1====>bind 0.0.0.0 #方便其他機器訪問
daemonize no====>daemonize yes #以后臺方式運行
logfile ""====>logfile "/var/log/redis.conf" #指定日志文件,方便追蹤排查
然后運行
redis-server /etc/redis.conf
修改slave主機上的配置文件
修改和master一樣的設(shè)置后,在redis.conf里面增加
replicaof 192.168.3.27 6379 #指定本機的master為192.168.3.27
然后運行
redis-server /etc/redis.conf
查看運行結(jié)果
驗證
在master上設(shè)置一個key后,在slave上也有相應(yīng)的key,默認情況該模式下财骨,主服務(wù)器上可以進行讀寫,從服務(wù)器只能讀藏姐,如:
但是如果在從服務(wù)器的配置文件修改配置
將replica-read-only的值yes改成no隆箩,重啟后,就可以讀寫
ps:從服務(wù)器配置成可以寫入羔杨,但是寫入的值并不會同步到主服務(wù)器上
同步機制
- 當(dāng)slave第一次連上master時捌臊,會進行一次完整同步
- 當(dāng)master上寫入新的值時,slave會向master請求一次partial resynchronization兜材,根據(jù)offset值理澎,只進行增量同步
- 當(dāng)master重啟之后,slave向master請求增量同步時曙寡,由于和之前的id不一致糠爬,所以會重新進行一次完整同步
二、搭建master-sentinel模式 (哨兵模式)
sentinel模式可以在master下線后举庶,從slave中選擇一臺升級為master秩铆。
配置環(huán)境列表:
ip: 11.11.1.108 port: 6379 (master) -------- ip: 11.11.1.108 port: 26379 (sentinel進程)
ip: 11.11.1.107 port: 6379 (slave) -------- ip: 11.11.1.107 port: 26379 (sentinel進程)
ip: 11.11.1.106 port: 6379 (master) -------- ip: 11.11.1.106 port: 26379 (sentinel進程)
配置文件:
1、首先按照主備分別配置3臺服務(wù)器 ()
slave上的redis.conf 上灯变,在默認的配置文件里面添加
replicaof 11.11.1.108 6379 # 標明是108的slave
然后在3臺服務(wù)器上分別啟動redis
redis-server /etc/redis/redis.conf
2、配置 sentinel
下面是配置sentinel文件的典型配置:
sentinel monitor mymaster 127.0.0.1 6379 2
sentinel down-after-milliseconds mymaster 60000
sentinel failover-timeout mymaster 180000
sentinel parallel-syncs mymaster 1
sentinel monitor <master-group-name> <ip> <port> <quorum>
意思是sentinel進程捅膘,去監(jiān)聽一組名稱為:master-group-name 的redis服務(wù)添祸。
quorum的意思是仲裁的數(shù)量,例如 sentinel monitor mymaster 127.0.0.1 6379 2
表示監(jiān)聽一組名稱為mymaster的服務(wù)寻仗,監(jiān)聽的地址是127.0.0.1的6379端口刃泌, 仲裁的數(shù)量為2。
ps: 需要設(shè)置仲裁的原因是,redis-sentinel模式是靠sentinel進程去監(jiān)聽服務(wù)耙替,然后去變換master亚侠,如果你集群里面設(shè)置3個redis服務(wù),然后只有一個sentinel去監(jiān)聽俗扇,那么當(dāng)這個sentinel進程掛掉的時候硝烂,就不會自動變換master了呀。quorum = 2 表示兩個sentinel進程監(jiān)聽到master下線了铜幽,就會觸發(fā)變換master的過程down-after-milliseconds
實例無法訪問超過這個時間后滞谢,sentinel就會認為這個master已經(jīng)下線parallel-syncs
在執(zhí)行故障轉(zhuǎn)移時, 最多可以有多少個從服務(wù)器同時對新的主服務(wù)器進行同步failover-timeout
故障轉(zhuǎn)移時除抛,超時的時間
3狮杨、配置
配置11.11.1.108 (master) sentinel.conf
port 26379
bind 0.0.0.0
daemonize yes
sentinel monitor zycloud localhost 6379 2
sentinel down-after-milliseconds zycloud 30000
sentinel failover-timeout zycloud 180000
sentinel parallel-syncs zycloud 1
配置11.11.1.106,11.11.1.107 sentinel.conf
port 26379
bind 0.0.0.0
daemonize yes
sentinel monitor zycloud 11.11.1.108 6379 2
sentinel down-after-milliseconds zycloud 30000
sentinel failover-timeout zycloud 180000
sentinel parallel-syncs zycloud 1
然后在3臺服務(wù)器上分別把sentinel啟動
redis-sentinel /etc/redis/sentinel.conf
4到忽、測試
-
首先在3臺服務(wù)器都存活的情況下
目前初始情況下橄教,108是master。
查看一下sentinel的信息:
~ redis-cli -h 11.11.1.108 -p 26379
11.11.1.108:26379> sentinel masters
1) 1) "name"
2) "zycloud"
3) "ip"
4) "127.0.0.1" #目前的master ip 喘漏,由于是通過108登錄進來的护蝶,所以目前顯示的是127.0.0.1
5) "port"
6) "6379"
7) "runid"
8) "9d626bf0aaf0bdd9f00925436ac6b59702f68121"
9) "flags"
10) "master"
11) "link-pending-commands"
12) "0"
也可以通過sentinel的get-master-addr-by-name來獲取目前的master ip
11.11.1.108:26379> sentinel get-master-addr-by-name zycloud
1) "127.0.0.1"
2) "6379"
- 現(xiàn)在斷開master,可以只殺掉redis-server的進程陷遮,也可以直接關(guān)機滓走,我比較懶,直接斷開master的網(wǎng)卡
~ redis-cli -h 11.11.1.106 -p 26379
11.11.1.106:26379> sentinel get-master-addr-by-name zycloud
1) "11.11.1.107"
2) "6379"
11.11.1.106:26379>
可以看到帽馋,現(xiàn)在的master已經(jīng)被更換為107了搅方。
1)由于上面設(shè)置的quorum = 2,所以測試的時候绽族,最少需要兩個sentinel進程存活姨涡,否則是無法選舉新的master
2)選舉哪臺從服務(wù)器升級為master是根據(jù)配置文件redis.conf里的replica-priority判斷的
3)配置文件redis.conf是會被sentinel修改配置的