网站系统应怎么做会计分录,电子商务专业就业前景好不好,网站建设技术流程,莞城区做网站引言
ActiveMQ在不提供持久化的情况下#xff0c;数据保存在内存中#xff0c;一旦应用崩溃或者重启之后#xff0c;数据都将会丢失#xff0c;这显然在大部分情况下是我们所不希望的。对此ActiveMQ提供了两种持久化方式以供选择。
kahaDB
kahaDB是一个基于文件#xf…引言
ActiveMQ在不提供持久化的情况下数据保存在内存中一旦应用崩溃或者重启之后数据都将会丢失这显然在大部分情况下是我们所不希望的。对此ActiveMQ提供了两种持久化方式以供选择。
kahaDB
kahaDB是一个基于文件支持事务的、可靠高性能可扩展的消息存储器目前是activeMQ默认的持久化方式配置也十分简单
persistenceAdapterkahaDB directory${activemq.data}/kahadb/
/persistenceAdapter以上配置是将存储目录设置为${activemq.data}/kahadb。
存储目录下文件说明 db.data索引文件本质上是BTree的实现存储到了db-*.log消息文件的索引。 db.redo用来进行数据恢复的redo文件 db-*.log存储消息内容的文件包括消息元数据、订阅关系、事务等数据。 lock表示已启动一个实例。
kahaDB配置支持的参数:
参数默认值说明indexWriteBatchSize1000当缓存中更新的索引到达1000时将数据同步到磁盘中数据是批量同步的。indexCacheSize10000在内存中最多分配多个页面来缓存索引。缓存的索引越多命中的概率就越大检索的效率就越高journalMaxFileLength33554432默认值32MB配置单个消息文件的大小超过一定大小以后重新创建一个新的文件进行保存。enableJournalDiskSyncstrue表示采用同步写磁盘即消息先存储到磁盘后再向Producer返回ACKcleanupInterval30000当消息被消息者成功消费之后Broker就可以将消息删除的时间间隔。checkpointInterval5000每隔5s将内存中的index缓存更新到磁盘文件中。
底层实现 从上图中可以看出图中各个部分与KahaDB配置的存储目录下的文件是一 一对应的。
①在内存(cache)中的那部分B-Tree是Metadata Cache
通过将索引缓存到内存中可以加快查询的速度(quick retrival of message data)。但是需要定时将 Metadata Cache 与 Metadata Store同步。
**这个同步过程就称为check point。**由checkpointInterval选项 决定每隔多久时间进行一次checkpoint操作。
②BTree Indexes则是保存在磁盘上的称为Metadata Store它对应于文件db.data它就是对Data Logs以B树的形式 索引。有了它Broker消息服务器可以快速地重启恢复因为它是消息的索引根据它就能恢复出每条消息的location。
如果Metadata Store被损坏则只能扫描整个Data Logs来重建B树了这个过程是很复杂且缓慢的。
③Data Logs则对应于文件 db-*.log默认是32MB
Data Logs以日志形式存储消息它是生产者生产的数据的真正载体。
The data logs are used to store data in the form of journals,
where events of all kinds—messages, acknowledgments, subscriptions, subscription cancellations, transaction boundaries, etc.
---are stored in a rolling log④Redo Log则对应于文件 db.redo
redo log的原理用到了“Double Write”。关于“Double Write”可参考
简要记录下自己的理解因为磁盘的页大小与操作系统的页大小不一样磁盘的页大小一般是16KB而OS的页大小是4KB。而数据写入磁盘是以磁盘页大小为单位进行的即一次写一个磁盘页大小这就需要4个OS的页大小4*416。如果在写入过程中出现故障(突然断电)就会导致只写入了一部分数据(partial page write)
而采用了“Double Write”之后将数据写入磁盘时先写到一个Recovery Buffer中然后再写到真正的目的文件中。在ActiveMQ的源码PageFile.java中有相应的实现。
扩展知识Linux中的日志文件系统因为Linux的 ext文件系统采用索引节点来存储文件的元数据每次数据写入磁盘之后需要更新索引节点表。而写入磁盘与更新索引节点表并不是“原子操作”比如在数据写入磁盘后系统发生故障之前写入的数据就再也找不到了。
因此日志文件系统给Linux系统增加了一层安全性数据写入存储设备之前先将数据或者只将索引节点信息写日志写入到临时文件中该临时文件称日志。如果在数据写入时发生故障还可以通过日志来进行一定的恢复。
附录
参考
https://www.cnblogs.com/hapjin/p/5674257.html
https://www.iteye.com/blog/netcomm-1455086