激情久久久_欧美视频区_成人av免费_不卡视频一二三区_欧美精品在欧美一区二区少妇_欧美一区二区三区的

服務器之家:專注于服務器技術及軟件下載分享
分類導航

Mysql|Sql Server|Oracle|Redis|MongoDB|PostgreSQL|Sqlite|DB2|mariadb|Access|數據庫技術|

服務器之家 - 數據庫 - Redis - 詳解Redis復制原理

詳解Redis復制原理

2021-08-09 17:44李留廣 Redis

與大多數db一樣,Redis也提供了復制機制,以滿足故障恢復和負載均衡等需求。復制也是Redis高可用的基礎,哨兵和集群都是建立在復制基礎上實現高可用的。復制不僅提高了整個系統的容錯能力,還可以水平擴展,通過增加多個R

前言

本文主要介紹redis復制機制

詳解Redis復制原理

一.配置與實踐

配置

redis實例分為主節點(master)和從節點(slave),默認情況下都是主節點。每一個從節點只能有一個主節點,但是每一個主節點可以有多個從節點(注意數量,多個從節點會導致主節點寫命令多次發送從而過度消耗網絡帶寬,可用樹狀結構降低主節點負載)。復制是單向的,只能從主節點復制到從節點。配置復制的方式由以下3種:

  • 在redis-slave.conf配置文件中加入slaveof {masterhost} {masterport}
  • 在redis-server啟動命令后加入 --slaveof {masterhost} {masterport}
  • 啟動后直接使用命令slaveof {masterhost} {masterport}

綜上,redis支持在啟動之前配置,也支持運行中動態配置。

實踐

我們用動態配置的方法來配置,先起一個端口為6379的redis實例,作為主節點:

redis-server /usr/local/cellar/redis/4.0.9/.bottle/etc/redis.conf

再起一個端口為6380的redis實例,作為6379的從節點:

redis-server /usr/local/cellar/redis/4.0.9/.bottle/etc/redis-slave.conf

用客戶端連到從節點,使用slaveof命令,slaveof配置都是在從節點發起的。

127.0.0.1:6380> slaveof 127.0.0.1 6379

ok

從節點日志:

75585:s 06 may 16:27:50.389 * connecting to master 127.0.0.1:6379

75585:s 06 may 16:27:50.389 * master <-> slave sync started

75585:s 06 may 16:27:50.390 * non blocking connect for sync fired the event.

75585:s 06 may 16:27:50.390 * master replied to ping, replication can continue...

75585:s 06 may 16:27:50.390 * trying a partial resynchronization (request 47770067272eb8101489fe7c00c8e838125c3aa3:1).

75585:s 06 may 16:27:50.392 * full resync from master: e91e683b1e13332f97ecb9fa90ecdace460ab4ca:0

75585:s 06 may 16:27:50.392 * discarding previously cached master state.

75585:s 06 may 16:27:50.491 * master <-> slave sync: receiving 215 bytes from master

75585:s 06 may 16:27:50.492 * master <-> slave sync: flushing old data

75585:s 06 may 16:27:50.492 * master <-> slave sync: loading db in memory

75585:s 06 may 16:27:50.492 * master <-> slave sync: finished with success

主節點日志:

75553:m 06 may 16:27:50.391 * slave 127.0.0.1:6380 asks for synchronization

75553:m 06 may 16:27:50.391 * partial resynchronization not accepted: replication id mismatch (slave asked for '47770067272eb8101489fe7c00c8e838125c3aa3', my replication ids are '160af1c75f86edc50186e3e4a4dc6ecb5e3fa586' and '0000000000000000000000000000000000000000')

75553:m 06 may 16:27:50.391 * starting bgsave for sync with target: disk

75553:m 06 may 16:27:50.391 * background saving started by pid 75675

75675:c 06 may 16:27:50.395 * db saved on disk

75553:m 06 may 16:27:50.490 * background saving terminated with success

75553:m 06 may 16:27:50.491 * synchronization with slave 127.0.0.1:6380 succeeded

可以看到,第一次建立復制關系的時候,主節點和從節點進行了一次全量復制,見圖:

詳解Redis復制原理

