Redis主從復(fù)制

Redis主從復(fù)制

一.主從復(fù)制介紹

1.Redis復(fù)制功能介紹

1)Redis 使用異步復(fù)制铅歼。從 Redis2.8開始卖漫,從服務(wù)器會以每秒一次的頻率向主服務(wù)器報告復(fù)制流(replication stream)的處理進(jìn)度以舒。

2)一個主服務(wù)器可以有多個從服務(wù)器淫半。

3)不僅主服務(wù)器可以有從服務(wù)器鸣个,從服務(wù)器也可以有自己的從服務(wù)器辑畦,多個從服務(wù)器之間可以構(gòu)成一個圖狀結(jié)構(gòu)吗蚌。

4)復(fù)制功能不會阻塞主服務(wù)器:即使有一個或多個從服務(wù)器正在進(jìn)行初次同步, 主服務(wù)器也可以繼續(xù)處理命令請求纯出。

5)復(fù)制功能也不會阻塞從服務(wù)器:只要在 redis.conf 文件中進(jìn)行了相應(yīng)的設(shè)置蚯妇, 即使從服務(wù)器正在進(jìn)行初次同步, 服務(wù)器也可以使用舊版本的數(shù)據(jù)集來處理命令查詢暂筝。

6)在從服務(wù)器刪除舊版本數(shù)據(jù)集并載入新版本數(shù)據(jù)集的那段時間內(nèi)箩言,連接請求會被阻塞。

7)還可以配置從服務(wù)器焕襟,讓它在與主服務(wù)器之間的連接斷開時陨收,向客戶端發(fā)送一個錯誤。

8)復(fù)制功能可以單純地用于數(shù)據(jù)冗余(data redundancy)胧洒,也可以通過讓多個從服務(wù)器處理只讀命令請求來提升擴(kuò)展性(scalability): 比如說畏吓,繁重的SORT命令可以交給附屬節(jié)點(diǎn)去運(yùn)行。

9)可以通過復(fù)制功能來讓主服務(wù)器免于執(zhí)行持久化操作:只要關(guān)閉主服務(wù)器的持久化功能卫漫,然后由從服務(wù)器去執(zhí)行持久化操作即可菲饼。

二.架構(gòu)圖
三.關(guān)閉主服務(wù)器持久化時,復(fù)制功能的數(shù)據(jù)安全問題

1.當(dāng)配置Redis復(fù)制功能時列赎,強(qiáng)烈建議打開主服務(wù)器的持久化功能宏悦。 否則的話,由于延遲等問題包吝,部署的服務(wù)應(yīng)該要避免自動拉起饼煞。

2.為了幫助理解主服務(wù)器關(guān)閉持久化時自動拉起的危險性,參考一下以下會導(dǎo)致主從服務(wù)器數(shù)據(jù)全部丟失的例子:

1)假設(shè)節(jié)點(diǎn)A為主服務(wù)器诗越,并且關(guān)閉了持久化砖瞧。并且節(jié)點(diǎn)B和節(jié)點(diǎn)C從節(jié)點(diǎn)A復(fù)制數(shù)據(jù)

2)節(jié)點(diǎn)A崩潰,然后由自動拉起服務(wù)重啟了節(jié)點(diǎn)A. 由于節(jié)點(diǎn)A的持久化被關(guān)閉了嚷狞,所以重啟之后沒有任何數(shù)據(jù)

3)節(jié)點(diǎn)B和節(jié)點(diǎn)C將從節(jié)點(diǎn)A復(fù)制數(shù)據(jù)块促,但是A的數(shù)據(jù)是空的,于是就把自身保存的數(shù)據(jù)副本刪除床未。

結(jié)論:

1)在關(guān)閉主服務(wù)器上的持久化竭翠,并同時開啟自動拉起進(jìn)程的情況下,即便使用Sentinel來實現(xiàn)Redis的高可用性薇搁,也是非常危險的斋扰。因為主服務(wù)器可能拉起得非常快,以至于Sentinel在配置的心跳時間間隔內(nèi)沒有檢測到主服務(wù)器已被重啟传货,然后還是會執(zhí)行上面的數(shù)據(jù)丟失的流程屎鳍。

