在 docker swarm 中将 mysql 容器扩展到 1 个以上时出现 mysql 连接问题
Getting mysql connection issue when scaling the mysql container to more than 1 in docker swarm
我有一台主机 运行 处于集群模式。我现在运行它在单机上,没有集群(没有多机)。
服务运行很好。我为 mysql 容器创建了一个卷。我相信当 mysql 容器缩放时,它们都会从同一卷中读取。
这里是 docker-撰写。效果很好,没有 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 的错误方法,请告诉我什么是更好的方法。
当您启动一项服务时,Docker swarm 会为每个服务分配一个虚拟 IP 地址,并且 load-balance 所有对该 IP 的请求都会分配给每个 replica-containers。
可能发生的事情(但如果没有完整的日志很难看清),是 tcp 连接在两个数据库之间得到负载平衡:第一个连接将转到 nr1,第二个连接到 nr2 等。
但是,mysql 连接是有状态的,而不是无状态的。所以这种方式是扩展你的数据库是行不通的。另请注意,Docker 不会为您处理 Mysql 复制工作。人们通常做的是:
- 避免在不需要时运行多个数据库实例
- 运行 2 mysql 服务:一个 mysql-master 和一个 mysql-slave,每个都有自己的配置
- 在您的 mysql 映像中的启动脚本中进行一些智能服务发现
我有一台主机 运行 处于集群模式。我现在运行它在单机上,没有集群(没有多机)。
服务运行很好。我为 mysql 容器创建了一个卷。我相信当 mysql 容器缩放时,它们都会从同一卷中读取。
这里是 docker-撰写。效果很好,没有 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 的错误方法,请告诉我什么是更好的方法。
当您启动一项服务时,Docker swarm 会为每个服务分配一个虚拟 IP 地址,并且 load-balance 所有对该 IP 的请求都会分配给每个 replica-containers。
可能发生的事情(但如果没有完整的日志很难看清),是 tcp 连接在两个数据库之间得到负载平衡:第一个连接将转到 nr1,第二个连接到 nr2 等。
但是,mysql 连接是有状态的,而不是无状态的。所以这种方式是扩展你的数据库是行不通的。另请注意,Docker 不会为您处理 Mysql 复制工作。人们通常做的是:
- 避免在不需要时运行多个数据库实例
- 运行 2 mysql 服务:一个 mysql-master 和一个 mysql-slave,每个都有自己的配置
- 在您的 mysql 映像中的启动脚本中进行一些智能服务发现