Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/77.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
cnx丢失后群集mysql服务器重新同步_Mysql_Sql_Synchronization - Fatal编程技术网

cnx丢失后群集mysql服务器重新同步

cnx丢失后群集mysql服务器重新同步,mysql,sql,synchronization,Mysql,Sql,Synchronization,我们正在创建一个应用程序,其中将有一个主服务器,但我们的客户端在办公室中也将有一个服务器,这可能会丢失与主服务器的连接。我们正在研究如何配置MySQL,以便1)正常地通过internet向主机写入数据,而从机只是被动地向下拉2)如果与internet/外部世界的连接丢失,则在具有访问权限的办公室的本地服务器上进行读写,3)当连接恢复时,同步完成,工作完美无瑕 一个小问题是,可能有2或3个这样的从属服务器,因此同步必须足够健壮,可以用于多个服务器 假设在网络连接中断之前,有三台服务器的联系人表有1

我们正在创建一个应用程序,其中将有一个主服务器,但我们的客户端在办公室中也将有一个服务器,这可能会丢失与主服务器的连接。我们正在研究如何配置MySQL,以便1)正常地通过internet向主机写入数据,而从机只是被动地向下拉2)如果与internet/外部世界的连接丢失,则在具有访问权限的办公室的本地服务器上进行读写,3)当连接恢复时,同步完成,工作完美无瑕

一个小问题是,可能有2或3个这样的从属服务器,因此同步必须足够健壮,可以用于多个服务器

假设在网络连接中断之前,有三台服务器的联系人表有100条记录。在最复杂的场景中,将在所有3个位置添加一条新记录。重新连接过程将识别未同步的记录,完成此过程后,每个表将有103条记录,主键将重新排序

再加上外键的层叠更新——关于这方面的正确方向有什么建议吗?我正在考虑为此编写一个PHP例程,但不想重新发明轮子


谢谢

这将是一个非常难以设计、测试和维护的体系结构。我强烈建议您重新考虑您的设计是否需要分区容差(特别是允许写入未连接到主机的数据库的能力)

如果这是绝对必要的,您需要处理的几个问题包括:

  • 您需要完全停止使用
    AUTO_INCREMENT
    主键,因为在拆分后几乎不可能安全地同步它们,因为同一个键可能已被多个服务器使用,并且该键可能存在于事后无法更新的位置(例如,在URL中!)。通过使用每个服务器的偏移量生成主键(例如,服务器A使用ID
    100
    200
    300
    ,服务器B使用
    101
    201
    301
    ,等等),或者通过使用GUID主键生成主键,这样就不会发生冲突

    请注意,GUID主键对MySQL服务器性能有明显的负面影响,因为它们会将索引弄得一团糟。小心行事

  • 如果您认为将更新同步到数据库很困难,那么通过比较,处理更新和删除会使这看起来很容易。一种解决方法是完全避免更新和删除—将每个表视为“日志”,在对象状态每次更改时(包括删除时)插入新行,并将标识符的最近一行视为“当前状态”。这将使数据库上的任何类型的关系操作基本上不可能(因为在这样的表上执行任何类型的有用连接都是非常困难的!),但它至少会简化同步任务

    如果不可能的话,形势开始变得相当严峻。在网络未完全连接时,您可能需要维护所有更改的日志,并在每次服务器重新连接时协调这些日志。这可能无法很好地扩展

    请记住,任何自动冲突解决方案都可能导致某些数据丢失或意外结果。特别是,如果记录的单个字段由网络拆分的双方更新,您的同步工具将需要选择一个新值来“赢”,或者以某种方式合并这些值。根据字段是什么以及它代表什么,这可能非常困难,甚至不可能。(对于一个特别糟糕的例子,考虑如果一个字段代表一个用户的银行帐户余额,并且一个更新的一个更新在同步中丢失会发生什么)

如果您对这些主题感兴趣,您可能需要研究一些基本理论。以下是几个特别感兴趣的概念:

  • 本质上说,如果没有折衷,就不可能有一个容错系统
  • ,这是一种将更改同步到分布式系统中单个对象的方法
  • ,这将减轻您调试此系统的痛苦
TL;DR:分区容差很难。真的很难。尽可能避免处理它