當完成復制的建立之后,接下來主節點會持續的把寫命令發送給從節點,保證主從數據一致。

在主實例上添加新的key:

127.0.0.1:6379> set lin 112131

ok

在從實例查看剛剛添加的key:

127.0.0.1:6380> get lin

"112131"

只讀

由于復制只能從主節點到從節點,對于從節點的數據修改主節點無法感知,為了避免主從實例之間的數據不一致。從節點默認配置為只讀模式:

slave-read-only yes

二.工作原理

我們先講3個比較關鍵的參數:master_replid、master_repl_offset和slave_repl_offset。我們分別在master6379和slave6380上執行info replication

127.0.0.1:6379> info replication

# replication

role:master

connected_slaves:1

slave0:ip=127.0.0.1,port=6380,state=online,offset=1093,lag=1

master_replid:e91e683b1e13332f97ecb9fa90ecdace460ab4ca

master_replid2:0000000000000000000000000000000000000000

master_repl_offset:1093

second_repl_offset:-1

repl_backlog_active:1

repl_backlog_size:1048576

repl_backlog_first_byte_offset:1

repl_backlog_histlen:1093

 

 

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:9

master_sync_in_progress:0

slave_repl_offset:1107

slave_priority:100

slave_read_only:1

connected_slaves:0

master_replid:e91e683b1e13332f97ecb9fa90ecdace460ab4ca

master_replid2:0000000000000000000000000000000000000000

master_repl_offset:1107

second_repl_offset:-1

repl_backlog_active:1

repl_backlog_size:1048576

repl_backlog_first_byte_offset:1

repl_backlog_histlen:1107

master_replid是master啟動時生成的隨機字符串,用來標識主實例

master_repl_offset是復制流中的一個偏移量,master處理完寫入命令后,會把命令的字節長度做累加記錄,統計在該字段。該字段也是實現部分復制的關鍵字段。

slave_repl_offset同樣也是一個偏移量,從節點收到主節點發送的命令后,累加自身的偏移量,通過比較主從節點的復制偏移量可以判斷主從節點數據是否一致。

當從實例連接到主實例時,從實例會發送master_replid和master_repl_offset(標識與主實例同步的最后一個快照)請求部分復制。如果主實例接收部分復制的話則從最后一個偏移量開始增量進行部分復制,否則將進行全量復制。如圖:

詳解Redis復制原理

三.數據同步

redis在2.8之前使用sync命令完成主從數據同步,redis在2.8及以上使用psync命令完成主從數據同步,同步過程分為:全量復制和部分復制

全量復制

全量復制是redis最早支持的復制方式,也是主從第一次建立復制的時候必須經歷的。它會把主節點全部數據一次性發送給從節點,當數據量較大的時候,會對主從節點和網絡造成很大開銷。主節點執行bgsave保存rdb文件,然后將這個文件發送給從節點,從節點收到rdb文件后,會先將內存中的所有數據清除,然后再將rdb文件中的數據導入。

主實例在復制過程中是完全異步的,因此不會阻塞主節點的請求。在這一期間內主節點的所有寫入命令數據都保存在從客戶端緩沖區(slave client buffer)內,在從節點加載完rdb文件后,主節點會將這個緩沖區的內容發送給從節點。

從客戶端緩沖區默認大小限制為:

client-output-buffer-limit slave 256mb 64mb 60

意思是如果60秒內緩沖區消耗持續大于64mb或者直接超過256mb時,主節點將直接關閉復制客戶端連接,造成全量同步失敗。

部分復制

在高版本的redis實現中,master_replid和offset存儲在rdb文件中。當從實例在復制過程中,因網絡閃斷等原因造成的數據丟失場景,redis能夠從rdb文件中重新加載master_replid和offset,從而使部分重新同步成為可能。因為補發的數據遠小于全量數據,所以可以有效的避免全量復制帶來的負載和消耗。

之前說過,從節點連接主節點之后,會使用master_replid和master_repl_offset請求主節點,首先判斷master_replid是否和自己的master_replid一致,然后檢查請求中的master_repl_offset是否能從緩沖區(replication backlog)中獲取,如果偏移量在backlog范圍內,那么可以進行部分復制。如果在斷開連接期間主節點收到的寫入命令的數量超過了backlog緩沖區的容量,那么會進行全量復制。默認情況下backlog為1mb。

