MySQL的高併發是經過一系列的複雜的分庫與分表作到,而Redis搞高併發,就是搞好底層的緩存node
單機; 一個Redis,可以承載的QPS大概是上萬到幾萬不等,假如,有超過10萬級的數據過來,有可能會將Redis搞崩潰緩存
讀寫分離,通常來講寫的請求比較少,大量的數據用來讀,咱們能夠將架構作成主從架構,一主多從,主負責寫,而且將數據同步到其餘的節點,其餘的節點負責讀。網絡
master node將數據異步的複製到 slave node架構
(1)Redis採用異步的方式複製數據到slave節點,不過從Redis2.8開始,slave node 會週期性的確認本身每次複製的數據量併發
(2)一個master node能夠配置多個slave nodeless
(3)一個slave node能夠鏈接多個slave node異步
(4)slave node作複製的時候,是不會影響master node 的工做的socket
(5)slave node在作複製的時候,是不會影響對本身的查詢工做,它會用就得數據提供服務,只有在複製完成的時後,須要剔除舊的數據,加載新的數據集的時候,這個時候就會暫停對外的服務了。高併發
(6)slave node 能夠進行橫向擴容,作讀寫分離ui
不建議使用slave node做爲master node的數據備份,由於那樣的話,假如,你關閉了master的持久化,可能在master宕機的時候重啓的話,數據是空的,而後一經複製,slave node 的數據也丟了,RDB和AOF都關閉的狀況下,就會照成在重啓的狀況下沒有本地數據能夠恢復
(1)第一次鏈接
當啓動一個slave node 的時候,它會發送一個PSYNC的命令給master node ,那麼master node就會觸發一次full resynchronization,master 會啓動一個後臺線程,開始生成一份RDB快照文件,同時還會將從客戶端接受到的命令寫進緩存之中。RDB文件生成以後,master會將這個RDB文件發給slave,slave會先寫入本地磁盤,而後從磁盤中加載到內存中。而後master node會將內存中緩存的文件文件發送給slave,slave也會同步這些文件。slave若是跟master 有網絡故障,斷開鏈接,就會從新鏈接,master若是發現多個slave都來從新鏈接,僅僅會啓動一個DRB保存操做,用一份數據服務全部的slave。
(2)非第一次鏈接
master僅僅複製給slave缺乏的數據。
(3)從Redis2.8 開始,支持斷點續傳,若是主從複製的過程當中,網絡鏈接斷了,那麼能夠接着上一次的複製的地方繼續複製下去,而不是從頭開始複製一個master node。由於master和slave都會保存一個replica offset,還有一個master ID,若是網絡鏈接斷了,slave就會讓master從上一次的replica offset開始的位置繼續複製,若是沒有找到,就會進行一次resynchronization
(4)無磁盤化複製
repl-diskless-sync yes
master在內存中直接建立RDB,而後發送給slave,不會再本身本地落地磁盤上了
repl-diskless-sync-delay 等待必定時長再開始複製,由於要等更多的slave從新鏈接過來
(5)過時的key的處理
slave不會過時key,只會等待master過時key。若是master過時了一個key,或者經過LRU淘汰了一個key,那麼會模擬一條del命令發送給slave。
(1)slave node啓動,僅僅保存master node的信息,包括master node的host,和IP信息,可是複製流程尚未開始。
(2)slave node內部有一個定時任務,每一秒檢查是否有新的master node 要鏈接和複製,若是發現,就跟master node創建socket鏈接。
(3)slave node 發送ping命令給master node
(4)若是master node設置了口令認證requirepass,那麼salve node必須發送masterauth的口令過去進行認證
(5)master node第一次執行全量複製,將多有的數據發送給slave node
(6)master node後續持續將命令,異步的賦值給slave node
(1)master和slave都會維護一個offset
master會不斷地累加本身的offset,slave也會不斷的累加本身的offset,slave每一秒回報告本身的offset給master,同時master也會保存每個slave的offset (主要是master 和salve都保留本身的offset,才能知道相互之間的數據不一致的狀況)
(2)backlog
master log 中有一個backlog,默認是一個MB的大小,master node給slave node複製數據的時候,也會將數據在backlog中同步一份,backlog主要是用來作全量複製中斷後的增量複製的。
(3)master run ID
info server,能夠看到master run id ,若是根據host+IP定位到master node,是不靠譜的,若是master node 重啓或者數據出現了變化,那麼slave node就應該跟住不一樣的run ID 區分,run id 不一樣就作全量複製。
(1)master 執行bgsave,在本地生成一份RGB文件
(2)master node 將RDB快件發送到salve node,若是RDB複製時間超過60秒,那麼slave node就會認爲複製失敗,能夠適當調節大這個參數。
(3)對於千兆網卡的機器,通常每一秒會傳輸100MB,6G的文件,極可能會超過60S
(4)master node在生成RDB的時候,會將全部的新的寫命令緩存到內存中,在salve node保存了RDB以後,再講新的命令複製給salve node
(5)client-output-buffer-limit slave 256M 64M 60 ,若是在複製的時候,內存緩存區持續消耗64M,或者一次性超過256,那麼就會中止複製,複製就會失敗。
(6) slave node 接收到RDB以後,清空本身的舊數據,而後從新加載RDB到本身的內存之中,
(1)若是全量複製過程之中,master-slave網絡部分鏈接斷掉,那麼salve從新鏈接master時,會觸發增量複製
(2)master直接從本身的backlog中獲取部分丟失的數據,發送給slave node,默認的backlog是1M
(3)master就是跟住slave發送的psync中的offset來從backlog中獲取數據的。
主從節點互相都會發送heartbeat信息
master默認每隔10秒發送一次heartbeat,slave node每隔1秒發送一個heartbeat。
master每一次接收到命令以後,先在內部寫入數據,而後異步的發送給slave node