1. 程式人生 > 實用技巧 >Redis-11-主從複製

Redis-11-主從複製

1、概念

  • 將一臺Redis伺服器的資料,複製到其他的Redis伺服器上

  • 從主節點上覆制資料到從節點,主節點以寫操作為主,從節點以讀為主

  • 預設情況每個節點都是主節點

  • 主節點可以沒有或者有好多個從節點,從節點只能有一個主節點

2、作用

  • 1、資料冗餘

    主從複製實現了資料的熱備份,是持久化之外的另一種資料冗餘方式

  • 2、故障恢復

    當主節點出現錯誤時,可以由從節點提供服務,實現快速的故障恢復

  • 3、負載均衡

    在主從複製的基礎上,配合讀寫分離,由主節點提供寫服務,從節點提供讀服務,分擔伺服器負載,提高Redis伺服器的併發量

  • 4、高可用基石

    主從複製是哨兵和叢集能夠實現的基石

3、叢集

  • 為什麼要使用叢集?

    • 結構上,避免單點故障

    • 容量上,提高記憶體容量

    • 效能上,減輕伺服器負載,實現負載均衡

  • 叢集環境配置

    • info replication:檢視伺服器主從複製資訊

      role:master # 角色
      connected_slaves:0 # 從機數量
      master_replid:5a5bb574e65d0287b0197d28042646405b271d2e
      master_replid2:0000000000000000000000000000000000000000
      master_repl_offset:0
      second_repl_offset:-1
      repl_backlog_active:0
      repl_backlog_size:1048576
      repl_backlog_first_byte_offset:0
      repl_backlog_histlen:0
    • 1、配置檔案複製成多份

      cp redis.conf redis80.conf

    • 2、修改配置檔案內容

      # 1、埠號
      # 2、後臺執行
      # 3、pidfile
      # 4、logfile
      # 5、dbfilename

    • 3、啟動三個伺服器

    • 4、通過命令配置一主二僕模式

      • 配置6380埠,並檢視主從複製資訊

      • 配置6381埠,並檢視主從複製資訊

      • 檢視7379主從複製資訊

    • 5、主僕模式細節

      • 主伺服器的所有資訊會自動複製到從伺服器

      • 從伺服器只能讀,不能寫

      • 主機宕機後,從機依然是從機,當主機重新連線後,從機可以獲得主機新寫的資訊

      • 從機宕機後,主僕模式失效,主機在從機宕機之後寫的操作,從機再連線之後獲取不到,但是如果重新配置主僕模式後,可以獲得資訊

4、主從複製原理

  • 從伺服器啟動成功並且連線到主伺服器上後,會發送一個sync命令

  • 主伺服器接收到命令後,啟動後臺的存檔程序,同時收集所有接收到的用於對資料集做修改的命令,在後臺程序執行完畢之後,主伺服器將傳送整個資料檔案到從伺服器,並完成一次完全同步

  • 全量複製:從伺服器在接收到資料檔案後,將其存檔並載入到記憶體中

  • 增量複製:主伺服器將新收集到的用於對資料集做修改的命令依次傳給從伺服器,完成同步

  • 如果從伺服器是重新連線主伺服器,會進行一次全量複製

5、層層鏈路模式

6、宕機後手動配置主機

  • 使用 slaveof no one 命令是自己變成主機

6、哨兵模式

  • 哨兵是一個單獨的程序,獨立執行

  • 原理

    • 哨兵傳送命令,等待Redis服務響應,監控執行的多個Redis例項

  • 作用

    • 通過傳送命令,讓Redis伺服器返回其執行狀態,包括主伺服器和從伺服器

    • 當哨兵檢測到主伺服器宕機,會自動將從伺服器切換成主伺服器,然後通過釋出訂閱模式同之其他的伺服器,修改配置檔案,切換主機

  • 模式

    • 單哨兵模式,哨兵監督伺服器

    • 多哨兵模式,哨兵監督伺服器及其他哨兵

  • 主觀下線

    • 哨兵1檢測到主伺服器宕機,主觀認為主伺服器不可用

  • 客觀下線

    • 其他哨兵也檢測到主伺服器不可用,並且數量達到一定值時,哨兵之間會進行一次投票,投票的結果由一個哨兵發起,進行failover(故障轉移)操作,切換成功後,會通過釋出訂閱模式,讓哨兵把自己監控的從伺服器實現切換主機

  • 測試

    • 編寫哨兵配置檔案

      vim sentinel.conf
      sentinel monitor myredis 127.0.0.1 6379 1
    • 啟動哨兵

      redis-sentinel hmxConfig/sentinel.conf

      73454:X 17 Sep 2020 21:28:14.706 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
      73454:X 17 Sep 2020 21:28:14.706 # Redis version=6.0.6, bits=64, commit=00000000, modified=0, pid=73454, just started
      73454:X 17 Sep 2020 21:28:14.706 # Configuration loaded
      _._
      _.-``__ ''-._
      _.-`` `. `_. ''-._ Redis 6.0.6 (00000000/0) 64 bit
      .-`` .-```. ```\/ _.,_ ''-._
      ( ' , .-` | `, ) Running in sentinel mode
      |`-._`-...-` __...-.``-._|'` _.-'| Port: 26379
      | `-._ `._ / _.-' | PID: 73454
      `-._ `-._ `-./ _.-' _.-'
      |`-._`-._ `-.__.-' _.-'_.-'|
      | `-._`-._ _.-'_.-' | http://redis.io
      `-._ `-._`-.__.-'_.-' _.-'
      |`-._`-._ `-.__.-' _.-'_.-'|
      | `-._`-._ _.-'_.-' |
      `-._ `-._`-.__.-'_.-' _.-'
      `-._ `-.__.-' _.-'
      `-._ _.-'
      `-.__.-'

      73454:X 17 Sep 2020 21:28:14.707 # WARNING: The TCP backlog setting of 511 cannot be enforced because /proc/sys/net/core/somaxconn is set to the lower value of 128.
      73454:X 17 Sep 2020 21:28:14.709 # Sentinel ID is 2092024f7b6023d37e43875c878a972cac61cbdb

      73454:X 17 Sep 2020 21:28:14.709 # +monitor master myredis 127.0.0.1 6379 quorum 1

      73454:X 17 Sep 2020 21:28:14.709 * +slave slave 127.0.0.1:6380 127.0.0.1 6380 @ myredis 127.0.0.1 6379

      73454:X 17 Sep 2020 21:28:14.711 * +slave slave 127.0.0.1:6381 127.0.0.1 6381 @ myredis 127.0.0.1 6379

    • 此時斷開主機,發現哨兵發生變化

    • 此時原先的主機如果重新連線,只能變成現主機的從伺服器

  • 優點

    • 故障轉移

    • 高可用

    • 健壯

  • 缺點

    • 叢集容量有限,難以線上擴容

    • 配置複雜