Redis集群搭建(1主+2從+3哨兵)


Redis集群搭建(1主+2從+3哨兵)

一、Redis集群整體架構

這里我們采用的集群的整體架構是主從結構+哨兵(sentinel),實現了容災的自動切換。
image

一個主節點(master)可擁有多個從節點(slave),從節點實現對主節點的復制,保證數據同步。而哨兵(sentinel)則對各節點進行監控,主要包括主節點存活檢測、主從運行情況檢測等,一旦主節點宕機,哨兵可自動進行故障轉移 (failover)、主從切換。

接下來就開始搭建這樣一個集群,首先是主從結構,然后是哨兵模式。

1.1 安裝redis

使用3台服務器,分別安裝 redis

ip port role
192.168.180.196 7001 master
192.168.180.197 7002 slave
192.168.180.198 7003 slave

1.2 修改配置文件

1.首先,我們先看一下,redis配置文件,參數詳解

# redis進程是否以守護進程的方式運行,yes為是,no為否。默認為no(不以守護進程的方式運行會占用
# 一個終端)。
daemonize no
# 指定redis進程的PID文件存放位置
pidfile /var/run/redis.pid
# redis進程的端口號
port 6379
# 是否開啟保護模式,默認開啟。要是配置里沒有指定bind和密碼。開啟該參數后,
# redis只會本地進行訪問,拒絕外部訪問。要是開啟了密碼和指定bind,可以開啟。
# 否則最好關閉設置為no。
protected-mode yes
# 綁定的主機地址
bind 127.0.0.1
# 客戶端閑置多長時間后關閉連接,默認此參數為0即關閉此功能
timeout 300
# redis日志級別,可用的級別有debug.verbose.notice.warning
loglevel verbose
# log文件輸出位置,如果進程以守護進程的方式運行,此處又將輸出文件設置為stdout的話,
# 就會將日志信息輸出到/dev/null里面去了
logfile stdout
# 設置數據庫的數量,默認為0可以使用select <dbid>命令在連接上指定數據庫id
databases 16
# 指定在多少時間內刷新次數達到多少的時候會將數據同步到數據文件
save <seconds> <changes>
# 指定存儲至本地數據庫時是否壓縮文件,默認為yes即啟用存儲
rdbcompression yes
# 指定本地數據庫文件名
dbfilename dump.db
# 指定本地數據問就按存放位置
dir ./
# 指定當本機為slave服務時,設置master服務的IP地址及端口,在redis啟動的時候他會自動跟master進行數據同步
replicaof <masterip> <masterport>
# 當master設置了密碼保護時,slave服務連接master的密碼
masterauth <master-password>
# 設置redis連接密碼,如果配置了連接密碼,客戶端在連接redis是需要通過AUTH<password>命令提供密碼,默認關閉
requirepass footbared
# 設置同一時間最大客戶連接數,默認無限制。redis可以同時連接的客戶端數為redis程序可以打開的最大文件描述符,如果設置 maxclients 0,表示不作限制。當客戶端連接數到達限制時,Redis會關閉新的連接並向客戶端返回 max number of clients reached 錯誤信息
maxclients 128
# 指定Redis最大內存限制,Redis在啟動時會把數據加載到內存中,達到最大內存后,Redis會先嘗試清除已到期或即將到期的Key。當此方法處理后,仍然到達最大內存設置,將無法再進行寫入操作,但仍然可以進行讀取操作。Redis新的vm機制,會把Key存放內存,Value會存放在swap區
maxmemory<bytes>
# 指定是否在每次更新操作后進行日志記錄,Redis在默認情況下是異步的把數據寫入磁盤,如果不開啟,可能會在斷電時導致一段時間內的數據丟失。因為redis本身同步數據文件是按上面save條件來同步的,所以有的數據會在一段時間內只存在於內存中。默認為no。
appendonly no
# 指定跟新日志文件名默認為appendonly.aof
appendfilename appendonly.aof
# 指定更新日志的條件,有三個可選參數 - no:表示等操作系統進行數據緩存同步到磁盤(快),always:表示每次更新操作后手動調用fsync()將數據寫到磁盤(慢,安全), everysec:表示每秒同步一次(折衷,默認值);
appendfsync everysec

