我有一台以群集模式运行的主机。我现在在单机上运行它,没有群集(没有多台机器)。
服务运行正常。我已经为mysql容器创建了一个卷。我相信,在缩放mysql容器时,它们都会从同一卷中读取。
这是docker-compose。哪个很好,没有mysql连接问题,但是当我将mysql容器缩放到2时
version: "3.4"
services:
node:
image: prod_engineering_node:v7
networks:
- backend
volumes:
- ./codebase:/usr/src/app
ports:
- "8082:8082"
depends_on:
- engineeringmysql
deploy:
mode: replicated
replicas: 1
placement:
constraints:
- node.role == manager
mysql:
image: prod_engineering_mysql:v1
command: mysqld --default-authentication-plugin=mysql_native_password
networks:
- backend
ports:
- "3309:3306"
environment:
MYSQL_ROOT_PASSWORD: main_pass
MYSQL_DATABASE: engineering
MYSQL_USER: user
MYSQL_PASSWORD: pass
volumes:
- ./sqldata:/var/lib/mysql:rw
deploy:
mode: replicated
replicas: 1
placement:
constraints:
- node.role == manager
nginx:
image: prod_engineering_nginx:v1
ports:
- "80:80"
- "443:443"
volumes:
- ./angular_build:/var/www/html/studydote_v2/frontend:rw
- ./laravel_admin:/var/www/html/dev/backend/public:rw
networks:
- backend
depends_on:
- engineeringphpfpm
deploy:
mode: replicated
replicas: 1
placement:
constraints:
- node.role == manager
phpfpm:
image: prod_engineering_phpfpm:v1
ports:
- "9001:9000"
depends_on:
- engineeringmysql
networks:
- backend
volumes:
- ./angular_build:/var/www/html/studydote_v2/frontend:rw
- ./laravel_admin:/var/www/html/dev/backend/public:rw
deploy:
mode: replicated
replicas: 1
placement:
constraints:
- node.role == manager
networks:
backend:
driver: overlay
这是我缩放mysql容器的方式。
docker service scale servicename=2
现在我得到数据库连接问题。
有人可以帮我吗?可能是什么问题?如果这是扩展mysql db的错误方法,请告诉我什么是更好的方法。
答案 0 :(得分:5)
启动服务时,Docker群集将为每个服务分配一个虚拟IP地址,并将对该IP的所有请求负载均衡到每个副本容器。
可能发生的事情(但是如果没有完整的日志,很难看到)是tcp连接在两个DB上都达到了负载平衡:第一个连接转到nr1,第二个连接转到nr2,等等。
但是,mysql连接是有状态的,不是无状态的。因此,这种方式无法扩展数据库。还要注意,Docker不会为您处理Mysql复制工作。人们通常会做的是: