我们使用MySQL集群和proxySQL,设置如下:
- 服务器1是托管主数据库的主服务器,位于欧洲
- Server 2是一个位于亚洲的服务器,用于服务本地用户,该服务器包含一个只读版本的数据库,当发生更改时由Server 1更新。
问题是:服务器2上的用户触发SQL UPDATE, UPDATE customers SET name= 'New name ' WHERE id = 123。(此更新被发送到服务器1,然后服务器2更新)
在同一个代码块中,如果我们选择记录(select name FROM customers WHERE id =123),这个查询将被发送到本地服务器,结果将是"旧名称";除非我们暂停代码1秒(测试)。
我们考虑的一个解决方案是改变连接(PHP),并直接转到服务器1来处理剩余的代码块,但这有点违背目的,而且远非理想(需要更新的代码库非常大)。
是否有涉及到proxySQL的解决方案?
为了防止查询路由到具有高复制延迟的slave,可以在表mysql_server列中设置最大复制延迟阈值max_replication_lag。Ref: max_replication_lag
max_replication_lag -如果大于0,ProxySQL将退出定期监视复制延迟,以及是否超出了配置阈值,它将暂时避开主机,直到复制赶上。
还可以创建查询规则来分割查询的读写。ref: ProxySQL Split Read/Write
重要如果你使用的是Mysql 5.7.5或更新的版本,这可能会解决你的问题。