linux系統——Redis叢集搭建(主從+哨兵模式)

QH.Thomas發表於2022-01-27

趁著這幾天剛好有點空,就來寫一下redis的叢集搭建,我跟大家先說明,本文的redis叢集因為linux伺服器只是阿里雲一臺伺服器,所以叢集是redis啟動不同埠,但是也能達到叢集的要求。其實不同伺服器也相當於啟動不同埠一樣。所以,一起來看看效果吧。

 

一:下載redis安裝包(我的是這個版本:5.0.14)

    https://redis.io/download

 

二:在目錄 /usr/local 建立資料夾:redis_6379,redis_6380,redis_6381

我這裡之所以這麼命名,是因為對應redis的埠號。

 

 

三:分別在這三個目錄上傳下載好的redis壓縮包,使用:tar -xvf redis-5.0.14.tar.gz 命令解壓

 

   切換目錄:cd redis-5.0.14
   編譯:make
   編譯完成繼續切換目錄:cd src
   接著安裝:make install

注:如出現/bin/sh: cc: command not found錯誤,是因為沒有安裝 gcc 環境,使用命令yum install gcc安裝 gcc 環境即可。

 

 

四:抽離一些配置檔案以及啟動命令到資料夾,所以,先在根目錄下建立資料夾:bin、config

 

1、切換到該目錄:cd /usr/local/redis_6379(後面幾臺伺服器一樣操作)
2、建立兩個目錄:mkdir bin。mkdir config
3、複製配置檔案到指定目錄:
  cp redis.conf /usr/local/redis_6379/config
  cp src/mkreleasehdr.sh redis-benchmark redis-check-aof redis-check-rdb redis-cli redis-server redis-sentinel /usr/local/redis_6379/config

 

 

 

 

 我這裡的etc目錄就是config目錄。還有sectinel.conf是後面會講到哨兵模式配置是回移動進來

 

 

 五:現在嘗試先啟動一臺(注意,此刻我還沒有搭建主從分佈的配置檔案修改,這裡啟動僅僅是為了redis是否能夠正常啟動)

 

切換目錄:cd /usr/local/redis_6379/redis-5.0.14/bin
執行啟動命令:./redis-server /usr/local/redis_6379/redis-5.0.14/config/redis.conf

可以檢視程式:ps axu | grep redis

 

 

 

兩者其一都可以

 

 

 這樣算是啟動成功的!!!

 六:先暫時關閉redis:

 

cd /usr/local/redis_6379/redis-5.0.14/bin  
redis-cli -p 6379 shutdown

 

  

七:分割線————————————————開始叢集搭建(主從+哨兵模式)——————————

  主從分散式搭建,是多臺伺服器的redis配置檔案修改來確定的。主從搭建是為了比如某一臺伺服器的redis寫進了快取,另外幾臺redis伺服器也能獲取到資料,熟稱資料同步!!!

主從搭建好,還要考慮一點:哨兵模式,也就是為了容災來考慮,也就是說,比如主redis伺服器工作過程當中,因為某些原因,突然掛了,那麼其他從redis伺服器沒有了主伺服器,那就一直連線不上,導致資料不能同步,那麼這個時候,就需要哨兵模式中的redis伺服器中選出一個redis,來當主伺服器。現在開始搭建!!!!

 

文章一開頭我已說明:本人只有一臺linux伺服器,所以開三個埠號是為了跟三臺伺服器是一樣的效果。

 

IP地址 埠號 角色
47.99.83.180 6379 主機
47.99.83.180 6380 從機
47.99.83.180 6381 從機

 

八:修改配置檔案:

cd /usr/local/redis_6379/redis-5.0.14/config
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

 

 

  

接下來我們要改動的資訊(三臺伺服器都要修改(此處是同一臺伺服器,三個不同埠),記住:port就是對應的埠號,比如對應上面步驟七的表):

主機配置:

bind:0.0.0.0
port:6379
protected-mode:no
daemonize:yes
logfile:./redis.log
requirepass:testuser #--這個看自己的情況是否需要設定賬號和密碼 
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 目錄下可找到

 

  

從機配置:這裡的port需要注意,從機本文配置的埠是6380、6382。讀者根據自行而定。如果是獨立的伺服器,這裡埠可以不用修改

 

bind:0.0.0.0
port:6380
protected-mode:no
daemonize:yes
logfile:./redis.log
requirepass:testuser #--這個看自己的情況是否需要設定賬號和密碼 如果主機設定了,從機也要
masterauth:123456  #--這個看自己的情況是否需要設定賬號和密碼如果主機設定了,從機也要
replicaof 47.99.83.180 6379 #因為這裡的從機的配置,所以這裡就是設定主機的 ip+ 埠,來指明主機的redis

 

 

