【问题标题】:Unable to create MariaDB Galera Cluster无法创建 MariaDB Galera 集群
【发布时间】:2017-02-06 06:47:28
【问题描述】:

我已经构建了一个基于mariadb:10.1 的映像,它基本上添加了一个新的cluster.conf,但是在第一个节点开始成功工作后,在第二个节点上遇到了以下错误。有人可以帮我调试一下吗?

错误日志尾

2016-09-28 10:12:55 139799503415232 [ERROR] WSREP: failed to open gcomm backend connection: 110: failed to reach primary view: 110 (Connection timed out)
     at gcomm/src/pc.cpp:connect():162
2016-09-28 10:12:55 139799503415232 [ERROR] WSREP: gcs/src/gcs_core.cpp:gcs_core_open():208: Failed to open backend connection: -110 (Connection timed out)
2016-09-28 10:12:55 139799503415232 [ERROR] WSREP: gcs/src/gcs.cpp:gcs_open():1380: Failed to open channel 'test_cluster' at 'gcomm://172.17.0.2,172.17.0.3,172.17.0.4': -110 (Connection timed out)
2016-09-28 10:12:55 139799503415232 [ERROR] WSREP: gcs connect failed: Connection timed out
2016-09-28 10:12:55 139799503415232 [ERROR] WSREP: wsrep::connect(gcomm://172.17.0.2,172.17.0.3,172.17.0.4) failed: 7
2016-09-28 10:12:55 139799503415232 [ERROR] Aborting

MySQL init process failed.

采取的调试步骤

注意:确保容器 IP 地址与所示相同。

  1. 为确保容器之间的网络正常工作,尝试创建另一个可以登录到第一个容器的 mysql 实例的容器。
  2. 这绝对与MYSQL_HOST无关
  3. 为了查看容器是否内存不足,我使用了docker stats,发现失败的容器在其整个生命周期中仅使用了 142MB,直到失败,这比它允许的总内存小得多(~4GB)。
  4. 我正在使用Docker for Mac,但尝试在 CentOS VirtualBox 上运行它并给出相同的结果。看起来 Mac 上的 Docker 没有问题。

配置

[mysqld]
user=mysql
binlog_format=ROW
bind-address=0.0.0.0
default_storage_engine=innodb
innodb_autoinc_lock_mode=2
innodb_flush_log_at_trx_commit=0
innodb_buffer_pool_size=122M
innodb_file_per_table=1
innodb_doublewrite=1
query_cache_size=0
query_cache_type=0
wsrep_on=ON
wsrep_provider=/usr/lib/libgalera_smm.so
wsrep_sst_method=rsync

启动容器的步骤

# bootstrap node
docker run --rm -e MYSQL_ROOT_PASSWORD=123 \ 
  activatedgeek/mariadb:devel \
    --wsrep-cluster-name=test_cluster \
    --wsrep-cluster-address=gcomm://172.17.0.2,172.17.0.3,172.17.0.4 \
    --wsrep-new-cluster

# add node into cluster
docker run --rm -e MYSQL_ROOT_PASSWORD=123 \ 
  activatedgeek/mariadb:devel \
    --wsrep-cluster-name=test_cluster \
    --wsrep-cluster-address=gcomm://172.17.0.2,172.17.0.3,172.17.0.4

# add node into cluster
docker run --rm -e MYSQL_ROOT_PASSWORD=123 \ 
  activatedgeek/mariadb:devel \
    --wsrep-cluster-name=test_cluster \
    --wsrep-cluster-address=gcomm://172.17.0.2,172.17.0.3,172.17.0.4

【问题讨论】:

  • @RickJames 这并没有真正帮助这个案子。如果您可以指出上述设置有什么问题,因为它几乎相同。
  • 一个页面建议只是简单的gcomm://,另一个说永远不要这样做,还有一个建议所有 3 个地址都需要在列表中。我也遇到过问题,不记得“正确”的答案。
  • @RickJames 文档说所有 3 个都应该在 URL 中,我还需要为主要组件 wsrep_provider_options 提供一个提供者选项,以防这些崩溃,以便它们可以恢复。该文档建议将--wsrep-new-cluster 作为推荐方式。您是否发现上述设置有任何其他问题?顺便说一句,我正在尝试一个 3 节点集群,第二个节点声明第一个节点稳定但 mysql init 失败。

标签: mariadb galera


【解决方案1】:

这个问题是由于init process挂起造成的。上面的配置和 CLI 参数是正确的。在init进程开始之前唯一要做的就是在数据目录中创建并清空mysql目录(默认为/var/lib/mysql)。只能在除引导节点之外的所有节点上创建。

mkdir -p /var/lib/mysql/mysql

请参阅示例 MariaDB Cluster,了解使用自定义 MariaDB 映像并且是创建集群的概念证明的用法。

【讨论】:

    【解决方案2】:

    我猜你的容器应该暴露所需的端口:

    -p 3306:3306 -p 4444:4444 -p 4567:4567 -p 4568:4568
    

    或者应该是--link (ed)一起。

    【讨论】:

    • 不,这不是真正的问题。容器已经能够相互通信。请参阅我对解决此问题的问题的回答。