建议1:使用分发主数据
分发主控是mysql从属服务器,已启用log-bin,启用log-slave-updates,并且仅包含具有BLACKHOLE Storage Engine的表。您可以将plicate-do-db应用于分发主服务器,并在分发主服务器上创建二进制日志,该分发日志仅包含您要进行二进制记录的数据库模式。这样,您可以减少来自分发主服务器的传出二进制日志的大小。
您可以按以下方式设置分发主服务器:
- mysql使用--no-data选项转储您的数据库以生成仅模式转储。
- 将仅模式的转储加载到分发主机。
- 将分发母版中的每个表转换为BLACKHOLE存储引擎。
- 使用真实数据从主数据库设置复制到分发主数据库。
- 将Replication-Do-db选项添加到分发主服务器的/etc/my.cnf中。
对于第2步和第3步,您还可以编辑仅模式转储,并将ENGINE = MyISAM和ENGINE = InnoDB替换为ENGINE = BLACKHOLE,然后将已编辑的仅模式转储加载到Distribution Master中。
仅在第3步中,如果要在Distribution Master中编写所有MyISAM和InnoDB表到BLACKHOLE的转换的脚本,请运行以下查询并将其输出到文本文件:
mysql -h... -u... -p... -A --skip-column-names -e"SELECT CONCAT('ALTER TABLE ',table_schema,'.',table_name', ENGINE=BLACKHOLE;') BlackholeConversion FROM information_schema.tables WHERE table_schema NOT IN ('information_schema','mysql') AND engine <> 'BLACKHOLE'" > BlackholeMaker.sql
编写脚本将表转换为BLACKHOLE存储引擎的脚本的另一个好处是,MEMORY存储引擎表也将转换。虽然MEMORY存储引擎表不占用数据存储的磁盘空间,但会占用内存。将MEMORY表转换为BLACKHOLE将使分发主数据库中的内存保持整洁。
只要您不将任何DDL发送到分发主机,就可以传输所需的任何DML(INSERT,UPDATE,DELETE),然后再让客户端仅复制所需的DB信息。
我已经在另一个StackExchange网站上写了一篇文章,讨论如何使用发行版母版。
建议2:使用较小的二进制日志和中继日志
如果将max_binlog_size设置为小得离谱,那么二进制日志可以收集并以较小的块发送出去。还有一个单独的选项可以设置中继日志的大小max_relay_log_size。如果max_relay_log_size = 0,它将默认设置为max_binlog_size。
建议#3:使用半同步复制(仅适用于MySQL 5.5)
将您的主数据库和多个分发主服务器设置为MySQL 5.5。启用半同步复制,以便主数据库可以快速将二进制日志发送到分发主数据库。如果所有从属服务器都是分发主服务器,则可能不需要半同步复制或MySQL 5.5。如果除分发主服务器以外的任何从服务器具有用于报告,高可用性,被动备用或备份目的的真实数据,则将MySQL 5.5与半同步复制一起使用。
建议4:使用基于语句的二进制日志记录而不是基于行的日志记录
如果SQL语句更新表中的多行,则基于语句的二进制日志记录(SBBL)仅存储该SQL语句。使用基于行的二进制日志记录(RBBL)的同一SQL语句将实际记录每行的行更改。显而易见,传输SQL语句将节省执行SBBL而不是RBBL的二进制日志的空间。
另一个问题是将RBBL与copy-do-db结合使用,其中表名前面带有数据库。这对于从属者(尤其是分发主服务器)来说不是很好。因此,请确保所有DML在任何表名之前都没有数据库和句点。