自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(46)
  • 收藏
  • 关注

转载 C++雾中风景13:volatile解惑

笔者入职百度时,二面面试官的让我聊聊C++之中的volatile关键词。volatile在Java和C++之中的差别可谓是天差地别,我只是简单聊了聊Java之中的volatile,面试官对我的回答并不满意。后续学习《C++ Prmier》时,对volatile的理解也是云里雾里。入职百度之后,发现身边的同学时候对volatile也是误会颇多。(果然是“面试造核弹,工作拧螺丝”)所以笔者...

2019-03-19 20:43:00 159

转载 AeroSpike踩坑手记1:Architecture of a Real Time Operational DBMS论文导读

又开了一个新的坑,笔者工作之后维护着一个 NoSQL 数据库。而笔者维护的数据库正是基于社区版本的 Aerospike打造而来。所以这个踩坑系列的文章属于工作总结型的内容,会将使用开发 Aerospike 的各种问题进行总结梳理,希望能够给予大家启发和帮助。第一篇开山之文,就先从Aerospike 公司在16年数据库顶会 VLDB的一篇论文 《Aerospike: Architectu...

2019-01-20 10:08:00 293

转载 Linux 程序设计1:深入浅出 Linux 共享内存

笔者最近在阅读Aerospike 论文时,发现了Aerospike是利用了Linux 共享内存机制来实现的存储索引快速重建的。这种方式比传统利用索引文件进行快速重启的方式大大提高了效率。(减少了磁盘 i/o,但是缺点是耗费内存,并且服务器一旦重启之后就只能冷重启了~~)而目前笔者工作之中维护的 NoSQL 数据库也是通过同样的机制实现存储索引的快速重建的,工欲善其事,必先利其器。所以笔...

2019-01-02 18:18:00 253

转载 C++雾中风景番外篇3:GDB与Valgrind ,调试代码内存的工具

写 C++的同学想必有太多和内存打交道的血泪经验了,常常被 C++的内存问题搅的焦头烂额。(写 core 的经验了)有很多同学一见到 core 就两眼一抹黑,不知所措了。笔者 入"坑"C++之后,在调试 C++代码的过程之中,学习了不少调试代码内存的工具。希望借这个机会来介绍一下笔者常用的工具,GDB,Valgrind等等,相信大家通过好好运用这些工具,能更好的驯服内存这匹"野马"。...

2018-11-08 19:37:00 179

转载 C++雾中风景番外篇2:Gtest 与 Gmock,聊聊C++的单元测试

正式工作之后,公司对于单元测试要求比较严格。(笔者之前比较懒,一般很少写完整的单测~~)。作为一个合格的开发工程师,需要为所编写代码编写适量的单元测试是十分必要的,在实际进行的开发工作之中,TDD(Test drivern development) 是一种经过实践可行的开发方式。编写单元测试可以帮助我们在开发阶段就发现错误,并且保证新的修改没有破坏已有的程序逻辑。 在 C++之中,常用...

2018-11-01 14:01:00 296

转载 C++雾中风景12:聊聊C++中的Mutex,以及拯救生产力的Boost

笔者近期在工作之中编程实现一个Cache结构的封装,需要使用到C++之中的互斥量Mutex,于是花了一些时间进行了调研。(结果对C++标准库很是绝望....)最终还是通过利用了Boost库的shared_mutex解决了问题。借这个机会来聊聊在C++之中的多线程编程的一些“坑”。1.C++多线程编程的困扰C++从11开始在标准库之中引入了线程库来进行多线程编程,在之前的版本需要依...

2018-10-06 16:54:00 237

转载 C++雾中风景11:厘清C++类型转换(static_cast,dynamic_cast,reinterpret_cast,const_cast)

