Redis全方位講解--主從複製和哨兵模式

来源:https://www.cnblogs.com/johnson108178/archive/2018/11/02/9888482.html
-Advertisement-
Play Games

前言 前面介紹了redis持久化和容災備份,這篇會介紹redis主從複製和redis持久化在主從複製中的一些應用。因為本人沒有那麼多伺服器或機器,所以這裡主要介紹下如何在docker容器中搭建主從複製以及搭建過程中遇到的一些問題。關於redis的深入講解,這邊博客《深入學習Redis(3):主從複製 ...


前言

  前面介紹了redis持久化和容災備份,這篇會介紹redis主從複製和redis持久化在主從複製中的一些應用。因為本人沒有那麼多伺服器或機器,所以這裡主要介紹下如何在docker容器中搭建主從複製以及搭建過程中遇到的一些問題。關於redis的深入講解,這邊博客《深入學習Redis(3):主從複製》介紹的非常詳細,有興趣的可以學習一下。

 

主從複製運行的機制

  • 當一個 master 實例和一個 slave 實例連接正常時, master 會發送一連串的命令流來保持對 slave 的更新,以便於將自身數據集的改變複製給 slave :包括客戶端的寫入、key 的過期或被逐出等等。
  • 當 master 和 slave 之間的連接斷開之後,因為網路問題、或者是主從意識到連接超時, slave 重新連接上 master 並會嘗試進行部分重同步:這意味著它會嘗試只獲取在斷開連接期間內丟失的命令流。
  • 當無法進行部分重同步時, slave 會請求進行全量重同步。這會涉及到一個更複雜的過程,例如 master 需要創建所有數據的快照,將之發送給 slave ,之後在數據集更改時持續發送命令流到 slave 。

關於全量重同步和部分重同步,在文章開頭介紹的那篇博客中都有詳細的介紹。在搭建之前,讓我們先瞭解關於redis的幾個重要的事實。

  • Redis 使用非同步複製,slave 和 master 之間非同步地確認處理的數據量。也正是因為非同步複製,所以有可能會造成數據延遲或不同步。
  • 一個 master 可以擁有多個 slave,slave也可以有sub-slave,但從 Redis 4.0 起,所有的 sub-slave 將會從 master 收到完全一樣的複製流。
  • Redis 複製在 master 側是非阻塞的。這意味著 master 在一個或多個 slave 進行初次同步或者是部分重同步時,可以繼續處理查詢請求。
  • 複製在 slave 側大部分也是非阻塞的。當 slave 進行初次同步時,它可以使用舊數據集處理查詢請求,假設你在 redis.conf 中配置了讓 Redis 這樣做的話。否則,你可以配置如果複製流斷開, Redis slave 會返回一個 error 給客戶端。但是,在初次同步之後,舊數據集必須被刪除,同時載入新的數據集。 slave 在這個短暫的時間視窗內(如果數據集很大,會持續較長時間),會阻塞到來的連接請求。自 Redis 4.0 開始,可以配置 Redis 使刪除舊數據集的操作在另一個不同的線程中進行,但是,載入新數據集的操作依然需要在主線程中進行並且會阻塞 slave 。
  • 複製既可以被用在可伸縮性,以便只讀查詢可以有多個 slave 進行(例如 O(N) 複雜度的慢操作可以被下放到 slave ),或者僅用於數據安全。
  • 可以使用複製來避免 master 將全部數據集寫入磁碟造成的開銷:一種典型的技術是配置你的 master Redis.conf 以避免對磁碟進行持久化,然後連接一個 slave ,其配置為不定期保存或是啟用 AOF。但是,這個設置必須小心處理,因為重新啟動的 master 程式將從一個空數據集開始:如果一個 slave 試圖與它同步,那麼這個 slave 也會被清空。

關於最後一點,一般主從複製一般會採用讀寫分離,master都用來接受所有的寫操作,這樣為了減少master的壓力,就不會開啟數據持久化,而是在slave中開啟數據持久化。

 

redis主從複製在docker中搭建

redis.conf文件配置

  這裡需要註意的一點是,最好所有的主從redis要麼沒有設置密碼,要麼設置的密碼都一樣。

  兩個slave需要配置的是

################################# REPLICATION #################################

