java加载和持久化Hazelcast分布式映射
我正在使用Hazelcast(3.8.1)作为应用程序中的缓存服务。在经历了hazelcast documentation之后,我对它没有什么疑问:
- 如果我们使用Write-Behind Persistence,这是对其本地队列的异步调用,最终我们将其持久化到db。 我的问题是,如果所有节点都宕机,那么在这种情况下会有数据丢失吗强>
注意:我知道队列的一个副本也在备份节点中维护。但我的设想是,当所有节点都关闭时,我们会丢失数据吗
- hazelcast是否在停机时维护脱机持久性,并在启动时(针对所有节点)加载该持久性李>
感谢您的回复
# 1 楼答案
是的,如果尚未将数据持久化到数据库中,则会丢失内存中的数据
OTOH,Hazelcast在企业版中有Hot Restart用于持久化到磁盘。这有助于防止整个集群计划关闭或集群范围内的突然崩溃,例如断电
# 2 楼答案
1的答案是显而易见的,并且适用于任何具有异步写入的内存系统。如果集群中的所有节点都宕机,那么是的,因为系统最终是一致的,所以有可能会丢失数据
对于问题2:Hazelcast是一种内存缓存,其主要优点就在于此。写入持久性存储或从持久性存储加载应该是次要的,因为它与缓存系统的一些主要属性(速度,我猜…)冲突
话虽如此,它允许您同步(直写)或异步(后写)地load from and write to persistent storage
如果使用Hazelcast的主要原因是复制和分区(持久、一致的数据),那么最好使用NoSql数据库,如Mongodb。这在很大程度上取决于你的使用模式,因为如果你期望读的比写的多得多,这仍然是有意义的
另一方面,如果您使用它的主要原因是速度,那么您需要的是更好地管理容错,这与您的群集拓扑(可能您应该使用跨数据中心复制)比持久性更相关。除非您有很强的一致性或事务要求,否则关注DC中的“所有节点都将消亡”是不典型的