Docker swarm 配置 redis 高可用 哨兵模式
一,环境准备条件
docker版本 :Docker version 20.10.1, build 831ebea
mongodb版本:4.2.7
服务器版本:CentOS Linux release 7.7.1908 (Core)
1,准备三台服务器互相可以访问
例如:
10.11.32.25
10.11.32.26
10.11.32.27
2,三台服务器都要安装docker 环境
配置 daemon.conf
三台服务器都要创建 docker.service 文件 ,具体内容见附录
vi /lib/systemd/system/docker.service
重启docker
systemctl daemon-reload
systemctl restart docker
3,redis 集群架构
二,创建swarm 集群及集群网络
1,在一台服务器上创建swarm 集群
docker swarm init --advertise-addr 10.11.32.25(本机ip)
在其它两台服务器执行加入swarm集群
docker swarm join --token SWMTKN-1-42w2dmkv2u18k9d6vi65rhqggjcqcc31iijnecd4bbi43bmom2-b3o89g28thkcken0v3qxtczuj 172.16.10.85:2377
忘记token 执行以下命令
docker swarm join-token manager 查看加入manager的命令
查看集群关系
docker node ls
管理节点:赋值其他工作节点为管理节点
docker node promote 工作节点主机名1
docker node promote 工作节点主机名2
2,manager节点创建集群网络**
docker network create -d overlay --attachable GIE-IOT-mongodbs
--attachable 允许其他容器加入此网络
查看集群网络
docker network ls
三,配置mongodb高可用步骤
1,初始化目录创建yml文件
所有服务器创建相创建相关目录
mkdir -pv /data/docker/composes/prod/middleware/redis_cluster/redis1/{conf,data,logs}
mkdir -pv /data/docker/composes/prod/middleware/redis_cluster/redis2/{conf,data,logs}
mkdir -pv /data/docker/composes/prod/middleware/redis_cluster/redis3/{conf,data,logs}
mkdir -pv /data/docker/composes/prod/middleware/redis_cluster/sentinel1/{conf,data,logs}
mkdir -pv /data/docker/composes/prod/middleware/redis_cluster/sentinel2/{conf,data,logs}
mkdir -pv /data/docker/composes/prod/middleware/redis_cluster/sentinel3/{conf,data,logs}
leader服务器创建 docker-compose-redis-cluster.yml文件
version: '3.8'
services:
redis1:
image: 10.11.32.23:5000/redis:v5.0.10
environment:
TZ: "Asia/Shanghai"
ports:
- target: 6379
published: 6379
protocol: tcp
mode: host
volumes:
- /data/docker/composes/prod/middleware/redis_cluster/redis1/data:/data
- /data/docker/composes/prod/middleware/redis_cluster/redis1/conf:/conf
networks:
- GIE-IOT-mongodbs
deploy:
replicas: 1
placement:
constraints:
- node.hostname == GIE-EC-Node03
sysctls:
net.core.somaxconn: '511'
command: >
bash -c "if [ ! -f /conf/redis.conf ];then
echo 'port 6379' > /conf/redis.conf ;
echo 'bind 0.0.0.0' >> /conf/redis.conf ;
echo 'slave-announce-ip 10.11.32.25' >> /conf/redis.conf ;
echo 'slave-announce-port 6379' >> /conf/redis.conf ;
echo 'masterauth 123456' >> /conf/redis.conf;
echo 'requirepass 123456' >> /conf/redis.conf ;
echo 'appendonly yes' >> /conf/redis.conf ; fi &&
redis-server /conf/redis.conf"
# 行1:如果redis.conf不存在
# 行2-8:新建redis.conf文件,并写入配置信息
# 行9:启动redis实例
redis2:
image: 10.11.32.23:5000/redis:v5.0.10
environment:
TZ: "Asia/Shanghai"
ports:
- target: 6379
published: 6379
protocol: tcp
mode: host
volumes:
- /data/docker/composes/prod/middleware/redis_cluster/redis2/data:/data
- /data/docker/composes/prod/middleware/redis_cluster/redis2/conf:/conf
networks:
- GIE-IOT-mongodbs
depends_on:
- redis1
deploy:
replicas: 1
placement:
constraints:
- node.hostname == GIE-EC-Node04
sysctls:
net.core.somaxconn: '511'
command: >
bash -c "if [ ! -f /conf/redis.conf ];then
echo 'port 6379' > /conf/redis.conf ;
echo 'bind 0.0.0.0' >> /conf/redis.conf ;
echo 'slave-announce-ip 10.11.32.26' >> /conf/redis.conf ;
echo 'slave-announce-port 6379' >> /conf/redis.conf ;
echo 'masterauth 123456' >> /conf/redis.conf;
echo 'requirepass 123456' >> /conf/redis.conf ;
echo 'replicaof 10.11.32.25 6379' >> /conf/redis.conf ;
echo 'appendonly yes' >> /conf/redis.conf ; fi &&
redis-server /conf/redis.conf"
redis3:
image: 10.11.32.23:5000/redis:v5.0.10
environment:
TZ: "Asia/Shanghai"
ports:
- target: 6379
published: 6379
protocol: tcp
mode: host
volumes:
- /data/docker/composes/prod/middleware/redis_cluster/redis3/data:/data
- /data/docker/composes/prod/middleware/redis_cluster/redis3/conf:/conf
networks:
- GIE-IOT-mongodbs
depends_on:
- redis1
deploy:
replicas: 1
placement:
constraints:
- node.hostname == GIE-EC-Node05
sysctls:
net.core.somaxconn: '511'
command: >
bash -c "if [ ! -f /conf/redis.conf ];then
echo 'port 6379' > /conf/redis.conf ;
echo 'bind 0.0.0.0' >> /conf/redis.conf ;
echo 'slave-announce-ip 10.11.32.27' >> /conf/redis.conf ;
echo 'slave-announce-port 6379' >> /conf/redis.conf ;
echo 'masterauth 123456' >> /conf/redis.conf;
echo 'requirepass 123456' >> /conf/redis.conf ;
echo 'replicaof 10.11.32.25 6379' >> /conf/redis.conf ;
echo 'appendonly yes' >> /conf/redis.conf ; fi &&
redis-server /conf/redis.conf"
sentinel1:
image: 10.11.32.23:5000/redis:v5.0.10
environment:
TZ: "Asia/Shanghai"
ports:
- target: 26379
published: 26379
protocol: tcp
mode: host
depends_on:
- redis1
- redis2
- redis3
volumes:
- /data/docker/composes/prod/middleware/redis_cluster/sentinel1/data:/data
- /data/docker/composes/prod/middleware/redis_cluster/sentinel1/conf:/conf
networks:
- GIE-IOT-mongodbs
deploy:
replicas: 1
placement:
constraints:
- node.hostname == GIE-EC-Node03
sysctls:
net.core.somaxconn: '511'
command: >
bash -c "if [ ! -f /conf/sentinel.conf ];then
echo 'port 26379' > /conf/sentinel.conf ;
echo 'sentinel announce-ip 10.11.32.25' >> /conf/sentinel.conf ;
echo 'sentinel monitor mymaster 10.11.32.25 6379 2' >> /conf/sentinel.conf ;
echo 'sentinel auth-pass mymaster 123456' >> /conf/sentinel.conf ; fi &&
redis-server /conf/sentinel.conf --sentinel"
# 行1:如果sentinel.conf不存在
# 行2-5:新建sentinel.conf文件,并写入配置信息
# 行6:启动sentinel实例
sentinel2:
image: 10.11.32.23:5000/redis:v5.0.10
environment:
TZ: "Asia/Shanghai"
ports:
- target: 26379
published: 26379
protocol: tcp
mode: host
depends_on:
- redis1
- redis2
- redis3
volumes:
- /data/docker/composes/prod/middleware/redis_cluster/sentinel2/data:/data
- /data/docker/composes/prod/middleware/redis_cluster/sentinel2/conf:/conf
networks:
- GIE-IOT-mongodbs
deploy:
replicas: 1
placement:
constraints:
- node.hostname == GIE-EC-Node04
sysctls:
net.core.somaxconn: '511'
command: >
bash -c "if [ ! -f /conf/sentinel.conf ];then
echo 'port 26379' > /conf/sentinel.conf ;
echo 'sentinel announce-ip 10.11.32.26' >> /conf/sentinel.conf ;
echo 'sentinel monitor mymaster 10.11.32.25 6379 2' >> /conf/sentinel.conf ;
echo 'sentinel auth-pass mymaster 123456' >> /conf/sentinel.conf ; fi &&
redis-server /conf/sentinel.conf --sentinel"
sentinel3:
image: 10.11.32.23:5000/redis:v5.0.10
environment:
TZ: "Asia/Shanghai"
ports:
- target: 26379
published: 26379
protocol: tcp
mode: host
depends_on:
- redis1
- redis2
- redis3
volumes:
- /data/docker/composes/prod/middleware/redis_cluster/sentinel3/data:/data
- /data/docker/composes/prod/middleware/redis_cluster/sentinel3/conf:/conf
networks:
- GIE-IOT-mongodbs
deploy:
replicas: 1
placement:
constraints:
- node.hostname == GIE-EC-Node05
sysctls:
net.core.somaxconn: '511'
command: >
bash -c "if [ ! -f /conf/sentinel.conf ];then
echo 'port 26379' > /conf/sentinel.conf ;
echo 'sentinel announce-ip 10.11.32.27' >> /conf/sentinel.conf ;
echo 'sentinel monitor mymaster 10.11.32.25 6379 2' >> /conf/sentinel.conf ;
echo 'sentinel auth-pass mymaster 123456' >> /conf/sentinel.conf ; fi &&
redis-server /conf/sentinel.conf --sentinel"
networks:
GIE-IOT-mongodbs:
external: true
启动服务,在 manager上执行
docker stack deploy -c docker-compose-mongo-cluster.yml mongo
在 manager查看服务的启动情况
docker service ls
2, 查看是否配置成功
登录任意一台服务器通过客户端访问redis
例如: 10.11.32.26
docker exec -it redis_cluster_redis2 redis-cli
执行 输入密码
127.0.0.1:6379> auth 123456
执行 info 可以查看主从信息
127.0.0.1:6379> info
其它服务器用同样的方法查看发现是 slave
3, 测试数据是否同步,主节点挂掉从节点是否顶替主机节点
删除redis主节点
docker service rm [主节点serviceId]
访问从节点发现有一个从节点已经成为 master
127.0.0.1:6379> info 查看
已经测试过,这里就赘述了。
附录
参考文档
www.cnblogs.com/aspirant/p/… yml文件说明