我有一个主数据库,这将是云服务器,包括不同的学校。
包含每个学校详细信息的 Jmeter 板类型。可以编辑他们的信息和其他数据。
现在,这些学校被部署到它们相应的学校位置,即本地服务器。
Jmeter 板类型,只能编辑本地服务器中部署的特定学校。可以编辑他们的信息和其他数据。
现在我要做的是,同步 cloud to local server
在他们相应的学校,如果有什么改变。这也适用于 local to cloud server
.
注意:如果你们试过evernote,它可以在你使用的任何设备上编辑notes信息,并且在你上网或手动单击“同步”时仍然能够同步。
当本地服务器没有互联网连接并且在学校编辑了一些数据时。一旦互联网开通,本地服务器和云服务器的数据应该同步。
这就是我追求的逻辑。
有人能告诉我从哪里开始吗?我想不出任何适合我的问题的解决办法。
我还考虑使用php来foreach整个表的循环和对应于当前日期和时间的数据。但我知道那会很糟糕。
编辑:我删除了关于此事的其他so问题的参考/帖子。
我找到的应用程序标签是
埃弗诺
todoist公司
服务器:
本地服务器计算机:windows 10(部署在学校)
云服务器:可能是一些使用 phpmyadmin
不要吹毛求疵,但希望答案是,您正在与一个新手交谈,以掌握从数据库的过程。我没有这方面的经验。
5条答案
按热度按时间ikfrs5lh1#
当我们过去这样做时,我们会:
确保要同步的每个表都创建了datetime列;修改;&删除。它们还将有一个boolean isdeleted列(因此,与其物理删除记录,不如将其标记为true,并在查询中忽略它)。这意味着我们可以查询自某个时间以来已删除的任何记录,并返回这些已删除ID的数组。
在每个数据库(主数据库和从数据库)中,创建一个表来存储上次成功的同步日期时间。在主表中,这个表存储多条记录:每个学校1条记录,但在从表中,它只需要1条记录—上次与主表同步时的记录。
在你的情况下,每一个奴隶都会:
调用master的webservice(一个url),比如“hellomaster”。它将传入学校名称(或某个特定标识符)、上次与主服务器成功同步的时间、身份验证详细信息(出于安全考虑),并期望主服务器响应自提供的日期时间以来是否有任何学校更新。实际上,这里的重点只是寻找一个确认,主可用和监听(即互联网仍在运行)。
然后,从服务器将调用另一个webservice,比如说“sendupdates”。它将再次传入学校名称、上次成功同步(加上安全身份验证详细信息)以及自上次同步以来添加、更新和删除的记录的三个数组。船长只是确认收到。如果回执被确认,那么从机将移动到步骤3,否则在暂停一段时间后,从机将再次尝试步骤1。所以现在主设备有了从设备的更新。注意:如果记录与其挂起的从属更新有冲突,则由主记录决定如何合并记录。
然后从服务器调用一个webservice,比如说“getupdates”。它传入学校名称、上次成功同步、安全身份验证详细信息,然后主服务器返回给它三个数组,以获取它所拥有的任何添加、更新和删除的记录,而从属服务器将应用于它的数据库。
最后,一旦从属服务器尝试更新其记录,它将通过另一个webservice通知主服务器成功/失败,比如'updatestatus'。如果成功,那么主服务器将返回一个新的同步日期,以便从服务器存储(这将与主服务器在其表中存储的日期完全匹配)。如果失败,那么错误会记录在主程序中,暂停后返回步骤1。
我遗漏了一些关于错误处理的细节,在所有设备上获得准确的时间(可能涉及到不同的时区),以及其他一些细节,但这就是要点。
我可能会在仔细考虑之后做出改进(或者其他人可能会编辑我的帖子)。
希望这至少有帮助。
polkgigr2#
编辑:
这个答案的原始版本是mongodb提出的;但进一步阅读后发现,mongodb在不可靠的互联网连接上并不那么可靠。couchdb是为离线文档而设计的,这正是您所需要的——不幸的是,它比mongodb更难获得。
原件:
我建议不要使用mysql,而是部署一个文档存储
z0qdvdin3#
不需要任何复杂的设置或API。mysql允许您轻松地复制数据库。mysql将确保复制是正确和及时的,只要互联网是可用的(而且速度也很快)
有:
主-从:主编辑从读或者换句话说,从主到从的单向同步。
master-master:master1编辑master2读取和编辑,或者换句话说,双向同步。两个服务器都将推送和拉送更新。
假设您的云服务器有每个学校的模式,每个模式都可以通过自己的用户名和密码访问。i、 e db\ U学校1、db\ U学校2
现在您可以选择只将选定的数据库模式从云复制到本地主服务器。在你的情况下,一所学校的当地老师只会“复制一所学校”
如果您只想复制特定的表,mysql还有“replicate do table”选项
实际的复制过程非常简单,但是当您有不同的场景时,复制过程可能会非常深入。
要注意的几件事,服务器ID,每个服务器上不同的自动增量值,以避免与新记录冲突。i、 master1生成奇数记录,Master2生成偶数记录,这样就不会出现主键重复的问题。服务器关闭警报/监视,错误跳过
我不确定您是在linux还是windows上,我编写了一个简单的c应用程序,它检查是否有任何主机没有复制或出于任何原因停止复制,并发送电子邮件。监控至关重要!
这里有一些主复制的链接:https://www.howtoforge.com/mysql_master_master_replication
https://www.digitalocean.com/community/tutorials/how-to-set-up-mysql-master-master-replication
还值得一读此优化的tabl级复制信息:https://dba.stackexchange.com/questions/37015/how-can-i-replicate-some-tables-without-transferring-the-entire-log
希望这有帮助。
0ve6wy6x4#
我建议你采用一个简单的解决方案,我认为:
在本地服务器上创建sqllite或任何数据库(mysql或您选择的)
保持一个始终运行的线程,它将每隔5分钟ping(进行api调用)一次主数据库(取决于接受的延迟时间)
通过该线程,您可以检测是否连接到internet。
如果连接到internet
a) 将本地更改与请求一起发送到主服务器,此主服务器是一个应用程序服务器,它将能够在根据应用程序使用情况进行某些验证后,将学校本地计算机的更改(您通过api调用收到此更改)更新到主数据库。
b) 在api调用后从服务器接收更新的更改,这些更改在解决冲突后提供(例如,如果学校服务器中的数据更新的时间早于主数据库中的数据更新的时间,那么您将根据您的要求接受哪一个)。
如果未连接到internet,则保持将更改存储在本地数据库中,并将这些更改反映在正在学校运行的应用程序中,但当连接时,将这些更改推送到主服务器,并从主服务器拉取适用的实际更改。
这是复杂的,你自己去做,但如果规模是小的,我宁愿实现你自己的API的数据库应用程序,将以这种方式连接。
更好的解决方案是使用googlefirebase,这是一个实时数据库,在任何机器发生变化时都会异步更新,但如果真的不需要的话,成本会更高。但它确实可以为您的数据库系统提供evernote类型的实时编辑功能。
of1yzvn45#
这不是一个可以通过数据库复制解决的问题。
一般来说,数据库复制可以采用以下两种模式之一:
主/从复制,这是mysql使用的。在这种模式下,所有写操作都必须路由到一个“主”服务器,并且所有副本数据库都从主服务器接收一个更改提要。
这不适合你的需要,因为只能写给主人(直接修改其中一个副本将导致它与主副本永久不同步。)
一些较新的数据库使用的基于仲裁的复制。所有数据库副本都相互连接。只要至少有一半的复制副本已连接(即,群集已达到“仲裁”),就可以对任何活动数据库进行写入,并将其传播到所有其他数据库。未连接的数据库将在加入仲裁时更新。
这也不适合您的需要,因为无法写入断开连接的复制副本。更糟糕的是,如果一半以上的复制副本与主副本断开连接,则会阻止其余数据库写入其中任何一个副本!
您需要的是某种数据同步解决方案。任何解决方案都需要一些逻辑——您必须编写这些逻辑!——解决冲突(例如,如果在主数据库中修改一条记录,而学校的本地副本断开连接,并且在那里也修改了同一条记录,则需要某种方法来协调这些差异。)