redis 主從複製
主機數據更新後根據配置和策略, 自動同步到備機的master/slaver機制,Master以寫爲主,Slave以讀爲主。
作用:
- 讀寫分離,性能擴展
- 容災快速恢復
主從複製
- 新建redis6379.conf,填寫以下內容
-
新建redis6380.conf,填寫以下內容
-
新建redis6381.conf,填寫以下內容
:%s/舊字符/替換的新字符
slave-priority 10
設置從機的優先級,值越小,優先級越高,用於選舉主機時使用。默認100
-
啓動三臺redis服務器
-
查看系統進程,看看三臺服務器是否啓動。
- 查看三臺主機運行情況
info replication 打印主從複製的相關信息。
配從不配主
在從機上 6380和6381上執行: slaveof 127.0.0.1 6379
就可以認6379爲主機。
在主機上寫,在從機上可以讀取數據,在從機上寫數據報錯。
- 主機掛掉,重啓就行,一切如初。
- 主機數據沒有保存而掛掉,再重新啓動主機時,從機數據也會沒有,因爲從機數據來自主機。
- 從機重啓需重設:slaveof 127.0.0.1 6379
- 可以將配置增加到文件中。永久生效。
主從複製常用的三種模式
- 一主二僕
- 薪火相傳
- 反客爲主
一主二僕
切入點問題?slave1、slave2是從頭開始複製還是從切入點開始複製?比如從k4進來,那之前的k1,k2,k3是否也可以複製?是
從機是否可以寫?set可否?否
主機shutdown後情況如何?還是大哥
從機是上位還是原地待命? 原地待命
主機又回來了後,主機新增記錄,從機還能否順利複製? 能
其中一臺從機down後情況如何?依照原有它能跟上大部隊嗎? 有,需要重新slaveof 拜大哥。
-
複製原理
每次從機聯通後,都會給主機發送sync(同步)指令
主機立刻進行存盤操作,發送RDB文件給從機
從機收到RDB文件後覆蓋自己的RDB文件,進行全盤加載,之後每次主機的寫操作,都會立刻發送給從機,從機執行相同的命令。
薪火相傳
上一個Slave可以是下一個slave的Master,Slave同樣可以接收其他 slaves的連接和同步請求,那麼該slave作爲了鏈條中下一個的master, 可以有效減輕master的寫壓力,去中心化降低風險。
用 slaveof <ip> <port>
中途變更轉向:會清除之前的數據,重新建立拷貝最新的,風險是一旦某個slave宕機,後面的slave都沒法備份
主機掛了,從機還是從機,無法寫數據了。
反客爲主
當一個master宕機後,後面的slave可以立刻升爲master,其後面的slave不用做任何修改。用 slaveof no one
指令 將從機變爲主機。
複製原理
- Slave啓動成功連接到master後會發送一個sync命令
- Master接到命令啓動後臺的存盤進程,同時收集所有接收到的用於修改數據集命令, 在後臺進程執行完畢之後,master將傳送整個數據文件到slave,以完成一次完全同步
- 全量複製:而slave服務在接收到數據庫文件數據後,將其存盤並加載到內存中。
- 增量複製:Master繼續將新的所有收集到的修改命令依次傳給slave,完成同步
- 但是隻要是重新連接master,一次完全同步(全量複製)將被自動執行
哨兵模式(sentinel)
反客爲主的自動版,能夠後臺監控主機是否故障,如果故障了根據投票數自動將從庫轉換爲主庫。
步驟:
-
自定義的/myredis目錄下新建sentinel.conf文件,名字絕不能錯
-
配置哨兵,填寫內容
sentinel monitor mymaster 127.0.0.1 6379 1 其中mymaster爲監控對象起的服務器名稱, 1 爲至少有多少個哨兵同意遷移的數量。
-
啓動哨兵
/usr/local/bin
執行redis-sentinel /myredis/sentinel.conf
- 當主機掛掉,從機選舉中產生新的主機
- (大概10秒左右可以看到哨兵窗口日誌,切換了新的主機)哪個從機會被選舉爲主機呢?根據優先級別:slave-priority 。原主機重啓後會變爲從機。
原因可以看,先的主機配置文件
這裏會指定主機。