
存储
xxb249
电脑爱好者,半个电脑程序员
展开
-
Etcd源码分析-网络模型
从本篇开始,将会有一个系列对Etcd源码进行分析。我之前阅读过很多开源软件,对阅读开源软件,有如下基本思路:1、了解该软件相关背景知识,例如相关博客、官网,要相信自己不是第一个分析该软件的人2、对该软件进行使用,例如:编译、运行或者基于接口进行开发3、找到该软件的合适切入点进行源码分析,例如网络相关的软件(ovs、etcd)找到socket监听服务、接收消息、发送消息对于etc...原创 2018-06-22 23:40:56 · 6532 阅读 · 1 评论 -
leveldb深度剖析-查询流程
至此,将插入流程以及压缩流程都已介绍完毕了,本篇主要介绍查询流程。一、查询流程首先来看一下查询接口具体实现内容:/** * 查询 * @param options 查询选项 * @param key 查询key * @param value 输出参数 如果找到则赋值给value */Status DBImpl::Get(const ReadOptions& opt...原创 2019-07-18 18:34:17 · 1658 阅读 · 0 评论 -
leveldb深度剖析-压缩流程(1)
继续上一篇遗留问题,本篇介绍对MemTable压缩,在介绍之前先普及一下其他内容。在存储流程第一篇博客中,有一个方法没有详细说明--MakeRoomForWrite,该函数是保证新插入的数据有足够空间,那么该方法是如何保证的呢?本篇就详细介绍一下该方法。一、MakeRoomForWrite/* * 确保有足够空间可写 * @param force true表示强制立刻写入 fa...原创 2019-07-16 20:44:25 · 2381 阅读 · 0 评论 -
leveldb深度剖析-存储结构(2)
继续上一篇内容继续说明存储结构。五、.ldb文件关于ldb文件说明:1)ldb文件是按照block存储,一个block默认大小为4KB,当内存数据增长到4KB则进行写文件操作。2)从leveldb v1.14版本开始,数据存储到了后缀名为ldb文件中,不在存储到sst文件中。3)一个ldb文件包含:data block,filter block,meta index block...原创 2019-07-03 19:37:50 · 2718 阅读 · 0 评论 -
leveldb深度剖析-SkipList跳表
上一篇介绍了leveldb整体存储结构,了解整体存储结构有助于我们深入理解leveldb源码。本篇介绍一下leveldb在内存中存储结构。链表的特点是插入、删除很好,但是查找性能就比较差了,需要从头开始遍历。对于查找场景我们通常使用二叉树,但是二叉树在插入、删除场景下需要调平衡,性能不是很好。所以为解决这两种数据结构的弊端,跳跃表应运而生。一、SkipList思想跳跃表的大体存储形式为...原创 2019-07-03 19:55:24 · 1273 阅读 · 0 评论 -
leveldb深度剖析-压缩流程(2)
继续上一篇内容,来分析一下跨层压缩处理。leveldb不会轻易进行压缩流程(压缩流程影响性能),所以为了提升性能leveldb设计两个简单算法来决定压缩哪一层的哪一个文件一、压缩预计算1.1、打分函数leveldb每次进行文件压缩并没有随意压缩的,而是通过压缩预计算流程(打分函数)计算出一下值,在压缩的时候根据预计算结果选择压缩的层次,那么打分函数是如何实现的呢?/** * 预...原创 2019-07-16 20:48:05 · 1321 阅读 · 0 评论 -
leveldb深度剖析-压缩流程(3)
本篇是压缩流程中最后一篇,介绍DoCompactionWork方法。压缩主要工作是什么呢?剔除无效数据。什么是无效数据呢?就是被标记为删除的数据,我们要在这个流程中从磁盘中删除掉。下面来看一下具体是如何进行删除的。一、迭代器该函数比较长,这里分段介绍该函数。/** * 执行压缩 * @param compact 压缩信息 */Status DBImpl::DoCompacti...原创 2019-07-16 20:50:09 · 768 阅读 · 0 评论 -
leveldb深度剖析-布隆过滤器
布隆过滤器使用bit数组映射关键字key,对于在一个超大的集合中判断是否存在某个key能够起到很好的效果。但是缺点很明显:容易误报。也就是本来不存在的key,可能告诉你它存在。一、布隆过滤器根据上图来说明布隆过滤器的原理:1)布隆过滤有一个m位(这里是10个)的bit数组(或者称bitmap),bit数组初始化为全0,并且有k个(这里是3个)hash函数。2)当我们分别存储a...原创 2019-07-18 18:35:26 · 1334 阅读 · 0 评论 -
leveldb常见问题以及性能优化点
本篇是leveldb最后一篇,这里主要把技术核心点,性能提升点或者面试可能会被问到进行总结。一、常见问题1、leveldb key-value内存,内存中保存的是所有key-value吗? 答:不是 搜索顺序,memtable immtable ldb文件2、布隆过滤器 在leveldb中的应用是什么?答:布隆过滤器主要应用查找方面,如果查找一个key在过滤器中返回false,那么...原创 2019-07-18 18:35:38 · 6181 阅读 · 1 评论 -
leveldb深度剖析-TableCache
TableCache设计的出发点就是:提升性能。根据著名的局部性访问原理,leveldb设计了一个简单LRUCache算法,该算法是TableCache的核心,下面我们就来分析一下leveldb是如何实现的。一、TableCache先来看一下TableCache的类定义,非常简洁:class TableCache { public: TableCache(const std::...原创 2019-07-18 18:35:10 · 1453 阅读 · 1 评论 -
leveldb深度剖析-存储流程(2)
继续上一篇内容,本篇继续说明leveldb是如何将数据插入到MemTable中。一、Iterate循环处理插入到MemTable使用该接口WriteBatchInternal::InsertInto,具体实现是:Status WriteBatchInternal::InsertInto(const WriteBatch* b, ...原创 2019-07-16 20:46:50 · 633 阅读 · 0 评论 -
leveldb深度剖析-MemTable
上一篇介绍了SkipList数据结构,但leveldb插入数据并不是直接操作SkipList,而是直接操作MemTable。可以理解为MemTable是对SkipList一层封装。一、数据结构class MemTable { public: // MemTables are reference counted. The initial reference count // i...原创 2019-07-03 19:56:25 · 921 阅读 · 0 评论 -
Etcd源码分析-网络模型进阶篇
起初本篇打算介绍raft相关,但是后来发现,还是有必要再深入介绍一下网络模型。一、基础网络模型Etcd采用http(https)协议作为应用层协议,关于http协议介绍不是本篇范畴。大家都知道http一般情况下是无状态协议,且网络是为请求+应答模式,当收到应答http session就结束了(tcp可能不结束)。但是在etcd中可能就不是这样子了。下面是抓取的http报文:...原创 2018-06-23 22:03:45 · 3302 阅读 · 0 评论 -
Etcd源码分析-Raft实现
从本篇开始介绍Raft,集群中最核心内容是保证数据一致性,那么如何保证数据一致性?在业界有很多算法、协议,例如:Paxos,Raft。 Raft协议相比之前协议Paxos等,算是年轻协议,而且Raft协议比较简单,容易实现。一、Raft基础1.1 状态机Raft简单就在于它的状态机。由上图可知,状态机状态非常少,分别Follower、Candi...原创 2018-06-23 22:45:21 · 12348 阅读 · 2 评论 -
Etcd源码分析-存储
上一篇介绍Etcd的Raft协议相关内容,本篇介绍Etcd另外一个核心内容-存储。一、WAL文件WAL的全称为Write Ahead Log(预写式日志),此文件格式采用grpc进行压缩保存在磁盘中(也用于传输数据)。1.1 基础格式上面是一个Record结构,结构要求8字节对齐,一个wal文件包含多个Record字段。 字段名称 ...原创 2018-06-23 23:01:11 · 6171 阅读 · 1 评论 -
Etcd源码分析-存储2
说实话,上一篇写的时候压力很大,不知道如何介绍代码流程,才能把存储过程说的清清楚楚?所以后来决定再写一篇,以etcdctl命令行为切入口,层层深入。一、存储数据结构Etcd是存储有如下特点:1、采用kv型数据存储,一般情况下比关系型数据库快。2、支持动态存储(内存)以及静态存储(磁盘)。3、分布式存储,可集成为多节点集群。4、存储方式,采用类似目录结构。1...原创 2018-06-24 12:55:38 · 1968 阅读 · 1 评论 -
Etcd源码分析-存储3
Etcd是分布式存储系统,当leader有数据变化,要及时更新到其他节点,这里就涉及到数据同步。一、数据同步上一篇介绍,Etcd接收到客户端的请求,会把相关数据传递到Raft状态机中,那么进入状态机之后如何处理呢?流程图如下:type raftLog struct { // storage contains all stable entries since the last sna...原创 2018-06-24 13:06:04 · 1417 阅读 · 1 评论 -
Etcd源码分析-数据字典
channel名称 写入 读取 作用 EtcdServer->readych chan struct{} 文件:etcdmain/etcd.go 方法:startEtcd 变量:e.Server.ReadyNotify ...原创 2018-06-24 13:11:36 · 830 阅读 · 0 评论 -
leveldb深度剖析-存储流程(1)
上一篇介绍了leveldb初始化流程,本篇开始介绍存储流程。对于leveldb来说,删除数据实际是插入数据,只是将类型设置为删除即可,并不会真正将数据从磁盘中删除.那么什么时候真正删除呢?在压缩过程中,具体在压缩流程中介绍。一、插入1.1、总体流程图调用接口Put即可完成插入数据。那么内部实现是什么呢?首先来看一下总体流程图:说明:1) 调用接口Put插入数据,首先会先保存...原创 2019-07-16 20:40:46 · 1326 阅读 · 0 评论 -
leveldb深度剖析-存储结构(1)
从今天开始深入剖析leveldb源码,在工作中也有用到leveldb(虽然没出过问题),但是从个人兴趣来说还是比较喜欢这款高效、简单的数据库。其实我们一直在使用leveldb,只是大家可能没有发现。例如:Chrome(谷歌浏览器)底层存储就是使用的leveldb。我是基于leveldb-v.1.20稳定版本进行分析。为什么我第一篇关于leveldb的博客不是介绍leveldb的简介、性能等基础...原创 2019-07-03 19:35:22 · 2494 阅读 · 0 评论 -
leveldb深度剖析-初始化流程
本篇来介绍一下leveldb初始化流程,初始化流程中涉及了很多内容,例如:文件组织方式,存储内容序列化和反序列化等等。在了解这些内容后,是有助于日后分析存储流程和压缩流程的。一、创建/Open数据库leveldb属于轻量级kv数据库,可以很方便写一个hello程序并结合gdb单步调试,来辅助我们阅读源码,起到事半功倍的效果。1.1、版本管理leveldb采用分层思想对数据进行管理,...原创 2019-07-03 20:01:56 · 1260 阅读 · 0 评论 -
Wireshark编译环境搭建以及支持Etcd报文
一、安装编译软件 为了扩展支持etcd报文解析,需要自己编译wireshark,因此搭建wireshark编译环境是必要的。编译wireshark需要如下软件作为支撑: python2.7(最好是稳定版本,不一定最新) cygwin(主要是跨平台编译) 安装visualstudio 2010 安装NSIS打包...原创 2018-07-01 21:49:43 · 1113 阅读 · 2 评论