# Master-Slave replication. Use slaveof to make a Redis instance a copy of
# another Redis server. A few things to understand ASAP about Redis replication.
#
# 1) Redis replication is asynchronous, but you can configure a master to
#    stop accepting writes if it appears to be not connected with at least
#    a given number of slaves.
# 2) Redis slaves are able to perform a partial resynchronization with the
#    master if the replication link is lost for a relatively small amount of
#    time. You may want to configure the replication backlog size (see the next
#    sections of this file) with a sensible value depending on your needs.
# 3) Replication is automatic and does not need user intervention. After a
#    network partition slaves automatically try to reconnect to masters
#    and resynchronize with them.
#
slaveof redis 6379   # redis是master的容器名

# If the master is password protected (using the "requirepass" configuration
# directive below) it is possible to tell the slave to authenticate before
# starting the replication synchronization process, otherwise the master will
# refuse the slave request.
#
masterauth 123455

slave-read-only yes  # slave只讀

三個配置文件配置好後,就可以配置docker-composer.yml文件了

version: "3.7"

networks:
  backend:
    driver: bridge

services:

### Redis ################################################
  # master
  redis:
    image: johnson19900110/redis:latest
    restart: always
    volumes:
      - ${DATA_PATH_HOST}/redis/master:/data
      - ./redis/config/redis-master.conf:/usr/local/etc/redis/redis.conf
    ports:
      - 6379:6379
    networks:
      - backend

  # slave 1
  redis-slave1:
    image: johnson19900110/redis:latest
    restart: always
    volumes:
      - ${DATA_PATH_HOST}/redis/slave1:/data
      - ./redis/config/redis-slave1.conf:/usr/local/etc/redis/redis.conf
    ports:
      - 6380:6379
    networks:
      - backend
    depends_on:
      - redis

  # slave 2
  redis-slave2:
    image: johnson19900110/redis:latest
    restart: always
    volumes:
      - ${DATA_PATH_HOST}/redis/slave2:/data
      - ./redis/config/redis-slave2.conf:/usr/local/etc/redis/redis.conf
    ports:
      - 6381:6379
    networks:
      - backend
    depends_on:
      - redis
      - redis-slave1

然後就可以啟動redis容器了

docker-composer up -d redis-slave2

  這時候3個redis就已經啟動起來了

這是我們進入master容器。在redis-cli命令下執行 info replication ,就可以看到如下信息。 

從上面信息可以看到,這個是master角色,有兩個從slave,並且可以看到slave的狀態和同步的offset。然後再進入slave容器,可以看到。 

可以看到它的角色是slave和一些master的信息。因為我們設置了slave是只讀模式。所以當我們想在slave下進行寫入操作時會報錯。

 

所以只能去master里進行寫操作。

這時我們可以去slave看下slave是否複製成功。

這就表明我們這次redis的主從複製在docker中搭建成功了。