2)無論何時,數(shù)據(jù)安全都是極其重要的损离,所以應(yīng)該禁止主服務(wù)器關(guān)閉持久化的同時自動拉起哥艇。

四.主從復(fù)制原理

主從復(fù)制流程:
1.從節(jié)點(diǎn)發(fā)送同步請求到主節(jié)點(diǎn)
2.主節(jié)點(diǎn)接收到從節(jié)點(diǎn)的請求之后,做了如下操作

  • 立即執(zhí)行bgsave將當(dāng)前內(nèi)存里的數(shù)據(jù)持久化到磁盤上

  • 持久化完成之后,將rdb文件發(fā)送給從節(jié)點(diǎn)

3.從節(jié)點(diǎn)從主節(jié)點(diǎn)接收到rdb文件之后,做了如下操作

  • 清空自己的數(shù)據(jù)

  • 載入從主節(jié)點(diǎn)接收的rdb文件到自己的內(nèi)存里

4.后面的操作就是和主節(jié)點(diǎn)實時的了

五.復(fù)制的一致性

1)在讀寫分離環(huán)境下,客戶端向主服務(wù)器發(fā)送寫命令 SET k10086 v10086僻澎,主服務(wù)器在執(zhí)行這個寫命令之后貌踏,向客戶端返回回復(fù),并將這個寫命令傳播給從服務(wù)器窟勃。

2)接到回復(fù)的客戶端繼續(xù)向從服務(wù)器發(fā)送讀命令 GET k10086 祖乳,并且因為網(wǎng)絡(luò)狀態(tài)的原因,客戶端的 GET命令比主服務(wù)器傳播的 SET 命令更快到達(dá)了從服務(wù)器秉氧。

3)因為從服務(wù)器鍵k10086的值還未被更新眷昆,所以客戶端在從服務(wù)器讀取到的將是一個錯誤(過期)的k10086值。

Redis是怎么保證數(shù)據(jù)安全的呢汁咏?

1)主服務(wù)器只在有至少N個從服務(wù)器的情況下亚斋,才執(zhí)行寫操作

2)從Redis 2.8開始,為了保證數(shù)據(jù)的安全性攘滩,可以通過配置帅刊,讓主服務(wù)器只在有至少N個當(dāng)前已連接從服務(wù)器的情況下,才執(zhí)行寫命令漂问。

3)不過赖瞒,因為 Redis 使用異步復(fù)制,所以主服務(wù)器發(fā)送的寫數(shù)據(jù)并不一定會被從服務(wù)器接收到蚤假,因此栏饮, 數(shù)據(jù)丟失的可能性仍然是存在的。

4)通過以下兩個參數(shù)保證數(shù)據(jù)的安全:

#執(zhí)行寫操作所需的至少從服務(wù)器數(shù)量
min-slaves-to-write <number of slaves>
#指定網(wǎng)絡(luò)延遲的最大值
min-slaves-max-lag <number of seconds>

這個特性的運(yùn)作原理:

1)從服務(wù)器以每秒一次的頻率 PING 主服務(wù)器一次磷仰, 并報告復(fù)制流的處理情況袍嬉。主服務(wù)器會記錄各個從服務(wù)器最后一次向它發(fā)送 PING 的時間。用戶可以通過配置灶平, 指定網(wǎng)絡(luò)延遲的最大值 min-slaves-max-lag 伺通, 以及執(zhí)行寫操作所需的至少從服務(wù)器數(shù)量 min-slaves-to-write 。

2)如果至少有 min-slaves-to-write 個從服務(wù)器民逼, 并且這些服務(wù)器的延遲值都少于 min-slaves-max-lag 秒泵殴, 那么主服務(wù)器就會執(zhí)行客戶端請求的寫操作涮帘。你可以將這個特性看作 CAP 理論中的 C 的條件放寬版本: 盡管不能保證寫操作的持久性拼苍, 但起碼丟失數(shù)據(jù)的窗口會被嚴(yán)格限制在指定的秒數(shù)中。

3)另一方面, 如果條件達(dá)不到 min-slaves-to-write 和 min-slaves-max-lag 所指定的條件疮鲫, 那么寫操作就不會被執(zhí)行吆你, 主服務(wù)器會向請求執(zhí)行寫操作的客戶端返回一個錯誤。

六.Redis主從實戰(zhàn)

環(huán)境規(guī)劃以及地址分配

配置主從

1.安裝redis

#安裝依賴
[root@redis01 ~]# install gcc -y
#創(chuàng)建目錄
[root@redis01 ~]# mkdir -p /data/soft
[root@redis01 ~]# mkdir -p /data/redis_6379
[root@redis01 ~]# mkdir -p /opt/redis_6379/{conf,pid,logs}
#下載并安裝
[root@redis01 ~]# cd /data/soft/
[root@redis01 ~]# wget http://download.redis.io/releases/redis-3.2.9.tar.gz
[root@redis01 ~]# tar zxf redis-3.2.9.tar.gz -C /opt/
[root@redis01 ~]# ln -s /opt/redis-3.2.9/ /opt/redis
[root@redis01 ~]# cd /opt/redis
[root@redis01 ~]# make && make install
#配置文件
[root@redis01 ~]# vim /opt/redis_6379/conf/redis_6379.conf
### 以守護(hù)進(jìn)程模式啟動
daemonize yes
### 綁定的主機(jī)地址
bind 127.0.0.1 10.0.0.73
### 監(jiān)聽端口
port 6379
### pid文件和log文件的保存地址
pidfile /opt/redis_6379/pid/redis_6379.pid
logfile /opt/redis_6379/logs/redis_6379.log
### 本地數(shù)據(jù)庫的目錄
dir /data/redis_6379
### 指定本地持久化文件的文件名,默認(rèn)是dump.rdb
dbfilename redis_6379.rdb
#如果需要密碼認(rèn)證做如下配置
主從密碼配置文件里添加2行參數(shù):
requirepass "123456"
masterauth "123456"

#啟動redis
[root@redis01 ~]# redis-server /opt/redis_6379/conf/redis_6379.conf

#檢查是否啟動
[root@redis01 ~]#  ps -ef|grep redis
[root@redis01 ~]# netstat -lntup|grep redis

2.快速部署其它服務(wù)器

[root@redis02 ~]# rsync -avz 10.0.0.73:/opt/* /opt/
[root@redis02 ~]# mkdir /data/redis_6379/ -p
[root@redis02 ~]# cd /opt/redis 
[root@redis02 ~]# make install 
[root@redis02 ~]# sed -i 's#73#74#g' /opt/redis_6379/conf/redis_6379.conf
[root@redis02 ~]# redis-server /opt/redis_6379/conf/redis_6379.conf

3.開啟主從

#開啟從庫
配置方法:
方法1: 臨時生效
[root@redis02 ~]# redis-cli -h 10.0.0.74
10.0.0.74:6379> SLAVEOF 10.0.0.73 6379
OK
?
方法2: 寫入配置文件(如果使用哨兵不建議寫入配置文件)
SLAVEOF 10.0.0.73 6379

4.檢測主從