2.master機器,參數配置

bind:0.0.0.0
port:7001
protected-mode:no
daemonize:yes
logfile:./redis.log
requirepass:123456
masterauth:123456

注釋:

  • bind:0.0.0.0
    Redis 默認只允許本機訪問,把 bind 修改為 0.0.0.0 表示允許所有遠程訪問。
    如果想指定限制訪問,可設置對應的 ip。

  • port:6379
    監聽端口默認為6379,想改其他也行。

  • protected-mode:no
    關閉保護模式,可以外部訪問。

  • daemonize:yes
    設置為后台啟動。

  • logfile:./redis.log
    redis 日志文件,生成后在 bin 目錄下可找到。

  • requirepass:pwdtest@2019
    設置 redis 連接密碼。

  • masterauth:pwdtest@2019
    slave 服務連接 master 的密碼。

3.slave機器,參數配置

從機的配置和主機相似,不同的地方是需要使用replicaof指定主機(master)的IP地址和端口,需要注意的是老版本使用的是 slaveof,而本次使用的5.0.7版本要使用 replicaof ,如下

bind:0.0.0.0
port:7002
protected-mode:no
daemonize:yes
logfile:./redis.log
requirepass:123456
masterauth:123456
replicaof 192.168.180.196 7001

注釋:

  • replicaof 192.168.231.130 6379
    指定當本機為 slave 服務時,設置 master 服務的IP地址及端口,在 redis 啟動的時候會自動跟 master 進行數據同步,所以兩台從機都這樣配置即可。

注:由於我們搭建的集群需要自動容災切換,主數據庫可能會變成從數據庫,所以三台機器上都需要同時設置 requirepass 和 masterauth 配置項。

1.3 數據同步

上面我們主從節點的配置文件配置好后,重啟redis服務,在redis目錄下,可以看到我們指定的redis.log 日志文件

此時,我們需要設置一下防火牆,否則,主從機之間無法同步數據,

需要先檢查防火牆是否開啟,否則防火牆設置不生效。

1.3.1 開啟防火牆

  1. 檢查防火牆是否開啟:
systemctl status firewalld
  • dead : 未開啟狀態

  • running : 開啟狀態

  1. 開啟防火牆:
systemctl start firewalld
  1. 確認防火牆是否開啟
systemctl status firewalld

image

此時,防火牆已經開啟成功

  1. 關閉防火牆命令
systemctl stop firewalld

1.3.2 設置防火牆

firewall-cmd --add-port=6379/tcp --permanent --zone=public

此處 port 根據自己的進行修改,執行完此命令,出現 success 即表示,設置成功!

設置完之后,需要重啟防火牆

firewall-cmd --reload

然后,重啟 redis 服務

1.3.3 驗證數據同步

此時,主從結構已經搭建完畢,主從機可以實現數據同步

使用 info replication 命令分別查看三台機器信息:
image

image

image

接下來,我們在 master 機器中添加數據,可以看到在 slave 機器中,可以獲取成功。

1.4 哨兵(sentinel)

1.4.1 哨兵模式詳解

Redis Sentinel是Redis 的高可用性解決方案,由一個或多個Sentinel(哨兵)實例組成。它可以監視任意多個主服務器,以及這些主服務器屬下的所有從服務器,並在被監視的主服務器進入下線狀態時,自動將下線主服務器屬下的某個從服務器升級為新的主服務器,它的主要功能如下:

  • 監控(Monitoring): Sentinel會不斷地檢查你的主服務器和從服務器是否運作正常。

  • 通知(Notification): 當被監控的某個 Redis 服務器出現問題時, Sentinel可以通過API向管理員或者其他應用程序發送通知。

  • 故障遷移: 當主服務器不能正常工作時,Sentinel會自動進行故障遷移,也就是主從切換。

  • 統一的配置管理: 連接者詢問sentinel取得主從的地址。

