MySQL数据库复制挂钩清理本地缓存

时间:2015-09-03 09:31:20

标签: mysql replication

我有一个应用程序MySQL数据库是其他远程主数据库的从属。我使用memcache来缓存一些数据库数据。

如果主数据库中有更新,则可以更新我的从属数据库。因此,在我的应用程序中,我想知道何时更新本地(从属)数据库以使相关的缓存数据无效并显示我从主数据库获取的新数据。

当slave mysql DB更新时,有没有办法运行某些程序?然后我会过滤q查询并理解我是否需要清理缓存。

由于

2 个答案:

答案 0 :(得分:1)

首先,您正在寻找类似于Facebook在其数据库架构中所做的解决方案(我记得他们为此修补了MySQL)。

您可以基于以下技术之一构建自己的解决方案:

  • 解析从属端的复制日志,当您在日志中看到数据更新时删除缓存条目
  • 为memcached加载UDF(用户定义的函数),在副本端附加触发器(它将调用UDF删除函数)到MySQL内的感兴趣的表。

请注意,在支持和维护期间,此配置很复杂。如果您可以牺牲缓存中的陈旧数据,那么小ttl将对您有所帮助。

答案 1 :(得分:0)

正如Kirugan所说,它就像编写自己的SQL解析器一样简单,并确保您还提供了一个索引查找,该查找键入了您插入缓存的任何内容的基础数据,然后交叉引用您应用于任何DML的数据集。数据库。当然,如果您创建一个简化的抽象语法来表示DML,这将会更加简单,但从而失去了SQL的灵活性,当然,必须使用新语法重新实现任何遗留代码。除了修复现有代码之外,只需要一两年的时间就可以正常运行。基于MySQL的处理程序API而不是SQL的语法可能会在以后的项目中节省很多痛苦。

当然,如果您需要完全缓存一致性,那么您需要确保逻辑事务现在跨越所有相关数据中心,这会对您的性能产​​生负面影响(当然比直接引用主服务器要慢得多)。

对于像facebook这样的公司,拥有数十万台服务器和数TB的数据(并且不需要缓存一致性),这种解决问题的方法可以大大节省成本。如果您只有2台服务器,更好的解决方案是切换到多主机复制,可能添加另一个数据库节点,优化存储(例如切换到ssds /添加快速bcache)确保您具有与dbms的会话亲缘关系aplication(但不是stcky会话)并花一些时间来调整你的dbms,特别是它的缓存性能。