1. 程式人生 > 其它 >Java軟體開發面試題!Spring-MVC萬字長文筆記

Java軟體開發面試題!Spring-MVC萬字長文筆記

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

設定主從關係

這裡注意,我們只設置從機就可以了,不用設定主機。我們選擇63806381作為從機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

最後

光給面試題不給答案不是我的風格。這裡面的面試題也只是鳳毛麟角,還有答案的話會極大的增加文章的篇幅,減少文章的可讀性,因此僅以截圖展示,需要的小夥伴可以點選這裡即可免費獲取!

Java面試寶典2021版

最常見Java面試題解析(2021最新版)

2021企業Java面試題精選