1.4.2 哨兵原理

Sentinel 使用的算法核心是 Raft 算法,主要用途就是用於分布式系統,系統容錯,以及Leader選舉,每個Sentinel都需要定期的執行以下任務:

  • 每個 Sentinel 會自動發現其他 Sentinel 和從服務器,它以每秒鍾一次的頻率向它所知的主服務器、從服務器以及其他 Sentinel 實例發送一個 PING 命令。

  • 如果一個實例(instance)距離最后一次有效回復 PING 命令的時間超過 down-after-milliseconds 選項所指定的值, 那么這個實例會被 Sentinel 標記為主觀下線。 有效回復可以是: +PONG 、 -LOADING 或者 -MASTERDOWN 。

  • 如果一個主服務器被標記為主觀下線, 那么正在監視這個主服務器的所有Sentinel要以每秒一次的頻率確認主服務器的確進入了主觀下線狀態。

  • 如果一個主服務器被標記為主觀下線, 並且有足夠數量的Sentinel(至少要達到配置文件指定的數量)在指定的時間范圍內同意這一判斷, 那么這個主服務器被標記為客觀下線。

  • 在一般情況下, 每個Sentinel會以每 10 秒一次的頻率向它已知的所有主服務器和從服務器發送 INFO 命令。 當一個主服務器被Sentinel標記為客觀下線時,Sentinel向下線主服務器的所有從服務器發送 INFO 命令的頻率會從 10 秒一次改為每秒一次。

  • 當沒有足夠數量的Sentinel同意主服務器已經下線, 主服務器的客觀下線狀態就會被移除。 當主服務器重新向Sentinel的 PING 命令返回有效回復時, 主服務器的主管下線狀態就會被移除。

image

1.4.3 配置文件詳解

哨兵的配置文件為 sentinel.conf , 在 redis 解壓目錄下即可看到

各參數詳解:

# 哨兵sentinel實例運行的端口,默認26379  
port 26379
# 哨兵sentinel的工作目錄
dir ./
# 是否開啟保護模式,默認開啟。
protected-mode:no
# 是否設置為后台啟動。
daemonize:yes

# 哨兵sentinel的日志文件
logfile:./sentinel.log

# 哨兵sentinel監控的redis主節點的 
## ip:主機ip地址
## port:哨兵端口號
## master-name:可以自己命名的主節點名字(只能由字母A-z、數字0-9 、這三個字符".-_"組成。)
## quorum:當這些quorum個數sentinel哨兵認為master主節點失聯 那么這時 客觀上認為主節點失聯了  
# sentinel monitor <master-name> <ip> <redis-port> <quorum>  
sentinel monitor mymaster 127.0.0.1 6379 2

# 當在Redis實例中開啟了requirepass,所有連接Redis實例的客戶端都要提供密碼。
# sentinel auth-pass <master-name> <password>  
sentinel auth-pass mymaster 123456  

# 指定主節點應答哨兵sentinel的最大時間間隔,超過這個時間,哨兵主觀上認為主節點下線,默認30秒  
# sentinel down-after-milliseconds <master-name> <milliseconds>
sentinel down-after-milliseconds mymaster 30000  

# 指定了在發生failover主備切換時,最多可以有多少個slave同時對新的master進行同步。這個數字越小,完成failover所需的時間就越長;反之,但是如果這個數字越大,就意味着越多的slave因為replication而不可用。可以通過將這個值設為1,來保證每次只有一個slave,處於不能處理命令請求的狀態。
# sentinel parallel-syncs <master-name> <numslaves>
sentinel parallel-syncs mymaster 1  

