“如何调试”;WSREP:SST失败:1(不允许操作)";在Docker有一个MariaDB Galera集群?

“如何调试”;WSREP:SST失败:1(不允许操作)";在Docker有一个MariaDB Galera集群?,docker,mariadb,rsync,galera,Docker,Mariadb,Rsync,Galera,要求:基于CentOS的Docker容器提供MariaDB 10.x Galera群集 主机环境:OX El Capitan 10.11.6,Docker 1.12.5(14777) Docker容器操作系统:CentOS Linux 7.3.1611版(核心版) DB:10.1.20-1 我发现,但是文档似乎过时了,启动集群的命令不起作用。在编写映像时,使用了wsrep\u sst\u method=rsync,因此我认为以下命令应该可以工作(在主机上用空目录替换/Users/Me/somed

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

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

Docker容器操作系统:CentOS Linux 7.3.1611版(核心版)

DB:10.1.20-1

我发现,但是文档似乎过时了,启动集群的命令不起作用。在编写映像时,使用了wsrep\u sst\u method=rsync,因此我认为以下命令应该可以工作(在主机上用空目录替换/Users/Me/somedb):

第一个容器(db1)出现了,看起来还可以。但是,最后一行尝试将db2作为第二个节点添加到Galera集群,结果导致以下错误(docker记录db2):


我想不出这里有什么不对的地方,希望大家能提出进一步分析的意见。这是rsync、Galera甚至Docker的问题吗?

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

我不能100%确定我现在是否有一个真正有效的集群,但至少
显示“wsrep_cluster_size”这样的状态生成以下输出,并且DB可用:

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

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

这是我在dockerhub上的图片

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

这似乎是由于默认网桥网络运行不正常造成的。处理状态传输端口时可能会出现一些问题。不太清楚为什么

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

# 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容器网络。您可以看到一个示例compose文件


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

非常感谢您找到解决方案并提供更多解释!像这样,它现在为我工作,也与版本10.1.20的MariaDB。干杯,很高兴它的工作!我真的不知道为什么默认网桥网络会是这样一个障碍。我唯一的猜测是因为socat开放的SST端口仅在状态转移期间按需提供,而不是一直提供。也许在处理这一问题时会遇到一些问题,因为在容器启动时,端口未打开。在运行多主机时,我总是使用a)主机网络模式或b)swarm+覆盖网络进行SST端口通信。在这种情况下,标准端口转发似乎也会受到影响。感谢您提供更多信息!我观察到10.2.3是有效的(见我自己的答案)。也许港口的处理有问题。是的,很奇怪,但很酷,它能工作。当我有时间的时候,我可以试着给容器贴上10.2的标签。不过,我在10.2的变更日志中没有看到任何关于如何处理galera或状态传输的内容。可能是一些无关的改变也修复了它,但不确定。但同时,不要忘了10.2只是alpha版本——因此还没有正式推荐用于生产。。。
# 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