基於 Redis3.2.4 叢集搭建說明

lihuayang發表於2019-01-19

摘要

用兩臺虛擬機器(ip: 10.60.44.76、ip: 10.60.44.105)共 6 個節點,一臺虛擬機器 3 個節點,模擬出 3 master、3 salve 環境

  • redis 版本:redis-3.2.4
  • linux 版本:centos6.5(ip: 10.60.44.76)、centos7.0(ip: 10.60.44.105)

注意:

  • 一個 redis 例項就是一個節點
  • linux 最好是都在 root 許可權下操作
  • redis-cluster 最小配置是三主三從
  • 關閉防火牆(節點與節點之間通訊需要開放指定的埠,單純為了方便,在生產環境忌用)

centos 6.5

service iptables stop # 關閉命令:
chkconfig iptables off # 永久關閉防火牆
service iptables status # 兩個命令同時執行,執行完成後檢視防火牆關閉狀態 

centos 7.0

systemctl stop firewalld.service # 停止firewall
systemctl disable firewalld.service # 禁止firewall開機啟動
firewall-cmd --state # 檢視預設防火牆狀態(關閉後顯示notrunning,開啟後顯示running)

一、下載安裝包

安裝包在附件 redis-3.2.4.tar.gz。也可以使用 wget 外掛下載

wget http://download.redis.io/releases/redis-3.2.4.tar.gz

二、單點安裝部署

單點指的是一個 redis 例項,需要先下載 redis 的原始碼,接著進行編譯、安裝,完成通過命令啟動該例項

解壓、編譯、安裝

[root@localhost Desktop]# tar zxvf redis-3.2.4.tar.gz
[root@localhost Desktop]# cd redis-3.2.4
[root@localhost redis-3.2.4]# cd src && make install

建立相關目錄

# 存放 redis 相關命令檔案
[root@localhost src]# mkdir -p /usr/local/redis/bin
# 存放 redis 的配置檔案
[root@localhost src]# mkdir -p /usr/local/redis/etc

移動命令、配置檔案

# 移動 redis 配置檔案(配置檔案在解壓好的目錄)
[root@localhost redis-3.2.4]# mv redis.conf /usr/local/redis/etc
# 移動 redis 命令檔案(命令檔案在解壓好的目錄中的 src 目錄)
[root@localhost src]# mv mkreleasehdr.sh redis-benchmark redis-check-aof redis-check-rdb redis-cli redis-server redis-sentinel redis-trib.rb /usr/local/redis/bin

啟動服務

# 指定配置檔案啟動 redis
[root@localhost src]# /usr/local/redis/bin/redis-server /usr/local/redis/etc/redis.conf

檢視狀態

# 或者是 netstat -tunpl | grep 6379
ps -ef | grep redis

三、叢集搭建部署

建立叢集節點資料夾

名為 7031-7033 的資料夾置於 10.60.44.76 的機子中,7034-7036 資料夾置於 10.60.44.105 的機子中

mkdir -p /usr/local/redis-cluster
cd /usr/local/redis-cluster
# 建立各個節點資料夾
mkdir 7031 7032 7033 # IP 為 10.60.44.76 的機子上執行
mkdir 7034 7035 7036 # IP 為 10.60.44.105 的機子上執行

修改、拷貝配置檔案

此處以 10.60.44.76 的機子為例,另一臺操作一致

cp /usr/local/redis/etc/redis.conf /usr/local/redis-cluster/7031
cd /usr/local/redis-cluster/7031
vi redis.conf 

修改配置檔案,範本如下

port 7031     # 繫結埠
bind 本機ip    # 物理 ip:如 10.60.44.76 
dir /usr/local/redis-cluster/7031 # 指定資料存放路徑
cluster-enabled yes # 啟動叢集模式
cluster-config-file redis-7031.conf # 指定叢集節點配置檔案
daemonize yes # 後臺啟動
cluster-node-timeout 5000 # 指定叢集節點超時時間
appendonly yes # 指定持久化方式

將 7031 的 redis.conf 改完後再拷貝到剩下的 2 個目錄(7032、7033)中,再全域性替換 redis.conf 中的 7031 為對應的節點編號(7032、7033)即可。同理得 10.60.44.105 機子

移動完後 ip 為 10.60.44.76 的 /usr/local/ 目錄結構圖如下:(10.60.44.105 同理)

[root@localhost local]# cd /usr/local/ && tree -L 3
.
├── bin
.......
├── redis
│   ├── bin
│   │   ├── mkreleasehdr.sh
│   │   ├── redis-benchmark
│   │   ├── redis-check-aof
│   │   ├── redis-check-rdb
│   │   ├── redis-cli
│   │   ├── redis-sentinel
│   │   ├── redis-server
│   │   └── redis-trib.rb
│   └── etc
│       └── redis.conf
├── redis-cluster
│   ├── 7031
│   │   └── redis.conf
│   ├── 7032
│   │   └── redis.conf
│   └── 7033
│       └── redis.conf
.......
└── src

安裝 Ruby 和啟動外掛

叢集的啟動需要用到 Ruby 實現的 redis-trib.rb 外掛,所以需要先安裝 Ruby 環境和其外掛,命令如下:

# 步驟一:建議不使用 yum 安裝。使用網上自己下載原始碼的形式安裝,版本可以稍微新一點
yum install ruby
# 步驟二:一般不會出錯
yum install rubygems
# 步驟三:容易出錯,下面有常見解決方案
gem install redis

此步驟需要很多環境,容易出錯,附上常見錯誤解決方法:

錯誤一:no such file to load — zlib

進入 ruby 原始碼資料夾並安裝 ruby 自身提供的 zlib 包

[root@localhost ruby-2.3.3]# cd ext/zlib
[root@localhost zlib]# ruby ./extconf.rb
[root@localhost zlib]# make
[root@localhost zlib]# make install

錯誤二:–with-openssl-include=/usr/local/ssl/include/ –with-openssl-lib=/usr/local/ssl/lib

處理方法同錯誤一:

[root@localhost ruby-2.3.3]# cd ext/openssl
[root@localhost zlib]# ruby ./extconf.rb
[root@localhost zlib]# make
[root@localhost zlib]# make install

錯誤三:Unable to require openssl, install OpenSSL and rebuild ruby (preferred) or use non-HTTPS sources

首先檢視一下 $openssl version 是不是安裝了 OpenSSL

[root@localhost /]# openssl version
OpenSSL 1.0.1e-fips 11 Feb 2013

沒有,則新安裝一個 OpenSSL,具體教程不展開。如果有,則更換 gem 源的地址:

# 檢視 gem 源
[root@localhost /]# gem source
# 刪除 https 源 
[root@localhost /]# gem source -r https://rubygems.org/ to remove
# 新增 http 源
[root@localhost /]# gem source -a http://rubygems.org/ to read

開啟叢集個節點

在兩臺機子中分別執行下面命令,啟動叢集中的每個節點

 # 10.60.44.76
for((i=1;i<=3;i++)); do /usr/local/redis/bin/redis-server /usr/local/redis-cluster/703$i/redis.conf; done
# 10.60.44.105
for((i=4;i<=6;i++)); do /usr/local/redis/bin/redis-server /usr/local/redis-cluster/703$i/redis.conf; done 

檢視各節點狀態

檢視節點的開啟狀態

ps -ef | grep redis-server

結果如下:

### 10.60.44.76
root      18992      1  0 04:37 ?        00:00:09 /usr/local/redis/bin/redis-server 10.60.44.76:7031 [cluster]              
root      18994      1  0 04:37 ?        00:00:09 /usr/local/redis/bin/redis-server 10.60.44.76:7032 [cluster]              
root      18998      1  0 04:37 ?        00:00:10 /usr/local/redis/bin/redis-server 10.60.44.76:7033 [cluster]              
root      41471  16554  0 05:29 pts/2    00:00:00 grep redis-server
### 10.60.44.105
root      50565      1  0 04:37 ?        00:00:07 /usr/local/redis/bin/redis-server 10.60.44.105:7034 [cluster]
root      50567      1  0 04:37 ?        00:00:08 /usr/local/redis/bin/redis-server 10.60.44.105:7035 [cluster]
root      50571      1  0 04:37 ?        00:00:08 /usr/local/redis/bin/redis-server 10.60.44.105:7036 [cluster]
root      51273  34592  0 05:29 pts/1    00:00:00 grep --color=auto redis-server

建立叢集

每個節點正常開啟後,在兩臺機子任意一臺上執行:

/usr/local/redis/bin/redis-trib.rb create --replicas 1 10.60.44.76:7031 10.60.44.76:7032 10.60.44.76:7033 10.60.44.105:7034 10.60.44.105:7035 10.60.44.105:7036

連線叢集檢視狀態

登入客戶端,並測試讀寫(記得要加上 -c 選項,不然會報錯)

# 10.60.44.76
/usr/local/redis/bin/redis-cli -c -h 10.60.44.76 -p 7031
cluster info # 顯示叢集資訊

顯示欄位 cluster_state:ok 為正常執行狀態,說明叢集搭建成功

使用 cluster nodes 檢視叢集各節點的當前狀態,可以檢視主從節點的分配和連線和情況。如下:

