Activemq存储KahaDb详解

引言

ActiveMQ在不提供持久化的情况下,数据保存在内存中,一旦应用崩溃或者重启之后,数据都将会丢失,这显然在大部分情况下是我们所不希望的。对此ActiveMQ提供了两种持久化方式以供选择。

kahaDB

kahaDB是一个基于文件,支持事务的、可靠,高性能,可扩展的消息存储器,目前是activeMQ默认的持久化方式,配置也十分简单

<persistenceAdapter><kahaDB 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返回ACK
cleanupInterval30000当消息被消息者成功消费之后,Broker就可以将消息删除的时间间隔。
checkpointInterval5000每隔5s将内存中的index缓存更新到磁盘文件中。

底层实现

persist_01 (1)

从上图中可以看出:图中各个部分与KahaDB配置的存储目录下的文件是一 一对应的。

①在内存(cache)中的那部分B-Tree是Metadata Cache

通过将索引缓存到内存中,可以加快查询的速度(quick retrival of message data)。但是需要定时将 Metadata CacheMetadata 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*4=16)。如果在写入过程中出现故障(突然断电)就会导致只写入了一部分数据(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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/586692.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

WPF+Halcon 培训项目实战(10):HS组件绘制图案

文章目录 前言相关链接项目专栏运行环境匹配图片模板匹配加载模板文件运行结果 绘制十字标 WPF HS组件绘制图像绘制和生成的区别 前言 为了更好地去学习WPFHalcon&#xff0c;我决定去报个班学一下。原因无非是想换个工作。相关的教学视频来源于下方的Up主的提供的教程。这里只…

元旦特辑:Note6---选择排序

目录 前言❌ 1. 基本思想⚠️ 2. 直接选择排序&#x1f7e2; 2.1 思路分析✳️ 2.2 代码实现❎ 2.2.1 sort.h 2.2.2 sort.c 2.2.3 test.c 2.3 问题解决❇️ 2.3.1 sort.c修改 2.4 特性总结✅ 3. 堆排序&#x1f535; 3.1 代码实现&#x1f3e7; 3.2 特性总结&…

神经元科技发布AI agent—“萨蔓莎”

今天神经元科技发布AI agent—“萨蔓莎“&#xff08;Samantha &#xff09;&#xff01; 取名“萨蔓莎”&#xff0c;是来自于一部讲述AI的电影《HER》。 电影讲述的是电影讲述男子西奥多汤布里&#xff08;Theodore Twombly&#xff0c;饰&#xff09;与拟人化萨曼莎&#…

mysql2pgsql

使用pgloader进行迁移 pgloader是一个强大的数据迁移工具&#xff0c;专为将不同数据库之间的数据迁移到PostgreSQL而设计。它支持从MySQL到PostgreSQL的迁移&#xff0c;并提供了一种简单且灵活的方式来转移数据。 安装pgloader 使用pgloader迁移数据 1、命令行方式 2、脚…

【AI】注意力机制与深度学习模型

目录 一、注意力机制 二、了解发展历程 2.1 早期萌芽&#xff1a; 2.2 真正意义的注意力机制&#xff1a; 2.3 2015 年及以后&#xff1a; 2.4 自注意力与 Transformer&#xff1a; 2.5 BERT 与预训练模型&#xff1a; 三、基本框架 1. 打分函数&#xff08;Score Fun…

Vue常见面试问答

vue响应式数据 vue2 Vue2 的对象数据是通过 Object.defineProperty 对每个属性进行监听&#xff0c;当对属性进行读取的时候&#xff0c;就会触发 getter&#xff0c;对属性进行设置的时候&#xff0c;就会触发 setter。 /** * 这里的函数 defineReactive 用来对 Object.def…

如何正确使用docker搭建redis服务器,安装gcc和make以及出现错误时的解决办法

搭建redis服务器 目录 搭建redis服务器 &#xff08;1&#xff09;开启docker&#xff0c;并查看是否开启成功 &#xff08;2&#xff09;启动上面创建的ssrf容器&#xff0c;并进入ssrf容器 &#xff08;3&#xff09;进入opt&#xff0c;然后下载redis-5.0.5.tar.gz &a…

GitHub Copilot 快速入门

一简介 GitHub Copilot是一个AI编程助手&#xff0c;它能够为开发者提供代码建议和自动完成功能。Copilot使用自然语言处理技术来理解代码的语义&#xff0c;并根据上下文提供智能化的代码建议。通过使用Copilot&#xff0c;开发者可以提高编码效率&#xff0c;减少错误率&…

Apache SSI 远程命令执行漏洞

一、环境搭建 二、访问upload.php 三、写shell <!--#exec cmd"id" --> 四、访问 如图所示&#xff0c;即getshell成功&#xff01;​

Zookeeper-Zookeeper应用场景实战

1. Zookeeper Java客户端实战 ZooKeeper应用的开发主要通过Java客户端API去连接和操作ZooKeeper集群。 可供选择的Java客户端API有&#xff1a; ZooKeeper官方的Java客户端API。 第三方的Java客户端API&#xff0c;比如Curator。 ZooKeeper官方的客户端API提供了基本的操作…

宝塔部署flask添加ssl即https

在宝塔部署flask的步骤我已经写了一篇博客:宝塔部署flask项目-CSDN博客 之前说如果出现找不到application错误: spawned uWSGI http 1 (pid: 3116) --- no python application found, check your startup logs for errors --- [pid: 3114|app: -1|req: -1/1] 127.0.0.1 () {6…

java 什么是变量和字面量?

什么是变量&#xff0c;怎么理解的&#xff1f; 变量其实就是内存当中存储数据的最基本的单元。 一个存储数据的盒子&#xff0c;一个存储数据的单元。 什么是字面量&#xff0c;怎么理解&#xff1f; 整数型字面量&#xff0c;浮点型的字面量&#xff0c;布尔类型字面量&#…

sklearn学习的一个例子用pycharm jupyter

环境 运行在jupyter 进行开发。即一个WEB端的开发工具。能适时显示开发的输出。后缀用的是ipynb.pycharm也可以支持。但也要提示按装jupyter. 或直接用andcoda 这里我们用pycharm进行项目创建 pip install -i https://pypi.tuna.tsinghua.edu.cn/simple jupyterlab pip ins…

API服务的快速搭建和测试

API服务的快速搭建和测试 使用Python的FastAPI迅速搭建一个简单API from fastapi import FastAPI, Request from transformers import AutoTokenizer, AutoModel import uvicorn, json, datetime import torch# 设置CUDA设备信息 DEVICE "cuda" DEVICE_ID "0…

在vim中映射类似于Windows编辑器的快捷键

vim编辑器的历史比较久&#xff0c;继承于vi&#xff0c;这个编辑器就更早了。可能拜于年代所赐&#xff0c;里面的快捷键设计似乎不是那么“现代化”&#xff0c;和很多现在的编辑器的热键设计出入很大&#xff0c;里面的命令更不是一般人能记得住的。 我一直知道vim可以rema…

QT 利用开源7z 实现解压各种压缩包,包括进度条和文件名的显示(zip,7z,rar,iso等50多种格式)

想做一个winRAR一样的解压软件吗?很简单,利用开源的7z库就能实现。我看网上其他人说的方法不敢苟同,误人子弟。以前自己在项目中使用过7z,这次又有需要,就想记录下来。如果你研究过如何用7z的话,一定知道7z的每一个GUID都代表了一种格式,50多种GUID也就有50多个格式,最…

uniapp打包Android、Ios、微信小程序

首先我们需要在我们的代码中&#xff0c;把我们所要用到的配置信息配置好&#xff0c;在检查一下我们测试的内容是否有打开&#xff08;取消注释&#xff09;&#xff0c;在检查一下我们的版本信息是否正确&#xff0c;查看一下接口ip是否是正式线 这里的配置信息一定要配置好…

epoll并发编程

epoll并发编程 epoll并发编程背景知识epoll 的特点epoll 的工作原理epoll 和 select/poll 的区别 epoll并发服务器思路重点代码分析git地址参考书目 epoll并发编程背景知识 epoll 是 Linux 中用于处理大量文件描述符的 I/O 事件通知机制。在传统的 I/O 模型中&#xff0c;一般…

Screenshot-to-code开源项目mac上实践

github上的开源项目&#xff0c;看介绍可以将设计ui图片转换为 HTML 和 CSS 源码地址&#xff1a; GitCode - 开发者的代码家园 我的mac安装了2.7和3.11&#xff0c;就用3吧直接上代码 安装 pip3 install keras tensorflow pillow h5py jupyter 报错 ERROR: Could not in…

Linux驱动开发之Linux内核中的中断处理与等待队列以及相关API和例程分析

目录 中断的特点 Linux中的中断类型 相关API函数 gpio_to_irq() enable_irq() disable_irq() request_irq() free_irq() 中断的使用 等待队列 DECLARE_WAIT_QUEUE_HEAD() wait_event_interruptible() wake_up_interruptible() 中断相关例程 例程分析 源码分享 …