1. 程式人生 > >一文掌握Redis的三種叢集方案

一文掌握Redis的三種叢集方案

在開發測試環境中,我們一般搭建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