想两个服务器之间的缓存数据同步。 这两个数据库共享同一个数据库,但是为了更好的执行数据我已经在启动时缓存的数据到哈希映射。 因此,希望无需重新启动服务器缓存的数据同步。 (这两个服务器开始在同一时间)。
请建议我做的最好的和有效的方式。
想两个服务器之间的缓存数据同步。 这两个数据库共享同一个数据库,但是为了更好的执行数据我已经在启动时缓存的数据到哈希映射。 因此,希望无需重新启动服务器缓存的数据同步。 (这两个服务器开始在同一时间)。
请建议我做的最好的和有效的方式。
而不是试图在两个服务器实例之间的缓存数据同步,为什么不集中的缓存,而不是使用类似的memcached / couchbase或Redis的? 使用分布式缓存与类似的Ehcache是更为复杂,容易出错IMO VS使用像提到的缓存服务器集中缓存的数据。
作为附录我原来的答复,决定哪些高速缓存方法使用(在内存中,集中式)时,有一点要考虑的是,被缓存的数据的波动性。
如果数据存储在数据库,但在服务器加载它不改变,那么你甚至不需要在服务器之间同步。 只是让他们每个负载此静态数据从源内存中,然后继续他们的快乐的方式做什么是他们做的。 这些数据将不会被改变,所以没有必要引入一个复杂的模式来保持数据的服务器间同步。
如果确实是在数据的波动水平(好比说你正在缓存从数据库中,以点击保存到数据库抬头实体数据),那么我仍然认为集中式高速缓存是一个更好的方法比在内存中的分布,同步缓存。 你只需要确保您使用适当的过期缓存的数据,使数据不时刷新自然。 此外,您可能希望只从集中存储时掉落的缓存数据的更新路径特定实体,然后就让它来从该数据的下一个请求缓存重新加载。 这是国际海事组织不是试图做你写的底层存储以及高速缓存中的真正的写高速缓存更好。 数据库本身可能(通过违约例如未供给值)作调整的数据,并在这种情况下,您的缓存数据可能不符合什么是在DB。
编辑 :
一个问题是在约一个集中式缓存(我猜对内存分布式缓存一样的东西)的优点评论中问道。 我将提供对我的看法,但首先一个标准的免责声明。 集中式缓存不是万能的。 它的目的是解决与在JVM的内存缓存的具体问题。 评估是否要切换到它之前,你应该明白你的问题是第一,看看他们是否适合用集中式缓存的好处。 集中式高速缓存是一种架构的变化,它可以拿出自己的问题/注意事项。 简单,因为有人说,这是不是你正在做的事情最好不要切换到它。 确保符合的原因的问题。
好了,现在在我看来,对于什么样的集中缓存问题可以解决VS在JVM的内存(也可能是分布式的)高速缓存。 我要列出两件事情,虽然我敢肯定,有几个。 我的两个大的是: 总体内存占用和数据同步问题 。
让我们先从整体内存占用 。 假设你正在做的标准实体缓存,以保护您的关系数据库的不必要的压力。 我们还要说,你才能真正保护您的数据库有大量的数据高速缓存的; 说,在许多绿带范围内。 如果你正在做在JVM的内存缓存,你说有10个应用程序服务器框,您将需要得到每个箱子的额外内存($$$)乘以10,将需要做在JVM中的缓存记忆。 此外,你将不得不在为了适应高速缓存的数据更大的堆分配给您的JVM。 我从认为JVM堆要小,简化为了缓解垃圾收集负担是。 如果你有旧代的大块无法收集,然后你去,当它进入一个完整的GC,并试图收获的东西从臃肿的老根空间还给强调你的垃圾收集器。 你要避免长时间GC2暂停时间和腹胀你的老根是不会帮助这一点。 另外,如果你的内存要求是高于某个阈值,而你正好是运行32台机器为您的应用程序层,你就必须要升级到64位机,可以是另一种成本过高。
现在,如果你决定集中缓存中的数据(使用类似的Redis或者Memcached的),你可以显著减少缓存数据的整体内存占用,因为你可以有它在几个箱子,而不是所有的应用服务器箱该应用层。 你可能想用集群的方式(包括技术支持)和至少两个服务器为您提供高可用性和避免失败的单点在你的缓存层(更详细的介绍一秒)。 通过一个有几台支持用于缓存的内存所需的要求,你可以节省一些相当$$。 此外,您还可以调整应用程序框和缓存箱子现在不同,因为他们所服务不同的目的。 该应用程序框可被调谐为高吞吐量和低堆和高速缓冲箱可被调谐为大容量存储器。 并具有较小的堆一定会帮忙的的应用层箱整体吞吐量。
现在,一个快速点一般集中缓存。 你必须让你的应用程序,使得它可以在不的情况下,它会彻底瘫痪了一段时间的高速缓存一条血路。 在传统的实体缓存,这意味着,当缓存变为完全不可用,你就是直接打你的数据库为每个请求。 不真棒,也是世界的不是结束。
好了,现在的数据同步问题 。 随着分布在JVM的内存缓存,你需要保持高速缓存同步。 中的一个节点到高速缓存的数据的变化需要复制到其他节点,并通过同步时间到其高速缓存的数据。 这种方法是在一个有点吓人,如果由于某种原因(例如网络故障)的一个节点属于不同步,那么当一个请求到达节点,用户看到的数据将不会对目前什么在准确D B。 更糟的是,如果他们发出另一个请求,并击中不同的节点,他们会看到不同的数据,这将是混乱给用户。 通过集中数据,你消除这个问题。 现在,人们可以那么认为,集中式缓存需要并发控制左右更新到相同的缓存数据的关键。 如果两个并发更新进来相同的密钥,你如何确保这两个更新不影响对方? 在这里我的想法是,即使不用担心这个回合; 当更新发生,下降从缓存中的项目(并写虽然直接向DB),并让它成为下一个读重新加载。 它是更安全,更容易这样。 如果你不想这样做,那么你可以使用CAS(检查和设置)的功能,而不是乐观并发控制,如果你真的想同时更新的更新缓存和db。
所以总结一下,你可以,如果你集中在缓存中的数据省钱,更好地调整你的应用程序层的机器。 你,你有更少的数据同步问题,处理也能获得这些数据的更好的精度。 我希望这有帮助。
首先,不要试图对不成熟的优化给忘了。 你真的需要缓存? 99%,你不需要它。 在这种情况下,你的解决方案是在去除冗余代码。
然而,如果你需要它试图阻止重新发明轮子。 有完美的现成的使用库。 例如ehcache的已分布模式。
使用HazelCast 。 它允许使用多播协议的服务器之间的数据同步。 这很容易使用。 它支持锁定等功能。