docker-compose搭建redis僞集羣
1、端口的安排
搭建三主三從,所以需要6個端口
server_ip=192.168.43.23(自己的主機的ip地址)
master-1:16379
master-2:16380
master-3:16381
slave-1:16389
slave-2:16390
slave-3:16391
這裏雖然用到了6個端口,其實還需要佔用3個集羣總線的端口,就是master的端口+1000,也就是26379,26380,26381端口,需要查看端口是否被佔用以及防火牆是否開啓
2、創建文件及文件夾
(1)創建/docer-data/redis-cluster
我的所有的redis集羣的文件都是放到該文件夾下面的,裏面包含如下內容:
文件:docker-compose.yaml
文件夾:master-1、master-2、master-3、slave-1、slave-2、slave-3
其中,docker-compose.yaml是docker-compose啓動redis集羣的配置文件
下面的文件夾,是存放每個redis服務的資源以及生成數據或者log等
(2)文件內容
docker-compose.yaml
version: '3'
services:
master-1:
container_name: master-1
image: redis:5.0.8
command: redis-server /etc/usr/local/redis.conf
network_mode: "host"
restart: always
volumes:
- ./master-1/redis.conf:/etc/usr/local/redis.conf
- ./master-1/redis.log:/usr/local/redis/logs/redis-server.log
- ./master-1/data:/data
master-2:
container_name: master-2
command: redis-server /etc/usr/local/redis.conf
image: redis:5.0.8
network_mode: "host"
restart: always
volumes:
- ./master-2/redis.conf:/etc/usr/local/redis.conf
- ./master-2/redis.log:/usr/local/redis/logs/redis-server.log
- ./master-2/data:/data
master-3:
container_name: master-3
image: redis:5.0.8
command: redis-server /etc/usr/local/redis.conf
network_mode: "host"
restart: always
volumes:
- ./master-3/redis.conf:/etc/usr/local/redis.conf
- ./master-3/redis.log:/usr/local/redis/logs/redis-server.log
- ./master-3/data:/data
slave-1:
container_name: slave-1
image: redis:5.0.8
command: redis-server /etc/usr/local/redis.conf
network_mode: "host"
restart: always
volumes:
- ./slave-1/redis.conf:/etc/usr/local/redis.conf
- ./slave-1/redis.log:/usr/local/redis/logs/redis-server.log
- ./slave-1/data:/data
slave-2:
container_name: slave-2
image: redis:5.0.8
command: redis-server /etc/usr/local/redis.conf
network_mode: "host"
restart: always
volumes:
- ./slave-2/redis.conf:/etc/usr/local/redis.conf
- ./slave-2/redis.log:/usr/local/redis/logs/redis-server.log
- ./slave-2/data:/data
slave-3:
container_name: slave-3
image: redis:5.0.8
command: redis-server /etc/usr/local/redis.conf
network_mode: "host"
restart: always
volumes:
- ./slave-3/redis.conf:/etc/usr/local/redis.conf
- ./slave-3/redis.log:/usr/local/redis/logs/redis-server.log
- ./slave-3/data:/data
上面的配置文件注意一下幾點:
1、網絡模式使用host模式
2、需要在指定的宿主機創建文件,如redis.conf、redis.log,上面的volumes上面已經指定好了創建在宿主機的路徑,每個redis實例都需要創建,所以需要創建6個(三主三從)
其中redis.conf的可以從其他的redis中copy一份過來,在上面只需要修改如下幾項即可
port 16379 #這裏填每臺redis的端口號
bind 0.0.0.0 #綁定ip 0.0.0.0 指可以外網訪問
cluster-enabled yes #開啓集羣
logfile "/usr/local/redis/logs/redis-server.log" #指定日誌文件
requirepass htl123456 #密碼
特別留意端口,上面的端口配置與前面端口安排是一致的
輸入docker-compose up -d
如果沒有意外的話6個redis實例會成功啓動,嘗試是否能夠連接,如果不能連接需要自己查看日誌,排查問題
3、構建集羣
上面的步驟如果都成功了,僅僅說明是搭建了6個redis的實例,但是之間沒有任何聯繫,下面就是如果使他們構建集羣
docker exec -it master-1 redis-cli -h <server_ip> -p 16379 -a htl123456 --cluster create <server_ip>:16379 <server_ip>:16380 <server_ip>:16381 <server_ip>:16389 <server_ip>:16390 <server_ip>:16391 --cluster-replicas 1
上面的docker命令不能直接使用,需要給<server_ip>具體值,另外端口要根據自己上面安排的端口設計,以及密碼。最後就是如果運行失敗了,那麼久看看是不是格式錯誤(空格啥的)
如果出現上圖,那麼恭喜你,搭建完成
我們可以使用下面的語句測試一下
docker exec -it master-1 redis-cli -c -p16379 -a htl123456
坑:
一直顯示:waiting for the cluster to join…
開始以爲是分槽需要那麼多時間,後來運行了幾個小時,還是這樣顯示
原來有redis集羣總線的概念:redis集羣總線端口爲redis客戶端端口加上10000,比如說你的redis 6379端口爲客戶端通訊端口,那麼16379端口爲集羣總線端口
我搭建的redis集羣中端口號是從 16379 ~ 16381爲主節點端口, 16389~16391 從節點端口,這裏需要將主端口+10000端口防火牆開放(我是用了阿里雲的服務器,需要開放端口,如果是虛擬機可以直接關閉防火牆)