10

我想向使用 Galera 集群(mysql)作为数据库的分布式应用程序添加缓存。每个应用程序节点 (java) 都有一个本地缓存,用于读取并与 DB 节点通信。

问题是当集群中的另一个节点修改这些条目时,我不知道如何使缓存中的条目无效。
我的第一次尝试是使用数据库触发器,但我很快意识到复制更新不会引发触发器。
其他想法是监控网络流量搜索修改或查看 DB 的二进制日志,但它们似乎都很难实现。

问题是:是否有任何实用的方法来检测一个节点在复制中来自另一个节点的变化?
实现缓存失效的其他想法?

我想我也可以使用分布式缓存来通过应用程序节点传达更改,但我更喜欢在每个应用程序节点中使用隔离缓存并将节点之间的数据同步委托给数据库集群。我将缓存通信视为冗余网络流量......

提前致谢。

4

2 回答 2

4

坦率地说,您对系统进行了过度设计。

每个 Java 客户端“附近”都有一个集群节点,对吗?也就是说,每个数据中心都有一个 Node 加上一个或多个 Java 客户端?

那时,Java 和数据之间几乎不需要额外的缓存。只需重新请求数据并让 MySQL 进行缓存。

如果您有缓慢的查询,那么让我们讨论它们,看看它们是否可以加快速度。

我描述的设置应该能够每秒处理数百甚至数千个查询。你的要求比这更严格吗?

参见wsrep_sync_wait处理因果关系检查。

于 2017-07-15T22:51:12.977 回答
1

我能想到的仅使用 MySQL 来检测更改的唯一方法是解析二进制日志。

由于您要求替代方案,您可以使用消息传递系统(例如 Apache ActiveMQ)在节点之间发送缓存失效消息,以便每个节点都可以清除自己的缓存。

于 2017-07-22T02:05:19.893 回答