在docker swarm中将mysql容器缩放到大于1时出现mysql连接问题

Tar*_*ung 5 mysql docker docker-compose docker-swarm

我有一台以群集模式运行的主机。我现在在单台计算机上运行它,没有集群(没有多台计算机)。

服务运行正常。我已经为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
Run Code Online (Sandbox Code Playgroud)

这就是我缩放mysql容器的方式。

docker service scale servicename=2
Run Code Online (Sandbox Code Playgroud)

现在我得到数据库连接问题。

有人可以帮我吗?可能是什么问题?如果这是扩展mysql db的错误方法,请建议我哪些更好的方法。

Fra*_*ers 5

启动服务时,Docker群集将为每个服务分配一个虚拟IP地址,并将对该IP的所有请求负载平衡到每个副本容器。

可能发生的情况(但是如果没有完整的日志,很难看到)是tcp连接在两个DB之间都达到了负载平衡:第一个连接转到nr1,第二个连接转到nr2,依此类推。

但是,mysql连接是有状态的,不是无状态的。因此,这种方式无法扩展数据库。还要注意,Docker不会为您处理Mysql复制工作。人们通常会做的是:

  • 如果不需要,避免运行多个数据库实例
  • 运行2个mysql服务:一个mysql-master和mysql-slave,每个都有各自的配置
  • 在您的mysql映像的启动脚本中执行一些智能服务发现