摘要
用兩臺虛擬機器(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…