我想将缓存添加到使用Galera集群(mysql)作为DB的分布式应用程序。每个应用程序节点(java)都有一个用于读取和的本地缓存 与数据库节点通信。
问题是当集群中的另一个节点修改了条目时,我不知道如何使缓存中的条目无效。
我的第一次尝试是使用数据库触发器,但我很快意识到复制更新不会引发触发器
其他想法是监控网络流量搜索修改或观看DB的binlog,但这两者似乎都很难实现。
问题是:是否有任何实用的方法可以检测复制中来自另一个节点的更改? 实现缓存失效的其他想法?
我想我也可以使用通过应用程序节点传递更改的分布式缓存,但我更喜欢在每个应用程序节点中使用隔离缓存 并将节点之间的数据同步委托给数据库集群。我认为缓存通信是冗余的网络流量......
提前致谢。
答案 0 :(得分:4)
说白了,你已经过度设计了系统。
每个Java客户端附近有一个群集节点,对吗?也就是说,每个数据中心都有一个节点加上一个或多个Java客户端?
此时,Java与数据之间几乎不需要额外的缓存;只需重新请求数据并让MySQL进行缓存。
如果您的查询缓慢,那么让我们讨论一下,看看它们是否可以加速。
我描述的设置应该能够处理数百甚至数千个每秒的查询。你的要求比那更严格吗?
请参阅wsrep_sync_wait处理因果关系检查。
答案 1 :(得分:1)
我能想到只使用MySQL检测更改的唯一方法是解析二进制日志。
由于您要求替代方法,您可以使用消息传递系统(例如Apache ActiveMQ)在节点之间发送缓存失效消息,以便每个节点都可以清除自己的缓存。