Каков будет эффект, если я масштабирую сервис за пределы размера узла докера?

У меня есть 3 узла в режиме роя докеров, где.

1 управляющий и 2 рабочих узла

У меня тут 2 сомнения?

  1. Каков будет эффект, если я масштабирую сервис до числа, превышающего количество узлов, которые у нас есть. (Предположим, что один сервис будет увеличен до 5 или 6)

  2. Что произойдет с масштабом, если у службы есть ограничение, согласно которому она должна работать только на узлах менеджера, и мы масштабируем число выше, чем количество узлов менеджера. (Например, масштабирование до 3)

У меня есть служба mysql, работающая в узле менеджера, у которого есть размещение ограничений, определенное в docker-compose для запуска в узле менеджера. Это эффект, который я вижу, когда пытаюсь масштабировать его до 6, хотя у меня всего 3 узла. docker service logs показывает, что работает 4/6 и равномерно колеблется, иногда показывая 6/6, а иногда 5/6

Здесь docker-compose.yml

version: '3.4'

networks:
  smstake:   
    ipam:
      config:
        - subnet: 10.0.10.0/24


services:

    db:
        image: mysql:5.7
        networks:
          - smstake
        ports:
          - "3306"
        environment:
          MYSQL_ROOT_PASSWORD: password
          MYSQL_DATABASE: mydb
          MYSQL_USER: myuser
          MYSQL_PASSWORD: password
        volumes:
          - mysql_data_2:/var/lib/mysql
        deploy:
          mode: replicated
          replicas: 1
          placement:
            constraints:
              - node.role == manager
    app:
        image: SMSTAKE_VERSION
        ports:
          - 8000:80
        networks:
          - smstake
        depends_on:
          - db
        #  - migration
        deploy:
          mode: replicated
          replicas: 3

    migration:
        # build: .
        image: SMSTAKE_VERSION
        command: sh -xc "sleep 10 && pwd && php artisan migrate:fresh --seed 2>&1"
        networks:
          - smstake
        depends_on:
          - app
          - db
        deploy:
          mode: replicated
          replicas: 1
          placement:
            constraints:
              - node.role == manager
volumes:
    mysql_data_2:

person Tara Prasad Gurung    schedule 16.04.2018    source источник
comment
Скорее всего, он колеблется, потому что некоторые экземпляры выходят из строя по разным причинам (внутренние ошибки, поврежденные данные, отсутствие доступной памяти и т. д.).   -  person Constantin Galbenu    schedule 16.04.2018
comment
Примечание относительно баз данных: не масштабируйте более 1 экземпляра. Базы данных не масштабируются таким образом, вам нужно использовать набор реплик (например, MongoDB) или любую другую технологию репликации, используемую базой данных. В противном случае другие ваши экземпляры потерпят неудачу или будут иметь дублирующиеся/несогласованные данные.   -  person Constantin Galbenu    schedule 16.04.2018
comment
Да, сейчас я делаю это для тестирования масштабных действий. Спасибо за прекрасный совет.   -  person Tara Prasad Gurung    schedule 16.04.2018
comment
Протестируйте с другим типом контейнера, а не с базой данных.   -  person Constantin Galbenu    schedule 16.04.2018
comment
Если вы подробно опишете настройку своего узла и покажете файл компоновки и используемые команды, мы можем попытаться воспроизвести проблему. Ограничение не будет работать на несовпадающем узле... но в вашем случае, если у вас нет большого размера экземпляра, эти реплики, скорее всего, выйдут из строя из-за нехватки ресурсов, что приведет к их повторному созданию снова и снова.   -  person Bret Fisher    schedule 17.04.2018
comment
@BretFisher Да, я включил файл docker-composer.yml, который использую.   -  person Tara Prasad Gurung    schedule 17.04.2018
comment
Если у вас все еще есть работающее количество реплик, которое не соответствует вашему декларативному запросу в файле компоновки, вам необходимо устранить причину их выхода с помощью журналов и команды проверки. дополнительная информация: stackoverflow.com/a/49868818/749924   -  person Bret Fisher    schedule 17.04.2018


Ответы (1)


Каков будет эффект, если я масштабирую сервис до числа, превышающего количество узлов, которые у нас есть. (Предположим, масштабирование одной услуги до 5 или 6)

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

Если нет узлов, соответствующих ограничениям, сервис не масштабируется (у него нет экземпляров). При добавлении дополнительных узлов или изменении ограничений Docker-swarm проверяет, может ли он запустить новый экземпляр. Docker-swarm всегда пытается следовать желаемому состоянию (если сервис имеет масштаб = 3, то Docker-swarm запустит 3 экземпляра на любых узлах, соответствующих ограничениям, даже если это только один узел, он запустит 3 экземпляра на этом узле).

Что произойдет с масштабом, если у службы есть ограничение, согласно которому она должна работать только на узлах менеджера, и мы масштабируем число выше, чем количество узлов менеджера. (Например, масштабирование до 3)

Тот же эффект, что и выше.

person Constantin Galbenu    schedule 16.04.2018
comment
Но что, если у меня есть только один узел менеджера, а масштаб равен 3 с ограничением. Таким образом, в таких случаях ограничением пренебрегают. - person Tara Prasad Gurung; 16.04.2018
comment
@TaraPrasadGurung Ограничениями никогда не пренебрегают. Если нет узлов, соответствующих ограничениям, сервис не масштабируется (у него нет экземпляров). - person Constantin Galbenu; 16.04.2018
comment
У меня есть только 1 узел менеджера, и mysql работает только на узле менеджера. Я попытался масштабировать его до 6 узлов, и я вижу, что он был реплицирован до 4 узлов. С флуктуирующим поведением иногда 5, а иногда даже 6. Похоже, что ограничением пренебрегают. - person Tara Prasad Gurung; 16.04.2018
comment
@TaraPrasadGurung Примечание относительно баз данных: не масштабируйте более 1 экземпляра. Базы данных не масштабируются таким образом, вам нужно использовать набор реплик (например, MongoDB) или любую другую технологию репликации, используемую базой данных. В противном случае другие ваши экземпляры потерпят неудачу или будут иметь дублирующиеся/несогласованные данные. - person Constantin Galbenu; 16.04.2018
comment
Ах, ладно, Тара, я думаю, вы неправильно используете слово «узел», из-за чего я запутался в том, что происходит, поскольку я думал, что вы имеете в виду, что реплики запускаются на других узлах, кроме менеджера. Узел — это хост-ОС, на которой работает докер в Swarm. Реплика или задача — это контейнер, работающий в службе. Если вы масштабируете службу app до 4 реплик, но имеете ограничение node.role == manager, вы увидите 4 app задачи (контейнера) на узле менеджера. - person Bret Fisher; 17.04.2018