1. 程式人生 > >java架構之路-(Redis專題)Redis的主從、哨兵和叢集

java架構之路-(Redis專題)Redis的主從、哨兵和叢集

  我們使用的redis,單機的絕對做不到高可用的,萬一單機的redis宕機了,就沒有備用的了,我們可以採用叢集的方式來保證我們的高可用操作。

主從架構

  

  大致就是這樣的,一個主節點,兩個從節點(一般兩個就可以了)

主從工作原理

   如果你為master配置了一個slave,不管這個slave是否是第一次連線上Master,它都會發送一個SYNC命 令(redis2.8版本之前的命令)給master請求複製資料。 master收到SYNC命令後,會在後臺進行資料持久化通過bgsave生成最新的rdb快照檔案,持久化期間, master會繼續接收客戶端的請求,它會把這些可能修改資料集的請求快取在記憶體中。當持久化進行完畢以 後,master會把這份rdb檔案資料集傳送給slave,slave會把接收到的資料進行持久化生成rdb,然後再載入到記憶體中。然後master再將之前快取在記憶體中的命令傳送給slave。 當master與slave之間的連線由於某些原因而斷開時,slave能夠自動重連Master,如果master收到了多 個slave併發連線請求,它只會進行一次持久化,而不是一個連線一次,然後再把這一份持久化的資料傳送 給多個併發連線的slave。 當master和slave斷開重連後,一般都會對整份資料進行復制。但從redis2.8版本開始,master和slave斷開重連後支援部分複製。

  我們在上述文字中可以得出,我們的master得到了SYNC命令以後,還是會繼續接收我們客戶端的命令的,或者說,我們的slave第一次全量複製了,而第二次就不再需要全量複製了,那麼就提到了我們的資料部分複製

資料部分複製

  從2.8版本開始,slave與master能夠在網路連線斷開重連後只進行部分資料複製。 master會在其記憶體中建立一個複製資料用的快取佇列,快取最近一段時間的資料,master和它所有的 slave都維護了複製的資料下標offset和master的程序id,因此,當網路連線斷開後,slave會請求master 繼續進行未完成的複製,從所記錄的資料下標開始。如果master程序id變化了,或者從節點資料下標 offset太舊,已經不在master的快取佇列裡了,那麼將會進行一次全量資料的複製。

  那麼我們實際搭建一下我們的redis主從架構。

1.首先我們準備三臺已經安裝好redis的伺服器,不會安裝的小夥伴可以回到我以後的部落格去看一下,超詳細https://www.cnblogs.com/cxiaocai/p/11674716.html

2.修改我們的主節點和從節點配置,將protected-mode no修改為yes,大概在88行,將我們bind 127.0.0.1修改為bind 0.0.0.0,啟動一下我們的主節點,然後分別測試一下從節點的伺服器是否可以連線我們的主節點(我怕你們防火牆開著),輸入$ redis-cli -h  主節點IP   -p  主節點redis埠 。

[root@iZm5ec3zn3tzdvp7ttnnosZ redis-5.0.5]# ./src/redis-cli -h 47.104.129.103 -p 6379
47.104.129.103:6379> 

注意:我們需要保證主節點和從節點是可以互通的

3.確保可以連線了,我們來配置從節點,我們全域性搜尋一下replica-read-only 改為replica-read-only yes(搜不到自己寫上replica-read-only yes)大概在326行,表示從節點只讀不寫。在replica‐read‐only yes上面設定replicaof 47.104.129.103 6379。

# administrative / dangerous commands.
replicaof 47.104.129.103 6379
replica-read-only yes
# Replication SYNC strategy: disk or socket.

4.啟動從節點,在主節點寫入,檢視從節點是否得到資料。

 配置完成,over~!

哨兵架構

  其實我們的主從架構只保證了資料的一致性,但是還是解決不了我們的高可用,我們的master節點宕機了,我們的服務還是不可用的。沒有Zookeeper的選舉機制,我們來看看我們的哨兵架構。

哨兵就是保證我們的master不會宕機,當master宕機以後,他會主動選舉出來一個節點作為我們的master。


  sentinel哨兵是特殊的redis服務,不提供讀寫服務,主要用來監控redis例項節點。 哨兵架構下client端第一次從哨兵找出redis的主節點,後續就直接訪問redis的主節點,不會每次都通過 sentinel代理訪問redis的主節點,當redis的主節點發生變化,哨兵會第一時間感知到,並且將新的redis 主節點通知給client端(這裡面redis的client端一般都實現了訂閱功能,訂閱sentinel釋出的節點變動訊息)

  配置起來也是很簡單的,還是我們上一次的主從架構,然後加上我們的哨兵叢集。

1.準備好我們剛才搭建完成的主從架構

2.準備三個以上的伺服器(推薦奇數個伺服器,有內部選舉),安裝我們的Redis,需要伺服器之間都相通,上面主從說過

