Redis 多伺服器叢集搭建
Redis 多伺服器叢集搭建
近期,想到之前使用的Redis叢集測試使用的是單伺服器上的偽叢集,重溫《Redis深度歷險-核心原理與應用實踐》的案例,覺得還是搭建一下多伺服器叢集來玩一玩會更有感觸。
常規操作,記錄一下搭建叢集的過程。
1 條件
- 基於redis6.0.9版本進行叢集的搭建
- 叢集要求至少六個節點,即每個主節點配置1個從節點,本叢集是使用了3個主節點並每個下面掛一個從節點,三個主節點分佈在3臺伺服器上。
叢集配置資訊如下:
伺服器 | Master | Slave |
---|---|---|
10.1.24.128(伺服器名master) | 6751 | 6752 |
10.1.24.129(slave1) | 6751 | 6752 |
10.1.24.130(slave2) | 6751 | 6752 |
埠名為什麼要叫675*呢?因為掃地生原名的諧音是675,所以讀者可以自定義埠名。
2 叢集配置
在第一臺伺服器(10.1.24.128)上操作
- 下載redis原始碼包並解壓
cd /usr/enviroment
wget -c http://download.redis.io/releases/redis-6.0.9.tar.gz
tar -zxvf redis-6.0.9.tar.gz
- 新建叢集配置目錄
mkdir -p /usr/environment/redis-cluster/6751 /usr/environment/redis-cluster/6752
- 將解壓後的檔案中的redis.conf配置檔案拷貝到叢集目錄之下 並執行redis安裝命令
cd redis-6.0.9
cp redis.conf /usr/environment/redis-cluster
make install # 注意 gcc版本與Redis版本的衝突解決,如果沒有指定路徑,則編譯後Redis的bin預設在/usr/local,也可以 make install PREFIX=/xx/xx 來指定編譯後Redis的bin存放路徑,注意這裡的PREFIX一定要大寫
make或make install時出現如下錯誤:
gcc版本問題,新版本的,Redis6.0以上,需要更高版本的gcc,而centOS 7自帶的GCC版本往往不符合。
解決方法:
#升級到 5.3及以上版本
yum -y install centos-release-scl
yum -y install devtoolset-9-gcc devtoolset-9-gcc-c++ devtoolset-9-binutils
scl enable devtoolset-9 bash
#注意:scl命令啟用只是臨時的,推出xshell或者重啟就會恢復到原來的gcc版本。
#如果要長期生效的話,執行如下:
echo "source /opt/rh/devtoolset-9/enable" >>/etc/profile
- 進入/usr/local,複製bin檔案到6751,6752目錄下
cd /usr/local
cp -r bin /usr/environment/redis-cluster/6751
cp -r bin /usr/environment/redis-cluster/6752
-
進入redis-cluster目錄,修改redis.conf並分別拷貝到6751,6752
修改配置檔案內容如下:
1)遮蔽限制本地訪問, 將bind 127.0.0.1 修改為 bind 0.0.0.0
2) protected-mode保護模式從yes改為no,實現免密登入
3)daemonize後的no改為yes
4)去掉cluster-enabled yes 前面的註釋
5)去掉cluster-node-timeout 前面的註釋
6)port後的埠改為6751
7)將執行的pid路徑改為對應的埠號便於管理,將redis.conf檔案,複製到對應的目錄下
cp redis.conf 6751
8)修改node配置
cluster-config-file nodes-6751.conf
# 修改為對應的節點ID
9)再次編輯redis.conf 將port引數修改 6751 ==> 6752,複製到對應目錄下.
sed -i 's/6751/6752/g' redis.conf
cp redis.conf 6752
- 啟動redis服務
/usr/environment/redis-cluster/6751/bin/redis-server /usr/environment/redis-cluster/6751/redis.conf
/usr/environment/redis-cluster/6752/bin/redis-server /usr/environment/redis-cluster/6752/redis.conf
注意點: 在啟動服務之前要修改配置檔案中對應的dump dir目錄,否則預設目錄是 ./ 需要改成對應的絕對路徑,否則會造成路徑衝突,導致啟動失敗
檢視啟動的服務:
也可以用RDM連線測試:
-
直接將master中的叢集配置複製到其他兩個伺服器即可,需要注意的是,需要設定對應的埠與目錄
scp -r /usr/environment/redis-cluster/ root@slave1:/usr/environment scp -r /usr/environment/redis-cluster/ root@slave2:/usr/environment
效果如下:
第一臺(master)
第二臺(slave1):
第三臺(slave2):
3 叢集搭建
使用Redis客戶端執行命令:
/usr/environment/redis-cluster/6751/bin/redis-cli --cluster create --cluster-replicas 1 10.1.24.128:6751 10.1.24.128:6752 10.1.24.129:6751 10.1.24.129:6752 10.1.24.130:6751 10.1.24.130:6752
注意:上述指令中的IP地址不能用主機名代替,因為redis對主機名的識別不是很友好,,如果改成下面這個會出現錯誤:
/usr/environment/redis-cluster/6751/bin/redis-cli --cluster create --cluster-replicas 1 master:6751 master:6752 slave1:6751 slave1:6752 slave2:6751 slave2:6752
引數說明:
--cluster 叢集管理命令 後面可以執行叢集相關的命令
--cluster-replicas 1 代表每個Master攜帶一個Slave
create 建立叢集命令
4 客戶端測試
開啟客戶端 連結任意一個Master節點
redis-cli -h 10.1.24.128 -c -a 密碼 -p 埠
引數:
-c: 連線到叢集
我們可以看到,當我們set一個鍵值對的時候,Redis會自動為我們的key計算CRC16值,然後對16384取模,獲取key對應的hash slot,然後通過判斷該槽被那個Master所佔用,幫我們重定向到那個Master節點,將鍵值對存入。
檢視叢集資訊:
cluster nodes
通過RDM的連線圖示可以明顯區別叢集連線和非叢集連線的區別: