开源软件
文章平均质量分 85
xxb249
电脑爱好者,半个电脑程序员
展开
-
leveldb深度剖析-TableCache
TableCache设计的出发点就是:提升性能。根据著名的局部性访问原理,leveldb设计了一个简单LRUCache算法,该算法是TableCache的核心,下面我们就来分析一下leveldb是如何实现的。一、TableCache先来看一下TableCache的类定义,非常简洁:class TableCache { public: TableCache(const std::...原创 2019-07-18 18:35:10 · 1406 阅读 · 1 评论 -
深入剖析Flannel-创建网卡(2)
在上一篇只介绍到了backend对象创建完毕,但是并没有真正生成网卡。本篇将介绍flannel是如何创建网卡且对其进行配置。一、注册网络我们在main函数中得知,创建网卡调用的函数为RegisterNetwork。/** * 注册网络 * @param ctx 上下文 * @param config 子网配置 */func (be *VXLANBackend) Regist...原创 2019-02-13 10:23:23 · 974 阅读 · 0 评论 -
深入剖析Flannel-创建网卡(1)
在上一篇介绍了flannel启动流程(main函数),只把整体流程介绍了一下并没有深入探讨,接下来几篇博客会深入介绍flannel到底做了哪些事件。今天就介绍创建网卡流程。一、创建子网管理对象1.1、创建管理对象flannel自身没有存储功能,所以它要依赖第三方存储系统,例如etcd、kube api。这里以etcd为例子进行分析。在上一篇提到创建子网管理对象调用的函数为newSubn...原创 2019-02-13 10:23:18 · 1312 阅读 · 0 评论 -
深入剖析Flannel-启动流程
最近一直在研究flannel的源代码,发现flannel自身代码不是很多,依赖的第三方代码却很多,例如创建隧道是通过第三方库vishvananda.后续分析源码过程中,不会深入介绍第三方库,只把我们关心的逻辑(流程)介绍清楚。一、流程图flannel的源码逻辑并不是很复杂,main函数处理逻辑也比较简单,所以就从main函数开始介绍。main函数流程图如下:二、源码在上一篇提到...原创 2019-02-13 10:23:10 · 2788 阅读 · 0 评论 -
PostMan操作etcd数据库
对于通过http api操作etcd网上大部分教程都是通过curl命令行方式(官网介绍方式),但是对于window系统或者测试人员可能更喜欢用HTTP接口测试工具,今天来介绍一下如何用Postman操作etcd,其他HTTP接口测试工具也是一样的。一、查询/v2/keysetcd支持的HTTP api有很多,不可能把所有的都介绍了,这里只把常用api接口进行演示说明。第一个就是查询接口,查...原创 2019-01-08 18:22:33 · 1357 阅读 · 0 评论 -
Flannel配置以及部署
上一篇,提及到要保证kubedns、tomcat、mysql调度到同一个node节点上,这是为什么呢?这个就涉及到了docker网络,如下图: Docker网络对于host主机来说是一个局域网(内部网络)外界无法直接访问到Docker网络,例如想访问PodA1,是不行。如上图所示,假如PodA1和PodB1进行通信,是没有办法直接通信的。那么如何让PodA1和PodB1通信呢?有很多种...原创 2018-04-17 09:07:52 · 6166 阅读 · 0 评论 -
深入剖析Flannel-简介
随着docker容器化兴起,云计算面对的挑战越来越大,例如:网络管理、存储等。一个数据中心很容易搞出成百上千个容器,这么多的容器我们需要如何管理呢?今天来介绍的flannel就是为了解决网络问题。一、网络管理方案目前使用最多的解决方案有两种:直接路由和overlay network。具体差异如下: 特点 代表 直接路由 采用直接路由的方式,这种方式性能损耗最低,...原创 2019-01-08 15:00:39 · 19929 阅读 · 0 评论 -
菜鸟学习nginx之总结杂耍
本篇是对Nginx学习最后一篇,若日后工作中对Nginx有了更深入了解,会再次写相关博客。一、关于Nginx几个典型问题1.1、为什么Nginx是高性能HTTP?是如何做到高性能?这种问题比较广,往往出现在面试过程中,比如说阿里、腾讯的人,他们就比较喜欢问这种问题。这种问题让谁说都可能比较头疼,下面是我自己的理解:1.优异框架,采用全异步方式2.优秀数据结构,例如内存池,字符串...原创 2019-01-17 23:06:54 · 235 阅读 · 0 评论 -
菜鸟学习nginx之结束HTTP请求
当我们发送响应的时候,意味着我们即将结束当前HTTP请求,注意这里并不是关闭TCP连接,因此TCP连接可能正用在其他请求上。Nginx定义了很多接口用关闭HTTP请求,但用的最多还是ngx_http_finalize_request。接下来分析一下它。一、Nginx管理HTTP核心思想众所周知,Nginx全异步框架,当一个流程可能需要较长时间占用进程,那么Nginx建议派生出子请求(sub...原创 2019-01-15 09:56:17 · 4116 阅读 · 0 评论 -
菜鸟学习nginx之发送HTTP响应
上一篇介绍了Nginx接收HTTP body流程,今天介绍Nginx发送HTTP响应流程。一、发送HTTP Response header发送响应需要设置两部分内容,Response header和Response body(若有)。这里介绍一下发送的header函数。1.1、存储结构发送HTTP响应行、HTTP响应头保存的数据结构在,ngx_http_request_t中head...原创 2019-01-14 18:47:41 · 1499 阅读 · 0 评论 -
菜鸟学习nginx之HTTP请求处理(2)
在上一篇介绍了Nginx定义的11个阶段,本篇将深入介绍Nginx是如何处理HTTP请求的。一、ngx_http_process_request/** * 处理HTTP请求 * @param r HTTP请求 * 当成功接收到请求行和Header时 就可以处理HTTP请求流程 * 至于是否存在body 则在后续流程中处理 */void ngx_http_process_req...原创 2019-01-10 08:36:25 · 1109 阅读 · 0 评论 -
菜鸟学习Nginx之HTTP会话
从本篇开始,介绍Nginx中HTTP相关。Nginx做为Web Server那么HTTP必然是重中之重。本篇不打算介绍太深入,本篇最主要内容是如何与事件驱动关联起来。一、监听端口Nginx默认监听端口是80端口,那么Nginx是如何将80端口的listening事件注册到事件驱动(epoll)中呢?这里简单回顾一下,具体内容可参考《菜鸟学习nginx之核心模块ngx_events_modu...原创 2019-01-07 10:35:41 · 657 阅读 · 0 评论 -
深入剖析Flannel-监控
在上一篇末尾提到了一个问题:当新容器加入到网络中,其他flannel是如何感知的呢?这个就要取决flannel的监控这部分实现了。flannel监控实际上是监视etcd某些key的变化,当这些key有变化时etcd会发送响应给flannel,这一点需要明确。接下来看一下flannel是如何实现的一、监控子网flannel监控处理一共有两个分别:监控整个子网和监控自己所在网络。先介绍一下监控...原创 2019-02-13 10:23:29 · 1457 阅读 · 0 评论 -
leveldb深度剖析-初始化流程
本篇来介绍一下leveldb初始化流程,初始化流程中涉及了很多内容,例如:文件组织方式,存储内容序列化和反序列化等等。在了解这些内容后,是有助于日后分析存储流程和压缩流程的。一、创建/Open数据库leveldb属于轻量级kv数据库,可以很方便写一个hello程序并结合gdb单步调试,来辅助我们阅读源码,起到事半功倍的效果。1.1、版本管理leveldb采用分层思想对数据进行管理,...原创 2019-07-03 20:01:56 · 1202 阅读 · 0 评论 -
leveldb深度剖析-存储流程(1)
上一篇介绍了leveldb初始化流程,本篇开始介绍存储流程。对于leveldb来说,删除数据实际是插入数据,只是将类型设置为删除即可,并不会真正将数据从磁盘中删除.那么什么时候真正删除呢?在压缩过程中,具体在压缩流程中介绍。一、插入1.1、总体流程图调用接口Put即可完成插入数据。那么内部实现是什么呢?首先来看一下总体流程图:说明:1) 调用接口Put插入数据,首先会先保存...原创 2019-07-16 20:40:46 · 1257 阅读 · 0 评论 -
leveldb常见问题以及性能优化点
本篇是leveldb最后一篇,这里主要把技术核心点,性能提升点或者面试可能会被问到进行总结。一、常见问题1、leveldb key-value内存,内存中保存的是所有key-value吗? 答:不是 搜索顺序,memtable immtable ldb文件2、布隆过滤器 在leveldb中的应用是什么?答:布隆过滤器主要应用查找方面,如果查找一个key在过滤器中返回false,那么...原创 2019-07-18 18:35:38 · 5936 阅读 · 1 评论 -
leveldb深度剖析-布隆过滤器
布隆过滤器使用bit数组映射关键字key,对于在一个超大的集合中判断是否存在某个key能够起到很好的效果。但是缺点很明显:容易误报。也就是本来不存在的key,可能告诉你它存在。一、布隆过滤器根据上图来说明布隆过滤器的原理:1)布隆过滤有一个m位(这里是10个)的bit数组(或者称bitmap),bit数组初始化为全0,并且有k个(这里是3个)hash函数。2)当我们分别存储a...原创 2019-07-18 18:35:26 · 1253 阅读 · 0 评论 -
leveldb深度剖析-压缩流程(3)
本篇是压缩流程中最后一篇,介绍DoCompactionWork方法。压缩主要工作是什么呢?剔除无效数据。什么是无效数据呢?就是被标记为删除的数据,我们要在这个流程中从磁盘中删除掉。下面来看一下具体是如何进行删除的。一、迭代器该函数比较长,这里分段介绍该函数。/** * 执行压缩 * @param compact 压缩信息 */Status DBImpl::DoCompacti...原创 2019-07-16 20:50:09 · 721 阅读 · 0 评论 -
leveldb深度剖析-压缩流程(2)
继续上一篇内容,来分析一下跨层压缩处理。leveldb不会轻易进行压缩流程(压缩流程影响性能),所以为了提升性能leveldb设计两个简单算法来决定压缩哪一层的哪一个文件一、压缩预计算1.1、打分函数leveldb每次进行文件压缩并没有随意压缩的,而是通过压缩预计算流程(打分函数)计算出一下值,在压缩的时候根据预计算结果选择压缩的层次,那么打分函数是如何实现的呢?/** * 预...原创 2019-07-16 20:48:05 · 1230 阅读 · 0 评论 -
leveldb深度剖析-SkipList跳表
上一篇介绍了leveldb整体存储结构,了解整体存储结构有助于我们深入理解leveldb源码。本篇介绍一下leveldb在内存中存储结构。链表的特点是插入、删除很好,但是查找性能就比较差了,需要从头开始遍历。对于查找场景我们通常使用二叉树,但是二叉树在插入、删除场景下需要调平衡,性能不是很好。所以为解决这两种数据结构的弊端,跳跃表应运而生。一、SkipList思想跳跃表的大体存储形式为...原创 2019-07-03 19:55:24 · 1227 阅读 · 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 · 2526 阅读 · 0 评论 -
leveldb深度剖析-压缩流程(1)
继续上一篇遗留问题,本篇介绍对MemTable压缩,在介绍之前先普及一下其他内容。在存储流程第一篇博客中,有一个方法没有详细说明--MakeRoomForWrite,该函数是保证新插入的数据有足够空间,那么该方法是如何保证的呢?本篇就详细介绍一下该方法。一、MakeRoomForWrite/* * 确保有足够空间可写 * @param force true表示强制立刻写入 fa...原创 2019-07-16 20:44:25 · 2275 阅读 · 0 评论 -
leveldb深度剖析-查询流程
至此,将插入流程以及压缩流程都已介绍完毕了,本篇主要介绍查询流程。一、查询流程首先来看一下查询接口具体实现内容:/** * 查询 * @param options 查询选项 * @param key 查询key * @param value 输出参数 如果找到则赋值给value */Status DBImpl::Get(const ReadOptions& opt...原创 2019-07-18 18:34:17 · 1591 阅读 · 0 评论 -
leveldb深度剖析-存储流程(2)
继续上一篇内容,本篇继续说明leveldb是如何将数据插入到MemTable中。一、Iterate循环处理插入到MemTable使用该接口WriteBatchInternal::InsertInto,具体实现是:Status WriteBatchInternal::InsertInto(const WriteBatch* b, ...原创 2019-07-16 20:46:50 · 598 阅读 · 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 · 885 阅读 · 0 评论 -
leveldb深度剖析-存储结构(1)
从今天开始深入剖析leveldb源码,在工作中也有用到leveldb(虽然没出过问题),但是从个人兴趣来说还是比较喜欢这款高效、简单的数据库。其实我们一直在使用leveldb,只是大家可能没有发现。例如:Chrome(谷歌浏览器)底层存储就是使用的leveldb。我是基于leveldb-v.1.20稳定版本进行分析。为什么我第一篇关于leveldb的博客不是介绍leveldb的简介、性能等基础...原创 2019-07-03 19:35:22 · 2389 阅读 · 0 评论 -
菜鸟学习Nginx之ngx_list_t
上一篇介绍的是ngx_buf_t,本篇介绍ngx_list_t,几乎在Nginx中无处不在,出现频率非常之高。Nginx中ngx_list_t在名字是链表的含义,但是实际可以理解成是数组形式单链表,比一般的链表要复杂一些,而ngx_queue_t是我们常说的双向链表。这一点需要澄清。一、数据结构1.1、数据结构typedef struct ngx_list_part_s ngx...原创 2018-12-18 17:00:02 · 1006 阅读 · 0 评论 -
菜鸟学习nginx之HTTP body接收(3)
上一篇介绍了,Nginx是如何接收body主体流程,但是我们仍然没有了解到,Nginx是如何保存body的?也就是第一篇中提到的问题。本篇主要分析ngx_http_request_body_filter函数,该函数会帮助我们解决。一、ngx_http_request_body_t结构体typedef struct { ngx_temp_file_t ...原创 2019-01-13 15:29:26 · 2428 阅读 · 4 评论 -
菜鸟学习Nginx之ngx_array_t
在上一篇介绍了ngx_list_t,本篇介绍一下ngx_array_t,其实有了上一篇的基础,在介绍ngx_array_t就比较简单了。一、数据结构在数据结构上与ngx_list_t有一点点重复,如下所示:typedef struct { void *elts; /* 数组的起始地址 */ ngx_uint_t nelts; /* 当前数组已存储元素...原创 2018-12-25 16:11:30 · 471 阅读 · 0 评论 -
菜鸟学习Nginx之入门开发留言板
本篇算是学习Nginx开山之作,后面还有会具体解析源码。利用Nginx实现了一个登录、留言板、文件上传功能,功能非常简单。但是对于如何开发一个Nginx模块来说已经足够,希望能够起到抛砖引玉的效果。一、效果登录界面:http://192.168.1.10/login.html 用户名和密码随意首页:http://192.168.1.10/index.html文件...原创 2018-12-04 13:30:34 · 661 阅读 · 0 评论 -
菜鸟学习Nginx之启动流程(1)
对于C语言编写的程序来说,main函数就是入口函数,把main函数研究清楚对于理解软件架构、功能会有事半功倍的效果。好在Nginx的main函数并不是很复杂,这里会把启动流程分成两篇来介绍,希望能够描述清楚。我把启动流程划分成两部分:cycle核心结构体初始化、master/worker进程启动。本篇介绍cycle核心结构体初始化。一、初始化流程在Nginx中有一个结构体伴随Nginx...原创 2018-12-05 21:42:08 · 1117 阅读 · 0 评论 -
菜鸟学习Nginx之ngx_buf_t
上一篇介绍的是ngx_pool_t内存池,对于Nginx来说万物皆池化,接下来介绍的ngx_buf_t也是从内存池中获取内存空间。一、数据结构定义1.1、数据结构定义ngx_buf_t从名字上可知,是缓冲区的意思。与大多数开源软件定义的缓冲区有点不同,它不仅仅能够处理内存,还能够处理文件,输入结构如下:typedef void * ngx_buf_tag_t...原创 2018-12-13 11:09:32 · 2432 阅读 · 0 评论 -
菜鸟学习Nginx之内存池
从今天开始深入介绍Nginx框架。首先来谈谈我对《深入理解Nginx模块开发与架构解析》看法,这本书应该是到目前为止,市面写的最详细,最充实的书籍(没有之一),值得拥有。然而此书对于一个小白来说,并不太适合,此书适合有相关使用经验或者开发经验,适合于进一步深造的同学。如果是小白,建议先浏览一下网上的博客,对Nginx各个方面有一定了解,然后在深入阅读此书。这是仅仅是我个人经验,毕竟我是这样走过...原创 2018-12-10 16:47:08 · 581 阅读 · 0 评论 -
Wireshark编译环境搭建以及支持Etcd报文
一、安装编译软件 为了扩展支持etcd报文解析,需要自己编译wireshark,因此搭建wireshark编译环境是必要的。编译wireshark需要如下软件作为支撑: python2.7(最好是稳定版本,不一定最新) cygwin(主要是跨平台编译) 安装visualstudio 2010 安装NSIS打包...原创 2018-07-01 21:49:43 · 1055 阅读 · 2 评论 -
go语言程序-gdb调试问题
以前经常用gdb调试C/C++程序,当学习golang的时候,发现golang的程序也是支持gdb调试的,然而还是遇到一些问题。比如说调试etcd程序就遇到如下问题:【问题1】 info goroutines,提示找不到Undefined info command: "goroutines". Try "help info".解决方法:启动gdb后,运行目标程序之前(输入r之前)...原创 2018-04-26 08:08:49 · 3252 阅读 · 0 评论 -
移植opendaylight到powerpc平台
今天介绍一下将ODL移植到powerpc平台上遇到的一些问题。1、启动karaf时提示找不到hostname,无法进行tcp连接。可以通过hostname命令进行设置,例如hostname localhost2、启动过程中出现异常,提示文件句柄不足。一个进程打开文件句柄数目是有限制(也可以设置成无限),不同操作系统是不同的。我们可以通过ulimit进行设置,例如:ulimit -n 655353、...原创 2018-04-11 14:58:06 · 723 阅读 · 0 评论 -
编译Openjdk
从来没有想过要自己去编译jdk,更没有想过要交叉编译jdk。哈哈,我也真是个人才(主要是领导安排的活)。为了联手以及填坑,先编译x86平台下的openjdk,下面是编译过程其中包含很多错误,记录一下心路历程。一、环境软件版本操作系统Redhat7.1bootJdk1.7.0_51GNU Make3.82g++ (GCC)4.8.2 Openjdk1.8u二、步骤2.1 安装依赖文件(其实就是co...原创 2018-03-19 20:01:47 · 4730 阅读 · 2 评论 -
Nginx反向代理Docker Registry
上一篇介绍如何搭建Registry私服。虽然上一篇的私服已经能够正常使用,但是存在一些问题,例如1)不安全。直接将端口暴露出来,容易被攻击 -- 采用nginx做https反向代理。2)单点故障,导致服务不能使用 -- 启动多个Registry服务,用nginx做负载均衡。今天介绍利用nginx做反向代理。比较惭愧,原先对openssl一直不太了解,大概花了三周的时间才把Regis原创 2018-01-23 21:08:09 · 3606 阅读 · 2 评论 -
菜鸟学习Nginx之平滑升级
Nginx高可用、高可靠性体现它的平滑升级--在升级过程中能够保证业务不间断,那它是如何实现的呢?接下来我们一起探讨它的实现原理。一、升级过程1.1、查看进程信息先通过命令行感性的了解一下Nginx是如何进行平滑升级的?首先通过命令行查看进程信息,可知,一个master进程、两个worker进程,如下所示:[root@localhost ~]# ps -ef | grep ngi...原创 2019-01-17 23:06:00 · 717 阅读 · 0 评论 -
菜鸟学习Nginx之启动流程(2)
上一篇介绍了启动流程中关于初始化ngx_cycle_t。由于ngx_cycle_t是Nginx核心结构,Nginx整个架构均是围绕它构建起来的。虽然用了一整篇文章介绍ngx_cycle_t,但是感觉还是有些内容没有介绍清楚。初始化ngx_cycle_t有一部分代码没有介绍,ngx_conf_parse,该函数解析配置文件nginx.conf函数。此函数就是单纯解析配置文件,里面代码比较枯燥乏味,理...原创 2018-12-06 19:59:19 · 419 阅读 · 0 评论