我们在 5 个不同位置拥有 MySQL 5.1 数据库,我们需要尽可能保持同步。每个办公室都需要从/向其本地服务器读取/写入数据,但我需要每个办公室的数据库反映所有办公室所做的更改。数据更改仅在典型的 9-5 点办公时间内进行,而且 WAN 速度很慢(1-5 Mbps)。
我无法让所有站点的写入都集中到一个主服务器上,而且根据我从文档和其他站点获得的理解问答在这里主-主复制不适合这种情况,并且可能会导致数据丢失。
以下是我倾向于采取的方法:
设置触发器来审计插入、更新(仅更改的字段)和删除,并在一天结束时将这些写入 1 个位置。
每个办公室每晚都会运行一项工作,下载所有办公室的整个审计日志,并根据审计跟踪时间戳写入最新的更改 - 这是一种简单的方法,但我们没有太多需要担心的限制,并且使用数据的应用程序会为新记录创建 GUID,因此无需担心自动增量。
有没有比这种手动方法更好的方法,或者有没有比手动方法更好的方法?我是否遗漏了有关多主复制的某些内容?这远非理想,但至少可以让我们每天开始时同步。我欢迎任何建议。
谢谢。
答案1
如果您采用这种方法,则可能会对速度产生不利影响,即使用新记录和脏记录的标志(新记录可以是 INSERTed 行的默认值,脏记录可以由 UPDATE 上的触发器设置),但这取决于工作流和审计要求。不是复制一天中对记录的所有重复更改,而是只在所有其他系统上更新最终值,然后清除标志。您仍然需要一个用于删除的表(除非您想使用非常流行的“deleted_on”时间戳并可能更改所有代码)。如果记录在写入后不会发生很大变化,那么您将无法从中获得太多收益。
不过,这要求服务器在一天结束时保持运行。有了审计表,您可以在数据库发生故障时定期(而不是仅在一天结束时)将审计表写入其他地方的文件中。
答案2
加莱拉是一个同步多主解决方案,您可能需要研究一下。我自己对此了解不多,认为它很深奥,但您可能需要更仔细地研究一下。
干杯
答案3
根据应用程序的不同,有些事情会导致复制中断,即自动增量键插入之间的冲突。
复制将有效,无论是循环复制还是星型复制,并且它将仅传输需要写入的操作。如果它收到已经处理的写入数据包,它将忽略它。由于站点之间的带宽较低,如果没有冲突问题,您可以在工作时间停止从属复制以节省带宽,并在一天结束时启动它。如果您的代码不知道它正在进行更新,那么您可能会多次遇到从属因错误而停止并需要处理的情况。
如果您有足够的空间,您可以将每个远程办公室的自动增量起始值设置得足够远,以使它们不会相互超越。
复制并不适合您的情况,并且由于您的系统并未真正意识到复制正在发生,因此您可能会遇到一些问题,但是,它可能运行得足够好。