10.60.44.76:7031> cluster nodes
1212605fcb1dd351d07d167c26b368e992c85723 10.60.44.76:7032 slave 1baa876789f68ed2e273ab7cb1d4e954fa7fc60c 0 1498187489957 11 connected
396e92e2e8207be6a4a93e29fd16670656477131 10.60.44.105:7036 master - 0 1498187486928 9 connected 5461-10922
37ecfb611a8201ce2bf40a2bf0ce398704083baf 10.60.44.76:7031 slave 396e92e2e8207be6a4a93e29fd16670656477131 0 1498187488947 9 connected
82326f032fc040d7ed59f87ee9ddd500ad19d704 10.60.44.76:7033 slave 135173619dfc7bdbef98f5d5f07d6b1fcd6474dc 0 1498187483893 6 connected
1baa876789f68ed2e273ab7cb1d4e954fa7fc60c 10.60.44.105:7034 master - 0 1498187487937 11 connected 0-5460
135173619dfc7bdbef98f5d5f07d6b1fcd6474dc 10.60.44.105:7035 myself,master - 0 0 3 connected 10923-16383

關閉叢集

關閉叢集需要將節點逐個關閉,可以使用指令碼自動完成:

# 10.60.44.76
for((i=1;i<=3;i++)); do /usr/local/redis/bin/redis-cli -c -h 10.60.44.76 -p 703$i shutdown; done 
# 10.60.44.105
for((i=4;i<=6;i++)); do /usr/local/redis/bin/redis-cli -c -h 10.60.44.105 -p 703$i shutdown; done 

刪除叢集檔案

每次新建立叢集之前需要將自動生成的配置檔案和資料庫刪除,命令如下:

# 10.60.44.76
for((i=1;i<=3;i++)); do rm -f /usr/local/redis-cluster/703$i/dump.rdb /usr/local/redis-cluster/703$i/redis-703$i.conf /usr/local/redis-cluster/703$i/appendonly.aof; done
# 10.60.44.105
for((i=4;i<=6;i++)); do rm -f /usr/local/redis-cluster/703$i/dump.rdb /usr/local/redis-cluster/703$i/redis-703$i.conf /usr/local/redis-cluster/703$i/appendonly.aof; done

四、叢集操作

當前存在叢集節點情況如下:

# 7034(主)- 7032(從)
# 7035(主)- 7033(從)
# 7036(主)- 7031(從)
82326f032fc040d7ed59f87ee9ddd500ad19d704 10.60.44.76:7033 slave 135173619dfc7bdbef98f5d5f07d6b1fcd6474dc 0 1498199288536 6 connected
396e92e2e8207be6a4a93e29fd16670656477131 10.60.44.105:7036 master - 0 1498199282454 9 connected 5461-10922
135173619dfc7bdbef98f5d5f07d6b1fcd6474dc 10.60.44.105:7035 master - 0 1498199289546 3 connected 10923-16383
1baa876789f68ed2e273ab7cb1d4e954fa7fc60c 10.60.44.105:7034 master - 0 1498199285499 11 connected 0-5460
37ecfb611a8201ce2bf40a2bf0ce398704083baf 10.60.44.76:7031 myself,slave 396e92e2e8207be6a4a93e29fd16670656477131 0 0 1 connected
1212605fcb1dd351d07d167c26b368e992c85723 10.60.44.76:7032 slave 1baa876789f68ed2e273ab7cb1d4e954fa7fc60c 0 1498199287523 11 connected

增加一個主節點

在原有的叢集之上新增一個新的主節點,需要開啟新的節點,接著將此節點新增進叢集中並分配槽,詳細如下描述:

1. 建立節點需要的相關檔案(資料夾、配置檔案)

[root@localhost /]# mkdir /usr/local/redis-cluster/7037

2. 拷貝並修改配置檔案

將配置檔案中的 7036 字串全部替換為 7037,此處不再累述

[root@localhost /]# cp /usr/local/redis-cluster/7036/redis.conf  /usr/local/redis-cluster/7037/

3. 啟動新建立的節點

[root@localhost /]# /usr/local/redis/bin/redis-server /usr/local/redis-cluster/7037/redis.conf

4. 將新節點新增進已存在叢集中成為其中一主節點

# 引數一:所要新增的新節點 ip 和埠;引數二:存在的叢集中的任意線上節點 ip 和埠
[root@localhost /]# redis-trib.rb add-node 10.60.44.105:7037 10.60.44.105:7034

成功後列印資訊如下:

>>> Adding node 10.60.44.105:7037 to cluster 10.60.44.105:7034
>>> Performing Cluster Check (using node 10.60.44.105:7034)
............... 省略
>>> Send CLUSTER MEET to node 10.60.44.105:7037 to make it join the cluster.
[OK] New node added correctly.

5. 檢視新增新節點後的叢集節點資訊

