Redis主從復制作用及搭建過程
概述
Redis 的主從復制(Master-Slave Replication)是實現(xiàn)數(shù)據(jù)備份、讀寫分離和水平擴展的核心機制之一。通過主從復制,一個主節(jié)點(Master)可以將數(shù)據(jù)同步到多個從節(jié)點(Slave),從節(jié)點還可以級聯(lián)創(chuàng)建自己的從節(jié)點,從而形成樹狀結構。
注意,Redis的主從復制是實現(xiàn)高可用的核心機制,并不能實現(xiàn)高可用
Redis主從復制作用
數(shù)據(jù)冗余:
主從復制實現(xiàn)了數(shù)據(jù)的熱備份,是持久化之外的一種數(shù)據(jù)冗余方式。
故障恢復
當主節(jié)點出現(xiàn)問題時,可以由從節(jié)點提供服務,實現(xiàn)快速的故障恢復;實際上是一種服務的冗余。
負載均衡:
在主從復制的基礎上,配合讀寫分離,可以由主節(jié)點提供寫服務,由從節(jié)點提供讀服務(即寫Redis數(shù)據(jù)時應用連接主節(jié)點,讀Redis數(shù)據(jù)時應用連接從節(jié)點),分擔服務器負載;尤其是在寫少讀多的場景下,通過多個從節(jié)點分擔讀負載,可以大大提高Redis服務器的并發(fā)量。
讀寫分離:
可以用于實現(xiàn)讀寫分離,主庫寫、從庫讀,讀寫分離不僅可以提高服務器的負載能力,同時可根據(jù)需求的變化,改變從庫的數(shù)量。
高可用基石
除了上述作用以外,主從復制還是哨兵和集群能夠實施的基礎,因此說主從復制是Redis高可用的基礎。
Redis主從復制搭建
搭建主服務器
參考這篇文章:Redis6.2.x版本安裝
搭建從服務器
參考這篇文章:Redis6.2.x版本安裝
需要注意從服務器配置文件的修改:
# 第75行,修改遠程訪問地址 75:bind 0.0.0.0 # 第98行,修改端口號 98:port 6379 # 第259行,守護進程運行,默認位前臺運行,需要修改為yes 259:daemonize yes # 第304行,指定redis的日志 304:logfile "/var/log/redis/redis.log" # 第329行,指定數(shù)據(jù)庫的數(shù)量,默認是16個 329:databases 16 # 第433行,持久化的文件 433:dbfilename dump.rdb # 第456行,設置redis的數(shù)據(jù)目錄,和我們上面創(chuàng)建的路徑保持一致 456:dir /data00/data/redis/ # 第903行,設置密碼,建議不要使用弱密碼 903:requirepass 123456 # 第479行,主庫的IP和端口 479:replicaof 127.0.0.1 6379 # 第486行,如果主服務器設置了密碼,需要配置認證 486:masterauth !Xinxin123 # 其它配置 # 從服務器是否可寫(默認只讀) replica-read-only yes # 復制緩沖區(qū)大小 repl-backlog-size 1mb # 復制超時時間(秒) repl-timeout 60 # 當主從斷開時,從服務器是否繼續(xù)提供服務 replica-serve-stale-data yes
啟動主庫之后再啟動從庫
[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))驗證主從復制是否成功
在主從分別執(zhí)行INFO REPLICATION命令
# 主庫執(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 # 從庫執(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
驗證主庫寫入數(shù)據(jù),從庫是否能獲取到
# 主庫寫入數(shù)據(jù) 127.0.0.1:6379> set rep rep OK # 從庫查詢數(shù)據(jù) 127.0.0.1:6379> get rep "rep"
驗證從庫寫數(shù)據(jù),預期應該報錯
127.0.0.1:6379> set slave 1 (error) READONLY You can't write against a read only replica.
Redis主從復制原理
主從復制過程大體可以分為3個階段:連接建立階段(即準備階段)、數(shù)據(jù)同步階段、命令傳播階段。
在從節(jié)點執(zhí)行 slaveof 命令后,復制過程便開始運作,下面圖示可以看出復制過程大致分為6個過程。

- 保存主節(jié)點信息
執(zhí)行slaveof后 Redis會打印如下日志:
![]()
- 從節(jié)點與主節(jié)點建立網(wǎng)絡連接
從節(jié)點(slave)內部通過每秒運行的定時任務維護復制相關邏輯,當定時任務發(fā)現(xiàn)存在新的主節(jié)點后,會嘗試與該節(jié)點建立網(wǎng)絡連接。

