天天看點

Linux下 Redis叢集搭建詳解(主從+哨兵)

參考大佬 https://www.jianshu.com/p/20fc135e82d0?utm_campaign=hugo

先安裝redis 和哨兵

cd /opt
 
mkdir redis
 
rz   #上傳redis的壓縮包
 
tar -zxvf redis-4.0.14.tar #解壓
 
cd redis-4.0.14/

make  #可以看到解壓檔案 redis-4.0.14 中會有對應的 src、conf 等檔案

cd src

make install  #出現/bin/sh: cc: command not found 要安裝gcc
           

由于 src 下檔案非常多,我們可以将幾個常用的指令和 conf 配置檔案複制出來進行統一管理,如下:

cd /opt/redis/redis-4.0.14/

mkdir etc 

mkdir bin

cp redis.conf /opt/redis/redis-4.0.14/etc  #在安裝目錄拷貝  redis主從

cp sentinel.conf /opt/redis/redis-4.0.14/etc  #在安裝目錄拷貝  哨兵

cd src/  #在src目錄拷貝

cp mkreleasehdr.sh redis-benchmark redis-check-aof redis-check-rdb redis-cli redis-server redis-sentinel /opt/redis/redis-4.0.14/bin/
           

redis主從修改配置檔案

cd ../etc

vim redis.conf
           

配置一覽(真實配置在下方)

# redis程序是否以守護程序的方式運作,yes為是,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
           

主機配置

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 qwer1234  #設定 redis 連接配接密碼
masterauth qwer1234  #slave 服務連接配接 master 的密碼
maxmemory 2147400000 #最大記憶體2G   redis記憶體最好不超過實體記憶體的一半
           

從機配置

bind:0.0.0.0
port:6380
protected-mode:no
daemonize:yes
logfile:./redis.log
requirepass:qwer1234
masterauth:qwer1234
maxmemory 2147400000 #最大記憶體2G redis記憶體最好不超過實體記憶體的一半
slaveof redis主IP 6379 
           

下面我們需要設定一下防火牆,否則主從機之間無法同步資料,指令如下,這裡根據自己設定的端口進行更改

firewall-cmd --add-port=6379/tcp --permanent --zone=public
#重新開機防火牆(修改配置後要重新開機防火牆)
firewall-cmd --reload
           

測試

啟動兩台redis

cd /opt/redis/redis-4.0.14/bin

./redis-server /opt/redis/redis-4.0.14/etc/redis.conf  #主從都啟動redis  關閉是 redis-cli -p 6379 shutdown
           

redis主機

redis-cli -p 6379   

auth qwer1234   #輸入密碼

info replication   #檢視資訊  可以看到從機的資訊

set test 666 #主機set  在從機get test
           

哨兵叢集安裝

配置一覽(真實配置在下方)

# 哨兵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
           

三台哨兵一樣

cd etc/

vi sentinel.conf
           
//端口預設為26379。
port:26379
//關閉保護模式,可以外部通路。
protected-mode:no
//設定為背景啟動。
daemonize:yes
//日志檔案。
logfile:./sentinel.log
//指定主機IP位址和端口,并且指定當有2台哨兵認為主機挂了,則對主機進行容災切換。
sentinel monitor mymaster Redis主IP 6379 2
//當在Redis執行個體中開啟了requirepass,這裡就需要提供密碼。
sentinel auth-pass mymaster qwer1234
//這裡設定了主機多少秒無響應,則認為挂了。
sentinel down-after-milliseconds mymaster 3000
//主備切換時,最多有多少個slave同時對新的master進行同步,這裡設定為預設的1。
snetinel parallel-syncs mymaster 1
//故障轉移的逾時時間,這裡設定為三分鐘。
sentinel failover-timeout mymaster 180000
           

防火牆設定指令如下

firewall-cmd --add-port=26379/tcp --permanent --zone=public
#重新開機防火牆(修改配置後要重新開機防火牆)
firewall-cmd --reload
           
cd /opt/redis/redis-4.0.14/bin

redis-sentinel /opt/redis/redis-4.0.14/etc/sentinel.conf
           

三個哨兵都啟動後,可使用如下指令檢視哨兵資訊

redis-cli -p 26379

info sentinel  #可以看到,哨兵已經監聽到目前的主機IP端口和運作狀态,并且有1台從機,3個哨兵。
           

繼續閱讀