#master
[root@redis01 ~]# redis-cli 
127.0.0.1:6379> info replication
# Replication
role:master
connected_slaves:2
slave0:ip=10.0.0.75,port=6379,state=online,offset=15261,lag=0
slave1:ip=10.0.0.74,port=6379,state=online,offset=15261,lag=0
master_repl_offset:15261
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:2
repl_backlog_histlen:15260
?
#連接從庫查看
[root@redis02 ~]# redis-cli 
127.0.0.1:6379>  INFO replication
# Replication
role:slave
master_host:10.0.0.73
master_port:6379
master_link_status:up
master_last_io_seconds_ago:10
master_sync_in_progress:0
slave_repl_offset:1107
slave_priority:100
slave_read_only:1
connected_slaves:0
master_repl_offset:0
repl_backlog_active:0
repl_backlog_size:1048576
repl_backlog_first_byte_offset:0
repl_backlog_histlen:0
?
[root@redis03 ~]# redis-cli
127.0.0.1:6379> info replication
# Replication
role:slave
master_host:10.0.0.73
master_port:6379
master_link_status:up
master_last_io_seconds_ago:2
master_sync_in_progress:0
slave_repl_offset:1205
slave_priority:100
slave_read_only:1
connected_slaves:0
master_repl_offset:0
repl_backlog_active:0
repl_backlog_size:1048576
repl_backlog_first_byte_offset:0
repl_backlog_histlen:0

注意

1.從節(jié)點(diǎn)只讀不可寫
2.從節(jié)點(diǎn)不會自動故障轉(zhuǎn)移,它會一直同步主
10.0.0.74:6379> set k1 v1
(error) READONLY You can't write against a read only slave.
3.主從復(fù)制故障轉(zhuǎn)移需要人工介入
?
- 修改代碼指向REDIS的IP地址
- 從節(jié)點(diǎn)需要執(zhí)行SLAVEOF no one

4.從節(jié)點(diǎn)會清空自己原有的數(shù)據(jù),如果同步的對象寫錯了,就會導(dǎo)致數(shù)據(jù)丟失
?
安全的操作:
1.無論是同步,無論是主節(jié)點(diǎn)還是從節(jié)點(diǎn)
2.先備份一下數(shù)據(jù)

主從切換

