操作:
我使用Docker部署了一个MariaDB Galera的集群(三台服务器),Docker run部分使用了下列环境变量:
-e MARIADB_DATABASE=testdb \
-e MARIADB_MASTER_HOST=192.168.1.1 \
-e DB_MASTER_HOST=192.168.1.1 \
-e NODE_NAME=mariadb-node1 \
-e MARIADB_GALERA_NODE_NAME=mariadb1 \
-e MARIADB_GALERA_NODE_ADDRESS=192.168.1.1 \
-e MARIADB_GALERA_CLUSTER_ADDRESS="gcomm://192.168.1.1:4567,192.168.1.2:4567,192.168.1.3:4567" \
-e MARIADB_GALERA_CLUSTER_NAME=mariadb-clust \
-e MARIADB_ROOT_PASSWORD=root111 \
-e GALERA=ON \
-e MARIADB_GALERA_CLUSTER_BOOTSTRAP=yes \
-e MARIADB_GALERA_FORCE_SAFETOBOOTSTRAP=yes \
-e MARIADB_GALERA_MARIABACKUP_USER=backup \
-e MARIADB_GALERA_MARIABACKUP_PASSWORD=root111 \
-e MARIADB_USER=user \
-e MARIADB_PASSWORD=root111 \
-e MARIADB_REPLICATION_USER=repl \
-e MARIADB_REPLICATION_PASSWORD=root111 \
-e MARIADB_SERVER_ID=101\
-e TIMEZONE=Asia/Shanghai \
第一个节点使用了上面的全部环境变量【第一个节点是引导节点】,第二个和第三个节点除了NAME和ADDRESS,还有SERVER_ID这些必须唯一的配置修改外,还去掉了MARIADB_GALERA_CLUSTER_BOOTSTRAP和MARIADB_GALERA_FORCE_SAFETOBOOTSTRAP这两个变量。
现象:
- 部署后三个节点如果一直运行,则MariaDB访问正常,数据也会正确同步。
- 如果第二个节点或第三个节点断掉,重启后数据同步正常。
- 如果第一个节点断掉,则二三节点的数据不会再往第一个节点同步(好像第一个节点从集群中脱离)。
- 出现3这个问题后,通过查找发现第一个节点的wsrep_cluster_address为“gcomm://”,通过查资料发现,是因为环境变量MARIADB_GALERA_CLUSTER_BOOTSTRAP=yes 引起的(虽然对MARIADB_GALERA_CLUSTER_ADDRESS有赋值,但是MARIADB_GALERA_CLUSTER_BOOTSTRAP=yes 会自动将wsrep_cluster_address为“gcomm://”)。wsrep_cluster_address为“gcomm://”,从而导致第一个节点重新引导创建了一个集群,和原来的集群脱离。于是重新使用docker run运行容器,同时将环境变量MARIADB_GALERA_CLUSTER_BOOTSTRAP=yes 的这个设置去掉。去掉后发现wsrep_cluster_address的值正常了,且第二、三节点的数据也同步到第一个节点了。
- 按4中的方式修改第一个节点后,又遇到新问题:当三个节点同时断掉后,重启三个节点,然后三个节点的MariaDB都起不来了。查看docker日志发现“This node was previouly booted, you may need to force bootstrapping in one of the nodes.”。缺少引导,三个节点都起不来了。(但是第一个节点设置的有MARIADB_GALERA_FORCE_SAFETOBOOTSTRAP=yes,不明白为啥无效)
- 除了上述现象外,还发现,部署后,通过“SHOW VARIABLES ”查到的三个节点的server_id都是1(通过MARIADB_SERVER_ID设置的无效)。
预期:
- 三个节点不管哪个节点断掉,重启后,都可以正常同步。
- 三个节点都断掉,重启后,三个节点可以正常使用,数据同步。
- 部署后三个节点的server_id能根据设置,变成唯一的(正常的话,三个节点的server_id不应重复)
帮忙看看,如何调整可以实现预期,谢谢!