C++是一门弱类型的语言,提供了许多复杂和灵巧类型转换的方式。笔者之前写的Python与Go都是强类型的语言,对这种弱类型的设计实在是接受无力啊~~ ( 生活所迫,工作还得写C++啊~~)C++语言提供了四种类型转换的操作:static_cast,dynamic_cast,reinterpret_cast,const_cast,今天就来聊一聊,在C++之中应该如何来使用这些类型转换的。...

2018-09-29 10:46:00 107

转载 大数据小视角5:探究SSD写放大的成因与解决思路

笔者目前开发运维的存储系统的服务器都跑在SSD之上,目前单机服务器最大的SSD容量有4T之多。(公司好有钱,以前在实验室都只有机械硬盘用的~~)但SSD本身的特性与机械硬盘差距较大,虽然说在性能上有诸多优势,但是如果使用的方式方法不对,反而会事倍功半。所以笔者花时间调研了一下固态硬盘的结构与特性,并且总结了一些避免SSD写放大性能下降的法则,希望对大家有所帮助~~1.SSD的写放大...

2018-09-21 11:54:00 445

转载 C++雾中风景番外篇:理解C++的复杂声明与声明解析

在学习C系列语言的过程之中,理解C/C++的复杂声明一直是初学者很困扰的问题。笔者初学之时也深受困扰,对很多规则死记硬背。后续在阅读《C专家编程》之后,尝试在编译器的角度来理解C/C++的声明解析,并且编写代码将这部分逻辑串联起来,之后再看到许多看似复杂的声明,也能够很好的理解和消化了。1.复杂的声明在编写C/C++代码时偶尔能看到如下的复杂声明:float(*(*e[10])(...

2018-09-05 16:14:00 85

转载 Python读取大文件的"坑“与内存占用检测

python读写文件的api都很简单,一不留神就容易踩”坑“。笔者记录一次踩坑历程,并且给了一些总结,希望到大家在使用python的过程之中,能够避免一些可能产生隐患的代码。1.read()与readlines():随手搜索python读写文件的教程,很经常看到read()与readlines()这对函数。所以我们会常常看到如下代码:with open(file_path, '...

2018-08-24 10:05:00 1788

转载 大数据小视角4:小议Lambda 与 Kappa 架构,不可变数据的计算探索

这个系列文章之前因为私事荒废了很久,继续更新~~之前与老大谈论架构时,老大和我聊了聊分布式数据处理之中的Lambda结构,之前在《Designing Data-Intensive Applications》这本书之中,作者 Martin Kleppmann也在文中涉及到了通过重型批处理与灵活的流处理相结合的方式来构建分布式计算系统。所以这次也是借这个机会重新梳理Lambda架构与后续由...

2018-08-08 10:16:00 120

转载 C++雾中风景10:聊聊左值,纯右值与将亡值

C++11的版本在类型系统上下了很大的功夫,添加了诸如auto,decltype,move等新的关键词来简化代码的编写与降低阅读代码的难度。为了更好的理解这些新的语义,笔者确定通过几篇文章来简单窥探一下C++类型系统的冰山一角,如果加深了对C++类型系统的理解,想必大家也能够更好的应用由C++11带给我们的新"利器"。1.左值与右值左值(lvalue)和右值(rvalue)是C+...

2018-07-19 19:07:00 146

转载 大数据小视角3:CarbonData,来自华为的中国力量

连续两篇文章都聊了不同的存储格式,这篇我们继续深入来看看在存储格式的演变之上有什么新的"黑科技"。华为公司在2016年开源了类parquet的列存格式:CarbonData,并且贡献给了Apache社区。CarbonData仅仅用了不到一年的时间就成功毕业,成为了Apache社区的顶级项目,CarbonData是首个由华人公司主导的Apache顶级项目,(来源自eBay的Kylin算是...

2018-06-20 09:33:00 123

转载 大数据小视角2:ORCFile与Parquet,开源圈背后的生意

上一篇文章聊了聊基于PAX的混合存储结构的RCFile,其实这里笔者还了解一些八卦,RCfile的主力团队都是来自中科院的童鞋在Facebook完成的,算是一个由华人主导的编码项目。但是RCfile仍然存在一些缺陷,后续被HortonWorks盯上之后上马了ORCFile格式,而老对头Cloudera则紧抱Google大腿推出了Parquet格式。 其实二者需要解决的问题是殊途同归的,...

2018-05-25 10:46:00 94

转载 C++雾中风景9:emplace_back与可变长模板

C++11的版本在vector容器添加了emplace_back方法,相对于原先的push_back方法能够在一定程度上提升vector容器的表现性能。所以我们从STL源码角度来切入,看看这两种方法有什么样的区别,新引进的方法又有什么可学习参考之处。1.emplace_back的用法emplace_back方法最大的改进就在与可以利用类本身的构造函数直接在内存之中构建对象,而不需...

2018-05-21 19:49:00 212

转载 大数据小视角1:从行存储到RCFile

前段时间一直在忙碌写毕设与项目的事情,很久没有写一些学习心得与工作记录了,开了一个新的坑,希望能继续坚持写作与记录分布式存储相关的知识。为什么叫小视角呢?因为属于随想型的内容,可能一个由小的视角来审视海量数据的存储与计算技术,把知识点分为两到三章来梳理。管中窥豹,可见一斑,希望能利用这个过程提高自己,也欢迎阅读的朋友多指正。 第一章先从Facebook的一篇论文《RCFile: A F...

2018-05-04 19:08:00 80

转载 C++雾中风景8:Lambda表达式

上一篇C++的博客是Long Long ago了,前文讲到在看Lambda表达式的内容。笔者首次接触Lambda表达式应该是学习Python语言的时候,当时也不太明白这种表达方式的精髓,后续接触了Scala与Java8的链式调用与Lambda结合的方式,深陷无法自拔。所以借上一篇闭包的内容。我们来完整的梳理一下C++之中的Lambda表达式。1.什么是Lambda表达式?Lamb...

2018-04-30 16:56:00 121

转载 Linux下双网卡Firewalld的配置流程

实验室拟态存储的项目需要通过LVS-NAT模式通过LVS服务器来区隔内外网的服务,所以安全防护的重心则落在了LVS服务器之上。笔者最终选择通过firewalld放行端口的方式来实现需求,由于firewall与传统Linux使用的iptable工具有不小的区别,接下来通过博客来记录一下firewalld的配置流程。1.Firewall服务的简介:firewalld提供了一个 动态管理...

2018-04-24 12:45:00 385

转载 数据系统的未来------《Designing Data-Intensive Applications》读书笔记17

终于来到这本书最后的一章了《Designing Data-Intensive Applications》大部头,这本书应该是我近两年读过最棒的技术书籍。作者Martin Kleppmann帮助我们梳理了数据系统的纷繁复杂的技术逻辑,在这本书的最后,他将带领我们瞭望数据系统的未来,虽然预测未来是一件很主观的事情,但是,立足于现在去展望未来是可能的事情。所以现在,扬帆起航,让咱们来一起看看...

2018-03-26 15:44:00 214

转载 LVS-NAT模式的配置详解

由于实验室拟态存储的项目需要通过NAT模式来映射NFS服务器已实现负载均衡的目的,通过调研了多种负载均衡机制,笔者最终选择了LVS的NAT模式来实现需求,接下来通过博客来记录一下LVS-NAT模式的配置流程。1.LVS服务的简介:LVS是Linux Virtual Server的简写,意即Linux虚拟服务器,是一个虚拟的服务器集群系统,在1998年5月由章文嵩先生主导开发。LVS...

2018-03-14 21:16:00 103

转载 流处理与消息队列------《Designing Data-Intensive Applications》读书笔记16

上一篇聊了聊批处理的缺点,对于无界数据来说,流处理会是更好的选择,“流”指的是随着时间的推移逐步增加的数据。消息队列可以将这些流组织起来,快速的在应用程序中给予反馈。但是消息队列与传统的数据库之间又存在着“剪不断,理还乱”的“纠葛”,最后我们将探讨通过消息队列之中与时序有关的一些问题。文件是批处理作业的输入和输出,而在流处理之中,作业的输入输出等价物是什么呢?在流处理之中,当输入...

2018-03-06 14:15:00 232

转载 流式计算与计算抽象化------《Designing Data-Intensive Applications》读书笔记15

上篇的内容,我们探讨了分布式计算中的MapReduce与批处理。所以本篇我们将继续探索分布式计算优化的相关细节,并且分析MapReduce与批处理的局限性,看看流式计算是否能给我们在分布式计算层面提供一个更好的解决方案。1.MapReduce的局限MapReduce作业是独立于其他作业,输入与输出目录通过分布式存储系统串联。MapReduce作业的存在相互的依赖关系,前后相互依赖...

2018-02-28 18:09:00 116

转载 MapReduce与批处理------《Designing Data-Intensive Applications》读书笔记14

之前的文章大量的内容在和大家探讨分布式存储,接下来的章节进入了分布式计算领域。坦白说,个人之前专业的重心侧重于存储,对许多计算的内容理解可能不是和确切,如果文章中的理解有所不妥,愿虚心赐教。本篇将和大家聊一聊分布式计算的一个子集:批处理。批处理系统通常也叫脱机系统,需要大量的输入数据,运行一个作业来处理它,并产生一些输出数据。工作通常需要一段较长的时间(从几分钟到几天)。批处理作业...

2018-02-23 20:34:00 177

转载 分布式系统的一致性算法------《Designing Data-Intensive Applications》读书笔记13

一致性算法是分布式系统中最重要的问题之一。表面上看,这似乎很简单,只是让几个节点在某些方面达成一致。在本篇之中,会带大家完整的梳理分布式系统之中的共识算法,来更加深刻的理解分布式系统的设计。1.原子提交和两阶段提交(2PC)原子提交防止了数据库处于半更新的状态,这对于需要满足多对象事务和维护次级索引的数据库尤为重要。每个次级索引都是从主数据中分离出来的数据结构,因此,如果修改某些...

2018-02-21 18:01:00 172

转载 线性一致性与全序广播------《Designing Data-Intensive Applications》读书笔记12

上一篇聊了聊构建分布式系统所面临的困难,这篇将着重讨论构建容错分布式系统的算法与协议。构建容错系统的最佳方法是使用通用抽象,允许应用程序忽略分布式系统中的一些问题。本篇我们先聊一聊线性一致性,以及与线性一致性有关的技术,后续需要了解的分布式协调服务,如:ZooKeeper等,都是基于分布式系统的线性一致性。1.更强的一致性大多数分布式数据库至少提供了最终一致性,这意味着如果停止对...

2018-02-19 12:19:00 225

转载 分布式系统的烦恼------《Designing Data-Intensive Applications》读书笔记11

使用分布式系统与在单机系统中处理问题有很大的区别,分布式系统带来了更大的处理能力和存储容量之后,也带来了很多新的"烦恼"。在这一篇之中,我们将看看分布式系统带给我们新的挑战。1.故障当我们在使用单机系统时,它通常以一种相当可预测的方式工作:要么它正常工作,要么不工作。而当我们在使用分布式系统时,情况就不同了。在分布式系统中,系统的某些部分可能以某种不可预知的方式被破坏,即使系统...

2018-02-15 10:16:00 73

转载 事务与隔离级别------《Designing Data-Intensive Applications》读书笔记10

和数据库打交道的程序员绕不开的话题就是:事务,作为一个简化访问数据库的应用程序的编程模型。通过使用事务,应用程序可以忽略某些潜在的错误场景和并发问题,由数据库负责处理它们。而并非每个应用程序都需要事务,有时削弱事务性担保或完全放弃事务,可以获得更高的性能或更高的可用性。怎么样更好的理解数据库中的事务与隔离级别呢?我们借这篇文章来聊一聊吧~1.ACID1983年,Andreas R...

2018-02-13 18:00:00 141

转载 数据分区------《Designing Data-Intensive Applications》读书笔记9

进入到第六章了,我们要开始聊聊分布式系统之中的核心问题:数据分区。分布式系统通常是通过大规模的数据节点来处理单机没有办法处理的海量数据集,因此,可以将一个大型数据集可以分布在多个磁盘上,查询负载可以分布在多个处理器上。在这一章中,我们首先讨论划分大型数据集的不同方法,并观察数据索引如何与分区交互,然后将探索数据分区重新平衡的策略。最后,来看看路由技术怎么将查询索引到正确的分区。内容看起...

2018-02-10 18:04:00 132

转载 C++雾中风景7:闭包

本来说好要聊一聊命名空间的,因为最近在看C++lambda表达式的内容,所以借这个机会我们来好好聊一聊C++的闭包。1.什么是闭包?闭包(closure)是函数式编程的重要的语法结构。闭包的概念其实很简单,一言以蔽之:闭包是带有上下文的函数。说白了,就是有状态的函数。也就是说一个局部变量n,在被函数对象给“封闭”在函数里,从而能把值保存了下来,让函数能够保存状态。(其实本质上就...

2018-02-07 16:23:00 122

转载 P2P结构与Quorum机制------《Designing Data-Intensive Applications》读书笔记8

前文涉及到了很多与Leader相关的算法,大家有木有想过,王侯将相,宁有种乎,既然Leader这么麻烦,干脆还是采用P2P模型吧,来个大家平等的架构。本篇需要和大家探讨的就是多副本下实现民主政治的Quorum机制。至于它是怎么样解决我们在前文提及的各种问题的,接着这篇文章我们继续聊聊~~1. No-Leader机制有些数据存储系统放弃了Leader的机制,允许任何副本直接接受用户...

2018-01-28 11:26:00 97

转载 客户端一致性与多Leader机制------《Designing Data-Intensive Applications》读书笔记7

接着上一篇的内容,我们继续来梳理分布式系统之中的副本机制与副本一致。上文我们聊到了在可用性与一致性之间的一个折中的一致性等级:最终一致性。我们顺着上篇的内容,由用户来分析一致性等级。1. 客户端的困扰上篇文章我们提到了数据系统常用的模型,当提交新数据时,必须将它发送给Leader节点,但是当用户查询数据时,可以从一个Follower节点读取该数据。这样的模型使十分适合Web应用...

2018-01-23 10:48:00 149

转载 副本机制与副本同步------《Designing Data-Intensive Applications》读书笔记6

进入到第五章了,来到了分布式系统之中最核心与复杂的内容:副本与一致性。通常分布式系统会通过网络连接的多台机器上保存相同数据的副本,所以在本篇之中,我们来展开看看如何去管理和维护这些副本,以及这个过程之中会遇到的各种问题。1.副本在数据系统之中,我们通常会有这样几个原因来使用副本技术:保持地理位置接近用户,从而减少延迟(如:Cache,CDN技术)提高系统的可用性和鲁棒性,即...

2018-01-19 11:30:00 94

转载 C++雾中风景6:拷贝构造函数与赋值函数

在进行C++类编写的过程之中,通常会涉及到类的拷贝构造函数与类的赋值函数。初涉类编写的代码,对于两类函数的用法一直是挺让人困惑的内容。这篇文章我们会详细来梳理拷贝构造函数与赋值函数的区别。1.调用了哪个函数?上述两种函数的使用和C++之中类的定义紧密相关,所以我们先定义一个类:class Line {public: int getLength( void ); ...

2018-01-17 13:22:00 79

转载 编码与模式------《Designing Data-Intensive Applications》读书笔记5

进入到第四章了,本篇主要聊的点是编码(也就是序列化)与代码升级的一些场景,来梳理存储之中涉及到的编解码的流程。目前主流的编解码便是来自Apache的Avro,来自Facebook的Thrift与Google的Protocolbuf,在本篇之中,我们也会一一梳理各种编码的优点与痛点。1.非二进制的编码格式程序通常以至少两种不同的表示方式处理数据:1、在内存中,数据是保存在对象、结...

2018-01-13 19:46:00 91

转载 OLAP与数据仓库------《Designing Data-Intensive Applications》读书笔记4

由于第三章的内容比较多,这里我们拆分成两篇读书笔记来记录。上一章我们聊了聊如何数据库是如何实现存储和检索的,今天这篇我们继续来看看OLTP与OLAP存储引擎的区别与联系。1.OLTP与OLAP联机事务处理过程(On-Line Transaction Processing)也就是我们通常称之的OLTP。联机分析处理过程(On-Line Analysis Processing)则被...

2018-01-08 16:33:00 73

转载 C++雾中风景5:Explicit's better than implicit.聊聊Explicit.

关于Explicit还是Implicit一直是编程语言中能让程序员们干起架的争议。那些聪明的老鸟总是觉得Implicit的规则让他们能够一目十行,减少样板代码的羁绊。而很多时候,Implicit的很多规则会让新手或者是合作开发的搭档痛苦不堪。文章的标题也写明了笔者的态度,显式的在代码之中指明自己的意图,会让程序更加明晰。所以也借今天这篇文章,我们来聊聊Explicit关键字。1.隐...

2018-01-04 16:15:00 76

转载 存储与索引------《Designing Data-Intensive Applications》读书笔记3

在上一篇的笔记之中,我们讨论了数据模型和查询语言。在第三章之中我们来聊一聊不同的数据引擎内部是如何实现存储和检索的,以及不同设计之间的折中与妥协。1.键值对数据库键值对数据库是数据库形式之中最简单的一种模式,我们可以把它简化的实现为下面两个函数:底层存储格式也十分简单:一个文本文件,其中每行包含一个键值对,用逗号分隔(类似于CSV文件,忽略转义问题)。每一次调用 db_set...

2017-12-26 15:34:00 90

转载 数据模型与查询语言 ------《Designing Data-Intensive Applications》读书笔记2

数据模型是开发软件的最重要的部分,因为它们对应用程序有着深远的影响:不仅是软件的编写方式,而且也影响我们如何解决的问题的方式。第二篇读书笔记,我们聊一聊数据模型的设计。1.数据模型的分层作为一个开发者来说,在一个复杂的应用程序中,是存在很多分层模型的,但基本思想还是一样的:每一层都提供了一个干净的数据模型,从而隐藏了底层的复杂性。通过这样的抽象来允许不同的人群有效地协同工作。每...

2017-12-20 11:05:00 78

转载 C++雾中风景4:多态引出的困惑,对象的拷贝?

C++作为一门面向对象的语言,自然具备了面向对象的三大特征:封装,继承,多态。在学习多态性质的过程中,发现了C++与其他语言很大的区别(坑?)。在C++中的=操作符的使用与C++呈现的内存模型似乎并不是我所习惯的模式,在拷贝与引用两个不同操作之间摇摆,还是很容易写出存在问题的代码,所以也就引出了今天这篇文章,我们来聊聊=操作符背后的故事。1.有些奇怪的多态来,先上代码,我们从两段...

2017-12-14 14:07:00 63

转载 可靠的、可扩展的、可维护的数据系统 ------《Designing Data-Intensive Applications》读书笔记1...

坦白说也是机缘巧合,在硕士生阶段进入分布式系统领域学习。无论是大规模存储或计算,其核心也是运用分布式技术利用并行性来解决数据密集型应用的需求。最近开始在啃这本《Designing Data-Intensive Applications》大部头,作者Martin Kleppmann在分布式数据系统领域有着很深的功底,并在这本书中完整的梳理各类纷繁复杂设计背后的技术逻辑,不同架构之间的妥协...

2017-12-07 11:53:00 156

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除