裡面放了 docker-compose 所需的 docker-compose.yml 檔和一個名為 redis
的資料夾,
在 redis 的資料夾中放置 Redis node 所需的 redis.conf 客制設定檔
和 docker service 的 Dockerfile 設定檔。
在 redis 的資料夾中放置 Redis node 所需的 redis.conf 客制設定檔
和 docker service 的 Dockerfile 設定檔。
以下是各檔的內容 (以 Redis Cluster Test 為專案根目錄):
/redis/Dockerfile:
/redis/Dockerfile:
FROM redis COPY redis.conf /usr/local/etc/redis/redis.conf CMD [ "redis-server", "/usr/local/etc/redis/redis.conf" ]裡面把 redis.conf 放至 Docker container 中,並指定了使用 redis.conf 執行 redis-server 啟動 Redis 服務。
/redis/redis.conf:
cluster-enabled yes
裡面的內容很簡單,只有一行,使用 cluster-enabled yes 開啟 Cluster 功能。
/docker-compose.yml:
version: '3.4'
services:
redis-node-1:
build: ./redis
container_name: redis-node-1
ports:
- 6379:6379
- 16379:16379
entrypoint: [redis-server, /usr/local/etc/redis/redis.conf, --port,"6379", --cluster-announce-ip, "<your server IP or hostname>"]
redis-node-2:
build: ./redis
container_name: redis-node-2
ports:
- 6380:6380
- 16380:16380
entrypoint: [redis-server, /usr/local/etc/redis/redis.conf, --port,"6380", --cluster-announce-ip, "<your server IP or hostname>"]
redis-node-3:
build: ./redis
container_name: redis-node-3
ports:
- 6381:6381
- 16381:16381
entrypoint: [redis-server, /usr/local/etc/redis/redis.conf, --port,"6381", --cluster-announce-ip, "<your server IP or hostname>"]
redis-node-4:
build: ./redis
container_name: redis-node-4
ports:
- 6382:6382
- 16382:16382
entrypoint: [redis-server, /usr/local/etc/redis/redis.conf, --port,"6382", --cluster-announce-ip, "<your server IP or hostname>"]
redis-node-5:
build: ./redis
container_name: redis-node-5
ports:
- 6383:6383
- 16383:16383
entrypoint: [redis-server, /usr/local/etc/redis/redis.conf, --port,"6383", --cluster-announce-ip, "<your server IP or hostname>"]
redis-node-6:
build: ./redis
container_name: redis-node-6
ports:
- 6384:6384
- 16384:16384
entrypoint: [redis-server, /usr/local/etc/redis/redis.conf, --port,"6384", --cluster-announce-ip, "<your server IP or hostname>"]
redis-cluster-creator:
image: redis
container_name: redis-cluster-creator
entrypoint: [/bin/sh, -c, 'echo "yes" | redis-cli --cluster create host.docker.internal:6379 host.docker.internal:6380 host.docker.internal:6381 host.docker.internal:6382 host.docker.internal:6383 host.docker.internal:6384 --cluster-replicas 1']
depends_on:
- redis-node-1
- redis-node-2
- redis-node-3
- redis-node-4
- redis-node-5
- redis-node-6
在 docker-compose.yml 中,設置了 6 個 Redis node 作為 Redis Cluster 之用,
6 個 Redis node 全部都是使用同一個 Dockerfile 和 redis.conf 所建構出來的,
6 個 Redis node 全部都是使用同一個 Dockerfile 和 redis.conf 所建構出來的,
這邊要注意的是 ports 需要向外開放兩個 port,
第一個 port 是用來跟 client 端通信的,例如 6379、6380 等,這是我們平常要登入 Redis 時會用到的 port,暫且稱做 client port 好了。
第二個 port 官方名字叫做 Cluster bus port, 是用來讓 Redis node 跟 node 之間通信用的,預設為 client port 再加上 10000,不過也可以在 redis.conf 檔裡用 cluster-port 參數來修改,
可參考官方的說明: Scaling with Redis Cluster 。
第一個 port 是用來跟 client 端通信的,例如 6379、6380 等,這是我們平常要登入 Redis 時會用到的 port,暫且稱做 client port 好了。
第二個 port 官方名字叫做 Cluster bus port, 是用來讓 Redis node 跟 node 之間通信用的,預設為 client port 再加上 10000,不過也可以在 redis.conf 檔裡用 cluster-port 參數來修改,
可參考官方的說明: Scaling with Redis Cluster 。
<your server IP or hostname> 請用 docker 所在的 server host IP 或 hostname 來取代,
測試時可用 host.docker.internal (在 docker container 中可用此 hostname 連上 server host) 來測試 (實務上請用真正的 IP 或 hostname)。
測試時可用 host.docker.internal (在 docker container 中可用此 hostname 連上 server host) 來測試 (實務上請用真正的 IP 或 hostname)。
redis-cluster-creator 只是一個用來執行完 Redis Cluster 設置建立 Cluster 後就關掉的 docker service,
使用 depends_on 等待各 Redis node 啟動完成後,便會執行以下命令:
echo "yes" | redis-cli --cluster create host.docker.internal:6379 host.docker.internal:6380 host.docker.internal:6381 host.docker.internal:6382 host.docker.internal:6383 host.docker.internal:6384 --cluster-replicas 1
以上命令相當於是先執行了
redis-cli --cluster create host.docker.internal:6379 host.docker.internal:6380 host.docker.internal:6381 host.docker.internal:6382 host.docker.internal:6383 host.docker.internal:6384 --cluster-replicas 1
再執行手動輸入的 yes,因為 redis-cli --cluster create 執行中會詢問
Can I set the above configuration? (type 'yes' to accept):
需要手動輸入 yes 才能繼續下去。
使用 depends_on 等待各 Redis node 啟動完成後,便會執行以下命令:
echo "yes" | redis-cli --cluster create host.docker.internal:6379 host.docker.internal:6380 host.docker.internal:6381 host.docker.internal:6382 host.docker.internal:6383 host.docker.internal:6384 --cluster-replicas 1
以上命令相當於是先執行了
redis-cli --cluster create host.docker.internal:6379 host.docker.internal:6380 host.docker.internal:6381 host.docker.internal:6382 host.docker.internal:6383 host.docker.internal:6384 --cluster-replicas 1
再執行手動輸入的 yes,因為 redis-cli --cluster create 執行中會詢問
Can I set the above configuration? (type 'yes' to accept):
需要手動輸入 yes 才能繼續下去。
redis-cli --cluster create 是建立 cluster 的指令,它將各 Redis node 連結起來成為 Cluster,
參數意義如下:
參數意義如下:
redis-cli --cluster create <node-1 IP or hostname:<port> <node-2 IP or hostname:<port> ....<可多個 Redis node>...... --cluster-replicas <一個 Redis master node 要有幾個依附的 Redis slave node>
它會自己選擇哪些要做為 Redis master node,哪些要做為 Redis slave node。
參考資料:

沒有留言 :
張貼留言