Docker MariaDB galera群集10.2第二节点“;未能打开通道“;

Docker MariaDB galera群集10.2第二节点“;未能打开通道“;,docker,docker-compose,mariadb,galera,Docker,Docker Compose,Mariadb,Galera,我正在尝试使用docker compose在我的windows计算机上以galera群集的形式本地运行mariadb:10.2.14。运行初始boot节点工作正常,但第二个节点无法加入群集,出现错误: 节点| 2018-05-04 3:13:46 140187778701184[注]WSREP:view((空)) 节点|1 | 2018-05-04 3:13:46 140187778701184[错误]WSREP:无法打开gcomm后端连接:110:无法到达gcomm/src/pc.cpp:co

我正在尝试使用docker compose在我的windows计算机上以galera群集的形式本地运行
mariadb:10.2.14
。运行初始
boot
节点工作正常,但第二个节点无法加入群集,出现错误:

节点| 2018-05-04 3:13:46 140187778701184[注]WSREP:view((空))

节点|1 | 2018-05-04 3:13:46 140187778701184[错误]WSREP:无法打开gcomm后端连接:110:无法到达gcomm/src/pc.cpp:connect()处的主视图:110(连接超时)

节点1 | 2018-05-04 3:13:46 140187778701184[错误]WSREP:gcs/src/gcs_core.cpp:gcs_core_open():208:打开后端连接失败:-110(连接超时)

node_1 | 2018-05-04 3:13:46 140187778701184[错误]WSREP:gcs/src/gcs.cpp:gcs_open():1458:无法在gcomm://boot“:-110(连接超时)

节点|1 | 2018-05-04 3:13:46 140187778701184[错误]WSREP:gcs连接失败:连接超时

