暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

万里数据库GreatDB Cluster 集群与MySQL单机双向复制方案

原创 Dbb 2024-06-03
332

使用场景:

  1. 正常状态下,用户通过连接GreatDB Cluster集群,进行数据读写操作
  2. 配置一个单机MySQL作为集群的备份
  3. 集群整体故障时,将集群暂时下线,切换单机MySQL为用户提供读写服务
  4. 集群恢复后,需要同步单机的增量数据,并将单机MySQL下线,切换集群为用户提供服务

整体部署方案


  1. 部署一套高可用的GreatDB集群
  2. 添加集群的binlog-server节点,该节点启动binlog收集任务,持续读取集群的日志,并以binlog格式存储
  3. 单机MySQL节点作为binlog-server节点的从节点

部署并启动binlog-server

在binlog-server节点执行如下命令:

START BINLOG SERVER FROM master_host='xxx', master_port=xxx,master_user='xxx',master_password='xxx';

关于具体如何部署一个binlog-server节点,上述命令中参数的含义及注意事项等,详情请查看使用文档。

单机MySQL部署操作

启动单机MySQL后,通过普通的主从复制,将MySQL作为binlog-server节点的从节点,由于目前binlog-server实现会产生非用户表数据mysql.greatdb_binlog_server_ddl_info,需过滤掉该系统表,具体操作如下:

CHANGE MASTER TO master_host='xxx',master_port=xxx,
master_user='xxx', master_password='xxx',master_auto_position=1;
CHANGE REPLICATION FILTER Replicate_Wild_Ignore_Table=('mysql.greatdb_binlog_server_ddl_info');
START SLAVE;

此时,该单机MySQL间接的成为集群的从节点,复制集群中的用户数据。

集群故障切换操作

集群故障后,需要将单机MySQL上线提供服务,维持整体系统可用。此时,需要在单机MySQL上进行如下操作:

  1. 执行STOP SLAVE操作
  2. 执行SHOW MASTER STATUS操作,记录当前的 $binlog_file 和 $binlog_pos
  3. 将MySQL上线提供服务

!!!风险提示:

由于集群的 binlog-server 节点在收集集群的binlog日志时,不能保证数据的实时一致性,分布式事务的原子性,以及实际业务的一致性,只保证最终数据的一致性。同时,由于单机MySQL和集群binlog-server节点间也不能保证复制的实时性,因此,当集群故障,并将业务切换到单机MySQL时,数据并不完整,相比故障前的集群,查询数据可能存在丢失的风险。

集群恢复后的切换操作

当集群恢复后,需要将单机MySQL下线,并重新将集群提供服务。此时,整体操作流程如下:

  1. 下线单机MySQL
  2. 将集群某个ONLINE的sqlnode作为单机MySQL的从节点,复制增量数据,执行如下操作

    CHANGE MASTER TO master_host='xxx',master_port=xxx,
    master_user='xxx', master_password='xxx',
    master_binlog_file=$binlog_file,master_binlog_pos=$binlog_pos;
    START SLAVE;
    
  3. sqlnode同步完成所有数据后,执行STOP SLAVE操作,停止复制
  4. 将集群上线提供服务

其中,最后一步,可以根据实际需要,提前执行

!!!风险提示:

由于前文所述,单机MySQL上线提供服务时,数据可能并不完整。因此,单机上的增量部分,可能同集群原有的数据冲突,导致数据异常。

集群恢复上线后,需要重新构建整体的拓扑。由于当前集群的限制,原先的单机MySQL无法继续作为binlog-server从节点,需要部署一个新的单机MySQL节点,并作为binlog-server的从节点。

后续改进方案

首先,对集群进行改造,当集群应用单机MySQL的增量数据时,进行一些特殊处理,用以确保,当原单机MySQL重新作为binlog-server节点的从节点时,不会重复执行单机MySQL本身的事务数据。改造后,集群恢复后,仍可以使用原单机MySQL,直接START SLAVE到binlog-server节点,继续复制数据。

其次,对binlog-server节点改造,以主从方式部署两个binlog-server节点,保证binlog-server节点的高可靠。当binlog-server主节点故障时,需要进行如下操作:

  1. 在从节点上执行 START BINLOG SERVER 操作,启动binlog收集任务
  2. 在单机MySQL上执行STOP SLAVE操作,停止原有复制线程
  3. 在单机MySQL重新建立到新的binlog-server主节点的复制线程
  4. 故障binlog-server节点恢复后,变更为新的binlog-server主节点的从节点

最后,最单机MySQL的部署方案进行改进。以主从方式,部署多个MySQL。使用上,当建立到binlog-server的复制线程时,需要将命令进行调整,使用如下命令:

CHANGE MASTER TO master_host='xxx',master_port=xxx,
master_user='xxx', master_password='xxx',master_auto_position=1,
ignore_server_ids=(xx1,xx2);
START SLAVE;

其中,xx1和xx2分别为两个单机MySQL的server_id值。

「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

文章被以下合辑收录

评论