redis的高併發有一種實現方式就是主從架構,乙個master節點,多個sl**e節點,可以很好的實現sl**e節點的水平擴容;主從架構再加上讀寫分離,master節點負責寫操作,sl**e節點負責讀操作,使得redis可以很好的做乙個高併發的處理。有人就會疑惑了:sl**e節點上的資料怎麼來的了?所以我們就來說一說redis主從複製的相關原理。
當我們啟動乙個sl**e節點的時候,它就會去ping下master節點,傳送psync命令,當兩者建立連線以後,master節點發現sl**e節點是第一次連線我,就會觸發一次full resynchronization,master啟動乙個後台執行緒,生成乙份rdb快照,那生成快照期間新的命令怎麼辦,master會把這些命令快取到記憶體中;而rdb檔案生成以後,master會把這個檔案傳送給sl**e,sl**e節點會把這個檔案先寫入磁碟,然後再從磁碟讀取到記憶體中;當這些操作執行完以後,master會將記憶體中快取的命令傳送給sl**e節點,sl**e節點再同步這些資料。如果sl**e節點不是第一次連線master節點了?那master節點僅僅只會複製缺少的那部分資料。
那如果主從複製的過程中,網斷掉了怎麼辦?豈不是又要頭進行複製。這裡就要提到從redis2.8開始的主從複製的斷點續傳,master node中有乙個backlog,master和sl**e都儲存了乙個replica offset和master id,offset儲存早backlog中,如果網路連線斷了,從新連線後,就會找到這個offset,從這個offset的位置繼續進行複製,當然,如果沒有找到這個offset,那麼就會進行一次full resynchronization
前面提到的master生成rdb檔案是有落地master磁碟這麼乙個操作的,那麼還有一種就是無磁碟化複製,不會在落地master節點的磁碟,直接在記憶體中生成rdb檔案,然後傳送給sl**e節點。
還需要提一下的就是,如果master節點中的key過期或者被淘汰了怎麼辦?這個時候,master節點會傳送一條del命令給sl**e節點,sl**e節點執行這條del命令來刪除這個過期的key
前面說的都是複製的大致流程及相關概念。那麼還有一些疑問?sl**e節點怎麼去找的master節點:sl**e節點的redis.conf檔案中會儲存master的host和ip;而且sl**e節點內部會有乙個定時任務,它定期的檢視是否有新的master節點需要連線和複製,如果有,就和這個新節點建立socket連線;還有一點就是如果master節點設定了requirepass那麼salve node必須傳送masterauth的口令過去進行認證,建立連線後,就可以執行我們前面說的複製操作。
其實複製的過程中有一些細節:
前面說到master和sl**e節點都有維護乙個offset,而sl**e每秒都會上報自己的offset給master,同時master也會儲存每個sl**e的offset,master和sl**e都要知道各自的資料的offset,才能知道互相之間的資料不一致的情況
master node有乙個backlog,預設是1mb大小,master node給sl**e node複製資料時,也會將資料在backlog中同步寫乙份,backlog主要是用來做全量複製中斷候的增量複製的
master run id也就是前面說的master id,如果根據host+ip定位master node,是不靠譜的,如果master node重啟或者資料出現了變化,那麼sl**e node應該根據不同的run id區分,run id不同就做全量複製,如果需要不更改run id重啟redis,可以使用redis-cli debug reload命令
還有psync,從節點使用psync從master node進行複製,psync runid offset,master node會根據自身的情況返回響應資訊,可能是fullresync runid offset觸發全量複製,可能是continue觸發增量複製
全量複製
rdb生成、rdb通過網路拷貝、sl**e舊資料的清理、sl**e aof rewrite,很耗費時間
如果複製的資料量在4g~6g之間,那麼很可能全量複製時間消耗到1分半到2分鐘
增量複製
(1)如果全量複製過程中,master-sl**e網路連線斷掉,那麼salve重新連線master時,會觸發增量複製
(2)master直接從自己的backlog中獲取部分丟失的資料,傳送給sl**e node,預設backlog就是1mb
(3)msater就是根據sl**e傳送的psync中的offset來從backlog中獲取資料的
heartbeat
主從節點互相都會傳送heartbeat資訊
master預設每隔10秒傳送一次heartbeat,salve node每隔1秒傳送乙個heartbeat
非同步複製
master每次接收到寫命令之後,現在內部寫入資料,然後非同步傳送給sl**e node
Redis 主從複製
主從複製的開啟,完全是在從節點發起的,不需要我們在主節點做任何事情,從節點開啟主從複製,有3種方式 主從複製主要可分為 連線建立階段 即準備階段 資料同步階段 命令傳播階段 主要作用是在主從節點之間建立連線,為資料同步做好準備 從節點資料的初始化,具體執行的方式是 從節點向主節點傳送psync命令 ...
Redis 主從複製
就是將一台 redis 伺服器的資料,複製到其他的 redis 伺服器,前者為主節點 master leader 後者稱為從節點 sl e follower 資料的複製是單向的,只能從主節點到從節點,一般 master 以寫為主,sl e 以讀為主。redis 主從複製可以根據是否是全量分為全量同步...
Redis主從複製
主庫 192.168.138.20 6379 從庫 192.168.138.20 6380 配置 1 從庫redis 6380.conf配置檔案中加入如下兩行配置資訊 sl eof 192.168.138.20 6379 主庫ip 埠 masterauth 123456 主庫 redis 驗證密碼 ...