无法创建 MariaDB Galera 集群
Unable to create MariaDB Galera Cluster
我基于 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 地址与显示的相同。
- 为确保容器之间的网络正常工作,尝试创建另一个可以登录到第一个容器的 mysql 实例的容器。
- 这绝对与
MYSQL_HOST
无关
- 为了查看容器是否 运行 内存不足,我使用了
docker stats
并看到失败的容器在其整个生命周期中仅使用了微不足道的 142MB,直到它失败,这就是方式小于允许的总内存 (~4GB)。
- 我正在使用
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
此问题是由于挂起init process
造成的。上面的配置和 CLI 参数是正确的。在 init 进程启动之前唯一要做的就是在数据目录中创建并清空 mysql
目录(默认为 /var/lib/mysql
)。只能在除 bootstrap 节点之外的所有节点上创建。
mkdir -p /var/lib/mysql/mysql
请参阅示例 MariaDB Cluster 了解使用自定义 MariaDB 映像的用法,它是创建集群的概念证明。
我想您的容器应该公开所需的端口:
-p 3306:3306 -p 4444:4444 -p 4567:4567 -p 4568:4568
或者应该--link (ed)
在一起。
我基于 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 地址与显示的相同。
- 为确保容器之间的网络正常工作,尝试创建另一个可以登录到第一个容器的 mysql 实例的容器。
- 这绝对与
MYSQL_HOST
无关
- 为了查看容器是否 运行 内存不足,我使用了
docker stats
并看到失败的容器在其整个生命周期中仅使用了微不足道的 142MB,直到它失败,这就是方式小于允许的总内存 (~4GB)。 - 我正在使用
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
此问题是由于挂起init process
造成的。上面的配置和 CLI 参数是正确的。在 init 进程启动之前唯一要做的就是在数据目录中创建并清空 mysql
目录(默认为 /var/lib/mysql
)。只能在除 bootstrap 节点之外的所有节点上创建。
mkdir -p /var/lib/mysql/mysql
请参阅示例 MariaDB Cluster 了解使用自定义 MariaDB 映像的用法,它是创建集群的概念证明。
我想您的容器应该公开所需的端口:
-p 3306:3306 -p 4444:4444 -p 4567:4567 -p 4568:4568
或者应该--link (ed)
在一起。