之前學redis時,都是在單執行個體節點上進行操作,而作為一個可靈活橫向拓展的鍵值資料庫,分布式搭建成服務叢集能更好的體驗出其魅力所在。之前一直沒時間去進行實際的分布式搭建,主要是覺得它簡單,但最近進行叢集搭建的實踐操作時卻出現了一些錯誤,故而進行記錄學習。
實驗環境:
centos6.8、redis3.2.5
虛拟機配置了DNS:chdp01
單節點配置多執行個體redis服務僞分布式,多機器節點搭建是一樣的原理。
首先需要進行正常的redis編譯安裝,在此略過。
詳見這篇部落格:https://blog.csdn.net/qq_34901049/article/details/98936715
3.redis安裝
因為redis是c寫的,官網下載下傳的源碼需要進行比編譯安裝。
yum install -y gcc :首先需要安裝gcc
tar -zxvf redis3.tar.gz -C REDIS_HOME :解壓相應tar包到自己想放的目錄下
make PREFIX=/usr/SFT/redis3.2 install :進入到解壓後redis下的src目錄執行編譯安裝到制定目錄PREFIX=你想要安裝的目錄。
cp redis.conf …/redis3.5/将解壓包下的redis.conf檔案拷貝到安裝目錄下
bin/redis-server redis.conf 指定配置檔案啟動redis服務端(預設前台啟動),也可以加上個 &啟動為背景程序(ctrl +c 後依舊存活)。
bin/redis-cli :啟動本地用戶端連接配接到服務端。
備注
搭建去中心化redis叢集至少需要三個redis運作執行個體,想要搭建成高可用(個人認為這裡是弱高可用,真正的高可用需要借助zookeeper或相關分布式協同工具實作)則至少需要6個節點。在此進行簡單高可用模拟搭建;建立6個運作執行個體,因為是在單台虛拟機節點上搭建出的僞分布式叢集,故而在此建立6個配置檔案即可。為了批量啟動服務執行個體,在此寫了個簡單腳本進行啟動。
6個配置檔案綁定端口為7000-7005,對應配置檔案名為[port].conf
1 環境準備
首先要有ruby、ruby-gem環境,在虛拟機聯網或有區域網路yum源情況下使用yum工具安裝,相關工具安裝指令:
yum install ruby
yum install -y rubygems
# redis-3.2.0.gem檔案需要自己在網上下一個,csdn一搜一大把,版本最好與自己的redis對應
gem install --local redis-3.2.0.gem
我的機器已經安裝好了
2 配置檔案
在繼承基本配置檔案基礎上,進行如下配置。
在此列出幾個主要配置
REDIS_HOME/redis.conf (後面所有redis執行個體配置繼承此配置檔案):
#綁定本地ip,若配置了DNS直接寫域名也ok
bind chdp01
#關閉保護模式,友善遠端連接配接
protected-mode no
#設定為背景啟動redis服務
daemonize yes
#指定背景啟動列印日志檔案路徑(根據自己實際情況來),以便在出錯時檢視。
#若不設定預設将日志資訊列印到前台(前台啟動),或者答列印到黑洞也就是直接丢失(背景啟動)
logfile "/usr/SFT/redis3.2/clusterT/daemonLog.log"
各個啟動執行個體的配置檔案撰寫,以7000.conf為例
#引入上述的父配置檔案
include /usr/SFT/redis3.2/redis.conf
#設定綁定端口
port 7000
#設定本服務執行個體日志檔案路徑
logfile "/usr/SFT/redis3.2/clusterT/logs/7000-log.log"
#資料庫檔案
dbfilename "7000-rdb.rdb"
#背景啟動下需要配置pid
pidfile /usr/SFT/redis3.2/clusterT/pidfiles/7000-pid
#本地資料庫存放路徑
dir "/usr/SFT/redis3.2/clusterT/data"
# 開啟叢集模式
cluster-enabled yes
# 設定本執行個體節點配置檔案名
cluster-config-file nodes-7000.conf
# 設定節點最大失聯時間,超過該時間(毫秒),叢集自動進行主從切換。
cluster-node-timeout 15000
複制7000.conf到相同路徑下改名為7001.conf,修改7001.conf配置檔案(替換7000為7001)
vim指令模式下輸入 %s/7001/7000
剩下操作與上面同理
完成後有如下幾個配置檔案:
啟動6個redis服務執行個體,在此寫了個批量啟動腳本(redis-clu-start.sh),chmod賦予運作權限後即可直接執行(或用sh指令執行亦可),将腳本目錄加入到系統路徑。(開發人員應該要有一個檔案存放自己寫的腳本以執行各種批量或其他組合任務,這樣會很大程度上提高工作效率)
NO=0
TOTAL=5
for((;NO<=TOTAL;NO=NO+1 ))
do
#啟動redis執行個體并列印日志到指定路徑
/usr/SFT/redis3.2/bin/redis-server /usr/SFT/redis3.2/clusterT/700${NO}.conf >> /usr/SFT/redis3.2/clusterT/clusterRunning.log
done
可能會有小夥伴對上述代碼有疑問,為什麼配置了背景啟動時的日志輸出路徑還要列印日志檔案呢?
先來看一下列印的日志檔案,發現輸出了一個錯誤:沒有找到7006.conf日志檔案。這裡啟動的是7000到7005,并沒有7006,而我之前寫的是
TOTAL=6
于是就在這裡進行錯誤列印了。不列印日志直接輸出到前台不行嗎?當然行,但如果相關的更複雜的任務部署到伺服器上,一下刷出一大堆你怎麼搞。嗯,還是個人觀點。一不小心自我yy了一波嘻嘻。
啟動後檢視:
ps -ef |grep redis
此時已經啟動6個服務節點了,但他們是互相獨立的,這時前面安裝的gem工具就派上用場了。
來到redis解壓目錄的src檔案夾下發現有個redis-trib.rb檔案,為了友善直接複制一份到叢集工作檔案夾下。
執行叢集搭建指令:
/usr/SFT/redis3.2/clusterT/redis-trib.rb create --replicas 1 192.168.11.11:7000 192.168.11.11:7001 192.168.11.11:7002 192.168.11.11:7003 192.168.11.11:7004 192.168.11.11:7005
結果如下:
中間會有個輸入互動,輸入yes繼續,在等一下下就OK了
連接配接測試
在此是去中心化服務叢集搭模組化式,連接配接到任意一台服務執行個體端口皆可獲得資料服務。
/usr/SFT/redis3.2/bin/redis-cli -c -h chdp01 -p 7000
關閉其中一個服務執行個體(7001)
打開7001對應從節點7004的日志檔案,發現其自動進行了角色切換。
此時依舊可以對外提供服務(7004已經切換為master主節點)
繼續關閉7004節點
#檢視叢集節點連接配接情況
cluster nodes
此時依舊可以提供對外資料通路服務,若加上以下配置将停止叢集資料服務。根據實際需求進行調整。
cluster-require-full-coverage yes
檢視叢集資訊
info
關閉叢集
注意不能使用kill -9暴力結束程序,很容易導緻資料丢失。
這裡寫了個腳本進行批量關閉。
NO=0
TOTAL=5
for((;NO<=TOTAL;NO=NO+1 ))
do
#儲存資料後關閉該節點,因為是叢集,需要批量關閉每個節點
/usr/SFT/redis3.2/bin/redis-cli -h chdp01 -p 700${NO} shutdown save
done
問題與解決
1 ERR Invalid node address specified: chdp01:7000
之前用的是域名建立叢集:
/usr/SFT/redis3.2/clusterT/redis-trib.rb create --replicas 1 chdp01:7000 chdp01:7001 chdp01:7002 chdp01:7003 chdp01:7004 chdp01:7005
改成ip建立即可解決
/usr/SFT/redis3.2/clusterT/redis-trib.rb create --replicas 1 192.168.11.11:7000 192.168.11.11:7001 192.168.11.11:70002 192.168.11.11:70003 192.168.11.11:7004 192.168.11.11:7005
2 ERR Slot 4648 is already busy
由于之前建立叢集失敗留下了殘留資料導緻,将叢集運作執行個體停止後删除cluster-config-file檔案(看前面的配置檔案),重新建立叢集即可解決問題.