![MaxScale이 Galera 클러스터에 연결되지 않습니다.](https://rvso.com/image/789292/MaxScale%EC%9D%B4%20Galera%20%ED%81%B4%EB%9F%AC%EC%8A%A4%ED%84%B0%EC%97%90%20%EC%97%B0%EA%B2%B0%EB%90%98%EC%A7%80%20%EC%95%8A%EC%8A%B5%EB%8B%88%EB%8B%A4..png)
저는 분산형 HA 클라우드 시스템에서 작업 중이며 Galera Cluster
에 3개의 분리된 서버가 있습니다 Docker Swarm
. 예상대로 작동합니다.
부트스트래핑으로 인해 회원 을 위한 3개의 분리된 서비스가 있습니다 Galera
(간단한 복제본으로는 해결할 수 없습니다). 이 때문에 클러스터를 사용하려면 복제된 로드 밸런서/프록시가 있어야 합니다( Swarm
연결 문자열에 사용될 3개의 복제본이 있는 하나의 서비스).
디자인은 다음과 유사해야 합니다.
MaxScale
서비스를 설정하려고 시도했지만 maxctrl list servers
명령(실행 중인 컨테이너 내부)은 다음과 같습니다.
Error: Could not connect to MaxScale
시스템을 시작하는 데 사용된 명령:
docker-compose up --remove-orphans --force-recreate
Galera Cluster
테스트를 위해 최소한의 설정을 on MaxScale
으로 만들었습니다 localhost
(테스트용으로만 단일 노드 구조입니다. 실제 제품에는 3개의 매니저 노드와 3개의 db 노드가 있습니다). 아래에서 문제를 재현할 수 있는 시스템을 확인하세요.
내 docker-compose.yml
파일:
version: "3.8"
services:
galera0:
image: bitnami/mariadb-galera:10.4.31
hostname: galera0
networks:
- galera_net
volumes:
- ./my.cnf:/opt/bitnami/mariadb/conf/my_custom.cnf:ro
- ./init_db_for_maxscale.sql:/docker-entrypoint-initdb.d/init_db_for_maxscale.sql
environment:
MARIADB_GALERA_CLUSTER_NAME: my_galera
MARIADB_GALERA_MARIABACKUP_USER: my_mariabackup_user
MARIADB_GALERA_MARIABACKUP_PASSWORD: my_mariabackup_password
MARIADB_ROOT_PASSWORD: my_root_password
MARIADB_GALERA_CLUSTER_BOOTSTRAP: "yes"
MARIADB_GALERA_FORCE_SAFETOBOOTSTRAP: "yes"
MARIADB_USER: my_user
MARIADB_PASSWORD: my_password
MARIADB_DATABASE: my_database
MARIADB_REPLICATION_USER: my_replication_user
MARIADB_REPLICATION_PASSWORD: my_replication_password
healthcheck:
test: ['CMD', '/opt/bitnami/scripts/mariadb-galera/healthcheck.sh']
interval: 15s
timeout: 5s
retries: 10
galera1:
image: bitnami/mariadb-galera:10.4.31
hostname: galera1
networks:
- galera_net
volumes:
- ./my.cnf:/opt/bitnami/mariadb/conf/my_custom.cnf:ro
- ./init_db_for_maxscale.sql:/docker-entrypoint-initdb.d/init_db_for_maxscale.sql
environment:
MARIADB_GALERA_CLUSTER_NAME: my_galera
MARIADB_GALERA_CLUSTER_ADDRESS: gcomm://galera0:4567,0:0:0:0:4567
MARIADB_GALERA_MARIABACKUP_USER: my_mariabackup_user
MARIADB_GALERA_MARIABACKUP_PASSWORD: my_mariabackup_password
MARIADB_ROOT_PASSWORD: my_root_password
MARIADB_REPLICATION_USER: my_replication_user
MARIADB_REPLICATION_PASSWORD: my_replication_password
MARIADB_INIT_SLEEP_TIME: 30
healthcheck:
test: [ 'CMD', '/opt/bitnami/scripts/mariadb-galera/healthcheck.sh' ]
interval: 15s
timeout: 5s
retries: 10
depends_on:
galera0:
condition: service_healthy
galera2:
image: bitnami/mariadb-galera:10.4.31
hostname: galera2
networks:
- galera_net
volumes:
- ./my.cnf:/opt/bitnami/mariadb/conf/my_custom.cnf:ro
- ./init_db_for_maxscale.sql:/docker-entrypoint-initdb.d/init_db_for_maxscale.sql
environment:
MARIADB_GALERA_CLUSTER_NAME: my_galera
MARIADB_GALERA_CLUSTER_ADDRESS: gcomm://galera0:4567,0:0:0:0:4567
MARIADB_GALERA_MARIABACKUP_USER: my_mariabackup_user
MARIADB_GALERA_MARIABACKUP_PASSWORD: my_mariabackup_password
MARIADB_ROOT_PASSWORD: my_root_password
MARIADB_REPLICATION_USER: my_replication_user
MARIADB_REPLICATION_PASSWORD: my_replication_password
MARIADB_INIT_SLEEP_TIME: 30
healthcheck:
test: [ 'CMD', '/opt/bitnami/scripts/mariadb-galera/healthcheck.sh' ]
interval: 15s
timeout: 5s
retries: 10
depends_on:
galera0:
condition: service_healthy
mariadb-maxscale:
image: mariadb/maxscale:23.08
hostname: mariadb-maxscale
networks:
- galera_net
volumes:
- ./maxscale.cnf:/etc/maxscale.cnf
depends_on:
galera0:
condition: service_healthy
galera1:
condition: service_healthy
galera2:
condition: service_healthy
networks:
galera_net: {}
maxscale.cfn
콘텐츠:
########################
## Server list
########################
[mariadb1]
type = server
address = galera0
port = 3306
protocol = MariaDBBackend
serv_weight = 1
[mariadb2]
type = server
address = galera1
port = 3306
protocol = MariaDBBackend
serv_weight = 1
[mariadb3]
type = server
address = galera2
port = 3306
protocol = MariaDBBackend
serv_weight = 1
#########################
## MaxScale configuration
#########################
[MaxScale]
threads = auto
log_augmentation = 1
ms_timestamp = 1
syslog = 1
# log_debug = 1
#########################
# Monitor for the servers
#########################
[MariaDB-Monitor]
type = monitor
module = mariadbmon
servers = mariadb1,mariadb2,mariadb3
user = maxscale
password = my_s3cret
# auto_failover = true
# auto_rejoin = true
# enforce_read_only_slaves = 1
monitor_interval = 2000
#########################
## Service definitions for read/write splitting and read-only services.
#########################
[Read-Write-Service]
type = service
router = readwritesplit
servers = mariadb1,mariadb2,mariadb3
user = maxscale
password = my_s3cret
# max_slave_connections = 100%
# max_sescmd_history = 1500
# causal_reads = true
# causal_reads_timeout = 10
# transaction_replay = true
# transaction_replay_max_size = 1Mi
# delayed_retry = true
# master_reconnection = true
# master_failure_mode = fail_on_write
# max_slave_replication_lag = 3
[Read-Only-Service]
type = service
router = readconnroute
servers = mariadb1,mariadb2,mariadb3
router_options = slave
user = maxscale
password = my_s3cret
##########################
## Listener definitions for the service
## Listeners represent the ports the service will listen on.
##########################
[Read-Write-Listener]
type = listener
service = Read-Write-Service
protocol = MariaDBClient
port = 4006
[Read-Only-Listener]
type = listener
service = Read-Only-Service
protocol = MariaDBClient
port = 4008
init_db_for_maxscale.sql
콘텐츠:
CREATE USER IF NOT EXISTS 'maxscale'@'%' IDENTIFIED BY 'my_s3cret';
GRANT SELECT ON mysql.user TO 'maxscale'@'%';
GRANT SELECT ON mysql.db TO 'maxscale'@'%';
GRANT SELECT ON mysql.tables_priv TO 'maxscale'@'%';
GRANT SELECT ON mysql.columns_priv TO 'maxscale'@'%';
GRANT SELECT ON mysql.procs_priv TO 'maxscale'@'%';
GRANT SELECT ON mysql.proxies_priv TO 'maxscale'@'%';
GRANT SELECT ON mysql.roles_mapping TO 'maxscale'@'%';
GRANT SHOW DATABASES ON *.* TO 'maxscale'@'%';
GRANT ALL PRIVILEGES ON *.* TO maxscale@'%';
모든 컨테이너를 확인해 보니 MariaDB
생성된 사용자가 사용 가능하고 DB에 권한이 설정되어 있습니다 select * from mysql. user;
.
docker container logs <maxscale_continer>
명령 출력(무한히 반복됨):
mariadb-maxscale_1 | Starting...
mariadb-maxscale_1 | MaxScale PID = 1698
mariadb-maxscale_1 |
mariadb-maxscale_1 | Awakened by User defined signal 1
mariadb-maxscale_1 | 'maxscale' monitor action done
mariadb-maxscale_1 | 'maxscale' process is not running
mariadb-maxscale_1 | 'maxscale' trying to restart
mariadb-maxscale_1 | 'maxscale' start: '/usr/bin/maxscale-restart'
mariadb-maxscale_1 | 'mariadb-maxscale' unmonitor on user request
mariadb-maxscale_1 | 'maxscale' unmonitor on user request
mariadb-maxscale_1 | Monit daemon with PID 12 awakened
mariadb-maxscale_1 | 'mariadb-maxscale' monitor on user request
mariadb-maxscale_1 | 'maxscale' monitor on user request
mariadb-maxscale_1 | Monit daemon with PID 12 awakened
mariadb-maxscale_1 | 'mariadb-maxscale' monitor action done
mariadb-maxscale_1 | Awakened by User defined signal 1
mariadb-maxscale_1 | 'maxscale' failed to start (exit status 0) -- '/usr/bin/maxscale-restart': Stopping...
mariadb-maxscale_1 | Starting...
mariadb-maxscale_1 | MaxScale PID = 1713
mariadb-maxscale_1 |
mariadb-maxscale_1 | 'maxscale' monitor action done
mariadb-maxscale_1 | 'maxscale' trying to restart
mariadb-maxscale_1 | 'maxscale' process is not running
mariadb-maxscale_1 | 'maxscale' start: '/usr/bin/maxscale-restart'
mariadb-maxscale_1 | 'mariadb-maxscale' unmonitor on user request
mariadb-maxscale_1 | 'maxscale' unmonitor on user request
mariadb-maxscale_1 | Monit daemon with PID 12 awakened
mariadb-maxscale_1 | 'mariadb-maxscale' monitor on user request
mariadb-maxscale_1 | 'maxscale' monitor on user request
mariadb-maxscale_1 | Monit daemon with PID 12 awakened
mariadb-maxscale_1 | 'maxscale' failed to start (exit status 0) -- '/usr/bin/maxscale-restart': Stopping...
mariadb-maxscale_1 | Starting...
mariadb-maxscale_1 | MaxScale PID = 1728
mariadb-maxscale_1 |
mariadb-maxscale_1 | 'mariadb-maxscale' monitor action done
mariadb-maxscale_1 | Awakened by User defined signal 1
mariadb-maxscale_1 | 'maxscale' monitor action done
mariadb-maxscale_1 | 'maxscale' process is not running
mariadb-maxscale_1 | 'maxscale' trying to restart
mariadb-maxscale_1 | 'maxscale' start: '/usr/bin/maxscale-restart'
mariadb-maxscale_1 | 'mariadb-maxscale' unmonitor on user request
mariadb-maxscale_1 | 'maxscale' unmonitor on user request
mariadb-maxscale_1 | Monit daemon with PID 12 awakened
mariadb-maxscale_1 | 'mariadb-maxscale' monitor on user request
mariadb-maxscale_1 | 'maxscale' monitor on user request
mariadb-maxscale_1 | Monit daemon with PID 12 awakened
노트:
- 나는 이미 많은 문서를 읽었으며 IP 주소가 maxscale 구성의 "서버"에 사용되는 것을 볼 수 있지만 동일한 Docker 네트워크로 인해 호스트 이름(서비스 이름)을 통해 MariaDB를 볼 수 있어야 한다고 생각합니다.
- Docker 네트워크 내에서 모든 포트에 액세스할 수 있기 때문에 포트를 열지 않았습니다.
답변1
방금 내 문제에 대한 해결책을 찾았습니다. 근본 원인을 찾을 수 MaxScale
있는 전체 로그를 확인했습니다 docker exec -it <container_id> cat var/log/maxscale/maxscale.log
(왜 STDOUT에 표시되지 않는지 모르겠습니다...).
MaxScale 구성에서 다음과 같은 변경을 수행해야 했습니다.
매개
serv_weight = 1
변수를 로 변경해야 했습니다rank = primary
.MaxScale 참조다음
monitor_interval = 2000
으로 변경해야 합니다monitor_interval = 2000ms
("ms"가 누락됨).
위 변경 후 출력:
maxctrl list servers
┌──────────┬─────────┬──────┬─────────────┬─────────────────┬────────┬─────────────────┐
│ Server │ Address │ Port │ Connections │ State │ GTID │ Monitor │
├──────────┼─────────┼──────┼─────────────┼─────────────────┼────────┼─────────────────┤
│ mariadb1 │ galera0 │ 3306 │ 0 │ Master, Running │ 0-1-65 │ MariaDB-Monitor │
├──────────┼─────────┼──────┼─────────────┼─────────────────┼────────┼─────────────────┤
│ mariadb2 │ galera1 │ 3306 │ 0 │ Running │ 0-1-65 │ MariaDB-Monitor │
├──────────┼─────────┼──────┼─────────────┼─────────────────┼────────┼─────────────────┤
│ mariadb3 │ galera2 │ 3306 │ 0 │ Running │ 0-1-65 │ MariaDB-Monitor │
└──────────┴─────────┴──────┴─────────────┴─────────────────┴────────┴─────────────────┘