节点| 2018-05-04 3:13:46 140187778701184[错误]WSREP:WSREP::connect(gcomm://boot)失败:7

节点| 2018-05-04 3:13:46 140187778701184[错误]中止

我在容器中运行了
ping boot
,以验证主机名是否正确解析,但不确定为什么无法连接。我试图根据我为
mariadb:10.1
看到的各种docker文件进行配置,例如

我的docker撰写文件:

# Docker compose file for running a local MySQL server
version: '2.2'
services:
  boot:
    image: mariadb:10.2.14
    command: mysqld --user=mysql --wsrep_new_cluster
    environment:
      MYSQL_DATABASE: "db"
      MYSQL_ALLOW_EMPTY_PASSWORD: "yes"
      # Needed because galera doesn't support MyISAM, which tzinfo uses
      MYSQL_INITDB_SKIP_TZINFO: "yes"
    ports:
      - ${SQL_PORT}:3306
      - 4444:4444
      - 4567:4567
      - 4568:4568
    networks:
      - sql
    volumes:
      - ./kubernetes/mariadb.conf.d:/etc/mysql/mariadb.conf.d
      - /var/lib/mysql
  node:
    image: mariadb:10.2.14
    command: mysqld --user=mysql --wsrep_cluster_address=gcomm://boot
    environment:
      MYSQL_DATABASE: "db"
      MYSQL_ALLOW_EMPTY_PASSWORD: "yes"
      # Needed because galera doesn't support MyISAM, which tzinfo uses
      MYSQL_INITDB_SKIP_TZINFO: "yes"
    networks:
      - sql
    volumes:
      - ./kubernetes/mariadb.conf.d:/etc/mysql/mariadb.conf.d
      - /var/lib/mysql
networks:
  sql:
# Docker compose file for running a local mariadb galera cluster
version: '3.6'
services:
  boot:
    image: mariadb:10.2.14
    command: mysqld --user=mysql --wsrep_cluster_address=gcomm://
    environment:
      MYSQL_DATABASE: "db"
      MYSQL_ALLOW_EMPTY_PASSWORD: "yes"
      # Needed because galera doesn't support MyISAM, which tzinfo uses
      MYSQL_INITDB_SKIP_TZINFO: "yes"
    ports:
      - ${SQL_PORT}:3306
      - 4444:4444
      - 4567:4567
      - 4568:4568
    volumes:
      - ./kubernetes/mariadb.conf.d:/etc/mysql/mariadb.conf.d
      - /var/lib/mysql
  node:
    image: mariadb:10.2.14
    command: bash -c "sleep 10; mysqld --user=mysql --wsrep_cluster_address=gcomm://boot"
    environment:
      MYSQL_DATABASE: "db"
      MYSQL_ALLOW_EMPTY_PASSWORD: "yes"
      # Needed because galera doesn't support MyISAM, which tzinfo uses
      MYSQL_INITDB_SKIP_TZINFO: "yes"
    volumes:
      - ./kubernetes/mariadb.conf.d:/etc/mysql/mariadb.conf.d
      - /var/lib/mysql
maraidb.conf.d
中的我的配置文件:

# This will be passed to all mysql clients
[client]
default-character-set=utf8mb4

[mysql]
default-character-set=utf8mb4

# The MySQL server
[mysqld]
character-set-server=utf8mb4
collation-server=utf8mb4_unicode_ci
default_storage_engine=innodb
binlog_format=row
innodb_autoinc_lock_mode=2
innodb_flush_log_at_trx_commit=0

# Allow server to accept connections on all interfaces.
bind-address=0.0.0.0

#
# * Galera-related settings
#
# https://mariadb.com/kb/en/mariadb/galera-cluster-system-variables/
#
[galera]
wsrep_on=ON
wsrep_log_conflicts=ON
wsrep_provider=/usr/lib/galera/libgalera_smm.so
# TODO: is rsync the best option?
wsrep_sst_method=rsync

wsrep_cluster_name=galera
#wsrep_slave_threads=1

wsrep_cluster_address
参数应从galera群集创建开始定义

这就是为什么您需要执行以下操作:

1.
wsrep_cluster_address
添加到
maraidb.conf.d
中的配置文件中,所有节点都会得到它:

wsrep_cluster_address="gcomm://boot,node"
2.
节点
容器中启动
mysql
时,从
mysqld
命令中删除
--wsrep\u cluster\u address
标志,因为我们已经在配置中了它:

version: '2.2'
services:
  boot:
    image: mariadb:10.2.14
    command: mysqld --user=mysql --wsrep_new_cluster
    environment:
      MYSQL_DATABASE: "db"
      MYSQL_ALLOW_EMPTY_PASSWORD: "yes"
      # Needed because galera doesn't support MyISAM, which tzinfo uses
      MYSQL_INITDB_SKIP_TZINFO: "yes"
    ports:
      - ${SQL_PORT}:3306
      - 4444:4444
      - 4567:4567
      - 4568:4568
    networks:
      - sql
    volumes:
      - ./kubernetes/mariadb.conf.d:/etc/mysql/mariadb.conf.d
      - /var/lib/mysql
  node:
    image: mariadb:10.2.14
    command: mysqld --user=mysql
    environment:
      MYSQL_DATABASE: "db"
      MYSQL_ALLOW_EMPTY_PASSWORD: "yes"
      # Needed because galera doesn't support MyISAM, which tzinfo uses
      MYSQL_INITDB_SKIP_TZINFO: "yes"
    networks:
      - sql
    volumes:
      - ./kubernetes/mariadb.conf.d:/etc/mysql/mariadb.conf.d
      - /var/lib/mysql
networks:
  sql:

谢谢@Nickolay,你的答案基本上是正确的,但我遇到了另一个问题。不过,这确实让我走上了找到解决方案的正确道路

因此,主要问题似乎是,
--wsrep\u new\u cluster
本身不足以引导节点,您需要设置
wsrep\u cluster\u address
变量。使用
--wsrep\u cluster\u address=gcomm://
对我进行了设置

此外,我还遇到了一些问题,其中似乎存在争用条件,并且第一个引导节点无法初始化,并出现一个错误,即它不是最后一个节点。我通过在第二个node命令中使用短睡眠来修复此问题

我的最终docker撰写文件:

# Docker compose file for running a local MySQL server
version: '2.2'
services:
  boot:
    image: mariadb:10.2.14
    command: mysqld --user=mysql --wsrep_new_cluster
    environment:
      MYSQL_DATABASE: "db"
      MYSQL_ALLOW_EMPTY_PASSWORD: "yes"
      # Needed because galera doesn't support MyISAM, which tzinfo uses
      MYSQL_INITDB_SKIP_TZINFO: "yes"
    ports:
      - ${SQL_PORT}:3306
      - 4444:4444
      - 4567:4567
      - 4568:4568
    networks:
      - sql
    volumes:
      - ./kubernetes/mariadb.conf.d:/etc/mysql/mariadb.conf.d
      - /var/lib/mysql
  node:
    image: mariadb:10.2.14
    command: mysqld --user=mysql --wsrep_cluster_address=gcomm://boot
    environment:
      MYSQL_DATABASE: "db"
      MYSQL_ALLOW_EMPTY_PASSWORD: "yes"
      # Needed because galera doesn't support MyISAM, which tzinfo uses
      MYSQL_INITDB_SKIP_TZINFO: "yes"
    networks:
      - sql
    volumes:
      - ./kubernetes/mariadb.conf.d:/etc/mysql/mariadb.conf.d
      - /var/lib/mysql
networks:
  sql:
# Docker compose file for running a local mariadb galera cluster
version: '3.6'
services:
  boot:
    image: mariadb:10.2.14
    command: mysqld --user=mysql --wsrep_cluster_address=gcomm://
    environment:
      MYSQL_DATABASE: "db"
      MYSQL_ALLOW_EMPTY_PASSWORD: "yes"
      # Needed because galera doesn't support MyISAM, which tzinfo uses
      MYSQL_INITDB_SKIP_TZINFO: "yes"
    ports:
      - ${SQL_PORT}:3306
      - 4444:4444
      - 4567:4567
      - 4568:4568
    volumes:
      - ./kubernetes/mariadb.conf.d:/etc/mysql/mariadb.conf.d
      - /var/lib/mysql
  node:
    image: mariadb:10.2.14
    command: bash -c "sleep 10; mysqld --user=mysql --wsrep_cluster_address=gcomm://boot"
    environment:
      MYSQL_DATABASE: "db"
      MYSQL_ALLOW_EMPTY_PASSWORD: "yes"
      # Needed because galera doesn't support MyISAM, which tzinfo uses
      MYSQL_INITDB_SKIP_TZINFO: "yes"
    volumes:
      - ./kubernetes/mariadb.conf.d:/etc/mysql/mariadb.conf.d
      - /var/lib/mysql