參考地址: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來實現集群的腳本即可!!
=====================================================================================
參考文檔 :