日志型的 数据 mysql_一种日志型数据库的实现

本文介绍了用于存储语音、图片的日志型数据库实现,重点在于存储格式、写操作、读操作以及简单的容灾策略。数据以数字命名文件,每个文件包含头部信息、属性、实际数据和校验和。写操作通过追加方式完成,读操作需要提供文件和偏移信息。该数据库无删除操作,可通过外部脚本管理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在《LSM存储组织结构介绍》一文中,我们了解了LSM存储结构,同时提到针对不同的业务场景,可能需要选择不同的数据库实现。假如需要存储语音、视频或图片,你会选择怎样的实现方式?不需要对类数据进行修改,也不需要排序与范围查找,下面我们来看一种日志型数据库实现方式,因其用于存储语音、图片,我们称其为media数据库。

存储格式

media数据库以数字命名数据文件,每个数据文件大小上限为FileSize左右,fileinfo文件存储当前正在被写入的文件的文件名,数据存储格式如下:

A014748384-131901.png_small.png

1. 每个数据文件,开头均填充1024个0

2. MMMediaItemHeader表示一条media数据的头部,其由以下字段组成:

iMagic:写入media数据时被统一置为0xffffffff,读取时进行校验

iBufLen:除用于1K对齐的一段外的长度,即len(MMMediaItemHeader)+len(MMAttribute_t)+len(Buf)+len(CheckSum)

hattrLen:MMAttribute_t的长度,即len(MMAttribute_t)

3. MMAttribute_t表示一条media数据的相关属性,由调用方填写,有以下字段组成:

iUinCount:该条media数据对应的用户数

piUinList:该条media数据对应的用户id列表

iDataLen:数据Buf的长度

4. Buf:实际语音、图片等数据

5. CheckSum:Buf数据求和,读取时进行校验

写操作

对media写入数据的过程如下:

1. 取fileinfo中记录的文件,尝试Append数据

2. 如果该文件大小小于FileSize,则填充MMMediaItemHeader数据结构、计算CheckSum,写入数据

3. 如果fileinfo记录的文件大小大于FileSize,则创建一个新的文件,文件头部记录1K 0,然后再和第2步一样写入数据

完成数据写入后,最终将fileinfo信息、数据偏移offset信息返回。media的实现中,没有对数据的删除操作,media数据或永久保留,或依赖外部脚本删除,如配置定时脚本删除n天前的数据文件。

读操作

在以上写的实现中,最终将fileinfo信息、Offset值返回,读的时候,也需要调用端提供这两个信息,读过程如下:

1. 打开fileinfo指定的文件,lseek定位到偏移位置

2. 读取FirstGetLen长度的数据(假设为16K)

3. 从所读取的数据中,取开头sizeof(MMMediaItemHeader)数据,校验其中iMagic是否为0xffffffff

4. 判断iBufLen是否大于FirstGetLen,如果大于,则重新定位到fileinfo、Offset对应的位置,读取iBufLen对应长度数据

5. 从读出的数据中取出iCheckSum,再对Buf数据计算一次CheckSum,两者比对,再做一次校验

6. 返回Buf数据

容灾

我们可以考虑对media保存两份数据,实现简单的容灾,如提供一个Addbuf接口,前端对一条数据进行写入时,Addbuf分别对Master media和Slave media各做一次写操作。

小结

以上我们对图片、语音、视频存储场景,实现了一个日志型存储数据库。不同于常用数据库需要事先定义表结构,media存储的是图片、语言等不定长数据(类似mysql的blob数据类型),并没有表结构定义。

media数据库加速了写操作性能,读操作要求提供所要读取的文件和偏移量,适合单次写入后根据返回读取的场景,亦可加多一层维护文件md5、fileinfo、偏移量等数据的对应信息。

### MySQL 关系数据库数据存储与功能 #### 数据库特性 MySQL一种关系数据库管理系统(RDBMS),它基于表格的形式来组织和存储数据。每张表由行和列组成,其中每一列表示一个属性,而每一行则表示一条记录。这种结构化的方式使得查询、更新以及删除操作变得非常直观且高效[^1]。 #### SQL 支持情况 作为一种的 RDBMS 实现之一,MySQL 完全遵循 ANSI/ISO 的标准 SQL 语法规则,并在此基础上进行了许多增强和支持特定平台特性的扩展。这意味着开发者不仅可以利用通用的 SELECT、INSERT、UPDATE 和 DELETE 命令来进行基本的操作,还可以享受诸如视图(Views)、触发器(Triggers)等功能带来的便利性[^3]。 #### 存储引擎多样性 值得注意的是,在内部实现上,MySQL 提供了多种不同的存储引擎选项给用户选择,比如 InnoDB 和 MyISAM 。InnoDB 是目前最常用的默认存储引擎,因为它不仅提供了完整的 ACID 遵循能力用于保障交易安全,而且还实现了外键约束机制以维护参照完整性;相比之下,MyISAM 则更注重读取性能优化但缺乏上述高级特性。 #### 并发控制与事务处理 为了满足现代应用程序日益增长的需求,特别是在高并发场景下的稳定性和一致性方面的要求,MySQL 设计了一套完善的锁协议体系以及两阶段提交流程来确保多客户端同时访问同一份资源时不会引发冲突或者破坏原有状态。此外,通过引入 MVCC (Multi-Version Concurrency Control),进一步提高了系统的整体吞吐量并减少了死锁发生的可能性。 ```sql -- 创建带有主键自增字段的表 CREATE TABLE users ( id INT AUTO_INCREMENT PRIMARY KEY, name VARCHAR(50), email VARCHAR(100) ); -- 插入新纪录到users表中 INSERT INTO users(name,email) VALUES('John Doe','john@example.com'); ``` #### 日志系统 另一个重要的组成部分就是二进制日志(Binary Log) 及错误日志(Error Log) ,前者主要用于复制(replication) 或者增量备份(incremental backup), 后者则是用来诊断运行期间可能出现的各种异常状况的信息记录工具。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值