我有n台服务器,我计划使用主主配置来设置n台主服务器。什么样的建筑将是最好的?另外,我需要处理自动增量表的事情.
如果我的服务器是A,B,C和D。把B的主人指为A、C和B的主人、D的主人为C、A的主人为D是安全的吗?会不会导致任何数据一致的问题。还有其他更好的方法吗?
发布于 2011-10-23 07:49:39
您所描述的拓扑称为“循环复制”。您基本上是在设置一个环,其中每个节点充当下一个节点的主节点。高性能MySQL的作者建议不要使用这种拓扑,原因如下:
发布于 2011-10-24 15:40:59
这种拓扑可以是您的敌人,也可以是您的朋友,这取决于您在哪里执行主读和写。成功使用循环复制的关键是以下循环复制接触规则:
点的案例
我雇主的网络托管公司拥有一家汽车经销商CRM公司,该公司在美国各地拥有859家经销商(+夏威夷)。
它们有3个DB服务器,每个服务器具有以下内容
所有DB服务器都使用循环复制。
客户端每个经销商都有一个数据库,因此在MySQL实例中有一个多租户DB布局。
客户端的开发人员通过在这15台Web服务器中分配一定数量的代理来读取和写入数据来分离写入。每个web服务器都专门用于从三台DB服务器中的一台进行读写。这是大约283个经销商写到一个数据库。客户端选择既不使用复制-do-db也不使用复制-忽略-db,因为这将使DBs成为一个庞大的包含或排除列表。
每个DB服务器,用于/etc/my.cnf的自动_增量_增量和自动_增量_偏移的折叠设置
Server1
[mysqld]
auto_increment_increment=10
auto_increment_offset=1Server2
[mysqld]
auto_increment_increment=10
auto_increment_offset=4Server3
[mysqld]
auto_increment_increment=10
auto_increment_offset=7auto_increment_increment和auto_increment_offset设置为保护每个DB服务器的MySQL实例中所有代理DB之间的auto_increment值的完整性。
只要我的客户遵循循环复制约定规则,客户端就可以使用以下范例:
任何经销商DLR
自2011年3月以来,客户端一直使用这种拓扑结构,甚至没有对数据完整性提出任何抱怨。
点的情况
我的雇主的网络托管公司也提供相同的DB拓扑/基础设施数十个较小的客户多年来没有投诉。只要严格遵守循环复制约定规则,就可以完全信任循环复制。
试试看!!
MySQL 5.5为将主程序更改为“忽略”提供了新的命令扩展。根据有关这方面的MySQL文档:
IGNORE_SERVER_IDS被添加到MySQL集群NDB6.1.29、MySQL集群NDB6.3.31、MySQL集群NDB7.0.11和MySQL集群NDB7.1.0中(参见Bug #47037)。此选项采用以逗号分隔的0或多个服务器ID列表。将忽略来自相应服务器的事件,但日志旋转和删除事件除外,这些事件仍然记录在中继日志中。在循环复制中,原始服务器通常充当自己事件的终止符,因此它们不会被应用不止一次。因此,当删除循环中的一个服务器时,此选项在循环复制中非常有用。假设您有一个具有4个服务器的循环复制设置,服务器ID为1、2、3和4,而服务器3失败。当开始从服务器2复制到服务器4时,可以在“更改母版”中包含IGNORE_SERVER_IDS = ( 3 ),以便您在服务器4上发出语句,告诉它使用服务器2而不是服务器3。这样做会导致服务器忽略,而不会传播任何源自不再使用的服务器的语句。如果在没有任何IGNORE_SERVER_IDS选项的情况下发出“更改主语句”,则保留任何现有列表;“重置从服务器”也不影响服务器ID列表。要清除被忽略的服务器列表,必须使用空列表选项:将主服务器更改为IGNORE_SERVER_IDS = ();如果IGNORE_SERVER_IDS包含服务器自己的ID,并且服务器启动时启用了-复制-相同的服务器-id选项,则会出现错误结果。从MySQL 5.1.47开始,调用变更母版将导致将MASTER_HOST、MASTER_PORT、MASTER_LOG_FILE和MASTER_LOG_POS的前几个值写入错误日志,以及执行之前有关从服务器状态的其他信息。
这个命令扩展很好地将DB服务器从循环复制拓扑中移除,而不需要在无限循环中执行SQL命令。
https://serverfault.com/questions/323924
复制相似问题