
MyDB
练习用数据库。
c++编写。
pourtheworld
DB programmer + UE4 rookie
展开
-
实现一个数据库(10)快照
github链接(更新中)https://github.com/pourtheworld/mydb大纲(更新中)(0)mydb的架构设想快照机制快照介绍快照级别快照实现快照类定义快照类运用快照介绍通过记录实时状态,DBA可以了解当前系统的运行状况,在基于此进行性能监控和调优。快照级别一般来说为:数据库级快照:可能包含连接数量、索引读写次数、索引IO次数、执行事务总数、磁盘空间占用、内存占用、CPU开销等。会话级快照:可能包含连接开始时间、执行事务总数、索引读写次数、CPU占用、内存原创 2020-06-25 17:22:35 · 734 阅读 · 0 评论 -
实现一个数据库(9)索引与Runtime
github链接(更新中)https://github.com/pourtheworld/mydb大纲(更新中)(0)mydb的架构设想本期任务索引的搭建B树和散列桶索引B树本数据库的散列桶索引索引实现散列桶管理器以及散列桶定义散列函数散列桶函数RuntimeRuntime层的作用Runtime层的接口AgentEDU对runtime的调用单机数据库的测试启动流程实际演示索引的搭建索引的存在使得我们可以快速定位目标,消耗最少资源跳过不需要目标。常用的有B树索引、bitmap位图索引、散列索原创 2020-06-24 12:18:49 · 237 阅读 · 0 评论 -
实现一个数据库(8)数据模型
传统数据库的存储方式:定长的数据项被存在4K大小的数据页里。Nosql:不定长的数据。数据页还是存储的最小单位,但是数据块可以由多个数据页组成,每个数据项可以跨页但是不能跨块。由于Mmap文件的映射区域无法更改,我们每次更新文件的大小时都重新映射一个128M定长的数据段。即 数据块可以由多个数据页构成但大小不能超过一个数据段。数据项可以跨页但不能跨段。传统数据页里的存储:每个数据记录会在页内对应一个slot,slot记录了该data在页内的偏移等情况。slot从前往后存储,data从页的结尾往前存原创 2020-06-21 14:02:37 · 423 阅读 · 0 评论 -
实现一个数据库(7)消息模型
github链接(更新中)https://github.com/pourtheworld/mydb大纲(更新中)(0)mydb的架构设想本期任务通讯协议的构建架构设计协议格式内存对齐自定义消息格式消息头消息主体消息接受消息回复消息处理服务端Agent消息处理测试gdb调试以及BSON格式完善了Agent的处理后进行测试通讯协议的构建协议的构建来源于架构的设计;协议的格式包括头+主体+附加信息;我们设计协议某个部分长度时需要考虑到内存对齐。架构设计插入每次插入一条或者多条记录。(我原创 2020-06-19 15:47:46 · 391 阅读 · 0 评论 -
实现一个数据库(6)线程池
本期任务建立EDU(Engine Dispatchable Unit)引擎调度单元类。建立EDUEvent(EDU event)EDU事件类。定义并实现EDU各个状态和转换事件。建立EDUMgr(EDU Manager)线程池。定义TCPListener、Agent类型EDU的入口函数。对服务端的主函数以及客户端进行整合,用假insert模拟。gdb的调试模拟。EDU(Engine Dispatchable Unit)引擎调度单元类EDU类型。TCPListener、Agent的处原创 2020-06-18 11:17:03 · 382 阅读 · 1 评论 -
实现一个数据库(5)诊断日志、配置文件以及信号
本期任务统一诊断信息的函数以及日志。将诊断函数用在ossSocket上。配置文件的两种方式:用户自定义CMD以及配置文件。日志(诊断)等级当诊断函数发现错误时,我们习惯性地把错误写入日志中,当然日志也有等级。从上至下分别为:严重、错误、事件、警告、可忽略信息、DEBUG。 enum PDLEVEL { PDSEVERE = 0, PDERROR, PDEVENT, PDWARNING, PDINFO, PDDEBUG } ;我们把当前原创 2020-06-13 23:19:59 · 290 阅读 · 0 评论 -
实现一个数据库(4)通过队列的进程间通信以及简单I/O
本期任务回顾一下锁、队列、条件变量。编写ossLatch,底层为pthread的互斥所以及读写锁。编写ossQueue,通过条件变量+锁控制队列的push以及pop。编写ossPrimitiveFileOp,定义一些简单的I/O操作。锁、队列、条件变量互斥锁:线程访问共享资源之前加锁,访问结束后解锁。一次只能有一个线程加锁,其他线程try_lock都会被阻塞休眠。当线程解锁时,如果有多个线程正在阻塞休眠,它们会试图变为就绪状态,第一个变为就绪状态的获得该锁,其他线程继续阻塞休眠。自旋锁原创 2020-06-13 11:14:50 · 260 阅读 · 0 评论 -
实现一个数据库(3)在_ossSocket基础上建立简单C/S架构
本期任务实现Edb简单客户端程序,先实现Connect、Help、Quit三个基本Command,其中ICommand为命令基类。CommandFactory中建立map<string,ICommand>方便增加Command类型,并且通过map得到命令对应处理函数。服务端则建立一个主监听流程pmdTcpListener,暂时不用多线程。gdb调试的过程总结。Makefile的爱恨情仇。ICommand基类的发送函数//为了测试方便,暂时将发送语句定义为helloworld,.原创 2020-06-12 14:39:13 · 275 阅读 · 0 评论 -
实现一个数据库(2)建立_ossSocket自定义套接字封装类
socket回顾socket地址(以Internet Socket为例):本地IP地址与端口;远程IP地址与端口(适用于已经建立的TCP连接);协议(TCP、UDP)。流程图:socket API:socket() 创建一个新的套接字并分配资源bind()用于服务端,将套接字与套接字地址(IP+port)绑定listen()用于服务端,将绑定的TCP置于监听状态connect()用于客户端,分配一个本地的空闲端口,并与远程地址连接accpet()用于服务端,接受一个新的连接请求,原创 2020-06-08 20:58:24 · 272 阅读 · 0 评论 -
实现一个数据库(1)软件准备以及环境搭建
系统外预装包:ubuntu-12.04.5-desktop-amd64boost_1_53_0.tarbson-cpp-mastereclipse-SDK-4.2.2-linux-gtk-x86_64.tarjdk-6u45-linux-x64log4j-1.2.17.tar系统内apt-get:vim /etc/hosts vim /etc/apt/sources.listsudo apt-get install g++sudo apt-get install gdbsudo原创 2020-06-07 21:08:01 · 512 阅读 · 0 评论 -
实现一个数据库(0)mydb大纲
之所以有自己实现一个分布式数据库的想法,源于组内的任务:在自研INM数据库上加入MongoDB的模块进行性能改善,首先要想清楚下列的问题。要将MongoDB作为INM的下层数据库需要考虑:MongoDB的沿用、INM的舍弃。修改后的访问流程。问题。尝试实现一个类MongoDB的分布式数据库。功能;整体架构;服务器架构;客户端架构;引擎MongoDB的沿用、INM的舍弃单纯地将MongoDB作为改善INM性能的一个手段,需要考虑沿用MongoDB哪些部分、舍弃INM本身哪些部分。首先考原创 2020-06-14 11:58:27 · 903 阅读 · 1 评论