Java軟體開發面試題!Spring-MVC萬字長文筆記
Redis主從複製
概念
Redis的主從複製概念和MySQL的主從複製大概類似。一臺主機master
,一臺從機slaver
。master主機資料更新後根據配置和策略,自動同步到slaver從機,Master以寫為主
,Slave以讀為主
。
主要用途
-
讀寫分離
:適用於讀多寫少的應用,增加多個從機,提高讀的速度,提高程式併發 -
資料容災恢復
:從機複製主機的資料,相當於資料備份,如果主機資料丟失,那麼可以通過從機儲存的資料進行恢復。 -
高併發、高可用叢集實現的基礎
:在高併發的場景下,就算主機掛了,從機可以進行主從切換
,從機自動成為主機對外提供服務。
一主多從配置
環境準備
老哥太窮了,就用一臺機器模擬三個機器。
-
第一步:
將redis.conf複製3份,分別是redis6379.conf、redis6380.conf、redis6381.conf -
第二步:
修改三個redis.conf檔案裡的port埠、pid檔名、日誌檔名、rdb檔名 -
第三步:
分別開啟三個視窗模擬三臺伺服器,並開啟redis服務。
檢視當前3臺機器主從角色
先用命令info replication
看看3臺機器目前的角色
是什麼。
# 三臺機器都是這個狀態 127.0.0.1:6379> info replication # 角色是master主機 role:master # 從機個數為0 connected_slaves:0
設定主從關係
這裡注意,我們只設置從機就可以了,不用設定主機。我們選擇6380
和6381
作為從機
。6379
作為主機
。
# 6380 埠
127.0.0.1:6380> SLAVEOF 127.0.0.1 6379
# 6381 埠
127.0.0.1:6381> SLAVEOF 127.0.0.1 6379
#?6381?埠
127.0.0.1:6381>?SLAVEOF?127.0.0.1?6379
再次檢視3臺機器目前角色
再次執行命令:info replication
#?主機 127.0.0.1:6379>?info?replication role:master?#?角色:主機 connected_slaves:2?#連線的從機個數,以及從機IP和埠 slave0:ip=127.0.0.1,port=6380,state=online,offset=98,lag=1 slave1:ip=127.0.0.1,port=6381,state=online,offset=98,lag=1 #?從機1 127.0.0.1:6380>?info?replication role:slave?#?角色:從機 master_host:127.0.0.1?#?主機的IP和埠 master_port:6379 #?從機2 127.0.0.1:6381>?info?replication role:slave?#?角色:從機 master_host:127.0.0.1?#?主機的IP和埠 master_port:6379
搭建成功,試驗一把
-
全量複製:
從機會把主機之前的資料全部都同步過來,大家可以在從機上get 某key試試。 -
增量複製:
當主機新增資料時,從機會將該新增資料同步過來,大家可以在主機上執行命令set key value,然後在從機上get 該key,看是否能獲取到。
讀寫分離
Redis的從機預設
不允許進行寫操作
,大家可以在從機上執行命令set key value
,會報錯。
# 6380從機
127.0.0.1:6380> set k3 v3
(error) READONLY You can't write against a read only slave.
「呼,好累」,主從複製寫的差不多了!!
主從複製原理
全量複製
「①」slave傳送psync,由於是第一次複製,不知道master的runid,自然也不知道offset,所以傳送psync ? -1
「②」master收到請求,傳送master的runid和offset給從節點。
「③」從節點slave儲存master的資訊
「④」主節點bgsave儲存rdb檔案
「⑤」主機點發送rdb檔案
並且在「④」和「⑤」的這個過程中產生的資料,會寫到複製緩衝區repl_back_buffer之中去。
「⑥」主節點發送上面兩個步驟產生的buffer到從節點slave
「⑦」從節點清空原來的資料,如果它之前有資料,那麼久會清空資料
「⑧」從節點slave把rdb檔案的資料裝載進自身。
全量複製的開銷
「①」bgsave時間
「②」rdb檔案網路傳輸時間
「③」從節點清空資料的
「④」從節點載入rdb的時間
「⑤」可能的aof重寫時間,這是針對從節點,例如開啟了aof之後,從節點新增buffer資料時候,可能需要aof重寫
基於上面的原因,有的情況下不適合使用全量複製,例如網路抖動之後,從節點只需要傳送一部分資料,不需要傳送全部資料,redis2.8
之後實現了部分複製功能
部分複製
「①」假設傳送網路抖動或者別的情況,暫時失去了連線
「②」這個時候,master還在繼續往buffer裡面寫資料
「③」slave重新連線上了master
「④」slave向master傳送自己的offset和runid
「⑤」master判斷slave的offset是否在buffer的佇列裡面,如果是,那就返回continue給slave,否則需要進行全量複製(因為這說明已經錯過了很多資料了)
「⑥」master傳送從slave的offset開始到緩衝區佇列結尾的資料給slave
最後
光給面試題不給答案不是我的風格。這裡面的面試題也只是鳳毛麟角,還有答案的話會極大的增加文章的篇幅,減少文章的可讀性,因此僅以截圖展示,需要的小夥伴可以點選這裡即可免費獲取!