【docker】【redis】2.docker上設置redis集群---Redis Cluster部署【集群服務】【解決在docker中redis啟動后,狀態為Restarting,日志報錯:Configured to not listen anywhere, exiting.問題】【Waiting for the cluster to join...問題】


參考地址:https://www.cnblogs.com/zhoujinyi/p/6477133.html

https://www.cnblogs.com/cxbhakim/p/9151720.html

https://blog.csdn.net/qq442270636/article/details/79254240/

 

承接上一篇,【docker】【redis】1.docker安裝redis【單點redis服務】

1.docker上拉取了redis鏡像后,再從docker資源庫獲取ruby鏡像

docker pull redis:4.0.8
docker pull ruby

此時docker容器中的鏡像有【mysql與此無關】

 

redis和ruby就是redis cluster所有工具

 

2.搭建redis cluster環境

2.1 在根目錄創建apps/目錄,在apps目錄下創建redis-cluster 目錄

 

 進入新創建的redis-cluster目錄下,創建一個文件redis-cluster.tmpl

touch redis-cluster.tmpl

 

編輯新創建的文件

vi redis-cluster.tmpl

編輯文件進入后

i 進行插入操作

復制一下文件內容到文件中【紅字部分需要添加,否則會引起3中最后的問題Waiting for the cluster to join...

port ${PORT}
protected-mode no
cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 5000
cluster-announce-ip 39.10X.XX.XX //自己服務器IP
cluster-announce-port ${PORT}
cluster-announce-bus-port 1${PORT}
appendonly yes

復制完成,esc退出,

輸入 :wq保存並退出vim編輯器

 

操作完成查看文件內容:

cat redis-cluster.tmpl

 

2.2  創建自定義的network

還是在該目錄下

執行命令

docker network create redis-net

OK

 

2.3  在/apps/redis-cluster下生成conf和data目標,並生成配置信息

直接執行腳本, 在redis-cluster目錄下生成conf和data目標,並生成配置信息【注意,此處生成配置信息后,配置內容中未指定確切端口,仍然是${port},因此需要修改配置文件指定端口,詳情請查看2.4》解決在docker中redis啟動后,狀態為Restarting,日志報錯:Configured to not listen anywhere, exiting.問題

for port in `seq 7000 7005`; do \
  mkdir -p ./${port}/conf \ && PORT=${port} envsubst < ./redis-cluster.tmpl > ./${port}/conf/redis.conf \ && mkdir -p ./${port}/data; \
done

效果如下:

粘貼腳本后,點擊回車,執行完成后,

輸入 ls -al命令,查看已經創建成功7000-7005文件夾以及內部的配置

共生成6個文件夾,從7000到7005,每個文件夾下包含data和conf文件夾,同時conf里面有redis.conf配置文件

 

================================如果沒有出錯,此段忽略--START========================================

 如果創建出錯,可以使用刪除文件夾命令進行遞歸刪除操作

centOS 刪除文件夾命令【刪除文件夾以及文件夾下所有的內容】

rm -rf 文件夾名

 例如: 在當前目錄下刪除 文件夾7000以及文件夾下所有的文件和目錄

rm -rf 7000

 =================================如果沒有出錯,此段忽略--END=======================================

 

2.3  創建6個redis容器

跟上一步一樣,直接復制腳本  並執行,創建6個redis容器

for port in `seq 7000 7005`; do \
  docker run -d -ti -p ${port}:${port} -p 1${port}:1${port} \
  -v /apps/redis-cluster/${port}/conf/redis.conf:/usr/local/etc/redis/redis.conf \
  -v /apps/redis-cluster/${port}/data:/data \
  --restart always --name redis-${port} --net redis-net \
  --sysctl net.core.somaxconn=1024 redis:4.0.8 redis-server /usr/local/etc/redis/redis.conf; \
done

 

效果如下:

執行 docker ps命令,查看創建的redis6個容器的運行情況

 

 

然后會發現,所有的redis啟動容器的狀態都是Restarting 狀態。【如果所有的狀態都是Up狀態,則直接跳過本問題的處理】

