Redis的主從同步解析

2022-09-28 05:51:13 字數 3287 閱讀 9769

一、redis主從同步原理

1.1 redis主從同步的過程

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

1.2 redis主從同步的特點

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

1)乙個master可以有多個sl**e,乙個sl**e也可以有多個sl**e;

2)sl**e不僅可以連線到master,sl**e也可以連線其他sl**e形成樹狀結構;

3)主從同步不會阻塞master,但是會阻塞sl**e。也就是說當乙個或多個sl**e與master進行初次同步資料時,master可以繼續處理client發來的請求。相反sl**e在初次同步資料時則會阻塞不能處理client的請求;

4)主從同步可以用來提高系統的可伸縮性,我們可以用多個sl**e專門處理client的讀請求,也可以用來做簡單的資料冗餘或者只在sl**e上進行持久化從而提公升集群的整體效能。

1.3 redis主動同步設定方法

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

1.3.1 在配置檔案中設定

在作為sl**e的redis伺服器的配置檔案(redis.conf)中設定。

conf**

sl**eof 10.1.1.102 6379 #指定master的ip和埠

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

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

1.3.2 在redis客戶端中進行設定

這裡以redis官方推薦的jedis為例來說明,後文中的測試也基於jedis來進行。這裡jedis物件例項是屬於sl**e的,引數是伺服器的位址和埠。

j**a**

sl**ejdedis.sl**eof("10.1.1.102", 6379); #指定master的ip和埠

sl**ejdedis.sl**eofnoone(); #取消指定master,自己成為乙個master了

通過客戶端指定的方式,可以方便的修改master和sl**e伺服器的主從關係。所以這種方式非常適合於根據需要**調整master和sl**e伺服器。

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

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

jedis目前隨機選擇讀取的哪台redis伺服器,因此實現自動分布式讀取我們需要對jedis做二次封裝。

1)  需要開發一種機制,盡快檢測到master和sl**e的工作狀態;

2)  需要定義一種master和sl**e的自動切換策略;

3)  需要定義一種可以隨機讀取任何一台redis伺服器的機制;

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

二、redis主流客戶端介紹

在redis的官方**,列出了5款redis的j**a客戶端軟體。其中jedis是redis官方推薦的j**a客戶端,這款一直有維護並更新。目前伺服器最新穩定版本是redis2.4.17,最新的測試版本redis 2.6.0 rc7。

2.1 jedis

jedis是redis官方推薦的j**a客戶端版本。目前最新為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驅動。只能**到2023年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 各個j**a客戶端總體評價

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

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

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

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

redis主從同步在目前所有的j**a客戶端都支援不好。主要原因應該還是r程式設計客棧edis伺服器本身的實現機制限制導致的。如果一定要做也是可能的,不過效果可能會打折扣。

3.1 通過封裝jdedis來實現

1)新增乙個管理類,負責維護redis伺服器集群的伺服器拓撲關係;

2)新增乙個監測類,負責監測和維護redis伺服器集群中的伺服器執行狀態;

3)新增乙個master選擇策略類,負責確定master和sl**e的切換時機,並選擇最合適的redis伺服器充當master。

4)新增乙個代程式設計客棧理類,接管當前的jedis客戶端對redis伺服器的讀寫操作。應用層通過**類來使用jedis客戶端。**類需要保證redis伺服器集群對應用層透程式設計客棧明。

總結

Redis主從同步

redis分布式模型,在cap定理中,使用了ap的模型,即保證了可用性與分割槽容錯。redis採用了base最終一致性原理,來保證最終資料的一致,即可以允許出現資料不一致的狀態。redis使用指令流的方式 類似aof指令 進行同步資訊,主節點一邊傳送指令至從節點,從節點一遍執行該指令,一邊將自己的同...

mysql ldap 同步 ldap主從同步

ldap主從同步 一 安裝ldap從伺服器 安裝步驟同ldap主伺服器相同主從同步配置ldap主伺服器 匯出原使用者,格式為ldif,並將其傳輸到ldap從伺服器 ldapsearch x h ldap b dc taobao,dc com wdd.ldif yum y install openss...

Redis的主從模式

為了降低redis伺服器的負載,可以設定多個伺服器,並做主從模式,乙個伺服器負載寫資料,其他伺服器負載讀資料,主伺服器會自動同步給從伺服器。使用乙個redis例項作為主機,其餘的作為備份機。主機和備份機的資料完全一致,主機支援資料的寫入和讀取等各項操作,而從機則只支援與主機資料的同步和讀取。也就是說...