如何调试" WSREP:SST失败:1(不允许操作)"在Docker中使用MariaDB Galera集群?

时间:2017-01-10 15:59:52

标签: docker mariadb rsync galera

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

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

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

DB: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的问题吗?

2 个答案:

答案 0 :(得分:1)

这是我在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默认创建了一个专用的撰写容器网络。您可以看到一个示例撰写文件in this gist

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

答案 1 :(得分:0)

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

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

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

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