首頁  >  文章  >  後端開發  >  詳解Redis的主從同步

詳解Redis的主從同步

小云云
小云云原創
2017-12-14 14:38:562372瀏覽

主從同步的字面意思就是以誰為主,以誰為副,同步進行,形成同步效應。那麼Redis的主從同步知識大家了解多少呢?本文主要介紹Redis的主從同步解析,僅供參考,希望能幫助大家。

一、Redis主從同步原理

1.1 Redis主從同步的過程

配置好slave伺服器連接的master後,slave會建立和master的連接,然後發送sync命令。無論是第一次同步建立的連接還是連接斷開後的重新連接,master都會啟動一個後台進程,將資料庫快照保存到文件中.同時master主程序會開始收集新的寫入命令並緩存起來。當後台程序完成寫入檔案後,master就會將快照檔案傳送給slave,slave將檔案儲存到磁碟上,然後載入到記憶體將資料庫快照還原到slave上。 slave完成快照檔案的恢復後,master就會把快取的指令都轉寄給slave,slave更新記憶體資料庫。後續master收到的寫入指令都會透過開始建立的連線傳送給slave。從master到slave的同步資料的命令和從 client到master發送的命令使用相同的協定格式。當master和slave的連線中斷時,slave可以自動重新建立連線。如果master同時收到多個slave發送的同步連線指令,只會使用啟動一個程序來寫入資料庫鏡像,然後傳送給所有slave。

1.2 Redis主從同步的特點

主從同步具有明顯的分散式快取特點,主要包括這些面向:

1)一個master可以有多個slave,一個slave也可以有多個slave;
2)slave不只可以連接到master,slave也可以連接其他slave形成樹狀結構;
3)主從同步不會阻塞master,但會阻塞slave。也就是說當一個或多個slave與master進行初次同步資料時,master可以繼續處理client發送的請求。相反slave在初次同步資料時則會阻塞不能處理client的請求;
4)主從同步可以用來提高系統的可擴展性,我們可以用多個slave專門處理client的讀取請求,也可以用來做簡單的資料冗餘或只在slave上進行持久化從而提升叢集的整體效能。

1.3 Redis主動同步設定方法

有兩種方式可以用來完成進行主從Redis伺服器的同步設定。都需要針對slave伺服器上進行,指定slave需要連接的Redis伺服器(可能是master,也可能是slave)。

1.3.1 在設定檔中設定

在設定為slave的Redis伺服器的設定檔(redis.conf)中設定。

Conf程式碼

slaveof 10.1.1.102 6379 #指定master的ip和端口

很明顯,這種設定方式非常簡單,但是需要修改設定文件,並且設定檔是在伺服器啟動時加載的。所以伺服器不啟動無法修改,操作不靈活。

這種配置方式適合於作為部署時的初始配置。

1.3.2 在Redis客戶端中進行設定

這裡以Redis官方推薦的Jedis為例來說明,後文中的測試也基於Jedis來進行。這裡jedis物件實例是屬於slave的,參數是伺服器的位址和連接埠。

Java程式碼

slaveJdedis.slaveOf("10.1.1.102", 6379); #指定master的ip和端口 
slaveJdedis.slaveofNoOne(); #取消指定master,自己成为一个master了

#透過客戶端指定的方式,可以方便的修改master和slave伺服器的主從關係。所以這種方式非常適合根據需要在線調整master和slave伺服器。

1.3.3 當前主從同步存在的問題

#由於master和slave伺服器的不是Redis自動選舉產生,需要人工參與,因此主從倒換無法自動完成。這樣就存在一個問題,什麼時候以及由誰來觸發倒換。我看了下客戶端是沒有這個能力的,一定要的話需要自己增加。

Jedis目前隨機選擇要讀取的哪一台Redis伺服器,因此實作自動分散式讀取我們需要對Jedis做二次封裝。

1)  需要發展一個機制,盡快偵測到master和slave的工作狀態;
2)  需要定義一個master和slave的自動切換策略;
3)  需要定義一個可以隨機讀取任何一台Redis伺服器的機制;

這些功能都可以在客戶端實現,不過效果不會太好。如果伺服器本身能夠支援就比較完美了,不過從Redis官網的介紹情況來看,好像目前還沒有看到有人提這樣的需求,也沒有這樣的規劃。

二、Redis主流用戶端介紹

在Redis的官方網站,列出了5款Redis的java用戶端軟體。其中Jedis是Redis官方推薦的java客戶端,這款一直有維護並更新。目前伺服器最新穩定版本是Redis2.4.17,最新的測試版本Redis 2.6.0 RC7。

2.1 Jedis

Jedis是Redis官方推薦的Java客戶端版本。目前最新為Jedis 2.1.0-5版本,完全相容於Redis 2.0.0版本。這個客戶端一直都有維護和更新。

2.2 JRedis

JRedis之前很長一段時間沒有更新,可以完全相容於Redis 2.0.0版本。今天5月前做過更新後可以相容於最新的Redis2.6.0測試版本。

2.3 JDBC-Redis

JDBC-Redis是用於Redis這個NoSQL資料庫的JDBC驅動程式。只能下載到2009年3月發布的jdbc-redis_0.1_beta版本,目前已經無人維修了。

2.4 RJC

RJC提供Apache DBCP風格的連接池。 1年前已經停止更新,可以完全相容於Redis 2.0.0版本。

2.5 redis-protocol

這個更新是最快、最頻繁的,可以相容於最新的Redis 2.6.0版本。不過它定位於完整支援Redis協議,更有效率和Redis伺服器進行資料互動。所以,並沒有充分發揮redis伺服器的功能。

2.6 各個Java客戶端整體評價

整體來講,各個客戶端基本上都實作了Redis協定協定定義的基本功能。 Redis-protocol更新最近對Redis協定的支援最完整;Jedis提供對Redis伺服器的更多設定操作,使用起來是最方便的。其他客戶端都很少維護,功能也是一般。

如果要少量擴充客戶端的功能,基於Jedis來做開發是最快捷的。

如果要最大限制相容和擴展客戶端的功能,基於Redis-protocol是最好的選擇。

三、Redis主從同步的使用建議

Redis主從同步在目前所有的Java客戶端都支援不好。主要原因應該還是Redis伺服器本身的實作機制限制所導致的。如果一定要做也是可能的,不過效果可能會打折扣。

3.1 透過封裝Jdedis來實現

1)新增一個管理類,負責維護Redis伺服器叢集的伺服器拓撲關係;
2)新增一個監測類,負責監測和維護Redis伺服器叢集中的伺服器運作狀態;
3)新增一個Master選擇策略類,負責確定master和slave的切換時機,並選擇最合適的Redis伺服器充當master。
4)新增一個代理類,接管目前的Jedis客戶端對Redis伺服器的讀寫操作。應用層透過代理類別來使用Jedis客戶端。代理類別需要確保Redis伺服器叢集對應用層透明。

相關推薦:

詳情Mysql主從同步設定範例程式碼

Mysql主從同步原理實現的詳情介紹(圖文)

linux下MySQL主從同步監控shell腳本

#

以上是詳解Redis的主從同步的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn