redis如何通過讀寫分離來承載讀請求QPS超過10萬+?

(如需要牛客網的java面經電子版本以及其他學習視頻,可以加個關注,私信我,免費分享)
1.redis不能支撐高併發的瓶頸在哪裏?
單機
在這裏插入圖片描述
2、如果redis要支撐超過10萬+的併發,那應該怎麼做?
單機的redis幾乎不太可能說QPS超過10萬+,除非一些特殊情況,比如你的機器性能特別好,配置特別高,物理機,維護做的特別好,而且你的整體的操作不是太複雜

單機在幾萬

讀寫分離,一般來說,對緩存,一般都是用來支撐讀高併發的,寫的請求是比較少的,可能寫請求也就一秒鐘幾千,一兩千

大量的請求都是讀,一秒鐘二十萬次讀

讀寫分離

主從架構 -> 讀寫分離 -> 支撐10萬+讀QPS的架構
在這裏插入圖片描述

3.redis主從架構的核心原理
當啓動一個slave node的時候,它會發送一個PSYNC命令給master node

如果這是slave node重新連接master node,那麼master node僅僅會複製給slave部分缺少的數據; 否則如果是slave node第一次連接master node,那麼會觸發一次full resynchronization

開始full resynchronization的時候,master會啓動一個後臺線程,開始生成一份RDB快照文件,同時還會將從客戶端收到的所有寫命令緩存在內存中。RDB文件生成完畢之後,master會將這個RDB發送給slave,slave會先寫入本地磁盤,然後再從本地磁盤加載到內存中。然後master會將內存中緩存的寫命令發送給slave,slave也會同步這些數據。

slave node如果跟master node有網絡故障,斷開了連接,會自動重連。master如果發現有多個slave node都來重新連接,僅僅會啓動一個rdb save操作,用一份數據服務所有slave node。
在這裏插入圖片描述
4、過期key處理

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

5、主從複製的完整流程

  • slave node啓動,僅僅保存master node的信息,包括master node的host和ip,但是複製流程沒開始
  • slave node內部有個定時任務,每秒檢查是否有新的master node要連接和複製,如果發現,就跟master node建立socket網絡連接
  • slave node發送ping命令給master node
  • 口令認證,如果master設置了requirepass,那麼salve node必鬚髮送masterauth的口令過去進行認證
  • master node第一次執行全量複製,將所有數據發給slave node
  • master node後續持續將寫命令,異步複製給slave node

在這裏插入圖片描述

6、數據同步相關的核心機制
指的就是第一次slave連接msater的時候,執行的全量複製,那個過程裏面你的一些細節的機制

  • master和slave都會維護一個offset

master會在自身不斷累加offset,slave也會在自身不斷累加offset
slave每秒都會上報自己的offset給master,同時master也會保存每個slave的offset

這個倒不是說特定就用在全量複製的,主要是master和slave都要知道各自的數據的offset,才能知道互相之間的數據不一致的情況

  • == backlog==

master node有一個backlog,默認是1MB大小
master node給slave node複製數據時,也會將數據在backlog中同步寫一份
backlog主要是用來做全量複製中斷候的增量複製的

7.全量複製

  • master執行bgsave,在本地生成一份rdb快照文件
  • master node將rdb快照文件發送給salve node,如果rdb複製時間超過60秒(repl-timeout),那麼slave node就會認爲複製失敗,可以適當調節大這個參數
  • 對於千兆網卡的機器,一般每秒傳輸100MB,6G文件,很可能超過60s
  • master node在生成rdb時,會將所有新的寫命令緩存在內存中,在salve node保存了rdb之後,再將新的寫命令複製給salve node
  • client-output-buffer-limit slave 256MB 64MB 60,如果在複製期間,內存緩衝區持續消耗超過64MB,或者一次性超過256MB,那麼停止複製,複製失敗
  • slave node接收到rdb之後,清空自己的舊數據,然後重新加載rdb到自己的內存中,同時基於舊的數據版本對外提供服務
  • 如果slave node開啓了AOF,那麼會立即執行BGREWRITEAOF,重寫AOF

8、增量複製

  • 如果全量複製過程中,master-slave網絡連接斷掉,那麼salve重新連接master時,會觸發增量複製
  • master直接從自己的backlog中獲取部分丟失的數據,發送給slave node,默認backlog就是1MB
  • msater就是根據slave發送的psync中的offset來從backlog中獲取數據的

9、異步複製
master每次接收到寫命令之後,現在內部寫入數據,然後異步發送給slave node

10、哨兵的介紹
哨兵的介紹sentinal,中文名是哨兵,哨兵是redis集羣架構中非常重要的一個組件

  • 集羣監控,負責監控redis master和slave進程是否正常工作
  • 消息通知,如果某個redis實例有故障,那麼哨兵負責發送消息作爲報警通知給管理員
  • 故障轉移,如果master node掛掉了,會自動轉移到slave node上
  • 配置中心,如果故障轉移發生了,通知client客戶端新的master地址

重點
就是如果你用redis緩存技術的話,肯定要考慮如何用redis來加多臺機器,保證redis是高併發的,還有就是如何讓Redis保證自己不是掛掉以後就直接死掉了,redis高可用

我這裏會選用我之前講解過這一塊內容,redis高併發、高可用、緩存一致性

redis高併發:主從架構,一主多從,一般來說,很多項目其實就足夠了,單主用來寫入數據,單機幾萬QPS,多從用來查詢數據,多個從實例可以提供每秒10萬的QPS。

redis高併發的同時,還需要容納大量的數據:一主多從,每個實例都容納了完整的數據,比如redis主就10G的內存量,其實你就最對只能容納10g的數據量。如果你的緩存要容納的數據量很大,達到了幾十g,甚至幾百g,或者是幾t,那你就需要redis集羣,而且用redis集羣之後,可以提供可能每秒幾十萬的讀寫併發。

redis高可用:如果你做主從架構部署,其實就是加上哨兵就可以了,就可以實現,任何一個實例宕機,自動會進行主備切換。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章