要求:提供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的问题吗?
答案 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和容器内部文件的外部卷),两者都不工作。