# 故障轉移的超時時間failover-timeout,默認三分鍾,可以用在以下這些方面:
## 1. 同一個sentinel對同一個master兩次failover之間的間隔時間。  
## 2. 當一個slave從一個錯誤的master那里同步數據時開始,直到slave被糾正為從正確的master那里同步數據時結束。  
## 3. 當想要取消一個正在進行的failover時所需要的時間。
## 4.當進行failover時,配置所有slaves指向新的master所需的最大時間。不過,即使過了這個超時,slaves依然會被正確配置為指向master,但是就不按parallel-syncs所配置的規則來同步數據了
# sentinel failover-timeout <master-name> <milliseconds>  
sentinel failover-timeout mymaster 180000

# 當sentinel有任何警告級別的事件發生時(比如說redis實例的主觀失效和客觀失效等等),將會去調用這個腳本。一個腳本的最大執行時間為60s,如果超過這個時間,腳本將會被一個SIGKILL信號終止,之后重新執行。
# 對於腳本的運行結果有以下規則:  
## 1. 若腳本執行后返回1,那么該腳本稍后將會被再次執行,重復次數目前默認為10。
## 2. 若腳本執行后返回2,或者比2更高的一個返回值,腳本將不會重復執行。  
## 3. 如果腳本在執行過程中由於收到系統中斷信號被終止了,則同返回值為1時的行為相同。
# sentinel notification-script <master-name> <script-path>  
sentinel notification-script mymaster /var/redis/notify.sh

# 這個腳本應該是通用的,能被多次調用,不是針對性的。
# sentinel client-reconfig-script <master-name> <script-path>
sentinel client-reconfig-script mymaster /var/redis/reconfig.sh

1.4.4 哨兵搭建

  1. 編輯 sentinel.conf
vim sentinel.conf
  1. 修改參數
# 端口默認為26379。
port:26379
# 關閉保護模式,可以外部訪問。
protected-mode:no
# 設置為后台啟動。
daemonize:yes
# 日志文件。
logfile:./sentinel.log
# 指定主機IP地址和端口,並且指定當有2台哨兵認為主機掛了,則對主機進行容災切換。
sentinel monitor mymaster 192.168.180.196 6379 2
# 當在Redis實例中開啟了requirepass,這里就需要提供密碼。
sentinel auth-pass mymaster 123456
# 這里設置了主機多少秒無響應,則認為掛了。
sentinel down-after-milliseconds mymaster 3000
# 主備切換時,最多有多少個slave同時對新的master進行同步,這里設置為默認的1。
sentinel parallel-syncs mymaster 1
# 故障轉移的超時時間,這里設置為三分鍾。
sentinel failover-timeout mymaster 180000
  1. 防火牆設置
firewall-cmd --add-port=26379/tcp --permanent --zone=public
#重啟防火牆(修改配置后要重啟防火牆)
firewall-cmd --reload
  1. 啟動哨兵
cd /redis-5.0.7/src
./redis-sentinel ../sentinel.conf

另外兩台機器,按上述步驟,進行配置哨兵

  1. 三台哨兵都啟動后,使用 info sentinel 命令查看哨兵
./redis-cli -p 6379
info sentinel

可以看到,哨兵已經監聽到當前的主機IP端口和運行狀態,並且有2台從機,3個哨兵。

1.4.5 容災切換

現在我們模擬主機宕機,將 master 的 redis 服務關閉

kill

然后,看另外兩台機器

可以看到,哨兵sentinel 通過選舉,將其中一台 slave 機器,選舉為 master

1.4.6 參考文章

  1. 解決FirewallD is not running問題 - WayneLiu123 - 博客園

  2. redis集群搭建過程(非常詳細,適合新手)_Redis_腳本之家

  3. Linux下 Redis集群搭建詳解(主從+哨兵)_程序員大佬超的博客-CSDN博客_linux redis集群搭建

  4. https://www.linuxprobe.com/detailed-linux-directory.html


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM