diy数据库(一)--概况

一、概况。

       diydb是一个非关系型数据库,在数据增长迅速的今天,关系型数据库在处理大量数据时的性能劣势被放大,这导致了noSQL数据库的快速发展,我们熟悉的如redis,memcache,mongodb等。这里,分析、调试和修改一个非关系型数据库来练手,一方面是因为非关系数据库很流行,另一方面是因为其数据处理逻辑更简单,且具备一个服务器的五脏六腑,有很多值得学习和借鉴的地方。diydb衍生自EmeraldDB的单机版本,笔者主要增加了基于一致性hash的多机功能,并修改了代码分析中发现的一些bug。


二、diydb的功能

1.客户端支持多节点集群– 数据按_id唯一字段散列至相应节点

2.可对数据进行插入,搜索与删除

3.搜索必须按照_id字段

功能的确称不上强大,但我们主要关注框架的实现^^


三、diydb的架构

1.diydb的整体架构



 对用户的请求,我们会把请求散列到不同的数据节点,每个数据节点实际上就是一个独立的数据库引擎进程(包括一个监听线程和多个代理线程)


2.diydb的客户端框架


(1)Diy类是客户端的入口类,她负责从命令行读入用户输入的命令和参数,将命令字段和参数字段都解析出来,然后在prompt方法中以存放命令的字符串为参数从CommandFactory中取出对应的命令对象,然后执行具体命令对象的execute函数。

(2)CommandFactory是命令工厂类,可以向命令工厂注册命令,也可以从里面取一个命令对象。

(3)ICommand是所有命令的接口,所有命令都要继承这个基类。execute负责和数据库引擎进程建立tcp连接,然后发送数据库操作命令。函数handleReply是用来处理数据库引擎服务器返回的数据的。

(4)其他的类是六个具体的命令类,分别是插入、查询、帮助、连接、删除、关闭数据库。


3.diydb的数据库引擎框架

(1)pmd是线程模型,其调用oss层中的函数来持续监听tcp的一个端口,当收到一个请求的时候,会从线程池里面取出一个空闲的代理线程来,代理线程接受客户端传过来的数据,然后把数据传给MSG模块,MSG模块会把数据转化成系统能够懂的结构,然后pmd会调用RTN层对请求进行处理,RTN首先调用IXM层查询索引(这里用的是hashmap,实际的数据库一般用的是B+树),然后添加或删除索引,然后RTN再通过DSM层对数据库中的数据进行操作

(2)BSON是数据结构,是diy数据库中数据的储存格式,MON是监控模块,PD是问题诊断模块(主要是写日志),OSS是操作系统服务层(主要是一些辅助函数,比如文操作模块,tcp通信模块)

这里补充一个引擎的功能简图:


下面简要分析各个模块的主要类:

(1)PMD模块


※EDB_KRCB是内核控制块,包括了数据库中所有线程的执行状态

※pmdEDUMgr是线程管理块,即线程池

※pmdEDUCB是线程控制块,每一个线程控制块对应一个线程

※pmdEDUEvent是线程之间通信时用的事件

※pmdOptions是对命令行的参数的处理


(2)MSG模块

用于封装和解析消息

(3)RTN模块

运行时模块,真正的业务处理模块(比如回滚就在这里)

(4)IXM管理模块

这里用的是散列索引,但是大部分数据库用的是B+树索引。这里每个数据被散列到一个桶里面,这样一次加锁就只用对一个桶进行加锁,而不用对所有数据加锁


(5)DMS模块(数据管理模块)

dmsFile管理底层数据的存储和读取


(6)OSS抽象层

主要是用于对平台有关的一些操作进行封装,这里只针对linux平台,所以封装的意义被弱化,看起来只是一些基础的辅助类

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值