如何解决轻巧,健壮的MySql复制替代品—用于客户端应用程序而非基础结构
|| 我正在维护的几个软件直接连接到远程数据库,以获取他们需要操作的数据。过去,这不是问题。但是,客户端现在需要一种功能,该功能要求执行返回大量历史数据的查询。网络延迟确实开始成为一个问题。 我的第一种方法是使查询rdbms的软件完全相同,只是将其指向localhost。然后,只需直接在客户端计算机(笔记本电脑/上网本/等)上构建从属设备,然后再进行一次超级快速存储即可,因为没有网络调用。 非常明显的问题是这不是复制的目的。损坏或破坏奴隶真的很容易,尤其是在频繁重启(有时是意外地)的计算机上,例如运行我的软件的笔记本电脑和上网本。而且由于我们在客户端计算机上具有0特权,因此无法使用损坏的从属服务器。我个人很喜欢复制,但是当事情破裂时,总会有很多人为干预-这不适合这里。 这里是否有一些健壮的替代方案?我正在考虑一个在安装时会重建大型转储的系统。然后,只要有网络连接,我的C#.NET服务就会填补从上次更新到当前时间的空白。 它不会像奴隶一样追溯执行更新,它不会做奴隶所做的任何事情。它只会从不断增长的远程主机中添加新行。这些限制在可接受范围之内。吸引人的是,这个.NET的“ rdbms管理器”可能真的很小,从而将可能发生错误的位置减至最少,这似乎是我放弃的所有不需要的复制功能的良好交换。 我在这里缺少什么,还是有更好的选择?谢谢。解决方法
关于编写自己的内容,由于您的要求如此狭窄,因此绝对可以这样做。如果它们不太可能更改,那可能会更好。当然,您必须小心设计,以免任何干扰只会导致以后重新尝试。
至于已经可以进行高度可配置的数据同步的东西,我一直在使用SymmetricDS。它对中断非常有弹性,并且在连接较慢时效果很好。由于您指定了MySQL,因此它仅基于5和更高版本,因为它基于触发器。但是,这是一个可以考虑的选项。
关于SymmetricDS配置的一些知识:因为我真的无法简短回答您的评论。
除了提供端口,数据库驱动程序和连接信息,注册节点URL,自身URL等服务信息的属性文件之外,复制内容以及将其发送到何处的配置都在数据库中(默认表前缀
sym_
) )。甚至您可以放入属性文件中的大多数内容都可以放在ѭ1表中。
所有复制配置都在注册节点(通常也是中央/顶层节点)上完成。更改就像数据更改一样进行传输,子节点会自动重新同步其触发器。我将简单地通过一个非常基本的配置来进行2层设置(中央和存储),1表双向。不过,我不会涉及节点,注册,初始负载或其他管理。
以下语句非常简单。如果您只是通读它们,很显然,它们是定义“中央”组(或层)的节点与“存储”组的节点之间的关系的一部分。路由器是复制配置的关键部分,它定义捕获的数据事件如何路由以及路由到何处。此处每个名称都以ѭ2表示,因为默认设置是使用表的主键并将其发送到目标组的所有节点。
insert into sym_node_group (node_group_id,description) values (\'central\',\'Central database\');
insert into sym_node_group (node_group_id,description) values (\'stores\',\'Store database\');
insert into sym_node_group_link (source_node_group_id,target_node_group_id,data_event_action)
values (\'stores\',\'central\',\'P\');
-- stores push to central
insert into sym_node_group_link (source_node_group_id,data_event_action)
values (\'central\',\'stores\',\'W\');
-- central waits-for-pull from stores
insert into sym_router (router_id,source_node_group_id,create_time,last_update_time)
values (\'central-to-store-identity\',current_timestamp,current_timestamp);
insert into sym_router (router_id,last_update_time)
values (\'store-to-central-identity\',current_timestamp);
以下是我们要复制的表的详细信息。通道用于隔离表组。如果在一个通道中为某个事件批处理数据事件时遇到问题,则不会影响其他通道。您还可以暂停或忽略整个通道的批处理。触发器条目只是说“我想从该表中捕获数据事件”,而ѭ5的sync_on_incoming_batch
值是特殊的,因为这样可以将存储中的更改复制到中心,然后再复制到所有其他商店。然后,您创建触发器/路由器关联以完成捕获数据事件并将这些事件发送到其他节点之间的关系。一个用于将更改从商店发送到中央,另一个用于另一种方式。
insert into sym_channel (channel_id,processing_order,max_batch_size,enabled,description)
values (\'rewardscard-channel\',1,100000,\'rewards card tables\');
insert into sym_trigger (trigger_id,source_table_name,channel_id,last_update_time,sync_on_incoming_batch)
values (\'customer-trigger\',\'customer\',\'rewardscard-channel\',1);
insert into sym_trigger_router (trigger_id,router_id,initial_load_order,create_time)
values (\'customer-trigger\',\'store-to-central-identity\',200,current_timestamp);
insert into sym_trigger_router (trigger_id,\'central-to-store-identity\',100,current_timestamp);
这些表中没有显示许多列,这些列使您可以很好地控制复制。但是,所有表和列均在用户手册的附录A中进行了描述。
同样,安装也不是一件容易的事,学习时只需一点点手册。我创建了用于客户端的配置,但是我制作了静默安装脚本供技术人员使用,以使客户端分两步运行。另一个脚本启动了客户端数据库的初始加载,并将其上传到中央数据库(反之亦然,我在中央数据库执行此操作)。
您可以静默安装Java和SymmetricDS(它确实提供了一种将其作为Windows服务安装的方法)。每个节点必须具有唯一的ID,因此您必须部分生成属性文件,以及用于连接到本地数据库的信息(我认为是有关需要哪些特权的手动讨论)。
您可以在中央数据库中进行开放注册,以便任何计算机都可以注册,否则中央节点必须在sym_node
和sym_node_security
中具有条目,才能在节点尝试注册之前为已知的node_id
进行注册。
您可以继续进行以下工作:安装程序将数据库数据的初始脚本运行到客户端的本地数据库中。当您从中心向下进行初始加载到节点时,它将更新现有行,或者如果找不到则插入。但是,触发器/路由器关联有一个“ѭ10”列:您可以定义一个select语句,以将发送的数据限制为仅安装脚本中未包含的内容。
从远程客户端安装集中到一个中心来开始初始加载可能需要安装在该中心上的另一个服务的帮助,安装可以向该服务器发送请求,然后该服务对中央数据库进行更改以开始该初始加载。我还不知道节点从父节点请求初始加载的方法。如果您不想使用开放式注册(安装程序会发送“ 9”,并且该服务会插入两行以启用注册),则该服务还可以轻松地促进注册。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。