主從模式的概念:
主從模式就是N個(gè)redis實(shí)例,可以是1主N從,也可以N主N從(N主N從則不是嚴(yán)格意義上的主從模式了,后續(xù)的集群模式會(huì)說(shuō)到,N主N從就是N+N個(gè)redis實(shí)例。)
主從模式的一個(gè)作用是備份數(shù)據(jù),這樣當(dāng)一個(gè)節(jié)點(diǎn)損壞(指不可恢復(fù)的硬件損壞)時(shí),數(shù)據(jù)因?yàn)橛袀浞?,可以方便恢?fù)。
另一個(gè)作用是負(fù)載均衡,所有客戶端都訪問(wèn)一個(gè)節(jié)點(diǎn)肯定會(huì)影響Redis工作效率,有了主從以后,查詢操作就可以通過(guò)查詢從節(jié)點(diǎn)來(lái)完成
redis主從需要了解的概念
一個(gè)Master可以有多個(gè)Slaves,可以是1主N從。
默認(rèn)配置下,master節(jié)點(diǎn)可以進(jìn)行讀和寫,slave節(jié)點(diǎn)只能進(jìn)行讀操作,寫操作被禁止(readonly)。
不要修改配置讓slave節(jié)點(diǎn)支持寫操作,沒(méi)有意義,原因一,寫入的數(shù)據(jù)不會(huì)被同步到其他節(jié)點(diǎn);原因二,當(dāng)master節(jié)點(diǎn)修改同一條數(shù)據(jù)后,slave節(jié)點(diǎn)的數(shù)據(jù)會(huì)被覆蓋掉。
slave節(jié)點(diǎn)掛了不影響其他slave節(jié)點(diǎn)的讀和master節(jié)點(diǎn)的讀和寫,重新啟動(dòng)后會(huì)將數(shù)據(jù)從master節(jié)點(diǎn)同步過(guò)來(lái)。
master節(jié)點(diǎn)掛了以后,不影響slave節(jié)點(diǎn)的讀,Redis將不再提供寫服務(wù),master節(jié)點(diǎn)啟動(dòng)后Redis將重新對(duì)外提供寫服務(wù)。
特別說(shuō)明:該種模式下,master節(jié)點(diǎn)掛了以后,slave不會(huì)競(jìng)選成為master。哨兵模式(Sentinel)下會(huì)進(jìn)行master的競(jìng)選,后續(xù)我們?cè)賴L試
主從模式的搭建
- 啟動(dòng)一個(gè)節(jié)點(diǎn),把它當(dāng)做master節(jié)點(diǎn)(port:7001)
- 配置slave節(jié)點(diǎn)(port:7000)有兩種方法
- 我們可以直接在配置文件中加入配置
slaveof 192.168.3.67 7001
然后啟動(dòng)就可以了
- redis-cli 進(jìn)入操作界面后
192.168.3.67:7000> slaveof 192.168.3.67 7001
OK Already connected to specified master
測(cè)試主從節(jié)點(diǎn)
master節(jié)點(diǎn)上的信息
192.168.3.67:7001> info Replication
# Replication
role:master
connected_slaves:1
slave0:ip=192.168.3.67,port=7000,state=online,offset=2379,lag=0
master_replid:ed564db30c302becd3995539e7ce9b30ad5d5af6
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:2379
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:2379
slave幾點(diǎn)上的信息
192.168.3.67:7000> info Replication
# Replication
role:slave
master_host:192.168.3.67
master_port:7001
master_link_status:up
master_last_io_seconds_ago:7
master_sync_in_progress:0
slave_repl_offset:2337
slave_priority:100
slave_read_only:1
connected_slaves:0
master_replid:ed564db30c302becd3995539e7ce9b30ad5d5af6
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:2337
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:2337
在master上set key-value
然后在從節(jié)點(diǎn)get
192.168.3.67:7001> set test hello
OK
192.168.3.67:7000> get test
"hello"
從節(jié)點(diǎn)只讀,寫的話會(huì)報(bào)錯(cuò)
192.168.3.67:7000> set test nihao
(error) READONLY You can't write against a read only replica.
斷開主從關(guān)系
通過(guò)slaveof <masterip> <masterport>命令建立主從復(fù)制關(guān)系以后,可以通過(guò)slaveof no one斷開。需要注意的是,從節(jié)點(diǎn)斷開復(fù)制后,不會(huì)刪除已有的數(shù)據(jù),只是不再接受主節(jié)點(diǎn)新的數(shù)據(jù)變化。
從節(jié)點(diǎn)執(zhí)行slaveof no one后,打印日志如下所示;可以看出斷開復(fù)制后,從節(jié)點(diǎn)又變回為主節(jié)點(diǎn)
參考文章
-
主從復(fù)制
搭建以及主從之間數(shù)據(jù)復(fù)制的問(wèn)題 -
redis 服務(wù)器的安裝、主從復(fù)制的搭建
搭建和測(cè)試