Redis的主從復制

什么是Redis的主從復制

主從復制囱挑,是指將一臺Redis服務(wù)器的數(shù)據(jù),復制到其他的Redis服務(wù)器旨枯。前者稱為主節(jié)點(master)独悴,后者稱為從節(jié)點(slave)例书;數(shù)據(jù)的復制是單向的,只能由主節(jié)點到從節(jié)點绵患。

默認情況下雾叭,每臺Redis服務(wù)器都是主節(jié)點;且一個主節(jié)點可以有多個從節(jié)點(或沒有從節(jié)點)落蝙,但一個從節(jié)點只能有一個主節(jié)點织狐。

主從復制的作用

主從復制是Redis高可用的基礎(chǔ),主要的作用的故障恢復筏勒。當主節(jié)點出現(xiàn)問題時移迫,可以由從節(jié)點提供服務(wù),實現(xiàn)快速的故障恢復

主從復制的開啟

主從復制的開啟管行,完全是在從節(jié)點發(fā)起的厨埋;不需要我們在主節(jié)點做任何事情
在從服務(wù)器的配置文件中加入:

slaveof <masterip> <masterport>

主從復制的測試

在同一臺機器是部署主節(jié)點和從節(jié)點

在centos安裝redis

yum install redis
默認的配置文件在/etc/redis.conf
啟動時報錯,根據(jù)日志里的提示修改
把下面的命令添加到/etc/sysctl.conf 文件:

vm.overcommit_memory = 1
net.core.somaxconn = 2048

把下面的命令添加到/etc/rc.local 文件:

echo never > /sys/kernel/mm/transparent_hugepage/enabled

重啟系統(tǒng)

部署

master的配置文件修改:

復制/etc/redis.conf到/etc/redis/6379.conf

修改6379.conf文件

daemonize yes

啟動:
redis-server /etc/redis/6379.conf

查看日志:
tail -f /var/log/redis/redis.log

slave的配置文件修改
復制/etc/redis/6379.conf到/etc/redis/6380.conf
修改:

port 6380
daemonize yes
pidfile /var/run/redis_6380.pid
dbfilename slave_dump.rdb
appendfilename "slave_appendonly.aof"
slaveof 127.0.0.1 6379

啟動:
redis-server /etc/redis/6380.conf

測試

連接上主節(jié)點

[root@VM_0_4_centos ~]# redis-cli -h 127.0.0.1 -p 6379
127.0.0.1:6379> get hello
(nil)
127.0.0.1:6379> set hello world
OK

連接上從節(jié)點

[root@VM_0_4_centos ~]# redis-cli -h 127.0.0.1 -p 6380
127.0.0.1:6380> get hello
"world"

可以看到從機上有主機同步過來的數(shù)據(jù)

主從復制原理

全量復制

1.主節(jié)點收到全量復制的命令后捐顷,執(zhí)行bgsave荡陷,在后臺生成RDB文件,并使用復制緩沖區(qū)記錄從現(xiàn)在開始執(zhí)行的所有寫命令

2.主節(jié)點的bgsave執(zhí)行完成后迅涮,將RDB文件發(fā)送給從節(jié)點

3.從節(jié)點首先清除自己的舊數(shù)據(jù)废赞,然后載入接收的RDB文件,將數(shù)據(jù)庫狀態(tài)更新至主節(jié)點執(zhí)行bgsave時的數(shù)據(jù)庫狀態(tài)

4.主節(jié)點將前述復制緩沖區(qū)中的所有寫命令發(fā)送給從節(jié)點叮姑,從節(jié)點執(zhí)行這些寫命令唉地,將數(shù)據(jù)庫狀態(tài)更新至主節(jié)點的最新狀態(tài)

5.如果從節(jié)點開啟了AOF,則會觸發(fā)bgrewriteaof的執(zhí)行传透,從而保證AOF文件更新至主節(jié)點的最新狀態(tài)

通過全量復制的過程可以看出耘沼,全量復制是非常重型的操作:

(1)主節(jié)點通過bgsave命令fork子進程進行RDB持久化,該過程是非常消耗CPU朱盐、內(nèi)存(頁表復制)群嗤、硬盤IO的;