notice:這裡還要重申一遍的是,1、如果你的redis設置了密碼,那麼所有的都設置成一樣。2、如果你的rendis設置了密碼,那麼master配置文件中的masterauth 這一項一定要配置。不然在後面搭建redis哨兵模式的時候,肯定會有一些你意想不到我的問題。

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • ex2fsck 檢查ext2、ext3、ext4文件系統,如果系統已經掛載了,那麼不建議去檢查,因為這樣是不安全的。此命令的適用範圍:RedHat、RHEL、Ubuntu、CentOS、SUSE、openSUSE、Fedora。 1、語法 e2fsck [-pacnyrdfkvtDFV] [-b s ...
  • 查看方式 1、先切換到:cd usr/local/tomcat5/logs2、tail -f catalina.out3、Ctrl+c 是退出tail命令/alt+E+R重置 Linux系統中tail命令 實例1:顯示文件末尾內容 tail -n 5 log2014.log 顯示文件最後5行內容 實 ...
  • 1 非搶占式和可搶占式內核 為了簡化問題,我使用嵌入式實時系統uC/OS作為例子 首先要指出的是,uC/OS只有內核態,沒有用戶態,這和Linux不一樣 多任務系統中, 內核負責管理各個任務, 或者說為每個任務分配CPU時間, 並且負責任務之間的通訊. 內核提供的基本服務是任務切換. 調度(Sche ...
  • 一、man命令介紹 man,為單詞manual的縮寫,是linux下的幫助指令。 二、實例 以man命令為例,輸入 man man 獲取man命令的幫助文檔 可以看出,使用man命令查詢到的幫助信息很多,所以我們需要瞭解幫助文檔信息的目錄結構和操作方法。 三、目錄結構 名稱 意義 NAME 命令名稱 ...
  • 文章的格式也許不是很好看,也沒有什麼合理的順序 完全是想到什麼寫一些什麼,但各個方面都涵蓋到了 能耐下心看的朋友歡迎一起學習,大牛和杠精們請繞道 Exploit模塊分為主動和被動(Active、Passive) 主動:主動地向目標機器發送payload並執行,使目標交出shell(反連等) 被動:利 ...
  • 伺服器 swap 交換分區製作 作用:‘提升‘ 記憶體的容量,防止OOM(Out Of Memory) 查看當前的交換分區 增加交換分區 可是是分區,LVM,File file創建: 1、新建一個專門的文件用於swap分區 註:此文件的大小是count的大小乘以bs大小,上面命令的大小是4GB 2、通 ...
  • linux的touch命令一般用來修改文件時間戳,或者新建一個不存在的文件。 一.命令格式: touch [參數]... 文件... 二.命令參數: |參數|描述| | | | | a | 或 time=atime或 time=access或 time=use 只更改存取時間。| | c | 或 n ...
  • 設計目的: 減少各種狀態值欄位; 減少資料庫冗餘和存儲空間; 增加狀態值時可靈活調整,無需增加額外欄位 ...
一周排行
    -Advertisement-
    Play Games
  • 前言 本文介紹一款使用 C# 與 WPF 開發的音頻播放器,其界面簡潔大方,操作體驗流暢。該播放器支持多種音頻格式(如 MP4、WMA、OGG、FLAC 等),並具備標記、實時歌詞顯示等功能。 另外,還支持換膚及多語言(中英文)切換。核心音頻處理採用 FFmpeg 組件,獲得了廣泛認可,目前 Git ...
  • OAuth2.0授權驗證-gitee授權碼模式 本文主要介紹如何筆者自己是如何使用gitee提供的OAuth2.0協議完成授權驗證並登錄到自己的系統,完整模式如圖 1、創建應用 打開gitee個人中心->第三方應用->創建應用 創建應用後在我的應用界面,查看已創建應用的Client ID和Clien ...
  • 解決了這個問題:《winForm下,fastReport.net 從.net framework 升級到.net5遇到的錯誤“Operation is not supported on this platform.”》 本文內容轉載自:https://www.fcnsoft.com/Home/Sho ...
  • 國內文章 WPF 從裸 Win 32 的 WM_Pointer 消息獲取觸摸點繪製筆跡 https://www.cnblogs.com/lindexi/p/18390983 本文將告訴大家如何在 WPF 裡面,接收裸 Win 32 的 WM_Pointer 消息,從消息裡面獲取觸摸點信息,使用觸摸點 ...
  • 前言 給大家推薦一個專為新零售快消行業打造了一套高效的進銷存管理系統。 系統不僅具備強大的庫存管理功能,還集成了高性能的輕量級 POS 解決方案,確保頁面載入速度極快,提供良好的用戶體驗。 項目介紹 Dorisoy.POS 是一款基於 .NET 7 和 Angular 4 開發的新零售快消進銷存管理 ...
  • ABP CLI常用的代碼分享 一、確保環境配置正確 安裝.NET CLI: ABP CLI是基於.NET Core或.NET 5/6/7等更高版本構建的,因此首先需要在你的開發環境中安裝.NET CLI。這可以通過訪問Microsoft官網下載並安裝相應版本的.NET SDK來實現。 安裝ABP ...
  • 問題 問題是這樣的:第三方的webapi,需要先調用登陸介面獲取Cookie,訪問其它介面時攜帶Cookie信息。 但使用HttpClient類調用登陸介面,返回的Headers中沒有找到Cookie信息。 分析 首先,使用Postman測試該登陸介面,正常返回Cookie信息,說明是HttpCli ...
  • 國內文章 關於.NET在中國為什麼工資低的分析 https://www.cnblogs.com/thinkingmore/p/18406244 .NET在中國開發者的薪資偏低,主要因市場需求、技術棧選擇和企業文化等因素所致。歷史上,.NET曾因微軟的閉源策略發展受限,儘管後來推出了跨平臺的.NET ...
  • 在WPF開發應用中,動畫不僅可以引起用戶的註意與興趣,而且還使軟體更加便於使用。前面幾篇文章講解了畫筆(Brush),形狀(Shape),幾何圖形(Geometry),變換(Transform)等相關內容,今天繼續講解動畫相關內容和知識點,僅供學習分享使用,如有不足之處,還請指正。 ...
  • 什麼是委托? 委托可以說是把一個方法代入另一個方法執行,相當於指向函數的指針;事件就相當於保存委托的數組; 1.實例化委托的方式: 方式1:通過new創建實例: public delegate void ShowDelegate(); 或者 public delegate string ShowDe ...