以上就是詳解redis復制原理的詳細內容,更多關于redis復制原理的資料請關注服務器之家其它相關文章!

原文鏈接:https://www.cnblogs.com/liliuguang/p/10823429.html

延伸 · 閱讀

精彩推薦
  • RedisRedis的配置、啟動、操作和關閉方法

    Redis的配置、啟動、操作和關閉方法

    今天小編就為大家分享一篇Redis的配置、啟動、操作和關閉方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧 ...

    大道化簡5312019-11-14
  • Redisredis實現排行榜功能

    redis實現排行榜功能

    排行榜在很多地方都能使用到,redis的zset可以很方便地用來實現排行榜功能,本文就來簡單的介紹一下如何使用,具有一定的參考價值,感興趣的小伙伴們...

    乘月歸5022021-08-05
  • RedisRedis 事務知識點相關總結

    Redis 事務知識點相關總結

    這篇文章主要介紹了Redis 事務相關總結,幫助大家更好的理解和學習使用Redis,感興趣的朋友可以了解下...

    AsiaYe8232021-07-28
  • Redis詳解Redis復制原理

    詳解Redis復制原理

    與大多數db一樣,Redis也提供了復制機制,以滿足故障恢復和負載均衡等需求。復制也是Redis高可用的基礎,哨兵和集群都是建立在復制基礎上實現高可用的...

    李留廣10222021-08-09
  • Redisredis中如何使用lua腳本讓你的靈活性提高5個逼格詳解

    redis中如何使用lua腳本讓你的靈活性提高5個逼格詳解

    這篇文章主要給大家介紹了關于redis中如何使用lua腳本讓你的靈活性提高5個逼格的相關資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具...

    一線碼農5812019-11-18
  • Redisredis 交集、并集、差集的具體使用

    redis 交集、并集、差集的具體使用

    這篇文章主要介紹了redis 交集、并集、差集的具體使用,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友...

    xiaojin21cen10152021-07-27
  • RedisRedis全量復制與部分復制示例詳解

    Redis全量復制與部分復制示例詳解

    這篇文章主要給大家介紹了關于Redis全量復制與部分復制的相關資料,文中通過示例代碼介紹的非常詳細,對大家學習或者使用Redis爬蟲具有一定的參考學習...

    豆子先生5052019-11-27
  • RedisRedis如何實現數據庫讀寫分離詳解

    Redis如何實現數據庫讀寫分離詳解

    Redis的主從架構,能幫助我們實現讀多,寫少的情況,下面這篇文章主要給大家介紹了關于Redis如何實現數據庫讀寫分離的相關資料,文中通過示例代碼介紹...

    羅兵漂流記6092019-11-11
主站蜘蛛池模板: 91在线播放国产 | 中文字幕精品久久 | 人人玩人人爽 | 91短视频网址| 午夜视频久久久 | 黄色久 | 在线a亚洲视频播放在线观看 | 黄色成人短视频 | 成人国产精品久久久 | 久久网页 | 97zyz成人免费视频 | 高潮激情aaaaa免费看 | 色诱亚洲精品久久久久久 | arabxxxxvideos| 九九看片| 97风流梦电影 | 99re色| 久久亚洲一区二区三区成人国产 | 蜜桃视频网站在线观看 | 国产妇女乱码一区二区三区 | 二区三区在线观看 | 国产九九| 91精品免费在线 | 九一免费国产 | 免费在线观看成人av | 国产乱色精品成人免费视频 | 欧美精品免费一区二区三区 | 羞羞网站在线看 | 日本在线视 | 精品一区二区免费视频视频 | 亚洲一区在线视频 | 污污短视频 | 羞羞视频免费网站含羞草 | 福利国产在线 | 手机av在线电影 | fc2成人免费人成在线观看播放 | 深夜免费视频 | 国产99久久久久久免费看农村 | 国产精品剧情一区二区三区 | 蜜桃91丨九色丨蝌蚪91桃色 | 亚洲一区二区三区视频免费 |