mysql master master master

我有n台服务器,并计划使用master-masterconfiguration安装n台主服务器。 什么架构将是最好的? 另外我需要照顾自动增量表的东西…

说,如果我的服务器是A,B,C和D。 B的主人是A,C和B的主人,D的主人是C,A的主人是D,是否安全? 会导致任何数据一致的问题。 还有没有其他更好的办法?

您所描述的拓扑称为“循环复制”。 你基本上build立一个环,每个节点作为下一个节点的主节点。 高性能MySQL的作者提出了这种拓扑结构,原因如下:

  • 这取决于每个可用的节点,因此增加您的失败概率。
  • 如果从环中删除节点,则源自该节点的复制事件将进入无限循环,因为将会过滤它们的唯一节点不再可用。

这种types的拓扑结构可以是你的敌人或你的朋友,这取决于你执行主读写操作的位置。 成功使用循环复制的关键是以下循环复制规则

  • 将数据库上的DML限制在同一个数据库服务器上
  • 将数据库上的SELECT查询限制在同一个数据库服务器上
  • 使用auto_increment值来创build数据分界

CASE IN POINT

我的雇主的networking托pipe公司主办了一家汽车经销商客户关系pipe理公司,该公司在美国(+夏威夷)拥有859家经销商。

他们有3个数据库服务器,每个都有以下

  • 192 GB RAM(16GB RAM磁盘,162GB InnoDB缓冲池)
  • 双HexaCore(没错,12个CPU)
  • 1.7TB数据量(776GB经销商数据)

所有数据库服务器都使用循环复制

客户端每个经销商都有一个数据库,因此在MySQL实例中有一个多租户数据库布局。

客户的开发人员通过分配一定数量的经销商来在15个Web服务器之间读取和写入数据来分开写入。 每个Web服务器专用于从三个数据库服务器之一读取和写入。 这大概是283个经销商写入一个数据库。 客户select既不使用replicate-do-db也不使用replication-ignore-db,因为这会使数据库的大量包含或排除列表成为可能。

每个数据库服务器为/etc/my.cnf分别设置auto_increment_increment和auto_increment_offset

服务器1

[mysqld] auto_increment_increment=10 auto_increment_offset=1 

Server2上

 [mysqld] auto_increment_increment=10 auto_increment_offset=4 

server(服务器)

 [mysqld] auto_increment_increment=10 auto_increment_offset=7 

auto_increment_increment和auto_increment_offset被设置为保护所有经销商数据库中的每个DB服务器的MySQL实例内的auto_increment值的完整性。

只要我的客户遵循循环复制规则,客户就有以下范例可供使用:

对于任何经销商DLR

  • 一个DBServer W用于写入DLRDB
  • 两台DBServer(R1,R2)提供了DLRDB的热备份
  • 其中一个热备份可用于mysqldump备份,而不会干扰其他DLRDB

客户自2011年3月以来一直使用这种拓扑,而没有像数据完整性一样抱怨。

结束点的情况

我的雇主的networking托pipe公司也在几十个较小的客户端中提供这种相同的数据库拓扑/基础设施多年,而没有投诉。 只要您严格遵守订婚循环复制规则,就可以完全信任循环复制。

试一试 !!!

警告

MySQL 5.5有一个新的命令扩展名CHANGE MASTER TO叫IGNORE_SERVER_IDs 。 根据这个MySQL文档:

IGNORE_SERVER_IDS被添加到MySQL Cluster NDB 6.1.29,MySQL Cluster NDB 6.3.31,MySQL Cluster NDB 7.0.11和MySQL Cluster NDB 7.1.0(参见Bug#47037)中。 该选项采用逗号分隔的0个或更多服务器ID列表。 来自相应服务器的事件被忽略,除了日志轮转和删除事件,它们仍然logging在中继日志中。

在循环复制中,始发服务器通常作为其自身事件的终结器,从而不会多次应用。 因此,当圆中的一台服务器被删除时,这个选项在循环复制中很有用。 假设您有4个服务器的循环复制设置,服务器ID为1,2,3和4,服务器3失败。 当通过开始从服务器2到服务器4的复制来弥合间隙时,可以在服务器4上发出的CHANGE MASTER TO语句中包含IGNORE_SERVER_IDS =(3),告诉它使用服务器2作为主服务器而不是服务器3。因此会导致它忽略并且不传播任何源于不再使用的服务器的语句。

如果在没有IGNORE_SERVER_IDS选项的情况下发出CHANGE MASTER TO语句,则保留任何现有列表; RESET SLAVE对服务器ID列表也没有影响。 要清除被忽略的服务器列表,有必要使用带有空列表的选项:CHANGE MASTER TO IGNORE_SERVER_IDS =(); 如果IGNORE_SERVER_IDS包含服务器自己的ID,并且启用了服务器,并且启用了–replicate-same-server-id选项,则会导致错误。

从MySQL 5.1.47开始,调用CHANGE MASTER TO将使MASTER_HOST,MASTER_PORT,MASTER_LOG_FILE和MASTER_LOG_POS的先前值与执行前的从属状态的其他信息一起写入错误日志。

这个命令扩展非常适合将DB服务器从循环复制拓扑中移除,而不必让SQL命令在无限循环中绕过环。