3f2c74e5888907c494b8b728210175144657f218 10.60.44.105:7037 master - 0 1498199380639 0 connected
396e92e2e8207be6a4a93e29fd16670656477131 10.60.44.105:7036 master - 0 1498199384698 9 connected 5461-10922
135173619dfc7bdbef98f5d5f07d6b1fcd6474dc 10.60.44.105:7035 master - 0 1498199381655 3 connected 10923-16383
1baa876789f68ed2e273ab7cb1d4e954fa7fc60c 10.60.44.105:7034 master - 0 1498199383685 11 connected 0-5460

6. 給新節點分配雜湊槽

[root@localhost /]# /usr/local/redis/bin/redis-trib.rb reshard 10.60.44.105:7037
# 分配多少槽點給新節點
How many slots do you want to move (from 1 to 16384)? 1000
# 哪個是接受節點?(填入新節點的 id)
What is the receiving node ID? 3f2c74e5888907c494b8b728210175144657f218
Please enter all the source node IDs.
  Type `all` to use all the nodes as source nodes for the hash slots.
  Type `done` once you entered all the source nodes IDs.
# 從所有主節點中隨機選取
Source node #1: all

7. 檢視分配槽後的叢集節點資訊

3f2c74e5888907c494b8b728210175144657f218 10.60.44.105:7037 master - 0 1498201081749 12 connected 0-332 5461-5794 10923-11255
396e92e2e8207be6a4a93e29fd16670656477131 10.60.44.105:7036 master - 0 1498201080733 9 connected 5795-10922
135173619dfc7bdbef98f5d5f07d6b1fcd6474dc 10.60.44.105:7035 master - 0 1498201082755 3 connected 11256-16383
1baa876789f68ed2e273ab7cb1d4e954fa7fc60c 10.60.44.105:7034 master - 0 1498201078714 11 connected 333-5460

增加一個從節點

在原有的叢集之上為其中一個主節點(7037)新增一個新的從節點(7038),需要開啟新的從節點,並將此節點新增進叢集中,詳細如下描述:

1. 建立節點需要的相關檔案(資料夾、配置檔案)

[root@localhost /]# mkdir /usr/local/redis-cluster/7038

2. 拷貝並修改配置檔案

將配置檔案中的 7036 字串,全部替換為 7038,此處不再累述

[root@localhost /]# cp /usr/local/redis-cluster/7036/redis.conf  /usr/local/redis-cluster/7038/

3. 啟動新建立的節點

[root@localhost /]# /usr/local/redis/bin/redis-server /usr/local/redis-cluster/7038/redis.conf

4. 將新節點新增進叢集中

# 引數一:所要新增的新節點 ip 和埠;引數二:存在的叢集中的任意線上節點 ip 和埠
[root@localhost /]# redis-trib.rb add-node 10.60.44.105:7038 10.60.44.105:7034

成功後列印資訊如下:

>>> Adding node 10.60.44.105:7038 to cluster 10.60.44.105:7034
>>> Performing Cluster Check (using node 10.60.44.105:7034)
............... 省略
>>> Send CLUSTER MEET to node 10.60.44.105:7038 to make it join the cluster.
[OK] New node added correctly.

5. 檢視新增新節點後的叢集節點資訊

9cc99dc2e2721d6712c55e293c21c7f3b9c2f95c 10.60.44.105:7038 master - 0 1498201399078 0 connected
3f2c74e5888907c494b8b728210175144657f218 10.60.44.105:7037 master - 0 1498201398374 12 connected 0-332 5461-5794 10923-11255
.......

6. 將埠為 7038 的節點置為 7037 埠的從節點

[root@localhost /]# redis-cli -c -h 10.60.44.105 -p 7038 cluster replicate 3f2c74e5888907c494b8b728210175144657f218

7. 檢視設定為從節點後的叢集節點資訊

9cc99dc2e2721d6712c55e293c21c7f3b9c2f95c 10.60.44.105:7038 slave 3f2c74e5888907c494b8b728210175144657f218 0 1498201731111 12 connected
3f2c74e5888907c494b8b728210175144657f218 10.60.44.105:7037 master - 0 1498201398374 12 connected 0-332 5461-5794 10923-11255
.......

刪除一個主節點

刪除叢集中埠為 7037 的主節點,填入叢集中叢集中任意節點 ip 埠和所要刪除節點的 id。(需要先將所擁有的槽分配到其他的主節點)

[root@localhost /]# usr/local/redis/bin/redis-trib.rb del-node 10.60.44.105:7034 3f2c74e5888907c494b8b728210175144657f218

刪除一個從節點

同理得主節點

五、叢集測試

模擬 oom(Out Of Meomery)

redis-cli debug oom

模擬當機

redis-cli debug segfault

模擬 hang

redis-cli -p 6379 DEBUG sleep 30

參考資料:

http://www.cnblogs.com/hjwubl…
http://blog.csdn.net/cfl20121…
http://www.cnblogs.com/wuxl36…
http://www.redis.cn/topics/cl…
http://wiki.jikexueyuan.com/p…

相關文章