一文掌握Redis的三種叢集方案
阿新 • • 發佈:2020-03-16
在開發測試環境中,我們一般搭建Redis的單例項來應對開發測試需求,但是在生產環境,如果對可用性、可靠性要求較高,則需要引入Redis的叢集方案。雖然現在各大雲平臺有提供快取服務可以直接使用,但瞭解一下其背後的實現與原理總還是有些必要(比如面試), 本文就一起來學習一下Redis的幾種叢集方案。
Redis支援三種叢集方案
* 主從複製模式
* Sentinel(哨兵)模式
* Cluster模式
## 主從複製模式
### 1. 基本原理
主從複製模式中包含一個主資料庫例項(master)與一個或多個從資料庫例項(slave),如下圖
![redis-master-slave](https://img2020.cnblogs.com/other/632381/202003/632381-20200316092434553-1122086987.png)
客戶端可對主資料庫進行讀寫操作,對從資料庫進行讀操作,主資料庫寫入的資料會實時自動同步給從資料庫。
具體工作機制為:
1. slave啟動後,向master傳送SYNC命令,master接收到SYNC命令後通過bgsave儲存快照(即上文所介紹的RDB持久化),並使用緩衝區記錄儲存快照這段時間內執行的寫命令
2. master將儲存的快照檔案傳送給slave,並繼續記錄執行的寫命令
3. slave接收到快照檔案後,載入快照檔案,載入資料
4. master快照發送完後開始向slave傳送緩衝區的寫命令,slave接收命令並執行,完成複製初始化
5. 此後master每次執行一個寫命令都會同步傳送給slave,保持master與slave之間資料的一致性
### 2. 部署示例
本示例基於Redis 5.0.3版。
redis.conf的主要配置
```conf
###網路相關###
# bind 127.0.0.1 # 繫結監聽的網絡卡IP,註釋掉或配置成0.0.0.0可使任意IP均可訪問
protected-mode no # 關閉保護模式,使用密碼訪問
port 6379 # 設定監聽埠,建議生產環境均使用自定義埠
timeout 30 # 客戶端連線空閒多久後斷開連線,單位秒,0表示禁用
###通用配置###
daemonize yes # 在後臺執行
pidfile /var/run/redis_6379.pid # pid程序檔名
logfile /usr/local/redis/logs/redis.log # 日誌檔案的位置
###RDB持久化配置###
save 900 1 # 900s內至少一次寫操作則執行bgsave進行RDB持久化
save 300 10
save 60 10000
# 如果禁用RDB持久化,可在這裡新增 save ""
rdbcompression yes #是否對RDB檔案進行壓縮,建議設定為no,以(磁碟)空間換(CPU)時間
dbfilename dump.rdb # RDB檔名稱
dir /usr/local/redis/datas # RDB檔案儲存路徑,AOF檔案也儲存在這裡
###AOF配置###
appendonly yes # 預設值是no,表示不使用AOF增量持久化的方式,使用RDB全量持久化的方式
appendfsync everysec # 可選值 always, everysec,no,建議設定為everysec
###設定密碼###
requirepass 123456 # 設定複雜一點的密碼
```
部署主從複製模式只需稍微調整slave的配置,在redis.conf中新增
```conf
replicaof 127.0.0.1 6379 # master的ip,port
masterauth 123456 # master的密碼
replica-serve-stale-data no # 如果slave無法與master同步,設定成slave不可讀,方便監控指令碼發現問題
```
本示例在單臺伺服器上配置master埠6379,兩個slave埠分別為7001,7002,啟動master,再啟動兩個slave
```shell
[root@dev-server-1 master-slave]# redis-server master.conf
[root@dev-server-1 master-slave]# redis-server slave1.conf
[root@dev-server-1 master-slave]# redis-server slave2.conf
```
進入master資料庫,寫入一個數據,再進入一個slave資料庫,立即便可訪問剛才寫入master資料庫的資料。如下所示
```shell
[root@dev-server-1 master-slave]# redis-cli
127.0.0.1:6379> auth 123456
OK
127.0.0.1:6379> set site blog.jboost.cn
OK
127.0.0.1:6379> get site
"blog.jboost.cn"
127.0.0.1:6379> info replication
# Replication
role:master
connected_slaves:2
slave0:ip=127.0.0.1,port=7001,state=online,offset=13364738,lag=1
slave1:ip=127.0.0.1,port=7002,state=online,offset=13364738,lag=0
...
127.0.0.1:6379> exit
[root@dev-server-1 master-slave]# redis-cli -p 7001
127.0.0.1:7001> auth 123456
OK
127.0.0.1:7001> get site
"blog.jboost.cn"
```
執行`info replication`命令可以檢視連線該資料庫的其它庫的資訊,如上可看到有兩個slave連線到master
### 3. 主從複製的優缺點
優點:
1. master能自動將資料同步到slave,可以進行讀寫分離,分擔master的讀壓力
2. master、slave之間的同步是以非阻塞的方式進行的,同步期間,客戶端仍然可以提交查詢或更新請求
缺點:
1. 不具備自動容錯與恢復功能,master或slave的宕機都可能導致客戶端請求失敗,需要等待機器重啟或手動切換客戶端IP才能恢復
2. master宕機,如果宕機前資料沒有同步完,則切換IP後會存在資料不一致的問題
3. 難以支援線上擴容,Redis的容量受限於單機配置
## Sentinel(哨兵)模式
### 1. 基本原理
哨兵模式基於主從複製模式,只是引入了哨兵來監控與自動處理故障。如圖
![redis-sentinel](https://img2020.cnblogs.com/other/632381/202003/632381-20200316092434904-227928571.png)
哨兵顧名思義,就是來為Redis叢集站哨的,一旦發現問題能做出相應的應對處理。其功能包括
1. 監控master、slave是否正常執行
2. 當master出現故障時,能自動將一個slave轉換為master(大哥掛了,選一個小弟上位)
3. 多個哨兵可以監控同一個Redis,哨兵之間也會自動監控
哨兵模式的具體工作機制:
在配置檔案中通過 `sentinel