注意:以前的老版本是使用變數:slaveof 設定主機的,因為我用的是新版本。所以在變數:replicaof做配置 

 

 

九:資料同步測試

上面的步驟修改配置檔案,已經是可以實現主從分佈的搭建,接下來就啟動三臺伺服器,啟動redis伺服器前,先開放埠,否則連線會拒絕(防火牆安全攔截:可以在阿里雲伺服器的控制檯直接增加防火牆埠開放,此處使用命令,如果命令不行,那就在阿里雲伺服器控制檯設定)

 

#埠記得寫正確
1、firewall-cmd --add-port=6379/tcp --permanent --zone=public
#重啟防火牆(修改配置後要重啟防火牆)
2、firewall-cmd --reload

 

  

接下來啟動主從伺服器:

1:cd /usr/local/redis_6379/redis-5.0.14/bin
2:redis-server ../config/redis.conf

注意:目錄redis_6379是對應的redis哈,別搞錯

 

 

然後我們檢查一下是否搭建主從成功:

1:redis-cli -p 6380 
2: info replication
#此處我是進入從機,也可以看得到主機、從機資訊。slave就是從機的意思

 

  

 

 

 

 此刻主從搭建完成!!!!接下來看資料能否同步:

分別進入6379、6380、6381的客戶端連線:

主機寫入

 

 從機讀取:

 

 

注意:這裡的錯誤提示是因為我在從機寫入,報錯了,意思是從機沒有寫入許可權

 

錯誤資訊:(error) READONLY You can't write against a read only replica

在配置檔案修改:
進入/usr/local/redis_6379/redis-5.0.14/config/redis.conf 配置檔案,修改配置檔案的slave-read-only為no, 那麼從節點也就可以進行寫的操作了,程式碼不會報錯。
大夥記得不管主機從機都設定好這個屬性,否則到時候從機寫入不了資料

 

 

 

  

十:哨兵搭建(重點來了——————————哨兵搭建————————————)

每臺伺服器都配置一個哨兵,配置方式相同,如下

同樣為了方便管理,首先將sentinel.conf複製到 config 下(記得三臺伺服器都要執行。sentinel.conf配置檔案在根目錄:

 

 

所以進入到到該目錄下:
cp sentinel.conf config

  

修改哨兵配置檔案:sentinel.conf

cd config
vim sentinel.conf

 

 改動的地方如下:

//埠預設為26379。 主機,從機的這個埠記得修改,否則導致埠占用,啟動不了。(因為我是在一臺linux伺服器部署,所以我的要修改,如果你是在不同linxu伺服器部署,那麼可以不用修改)
port:26379
//關閉保護模式,可以外部訪問。
protected-mode:no
//設定為後臺啟動。
daemonize:yes
//日誌檔案。
logfile:./sentinel.log
//指定主機IP地址和埠,並且指定當有2臺哨兵認為主機掛了,則對主機進行容災切換。
sentinel monitor mymaster 47.99.83.180 6379 2
//當在Redis例項中開啟了requirepass,這裡就需要提供密碼並保持一致,如果沒啟用密碼,那麼不需要設定,遮蔽這個屬性就好(預設是遮蔽的)
sentinel auth-pass mymaster 12345
//這裡設定了主機多少秒無響應,則認為掛了。
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

 

  

 十一:啟動三個哨兵(記得在要啟動三個,進入對應目錄)

1、cd /usr/local/redis_6381/redis-5.0.14/bin/
2、redis-sentinel /usr/local/redis_6381/redis-5.0.14/config/sentinel.conf

 

  

十二:檢視哨兵資訊

1、cd /usr/local/redis_6381/redis-5.0.14/bin/
#這裡的26381是在上面的第十步驟的配置檔案sentinel.conf裡面的配置的埠號
2、redis-cli -p 26381
3、info sentinel

 

  

 

 

 十三:容災切換

       現在模擬主機當機,也就是是否能實現容災切換,直接把主機當機,也就是關閉主機redis。如果不知道哪臺是主機,請執行下面命令:

1、先進入對應目錄(隨意一臺伺服器:cd /usr/local/redis_6381/redis-5.0.14/bin/
2、執行命令(這裡的埠號是redis啟動的埠號):redis-cli -p 6379
3、info replication #看下圖資訊即可知道主機是那一臺

 

  

 

 

 此刻我們知道47.99.83.180:6380這一臺是主機redis:

1、redis-cli -p 6380
2:showdown

 

  

然後我們進入從機的bin目錄(因為redis.log在該目錄下(我們在redis.conf裡面做了設定):cat redis.log)

 

 

 

 

完事!!!!

相關文章