基於 Redis3.2.4 集羣搭建說明

摘要

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

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

注意:node

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

centos 6.5linux

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

centos 7.0redis

systemctl stop firewalld.service # 中止firewall
systemctl disable firewalld.service # 禁止firewall開機啓動
firewall-cmd --state # 查看默認防火牆狀態(關閉後顯示notrunning,開啓後顯示running)

1、下載安裝包

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

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

2、單點安裝部署

單點指的是一個 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

3、集羣搭建部署

建立集羣節點文件夾

名爲 7031-7033 的文件夾置於 10.60.44.76 的機子中,7034-7036 文件夾置於 10.60.44.105 的機子中centos

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 的機子爲例,另外一臺操做一致ruby

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

修改配置文件,範本以下app

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 個目錄(703二、7033)中,再全局替換 redis.conf 中的 7031 爲對應的節點編號(703二、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

4、集羣操做

當前存在集羣節點狀況以下:

# 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

刪除一個從節點

同理得主節點

5、集羣測試

模擬 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...

相關文章
相關標籤/搜索