說明
根據官方文件 Redis Sentinel Documentation 中的 Example 2: basic setup with three boxes 示例建立的例項,但因為是單機部署,所以不滿足 Redis 例項 與 Sentinel 例項分別處於 3 臺機器的要求,因此僅用於開發環境測試與學習。
使用方法
-
使用
docker-compose up -d
部署執行。 -
使用
docker-compose pause master
可以模擬對應的 Redis 例項不可用。 -
使用
docker-compose pause sentinel-1
可以模擬對應的 Sentinel 例項不可用。 -
使用
docker-compose unpause service_name
將暫停的容器恢復執行。 -
使用支援 Sentinel 的客戶端連線
localhost:62379
進行應用測試。
注:Windows 和 Mac 可能需要修改 Volumes
掛載引數。
注意事項
Sentinel, Docker, NAT, and possible issues
將容器埠 EXPOSE
時,Sentinel 所發現的 master/slave 連線資訊(IP 和 埠)對客戶端來說不一定可用。
例如:將 Reids 例項埠 6379
EXPOSE
為 16379
, Sentinel 容器使用 LINK
的方式訪問 Redis 容器,那麼對於 Sentinel 容器 6379
埠是可用的,但對於外部客戶端是不可用的。
解決方法是 EXPOSE
埠時保持內外埠一致,或者使用 host
網路執行容器。如果你想使用本專案中的編排檔案部署的叢集對外部可用,那麼只能將 Redis 容器執行在 host
網路之上。
注:實際上 bridge
模式下 Redis 效能也會受到影響。
檔案結構
.
├── docker-compose.yaml
├── nginx
│ └── nginx.conf
├── README.md
├── .env
└── sentinel
├── docker-entrypoint.sh
├── Dockerfile-sentinel
└── sentinel.conf.sample
複製程式碼
Sentinel
映象使用 Dockerfile-sentinel
構建,執行時根據環境變數生成 sentinel.conf
檔案,詳細配置說明請檢視 sentinel.conf.sample
內容。
docker-entrypoint.sh
使用 Reids 官方映象中的 docker-entrypoint.sh
指令碼修改而來,新增了生成 sentienl.conf
語句。
...
# create sentinel.conf
if [ ! -e ${SENTINEL_CONF_PATH} ]; then
envsubst < /etc/redis/sentinel.conf.sample > ${SENTINEL_CONF_PATH}
chown redis:redis /etc/redis/sentinel.conf
fi
...
複製程式碼
修改配置 Sentinel 的環境變數後需要重新建立容器才能生效。
可用環境變數
SENTINEL_CONF_PATH=/etc/redis/sentinel.conf
SENTINEL_PORT=26379
SENTINEL_MASTER_NAME=redis-master
SENTINEL_REDIS_IP=127.0.0.1
SENTINEL_REDIS_PORT=6379
SENTINEL_REDIS_PWD=
SENTINEL_QUORUM=2
SENTINEL_DOWN_AFTER=30000
SENTINEL_PARALLEL_SYNCS=1
SENTINEL_FAILOVER_TIMEOUT=180000
複製程式碼
docker-compose.yaml
可以使用 docker-compose config
可檢視完整的編排內容。
Redis 例項執行引數
詳細可用引數請檢視官方示例檔案 Redis Configuration File Example,需要注意 port
引數需要與編排中的 PORTS
保持一致,或修改編排檔案讓容器網路使用 host
模式。
由於 master 會被 Sentinel 切換為 slave ,因此最好保持每個 Redis 例項的口令一致。
master:
image: redis:4.0.8-alpine
ports:
- 6379:6379
volumes:
- type: volume
source: master-data
target: /data
command: [
'--requirepass "${REDIS_PWD}"',
'--masterauth "${REDIS_PWD}"',
'--maxmemory 512mb',
'--maxmemory-policy volatile-ttl',
'--save ""',
]
複製程式碼
Sentinel 例項執行引數
詳細可用引數請檢視 sentinel 目錄下的 sentinel.conf.sample
檔案。由於容器使用的配置檔案是執行時根據環境變數生成的,因此使用 environment
進行配置,可用環境變數請檢視文件 Sentinel 部分。
最後使用了 Nginx 作為 Sentinel 例項的代理,因此 Sentinel 容器不需要對外訪問。
sentinel-1: &sentinel
build:
context: ./sentinel
dockerfile: Dockerfile-sentinel
image: redis-sentinel:dev
environment:
- SENTINEL_REDIS_PWD=${REDIS_PWD}
- SENTINEL_REDIS_IP=${SENTINEL_MASTER_NAME}
- SENTINEL_QUORUM=2
- SENTINEL_DOWN_AFTER=3000
command: [
'${SENTINEL_CONF_PATH}',
'--sentinel'
]
depends_on:
- master
- node-1
- node-2
links:
- master:${SENTINEL_MASTER_NAME}
- node-1
- node-2
sentinel-2:
<<: *sentinel
sentinel-3:
<<: *sentinel
複製程式碼
Nginx
使用 Nginx 作為 Sentinel 負載均衡以及高可用代理。
nginx:
image: nginx:1.13.9-alpine
ports:
- 26379:26379
volumes:
- type: bind
source: ./nginx/nginx.conf
target: /etc/nginx/nginx.conf
read_only: true
depends_on:
- sentinel-1
- sentinel-2
- sentinel-3
複製程式碼
修改 nginx 目錄下的 nginx.conf
進行配置。
...
stream {
server {
listen 26379;
proxy_pass redis_sentinel;
}
upstream redis_sentinel {
server sentinel-1:26379;
server sentinel-2:26379;
server sentinel-3:26379;
}
}
...
複製程式碼