【Redis】10.主從複製
1. 介紹
主機資料更新後根據配置和策略, 自動同步到備機的master/slaver機制,Master以寫為主,Slave以讀為主。
作用:
- 讀寫分離,效能擴充套件。
- 容災快速恢復。
2. 實現流程
- 拷貝多個redis.conf檔案include(寫絕對路徑)
- 開啟daemonize yes
- pid檔名字pidfile
- 指定埠port
- log檔名字
- dump.rdb名字dbfilename
- appendonly 關掉或者換名字
2.1 新建redis6379.conf
include /myredis/redis.conf pidfile /var/run/redis_6379.pid port 6379 dbfilename dump6379.rdb
2.2 新建redis6380.conf
include /myredis/redis.conf
pidfile /var/run/redis_6380.pid
port 6380
dbfilename dump6380.rdb
2.3 新建redis6381.conf
include /myredis/redis.conf
pidfile /var/run/redis_6381.pid
port 6381
dbfilename dump6381.rdb
2.4 啟動三臺redis伺服器
redis-server redis6379.conf redis-server redis6380.conf redis-server redis6381.conf
2.5 檢視三臺主機執行情況
- info replication
- 列印主從複製的相關資訊
2.6 配從庫不配主庫
- slaveof <ip> <port>
- 成為某個例項的從伺服器
-
在6380和6381上執行: slaveof 127.0.0.1 6379
-
在主機上寫,在從機上可以讀取資料。在從機上寫資料報錯。
-
主機掛掉,重啟就行,一切如初。
-
從機重啟需重設:slaveof 127.0.0.1 6379,可以將配置增加到檔案中。永久生效。
3. 常用的三種方法
3.1 一主二僕
- slave1、slave2是從頭開始複製。
- 從機不可以寫。
- 主機shutdown後從機原地待命。
- 主機又回來了後,主機新增記錄,從機還可以進行復制。
- 其中一臺從機shutdown後,從機恢復後會複製主機所有資料。
3.2 薪火相傳
上一個Slave可以是下一個slave的Master,Slave同樣可以接收其他 slaves的連線和同步請求,那麼該slave作為了鏈條中下一個的master, 可以有效減輕master的寫壓力,去中心化降低風險。
用 slaveof <ip> <port>
中途變更轉向:會清除之前的資料,重新建立拷貝最新的
風險是一旦某個slave宕機,後面的slave都沒法備份
主機掛了,從機還是從機,無法寫資料了
3.3 反客為主
當一個master宕機後,後面的slave可以立刻升為master,其後面的slave不用做任何修改。
用 slaveof no one 將從機變為主機。
4. 複製原理
- Slave啟動成功連線到master後會傳送一個sync命令。
- Master接到命令啟動後臺的存檔程序,同時收集所有接收到的用於修改資料集命令, 在後臺程序執行完畢之後,master將傳送整個資料檔案到slave,以完成一次完全同步。
- 全量複製:而slave服務在接收到資料庫檔案資料後,將其存檔並載入到記憶體中。
- 增量複製:Master繼續將新的所有收集到的修改命令依次傳給slave,完成同步。
- 但是隻要是重新連線master,一次完全同步(全量複製)將被自動執行。
5. 哨兵模式 (Sentinel)
5.1 介紹
反客為主的自動版,能夠後臺監控主機是否故障,如果故障了根據投票數自動將從庫轉換為主庫。
5.2 實現流程
-
調整為一主二僕模式,6379帶著6380和6381。
-
自定義的/myredis目錄下新建sentinel.conf檔案,名字絕不能錯。
-
配置哨兵,填寫內容:
sentinel monitor mymaster 127.0.0.1 6379 1
其中mymaster為監控物件起的伺服器名稱, 1 為至少有多少個哨兵同意遷移的數量。
-
啟動哨兵。
/usr/local/bin
redis做壓測可以用自帶的redis-benchmark工具
執行redis-sentinel /myredis/sentinel.conf
5.3 當主機掛掉,從機選舉中產生新的主機
(大概10秒左右可以看到哨兵視窗日誌,切換了新的主機)
哪個從機會被選舉為主機呢?根據優先級別:replica-priority,設定從機的優先順序,值越小,優先順序越高,用於選舉主機時使用。預設100。
原主機重啟後會變為從機。
5.4 複製延時
由於所有的寫操作都是先在Master上操作,然後同步更新到Slave上,所以從Master同步到Slave機器有一定的延遲,當系統很繁忙的時候,延遲問題會更加嚴重,Slave機器數量的增加也會使這個問題更加嚴重。
5.5 故障恢復
優先順序在redis.conf中預設:replica-priority 100,值越小優先順序越高
偏移量是指獲得原主機資料最全的。
每個redis例項啟動後都會隨機生成一個40位的runid。
5.6 主從複製
帶有主從複製的連線池:
private static JedisSentinelPool jedisSentinelPool = null;
public static Jedis getJedisFromSentinel() {
if (jedisSentinelPool == null) {
Set<String> sentinelSet = new HashSet<>();
sentinelSet.add("192.168.11.103:26379");
JedisPoolConfig jedisPoolConfig = new JedisPoolConfig();
jedisPoolConfig.setMaxTotal(10); //最大可用連線數
jedisPoolConfig.setMaxIdle(5); //最大閒置連線數
jedisPoolConfig.setMinIdle(5); //最小閒置連線數
jedisPoolConfig.setBlockWhenExhausted(true); //連線耗盡是否等待
jedisPoolConfig.setMaxWaitMillis(2000); //等待時間
jedisPoolConfig.setTestOnBorrow(true); //取連線的時候進行一下測試 ping pong
jedisSentinelPool = new JedisSentinelPool("mymaster", sentinelSet, jedisPoolConfig);
return jedisSentinelPool.getResource();
} else {
return jedisSentinelPool.getResource();
}
}