如何在Docker中debugging“WSREP:SST失败:1(操作不允许)”与MariaDB Galera集群?

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

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

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

DB:10.1.20-MariaDB

我发现了一个有希望的Docker镜像 ,但文档似乎已经过时,启动集群的命令不起作用。 在编写图像时使用wsrep_sst_method = rsync ,所以我想到下面的命令应该工作(replace/ 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的问题?

这是我在dockerhub的形象。

我还没有在一台主机上testing集群(目前为止),只能运行在多台主机上。 你说的对,虽然在单个主机上运行两个似乎会中止第二个节点的启动。

这看起来是由于缺省的桥接networking不好而引起的。 可能有一些与处理国家转移的端口有关的问题。 不知道为什么。

如果您修改命令以首先为后端使用的群集容器创build自定义networking,然后使用该networking运行群集成员,那么在单个主机上运行两个节点时似乎可行:

 # 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运行它,它也可以正常工作。 这可能是因为撰写默认情况下会创build一个专用的撰写容器networking。 您可以在这个要点中看到一个示例撰写文件。

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

将Docker镜像升级到MariaDB 10.2.3 (从10.1.20开始)。

我不能100%确定我现在是否拥有真正有效的群集,但至lessshow status like "wsrep_cluster_size"; 产生以下输出和DB是可用的:

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

注意:我也省略了-v选项,将数据库文件放在Docker容器中,而不是放在外部卷上。 我不认为这对群集有什么影响,但是我没有用-v来validation10.2.3。 不过,我尝试了10.1.20两种变化(外部音量与-v和容器内部文件),都没有工作。