Получение проблемы с соединением mysql при масштабировании контейнера mysql до 1 в Docker Swarm - PullRequest
5 голосов
/ 17 мая 2019

Хост-машина работает в режиме роя.Сейчас я запускаю его на одной машине, без кластеров (без нескольких машин).

Службы работают нормально.Я создал том для контейнера 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, подскажите, пожалуйста, как лучше.

1 Ответ

5 голосов
/ 20 мая 2019

Когда вы запускаете службу, Docker swarm назначит виртуальный IP-адрес каждой службе и распределит нагрузку по всем запросам на этот IP для каждого из реплик-контейнеров.

Что, вероятно, происходит (но без полных логов трудно увидеть), так это то, что соединение tcp распределяется по нагрузке между двумя БД: первое соединение переходит к nr1, второе - к nr2 и т. Д.

Тем не менее, MySQL соединения с состоянием, а не без состояния. Таким образом, масштабирование вашей базы данных не сработает. Также обратите внимание, что Docker не будет выполнять работу по репликации Mysql за вас. То, что люди обычно делают, это:

  • избегайте необходимости запускать несколько экземпляров БД, если вам не нужно
  • запустить 2 службы mysql: mysql-master и mysql-slave, каждый со своей конфигурацией
  • сделать интеллектуальное обнаружение службы в сценарии запуска вашего образа mysql
...