Tengo una máquina host ejecutándose en modo enjambre. Lo estoy ejecutando en una sola máquina ahora, sin clústeres (sin varias máquinas).
Los servicios están funcionando bien. He creado un volumen para el contenedor mysql. Creo que cuando se escala el contenedor mysql, todos leerán del mismo volumen.
Aquí está el docker-compose. Lo cual funciona muy bien y no hay problema de conexión mysql, pero cuando escalo el contenedor mysql a 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: overlayAsí es como escalé el contenedor mysql.
docker service scale servicename=2Ahora tengo el problema de las conexiones de db.
¿Puede alguien ayudarme con eso? ¿Cuál podría ser el problema? Si esta es la forma incorrecta de escalar mysql db, sugiérame cuáles son las mejores formas.
Cuando inicia un servicio, Docker swarm asignará una dirección IP virtual a cada servicio y equilibrará la carga de todas las solicitudes a esa IP para cada uno de los contenedores de réplica.
Lo que probablemente sucede (pero es difícil de ver sin los registros completos) es que la conexión tcp se equilibra en ambas bases de datos: la primera conexión iría a nr1, la segunda a nr2, etc.
Sin embargo, las conexiones mysql son con estado, no sin estado. Entonces, esta forma de escalar su base de datos no va a funcionar. También tenga en cuenta que Docker no manejará el trabajo de replicación de Mysql por usted. Lo que la gente suele hacer es: