redis叢集搭建之官方redis cluster 搭建實踐
redis cluster是官方的redis叢集實現,本篇文章為搭建叢集實踐篇
一、手動搭建
redis官方已經redis-trib.rb命令來給我們實現redis搭建了。但是為了瞭解原理,首先我們來手動搭建不使用官方的命令。如果大家想快速搭建,可以直接跳到二。
1、準備
我們這個例子是在單機上部署叢集,實際的工作情況會在不同的機器上搭建,一方面為了保證高可用也是為了擴大資料的容量所以實際中會在不同的機器上搭建。
所以在單機器上準備6個配置檔案,通過6個不同的埠啟動六個redis,3主3從的模式。
埠7000 的從節點是7003,埠7001的從節點是7004,埠7002的從節點是7005。
1)建立測試目錄和檔案
在redis的目錄下測試cluster的目錄:
在cluster-test目錄下面建立以下目錄:
conf目錄放置一下配置檔案(檔案內容待會會教大家建立):
data 目錄會放置資料檔案和redis持久化檔案rdb檔案,logs放置日誌檔案,scripts裡面放置我們自己寫的指令碼檔案,後面也會介紹
2)建立conf檔案,cd到conf檔案,vim redis-7000.conf
port 7000daemonize yes
dir "/opt/software/redis-4.0.9/cluster-test/data"
logfile "/opt/software/redis-4.0.9/cluster-test/logs/7000.log"
#dbfilename不能配置為路徑
dbfilename "dump-7000.rdb"
cluster-enabled yes
cluster-config-file nodes-7000.conf
#是否需要每個節點都可用,叢集才算可用,關閉
cluster-require-full-coverage no
也就是:
port啟動的埠,不用說,單機下面搭建叢集只能以埠區分
daemonize表示需要以後臺程序啟動個,否則客戶端關閉redis就關閉了
dir,logfile就是剛剛說的資料檔案和日誌檔案的配置,根據每個人安裝路徑的不同去配置
dbfilename 到時候會自動生成到data目錄下面,需要寫一個檔名
cluster-enabled yes以叢集方式啟動
cluster-cluster-config-file 這個是nodes資訊配置檔案,也是自動生成的
最後一個看註釋,最好設定為no。
然後就是把檔案都複製一份並修改
sed "s/7000/7001/g" redis-7000.conf >redis-7001.conf
7002,7003,7004,7005以此類推
2、啟動叢集
一次通過配置檔案啟動叢集,我還在conf目錄下,所以這樣啟動
啟動了之後檢視程序(如果對基本的linux命令不熟悉,可以看這裡)
說明都啟動起來了
檢視槽資訊,都沒有,是因為我們還沒有分配槽,稍後分配
檢視data目錄已經開始有檔案了:
這些檔案的內容:
和用這個指令檢視的類似:
檢視叢集資訊,叢集處於失敗狀態,並且只感應到自己一個在叢集裡面,slots也沒有分配:
3、叢集之間相互握手,只要一個在叢集裡面的機器meet了其他機器,這個叢集裡的其他機器也能感知到剛剛meet的叢集
使用如下命令:
../../src/redis-cli -p 7000 cluster meet 127.0.0.1 7001
用了7000meet了7001和7002,雖然7002沒有meet7001,但是他也感知了7001。繼續用7000meet剩下所有的機器
所有的機器都感知彼此的存在了,並且叢集裡面叢集的資料增加到了6:
4、設定副本
為了保證高可用,把7003設定為7000的從節點,把7004設定為7001的從節點,把7005設定為7002的從節點。
../../src/redis-cli -p 7003 cluster replicate f836a783a1adf21f93b16e2ec755aefc072b7aaf
需要注意的是這裡使用的是id
以此類推:
從節點設定成功。
5、分配slots
1)說明
到目前為止,slots還是空的,並且叢集處於不可用狀態,因為沒有分配slots:
redis cluster一共有16383個槽,現在分配到三個
7000的槽0~5461,7001的槽5462~10922,7002的槽10923~16383
2)編寫指令碼
vim ../scripts/addslots.sh
3)分配槽
即sh ../scripts/addslots.sh 0 5461 7000以此類推
sh ../scripts/addslots.sh 5462 10922 7001
sh ../scripts/addslots.sh 10923 16383 7002
4)驗證叢集
槽已經根據叢集和主從分配了
並且叢集處於可用狀態
自此,手動搭建叢集成功。關閉之後下次啟動還可以是叢集狀態,因為資訊已經持久化到dump檔案裡面,也就是data目錄下存放的dump檔案:
二、使用官方的redis-trib.rb搭建叢集
使用官方的redis-trib.rb搭建叢集更加簡單,而請更加高效、準確,建議生產環境下使用,步驟如下
1、搭建ruby環境
redis-trib.rb這個命令後面是rb的,所以一看就是需要有ruby環境
1)安裝ruby前置庫
yum install zlib-devel
yum install zlib-devel
如果不安裝,後面會遇到這個問題:
ERROR: While executing gem ... (NoMethodError) undefined method `invoke_with_build_args' for nil:NilClass
2)安裝ruby
下載:wget https://cache.ruby-lang.org/pub/ruby/2.3/ruby-2.3.7.tar.gz
解壓到特定目錄:tar -zxvf ruby-2.3.7.tar.gz -C /opt/software
進入目錄:cd /opt/software/ruby-2.3.7
配置:./configure --prefix=/usr/local/ruby(把解壓的原始檔放在/usr/local/ruby)
編譯:make
安裝:make install
進入目錄:cd /usr/local/ruby
讓ruby新增到使用者的訪問變數中:cp bin/ruby /usr/local/bin
讓gem新增到使用者的訪問變數中 : cp /usr/local/ruby/bin/gem /usr/local/bin
輸入ruby -v,看到如下資訊說明成功:
同理執行gem -v
3)安裝ruby的redis的客戶端
檢視redis客戶端的所有版本https://rubygems.org/gems/redis/versions
找到redis,點進去,“下載”在右下角,點選複製連結地址
下載:wget https://rubygems.org/downloads/redis-4.0.1.gem
安裝:gem install -l redis-4.0.1.gem,看到如下,成功
ps:如果前面安裝ruby沒有安裝zlib-devel 和 openssl-devel,會出現下面的錯誤
- ERROR: Loading command: install (LoadError)
- cannot load such file -- zlib
- ERROR: While executing gem ... (NoMethodError)
- undefined method `invoke_with_build_args' for nil:NilClass
4)校驗安裝
gem list -- check redis gem,(注意“--”之後有一個空格),看到如下資訊,說明成功!
再來到redis-trib.rb這個命令這裡
./redis-trib.rb,如下:
2、準備redis目錄和配置檔案(同一的第1步類似,不需要scripts目錄,如果在一中手動實現過,把data和logs目錄下的檔案刪除)
在單機器上準備6個配置檔案,通過6個不同的埠啟動六個redis,3主3從的模式。
埠7000 的從節點是7003,埠7001的從節點是7004,埠7002的從節點是7005。
1)建立測試目錄和檔案
在redis的目錄下測試cluster的目錄:
在cluster-test目錄下面建立以下目錄:
conf目錄放置一下配置檔案(檔案內容待會會教大家建立):
data 目錄會放置資料檔案和redis持久化檔案rdb檔案,logs放置日誌檔案
2)建立conf檔案,cd到conf檔案,vim redis-7000.conf
port 7000daemonize yes
dir "/opt/software/redis-4.0.9/cluster-test-trib/data"
logfile "/opt/software/redis-4.0.9/cluster-test-trib/logs/7000.log"
#dbfilename不能配置為路徑
dbfilename "dump-7000.rdb"
cluster-enabled yes
cluster-config-file nodes-7000.conf
#是否需要每個節點都可用,叢集才算可用,關閉
cluster-require-full-coverage no
也就是:
port啟動的埠,不用說,單機下面搭建叢集只能以埠區分
daemonize表示需要以後臺程序啟動個,否則客戶端關閉redis就關閉了
dir,logfile就是剛剛說的資料檔案和日誌檔案的配置,根據每個人安裝路徑的不同去配置
dbfilename 到時候會自動生成到data目錄下面,需要寫一個檔名
cluster-enabled yes以叢集方式啟動
cluster-cluster-config-file 這個是nodes資訊配置檔案,也是自動生成的
最後一個看註釋,最好設定為no。
然後就是把檔案都複製一份並修改
sed "s/7000/7001/g" redis-7000.conf >redis-7001.conf
7002,7003,7004,7005以此類推
3、依次啟動redis
先把redis-cli 和redis-server 複製到命令搜尋地方
cp ../../src/redis-cli /usr/local/bin/
cp ../../src/redis-server /usr/local/bin/
方便以後使用
檢視redis-server情況,還是為啟動的狀態
4、開啟叢集
我先把redis-trib.rb 拷貝到bin目錄下
cp ./redis-trib.rb /usr/local/bin/,以後就隨地可以使用redis-trib.rb命令了
輸入redis-trib.rb
我們要建立叢集,一鍵的那種
redis-trib.rb create --replicas 1 127.0.0.1:7000 127.0.0.1:7001 127.0.0.1:7002 127.0.0.1:7003
127.0.0.1:7004 127.0.0.1:7005
(replicas 1表示每個節點有一個從節點,redis-trib.rb會自動分配,如果引數不符合,會報錯)
出現下面:
可以看到自動分配了從節點,並且試圖優化,說明官方的redis-trib.rb還是比較高效和準確,由於是單機,所以會有一個警告,說是主從同一個機器,測試環境不用管。提示你是否接受配置,填入yes。看到如下
提示槽位已經自動添加了,我們檢視一下
說明節點已經新增,並且槽位已經分配好了,叢集也處於可用的狀態。
redis cluster 啟動成功之後,還會有很多問題,例如節點伸縮這個很重要的運維問題,後面我會用另外一篇文章介紹redis叢集節點伸縮。