MySQL 复制 (Replication) 中如何加入新节点

在 MySQL 的复制集群 (Replication Cluster)中,我们会需要加入新节点,或者修复损坏了的节点。这一过程也叫做 provisioning a node 或 seeding a node。如果 master 上的binlog保留了全部的操作,在数据量不大,或者对master slave的数据复制时间要求不高的情况下,可以直接让新节点从master复制。否则,我们需要先从master或某个已有的slave上备份出数据,并导入到新节点中,然后再建立复制关系。这一过程对于新的 Group Replication 依然适用,只是它的master slave角色是集群自己管理的,而不是手工设置的。

针对不同的情况,对于已有数据的导出导入可以采用物理文件的方式,也可以采用逻辑语句的方式。采用物理文件的方式效率更高,适合已有数据量特别大的情况,需要使用企业版本的工具比如 MySQL Enterprise Backup,或者 Percona 的免费的备份工具 XtraBackup,或者LVM的磁盘快照(可以参考 MySQL Orchestrator工具)等。采用逻辑语句 (mysqldump)的方式,适合数据量不大,或者能够忍受逻辑语句执行时间的情况。

Galera Cluster提供了自动复制所有数据的功能,叫做SST (State Snapshot Transfer)。它是基于rsync算法实现的,与MySQL Enterprise Backup及 Percona XtraBackup等相同的地方是,都采用这种物理复制的方式来快速复制数据;不同的地方是由于Galera Cluster的同步特点,在数据量大的情况下,SST如果时间长,会让整个集群不能响应外部写入操作。因此,SST在很多场合都是需要避免的。

相比之下,MongoDB的集群则实现了几乎不受影响的全自动的新节点加入功能,这是因为MongoDB的集群内复制是异步的,没有Galera Cluster所面临的同步约束。

好在Percona 提供的 XtraDB Cluster 打包了 Galera, XtraBackup和 ProxySQL, 提供了一站式的MySQL高可用解决方案。该方案比 Orchestrator 的方案自动化程度高且限制性小。

参考资料

  1. http://mysqlserverteam.com/mysql-innodb-cluster-a-hands-on-tutorial/
  2. https://dev.mysql.com/doc/refman/5.7/en/mysql-innodb-cluster-introduction.html
  3. https://www.percona.com/software/mysql-database/percona-xtrabackup
  4. https://www.percona.com/software/mysql-database/percona-xtradb-cluster
  5. https://www.daiqing.me/percona-xtrabackup-%E6%80%BB%E7%BB%93/