Redis主從復制
Redis 的復制(replication)功能允許用戶根據一個 Redis 服務器來創建任意多個該服務器的復制品,其中被復制的服務器為主服務器(master),而通過復制創建出來的服務器復制品則為從服務器(slave)。 只要主從服務器之間的網絡連接正常,主從服務器兩者會具有相同的數據,主服務器就會一直將發生在自己身上的數據更新同步給從服務器,從而一直保證主從服務器的數據相同。
一句話:就是主從復制,master以寫為主,slave以讀為主。當master數據變化的時候,自動將新的數據異步同步到其他slavve數據庫。
主從復制的作用
- 讀寫分離
- 容災恢復
- 數據備份
- 水平擴容支持高并發
利用docker搭建一主兩從的redis集群
docker-compose.yml的配置信息
version: '3.8'
services:master:image: docker.1ms.run/library/redis:7.0.0container_name: redis-masterports:- "6379:6379"command: redis-server --protected-mode no --requirepass root # 主節點密碼slave1:image: docker.1ms.run/library/redis:7.0.0container_name: redis-slave1ports:- "6380:6379"command: - redis-server - --protected-mode no - --replicaof redis-master 6379 - --masterauth root # 從節點連接主節點的密碼- --requirepass root # 從節點自身的密碼(可選,但建議與主節點一致)slave2:image: docker.1ms.run/library/redis:7.0.0container_name: redis-slave2ports:- "6381:6379"command: - redis-server - --protected-mode no - --replicaof redis-master 6379 - --masterauth root - --requirepass root
其中在每個從節點上需要配置master主節點的密碼,–masterauth 的參數指定。以及–replicaof指定主節點的地址
docker-compose up -d啟動后
在master主節點上執行以下命令進入主節點的redis環境
docker exec -it redis-master redis-cli -a root
在redis從節點上執行以下命令進入從節點的redis環境
docker exec -it redis-slave1 redis-cli -a root
進入redis集群后,可以執行info replication的命令查看節點的狀態信息
info replication
主節點的信息
從節點的信息
主從同步的演示,在主節點上寫入值,從節點可以讀取到相關的值
主節點寫入值:
從節點讀取值
從節點可以執行寫命令么?
從節點不可以寫
(error) READONLY You can't write against a read only replica.
第三個節點掛了,前兩個節點還是正常的,再往主機寫入多個值,第三個節點然后再啟動,數據會同步過來么?
第三個節點掛了
往第一個節點寫入多個值
查看第二個節點的數據,數據正常同步
啟動第三個節點
查看第三個節點的數據信息,數據正常同步過來
主節點shutdown后,從節點是否會上位?
讀取從機的值,數據并沒有丟,身份也沒有變
主機shutdown后,重啟后主從關系還在嗎?從機還能否順利復制?
主節點再設置值
從節點再去讀取值
某臺從機down后,master繼續,從機重啟后他能跟上大部隊么?答:能
除了從配置文件的角度設置持久有效的主從關系外,還可以通過命令salveof 主機ip以及端口號指定主機的掛載,但是臨時有效,當redis重啟中,主從關系將不復存在。
薪火相傳的架構演示
類似于爺爺->爸爸-> 兒子的主從關系
slaveof 新主庫IP 新主庫端口
第三個節點選取第二個節點作為master節點
第一個爺爺級別的主節點信息變化
第二個中間爸爸級別的節點信息變化
中間的爸爸節點,僅僅是數據的同步方向的指定,仍然不可以執行寫入操作的
上一個slave可以是下一個slave的master,slave同樣可以接收其他slaves的連接和同步請求,那么該slave作為了鏈條中下一個的master,可以有效減輕主master的寫壓力。
中途變更轉向:會清除之前的數據,重新建立拷貝最新的。
反客為主
使用命令: slaveof no one
寫入數據
主從復制原理和工作流程
- salve啟動,同步初請(slave啟動成功連接到master會發送一個sync命令,slave首次全新連接master,一次完全同步(全量復制)將被自動執行,slave自身原有數據會被master數據覆蓋清除)
- 首次連接,全量復制(master節點收到sync命令后會開始在后臺保存快照(即RDB持久化,主從復制時會觸發RDB),同時收集所有接收到的用于修改數據集命令緩存起來,master節點執行RDB持久化完成后,master將RDB快照文件和所有緩存的命令發送到所有slave,以完成一次完全同步。而slave服務在接收到數據庫文件后,將其存盤并加載到內存中,從而完成復制初始化)
- 心跳持續,保持通信(master發出PING包的周期,默認10s。repl-ping-replica-period 10)
- 進入平穩,增量復制(master繼續將新的所有收集到的修改命令自動依次傳遞給slave,完成同步)
- 從機下線,重連續傳(master會檢查backlog里面的offset,master和slave都會保存一個復制的offset還有一個masterId,offset是保存在backlog中的,Master只會把已復制的offset后面的數據復制給slave,類似斷點續傳)
主從復制的缺點
-
復制延時,信號衰減
-
master掛了,如何辦?(默認情況下,不會在slave節點中自動重選一個master,那每次人工選舉?? 無人值守安裝成為剛需 哨兵模式 )
參考視頻
Redis 集群架構