(2)主節(jié)點通過網(wǎng)絡(luò)將RDB文件發(fā)送給從節(jié)點兵琳,對主從節(jié)點的帶寬都會帶來很大的消耗

(3)從節(jié)點清空老數(shù)據(jù)骚烧、載入新RDB文件的過程是阻塞的,無法響應(yīng)客戶端的命令闰围;如果從節(jié)點執(zhí)行bgrewriteaof,也會帶來額外的消耗

部分復制

  • 復制偏移量

主節(jié)點和從節(jié)點分別維護一個復制偏移量(offset)既峡,代表的是主節(jié)點向從節(jié)點傳遞的字節(jié)數(shù)羡榴;主節(jié)點每次向從節(jié)點傳播N個字節(jié)數(shù)據(jù)時,主節(jié)點的offset增加N运敢;從節(jié)點每次收到主節(jié)點傳來的N個字節(jié)數(shù)據(jù)時校仑,從節(jié)點的offset增加N忠售。

  • 復制積壓緩沖區(qū)

是由主節(jié)點維護的、固定長度的迄沫、先進先出(FIFO)隊列稻扬,默認大小1MB;當主節(jié)點開始有從節(jié)點時創(chuàng)建羊瘩,其作用是備份主節(jié)點最近發(fā)送給從節(jié)點的數(shù)據(jù)泰佳。注意,無論主節(jié)點有一個還是多個從節(jié)點尘吗,都只需要一個復制積壓緩沖區(qū)逝她。

  • 服務(wù)器運行ID(runid)

每個Redis節(jié)點(無論主從),在啟動時都會自動生成一個隨機ID(每次啟動都不一樣)睬捶,由40個隨機的十六進制字符組成黔宛;runid用來唯一識別一個Redis節(jié)點。

主從節(jié)點初次復制時擒贸,主節(jié)點將自己的runid發(fā)送給從節(jié)點臀晃,從節(jié)點將這個runid保存起來;當斷線重連時介劫,從節(jié)點會將這個runid發(fā)送給主節(jié)點徽惋;主節(jié)點根據(jù)runid判斷能否進行部分復制:
如果從節(jié)點保存的runid與主節(jié)點現(xiàn)在的runid相同,說明主從節(jié)點之前同步過蜕猫,主節(jié)點會繼續(xù)嘗試使用部分復制(到底能不能部分復制還要看offset和復制積壓緩沖區(qū)的情況)寂曹;
如果從節(jié)點保存的runid與主節(jié)點現(xiàn)在的runid不同,說明從節(jié)點在斷線前同步的Redis節(jié)點并不是當前的主節(jié)點回右,只能進行全量復制隆圆。

psync命令的執(zhí)行過程

(1)首先,從節(jié)點根據(jù)當前狀態(tài)翔烁,決定如何調(diào)用psync命令:
如果從節(jié)點之前未執(zhí)行過slaveof或最近執(zhí)行了slaveof no one渺氧,則從節(jié)點發(fā)送命令為psync ? -1,向主節(jié)點請求全量復制蹬屹;

如果從節(jié)點之前執(zhí)行了slaveof侣背,則發(fā)送命令為psync <runid> <offset>,其中runid為上次復制的主節(jié)點的runid慨默,offset為上次復制截止時從節(jié)點保存的復制偏移量贩耐。

(2)主節(jié)點根據(jù)收到的psync命令,及當前服務(wù)器狀態(tài)厦取,決定執(zhí)行全量復制還是部分復制:

如果主節(jié)點版本低于Redis2.8潮太,則返回-ERR回復,此時從節(jié)點重新發(fā)送sync命令執(zhí)行全量復制

如果主節(jié)點版本夠新,且runid與從節(jié)點發(fā)送的runid相同铡买,且從節(jié)點發(fā)送的offset之后的數(shù)據(jù)在復制積壓緩沖區(qū)中都存在更鲁,則回復+CONTINUE,表示將進行部分復制奇钞,從節(jié)點等待主節(jié)點發(fā)送其缺少的數(shù)據(jù)即可澡为;

