Redis主從復(fù)制作用及搭建過(guò)程
概述
Redis 的主從復(fù)制(Master-Slave Replication)是實(shí)現(xiàn)數(shù)據(jù)備份、讀寫(xiě)分離和水平擴(kuò)展的核心機(jī)制之一。通過(guò)主從復(fù)制,一個(gè)主節(jié)點(diǎn)(Master)可以將數(shù)據(jù)同步到多個(gè)從節(jié)點(diǎn)(Slave),從節(jié)點(diǎn)還可以級(jí)聯(lián)創(chuàng)建自己的從節(jié)點(diǎn),從而形成樹(shù)狀結(jié)構(gòu)。
注意,Redis的主從復(fù)制是實(shí)現(xiàn)高可用的核心機(jī)制,并不能實(shí)現(xiàn)高可用
Redis主從復(fù)制作用
數(shù)據(jù)冗余:
主從復(fù)制實(shí)現(xiàn)了數(shù)據(jù)的熱備份,是持久化之外的一種數(shù)據(jù)冗余方式。
故障恢復(fù)
當(dāng)主節(jié)點(diǎn)出現(xiàn)問(wèn)題時(shí),可以由從節(jié)點(diǎn)提供服務(wù),實(shí)現(xiàn)快速的故障恢復(fù);實(shí)際上是一種服務(wù)的冗余。
負(fù)載均衡:
在主從復(fù)制的基礎(chǔ)上,配合讀寫(xiě)分離,可以由主節(jié)點(diǎn)提供寫(xiě)服務(wù),由從節(jié)點(diǎn)提供讀服務(wù)(即寫(xiě)Redis數(shù)據(jù)時(shí)應(yīng)用連接主節(jié)點(diǎn),讀Redis數(shù)據(jù)時(shí)應(yīng)用連接從節(jié)點(diǎn)),分擔(dān)服務(wù)器負(fù)載;尤其是在寫(xiě)少讀多的場(chǎng)景下,通過(guò)多個(gè)從節(jié)點(diǎn)分擔(dān)讀負(fù)載,可以大大提高Redis服務(wù)器的并發(fā)量。
讀寫(xiě)分離:
可以用于實(shí)現(xiàn)讀寫(xiě)分離,主庫(kù)寫(xiě)、從庫(kù)讀,讀寫(xiě)分離不僅可以提高服務(wù)器的負(fù)載能力,同時(shí)可根據(jù)需求的變化,改變從庫(kù)的數(shù)量。
高可用基石
除了上述作用以外,主從復(fù)制還是哨兵和集群能夠?qū)嵤┑幕A(chǔ),因此說(shuō)主從復(fù)制是Redis高可用的基礎(chǔ)。
Redis主從復(fù)制搭建
搭建主服務(wù)器
參考這篇文章:Redis6.2.x版本安裝
搭建從服務(wù)器
參考這篇文章:Redis6.2.x版本安裝
需要注意從服務(wù)器配置文件的修改:
# 第75行,修改遠(yuǎn)程訪問(wèn)地址 75:bind 0.0.0.0 # 第98行,修改端口號(hào) 98:port 6379 # 第259行,守護(hù)進(jìn)程運(yùn)行,默認(rèn)位前臺(tái)運(yùn)行,需要修改為yes 259:daemonize yes # 第304行,指定redis的日志 304:logfile "/var/log/redis/redis.log" # 第329行,指定數(shù)據(jù)庫(kù)的數(shù)量,默認(rèn)是16個(gè) 329:databases 16 # 第433行,持久化的文件 433:dbfilename dump.rdb # 第456行,設(shè)置redis的數(shù)據(jù)目錄,和我們上面創(chuàng)建的路徑保持一致 456:dir /data00/data/redis/ # 第903行,設(shè)置密碼,建議不要使用弱密碼 903:requirepass 123456 # 第479行,主庫(kù)的IP和端口 479:replicaof 127.0.0.1 6379 # 第486行,如果主服務(wù)器設(shè)置了密碼,需要配置認(rèn)證 486:masterauth !Xinxin123 # 其它配置 # 從服務(wù)器是否可寫(xiě)(默認(rèn)只讀) replica-read-only yes # 復(fù)制緩沖區(qū)大小 repl-backlog-size 1mb # 復(fù)制超時(shí)時(shí)間(秒) repl-timeout 60 # 當(dāng)主從斷開(kāi)時(shí),從服務(wù)器是否繼續(xù)提供服務(wù) replica-serve-stale-data yes
啟動(dòng)主庫(kù)之后再啟動(dòng)從庫(kù)
[root@node01 ~]# redis-server /data00/data/redis/redis.conf [root@node01 ~]# ss -lntup | grep 6379 tcp LISTEN 0 511 127.0.0.1:6379 0.0.0.0:* users:(("redis-server",pid=1001533,fd=6)) tcp LISTEN 0 511 [::1]:6379 [::]:* users:(("redis-server",pid=1001533,fd=7))
驗(yàn)證主從復(fù)制是否成功
在主從分別執(zhí)行INFO REPLICATION
命令
# 主庫(kù)執(zhí)行 127.0.0.1:6379> INFO REPLICATION # Replication role:master connected_slaves:1 slave0:ip=10.37.99.63,port=6379,state=online,offset=98,lag=0 master_failover_state:no-failover master_replid:2f61b8be8cbf19e45882f77bea61b55862bf74e5 master_replid2:0000000000000000000000000000000000000000 master_repl_offset:98 second_repl_offset:-1 repl_backlog_active:1 repl_backlog_size:1048576 repl_backlog_first_byte_offset:1 repl_backlog_histlen:98 # 從庫(kù)執(zhí)行 127.0.0.1:6379> INFO REPLICATION # Replication role:slave master_host:10.37.97.56 master_port:6379 master_link_status:up master_last_io_seconds_ago:4 master_sync_in_progress:0 slave_read_repl_offset:238 slave_repl_offset:238 slave_priority:100 slave_read_only:1 replica_announced:1 connected_slaves:0 master_failover_state:no-failover master_replid:2f61b8be8cbf19e45882f77bea61b55862bf74e5 master_replid2:0000000000000000000000000000000000000000 master_repl_offset:238 second_repl_offset:-1 repl_backlog_active:1 repl_backlog_size:1048576 repl_backlog_first_byte_offset:1 repl_backlog_histlen:238
驗(yàn)證主庫(kù)寫(xiě)入數(shù)據(jù),從庫(kù)是否能獲取到
# 主庫(kù)寫(xiě)入數(shù)據(jù) 127.0.0.1:6379> set rep rep OK # 從庫(kù)查詢數(shù)據(jù) 127.0.0.1:6379> get rep "rep"
驗(yàn)證從庫(kù)寫(xiě)數(shù)據(jù),預(yù)期應(yīng)該報(bào)錯(cuò)
127.0.0.1:6379> set slave 1 (error) READONLY You can't write against a read only replica.
Redis主從復(fù)制原理
主從復(fù)制過(guò)程大體可以分為3個(gè)階段:連接建立階段(即準(zhǔn)備階段)、數(shù)據(jù)同步階段、命令傳播階段。
在從節(jié)點(diǎn)執(zhí)行 slaveof 命令后,復(fù)制過(guò)程便開(kāi)始運(yùn)作,下面圖示可以看出復(fù)制過(guò)程大致分為6個(gè)過(guò)程。
- 保存主節(jié)點(diǎn)信息
執(zhí)行slaveof后 Redis會(huì)打印如下日志:
- 從節(jié)點(diǎn)與主節(jié)點(diǎn)建立網(wǎng)絡(luò)連接
從節(jié)點(diǎn)(slave)內(nèi)部通過(guò)每秒運(yùn)行的定時(shí)任務(wù)維護(hù)復(fù)制相關(guān)邏輯,當(dāng)定時(shí)任務(wù)發(fā)現(xiàn)存在新的主節(jié)點(diǎn)后,會(huì)嘗試與該節(jié)點(diǎn)建立網(wǎng)絡(luò)連接。
從節(jié)點(diǎn)會(huì)建立一個(gè) socket 套接字,從節(jié)點(diǎn)建立了一個(gè)端口為51234的套接字,專門(mén)用于接受主節(jié)點(diǎn)發(fā)送的復(fù)制命令。從節(jié)點(diǎn)連接成功后打印如下日志:
如果從節(jié)點(diǎn)無(wú)法建立連接,定時(shí)任務(wù)會(huì)無(wú)限重試直到連接成功或者執(zhí)行 slaveofnoone 取消復(fù)制。
關(guān)于連接失敗,可以在從節(jié)點(diǎn)執(zhí)行 info replication 查看 master_link_down_since_seconds 指標(biāo),它會(huì)記錄與主節(jié)點(diǎn)連接失敗的系統(tǒng)時(shí)間。從節(jié)點(diǎn)連接主節(jié)點(diǎn)失敗時(shí)也會(huì)每秒打印如下日志,方便發(fā)現(xiàn)問(wèn)題:
- 發(fā)送ping命令
連接建立成功后從節(jié)點(diǎn)發(fā)送 ping 請(qǐng)求進(jìn)行首次通信, ping 請(qǐng)求主要目的如下:
檢測(cè)主從之間網(wǎng)絡(luò)套接字是否可用。
檢測(cè)主節(jié)點(diǎn)當(dāng)前是否可接受處理命令。
如果發(fā)送 ping 命令后,從節(jié)點(diǎn)沒(méi)有收到主節(jié)點(diǎn)的 pong 回復(fù)或者超時(shí),比如網(wǎng)絡(luò)超時(shí)或者主節(jié)點(diǎn)正在阻塞無(wú)法響應(yīng)命令,從節(jié)點(diǎn)會(huì)斷開(kāi)復(fù)制連接,下次定時(shí)任務(wù)會(huì)發(fā)起重連。
從節(jié)點(diǎn)發(fā)送的 ping 命令成功返回,Redis 打印如下日志,并繼續(xù)后續(xù)復(fù)制流程:
- 權(quán)限驗(yàn)證
如果主節(jié)點(diǎn)設(shè)置了 requirepass 參數(shù),則需要密碼驗(yàn)證,從節(jié)點(diǎn)必須配置 masterauth 參數(shù)保證與主節(jié)點(diǎn)相同的密碼才能通過(guò)驗(yàn)證。如果驗(yàn)證失敗復(fù)制將終止,從節(jié)點(diǎn)重新發(fā)起復(fù)制流程。
- 同步數(shù)據(jù)集
主從復(fù)制連接正常通信后,對(duì)于首次建立復(fù)制的場(chǎng)景,主節(jié)點(diǎn)會(huì)把持有的數(shù)據(jù)全部發(fā)送給從節(jié)點(diǎn),這部分操作是耗時(shí)最長(zhǎng)的步驟。
- 命令持續(xù)復(fù)制
當(dāng)主節(jié)點(diǎn)把當(dāng)前的數(shù)據(jù)同步給從節(jié)點(diǎn)后,便完成了復(fù)制的建立流程。接下來(lái)主節(jié)點(diǎn)會(huì)持續(xù)地把寫(xiě)命令發(fā)送給從節(jié)點(diǎn),保證主從數(shù)據(jù)一致性。
主從復(fù)制數(shù)據(jù)同步原理
Redis支持主從復(fù)制,Redis的主從結(jié)構(gòu)可以采用一主多從或者級(jí)聯(lián)結(jié)構(gòu),Redis主從復(fù)制可以根據(jù)是否是全量分為全量同步和增量同步。下圖為級(jí)聯(lián)結(jié)構(gòu)。
全量同步階段
Redis全量同步一般發(fā)生在Slave初始化階段,這時(shí)Slave需要將Master上的所有數(shù)據(jù)都復(fù)制一份。具體步驟如下:
從服務(wù)器配置主服務(wù)器的連接信息(slaveof屬性);
從服務(wù)器連接上主服務(wù)器,發(fā)送SYNC命令
主服務(wù)器判斷是否為全量復(fù)制:如果是全量復(fù)制,則進(jìn)入下一步;否則可以看增量復(fù)制的子流程。
主服務(wù)器接收到SYNC命名后,開(kāi)始執(zhí)行BGSAVE命令生成RDB文件并使用緩沖區(qū)記錄此后執(zhí)行的所有寫(xiě)命令;
主服務(wù)器BGSAVE執(zhí)行完后,向所有從服務(wù)器發(fā)送快照文件,并在發(fā)送期間繼續(xù)記錄被執(zhí)行的寫(xiě)命令;
從服務(wù)器收到快照文件后丟棄所有舊數(shù)據(jù),載入收到的快照;
主服務(wù)器快照發(fā)送完畢后開(kāi)始向從服務(wù)器發(fā)送緩沖區(qū)中的寫(xiě)命令;
從服務(wù)器完成對(duì)快照的載入,開(kāi)始接收命令請(qǐng)求,并執(zhí)行來(lái)自主服務(wù)器緩沖區(qū)的寫(xiě)命令;
增量同步階段
Redis增量復(fù)制是指Slave初始化后開(kāi)始正常工作時(shí)主服務(wù)器發(fā)生的寫(xiě)操作同步到從服務(wù)器的過(guò)程。
增量復(fù)制的過(guò)程主要是主服務(wù)器每執(zhí)行一個(gè)寫(xiě)命令就會(huì)向從服務(wù)器發(fā)送相同的寫(xiě)命令,從服務(wù)器接收并執(zhí)行收到的寫(xiě)命令。
開(kāi)啟無(wú)磁盤(pán)同步
Redis在與從數(shù)據(jù)庫(kù)進(jìn)行復(fù)制初始化時(shí)將不會(huì)將快照存儲(chǔ)到磁盤(pán),而是直接通過(guò)網(wǎng)絡(luò)發(fā)送給從數(shù)據(jù)庫(kù),避免了IO性能差問(wèn)題。
啟動(dòng)無(wú)磁盤(pán)復(fù)制:
repl-diskless-sync yes
到此這篇關(guān)于Redis主從復(fù)制詳解的文章就介紹到這了,更多相關(guān)Redis主從復(fù)制內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- Redis7.2.x主從復(fù)制的實(shí)現(xiàn)示例
- Redis server 主從復(fù)制配置實(shí)現(xiàn)
- Redis主從復(fù)制與讀寫(xiě)分離的實(shí)現(xiàn)
- Docker搭建Redis主從復(fù)制的實(shí)現(xiàn)步驟
- Docker Compose搭建Redis主從復(fù)制環(huán)境的實(shí)現(xiàn)步驟
- redis主從復(fù)制的原理及實(shí)現(xiàn)
- Redis主從復(fù)制操作和配置詳情
- Redis6 主從復(fù)制及哨兵機(jī)制的實(shí)現(xiàn)
- Redis實(shí)現(xiàn)主從復(fù)制方式(Master&Slave)
- 關(guān)于Redis的主從復(fù)制及哨兵問(wèn)題
相關(guān)文章
Redis分布式鎖如何設(shè)置超時(shí)時(shí)間
這篇文章主要介紹了Redis分布式鎖如何設(shè)置超時(shí)時(shí)間,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-11-11淺談redis五大數(shù)據(jù)結(jié)構(gòu)和使用場(chǎng)景
這篇文章主要介紹了淺談redis五大數(shù)據(jù)結(jié)構(gòu)和使用場(chǎng)景,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2021-04-04Redis和MySQL保證雙寫(xiě)一致性的問(wèn)題解析
Redis和MySQL的雙寫(xiě)一致性指的是在同時(shí)使用緩存和數(shù)據(jù)庫(kù)存儲(chǔ)數(shù)據(jù)的時(shí)候,保證Redis和MySQL中數(shù)據(jù)的一致性,那么如何才能保證他們的一致性呢,下面小編就來(lái)為大家詳細(xì)講講2023-11-11阿里云官方Redis開(kāi)發(fā)規(guī)范總結(jié)
本文主要介紹了阿里云官方Redis開(kāi)發(fā)規(guī)范總結(jié),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2022-08-08基于redis實(shí)現(xiàn)世界杯排行榜功能項(xiàng)目實(shí)戰(zhàn)
前段時(shí)間,做了一個(gè)世界杯競(jìng)猜積分排行榜。對(duì)世界杯64場(chǎng)球賽勝負(fù)平進(jìn)行猜測(cè),猜對(duì)+1分,錯(cuò)誤+0分,一人一場(chǎng)只能猜一次。下面通過(guò)本文給大家分享基于redis實(shí)現(xiàn)世界杯排行榜功能項(xiàng)目實(shí)戰(zhàn),感興趣的朋友一起看看吧2018-10-10