3.修改我們的sentinel.conf檔案

daemonize yes #允許後臺啟動
sentinel monitor mymaster 192.168.0.60 6379 2 # 設定連線我們的redis主從master 2表示伺服器的數目/2取整數+1

4.輸入src/redis‐sentinel sentinel.conf啟動我們的程式,這時我們的埠是26379。注意:這裡的啟動不再是src/redis‐server。

5.輸入src/redis‐cli進入客戶端,輸入info,即可檢視我們的sentinel 資訊。

  哨兵模式也就很簡單的配置好了,是在主從的基礎之上搭建的,我們之前的主從架構,當我們的master宕機以後,redis也就算是宕機了,不會有任何選舉機制,但是我們的哨兵會有一個選舉機制,當我們的master宕機以後,我們的哨兵叢集會主動選舉一個master,然後告知我們的客戶端,哪個是新的master。即使我們的曾經的master重新啟動了,那也恢復不到主節點了,只能當做從節點(redis叢集會詳細說這個選舉)

Redis叢集架構

   我們的哨兵架構,幾乎可以做到了我們的要實現的高可用,但是哨兵的選舉還是需要時間的,而且中間會阻塞客戶端的請求,假如我們的選舉消耗了1秒(實際可能幾秒,高則幾十秒),就在這1秒的時候來了客戶端的請求,那個請求也是不可用的,並且我們的讀寫的節點實際還是單節點的,這時我們有了更好的方案,我們的Redis叢集架構,並且現在Redis的叢集架構做的也很成熟了。

   也就是我們Redis的叢集其實就是一個個小的主從結合在一起(官方建議小於1000個小主從),變成了我們的Redis叢集,每個小主從也就是我們的Redis資料分片,每個小主從的資料儲存是不一樣的,內部是有一套他自己的運算規則的。我們還是先來看一下如何配置,上文提過的簡單的我就直接過了啊。

  1.準備9臺伺服器,保證互通,下載解壓。

  2.編輯我們的redis.conf檔案

    (1)daemonize yes # 設定後臺啟動,大概在136行

    (2)cluster-enabled yes # 是否開啟叢集模式,大概在832行

    (3)cluster-config-file nodes‐8001.conf #叢集節點資訊檔案,這裡800x最好和port對應上,方便後期查詢。大概在840行

    (4)cluster-node-timeout 5000 # 節點離線超時時間,5000毫秒,大概在846行

    (5)bind 0.0.0.0 #去掉bind繫結訪問ip資訊,大概在69行

    (6)protected-mode no #關閉保護模式,大概在88行

    (7)appendonly yes # 開啟AOF,大概在699行

    (8)requirepass xiaocai #設定redis訪問密碼,大概在507行

    (9)masterauth xiaocai # 設定叢集節點間訪問密碼,跟上面一致,大概在293行

  3. 配置完成全部啟動./src/redis-server redis.conf 檢查是否啟動成ps -ef|grep redis。我們會看到這樣的資訊

 這裡顯示cluster,說到這我們只差最後一步了。

  4.我們在任意伺服器輸入./src/redis-cli -a xiaocai --cluster create --cluster-replicas 2 172.31.179.185:6379 172.31.179.178:6379 172.31.179.184:6379 172.31.179.183:6379 172.31.179.180:6379 172.31.179.181:6379 172.31.179.182:6379 172.31.179.179:6379 172.31.179.177:6379命令,意思是要組建我們的叢集環境了,-a後面是密碼xiaocai,--cluster-replicas 2這個數字2表示我們每個主節點有幾個從節點,一般來說前三個IP會設定為master,輸入之後會有確認資訊。我們會看到這樣的資訊,我們輸入yes繼續

   靜靜等待一會(時間也不會太久,時間太久的,你去檢查一下網路之間互通嗎),當我們出現【ok】的畫面也就是成功了。

    5.我們隨便找一個客戶端輸入./src/redis-cli -a xiaocai,進入我們的客戶端,輸入cluster info,就可以檢視到節點資訊

 我們看到cluster_known_nodes:9就是我們一共擁有多少節點,cluster_size:3就是我們擁有多少組主從架構。配置完成~!

擴充套件:輸入cluster nodes還可以檢視我們的節點關聯資訊。

  我們在剛才輸入我們的cluster info時,我們看到了一個16384,其實就是一個Redis叢集的片區,我們在單節點來執行set命令時,並不一定會成功,你可以嘗試不同的key試一下,這就是我們的Redis分片區的儲存,當你的key屬於那個片區下,就會儲存到哪個小主從內,其餘的並不需要重複儲存。在輸入cluster nodes時會返回我們的片區資訊。片區是從0開始計算,最大到16383的。

  今天就說到這裡吧,下次我們說下java程式碼來操作我們的Redis。

 

最進弄了一個公眾號,小菜技術,歡迎大家的加入