如果主節(jié)點版本夠新,但是runid與從節(jié)點發(fā)送的runid不同景埃,或從節(jié)點發(fā)送的offset之后的數(shù)據(jù)已不在復制積壓緩沖區(qū)中(在隊列中被擠出了)媒至,則回復+FULLRESYNC <runid> <offset>,表示要進行全量復制纠亚,其中runid表示主節(jié)點當前的runid塘慕,offset表示主節(jié)點當前的offset,從節(jié)點保存這兩個值蒂胞,以備使用图呢。

參考鏈接

http://www.cnblogs.com/kismetv/p/9236731.html

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市骗随,隨后出現(xiàn)的幾起案子蛤织,更是在濱河造成了極大的恐慌,老刑警劉巖鸿染,帶你破解...
    沈念sama閱讀 212,454評論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件指蚜,死亡現(xiàn)場離奇詭異,居然都是意外死亡涨椒,警方通過查閱死者的電腦和手機摊鸡,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,553評論 3 385
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來蚕冬,“玉大人免猾,你說我怎么就攤上這事《谌龋” “怎么了猎提?”我有些...
    開封第一講書人閱讀 157,921評論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長旁蔼。 經(jīng)常有香客問我锨苏,道長,這世上最難降的妖魔是什么棺聊? 我笑而不...
    開封第一講書人閱讀 56,648評論 1 284
  • 正文 為了忘掉前任伞租,我火速辦了婚禮,結(jié)果婚禮上限佩,老公的妹妹穿的比我還像新娘葵诈。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 65,770評論 6 386
  • 文/花漫 我一把揭開白布驯击。 她就那樣靜靜地躺著,像睡著了一般耐亏。 火紅的嫁衣襯著肌膚如雪徊都。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,950評論 1 291
  • 那天广辰,我揣著相機與錄音暇矫,去河邊找鬼。 笑死择吊,一個胖子當著我的面吹牛李根,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播几睛,決...
    沈念sama閱讀 39,090評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼房轿,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了所森?” 一聲冷哼從身側(cè)響起囱持,我...
    開封第一講書人閱讀 37,817評論 0 268
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎焕济,沒想到半個月后纷妆,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,275評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡晴弃,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,592評論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片交胚。...
    茶點故事閱讀 38,724評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡顶岸,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出旗国,到底是詐尸還是另有隱情枯怖,我是刑警寧澤,帶...
    沈念sama閱讀 34,409評論 4 333
  • 正文 年R本政府宣布能曾,位于F島的核電站度硝,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏寿冕。R本人自食惡果不足惜蕊程,卻給世界環(huán)境...
    茶點故事閱讀 40,052評論 3 316
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望驼唱。 院中可真熱鬧藻茂,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,815評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至掀序,卻和暖如春帆焕,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背不恭。 一陣腳步聲響...
    開封第一講書人閱讀 32,043評論 1 266
  • 我被黑心中介騙來泰國打工叶雹, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人换吧。 一個月前我還...
    沈念sama閱讀 46,503評論 2 361
  • 正文 我出身青樓折晦,卻偏偏與公主長得像,于是被迫代替她去往敵國和親沾瓦。 傳聞我的和親對象是個殘疾皇子满着,可洞房花燭夜當晚...
    茶點故事閱讀 43,627評論 2 350

推薦閱讀更多精彩內(nèi)容

  • 本篇就一下方面展開分析 如何使用主從復制? 主從復制的原理(重點是全量復制和部分復制暴拄、以及心跳機制) 實際應(yīng)用中需...
    lucode閱讀 989評論 0 5
  • 通過這篇文章你會知道如下: 如何配置主從關(guān)系漓滔?如何斷開主從關(guān)系?如何將從節(jié)點變成主節(jié)點乖篷? 主從復制的拓撲結(jié)構(gòu)以及相...
    打傘的Fish閱讀 432評論 0 1
  • 1琳骡、Units單位 配置大小單位,開頭定義了一些基本的度量單位,只支持bytes讼溺,不支持bit 對大小寫不敏感 2...
    MPPC閱讀 65,188評論 0 15
  • 如何主從復制 向redis服務(wù)器發(fā)送下面的命令127.0.0.1:12345> slaveof 127.0.0.1...
    cammsia閱讀 201評論 0 0
  • 超強楣号、超詳細Redis入門教程 轉(zhuǎn)載2017年03月04日 16:20:02 16916 轉(zhuǎn)載自: http://...
    邵云濤閱讀 17,434評論 3 313