Redis 為我們提供了復制功能超升,實現(xiàn)了相同數(shù)據(jù)的多個 Redis 副本節(jié)點尖昏。復制功能是高可用 的基礎(chǔ)串绩,也是哨兵和集群機制的基礎(chǔ)。
建立復制
復制中的成員分為主節(jié)點和從節(jié)點枉圃,一個從節(jié)點只能有一個主節(jié)點功茴,一個主節(jié)點可以有多個從節(jié)點。復制的數(shù)據(jù)流是單向的孽亲,只能有主節(jié)點流向從節(jié)點坎穿。
復制建立的三種方式:
- 在配置文件添加 slaveof 127.0.0.1 6379
- 在 redis-server 啟動命令后加入 --slaveof {masterHost} {masterPort}\
- 直接使用命令:slaveof {masterHost} {masterPort} 生效。
這里我們采用第三種方式動態(tài)創(chuàng)建一個從節(jié)點
[root@iZu1qhttxe5Z conf]# redis-cli -p 6378
127.0.0.1:6378> slaveof 127.0.0.1 6379
OK
127.0.0.1:6378>
通過 info replication 命令查看復制信息:
主節(jié)點
127.0.0.1:6379> info replication
# Replication
role:master
connected_slaves:2
slave0:ip=127.0.0.1,port=6380,state=online,offset=757,lag=1
slave1:ip=127.0.0.1,port=6378,state=online,offset=757,lag=1
master_repl_offset:757
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:2
repl_backlog_histlen:756
127.0.0.1:6379>
從節(jié)點
[root@iZu1qhttxe5Z ~]# redis-cli -p 6380
127.0.0.1:6380> info replication
# Replication
role:slave
master_host:127.0.0.1
master_port:6379
master_link_status:up
master_last_io_seconds_ago:8
master_sync_in_progress:0
slave_repl_offset:225
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
127.0.0.1:6380>
斷開復制
使用 slaveof no one 命令斷開復制返劲,斷開復制后當前從節(jié)點自動晉升了主節(jié)點(以前的主節(jié)點也還是主節(jié)點)玲昧。從節(jié)點斷開復制后并不會拋棄原有數(shù)據(jù)犯祠,只是無法再獲取原有主節(jié)點上的數(shù)據(jù)變化。
127.0.0.1:6380> slaveof no one
OK
127.0.0.1:6380> info replication
# Replication
role:master
connected_slaves:0
master_repl_offset:1093
repl_backlog_active:0
repl_backlog_size:1048576
repl_backlog_first_byte_offset:0
repl_backlog_histlen:0
127.0.0.1:6380>
slaveof 命令除了斷開復制外酌呆。執(zhí)行 slaveof {newMasterIp} {newMasterPort} 還可以將當前節(jié)點的主節(jié)點切換成另一個新的主節(jié)點,具體流程如下:
- 斷開與舊主節(jié)點復制關(guān)系搔耕。
- 與新主節(jié)點建立復制關(guān)系隙袁。
- 刪除從節(jié)點當前所有數(shù)據(jù)。
- 對新主節(jié)點進行復制操作弃榨。
注意:切換主節(jié)點后菩收,從節(jié)點會清空之前所有的數(shù)據(jù)。
常見拓撲結(jié)構(gòu)
常見的拓撲結(jié)構(gòu)分為:
-
一主一從
一主一從是最簡單的復制拓撲結(jié)構(gòu)鲸睛,可以提供故障轉(zhuǎn)移娜饵。也可將一些運算量大,資源消耗大的復雜操作放到從節(jié)點執(zhí)行官辈,從而不影響主節(jié)點正常提供服務(wù)箱舞。如果主節(jié)點宕機或者做升級維護時,從節(jié)點應(yīng)該主動從斷開復制連接拳亿,將自己提升為主節(jié)點對外服務(wù)晴股,當原有的主節(jié)點重啟好后,簡直主從關(guān)系肺魁,以避免數(shù)據(jù)丟失电湘。
-
一主多從
一主多從適用于讀占比較高的場景,實現(xiàn)讀寫分離鹅经,將讀連接發(fā)送到從節(jié)點從而減輕主節(jié)點的壓力寂呛,也可以將AOF,RDB等可能引起阻塞的操作放到特定的從節(jié)點上執(zhí)行瘾晃。但是贷痪,此種結(jié)構(gòu)主節(jié)點要維護多個從節(jié)點的復制關(guān)系,每一個從節(jié)點都相當于主節(jié)點的一個客戶端酗捌,主節(jié)點需要為每一個客戶端維護一個連接和緩沖區(qū)呢诬,當寫占比較高時,主節(jié)點需要所有的從節(jié)點發(fā)送寫指令胖缤,增大了網(wǎng)絡(luò)帶寬等資源的消耗和主節(jié)點的壓力尚镰。
-
樹狀結(jié)構(gòu)
樹狀結(jié)構(gòu)結(jié)構(gòu)恰恰是為了解決一主多從引入的問題,因為采用梳妝結(jié)構(gòu)哪廓,從節(jié)點分擔了主節(jié)點的壓力狗唉。當主節(jié)點需要掛載多個從節(jié)點時為了避免對主節(jié)點的性能干擾,可以采用樹狀主從結(jié)構(gòu)降低主節(jié)點壓力涡真。
安全性
當主節(jié)點會通過設(shè)置 requirepass 參數(shù)進行密碼驗證分俯,這時從節(jié)點需要配置 masterauth 參數(shù)肾筐,其值與主節(jié)點 requirepass 參數(shù)一致。
# 主節(jié)點
requirepass 123456
#從節(jié)點
masterauth 123456
傳輸延遲
數(shù)據(jù)服務(wù)器間傳輸時有一定網(wǎng)絡(luò)延時缸剪,Redis 的 repl-disable-tcp-nodelay 參數(shù)控制是否實時同步數(shù)據(jù)吗铐,當值為yes 開啟 TCP_NODELAY,默認為 no 杏节,關(guān)閉 TCP_NODELAY唬渗。
- 當關(guān)閉時,主節(jié)點產(chǎn)生的命令數(shù)據(jù)無論大小都會及時地發(fā)送給從節(jié)點奋渔,這樣主從之間
延遲會變小镊逝,但增加了網(wǎng)絡(luò)帶寬的消耗。適用于主從之間的網(wǎng)絡(luò)環(huán)境良好的場景嫉鲸,如
同機架或同機房部署撑蒜。 - 當開啟時,主節(jié)點會合并較小的 TCP 數(shù)據(jù)包從而節(jié)省帶寬玄渗。默認發(fā)送時間間隔取決
于 Linux 的內(nèi)核座菠,一般默認為 40 毫秒。這種配置節(jié)省了帶寬但增大主從之間的延遲捻爷。
適用于主從網(wǎng)絡(luò)環(huán)境復雜或帶寬緊張的場景辈灼,如跨機房,跨地域也榄。
部署主從節(jié)點時需要考慮網(wǎng)絡(luò)延遲巡莹、帶寬使用率、防災(zāi)級別等因素甜紫,如要求低延
遲時降宅,建議同機架或同機房部署并關(guān)閉 repl-disable-tcp-nodelay;如果考
慮高容災(zāi)性囚霸,可以同城跨機房部署并開啟 re