1. 程式人生 > 其它 >【Redis】10.主從複製

【Redis】10.主從複製

1. 介紹

主機資料更新後根據配置和策略, 自動同步到備機的master/slaver機制,Master以寫為主,Slave以讀為主。

作用:

  • 讀寫分離,效能擴充套件。
  • 容災快速恢復。

2. 實現流程

  1. 拷貝多個redis.conf檔案include(寫絕對路徑)
  2. 開啟daemonize yes
  3. pid檔名字pidfile
  4. 指定埠port
  5. log檔名字
  6. dump.rdb名字dbfilename
  7. 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>
    • 成為某個例項的從伺服器
  1. 在6380和6381上執行: slaveof 127.0.0.1 6379

  2. 在主機上寫,在從機上可以讀取資料。在從機上寫資料報錯。

  3. 主機掛掉,重啟就行,一切如初。

  4. 從機重啟需重設:slaveof 127.0.0.1 6379,可以將配置增加到檔案中。永久生效。

3. 常用的三種方法

3.1 一主二僕

  1. slave1、slave2是從頭開始複製。
  2. 從機不可以寫。
  3. 主機shutdown後從機原地待命。
  4. 主機又回來了後,主機新增記錄,從機還可以進行復制。
  5. 其中一臺從機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 實現流程

  1. 調整為一主二僕模式,6379帶著6380和6381。

  2. 自定義的/myredis目錄下新建sentinel.conf檔案,名字絕不能錯。

  3. 配置哨兵,填寫內容:

    sentinel monitor mymaster 127.0.0.1 6379 1

    其中mymaster為監控物件起的伺服器名稱, 1 為至少有多少個哨兵同意遷移的數量。

  4. 啟動哨兵。

    /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();
    }
}