linux系統——Redis集群搭建(主從+哨兵模式)
- 2022 年 1 月 27 日
- 筆記
趁著這幾天剛好有點空,就來寫一下redis的集群搭建,我跟大家先說明,本文的redis集群因為linux伺服器只是阿里雲一台伺服器,所以集群是redis啟動不同埠,但是也能達到集群的要求。其實不同伺服器也相當於啟動不同埠一樣。所以,一起來看看效果吧。
一:下載redis安裝包(我的是這個版本:5.0.14)
二:在目錄 /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)
完事!!!!