我正在建立一个考勤系统。大约有20 个地方人们将使用MIFARE 1K卡。它将使用MySQL作为数据库。用户首次签入时系统将显示类似“#ID IN: 800AM”的内容,用户签出时系统将显示“#ID OUT: 400PM”的内容。要实现此功能,所有数据库都需要时刻保持同步。
例如,如果用户 A 前往地点 #1 签到,但当用户想要回家时,地点 #1 的服务器出现故障,则用户需要前往地点 #2 或最近的服务器签到。地点 #2 的服务器应显示“#ID OUT: 400PM”而不是“#ID IN: 400PM”,因为用户已经签到。
那么,我应该用什么来确保这个想法可行呢?我主要担心的是网络(其他部门负责管理),它非常难以预测。它随时都可能瘫痪。
更新
哈哈,我没意识到我的问题不清楚。当有人指出时我才注意到,对此深表歉意。
我真正的问题是,我如何配置我的 MySQL 以使其相互同步(20 台服务器)?MySQL 集群?(我尝试阅读相关内容,但不确定这是否是正确的做法。)
我当前的设置(第一阶段):
- 每个服务器的本地数据库
- 操作系统:Slackware
- 主服务器用于跟踪哪位员工在哪台服务器上
- 基于 Web 的前端,供用户查看其历史记录(根据其记录连接到服务器)
主要优点
- 由于是本地数据库,因此不必担心网络问题
主要缺点
- 一个用户只能在同一台服务器上登录和退出,数据库和服务器之间互不相连。
- 如果用户想要在不同位置签到,则必须将用户添加到每个服务器。这意味着,如果用户想要前往位置 A,则必须先从位置 A 签出,然后在位置 B 签到。位置 B 的服务器不知道用户之前已在 A 签到。
顺便说一句,我已经将 NTP 集中到本地服务器。关于网络,就这么说吧,我没有权力做出改变,让网络变得更好。网络不会同时影响所有 20 台服务器,通常只会每周影响其中几台服务器几次。
如果您还有什么问题需要我解答,请直接询问。
答案1
我想您问的是:如何拥有具有自动故障转移功能的多主数据库。如果这不是您的问题,请澄清一下。如果这是您的问题,请继续阅读。
事实上,我已经为同样的事情编写了一个 Web 应用程序,只不过它不使用 Mifare 1K 卡,而是使用简单的条形码卡(它被称为 LATRIX 并且可从 sourceforge 获得,我希望这里不会插入太多内容)。
这里的主要问题是,如果您与运行前端的实际计算机的网络连接中断,您就会有点吃不消。当然,您可以运行本地数据库,并实现一些同步机制回到主数据库,但只要同步不起作用(由于没有网络),您就没有机会做到这一点。
因此,首先要做的是确保您拥有可靠的网络连接。没有它,您将永远陷入困境。LATRIX 不使用本地数据库或多主数据库,它只是检查与数据库服务器的网络连接是否正常工作。如果没有,前端终端将变为被动(即用户无法签入或签出),因为我无法找到解决网络连接不可用的合适解决方案。
答案2
它喜欢随时潜下去
当一些聪明人设计互联网时,它是为了提供一种强大的通信媒介,即使在全面核战争的情况下也能继续运行。虽然这可能会给 eBay 上的狙击竞价带来一些问题,但许多历史悠久的应用协议仍然非常有效。
您提供了大量有关系统预期用途的信息,但您没有提出任何具体问题。假设您询问如何保持时钟同步,那么最好的方法是使用网络时间协议(NTP)。请注意,几乎每个应用程序都会读取操作系统时钟来获取时间(但这不一定与硬件时钟相同)。虽然我们可能生活在不同的时区,但时间对所有人来说都以相同的速率流逝。上面的链接向您介绍了它的工作原理。互联网上有免费服务器列表 - 或者您可以运行自己的服务器(大多数 GPS 设备提供非常准确的时钟数据)。
您还没有提到您在什么操作系统上运行这一切。
顺便说一句,如果您仍在使用基于 Microsoft 的操作系统,那么您可以使用“net time \server /set”从另一台 SMB 机器设置时间 - 但这并不像 NTP 那样复杂/准确。