【Redis系列】深入浅出Redis主从复制之读写分离【一篇搞懂Redis复制】
由于人權問題,slave更改為了replica
Redis默認采用異步復制的持久化方案(RDB),具備低延遲、高性能的特點。這是大多數Redis的自然復制模式。
主從復制(master-replica)-讀寫分離這是基于RDB持久化方案的全量數據復制模式。
1.主從復制-讀寫分離介紹
為了解決高并發場景下Redis的性能問題,需要對單例Redis進行橫向擴展;我們都知道在緩存中讀的并發量要遠遠大于寫的并發量。所以就產生了一種讀寫分離的方法:
將讀和寫分開,master節點可以進行讀寫操作,而slave節點只能進行讀操作(conf文件可以修改),因此讀寫分離是一種基于RDB持久化方案的主從架構。
2.讀寫分離核心流程
首先需要從slave節點初始化進行分析,因為slave節點只能進行讀操作,所以它如何擁有初始數據是第一步。
- 當salve節點初始化時會首先ping向master節點,如果ping通,salve就會把master上的rdb文件復制到slave節點,然后加載到內存中。
- 后續當master節點有寫操作時,master會將相同操作命令傳輸給salve節點,然后salve進行執行即可。
3.三種工作機制
- 當master和slave鏈接良好時,master向slave發送命令流來完成salve更新;
- 當master和salve鏈接中斷時,由于網絡原因或master和salve檢測超;salve將嘗試重新連接并嘗試進行部分重新同步,這意味著同步的是斷開連接那段時間的命令流
- 當無法進行部分重新同步時,salve將進行全部重新同步。這涉及了一個更復雜的過程,需要master創建所有的快照并發給salve。
4.主副本之間如何進行協商的?
試想master每向Redis副本發送一次命令流,是否需要等待副本處理完成?(因為副本可能由于某種原因沒有處理完這個命令流)
答:這是不需要的,副本會定期確認與master接收的數據量。所以master知道副本已經處理了哪個命令,這具有可選的同步復制。
5.Redis復制的特點
Ⅰ.Redis復制在主控端是非阻塞的(異步復制),意味著當一個或多個副本進行同步數據時,master仍然可以進行數據查詢。
Ⅱ.Redis復制在副本也是非阻塞的(異步復制),在副本執行同步時,仍然可以被查詢。但當副本進行初始化時,需要刪除本身的舊數據集加載新數據集,這短暫的期間是不能被客戶端連接的。在Redis4.0以后,允許在conf進行配置刪除舊數據集發生在不同的線程中,但是加載新數據集仍發生在主線程中,所以這個時間段仍是阻塞的。
Ⅲ.一個master可以連接多個副本,一個副本也可以連接多個副本,類似于級聯結構。
Ⅳ.避免了master將整個數據寫入磁盤的成本。
6.Redis復制的工作原理
每個Redis實例都有Replication ID,每個主機也存在一個偏移量,該偏移量隨著主機向副本發送命令流的字節而增加。
當副本要連接主機時,會通過PSYNC命令發送它的舊主機Replication ID和Offset。這樣主機只需要向副本發送增量部分。
發送Offset(偏移量)我們應該都明白它是為了定位緩沖區發送的起始位置,向副本發送它缺少的那部分數據。那Replication ID有什么用呢?
其實這是為了讓主機將自身的Replication ID與副本發送的Replication ID做對比,判斷是否相同,如果相同則可以進行增量復制。如果不相同,所以主機已經被更換,需要進行全量復制。
完全同步的工作流程:
主機生成RDB文件,在這個同時緩沖從客戶端接收到的新的寫命令;主機向副本發送RDB文件,副本將其保存在磁盤并加載到內存中;最后主機將所有緩沖的命令發送給副本。
總結:
Redis在進行全量同步時,master會將內存數據通過bgsave落地rdb文件;同時將接收到的客戶端寫指令存放到復制緩沖區中。當rdb快照構建完畢之后,master會將rdb和復制緩沖隊列中的數據全部發送給replica(副本),可以看出全量同步對系統的性能和資源訪問造成影響。
在Redis2.8之前,Redis只支持全量復制;2.8之后引入了PSYNC,增加了一個復制積壓緩沖,master在將寫指令發送給replica之后,也會在復制積壓緩沖存放一份。當由于網絡波動導致master與replica連接斷開并重新連接時,replica會向master發送replid(復制id)和偏移量,如果master的replid和副本發送的replid相同并且偏移量仍在復制積壓緩沖,則master使用增量復制。
Redis4.0之后,引入了PSYNC2,這是對PSYNC的優化,額外加入了一個replid2。每個Redis實例啟動之后都會被分配一個長度為40的隨機字符串最為replid的初始值,當replica連接master之后,會將master的replid替換自己的replid;replid2會存儲上次主機的replid,這樣一來如果master發送變動,則master的replid與replica的replid或者replid2相同,仍然可以使用增量復制。
7. 主從復制-讀寫分離實戰
模擬三臺Redis服務器,一臺6379為主機,另外的6380和6381為副本。
1.首先在Linux服務器下載安裝Redis服務
下載安裝包:wget https://download.redis.io/releases/redis-6.2.6.tar.gz
解壓:tar -zxvf redis-6.2.6.tar.gz
編譯:make
安裝:make PREFIX=/path install (path為安裝路徑)
安裝之后會發現只有一個bin目錄。
2.建立相應的文件保存數據、日志、配置文件
mkdir -p /opt/redis/data
mkdir -p /opt/redis/conf
mkdir -p /opt/redis/
touch redis-6379.conf
touch redis-6380.conf
touch redis-6381.conf
3.將redis解壓目錄下的redis.conf文件復制一份到/opt/redis/conf
復制:cp redis.conf /opt/redis/conf
重命名:mv redis.conf redis-common.conf
4.修改redis-common.conf配置文件
點擊ESC->輸入:/搜索詞 ,即可進行搜索,鍵盤點擊n表示尋找下一個
(1)修改protected-mode的值為no
(2)修改daemonize的值為yes:表示后臺啟動redis
(3)注釋掉bind(注釋掉表示所有的都可以訪問)
(4)注釋掉port
(5)注釋掉logfile
(6)注釋掉dbfilename
(7)修改目錄
(8)打開masterauth(從服務器訪問主服務器所需要的密碼)
(9)注釋掉pidfile
5.編輯redis-6379.conf、redis-6380.conf、redis-6381.conf
最后一個slaveof表示主機地址,這里的6379為主機,所以不需要配置。
6.啟動
./redis-server /opt/redis/conf/redis-6379.conf
./redis-server /opt/redis/conf/redis-6380.conf
./redis-server /opt/redis/conf/redis-6381.conf
使用ps -ef|grep redis進行查看進程
7.測試
復制三個窗口,連接三個客戶端,輸入info replication查看信息。
與50位技術專家面對面20年技術見證,附贈技術全景圖總結
以上是生活随笔為你收集整理的【Redis系列】深入浅出Redis主从复制之读写分离【一篇搞懂Redis复制】的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 有关使用junit依赖出现@Before
- 下一篇: 【Redis系列】深入浅出Redis主从