docker-compose部署Redis-Cluster集群
環境安裝
linux :centos 7?
docker :19.03.3
docker-compose:1.24.1
創建目錄和編排文件
1.在工作目錄下創建目錄redis
2.然后分別創建文件夾?6000-6005(以節點端口號命名的)
3.創建 docker-compose.yaml 文件
4.在各個端口目錄下創建data目錄和redis.conf配置文件
創建完成目錄結構如下:
redis目錄結構
各個端口目錄結構,比如6000目錄下
編寫redis.conf 配置文件
#端口 port 6000##run in background 必須是no daemonize no##enable redis-cluster cluster-enabled yes##cluster node config file name cluster-config-file nodes_6000.conf## timeout tcp-keepalive 300 timeout 0##aof appendonly yes#當daemonize = yes時候才會生效 pidfile /var/run/redis_6000.pid#log #日志等級 loglevel notice #日志文件存放路徑 logfile "redis_6000.log"#集群對外ip cluster-announce-ip 機器ip每個節點的配置只需改變端口。
docker-compose.yaml?配置文件
version: '3.4' services:node1:image: redis:5.0.5container_name: redis-node1restart: alwaysports:- 6000:6000- 16000:16000volumes:- /home/gwms/redis/6000/data:/data- /home/gwms/redis/6000:/usr/local/etc/rediscommand:redis-server /usr/local/etc/redis/redis.confnode2:image: redis:5.0.5container_name: redis-node2restart: alwaysports:- 6001:6001- 16001:16001volumes:- /home/gwms/redis/6001/data:/data- /home/gwms/redis/6001:/usr/local/etc/rediscommand:redis-server /usr/local/etc/redis/redis.confnode3:image: redis:5.0.5container_name: redis-node3restart: alwaysports:- 6002:6002- 16002:16002volumes:- /home/gwms/redis/6002/data:/data- /home/gwms/redis/6002:/usr/local/etc/rediscommand:redis-server /usr/local/etc/redis/redis.confnode4:image: redis:5.0.5container_name: redis-node4restart: alwaysports:- 6003:6003- 16003:16003volumes:- /home/gwms/redis/6003/data:/data- /home/gwms/redis/6003:/usr/local/etc/rediscommand:redis-server /usr/local/etc/redis/redis.confnode5:image: redis:5.0.5container_name: redis-node5restart: alwaysports:- 6004:6004- 16004:16004volumes:- /home/gwms/redis/6004/data:/data- /home/gwms/redis/6004:/usr/local/etc/rediscommand:redis-server /usr/local/etc/redis/redis.confnode6:image: redis:5.0.5container_name: redis-node6restart: alwaysports:- 6005:6005- 16005:16005volumes:- /home/gwms/redis/6005/data:/data- /home/gwms/redis/6005:/usr/local/etc/rediscommand:redis-server /usr/local/etc/redis/redis.conf編寫完成后,在redis目錄下 執行?docker-compose up -d?啟動容器。然后通過docker ps 命令查看redis進程是否正常,我在安裝時候遇到一些坑,下文我會詳細描述。?
狀態是up 就是啟動正常了。
創建集群
目前只是啟動了六個實例,并沒有組成集群。
進入任意一個Redis節點容器,命令如下:
docker exec -it redis-node1 bash
繼續執行以下命令創建集群:
redis-cli --cluster create ip:6000 ip:6001 ip:6002 ip:6003 ip:6004 ip:6005 --cluster-replicas 1其中ip 為服務器ip
命令執行結果如下:遇到yes 選擇yes。
Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe. >>> Performing hash slots allocation on 6 nodes... Master[0] -> Slots 0 - 5460 Master[1] -> Slots 5461 - 10922 Master[2] -> Slots 10923 - 16383 Adding replica 10.35.30.39:6375 to 10.35.30.39:6371 Adding replica 10.35.30.39:6376 to 10.35.30.39:6372 Adding replica 10.35.30.39:6374 to 10.35.30.39:6373 >>> Trying to optimize slaves allocation for anti-affinity [WARNING] Some slaves are in the same host as their master M: e9a35d6a9d203830556de89f06a3be2e2ab4eee1 10.35.30.39:6371slots:[0-5460] (5461 slots) master M: 0c8755144fe6a200a46716371495b04f8ab9d4c8 10.35.30.39:6372slots:[5461-10922] (5462 slots) master M: fcb83b0097d2a0a87a76c0d782de12147bc86291 10.35.30.39:6373slots:[10923-16383] (5461 slots) master S: b9819797e98fcd49f263cec1f77563537709bcb8 10.35.30.39:6374replicates fcb83b0097d2a0a87a76c0d782de12147bc86291 S: f4660f264f12786d81bcf0b18bc7287947ec8a1b 10.35.30.39:6375replicates e9a35d6a9d203830556de89f06a3be2e2ab4eee1 S: d2b9f265ef7dbb4a612275def57a9cc24eb2fd5d 10.35.30.39:6376replicates 0c8755144fe6a200a46716371495b04f8ab9d4c8 Can I set the above configuration? (type 'yes' to accept): yes # 這里輸入 yes 并回車 確認節點 主從身份 以及 哈希槽的分配 >>> Nodes configuration updated >>> Assign a different config epoch to each node >>> Sending CLUSTER MEET messages to join the cluster Waiting for the cluster to join . >>> Performing Cluster Check (using node 10.35.30.39:6371) M: e9a35d6a9d203830556de89f06a3be2e2ab4eee1 10.35.30.39:6371slots:[0-5460] (5461 slots) master1 additional replica(s) M: 0c8755144fe6a200a46716371495b04f8ab9d4c8 10.35.30.39:6372slots:[5461-10922] (5462 slots) master1 additional replica(s) S: b9819797e98fcd49f263cec1f77563537709bcb8 10.35.30.39:6374slots: (0 slots) slavereplicates fcb83b0097d2a0a87a76c0d782de12147bc86291 M: fcb83b0097d2a0a87a76c0d782de12147bc86291 10.35.30.39:6373slots:[10923-16383] (5461 slots) master1 additional replica(s) S: f4660f264f12786d81bcf0b18bc7287947ec8a1b 10.35.30.39:6375slots: (0 slots) slavereplicates e9a35d6a9d203830556de89f06a3be2e2ab4eee1 S: d2b9f265ef7dbb4a612275def57a9cc24eb2fd5d 10.35.30.39:6376slots: (0 slots) slavereplicates 0c8755144fe6a200a46716371495b04f8ab9d4c8 [OK] All nodes agree about slots configuration. >>> Check for open slots... >>> Check slots coverage... [OK] All 16384 slots covered.到目前為止集群就搭建完畢了,進入任意一個容器執行如下命令,查看集群狀態
1.docker exec -it redis-node1 /bin/bash
2.redis-cli -p 6000 -h 173.17.0.1 cluster info
此時集群狀態是 ok ,節點數也是正常的。
遇到的坑
1.redis.conf 配置文件中 daemonize 如果為yes會和?docker-compose.yaml中restart: always配置沖突,導致 執行 docker-compose up -d 命令后通過 docker ps查看redis進程一直在restaring中。
2.redis.conf 配置文件中“cluster-config-file” 和 “logfile”,之前配置了子目錄,如下:
cluster-config-file config/nodes_6000.conf logfile "log/redis_6000.log"這樣也同樣會導致,啟動時候無限重啟的問題,目前我不知道怎么解決,只好去除了子目錄。
這個大家有啥解決方案嗎,希望大佬們留言告訴我。
去除子目錄后,生成的這些文件都在容器的/data目錄下,由于我們在docker-compose.yaml中對磁盤做了如下映射:
volumes:- /home/gwms/redis/6000/data:/data所以這些生成的文件,我們可以在宿主機中的redis-> 端口文件夾->data中找到。
3.cluster-announce-ip 配置
第一次該配置沒有寫,結果是集群創建后,節點1 使用的是機器ip,而其他節點使用的是br-2a8667af806這個網卡的ip,導致的問題是,當客戶端連接reids服務后,你設置一個key,如果路由到其他節點,此時連接的ip 會變成 該網卡的ip,從而客戶端無法連接上,我們期望的是,路由后的節點ip依舊是是機器ip,所以我在redis.conf中加入了該配置,代表各個節點對外的ip地址是多少,從而解決了相關問題。
spring boot 集成redis
spring boot 項目中集成redis集群配置,進行簡單的測試。
額外說明
?1.restart: always 表示docker重啟后,容器跟著一起重啟,相當于開機啟動。
2.boot 項目如果我們用了連接池,并且我們設置了:“連接池中的最小空閑連接”,那么服務啟動完成后短暫延遲會會和各個節點創建 我們設置數量的連接,如果節點最大連接數 小于我們配置數,那么能創建多少創建多少。
總結
以上是生活随笔為你收集整理的docker-compose部署Redis-Cluster集群的全部內容,希望文章能夠幫你解決所遇到的問題。
 
                            
                        - 上一篇: 以连边为中心的功能连接用于个体识别
- 下一篇: PDF文件有修改权限如何取消
