目錄
Redis一主多從+Sentinel哨兵高可用方案
一、簡介
Redis-Sentinel是Redis官方推薦的高可用性(HA)解決方案。實際上這意味着你可以使用Sentinel模式創建一個可以不用人爲干預而應對各種故障的Redis部署。
二、主要功能
監控(Monitoring): Sentinel 會不斷地檢查你的主服務器和從服務器是否運作正常。
提醒(Notification): 當被監控的某個 Redis 服務器出現問題時, Sentinel 可以通過 API 向管理員或者其他應用程序發送通知。
自動故障遷移(Automatic failover): 當一個主服務器不能正常工作時, Sentinel 會開始一次自動故障遷移操作, 它會將失效主服務器的其中一個從服務器升級爲新的主服務器, 並讓失效主服務器的其他從服務器改爲複製新的主服務器; 當客戶端試圖連接失效的主服務器時, 集羣也會向客戶端返回新主服務器的地址, 使得集羣可以使用新主服務器代替失效服務器。
Redis Sentinel 是一個分佈式系統, 你可以在一個架構中運行多個 Sentinel 進程(progress), 這些進程使用流言協議(gossip protocols)來接收關於主服務器是否下線的信息, 並使用投票協議(agreement protocols)來決定是否執行自動故障遷移, 以及選擇哪個從服務器作爲新的主服務器。
Sentinel的主從原理:
三、環境搭建
三臺服務器: 分別部署3臺哨兵+Redis
172.16.63.130(master+哨兵A)
172.16.63.136(slaver+哨兵B)
172.16.63.135(slaver+哨兵C)
主從複製 - 讀寫分離
Redis的複製功能是支持多個數據庫之間的數據同步。一類是主數據庫(master)一類是從數據庫(slave),
主數據庫可以進行讀寫操作,當發生寫操作的時候自動將數據同步到從數據庫,
而從數據庫一般是只讀的,並接收主數據庫同步過來的數據,
一個主數據庫可以有多個從數據庫,而一個從數據庫只能有一個主數據庫。 通過redis的複製功能可以很好的實現數據庫的讀寫分離,提高服務器的負載能力。主數據庫主要進行寫操作,而從數據庫負責讀操作。
四、主從複製過程
1:當一個從數據庫啓動時,會向主數據庫發送sync命令
2:主數據庫接收到sync命令後會開始在後臺保存快照(執行rdb操作),並將保存期間接收到的命令緩存起來
3:當快照完成後,redis會將快照文件和所有緩存的命令發送給從數據庫
4:從數據庫收到後,會載入快照文件並執行收到的緩存的命令。
注意:redis2.8之前的版本:當主從數據庫同步的時候從數據庫因爲網絡原因斷開重連後會重新執行上述操作,不支持斷點續傳。redis2.8之後支持斷點續傳。
五、安裝過程:
1.下載源碼並解壓 wget http://download.redis.io/releases/redis-4.0.11.tar.gztar -xzf redis-4.0.11.tar.gzcd redis-4.0.11
2.編譯 yum y install gcc gccc++ kernel-develmake MALLOC=libc 等待編譯完成
3.安裝 make PREFIX=/usr/local/redis installmkdir /usr/local/redis/conf/cp redis.conf sentinel.conf /usr/local/redis/conf/
六、配置主從讀寫
A)172.16.63.130(master)
編輯配置文件 vim /usr/local/redis/conf/redis.conf
使用yes啓用守護進程 daemonize yes
設置端口 port 6379
配置redis訪問密碼的參數 requirepass "tst_redis"
主從同步密碼 masterauth "tst_redis"
關閉保護模式(重要,經測試採用默認值會導致從服務無法連接) protected-mode no
B)172.16.63.136(slaver)
編輯配置文件 vim /usr/local/redis/conf/redis.conf
使用yes啓用守護進程 daemonize yes
設置端口
port 6379
配置redis訪問密碼的參數
requirepass "tst_redis"
主從同步密碼 masterauth "tst_redis"
備機設置爲只讀
slave-read-only yes
設置主備同步
關閉保護模式(重要,經測試採用默認值會導致從服務無法連接)
protected-mode no
C)172.16.63.135(slaver)
編輯配置文件 vim /usr/local/redis/conf/redis.conf
使用yes啓用守護進程 daemonize yes
設置端口
port 6379
配置redis訪問密碼的參數
requirepass "tst_redis"
主從同步密碼 masterauth "tst_redis"
備機設置爲只讀
slave-read-only yes
設置主備同步
關閉保護模式(重要,經測試採用默認值會導致從服務無法連接)
protected-mode no
驗證主從讀寫
連接masterA
寫入key值
連接slaverB 獲取key值
連接slaverC 獲取key值
配置哨兵 A)172.16.63.130(哨兵A) 端口
訪問密碼
設置master地址
關閉保護模式
哨兵B/C採用同樣的方式進行配置。
驗證哨兵
默認130A爲master
kill 掉130的master
經過三個哨兵投票選擇135爲新的master