1. 程式人生 > >【高並發架構】Redis緩存高並發之-主從架構

【高並發架構】Redis緩存高並發之-主從架構

syn 建立 網絡故障 pass 信息 機制 ren code 認證

Redis主從架構

  到目前為止,Redis Cluster 能實現很好的性能,但如果只是緩存幾個G的數據,那麽單機Redis就足夠了,但緩存主要用來讀的,單機的QPS有一定的極限,一兩萬QPS一臺應該沒什麽問題,但如果是幾十萬的QPS這類場景呢?Redis主從架構就非常合適。

  主從架構主要是保證Redis的高並發性的,對於緩存來說,一般也都是用來支撐讀高並發的。因此架構做成主從(master-slave)架構,一主多從,主負責寫,並且將數據復制到其它的 slave 節點,從節點負責讀。所有的讀請求全部走從節點。這樣也可以很輕松實現水平擴容,支撐讀高並發。

技術分享圖片

Redis Replication核心機制:

  • redis 采用異步方式復制數據到 slave 節點,不過 redis2.8 開始,slave node 會周期性地確認自己每次復制的數據量;
  • 一個 master node 是可以配置多個 slave node 的;
  • slave node 也可以連接其他的 slave node;
  • slave node 做復制的時候,不會 block master node 的正常工作;
  • slave node 在做復制的時候,也不會 block 對自己的查詢操作,它會用舊的數據集來提供服務;但是復制完成的時候,需要刪除舊數據集,加載新數據集,這個時候就會暫停對外服務了;
  • slave node 主要用來進行橫向擴容,做讀寫分離,擴容的 slave node 可以提高讀的吞吐量。

Redis 主從復制的核心原理:

  當啟動一個 slave node 的時候,它會發送一個 PSYNC 命令給 master node,如果這是 slave node 初次連接到 master node,那麽會觸發一次 full resynchronization 全量復制。此時 master 會啟動一個後臺線程,開始生成一份 RDB 快照文件,同時還會將從客戶端 client 新收到的所有寫命令緩存在內存中。RDB 文件生成完畢後, master 會將這個 RDB 發送給 slave,slave 會先寫入本地磁盤,然後再從本地磁盤加載到內存中,接著 master 會將內存中緩存的寫命令發送到 slave,slave 也會同步這些數據。slave node 如果跟 master node 有網絡故障,斷開了連接,會自動重連,連接之後 master node 僅會復制給 slave 部分缺少的數據。

技術分享圖片

Redis 過期Key處理:

  slave 不會過期 key,只會等待 master 過期 key。如果 master 過期了一個 key,或者通過 LRU 淘汰了一個 key,那麽會模擬一條 del 命令發送給 slave。

整體復制流程:

  slave node 啟動時,會在自己本地保存 master node 的信息,包括 master node 的hostip,但是復制流程沒開始。slave node 內部有個定時任務,每秒檢查是否有新的 master node 要連接和復制,如果發現,就跟 master node 建立 socket 網絡連接。然後 slave node 發送 ping 命令給 master node。如果 master 設置了 requirepass,那麽 slave node 必須發送 masterauth 的口令過去進行認證。master node 第一次執行全量復制,將所有數據發給 slave node。而在後續,master node 持續將寫命令,異步復制給 slave node。

技術分享圖片

參考文獻:https://github.com/doocs/advanced-java/blob/master/docs/high-concurrency/redis-master-slave.md 

【高並發架構】Redis緩存高並發之-主從架構