#連接master
[root@redis01 ~]# redis-cli
#關(guān)閉主庫
127.0.0.1:6379> shutdown
?
#連接slave01
[root@redis02 ~]# redis-cli
#查看主從信息
127.0.0.1:6379> info replication
# Replication
role:slave
master_host:10.0.0.73
master_port:6379
master_link_status:down   #連接主庫的狀態(tài)是:down
master_last_io_seconds_ago:-1
master_sync_in_progress:0
slave_repl_offset:16717
master_link_down_since_seconds:77
slave_priority:100
slave_read_only:1
connected_slaves:0
master_repl_offset:0
repl_backlog_active:0
repl_backlog_size:1048576
repl_backlog_first_byte_offset:0
repl_backlog_histlen:0
#取消主從關(guān)系
127.0.0.1:6379> SLAVEOF no one
OK
127.0.0.1:6379> info replication
# Replication
role:master            #此時的角色就變成了master
connected_slaves:0
master_repl_offset:0
repl_backlog_active:0
repl_backlog_size:1048576
repl_backlog_first_byte_offset:0
repl_backlog_histlen:0
?
#將其他從庫重新只想新主
#連接從庫
[root@redis03 ~]# redis-cli
127.0.0.1:6379> SLAVEOF 10.0.0.74 6379
OK
127.0.0.1:6379> info replication
# Replication
role:slave
master_host:10.0.0.74
master_port:6379
master_link_status:up
master_last_io_seconds_ago:5
master_sync_in_progress:0
slave_repl_offset:15
slave_priority:100
slave_read_only:1
connected_slaves:0
master_repl_offset:0
repl_backlog_active:0
repl_backlog_size:1048576
repl_backlog_first_byte_offset:0
repl_backlog_histlen:0
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
禁止轉(zhuǎn)載俊犯,如需轉(zhuǎn)載請通過簡信或評論聯(lián)系作者妇多。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市燕侠,隨后出現(xiàn)的幾起案子者祖,更是在濱河造成了極大的恐慌,老刑警劉巖绢彤,帶你破解...
    沈念sama閱讀 211,817評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件七问,死亡現(xiàn)場離奇詭異,居然都是意外死亡茫舶,警方通過查閱死者的電腦和手機(jī)械巡,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,329評論 3 385
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來饶氏,“玉大人讥耗,你說我怎么就攤上這事≌钇簦” “怎么了古程?”我有些...
    開封第一講書人閱讀 157,354評論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長皮仁。 經(jīng)常有香客問我籍琳,道長,這世上最難降的妖魔是什么贷祈? 我笑而不...
    開封第一講書人閱讀 56,498評論 1 284
  • 正文 為了忘掉前任趋急,我火速辦了婚禮,結(jié)果婚禮上势誊,老公的妹妹穿的比我還像新娘呜达。我一直安慰自己,他們只是感情好粟耻,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,600評論 6 386
  • 文/花漫 我一把揭開白布查近。 她就那樣靜靜地躺著,像睡著了一般挤忙。 火紅的嫁衣襯著肌膚如雪霜威。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,829評論 1 290
  • 那天册烈,我揣著相機(jī)與錄音戈泼,去河邊找鬼。 笑死,一個胖子當(dāng)著我的面吹牛大猛,可吹牛的內(nèi)容都是我干的扭倾。 我是一名探鬼主播,決...
    沈念sama閱讀 38,979評論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼挽绩,長吁一口氣:“原來是場噩夢啊……” “哼膛壹!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起唉堪,我...
    開封第一講書人閱讀 37,722評論 0 266
  • 序言:老撾萬榮一對情侶失蹤模聋,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后唠亚,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體撬槽,經(jīng)...
    沈念sama閱讀 44,189評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,519評論 2 327
  • 正文 我和宋清朗相戀三年趾撵,在試婚紗的時候發(fā)現(xiàn)自己被綠了侄柔。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,654評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡占调,死狀恐怖暂题,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情究珊,我是刑警寧澤薪者,帶...
    沈念sama閱讀 34,329評論 4 330
  • 正文 年R本政府宣布,位于F島的核電站剿涮,受9級特大地震影響言津,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜取试,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,940評論 3 313
  • 文/蒙蒙 一悬槽、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧瞬浓,春花似錦初婆、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,762評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至萨赁,卻和暖如春弊琴,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背杖爽。 一陣腳步聲響...
    開封第一講書人閱讀 31,993評論 1 266
  • 我被黑心中介騙來泰國打工敲董, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留详瑞,地道東北人。 一個月前我還...
    沈念sama閱讀 46,382評論 2 360
  • 正文 我出身青樓臣缀,卻偏偏與公主長得像,于是被迫代替她去往敵國和親泻帮。 傳聞我的和親對象是個殘疾皇子精置,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,543評論 2 349

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

  • 概述 主從復(fù)制,是指將一臺Redis服務(wù)器的數(shù)據(jù)锣杂,復(fù)制到其他的Redis服務(wù)器脂倦。前者稱為主節(jié)點(diǎn)(master),后...
    Lin_Shao閱讀 272評論 0 0
  • 本篇就一下方面展開分析 如何使用主從復(fù)制元莫? 主從復(fù)制的原理(重點(diǎn)是全量復(fù)制和部分復(fù)制赖阻、以及心跳機(jī)制) 實際應(yīng)用中需...
    lucode閱讀 989評論 0 5
  • 一、Redis主從復(fù)制 主從復(fù)制:主節(jié)點(diǎn)負(fù)責(zé)寫數(shù)據(jù)踱蠢,從節(jié)點(diǎn)負(fù)責(zé)讀數(shù)據(jù)火欧,主節(jié)點(diǎn)定期把數(shù)據(jù)同步到從節(jié)點(diǎn)保證數(shù)據(jù)的一致性...
    愛情小傻蛋閱讀 946評論 0 0
  • Redis的持久化功能在一定程度上保證了數(shù)據(jù)的安全性,即便是服務(wù)器宕機(jī)的情況下茎截,也可以保證數(shù)據(jù)的丟失非常少苇侵。通常,...
    TurboSnail閱讀 891評論 0 0
  • 〔例文〕 我習(xí)慣了等待企锌,于是榆浓,在輪回中我無法抗拒的站回等待的原點(diǎn)。我不知道撕攒,這樣我還要等多久才能看到一個答案陡鹃;我不...
    林泉雲(yún)霞閱讀 230評論 0 5