【发布时间】:2017-11-15 10:37:23
【问题描述】:
我刚刚安装了一组新的 Ubuntu 16.04 节点,它们应该作为 MariaDB 10.2 主-主集群使用 XtraBackup 作为 SST 方法。
第一个节点通过命令 galera_new_cluster 正常运行,但第二个节点由于以下错误无法加入集群:
Nov 15 10:59:09 mariadb10 mysqld[15664]: 2017-11-15 10:59:09 140259808827136 [Warning] WSREP: Gap in state sequence. Need state transfer.
Nov 15 10:59:09 mariadb10 mysqld[15664]: 2017-11-15 10:59:09 140259416360704 [Note] WSREP: Running: 'wsrep_sst_xtrabackup-v2 --role 'joiner' --address '10.0.0.10' --datadir '/var/lib/mysql/' --parent '15664' --binlog '/var/log/mysql/mariadb-bin' '
Nov 15 10:59:09 mariadb10 mysqld[15664]: /usr//bin/wsrep_sst_xtrabackup-v2: line 646: WSREP_SST_OPT_PORT: unbound variable
Nov 15 10:59:09 mariadb10 mysqld[15664]: 2017-11-15 10:59:09 140259416360704 [ERROR] WSREP: Failed to read 'ready <addr>' from: wsrep_sst_xtrabackup-v2 --role 'joiner' --address '10.0.0.10' --datadir '/var/lib/mysql/' --parent '15664' --binlog '/var/log/mysql/mariadb-bin'
Nov 15 10:59:09 mariadb10 mysqld[15664]: #011Read: '(null)'
Nov 15 10:59:09 mariadb10 mysqld[15664]: 2017-11-15 10:59:09 140259416360704 [ERROR] WSREP: Process completed with error: wsrep_sst_xtrabackup-v2 --role 'joiner' --address '10.0.0.10' --datadir '/var/lib/mysql/' --parent '15664' --binlog '/var/log/mysql/mariadb-bin' : 1 (Operation not permitted)
Nov 15 10:59:09 mariadb10 mysqld[15664]: 2017-11-15 10:59:09 140259808827136 [ERROR] WSREP: Failed to prepare for 'xtrabackup-v2' SST. Unrecoverable.
这段日志的主要问题是未设置的 WSREP_SST_OPT_PORT。
查看/usr/bin/wsrep_sst_xtrabackup-v2 的代码,它“包含”了/usr/bin/wsrep_sst_common,其中可以通过两种方式设置变量。
- 使用
--port命令行参数。 - 在
--address命令行参数中使用端口(ip:port)
由于我现在知道 mariadb 使用什么参数来填充 /usr/bin/wsrep_sst_xtrabackup-v2 的命令行参数,我也不知道如何让它使用具有正确值的 --port 或 --address。
我确实已经在 mariadb 的 my.cnf 中使用了一些参数,但没有任何结果。我尝试过的事情是:
- 将参数
wsrep_sst_opt_port=4444添加到my.cnf。这导致了一个错误,因为该参数不受支持(但是,嘿.. 最好的解决方案是尝试的结果) - 为
wsrep_cluster_adress中的地址添加了端口。这已被接受,但未导致端口号成为--address参数的一部分。 - 将端口添加到
wsrep_node_address中的地址。这也被接受了,但也没有在--address参数中的端口号中重新使用。
作为一种解决方法,我确实修改了/usr/bin/wsrep_sst_common,并添加了以下代码(在评论之后开始):
if [ -n "${WSREP_SST_OPT_ADDR_PORT:-}" ]; then
if [ -n "${WSREP_SST_OPT_PORT:-}" ]; then
...
else
readonly WSREP_SST_OPT_PORT="$WSREP_SST_OPT_ADDR_PORT"
fi
fi
# Start of the workaround
if [ -z "${WSREP_SST_OPT_PORT:-}" ]; then
readonly WSREP_SST_OPT_PORT="4444"
fi
# End of the workaround
这至少解决了我的非启动集群,但如果没有这种解决方法,我仍然很高兴知道如何让它工作......
【问题讨论】:
标签: mariadb