运维/数据库
InsZVA
啊 你们要是看了我发的博客很多错误的地方 指出来啊 我比较菜 坑人的
展开
-
CPU L2缓存初探
CPU L2缓存初探探索目的为了设计高性能的内存数据库,往往要考虑CPU缓存的命中率,查阅资料发现,Intel架构的处理器有3级缓存的设置,其中L1,L2较小,L3较大但被三个核心所公用。在我使用的i7 4712mq中,使用dmidecode查看缓存大小:inszva@inszva-Aspire-E5-572G:~$ sudo dmidecode[sudo] password for inszva原创 2015-12-17 14:38:36 · 2968 阅读 · 2 评论 -
自己动手写数据库(一) 从SQL语句开始
自己动手写数据库(一) 从SQL语句开始关于本教程作者:InsZVA,浙江大学 软件工程系,也是第一次尝试写数据库,如有错误还望多多指正,写此篇文章也望有抛砖引玉的作用。 面向读者:有一定C语言基础。(其他知识会在教程中提到)从SQL语句开始对于数据库,我们最直观的概念或许就是在命令行中输入SQL语句来运行或者在PHP等语言中使用SQL语句进行增删改查。 我们这篇教程的目的就是做出像上图一样原创 2016-04-23 19:04:46 · 13720 阅读 · 0 评论 -
自己动手写数据库(三) 持久化方案与索引树
自己动手写数据库(三) 持久化方案与索引树推荐一点资源之前说我所有实现都是Go写的,在MonkeyDB2@Github,但是有些同学可能不喜欢Go的风格或者设计思想, 在此推荐大一学弟的项目,Java写的:CauchyDB内存分块管理既然要实现一个数据库,我们之前所有的东西都是在内存里面的,这如果服务器关机,那内存里面的数据还不得全部GG啊~所以我们需要对内存进行管理, 将所有的数据操作在我们所原创 2016-04-30 18:48:02 · 2849 阅读 · 0 评论 -
自己动手写数据库(二)表的结构
自己动手写数据库(二)表的结构一点点声明我不准备贴多少代码,因为代码实现是开发者自由去做的,我这篇文章只是为了提供一个思路或者结构,具体的实现,如果做不出来,请多多练习基本功。 另外我这篇文章讲的是以行为储存的,列式储存的数据库类似。表的逻辑模型我们知道,在关系型数据库中,数据是以表的形式来储存的,那么我们也应该实现一个表的数据结构,比如下面这样(伪代码):Table { Row[]原创 2016-04-28 15:38:37 · 2989 阅读 · 0 评论 -
内存映射系统开发
为了使用内存作为数据库的主要存储方式,开发内存数据库,我们需要对内存中的数据进行保证。即可以备份与还原,那么为了将内存中的数据备份到外存中,我们可以采取以下策略:选取一个外存文件,将其映射到某个内存地址;当更新内存时,适时地更新外存文件;系统重启时,从外存中重新读取内存内容。那么这里就有几个问题,首先是映射问题,起初我尝试了win32api: createFileMapp原创 2016-03-18 14:55:47 · 970 阅读 · 0 评论 -
打造先进的内存KV数据库-4 伙伴内存管理系统
伙伴算法大概是这样的,monkey储存引擎(今年猴年了嘛~取个名字,重了再换)的内存管理使用伙伴算法,大概原理是这样的: 1.多个空闲内存块的链表,分别是不同大小的内存块,1K,2K,4K,8K,…,,按照这样的情况一直到4M,当程序申请内存时,选择一个稍大于其所要申请的块,比如申请1023字节,给1K,1024字节也给1K(为什么呢– 后文会讲),2056字节给4K。 2.如果要给的内存块没有原创 2016-01-04 19:34:33 · 1463 阅读 · 0 评论 -
打造先进的内存KV数据库-5 TCP侦听
TCP侦听作为支持集群的数据库,必定要与多个客户端交互信息,不可能让数据库与所有客户共享地址空间(虽然这样性能好),所以需要使用TCP协议进行交互数据,(UDP协议不可靠。。。弃用),C语言的TCP库其实还好,但是对于高并发和并行的处理不如Go,而且并发锁机制比较难写,所以使用Go写了服务器和客户端调用C的库,目前版本没有什么身份验证,之后会加上。代码实现//server.gopackage ma原创 2016-01-05 23:46:16 · 1042 阅读 · 0 评论 -
打造先进的内存KV数据库-3 最终选择-C & B-Tree
多种索引与语言我尝试了tire树索引 B+树索引 B树索引,发现还是B树索引最快,另外使用C写了完善的B树索引,但是我发现使用cgo调用的时候,会有500%左右的性能损失,tire树大概比B树慢2倍,所以还是选择使用原生C来写完后续的进程。索引代码实现//BTree.h//实现对order序(阶)的B-TREE结构基本操作的封装。//查找:search,插入:insert,删除:remove。原创 2015-12-27 00:11:46 · 1695 阅读 · 0 评论 -
打造先进的内存KV数据库-7 反射以及并发锁
反射反射作为一种代码组织形式,带来了极大的不安全因素,同时也带来了许多便利之处,通过方法、对象、类型名称来获得具体实例,可以避免大量if-else分支,使得代码优雅,monkeyDB的服务端代码最后采用反射组织。并发锁多线程访问同一资源时,需要对资源加锁,否则可能会得到预料之外的后果。由于内存数据库优越的读写性能,锁的粒度可以尽量大,monkeyDB使用库级锁(相当于表级锁)来保证线程安全。 Mo原创 2016-01-26 14:11:54 · 1373 阅读 · 0 评论 -
Ubuntu Server 配置中的各种坑
Ubuntu Server 配置中的各种坑安装在windows下将iso镜像刻录到U盘安装,最开始使用的是UltraISO,结果安装的时候老提示找不到CDROM,后来使用win32diskimage,结果就ok了无线连浙大VPN使用xl2tpd连接浙大vpn,发现经常掉,而且wlan0都会关闭,真是烦人,后来直接使用post方法网页链接wifi:curl -d "action=login&usern原创 2015-12-22 22:29:58 · 1473 阅读 · 0 评论 -
打造先进的内存KV数据库-6 PHP支持
PHPphp作为使用极广的程序设计语言,monkey数据库对php的支持是必须的~代码实现//test.php<?phpclass MonkeyDB{ private $socket; private function read() { $data = ""; $total = 0; $t = fread($this->so原创 2016-01-05 23:50:34 · 1806 阅读 · 0 评论 -
打造先进的内存KV数据库-2 B树索引的建立(2)
索引的插入接上篇文章,我们实现了B树的查找log2n的算法,然而在后来的单元测试中,我发现了bug,在此进行修正,修正后的查找函数://查找指定索引 如果找到返回找到的node和position,失败的话返回最近的node和position,//并返回返回值相对于查询值是大了还是小了 true->小 false->大 优先返回大 供插入时插在前面func (bt *B_Tree) Select(原创 2015-12-19 13:51:36 · 1013 阅读 · 0 评论 -
打造先进的内存KV数据库-1 B树索引的建立(1)
设计目的在搜索引擎的设计中,往往需要使用倒排索引,在当前内存价格不断走低的情况下,内存数据库必然会成为主流。KV数据库由于适合Map-Reduce用于分布式处理。 本系统设计实现如下目标: * 实现极高性能的查询 * 实现分布式集群储存 * 实现可靠的日志系统索引设计索引采用B数索引,这样做的目的是大大利用CPU的缓存,让每个节点的大小与CPU二级缓存相匹配,另外,将索引值连续储存在节点中,原创 2015-12-18 15:17:08 · 2260 阅读 · 0 评论 -
关于NAT的一些事儿
关于NAT的一些事儿从丢包开始因为经常玩Dota2,然后又是校园网(万恶的ZJUVPN),所以每隔一段时间就会出现持续数十秒的高丢包(40%以上) 甚至掉线。在网上搜索之后发现,处于学校网络或者大型社区之类的网络环境下比较容易出现这种情况,这就是NAT的 原因了。什么是NAT大家如果用过路由器(包括无线路由)的话,应该是了解,多台设备使用的是用一个IP地址,想想也是对的,毕竟给你 的ip资源肯原创 2016-10-04 01:58:29 · 3818 阅读 · 0 评论