用兩臺虛擬機(ip: 10.60.44.7六、ip: 10.60.44.105)共 6 個節點,一臺虛擬機 3 個節點,模擬出 3 master、3 salve 環境html
注意:node
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)
安裝包在附件 redis-3.2.4.tar.gz。也可使用 wget 插件下載shell
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 的機子中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 實現的 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
在原有的集羣之上添加一個新的主節點,須要開啓新的節點,接着將此節點添加進集羣中並分配槽,詳細以下描述:
[root@localhost /]# mkdir /usr/local/redis-cluster/7037
將配置文件中的 7036 字符串所有替換爲 7037,此處再也不累述
[root@localhost /]# cp /usr/local/redis-cluster/7036/redis.conf /usr/local/redis-cluster/7037/
[root@localhost /]# /usr/local/redis/bin/redis-server /usr/local/redis-cluster/7037/redis.conf
# 參數一:所要添加的新節點 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.
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
[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
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),須要開啓新的從節點,並將此節點添加進集羣中,詳細以下描述:
[root@localhost /]# mkdir /usr/local/redis-cluster/7038
將配置文件中的 7036 字符串,所有替換爲 7038,此處再也不累述
[root@localhost /]# cp /usr/local/redis-cluster/7036/redis.conf /usr/local/redis-cluster/7038/
[root@localhost /]# /usr/local/redis/bin/redis-server /usr/local/redis-cluster/7038/redis.conf
# 參數一:所要添加的新節點 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.
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 .......
[root@localhost /]# redis-cli -c -h 10.60.44.105 -p 7038 cluster replicate 3f2c74e5888907c494b8b728210175144657f218
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...