【问题标题】:Getting mysql connection issue when scaling the mysql container to more than 1 in docker swarm在 docker swarm 中将 mysql 容器扩展到 1 个以上时出现 mysql 连接问题
【发布时间】:2019-05-17 07:26:21
【问题描述】:

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

服务运行良好。我为 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 数据库的错误方法,请建议我有什么更好的方法。

【问题讨论】:

    标签: mysql docker docker-compose docker-swarm


    【解决方案1】:

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

    可能会发生什么(但如果没有完整的日志就很难看到),tcp 连接在两个 DB 之间得到负载平衡:第一个连接将连接到 nr1,第二个连接到 nr2 等等。

    然而,mysql 连接是有状态的,而不是无状态的。所以这种方式是扩展你的数据库是行不通的。另请注意,Docker 不会为您处理 Mysql 复制工作。人们通常做的是:

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

    【讨论】:

    • 感谢您的回复,我不知道一些事实并尝试了。
    • 也看看这个,它可能会有所帮助:github.com/autopilotpattern/mysql 这是一个自动驾驶模式 (autopilotpattern.io) 实现,为您处理设置和维护。它是由 Joyent 的优秀人员编写的,因此它使用了他们的生态系统,但您可以轻松地将其调整为独立于他们的基础设施。
    猜你喜欢
    • 2017-11-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-12
    • 1970-01-01
    • 2019-04-14
    • 2019-08-04
    • 1970-01-01
    相关资源
    最近更新 更多