並且使用桌面工具測試連接 連接不上。

 

   2.4》解決在docker中redis啟動后,狀態為Restarting,日志報錯:Configured to not listen anywhere, exiting.問題

要解決上面的問題

是因為7000-7005目錄下生成的conf目錄下的redis.conf文件中的配置並未完善,分別修改${PORT}修改為對應的具體端口

原本配置文件中的內容:

 

修改后的文件內容:

 

 

 

 

修改完成后,

分別 停止並移除 redis容器

 

然后重新執行啟動redis容器的腳本

for port in `seq 7000 7005`; do \
  docker run -d -ti -p ${port}:${port} -p 1${port}:1${port} \
  -v /apps/redis-cluster/${port}/conf/redis.conf:/usr/local/etc/redis/redis.conf \
  -v /apps/redis-cluster/${port}/data:/data \
  --restart always --name redis-${port} --net redis-net \
  --sysctl net.core.somaxconn=1024 redis:4.0.8 redis-server /usr/local/etc/redis/redis.conf; \
done

 

此時可以使用Redis Desktop Manager這個redis桌面工具連接測試是否可以連接成功

 

 

 3.最后 ,通過啟動ruby來實現集群

 跟上一步一樣,粘貼腳本后,回車執行腳本

echo yes | docker run -i --rm --net redis-net ruby sh -c '\
  gem install redis && wget http://download.redis.io/redis-stable/src/redis-trib.rb  && ruby redis-trib.rb create --replicas 1 \
  '"$(for port in `seq 7000 7005`; do \
    echo -n "$(docker inspect --format '{{ (index .NetworkSettings.Networks "redis-net").IPAddress }}' "redis-${port}")":${port} ' ' ; \
  done)"

 

效果如下:

 

 最后依舊沒有解決

 Waiting for the cluster to join.............................................................................................................................................................................

的問題,即使加了protected-mode no 屬性也沒有解決!!!!

 

 

 

=============================================問題Waiting for the cluster to join..問題 暫未解決========================================================

如果未在最開始的redis-cluster.tmpl文件中,未配置屬性

【同樣,這個配置文件會在創建7000-7005目錄時將文件中的配置同步復制到這幾個目錄下的conf目錄中的redis.conf文件中,因此如果redis-cluster.tmpl文件中未配置,則還需要修改這幾個目錄下的所有redis.conf文件中的配置】

#是否開啟保護模式,默認開啟。要是配置里沒有指定bind和密碼。開啟該參數后,redis只會本地進行訪問,拒絕外部訪問。要是開啟了密碼   和bind,可以開啟。否   則最好關閉,設置為no。
protected
-mode no

那么如果未寫本屬性,則默認為yes開啟保護模式,則會導致下面的Waiting for the cluster to join..問題

 

 解決方法:

就是上面說的,分別在redis.conf文件中加上屬性【protected-mode no】

同時,

還應該停止並刪除所有的redis容器,

當然,如果走到這一步了,說明ruby也啟動了,所以ruby容器也應該停止

補充完善redis.conf中的屬性后,重新批量啟動redis容器。

 

 =========================================問題:Node 172.20.0.3:7001 is not empty. Either the node already knows other nodes (check with CLUSTER NODES) or contains some key in database 0=======================

在執行第3點,啟動ruby來實現集群的腳本后,出現這個問題

參考地址:https://blog.csdn.net/vtopqx/article/details/50235737

第一步:

刪除7000-7005每個目錄下的data目錄下的.aof和nodes.conf文件 還有.rdb后綴的文件(網上方法有第三個文件,我這里暫時沒有)

 

第二步:使用桌面文件分別連接7001-7005

然后指定flushdb,清除數據庫中的鍵

 

 

第三步:非常重要,就是執行完成第二步以后,就依次關閉移除所有redis容器並重啟所有的redis容器,否則就算你執行腳本也一定不會成功

 

第四步:重新執行啟動ruby來實現集群的腳本即可!!

 

 

=====================================================================================

 

參考文檔 :

redis 3.0配置文件詳細配置說明


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM