我在客户端上运行的应用程序使用在服务器上运行的 MySQL 数据库。因此多个客户端连接到同一服务器。当服务器在线时,这很有效。但现在我想增强我的应用程序,使其能够在离线模式下运行。
+--------------+
| |
+-----------+ SERVER +----------+
| | | |
| +-------+------+ |
| | |
+------+-------+ +-------+------+ +-------+------+
| | | | | |
| Client 1 | | Client 2 | | Client X |
| | | | | |
+--------------+ +--------------+ +--------------+
现在问题来了:客户端离线时会发生什么?我还需要在每个客户端上有一份 MySQL 数据库的副本。默认情况下,应用程序与服务器上的 MySQL 进行交互。如果该服务器无法访问(出于某种原因:服务器离线或客户端没有互联网连接),则应使用客户端上运行的 MySQL。如果客户端/服务器连接再次可用,则需要自动同步数据库。
我现在的问题是:如何实现这一目标?首先,我检查了 MySQL 复制,但在我的场景中,我有多个“主机”和未知数量的客户端。所以我担心复制不是我的解决方案。 MaxScale 可以解决我的问题吗?我从来没有处理过这个问题,所以我真的很感谢任何帮助。
如果您只是想让应用程序在服务器离线时以只读模式工作,则需要在客户端所在的同一服务器上以只读模式创建本地副本。这只有在数据量不太大的情况下才可行。对于此用例,MaxScale 可以提供帮助,因为它可以放置在客户端应用程序和数据库的本地只读副本所在的同一服务器上。在此配置中,MaxScale 只是充当数据库代理,将请求重定向到远程服务器(如果可用),如果不可用,则将请求重定向到本地只读副本。
这是 MaxScale 中 readwritesplit 服务配置的一个简短示例,可以实现此目的。要配置的关键参数是
master_failure_mode
,只要正在进行只读操作,它就允许远程服务器出现故障;master_reconnection
,它允许您在远程服务器恢复正常时重新连接到中途连接。
[Read-Write-Router]
type=service
router=readwritesplit
servers=remote-server,local-readonly-server
user=...
password=...
master_failure_mode=fail_on_write
master_reconnection=true
如果您希望应用程序也能够对数据库进行修改,这需要某种冲突解决协议,并且在实践中很难做到。此时,您可能需要重新考虑离线功能的目标,并采用不同的方法,也许通过在本地缓存更改,然后解决应用程序中的任何冲突。