從節(jié)點會建立一個 socket 套接字,從節(jié)點建立了一個端口為51234的套接字,專門用于接受主節(jié)點發(fā)送的復制命令。從節(jié)點連接成功后打印如下日志:
![]()
如果從節(jié)點無法建立連接,定時任務會無限重試直到連接成功或者執(zhí)行 slaveofnoone 取消復制。
關于連接失敗,可以在從節(jié)點執(zhí)行 info replication 查看 master_link_down_since_seconds 指標,它會記錄與主節(jié)點連接失敗的系統(tǒng)時間。從節(jié)點連接主節(jié)點失敗時也會每秒打印如下日志,方便發(fā)現(xiàn)問題:
![]()
- 發(fā)送ping命令
連接建立成功后從節(jié)點發(fā)送 ping 請求進行首次通信, ping 請求主要目的如下:
檢測主從之間網(wǎng)絡套接字是否可用。
檢測主節(jié)點當前是否可接受處理命令。
如果發(fā)送 ping 命令后,從節(jié)點沒有收到主節(jié)點的 pong 回復或者超時,比如網(wǎng)絡超時或者主節(jié)點正在阻塞無法響應命令,從節(jié)點會斷開復制連接,下次定時任務會發(fā)起重連。


從節(jié)點發(fā)送的 ping 命令成功返回,Redis 打印如下日志,并繼續(xù)后續(xù)復制流程:
![]()
- 權限驗證
如果主節(jié)點設置了 requirepass 參數(shù),則需要密碼驗證,從節(jié)點必須配置 masterauth 參數(shù)保證與主節(jié)點相同的密碼才能通過驗證。如果驗證失敗復制將終止,從節(jié)點重新發(fā)起復制流程。
- 同步數(shù)據(jù)集
主從復制連接正常通信后,對于首次建立復制的場景,主節(jié)點會把持有的數(shù)據(jù)全部發(fā)送給從節(jié)點,這部分操作是耗時最長的步驟。
- 命令持續(xù)復制
當主節(jié)點把當前的數(shù)據(jù)同步給從節(jié)點后,便完成了復制的建立流程。接下來主節(jié)點會持續(xù)地把寫命令發(fā)送給從節(jié)點,保證主從數(shù)據(jù)一致性。
主從復制數(shù)據(jù)同步原理
Redis支持主從復制,Redis的主從結構可以采用一主多從或者級聯(lián)結構,Redis主從復制可以根據(jù)是否是全量分為全量同步和增量同步。下圖為級聯(lián)結構。

全量同步階段
Redis全量同步一般發(fā)生在Slave初始化階段,這時Slave需要將Master上的所有數(shù)據(jù)都復制一份。具體步驟如下:
從服務器配置主服務器的連接信息(slaveof屬性);
從服務器連接上主服務器,發(fā)送SYNC命令
主服務器判斷是否為全量復制:如果是全量復制,則進入下一步;否則可以看增量復制的子流程。
主服務器接收到SYNC命名后,開始執(zhí)行BGSAVE命令生成RDB文件并使用緩沖區(qū)記錄此后執(zhí)行的所有寫命令;
主服務器BGSAVE執(zhí)行完后,向所有從服務器發(fā)送快照文件,并在發(fā)送期間繼續(xù)記錄被執(zhí)行的寫命令;
從服務器收到快照文件后丟棄所有舊數(shù)據(jù),載入收到的快照;
主服務器快照發(fā)送完畢后開始向從服務器發(fā)送緩沖區(qū)中的寫命令;
從服務器完成對快照的載入,開始接收命令請求,并執(zhí)行來自主服務器緩沖區(qū)的寫命令;

增量同步階段
Redis增量復制是指Slave初始化后開始正常工作時主服務器發(fā)生的寫操作同步到從服務器的過程。
增量復制的過程主要是主服務器每執(zhí)行一個寫命令就會向從服務器發(fā)送相同的寫命令,從服務器接收并執(zhí)行收到的寫命令。
開啟無磁盤同步
Redis在與從數(shù)據(jù)庫進行復制初始化時將不會將快照存儲到磁盤,而是直接通過網(wǎng)絡發(fā)送給從數(shù)據(jù)庫,避免了IO性能差問題。
啟動無磁盤復制:
repl-diskless-sync yes
到此這篇關于Redis主從復制詳解的文章就介紹到這了,更多相關Redis主從復制內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
Redis官方ORM框架比RedisTemplate更優(yōu)雅
這篇文章主要為大家介紹了Redis官方ORM框架比RedisTemplate更優(yōu)雅的使用詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2022-07-07

