1. 拓撲結構
本文搭建如下圖所示的redis拓撲結構,拓撲中共有3個哨兵,1和mater結點和2個slave結點。
拓撲信息:
角色 | ip | port |
---|---|---|
redis-master | redis-master或者master或者master-sentinel或者master-sentinel2或者master-sentinel3或自動分配的ip | 6379 |
redis-slave1 | 容器啟動時自動分配的ip | 6380 |
redis-slave2 | 容器啟動時自動分配的ip | 6381 |
redis-master-sentinel | 容器啟動時自動分配的ip | 26379 |
redis-master-sentinel2 | 容器啟動時自動分配的ip | 26380 |
redis-master-sentinel3 | 容器啟動時自動分配的ip | 26381 |
注:master或者master-sentinel或者master-sentinel2或者master-sentinel3都是主節點容器的別名。與之相關聯的容器可以通過別稱來代替ip訪問容器。
2. 搭建主從復制結構
2.1 master節點配置
2.1.1 master節點配置文件
2.1.2 master節點配置文件詳解
-
port
: 端口號 -
daemonize
:redis采用的是單進程多線程的模式。當redis.conf中選項daemonize設置成yes時,代表開啟守護進程模式。在該模式下,redis會在后臺運行,并將進程pid號寫入至redis.conf選項pidfile設置的文件中,此時redis將一直運行,除非手動kill該進程。 -
logfile
: 日志文件的名字,在工作目錄下自動創建,會記錄redis的運行日志。 -
dbfilename
: dump文件的名字,在工作目錄下自動創建。 -
dir
: 工作目錄的路徑。
其他配置請參考redis中文官網:www.redis.cn
2.1.3 在docker中運行redis master節點服務
命令說明:
-
--name
: 命名容器為redis-master
,一定不要忽略容器命名,為后面--link
命令命名更容易記住名字。 -
-v
:將本地的配置文件~/redis/redis-6379.conf
掛載到容器中的/redis/redis-6379.conf
容器啟動后,進入容器掛載的目錄,執行redis-server redis-6379.conf
命令,使用redis-6379.conf
配置啟動redis服務。具體操作如下圖所示:
執行上述命令之后,如果沒有消息,那么就是最好的消息,說明redis-server已經成功啟動了??梢酝ㄟ^
redis-6379.conf
中配置的日志文件來查看啟動情況。具體操作如下圖所示:日志說明:
- 第一行:redis正在啟動
- 第二行:redis版本信息,64位,進程號等
- 第三行:加載配置
- 第四行:redis的運行模式為standalone,端口為6379
- 第五行:警告,這句話的翻譯大概就是:對一個高負載的環境來說tcp設置128這個值,太小了。具體解決方案參考:https://www.cnblogs.com/faunjoe88/p/7158484.html
- 第六行:說明redis server已經成功初始化
- 第七行: 警告,THP的系統配置問題,具體參考:https://jingyan.baidu.com/article/da1091fb196ea7027849d6b0.html
上述警告對于demo來說可以忽略,但是對于生產環境,需要重新對系統進行相關配置之后,再重新啟動容器。
至此,master節點已經成功啟動了。
2.2 slave節點配置
2.2.1 slave節點配置文件
兩個slave節點的配置一模一樣,除了端口號之外。slave1的端口為6380,slave2的端口號為6381。
2.2.2 slave節點配置文件詳解
- 前5項配置和master節點類似,請參考master節點配置說明。
- 這里重點說一下
slaveof
命令,此命令用來給當前redis server節點指定一個master節點,自身作為master節點的slave節點。
slaveof
命令的格式為slaveof <ip> <port>
,很明顯,當前節點通過ip和port來定位將哪一個節點作為master節點,但是對于配置slaveof redis-master 6379
來說,redis-master
參數并不是一個ip。這里是因為在docker環境下,容器啟動是ip是不定的,所以容器的通信可以通過--link
選項來實現,而這里的redis-master
就是master節點容器的名字,用容器名可以代替ip。具體參看下文。
2.2.3 在docker中運行redis slave節點服務
命令說明:
-
--name
: 容器名為redis-slave1
-
-v
: 將本地~/redis/redis-6380.conf
掛載到容器目錄/redis/redis-6380.conf
-
--link
: 建立與master節點之間的容器間的通信,redis-master
為master節點的容器名,master
為redis-master
的別名。因此,slave的配置文件redis-6380.conf中最后一項配置也可以配置為slaveof master 6379
。
容器啟動后使用redis-server redis-6380.conf
命令啟動redis server服務。如下圖所示:
redis-server redis-6380.conf
命令執行后,如果沒有任何消息,那么就是最好的消息,說明redis server已經成功啟動。下面可以通過查看日志文件來查看啟動情況。如下圖所示:
日志分析:
- 從第二行可以看出redis-server已經啟動成功了。
- Connecting to MASTER redis-master:6379說明已經連接到master節點,并且開始了數據的同步,從master節點復制到slave節點。
- 從最后6行可以看出,因為是新增的slave結點,所以master到slave的復制時全量復制(倒數第五行),部分復制不可用(倒數第六行)。復制一共經歷了四個步驟(最后四行):1. 從master接收數據 2.清理掉舊的數據 3.在內存中接在db 4.復制成功。
2.3 配置redis哨兵
2.3.1 redis哨兵配置文件
配置說明:
-
port daemonize logfile dir
配置和普通redis server節點相同。 -
sentinel monitor
:該命令的格式為sentinel monitor <master> <ip> <port> <quorum>
。
<master>
:參數為哨兵監控的master節點的別名
<ip>
:參數為監控的master節點的ip(在docker中,容器間用--link
命令通信,所以可以替換為目標容器的名字或別名)
<port>
:為監控的master結點的端口
<quorum>
:代表要判定master節點最終不可達所需要的票數。用于故障發現和判定。例如如果將quorum配置為2,代表至少要兩個哨兵節點認為master節點不可達,那么這個不可達的判定才是客觀的,對于<quorum>值設置的越小,那么達到下線的條件就越寬松,反之越嚴格。一般建議將其設置為哨兵節點的數量加1。 -
sentinel down-after-milliseconds
命令格式為sentinel down-after-milliseconds <master-name> <times>
<master>
:參數為主節點的名稱,這里為上面設置的mymaster
<times>
:sentinel節點定期會想master節點發送ping命令,如果超過times毫秒沒有收到回復,則判定該節點不可達。down-after-milliseconds雖然以<master-name>為參數,但實際上對哨兵節點、主節點、從節點的判定同時有效,可以通過主節點來獲取從節點和哨兵節點的信息。 -
sentinel parallel-syncs
格式為sentinel parallel-syncs <master-name> <nums>
當哨兵節點集合對主節點的故障判定達到一致時,哨兵領導節點會做故障轉移操作,選出新的主節點,原來的從節點會向新的主節點發起復制操作,parallel-syncs參數就是限制從節點向新的主節點發起復制的個數。若發起復制的從節點過多,那么可能會造成主節點阻塞。若發起復制的從節點過少,可能會造成數據在復制期間不一致的情況。
sentinel parallel-syncs示意圖 -
sentinel failover-timeout
格式為sentinel failover-timeout <master-name> <times>
表示故障轉移的超時時間。
其他配置請參加redis中文官網:www.redis.cn
2.3.3 在docker容器中啟動redis哨兵服務
使用下圖命令在容器中啟動redis哨兵服務。
其他兩個哨兵服務只需要修改:
--name
參數(比如 redis-master-sentinel2
)-v
掛載相應的配置文件(比如~/redis/redis-26380.conf:/redis/redis-62380.conf
),--link參數給主節點去不同的別名(比如redis-master:master-sentinel2
)。
在容器中啟動redis-sentinel服務:
運行上述命令后沒有消息,就是最好的消息。
下面可以查看工作目錄下的日志文件來查看啟動情況。如下圖所示:
日志說明:
- 從第四行可以看出,節點啟動成功,以sentinel模式運行,端口為26379。
- 倒數第二行為sentinel的id信息
- 最后一行說明新加了一個哨兵節點監控到master節點,名字為mymaster,ip為172.17.0.2,quorum為2。
至此,redis-sentinel節點配置完畢,其余兩個sentinel節點請讀者根據上面配置自行配置完成(很容易)。
3 總結
本文從配置角度描述了怎么使用Docker搭建redis主從復制,并且添加了哨兵機制,但是并沒有對redis進行詳細剖析,這里強烈建議讀者閱讀相關書籍或是到redis官網了解redis運行機制。
若有問題,歡迎在評論區留言。
本文會定期更新,以便使用跟新版本的redis和docker。
`