
The post 开源美图 2017 06 01 appeared first on Linuxeden开源社区.
http://ift.tt/2rlSGlL
Jaromil 在 2002 年设计了最为精简的一个 Linux Fork 炸弹,整个代码只有 13 个字符,在 shell 中运行后几秒后系统就会宕机:
|
1
|
:(){:|:&};:
|
这样看起来不是很好理解,我们可以更改下格式:
|
1
2
3
4
5
|
:()
{
:|:&
};
:
|
更好理解一点的话就是这样:
|
1
2
3
4
5
|
bomb()
{
bomb|bomb&
};
bomb
|
因为 shell 中函数可以省略 function 关键字,所以上面的十三个字符是功能是定义一个函数与调用这个函数,函数的名称为 :,主要的核心代码是 :|:&,可以看出这是一个函数本身的递归调用,通过 & 实现在后台开启新进程运行,通过管道实现进程呈几何形式增长,最后再通过 : 来调用函数引爆炸弹。因此,几秒钟系统就会因为处理不过来太多的进程而死机,解决的唯一办法就是重启。
秉着不作不死的心态,我们也来运行一下,于是我将矛头指向云主机,,我使用了国内的一个 2G 内存的云主机,首先在本地开启两个终端,在一个终端连接云主机后运行炸弹,秒后再尝试用另外一个终端登录,效果可以看下面 Gif 图:
看,运行一段时间后直接报出了 -bash: fork: Cannot allocate memory,说明内存不足了。并且我在二号终端上尝试连接也没有任何反应。因为是虚拟的云主机,所以我只能通过主机服务商的后台来给主机断电重启。然后才能重新登录:
Fork 炸弹带来的后果就是耗尽服务器资源,使服务器不能正常的对外提供服务,也就是常说的 DoS(Denial of Service)。与传统 1v1、通过不断向服务器发送请求造成服务器崩溃不同,Fork 炸弹有种坐山观虎斗,不费一兵一卒斩敌人于马下的感觉。更吓人的是这个函数是不需要 root 权限就可以运行的。看到网上有帖子说某些人将个性签名改为 Fork 炸弹,结果果真有好奇之人中枪,试想如果中枪的人是在公司服务器上运行的话,oh,!
当然,Fork 炸弹没有那么可怕,用其它语言也可以分分钟写出来一个,例如,python 版:
|
1
2
3
|
import os
while True:
os.fork()
|
Fork 炸弹的本质无非就是靠创建进程来抢占系统资源,在 Linux 中,我们可以通过 ulimit 命令来限制用户的某些行为,运行 ulimit -a 可以查看我们能做哪些限制:
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
ubuntu@10–10–57–151:~$ ulimit –a
core file size (blocks, –c) 0
data seg size (kbytes, –d) unlimited
scheduling priority (–e) 0
file size (blocks, –f) unlimited
pending signals (–i) 7782
max locked memory (kbytes, –l) 64
max memory size (kbytes, –m) unlimited
open files (–n) 1024
pipe size (512 bytes, –p) 8
POSIX message queues (bytes, –q) 819200
real–time priority (–r) 0
stack size (kbytes, –s) 8192
cpu time (seconds, –t) unlimited
max user processes (–u) 7782
virtual memory (kbytes, –v) unlimited
file locks (–x) unlimited
|
可以看到,-u 参数可以限制用户创建进程数,因此,我们可以使用 ulimit -u 20 来允许用户最多创建 20 个进程。这样就可以预防 bomb 炸弹。但这样是不彻底的,关闭终端后这个命令就失效了。我们可以通过修改 /etc/security/limits.conf 文件来进行更深层次的预防,在文件里添加如下一行(ubuntu 需更换为你的用户名):
|
1
|
ubuntu – nproc 20
|
这样,退出后重新登录,就会发现最大进程数已经更改为 20 了,
这个时候我们再次运行炸弹就不会报内存不足了,而是提示 -bash: fork: retry: No child processes,说明 Linux 限制了炸弹创建进程。
转自 http://ift.tt/2qzgNfn
The post 经典的 Fork 炸弹解析 appeared first on Linuxeden开源社区.
http://ift.tt/2rlXx6d
作者 Medhat Sabry ,译者 王强
正如我在 之前的一篇同名文章 中所提到的,人力再造是组织“坚持追求健康”精神的体现,落实在五种行动分支上。它们分别是指导与教练、领导力再造、团队充能、管理者意识与主动监控。
所以如果你读过之前那篇文章,并有兴趣了解更多内容,本文正对你的胃口。
本文中我们会探讨一些具体的做法。本文的主题是指导与教练分支,着重研究指导部分。该主题可总结为“指导即服务”,缩写为 MRaaS。
业界权威之一,Robert C. Martin(Uncle Bob)给出了一项估计,指出程序员的数量每五年会翻番,(主要)来自于教育系统的新 CS 和 EE 毕业生成批涌入需求旺盛的开发市场。这条经验定律听起来没什么问题,其内涵很像是 晶体管行业几十年前就有的戈登摩尔定律 。这里我推荐读者观看 Martin 的演讲 ,其中提出了关于业内人员成熟度的很多见解。于是,在这一可谓人类当今文明基石的行业中,我们的平均经验水平一直都和新手几乎相当,只是比新手略强!这一事实的影响有利有弊:好处在于我们得到了庞大的、源源不断的能量、心流(flow)和极致专注(hyperfocus)。而弊端则如业内前辈所看到的一样,新人的自我管理能力与个性约束变得一团糟。我个人并不同意“一团糟”理论,我认为这种现象是代际视角的正常差异,正是节奏与文化显著不同的生态系统塑造了这种差异。事实上我们(作为行业前辈)的职责正是要帮扶新人,平滑、优雅地将他们塑造为专业人员。那么,问题在哪儿呢?
有时要教导这一大帮未成熟员工的资源不够用,这时问题就来了。特别是当团队和领导要面对沉重压力,需要尽快完成任务计划时,帮助新人、使他们“技术上具备生产力”(但并非团队急需)的余力就会非常紧张。Martin 的那段演讲很好地描述了这一现象:我们发现自身处于持续“缺乏经验”的状态中。
由此应该引入指导和教练,以填补 Y 世代,或称千禧一代,也就是 80 后到 90 中一代人面临的经验鸿沟。这代人无疑已经在业内占据了半数以上的人员比例。
这里的要点是,指导是一种单对单的长时间引导过程。这种手段花费高昂,不太可能应用到全部日常工作环境中。同时,虽然教练是基于团队实施的,它也需要很好地适应日常工作环境和场景,以免打断和浪费团队的工作时间。为实现指导与教练的目标,我们先来以人力再造的视角研究一些更加务实的模型。
关于指导的实用模型,我推荐“小组指导”。其中一位导师对接一组学员,指导一个特定主题并安排一系列会话,直到取得预期的效果。这里可以参考 ATD(人才发展协会)的一篇概述论文 获取这一概念的更多细节。
在教练领域,我使用的是“嵌入式团队教练”,有时也称作一线经理教练。这种教练角色是高效率领导者职责的一部分。首先要在组织中建设一个出色的领导力基础,然后要让领导者知道怎样去教练,而非单纯地提意见,当然还要根据员工的绩效和发展意愿来设置教练主题。
这里的另一个角色是从指导和教练相关的模型中自然产生的,那就是小组指导流程中的“协调人”。事实上协调人当然是由领导者担任的。他们与团队一同寻找(而不是为团队寻找)哪些主题应该包含进指导服务中。他们安排和协调指导服务的会话,并有权评估效果、影响团队成员。
那么首先,怎样让这些新人步入职场呢?怎样向他们表明我们想要为他们提供指导,从而帮助他们取得事业成功呢?
简单明了地说:使用“师友拥抱”!PRE(人力再造的缩写)应该以这种方式开头。
每个组织都有一些欢迎新人的方法,让新人能愉快地融入团队。这通常是由人资部门负责的事项。此外还有类似“培训会议”或“培训日”的活动,用来让新人了解职场生活的具体内容。
但是师友拥抱并不属于这两个环节。它可以被安排在培训日里(例如半天时间),但最好是单独分出一整天的时间。如果新人还没在项目中承担重任,这一活动就不会耗费太多资源。如果团队的多种开发岗位乃至团队领导层来了不少于三名新成员,那么找上级或人资部门安排师友拥抱并不困难,更高级别的领导层则有自己的一套流程。师友拥抱的时间越接近迎新日越好。
不管是作为培训日的一部分或者是独立的一天(这样更好),师友拥抱都不该是一种庆祝氛围浓厚的迎新会。它应该成为“专业的会谈”,用来填补前辈与新人之间的鸿沟。
我个人经历而言,只要师友拥抱活动由合适的人选主办、有正确的形式,那么参与其中的感觉就非常棒。我定义“正确”的标准来自于我经历许多活动后总结的经验,之后我会谈到这部分。
现在我们来谈谈“拥抱”的一些细节。
第一部分的目标是让新人明白一种职业的本质:职业的含义是什么?它对从业者有何要求?人们该期待这一职位给自己的事业带来什么好处?
首先为拥抱日挑选一位领导者。他应该有丰富的经验,足以打动新人。找一位具备某些领导特长的前辈,她或他必须认同这种教导菜鸟新人的工作,并为新人提出某种“宣言”,宣言的目标是在这个知识快速革新(不仅限于我们的行业)的年代进行高效的软件开发。
接下来是议程和内容。列出你们的需求,但有一项内容永远要排在最前面,那就是“ 知识时代软件开发的视角 ”。以上链接是一个示例。这实际是我对 Techstamina 的愿景,是我对以人员为中心的软件开发环境给出的提案。
向新人提一些问题是一种开启谈话的不错方式,诸如:
那么,经过半小时或更久的生动讨论探讨软件的用途与其对当下人类文明的重要性,可以保证大家都会意识到开发者工作的真正意义,视野也会开始变得更加广阔。
到了这一步,经过对职业意义的真诚探讨,我们应该已经指出了开发工作的本质。开发者应该是“匠人”,要让新人心中烙下“工匠技艺”的生动概念。我个人是这一概念的支持者之一,我们的开发活动应该符合这一理念。多年前一些业界前辈引领了一场工匠精神与实用主义的风潮,我从中获益良多。
拥抱日之后的多数主题是可选内容。我会给出一些个人选项,它们符合我所处环境的很多需要,如果读者愿意可以参考。另外再推荐三份重要的资料,肯定会给你们一些启迪:
那么,看过软件在当今人类生活中的重大意义,明白软件的作用不仅局限于商业领域后,一个新的问题是:招来的这帮新人可谓 21 世纪的令人担忧的一代,那么还需要讲些什么来帮助他们面对充满挑战的职业生涯?
一如我之前所提到的,我会概述我“偏爱”的 7 个重要主题,并在每个主题前给出一些要点和提示。
要打动他们,首先你得了解他们!
于是,我们的第一个主题会列举一系列干扰我们工作的挑战,之后的主题则会研究抵消它们负面影响的策略。这些挑战分别是:
幻灯片例 1
接下来的主题会讨论面对并超越这些挑战的技巧。
幻灯片例 2
这个主题具体描绘“成熟”的专业特质,并展示成为受欢迎的内行的好处。主题最后给出规划成功职业生涯的通行模式。上文的幻灯片例 2 描绘了一种成为成熟的专业人员的三层式模型。第二层中的“Values”实际上指的是实用的价值观,我们在工作中需要这些价值观来达到实在、可持续的成功状态。我认为我们需要的关键价值观有:守信、负责、适应并接受他人(团队精神的基础)。接下来是向周围同事表现自己的能力。第三层的“表现能力(presentability)”指的是人们如何感受自己的存在、与他人有效沟通,尤其是表达反对意见的能力。
幻灯片例 3
这里我引入与职业生涯相关的这一概念,讲一些应对它的方法。首先介绍一些“适应”这种压力的方法,之后的一些技巧会帮助我们克服压力,从压力对头脑、身体与心灵的负面影响中恢复过来。实际上,人资团队应该安排传授减压技巧的课程,帮助员工应对压力。就我来说,我会介绍相关的方法并解释为何我们应该花时间了解它们。幻灯片 4 是这一主题的介绍。
幻灯片例 4
首先,我们要为程序员创造一种与缺陷战斗的文化。我曾使用上面的幻灯片做辅助,用缺陷率指标来解释“接近完美”的含义。“接近完美”指的是应该尽量减少验收问题的数量与影响,且在软件支持周期“终结”之前消灭缺陷以实现稳定的运行。接下来谈谈软件质量的其他知名的属性。这部分内容的剩余部分讲一下解决成本与质量间必然冲突的方法,以及帮助程序员自然地维持高质量输出的一些好习惯。
我们应该以能量的视角进行团队合作:团队合作是团队成员、组织甚至客户的能量来源。这一主题旨在重新定义团队合作,将其视为一种途径,使成员在最富挑战的环境中表现、学习、承担压力并产出高质量的成果,同时乐在其中。
如果你像我一样留意过所谓“Y 世代”的概念,你应该会注意到年轻人不愿长时间重复同一种任务。这是不成熟的表现,需要我们及时纠正并解决。怎样在工作中寻找自我实现,是需要组织中团队和领导共同合作解决的问题。这一主题以自我实现的角度告诉开发者,我们的工作与成就价值非凡,应该得到足够的奖励以消除工作中的任何厌倦感。
本质上来说,不光是写代码,任何需求注意力的活动,诸如通顺地理解并表达需求、完美的设计、撰写优雅易读的代码、设计完善的测试平台……都有助于开发优秀的软件。这一主题触及了心流的心理层面,并探讨怎样应用心流产出最佳成果。
到这一步,热情洋溢的导师应该已经为真正有需要的年轻人送上了热情的师友拥抱,但他们的感受可能更多是无意识的。应该让新人深深体会到,他们来这里是要开始一项长久的事业,同时身心得到安宁。
师友拥抱只是个名字。要让活动走上正轨,它需要的是温情和非正式的氛围,而非僵硬的课程形式。我从过往的经验中总结了一些行之有效的技巧:
最后,尽可即兴发挥,让大家留下一个热情的第一印象。
拥抱日只是组织为成员提供的持续服务的开始,这种服务旨在逐渐塑造成员的专业特质。以下要点介绍怎样以服务的形式,基于学员的实际需求和绩效进行持续指导。
好了,以上就是组织实践中开始并持续指导的方法。之后就要面对一些难点了。
事实上,当鼓励人们接受指导时,不管是在开始的活动或之后的会议中,通常遇到的首要问题是“工作时间”。不过我个人经验来看,做好以下措施这就不会是个问题:
人力再造的第一部分:与服务关联的指导与教练,或称 MRaaS 的内容就此结束。在领导层部分可能更多地介绍教练。在这个知识时代,软件开发实践的价值不断增长,我希望能提供相关的个人经验。请时刻记住不要把指导当作是正式的企业培训。它按需实施、花费不大,在职场中更加生动亲切。
Medhat Sabry 是一名软件开发顾问、演讲人和作家,他创建了基于 Web 的 Techstamina,与其他社交媒体和专业网络渠道一起为开发社区发表各种观点。近四十年来,Medhat 一直致力于在软件交付过程的核心领域,对业界发展中出现的挑战保持着良好的关注,这些挑战激发了他的热情,帮助开发人员和公司建立他们的竞争力,以应对今天软件市场日益增长的压力和挑战。
查看英文原文:People Re-Engineering How-To’s: Mentoring As A Service
转自 http://ift.tt/2sp4enD
The post 如何进行人力再造:指导即服务 appeared first on Linuxeden开源社区.
http://ift.tt/2rqrK6f
作者 Abel Avram ,译者 张卫滨
MuleSoft 业已成为 OAI 的成员,并发布了能够同时理解 RAML 和 OAS 的 API 模型框架。Restlet Studio 如今已经支持 RAML。
目前,有三个主要的 HTTP API 规范在竞争:Open API Initiative(OAI)基于 Swagger 所提供的 Open API Specification(OAS)、MuleSoft 作为主要贡献者的 RAML 以及 Apiary 所支持的 API Blueprint,Apiary 公司今年已经被 Oracle 收购。这三个规范都有自己的优点和相关工具,但是在 2015 年 Swagger 托管给 Linux 基金会之后,OAS 获得了社区的主流支持。OAS 从一开始就得到了 3Scale、Apigee、Google、IBM、Microsoft、PayPal 以及其他厂商的支持。
HTTP API 领域在未来将会如何演化尚不明晰,但是最近发生了一些很有意思的事情。其中有一件事就是 MuleSoft 最近宣布 加入 OAI。MuleSoft 的 CTO 同时也是 RAML 的创建者 Uri Sarid 已经开始参与 OAI 技术开发者社区并认为“每个人都应该支持一种通用的格式,它至少要能够描述 API 的 服务模型 ”,这种格式应该是“目前采用最广泛的,即 OpenAPI 规范。”
鉴于 MuleSoft 依然“致力于支持 RAML 倡议及其投资,并且在扩大该生态系统”,我们可以得出结论,Sarid 在 OAI TC 的主要目的是推动 OAS 的开发采纳 RAML 目前已经支持的一些特性:API 建模、支持模块以及分离 API 协议的关注点。至于 OAI TC 会从 RAML 上借鉴多少内容尚有待观察。为此,MuleSoft 已经开源了 API 建模框架 ,这是一种与 API 交互的方式,还包含对 API 的建模,以及随后生成 RAML 或 OAS 文档。实际上,我们可以将 RAML 定义的 API,对其进行解析并生成相应的 OAS 文件。
MuleSoft 的 API 建模框架依然是“alpha”和“实验性”阶段,Restlet 是 OAI 的初始成员之一,最近又加入了 RAML 工作组,发布了新版本的 Studio,能够同时支持 OAS 和 RAML。Restlet 的创始人 Jerome Louvel阐述了 RAML 对 OAS 的影响:
与其让这三种方案进行直接的竞争,我们还是希望其中有一个能够获胜,取代另外的两个,有必要也有可能采用一种更好的演化路径。这个过程中的主要参与者和构建工具,比如 Restlet Studio,同时支持 OAS 和 RAML,并且会倾听用户的需求,我意识到理想状况是让 Apiary 和 MuleSoft 加入 Open API Initiative,并逐渐做出贡献,使其变得收敛,而不一定要将这三个规范合并在一起…
在即将发布的 OAS 3.0 之上,我设想未来的 RAML 释放版本会扩展 OAS 规范,以捕获目前通过 RAML 1.0 表述的 API 建模信息。它将会让 OAS 核心更加简单和专注,同时还能够让 API 建模工具之间实现更好的交互,有助于保护 API 团队在设计之时所做的投资。Restlet 是 OAI 的创始成员,最近又加入了 RAML 工作组,我希望能够直接为这些目标作出贡献。
确实,Apiary 去年加入了 OAI,并且 为他们的工具添加了对 Swagger 的支持 。HTTP API 领域似乎正在围绕 OAS 进行整合。这意味着将来会有一个 API 规范,用户创建互操作的 API 会更加容易。至于 RAML 和 API Blueprint 会对 OAS 带来多大的影响,尚有待观察。
查看英文原文:The HTTP API Space is Consolidating around OAS
The post HTTP API 领域在围绕 OAS 进行整合 appeared first on Linuxeden开源社区.
http://ift.tt/2rqEGZX
2017 年时序数据库忽然火了起来。开年 2 月 Facebook 开源了 beringei 时序数据库;到了 4 月基于 PostgreSQL 打造的时序数据库 TimeScaleDB 也开源了,而早在 2016 年 7 月,百度云在其天工物联网平台上发布了国内首个多租户的分布式时序数据库产品 TSDB,成为支持其发展制造,交通,能源,智慧城市等产业领域的核心产品,同时也成为百度战略发展产业物联网的标志性事件。时序数据库作为物联网方向一个非常重要的服务,业界的频频发声,正说明各家企业已经迫不及待的拥抱物联网时代的到来。
本文会从时序数据库的基本概念、使用场景、解决的问题一一展开,最后会从如何解决时序数据存储这一技术问题入手进行深入分析。
百度无人车在运行时需要监控各种状态,包括坐标,速度,方向,温度,湿度等等,并且需要把每时每刻监控的数据记录下来,用来做大数据分析。每辆车每天就会采集将近 8T 的数据。如果只是存储下来不查询也还好(虽然已经是不小的成本),但如果需要快速查询“今天下午两点在后厂村路,速度超过 60km/h 的无人车有哪些”这样的多纬度分组聚合查询,那么时序数据库会是一个很好的选择。
先来介绍什么是时序数据。时序数据是基于时间的一系列的数据。在有时间的坐标中将这些数据点连成线,往过去看可以做成多纬度报表,揭示其趋势性、规律性、异常性;往未来看可以做大数据分析,机器学习,实现预测和预警。
时序数据库就是存放时序数据的数据库,并且需要支持时序数据的快速写入、持久化、多纬度的聚合查询等基本功能。
对比传统数据库仅仅记录了数据的当前值,时序数据库则记录了所有的历史数据。同时时序数据的查询也总是会带上时间作为过滤条件。
时序数据示例
p1- 北上广三地 2015 年气温变化图
p2- 北上广三地当前温度实时展现
下面介绍下时序数据库的一些基本概念(不同的时序数据库称呼略有不同)。
metric: 度量,相当于关系型数据库中的 table。
data point: 数据点,相当于关系型数据库中的 row。
timestamp:时间戳,代表数据点产生的时间。
field: 度量下的不同字段。比如位置这个度量具有经度和纬度两个 field。一般情况下存放的是会随着时间戳的变化而变化的数据。
tag: 标签,或者附加信息。一般存放的是并不随着时间戳变化的属性信息。timestamp 加上所有的 tags 可以认为是 table 的 primary key。
如下图,度量为 Wind,每一个数据点都具有一个 timestamp,两个 field:direction 和 speed,两个 tag:sensor、city。它的第一行和第三行,存放的都是 sensor 号码为 95D8-7913 的设备,属性城市是上海。随着时间的变化,风向和风速都发生了改变,风向从 23.4 变成 23.2;而风速从 3.4 变成了 3.3。
p3- 时序数据库基本概念图
所有有时序数据产生,并且需要展现其历史趋势、周期规律、异常性的,进一步对未来做出预测分析的,都是时序数据库适合的场景。
在工业物联网环境监控方向,百度天工的客户就遇到了这么一个难题,由于工业上面的要求,需要将工况数据存储起来。客户每个厂区具有 20000 个监测点,500 毫秒一个采集周期,一共 20 个厂区。这样算起来一年将产生惊人的 26 万亿个数据点。假设每个点 50Byte,数据总量将达 1P(如果每台服务器 10T 的硬盘,那么总共需要 100 多台服务器)。这些数据不只是要实时生成,写入存储;还要支持快速查询,做可视化的展示,帮助管理者分析决策;并且也能够用来做大数据分析,发现深层次的问题,帮助企业节能减排,增加效益。最终客户采用了百度天工的时序数据库方案,帮助他解决了难题。
在互联网场景中,也有大量的时序数据产生。百度内部有大量服务使用天工物联网平台的时序数据库。举个例子,百度内部服务为了保障用户的使用体验,将用户的每次网络卡顿、网络延迟都会记录到百度天工的时序数据库。由时序数据库直接生成报表以供技术产品做分析,尽早的发现、解决问题,保证用户的使用体验。
很多人可能认为在传统关系型数据库上加上时间戳一列就能作为时序数据库。数据量少的时候确实也没问题,但少量数据是展现的纬度有限,细节少,可置信低,更加不能用来做大数据分析。很明显时序数据库是为了解决海量数据场景而设计的。
可以看到时序数据库需要解决以下几个问题
这些问题不是用一篇文章就能涵盖的,同时每个问题都可以从多个角度去优化解决。在这里只从数据存储这个角度来尝试回答如何解决大数据量的写入和读取。
数据的存储可以分为两个问题,单机上存储和分布式存储。
如果只是存储起来,直接写成日志就行。但因为后续还要快速的查询,所以需要考虑存储的结构。
传统数据库存储采用的都是 B tree,这是由于其在查询和顺序插入时有利于减少寻道次数的组织形式。我们知道磁盘寻道时间是非常慢的,一般在 10ms 左右。磁盘的随机读写慢就慢在寻道上面。对于随机写入 B tree 会消耗大量的时间在磁盘寻道上,导致速度很慢。我们知道 SSD 具有更快的寻道时间,但并没有从根本上解决这个问题。
对于 90% 以上场景都是写入的时序数据库,B tree 很明显是不合适的。
业界主流都是采用 LSM tree 替换 B tree,比如 Hbase, Cassandra 等 nosql 中。这里我们详细介绍一下。
LSM tree 包括内存里的数据结构和磁盘上的文件两部分。分别对应 Hbase 里的 MemStore 和 HLog;对应 Cassandra 里的 MemTable 和 sstable。
LSM tree 操作流程如下:
p4-Hbase LSM tree 结构介绍(注 1)
可以看到 LSM tree 核心思想就是通过内存写和后续磁盘的顺序写入获得更高的写入性能,避免了随机写入。但同时也牺牲了读取性能,因为同一个 key 的值可能存在于多个 HFile 中。为了获取更好的读取性能,可以通过 bloom filter 和 compaction 得到,这里限于篇幅就不详细展开。
时序数据库面向的是海量数据的写入存储读取,单机是无法解决问题的。所以需要采用多机存储,也就是分布式存储。
分布式存储首先要考虑的是如何将数据分布到多台机器上面,也就是 分片(sharding)问题。下面我们就时序数据库分片问题展开介绍。分片问题由分片方法的选择和分片的设计组成。
时序数据库的分片方法和其他分布式系统是相通的。
哈希分片 :这种方法实现简单,均衡性较好,但是集群不易扩展。
一致性哈希 :这种方案均衡性好,集群扩展容易,只是实现复杂。代表有 Amazon 的 DynamoDB 和开源的 Cassandra。
范围划分 :通常配合全局有序,复杂度在于合并和分裂。代表有 Hbase。
分片设计简单来说就是以什么做分片,这是非常有技巧的,会直接影响写入读取的性能。
结合时序数据库的特点,根据 metric+tags 分片是比较好的一种方式,因为往往会按照一个时间范围查询,这样相同 metric 和 tags 的数据会分配到一台机器上连续存放,顺序的磁盘读取是很快的。再结合上面讲到的单机存储内容,可以做到快速查询。
进一步我们考虑时序数据时间范围很长的情况,需要根据时间范围再将分成几段,分别存储到不同的机器上,这样对于大范围时序数据就可以支持并发查询,优化查询速度。
如下图,第一行和第三行都是同样的 tag(sensor=95D8-7913;city= 上海),所以分配到同样的分片,而第五行虽然也是同样的 tag,但是根据时间范围再分段,被分到了不同的分片。第二、四、六行属于同样的 tag(sensor=F3CC-20F3;city= 北京)也是一样的道理。
p5- 时序数据分片说明
下面我以一批开源时序数据库作为说明。
非常优秀的时序数据库,但只有单机版是免费开源的,集群版本是要收费的。从单机版本中可以一窥其存储方案:在单机上 InfluxDB 采取类似于 LSM tree 的存储结构 TSM;而分片的方案 InfluxDB 先通过+(事实上还要加上 retentionPolicy)确定 ShardGroup,再通过+的 hash code 确定到具体的 Shard。
这里 timestamp 默认情况下是 7 天对齐,也就是说 7 天的时序数据会在一个 Shard 中。
p6-Influxdb TSM 结构图(注 2)
底层使用 Cassandra 作为分布式存储引擎,如上文提到单机上采用的是 LSM tree。
Cassandra 有两级索引:partition key 和 clustering key。其中 partition key 是其分片 ID,使用的是一致性哈希;而 clustering key 在一个 partition key 中保证有序。
Kairosdb 利用 Cassandra 的特性,将++< 数据类型>+作为 partition key,数据点时间在 timestamp 上的偏移作为 clustering key,其有序性方便做基于时间范围的查询。
partition key 中的 timestamp 是 3 周对齐的,也就是说 21 天的时序数据会在一个 clustering key 下。3 周的毫秒数是 18 亿正好小于 Cassandra 每行列数 20 亿的限制。
底层使用 Hbase 作为其分布式存储引擎,采用的也是 LSM tree。
Hbase 采用范围划分的分片方式。使用 row key 做分片,保证其全局有序。每个 row key 下可以有多个 column family。每个 column family 下可以有多个 column。
上图是 OpenTsdb 的 row key 组织方式。不同于别的时序数据库,由于 Hbase 的 row key 全局有序,所以增加了可选的 salt 以达到更好的数据分布,避免热点产生。再由与 timestamp 间的偏移和数据类型组成 column qualifier。
他的 timestamp 是小时对齐的,也就是说一个 row key 下最多存储一个小时的数据。并且需要将构成 row key 的 metric 和 tags 都转成对应的 uid 来减少存储空间,避免 Hfile 索引太大。下图是真实的 row key 示例。
p7-open tsdb 的 row key 示例(注 3)
可以看到各分布式时序数据库虽然存储方案都略有不同,但本质上是一致的,由于时序数据写多读少的场景,在单机上采用更加适合大吞吐量写入的单机存储结构,而在分布式方案上根据时序数据的特点来精心设计,目标就是设计的分片方案能方便时序数据的写入和读取,同时使数据分布更加均匀,尽量避免热点的产生。
数据存储是时序数据库设计中很小的一块内容,但也能管中窥豹,看到时序数据库从设计之初就要考虑时序数据的特点。后续我们会从其他的角度进行讨论。
转自 http://ift.tt/2sp22fD
The post 时序数据库深入浅出之存储篇 appeared first on Linuxeden开源社区.
http://ift.tt/2rqXHLF
架构师的成长之路是怎样的呢,请看看五年陈架构师写的感悟吧。
写给五年陈的自己
写周报,写的兴起,编写周报,还边用虎跑泉,泡铁观音喝。自己写周报的**惯还是要改一改,自己是个性情中人,写个周报也透露了太多情感在周报里。有很多人肯定觉得不好,也许以后我也会改,改的越来越干练,掏心的话少说。
兴奋了,喝了茶,睡不着了。灵感闪动,本周是个值得纪念的日子,写个文章纪念下过去。
回想这一路路走来,还是很感恩收获的一切,我渐渐从一名菜鸟,成长为一位架构师,记得毕业的时候我给自己定的目标是:五年要成为一方面的专家。虽然,实际的成长比这个慢了两年,但是我还是庆幸自己当初果断的裸辞,然后进入支付宝。
每个架构师都是独立无二的,每个架构师都应该有自己的情怀,这些情怀是你的世界观。
我是如何成长为一个架构师的,我姑且给自己定的 title 就是架构师,不要认为有架构师的 title 就很牛 B 的,人外有人,天外有天,做好自己。五年陈留给自己的话:不忘初心,方得始终,未来已来,星辰大海。路就在前方,继续前行。
每个人的成长之路也不一样,我来回想下自己的。
不为过去蹉跎,珍惜当下
很多在菜鸟的时候,肯定或多或少,有过对身边的牛人,报以羡慕的眼光。
当看着别人职位比你高,
当看着别人比你工资领的高,
当看到别人年纪轻轻,就已经是牛逼哄哄。
你会不会有羡慕嫉妒恨的想法:
要是我当年读书的时候,不打游戏,少吃点红瓶、蓝瓶,少放几个水元素,少放几个暴风之锤(寒冰王座)。那么我肯定可以学到更多。
要是我当年不睡懒觉,起早贪黑,去学**,那么我肯定是也会学到很多。
要是。。。
理由从来不嫌多,我自己肯定也有这些想法,平心而论,我现在也有这些想法。但是负能量不能盖过正能量。
不要为过去而蹉跎;不要羡慕别人现在的生活;不要羡慕陈冠希,长得帅,女朋友交的多。你明明没有别人找的帅,不努力,你就是天天守着电脑看看片。说不定那天你去创个业,成功了,然后的然后,你想想然后的然后。。。
所以,不为过去蹉跎,活在当下,把握当下。
找到你的追求,然后就去追求
首先,我这里没有使用信念。信念,可能太重了。尤其对于中国人而言,信仰普遍都是缺失的,很难一直相信、坚信一件事。
第二,很多人,不知道自己想要什么,想去追求什么。所以一直不知道,该怎么去改变,该怎么去追求。
我是为了追求钱?
其实我不追求钱,当然我不是圣人,我家里不富裕,就是从农村出来的,我结婚的时候没有自己的房子(谢谢妻子),我还有很多东西没有买。我需要钱,但是不是为了钱而工作,工作这么多年,没有询问过加薪,没有为了加薪而跳槽(当然现在的公司对我们还是很不错)。
钱,对于我而言,就是想买个安心。我用它来让父母对我的未来安心;让妻子对于未来充满信心(虽然她现在还不算很安心);让整个家庭有一定的风险抵抗能力。
安心以后,就是上路。
我记得第一段工作,是在恒生。我当时在恒生银行事业部,工作一年后,我发现自己进步很慢,在技术体系没有任何进展,公司的技术体系很旧,而且基本不进化。我自己做了一个技术的演进,使用了一种新的方式提升了平台的整体能力(当年还没有平台能力这些体系思路)。然后还期待年底被表彰下,技术人也是虚荣的,呵呵,就是期望可以带来成就感。
做着做着,发现没有人可以帮助我提升,虽然当时我很弱,我的学**思路也不清晰。平时就是逛逛网站,学**的很肤浅。但是,我内心感受到:如果要是这样待下去,肯定废了,几年之后,还是同样的眼光羡慕别人。
于是在工作一年半的时候,选着了裸辞,其实还是很佩服自己,因为多数人都是骑驴找马。多数时候是招聘 3、5、8 年经验的人。但是,当你顾虑越多的时候,越容易失败。
所以,找到你的追求,然后就去追去。
失败不可怕,需要对自己、未来充满信心
当时的我真的很弱,但是我就是想找个地方提升自己的技术,提升自己的价值。
刚好有个朋友是阿里 B2B 的,当时也没有太多关注阿里,也不知道阿里到底有哪些子公司。但是,我的朋友,热心的说:“要不要我帮你内推试试?”,我就是抱着试一试的心态,想去尝试下,知道阿里的技术强,但是到不到阿里的要求。
于是开启了我奇葩的入职阿里经历。
第一次面试,阿里 B2B 的岗位,就有很多知识不知道,面试官问了一致性 hash,那个年代的我,哪里知道。不过面试官还是和我聊了一个小时。但是我的水平有限,结果可想而知。我肯定也知道没过,然后我就请教面试官,需要提升的地方,学**哪方面的内容。
于是我去学**,一个月过去了。
第二次面试,也是阿里 B2B 的岗位,我不知道那个时候有没有招聘的公海,按照我的理解是没有的,然后我肯定不会有这么多次机会。这次的面试和上次很像,只不过内容换成了多线程并发相关的知识。我又不知道,面试官还是很容忍我,最后没通过,我同样为了需要什么提高。
于是我去学**,一个月又过去了。
第三次面试,是淘宝,应该是广告部门。这次面试,我觉得除了不知道的内容,其他的内容都还回答的蛮正确的。但是面试官,拿着面试题就和我聊了,然后讲到一个数据库方面的知识时(内连接,外连接),我说不知道。面试官说:这么基础的问题你都不会,这是不能容忍的,其实当时很伤心。有可能他们对数据库要求很高吧。但是,我耿耿于怀的是:每个人也许都有些盲点,也许不能以这些盲点去评判一个人。而且,可能还有更好的方式,如何去指一个方向,让被人对你感激,感恩。我这些年也参加了些面试,面对一些面试者,即使不通过,我也会善意的去提示下。
于是我又回去了,学了些啥,我不知道了。
第四次面试,是支付宝。当时是一个女的领我进门的,我以为是 HR,两个人坐着有点尴尬,然后这个“HR”就开始问问题,你讲下 spring 吧。然后我内心当时就震惊了:都知道阿里技术好,但是 HR 都会技术,太夸张了吧。面试过程还好,我讲了在第一个公司做的一个技术创新。
第一轮通过了,好激动,第一次过第一轮。
而后,马上第二轮,进来个光头,光头看了下面试题,然后就问了一个技术问题:” 什么是架构”,虽然当时听过架构,但是按照我当时的理解,说不清这个概念,我现在也不一定说清这个概念。第二个问题就是:你愿意做外包么?我回答不愿意。
最后女 HR 和光头说,你等一等,我们合计合计。合计的结果就是,我进来了,进来的不容易。可能还多亏当年扩招。现在我们面试的时候,我们也经常说:要是按照现在的面试要求,那么我肯定进不来。
这就是一段比较有意思的经历,当我妻子比较犹豫的时候,经常对妻子讲:日子总是越来越好。我的经历也可以看出很多。
所以,失败不可怕,需要最自己、未来充满信息。努力去学**。
脚踏实地,如饥似渴,积少成多
于是进入了支付宝,支付宝好复杂。有很多东西给我学。
光头老大给有次问我:你的学**计划是什么呢?
我说:我要把支付宝的所有框架,业务都学**一遍(真不知天高地厚)
老大说:你学的完吗?
我说:我看了下确实很多,有 100 多个系统,很多业务概念。
老大说:不要好高骛远,我建议你结合当前的工作,一步步学**,以点带面。
刚进公司的时候,我不是很有自信,因为知道自己技术可能比很多大牛差距很大。同时,自己也是一个不太会表达的人(原来的老大也说过,我的软能力不行),整体上在初期感觉相对较闷。
日常工作就会把自己占得很满,怎么去学**?我的技术不行,就想去学代码,框架,支付宝的代码全部是开源的,所以我可以很简单通过 eclipse 直接查看框架的源码,渐渐的,比很多人都了解框架,了解技术。我还会去狂公司的论坛,公司的 doc,这上面有框架设计相关的内容。所以,很多时候机会是很多的,关键是你想不想去去。
所以,不要好高骛远,脚踏实地,时刻保持饥饿感,积少成多。
开放心态,视野决定格局
12 年妻子怀孕,于是转岗回了成都,成都是个远离核心的待发展的技术部,当时人就 20,30 号人吧。
回去后,由于原来是在杭州负责核心 A1 系统,大家都还挺羡慕,都还挺给面子的。所以,变得越来越自信。
当你自信后,同样你会越来越勇敢,越来越开放。当时,也看了些敏捷的书,虽然从来没有完整的看完一本敏捷的书,现在我对敏捷也是半懂不懂,依然很讨厌职业的咨询师,喊喊口号,比如 TDD,说实话,我就很难看到 TDD 的模式,在如此复杂的业务系统成功过。
当时对于敏捷最深刻的一点就是:反馈环。怎么去利用反馈坏不断是提升自己,自己缩短反馈坏,让自己成长的更快。
回成都后,我变得更为开放,这种开放,让我收获更多,在交流,不断的学**中,成长更快。从一个基本是完成任务型的技术人员,渐渐去思考更全局,更开放性的内容。
成都远离核心,生存不易,这些经历同样丰富了我,内心也变得越来越强大。这些年影响我最大的一些思想有:
1、不要给自己设限:不在把自己禁锢在舒适区,不要怕前面有挡着你的人
2、缩小自己的反馈环:
3、不断以小的正能量,不断积累成就感。
4、不要怕做决定:错误的决定,比没有决定好。
渐渐地,我从不说的人,变成了比较能说的人,能说可能还不是会说。会说更考验技巧,情商。
渐渐地,周围的人又说我是段子手。
渐渐地,变成了一个经常黑人的人。哈哈。
不断去思考,总结,提炼做事模式,思考方式,这些方式可以指导你持续成功。
视野,越大,收获越多,站在全局去看问题,这也是一个架构师需要的。
所以,保持开放心态,视野决定格局,格局改变命运。
写在最后
如果大家能看到最后,首先谢谢。
有的人要骂:标题就是唬人的,一点都没有讲技术。
架构无处不在,你怎么架构自己的未来。
感谢这些年帮助我的人。
稿源: 技术之家
The post 一位五年工作经验架构师的感悟 appeared first on Linuxeden开源社区.
http://ift.tt/2sfN7VJ
Ant Design 2.10.3 和 2.10.4 已发布,Ant Design 是蚂蚁金服开发和正在使用的一套企业级的 UI 设计语言和 React 实现。
本次更新如下:
下载地址
rc-util 依赖。#6310 @bkniffleres 版本的语法错误。#6310下载地址
转自 http://ift.tt/2sfnGUn
The post Ant Design 2.10.3 和 2.10.4,阿里企业级 UI 设计语言 appeared first on Linuxeden开源社区.
http://ift.tt/2rGeBXC
Bodhi Linux 4.2.0 发布了,新版本是 Bodhi Linux 的一个小更新版本,使用 4.1.0 的用户不需要通过新的安装介质进行升级。
4.2.0 中的重要变化之一是放弃支持 32 位 PAE 的安装介质。
较旧的 32 位计算机仍然被 Bodhi 的 Legacy 版本支持。
这是放弃 32 位 PAE 光盘的第一个版本,要注意的是,官方仍然支持 32 位计算机,但如果需要安装 32 位版本的 Bodhi Linux,唯一的版本是 Legacy ISO 镜像。Legacy 镜像将适用于 PAE 和 非 PAE 的 32 位硬件,如果您的计算机需要 PAE 内核来利用其所有内存,您最好使用 64 位操作系统。如果确实需要在 32 位的 Bodhi 操作系统中使用 PAE 内核,可以安装 Legacy 版本,然后再更改内核。
发布公告 有更多的细节。
转自 http://ift.tt/2qBYxWU
The post Bodhi Linux 4.2.0 发布,基于 Ubuntu 的发行 appeared first on Linuxeden开源社区.
http://ift.tt/2rlPUwR
RubyMine 2017.2 EAP 2 (build) 现在发布。在之前的 EAP 中,您可能已经注意到了为 XML 和 HTML 面包屑所做的新设计。这个更新还为 Ruby 中的结构元素带来了面包屑功能:
要打开面包屑,只需右键单击编辑器左侧(或底部)的窗格,选择“Breadcrumbs”,然后将其附加到编辑器的顶部或底部。您还可以使用 Go to 操作来切换面包屑,或者在设置(Preferences / Settings | Editor | General |Breadcrumbs)中找到它。
当前的实现可显示以下结构元素:
对于其他改进,此更新还修复了以前的 EAP 构建中发现的一些小问题。
有关改进的完整列表,请参阅 发行说明 。
转自 http://ift.tt/2qCgBQM
The post RubyMine 2017.2 EAP 2:Ruby 的面包屑功能 appeared first on Linuxeden开源社区.
http://ift.tt/2rm5AjI
DBeaver 4.0.8 发布了,本次更新值得关注的是在 MySQL 中,添加了对 JSON 数据类型的支持。
更新列表如下:
下载地址:
转自 http://ift.tt/2rm9YiJ
The post DBeaver 4.0.8 发布,数据库管理工具 appeared first on Linuxeden开源社区.
http://ift.tt/2qCqaPu
Framework7 v1.6.3 和 v1.6.4 发布了,Framework7 是免费开源的 HTML 移动端框架,用来开发混合移动端应用或者 iOS 7 的 Web 应用,并且带有 iOS 7 的原生外观和感觉。Framework7 也是独立的原型应用工具。
更新如下:
Framework7 v1.6.4 – Updated on May 31, 2017
Framework7 v1.6.3 – Updated on May 30, 2017
click blur focus focusin focusout keyup keydown keypress submit change mousedown mousemove mouseup mouseenter mouseleave mouseout mouseover touchstart touchend touchmove resize scroll下载地址
1.6.4
1.6.3
转自 http://ift.tt/2rlEKb7
The post Framework7 v1.6.3 和 v1.6.4 发布,HTML 移动端框架 appeared first on Linuxeden开源社区.
http://ift.tt/2qCpObF
Ember.js 2.13.3 发布了,Ember.js 是一个用于创建 web 应用的 JavaScript MVC 框架,采用基于字符串的 Handlebars 模板,支持双向绑定、观察者模式、计算属性(依赖其他属性动态变化)、自动更新模板、路由控制、状态机等。
本次更新内容如下:
2.13.3 (May 31, 2017)
下载地址
转自 http://ift.tt/2rlRjmQ
The post Ember.js 2.13.3 发布,JavaScript MVC 框架 appeared first on Linuxeden开源社区.
http://ift.tt/2qCpNED
WPS Office for Linux 项目中止 计划开源 Linux 代码
The post 每日文章精选 2017 05 31 appeared first on Linuxeden开源社区.
http://ift.tt/2se07eO