基於Redis版本: redis-6.0.5
主從複製
▶ 避免redis單點故障
▶ 構建讀寫分離架構,滿足讀多寫少的應用場景
主從架構
一:Redis安裝
官網地址:https://redis.io/
下載、解壓、複製:
wget http://download.redis.io/releases/redis-6.0.5.tar.gz # 下載
tar -zxvf redis-6.0.5.tar.gz #解壓
mv redis-6.0.5/ redis6379 #重命名
cp -r redis6379/ redis6380 #複製
cp -r redis6379/ redis6381 #複製
編譯:
cd redis6379 #進入目錄
make #編譯
make命令可能出現的問題、以及解決方案
錯誤一:cc:命令未找到
解決方案:yum install gcc
錯誤二:致命錯誤:jemalloc/jemalloc.h:沒有那個文件或目錄
解決方案:使用 make MALLOC=libc 命令代替 make
錯誤三:突然一大推錯誤和警告,報錯信息如下
解決方案:升級gcc版本到9.1,再執行編譯
# gcc -v # 查看gcc版本
# yum -y install centos-release-scl # 升級到9.1版本
# yum -y install devtoolset-9-gcc devtoolset-9-gcc-c++ devtoolset-9-binutils
# scl enable devtoolset-9 bash
複製常用操作命令到上一級:
cp src/redis-cli ./ #複製命令 (這兩步可以省略,只爲了操作起來方便)
cp src/redis-server ./ #複製命令
redis6380、redis6381執行同樣的編譯操作
二:修改redis.conf
redis6379/redis.conf
port 6379 # 端口
pidfile /var/run/redis_6379.pid # pid文件位置
daemonize yes # 開啓支持後臺啓動
requirepass 123456 # 開啓密碼驗證
# bind 127.0.0.1 # 註釋這一句,讓redis支持ip訪問
redis6380/redis.conf
port 6380 # 端口
pidfile /var/run/redis_6380.pid # pid文件位置
daemonize yes # 開啓支持後臺啓動
requirepass 123456 # 開啓密碼驗證
# bind 127.0.0.1 # 註釋這一句,讓redis支持ip訪問
redis6381/redis.conf
port 6381 # 端口
pidfile /var/run/redis_6381.pid # pid文件位置
daemonize yes # 開啓支持後臺啓動
requirepass 123456 # 開啓密碼驗證
# bind 127.0.0.1 # 註釋這一句,讓redis支持ip訪問
三:配置主從
▶ 在從redis服務的redis.conf中設置 replicaof<masterip> <masterport>
配置 6380 和 6381 的redis.conf
啓動redis
/usr/local/redis6379/redis-server /usr/local/redis6379/redis.conf
/usr/local/redis6380/redis-server /usr/local/redis6380/redis.conf
/usr/local/redis6381/redis-server /usr/local/redis6381/redis.conf
連接客戶端,查看主從信息:info replication
主(6379):
從(6380):
四:讀寫分離
在主庫寫入數據:
在從庫讀取數據:
tip:默認情況下,從redis數據庫是隻允許讀操作的,不能進行寫操作。
開啓slave非只讀:slave-read-only no(不建議做,會導致主從數據不一致)
主從複製過程
1:當從庫和主庫建立MS(主從)關係後,會向主數據庫發送SYNC(同步)命令;
2:主庫接收到SYNC命令後會開始在後臺保存快照(RDB持久化過程),並將期間接收到的寫命令緩存起來;
3:當快照完成後,主Redis會將快照文件和所有緩存的寫命令發送給從Redis;
4:從Redis接收到後,會載入快照文件並且執行收到的緩存的命令;
5:之後,主Redis每當接收到寫命令時就會將命令發送從Redis,從而保證數據的一致;
五:主從架構中出現宕機怎麼辦
如果在主從複製架構中出現宕機的情況,需要分情況看:
● 從Redis宕機
策略:重新啓動從數據庫,會自動加入到主從架構中,自動完成同步數據;
● 主Redis宕機
第一步,在從數據庫中執行SLAVEOF NO ONE命令,斷開主從關係並且提升爲主庫繼續服務;
第二步,將主庫重新啓動後,執行SLAVEOF命令,將其設置爲其他庫的從庫,這時數據就能更新回來;
主數據庫宕機後的手動完成恢復的過程其實是比較麻煩的並且容易出錯,有沒有好辦法解決呢?當前有的,Redis提供的哨兵(sentinel)的功能。
六:redis哨兵
1:哨兵是什麼?
哨兵的作用就是對Redis的系統的運行情況的監控,它是一個獨立進程
2:哨兵的作用?
監控(Monitoring): 哨兵(sentinel) 會不斷地檢查你的Master和Slave是否運作正常。
· 提醒(Notification):當被監控的某個 Redis出現問題時, 哨兵(sentinel) 可以通過 API 向管理員或者其他應用程序發送通知。
· 自動故障遷移(Automatic failover):當一個Master不能正常工作時,哨兵(sentinel) 會開始一次自動故障遷移操作,它會將失效Master的其中一個Slave升級爲新的Master, 並讓失效Master的其他Slave改爲複製新的Master; 當客戶端試圖連接失效的Master時,集羣也會向客戶端返回新Master的地址,使得集羣可以使用Master代替失效Master。
哨兵(sentinel) 是一個分佈式系統,你可以在一個架構中運行多個哨兵(sentinel) 進程,這些進程使用流言協議(gossipprotocols)來接收關於Master是否下線的信息,並使用投票協議(agreement protocols)來決定是否執行自動故障遷移,以及選擇哪個Slave作爲新的Master.
單哨兵監控
配置單哨兵監控
1:修改哨兵文件 sentinel.conf
vim redis6379/sentinel.conf
2:修改內容
mymaster:監控主數據的名稱,支持自定義
127.0.0.1:監控的主數據庫的IP
6379:監控的主數據庫的端口
1:最低通過票數
3:啓動哨兵進程:
cd redis6379/ #進去redis安裝目錄
cp src/redis-sentinel ./ #複製哨兵服務啓動命令
./redis-sentinel sentinel.conf #啓動哨兵服務
由上圖可以看到:
1:哨兵已經啓動,它的id爲0e786aa868334de731814accecb107a35c0a5320
2:爲master數據庫添加了一個監控
3:發現了2個slave(由此可以看出,哨兵無需配置slave,只需要指定master,哨兵會自動發現slave)
測試從庫宕機
查看哨兵控制檯輸出
+sdown:服務宕機,說明哨兵監控到slave宕機了,那麼,如果我們將宕機的slave服務重啓後,會自動加入到主從複製嗎?
重新啓動後,查看哨兵控制檯輸出
-sdown:服務恢復,可以看出slave重新加入了主從架構中
測試主庫宕機
查看哨兵控制檯輸出
連接6381查看狀態
可以看出,目前,6381位master,擁有一個slave爲6380.
接下來,我們恢復6379查看哨兵控制檯輸出:
測試發現:主庫宕機後,會將一個從庫選爲主,當宕機的主庫重新連接時,也只能作爲新主庫的小弟了。
配置多個哨兵
配置了一個哨兵,如果該哨兵宕機了,那麼整個主從架構就回復到了原始的情況,所以我們可以配置多個哨兵,每個哨兵監控Redis信息,並且哨兵之間也會互相監控。哨兵也具有類似zookeeper的選舉機制,所以測試配置三個哨兵。
修改sentinel.conf
vim redis6379/sentinel.conf
設置最低通過票數爲 2,並且設置哨兵服務支持後臺啓動
複製兩份哨兵文件
cp sentinel.conf sentinel_1.conf
cp sentinel.conf sentinel_2.conf
修改sentinel_1.conf、sentinel_1.conf的port
啓動哨兵
./redis-sentinel sentinel.conf
./redis-sentinel sentinel_1.conf
./redis-sentinel sentinel_2.conf
效果測試和一個哨兵差不多。有興趣的自己去玩一下。
哨兵學習博客:https://blog.csdn.net/a67474506/article/details/50435498
上一篇:redis數據持久化
下一篇:redis4.x 主從集羣的搭建