前言:項目需要搭建一個redis集群環境。先簡單說明下哨兵模式和cluster模式的區別。
哨兵模式:
基於HA機制,哨兵會盯着redis的主從集群,當master分支宕機時,會從salve中重新選舉出一個新的matster節點。但是缺點是內存/QPS受限於單機。
cluster模式:
因為存在多個master分支,受益於分布式集群高擴展性,內存/QPS不受限於單機,高並發場景會有更好的表現。帶來的影響是集群會導致數據的分散,整個redis集群會分成一堆數據槽,即不同的key會放到不不同的槽中。
1.准備工作
所需環境和安裝包:一台Linux主機, redis-3.2.8.tar.gz,redis-3.2.8.gem
2.預期效果
完成redis集群搭建
3.遇到問題
a.缺失ruby依賴包
b.在執行創建集群指令時卡在watting for the cluster to join....
c.重新執行創建集群指令時提示 err slot 0 is already busy
4.開始部署
1.解壓壓縮文件並安裝 tar -zxvf redis-3.2.8.tar.gz cd redis-3.2.8 make make install 2.因為是集群模式至少3個master節點,所以我們新建一個redis文件夾,並復制共6個redis目錄 mkdir /home/isap/redis cp -r redis-3.2.8 /home/isap/redis_7000 cp -r redis-3.2.8 /home/isap/redis_7001 ...... 3.修改配置文件redis.conf port 7000 //端口7000,7002,7003 bind 本機ip //默認ip為127.0.0.1 需要改為其他節點機器可訪問的ip 否則創建集群時無法訪問對應的端口,無法創建集群 daemonize yes //redis后台運行 pidfile /var/run/redis_7000.pid //pidfile文件對應7000,7001,7002 cluster-enabled yes //開啟集群 把注釋#去掉 cluster-config-file nodes_7000.conf //集群的配置 配置文件首次啟動自動生成 7000,7001,7002 cluster-node-timeout 15000 //請求超時 默認15秒,可自行設置 appendonly yes //aof日志開啟 有需要就開啟,它會每次寫操作都記錄一條日志 然后將redis_7000復制5分放入/redis_cluster中命名分別為redis_7001、redis_7002、redis_7003、redis_7004、redis_7005; 然后分別修改其目錄下的redis.conf文件中的端口和ip。 4.將啟動集群的文件redis-trib.rb 拷貝到本地 /usr/local/bin 目錄下 cd redis-3.2.8/src cp redis-trib.rb /usr/local/bin/ 5.啟動各節點,進入redis_7000目錄下,啟動命令如下 redis-server redis.conf 然后依次啟動redis_7001、redis_7002、redis_7003、redis_7004、redis_7005。 6.查看情況 ps -ef | grep redis 7、創建集群 Redis 官方提供了 redis-trib.rb 這個工具,就在解壓目錄的 src 目錄中,第三步中已將它復制到 /usr/local/bin 目錄中,可以直接在命令行中使用了。使用下面這個命令即可完成安裝。 redis-trib.rb create --replicas 1 127.0.0.1:7000 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 中途如果錯誤內容:/usr/bin/env: ruby: No such file or directory,則需要安裝 ruby。這里推薦使用yum install ruby安裝,安裝命令如下: yum install ruby yum -y install ruby ruby-devel rubygems rpm-build redis-3.2.8.gem(這是自帶的文件)
5.處理問題
下面我着重說明下我遇到的問題和處理的方法。
問題1:在執行創建集群指令時卡在watting for the cluster to join....
可以看到服務卡在了waiting。一直都沒繼續走下去這是為什么呢。我們一起來排查下原因。
首先我查閱了網上資料有份資料上說明了這步操作我們具體做了什么
7001,7002,7003,7004,7005 都會發送給7000 meet這個命令。
收到簽名才算是分配成功
那么我們來評估下原因 1.網絡端口問題 centos6.0 查看防火牆狀態:service iptables status 關閉防火牆:chkconfig iptables off #開機不啟動防火牆服務 -------------------------------------------------------------- centos7.0(默認是使用firewall作為防火牆,如若未改為iptables防火牆,使用以下命令查看和關閉防火牆) 查看防火牆狀態 firewall-cmd --state 關閉防火牆:systemctl stop firewalld.service 我這邊是沒問題的,所以原因1排除 2.發送cluster meet指令失敗 以集群方式進入redis客服端 redis-cli -h 127.0.0.1 p 7001 -c 發送meet指令 cluster meet 127.0.0.1:7000 結果還是停留在了waiting上,看着沒有成功
可是網絡端口和模擬口令都執行了,還是不行這是為什么呢,再次打開waitting界面終於有了發現
無論是master節點還是slave節點公用了同一個pid,這個很明顯是有問題。redis集群中每個節點應該生成了自己對應的pid,修改了配置文件並啟動redis后系統會對當前的redis目錄分配固定的pid,如果你將當前的目錄cp出新的redis模塊,就會出現我這個問題。所以處理思路就很明確了,修改redis的配置文件后不要馬上啟動redis,先把當前的redis目錄cp出一份新的模塊。最后再統一啟動就可以了。
問題2.重新執行創建集群指令時提示 err slot 0 is already busy
之前提到過,因為本身配置問題可能會導致一直卡在waiting階段,當你強制退出后,想重新執行集群創建語句,因為原slot已經被占用所以,會導致語句執行失敗。 處理方式:進入redis-cli客戶端執行命令 flushAll cluster reset
最后我們可以簡單確認下集群是否搭建完成
進入任意一個節點,查看集群信息
3個master對應3個slave,完成了