單機部署node
redis的單機部署redis
如何保證redis的高併發和高可用? redis的主從複製原理?redis的哨兵原理?
redis單機能承載多高併發?若是單機扛不住如何擴容扛更多的併發?
redis會不會掛?既然redis會掛如何保證高可用?
Redis主從架構(實現高併發)算法
單機的redis,可以承載的QPS大概在上萬到幾萬不等。對於緩存來講,通常是用來支撐讀高併發的,所以架構能夠作成一主多從,主節點負責寫,而且將數據複製到其餘的從節點,而從節點負責讀,即主從(master-slave)架構。這樣也好實現水平擴容,支撐讀高併發。緩存
另外,主從架構建議開啓master node的持久化,避免master宕機重啓後數據爲空,而後一經複製,slave node的數據也丟失了。還有master的備份方案也須要考慮,能夠在本地文件丟失後能有備份恢復master,確保master啓動時是正常有數據,即便slave node能夠自動接管master node,但也可能sentinel還沒檢測到master failure,master node就自動重啓了,就還會發生複製到slave node數據所有丟失的情形。網絡
主從複製的原理架構
當啓動一個slave node的時候,它會發送一個PSYNC命令給master node。若是這是slave node初次鏈接到master node,會觸發一次full resynchronization全量複製,此時master會啓動一個後臺線程,開始生成一份RDB快照文件,同時還會將從客戶端新收到的全部寫命令緩存在內存中。RDB文件生成文件後,master會將這個RDB發送給slave,slave會寫入本地磁盤,而後再從本地磁盤加載到內存中,接着master會將內存中緩存的寫命令發送到slave,slave也會同步這些數據。slave node若是跟master node有網絡故障斷開鏈接會自動重連,此時master node只會複製slave缺乏的那部分數據。
併發
主從複製的斷點續傳less
從redis2.8開始支持主從複製的斷點續傳,若是主從複製過程當中網絡斷開,那麼能夠接着上次複製的地方繼續複製下去,而不是從頭複製一份。異步
master node 會在內存中維護一個backlog ,master 和 salve 都會保存一個 replica offset 還有一個master run id ,offset就是保存再backlog中的。若是 master 和 slave 網絡鏈接斷了,salve 會讓 master 從上次 replica offset 開始繼續複製,若是沒有找到對應的 offset ,那麼會執行一次 resynchronization 全量複製。socket
若是根據 host + ip 定位 master node 是不知道是否複製過的,若是 master node 重啓或者數據發生了變化,那麼 slave node 應該根據不一樣的 run id 區分。
無磁盤化複製
master 再內存中直接建立RDB,而後發送給 salve ,不會再本身本地落地磁盤了,只須要再配置文件中開啓 repl - diskless -sync yes
repl - diskless - sync yes
過時key處理
slave 不會過時 key,只會等待 master 過時 key。 若是 master 過時了一個key,或者經過LRU淘汰了一個key,那麼會模擬一條 del 命令發送給slave
複製的流程
slave node 啓動時,會在本地保存master node 的信息,包括 master node 的 host 和 IP ,可是複製流程還沒開始。
slave node 內部有個定時任務,每秒檢查是否有新的 master node 要鏈接和複製,若是發現,就跟 master node 創建 socket 網絡鏈接。而後 slave node 發送 ping 命令給 master node 。若是master設置了requirepass,那麼slave node 必須發送 masterauth 的口令過去進行認證,master 第一次執行全量複製,後續持續將寫命令異步複製給slave
全量複製
master 執行 bgsave ,在本地生成一份RDB快照文件。
master node 將RDB快照文件發送給salve node ,若是RDB複製時間超過60秒,slave node 會認爲複製失敗,固然這個參數能夠適當調大
master node 在生成RDB時,會將全部新的命令緩存在內存中,在slave node保存了RDB以後,再將新的命令複製給slave node
若是在複製期間,內存緩衝區持續消耗超過64MB,或者一次性超過256MB,那麼中止複製,複製失敗
slave node 接收到RDB以後,清空本身的舊數據,而後從新加載RDB到本身的內存中,同時基於舊的數據版本對外提供服務
若是slave node 開啓了AOF,那麼會當即執行BGREWRITEAOF,重寫AOF
增量複製
若是全量複製過程當中斷,slave 從新鏈接 master 時,會觸發增量複製
master 直接從本身的backlog 中獲取部分丟失的數據,發送給slave ,默認backlog是1MB
master 是根據slave 發送的psync 中的offset 來從 backlog 中獲取數據的
異步複製
master 每次接收到寫命令以後,先在內部寫入數據,而後異步發送給salve node
主從節點互相都會發送heartbeat信息,master 默認每隔10秒發送一次heartbeat,slave 每隔一秒發送一個heartbeat
Redis哨兵集羣(實現高可用)
如何高可用?
一個salve掛掉是不會影響可用性的,還有不少slave在提供相同數據下的相同讀服務。可是mater掛掉以後,主從就所有失效了。redis的高可用架構,叫作failover故障轉移,也叫主備切換。就是master在故障時,自動檢測,而且將某個slave自動切換爲master。這時就可使用哨兵的機制進行監控、通知、故障轉移、配置更新等操做了。
sentinel 哨兵,用於實現redis集羣的高可用,自己也是分佈式的,做爲一個哨兵集羣去運行,互相協同工做。
slave→master(如何選出新的master進行主備切換)
redis實現高併發主要依賴主從架構,同時須要緩存大量數據的話就須要redis集羣了,此時再加上哨兵就能夠實現任何一個實例宕機都能進行主備切換的高可用。
Redis的一些特性
RDB的優缺點
AOF的優缺點
REDIS的事務:放棄了回滾
一致性哈希算法原理(數據寫入時選擇節點,數據讀取時找到所在節點)
redis 的單線程原子操做的設計