搭建Redis原生叢集

阿爾法貓發表於2018-08-05

一、Linux下叢集搭建

系統環境:deepin/Ubuntu

redis版本:redis-3.0.1

節點:使用master-slave,搭建分散式,主節點和從節點各自至少需要3個節點,總共6個節點。

注:本文主要標註的是一臺機器下搭建的偽分散式,通過埠進行模擬的redis叢集。

1. 去官方網站下載redis-3.0.1.tar.gz或者通過一下的命令進行操作

wget http://download.redis.io/releases/redis-3.0.1.tar.gz
tar xvzf redis-3.0.1.tar.gz
cd redis-3.0.1/
make -j
#apt-get install tcl
make test
###將redis安裝到/usr/local/redis上
#cd src && make PREFIX=/usr/local/redis install

複製程式碼

2. 在/usr/local/目錄下新建資料夾redis-cluster,並在redis-cluster目錄下建立7001~7006資料夾.

cd /usr/local
mkdir redis-cluster
cd redis-cluster
mkdir 7001 7002 7003 7004 7005 7006
cp /usr/local/redis/ /usr/local/redis-cluster/7001 -r
cp /usr/local/redis-3.0.1/redis.conf  /usr/local/redis-cluster/7001/bin
cp /usr/local/redis/ /usr/local/redis-cluster/7002 -r
cp /usr/local/redis-3.0.1/redis.conf  /usr/local/redis-cluster/7002/bin
cp /usr/local/redis/ /usr/local/redis-cluster/7003 -r
cp /usr/local/redis-3.0.1/redis.conf  /usr/local/redis-cluster/7003/bin
cp /usr/local/redis/ /usr/local/redis-cluster/7004 -r
cp /usr/local/redis-3.0.1/redis.conf  /usr/local/redis-cluster/7004/bin
cp /usr/local/redis/ /usr/local/redis-cluster/7005 -r
cp /usr/local/redis-3.0.1/redis.conf  /usr/local/redis-cluster/7005/bin
cp /usr/local/redis/ /usr/local/redis-cluster/7006 -r
cp /usr/local/redis-3.0.1/redis.conf  /usr/local/redis-cluster/7006/bin
複製程式碼

3. 將7001~7006目錄下的bin/redis.conf配置檔案開啟,並修改其中的欄位,以7001/bin/redis.config為例。下面是一個最少選項的叢集的配置檔案 : 注意如果使用的是單機測試,最好把cluster-config-file nodes.conf設定為對應的 埠 nodes-xxx.conf,還有就是 pid 設定為當前 目錄下 pidfile ./redis.pid。

port 7001
cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 5000
appendonly yes複製程式碼

4.然後在安裝的根目錄下寫啟動指令碼和關閉服務指令碼,以及連結cluster-node的ruby指令碼。

4.1 安裝ruby指令碼支援

    因為官方原生的cluster是使用ruby指令碼語言編寫的,該執行檔案在下載檔案的src目錄下的redis-trib.rb,通過副檔名即可知道他是ruby檔案。

sudo apt-get install ruby
sudo apt-get install ruby gem
複製程式碼

4.2 編寫啟動指令碼

cd /usr/local/redis-cluster
sudo vim redis-cluster-start.sh

##redis-cluster-start.sh中按i進入插入模式
cd /usr/local/redis-cluster/7001/bin
./redis-server redis.conf
cd /usr/local/redis-cluster/7002/bin
./redis-server redis.conf
cd /usr/local/redis-cluster/7003/bin
./redis-server redis.conf
cd /usr/local/redis-cluster/7004/bin
./redis-server redis.conf
cd /usr/local/redis-cluster/7005/bin
./redis-server redis.conf
cd /usr/local/redis-cluster/7006/bin
./redis-server redis.conf
##按esc進入命令模式
:wq

##給redis-cluster-start.sh賦予執行許可權
chmod u+x redis-cluster-start.sh

複製程式碼

4.3 編寫終止服務指令碼

cd /usr/local/redis-cluster
sudo vim redis-cluster-stop.sh

##redis-cluster-start.sh中按i進入插入模式
cd /usr/local/redis-cluster/7001/bin
./redis-cli -p 7001 shutdown
cd /usr/local/redis-cluster/7002/bin
./redis-cli -p 7002 shutdown
cd /usr/local/redis-cluster/7003/bin
./redis-cli -p 7003 shutdown
cd /usr/local/redis-cluster/7004/bin
./redis-cli -p 7004 shutdown
cd /usr/local/redis-cluster/7005/bin
./redis-cli -p 7005 shutdown
cd /usr/local/redis-cluster/7006/bin
./redis-cli -p 7006 shutdown
##按esc進入命令模式
:wq

##給redis-cluster-start.sh賦予執行許可權
chmod u+x redis-cluster-stop.sh複製程式碼

5 啟動服務並建立cluster-connection

./redis-cluster-start.sh
~/redis-3.0.1/src# redis-trib.rb create --replicas 1  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 127.0.0.1:7006
M: 1984c27297c6ef50bbfcbd35c11b93cc40ba17e4 127.0.0.1:7001
   slots:0-5460 (5461 slots) master
M: 481e256be4c724f5a2c64a761e52b4be61ca45b4 127.0.0.1:7002
   slots:5461-10922 (5462 slots) master
M: b5b652fa02d9999861e66c843b01fd2700c02adf 127.0.0.1:7003
   slots:10923-16383 (5461 slots) master
S: 821ec823dc0c2d4f65319e84fe74157fb1014155 127.0.0.1:7004
   replicates 1984c27297c6ef50bbfcbd35c11b93cc40ba17e4
S: b3b8541b9520d707180d56a2fb3cf3ee6895ed10 127.0.0.1:7005
   replicates 481e256be4c724f5a2c64a761e52b4be61ca45b4
S: d2b437ca8b9007dcdb63ac16210f6540860361e3 127.0.0.1:7006
   replicates b5b652fa02d9999861e66c843b01fd2700c02adf
Can I set the above configuration? (type 'yes' to accept):
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered.

複製程式碼

6 檢查和使用

原生cluster的好處就是client只需要連線上一個節點就能夠使用cluster了,至於原理下篇再講。

隨意連線到某個節點.

cd /usr/local/redis-cluster/7001/bin
./redis-cli -p 7006 -c
##如果出現一下的內容則為配置完全
127.0.0.1:7006>
127.0.0.1:7006>set key1 value1
OK
127.0.0.1:7006>get key1
->Redirected to slot [2922] located at 127.0.0.1:7001
"value1"複製程式碼


二、Redis原生叢集Redis-Cluster原理

Redis-Cluster架構圖

搭建Redis原生叢集

架構簡析:

  1. redis中的節點採用PING-PONG機制,是的彼此互聯,內部使用二進位制協議優化傳輸速度和帶框。
  2. 節點的fail是通過急群眾超過半數的節點檢測失效時才失效,通過投票機制。
  3. 客戶端與redis節點直連,不需要中間代理層,客戶端只需要連線任何一個可用節點即可
  4. Redis-Cluster把所有的節點對映到[0-16383]區間個數為16384的slot(雜湊槽)上,由Cluster負責維護node<->slot<->value.

原理簡介:

    redis叢集內建16384個雜湊槽,當需要在Redis叢集內建中放置一個key-value時,redis先對key使用CRC16演算法算出一個結果a,然後對a求16384的餘數,這樣每個key都會落在[0,16383]的雜湊槽中,redis會根據節點數量大致均等的將雜湊槽應對映到不同的節點上。

更多內容參考官網


相關文章