如何在 Docker 中使用 MariaDB Galera 集群调试 "WSREP: SST failed: 1 (Operation not permitted)"?

How to debug "WSREP: SST failed: 1 (Operation not permitted)" with a MariaDB Galera cluster in Docker?

要求:基于 CentOS 的 Docker 容器提供 MariaDB 10.x Galera 集群

主机环境:OX X El Capitan 10.11.6,Docker 1.12.5 (14777)

Docker 容器 OS:CentOS Linux 7.3.1611 版(核心)

数据库:10.1.20-MariaDB

我找到了a promising Docker image,但是文档似乎已经过时了,启动集群的命令不起作用。在编写图像时使用 wsrep_sst_method = rsync 所以我认为以下命令应该有效(将 /Users/Me/somedb 替换为主机上的空目录) :

docker pull dayreiner/centos7-mariadb-10.1-galera

docker run -d --name db1 -h db1host -p 3306:3306 -e CLUSTER_NAME=joe -e CLUSTER=BOOTSTRAP -e MYSQL_ROOT_PASSWORD='pwd' -v /Users/Me/somedb:/var/lib/mysql dayreiner/centos7-mariadb-10.1-galera:latest

docker run -d --name db2 -h db2host -p 3307:3306 --link db1 -e CLUSTER_NAME=joe -e CLUSTER=db1host,db2host -e MYSQL_ROOT_PASSWORD='pwd' -v /Users/Me/somedb:/var/lib/mysql dayreiner/centos7-mariadb-10.1-galera:latest

第一个容器 (db1) 出现并且看起来正常。但是尝试将 db2 作为第二个节点添加到 Galera 集群的最后一行导致以下错误 (docker logs db2):

2017-01-10 15:26:10 139742710823680 [Note] WSREP: New cluster view: global state: :-1, view# 0: Primary, number of nodes: 1, my index: 0, protocol version 3
2017-01-10 15:26:10 139742711142656 [ERROR] WSREP: SST failed: 1 (Operation not permitted)
2017-01-10 15:26:10 139742711142656 [ERROR] Aborting

我无法弄清楚这里出了什么问题,希望能提供有关如何进一步分析的想法。这是 rsync、Galera 甚至 Docker 的问题吗?

将 Docker 图像升级到 MariaDB 10.2.3(从 10.1.20 开始)后工作。

我不是 100% 确定我现在是否有一个真正有效的集群,但至少 show status like "wsrep_cluster_size"; 产生以下输出并且数据库可用:

+--------------------+-------+
| Variable_name      | Value |
+--------------------+-------+
| wsrep_cluster_size | 3     |
+--------------------+-------+

注意:我还省略了 -v 选项并将数据库文件放在 Docker 容器中,而不是放在外部卷上。我认为这对集群没有影响,但我没有使用 -v 验证 10.2.3。但是,我尝试了 10.1.20 的两种变体(带有 -v 的外部卷和容器内部文件)并且都没有工作。

这是我在 dockerhub 上的图片。

我还没有在单个主机上测试集群(直到现在),只在多个主机上 运行ning。不过你是对的,运行在单个主机上设置两个节点似乎会在启动时中止第二个节点。

这看起来是由默认桥接网络运行不正常引起的。处理用于状态传输的端口可能存在一些问题。不太清楚为什么。

如果您修改命令以首先为您的集群容器创建自定义网络以在后端使用,然后 运行 使用该网络的集群成员,这似乎在 运行 时有效在一台主机上连接两个节点:

# docker network create mariadb

# docker run -d --network=mariadb -p 3307:3306 --name db1 -e CLUSTER_NAME=test -e CLUSTER=BOOTSTRAP -e MYSQL_ROOT_PASSWORD=test -v /opt/test/db1:/var/lib/mysql dayreiner/centos7-mariadb-10.1-galera:latest

# docker run -d --network=mariadb -p 3308:3306 --name db2 -e CLUSTER_NAME=test -e CLUSTER=db1,db2 -e MYSQL_ROOT_PASSWORD=test -v /opt/test/db2:/var/lib/mysql dayreiner/centos7-mariadb-10.1-galera:latest

这次在第二个节点上没有错误:

# docker logs db2 -f
...snip
2017-01-12 20:33:08 139726185019648 [Note] WSREP: Signalling provider to continue.
2017-01-12 20:33:08 139726185019648 [Note] WSREP: SST received: 42eaa277-d906-11e6-b98a-3e6b9531c1b7:0
2017-01-12 20:33:08 139725604124416 [Note] WSREP: 1.0 (f170852fe1b6): State transfer from 0.0 (951fdda2454b) complete.
2017-01-12 20:33:08 139725604124416 [Note] WSREP: Shifting JOINER -> JOINED (TO: 0)
2017-01-12 20:33:08 139725604124416 [Note] WSREP: Member 1.0 (f170852fe1b6) synced with group.
2017-01-12 20:33:08 139725604124416 [Note] WSREP: Shifting JOINED -> SYNCED (TO: 0)
2017-01-12 20:33:08 139726105180928 [Note] WSREP: Synchronized with group, ready for connections
2017-01-12 20:33:08 139726105180928 [Note] WSREP: wsrep_notify_cmd is not defined, skipping notification.
2017-01-12 20:33:08 139726185019648 [Note] mysqld: ready for connections.
Version: '10.1.20-MariaDB'  socket: '/var/lib/mysql/mysql.sock'  port: 3306  MariaDB Server

试一试,看看效果如何。此外,如果您 运行 使用 docker-compose 它也可以正常工作。这可能是因为 compose 默认创建一个专用的 compose 容器网络。您可以查看示例撰写文件 in this gist

只需确保为每个 mariadb 实例使用不同的目录,并且在启动集群后,停止 db1 并将其作为常规集群成员重新启动(否则下次启动 db1 时,它将继续引导一个新的集群)。