华为合作K-V存储系统项目纪实(1)

本来觉得这个博客应该只关注于web技术,只讨论些wordpress,各种前端技术,乃至互联网公司发展方式的问题。但转念想来此博客关注度又不高,便违背SEO专注的精神也不会有啥流量损失。何况一个人还是把技术问题分在几个博客说也未免太夸张,这个博客既然是技术博客,自然应该什么技术问题都可以在这里畅所欲言。

于是决定把自己种种技术相关的文章都搬迁到这里,以丰富这个站点的内容,而关键的是要开始记录自己至今参加的第一个需要编码的多人合作项目历程。希望能够坚持每周写一篇,把从需求到设计到最后编码遇到的种种问题与思考都记录下来。

项目组由一个博士,一个准博士,包括本人在内的三个硕士组成。准博士算是项目负责人,但是具体经验不足,还是需要博士进行辅助。发过来的项目要求只有简单几句,概括说来就是实现一个key-value存储系统,key为两种定长,value只有8字节整数。总规模可以达到20亿条记录,10次找key只准1次io,最多利用总数据量5%的缓存。

这要求很是古怪,目前kv存储系统设计都会大量利用内存来做缓存,甚至很多都是所谓“内存数据库”。这里却对内存使用要求如此严格,但又要达到寻找key时90%的命中率,简直是不可能完成的任务。而且对性能还没有提成明确要求,已经可想见最终要求之苛刻。

调研从系统与测试方面进行,选择了最简单的hashdb与同样以节约内存闻名的tokyo cabinet,hashdb不到500行代码,自然只是大概学习一下。而就资料来看tokyo cabinet也只是面对千万级别的设计,在到达上亿数据时性能会急剧下降。

而后发现使用在工业环境的tokyo cabinet其实现居然如此简单,而且只能将数据存在一个文件中,很明显限制了最大存储的数据量,这彻底颠覆了本人对其的印象。测试下来自然性能也没传说中的那么牛,而且明显到达上亿级别测试结果不会好,一时全组陷入沮丧当中。

后来再多方考察使用TC做后端存储的flare等设计思路,才突然想到不应该将TC看成一个完整的系统,而应该视为一个最底层的存储引擎。这个引擎足够简单,但是足够好用,你可以在上面开发更多东西。一个文件并非对应一个TC数据库管理系统,而是只对应一个数据库,甚至一个表,比如可以将20亿数据拆分成几个TC数据库来存,这样就能存储在多个文件中(就是说DBA还得弄分片分表,TC使用类似innobase的file_per_table设置),也就可以扩展最大存储数据量了。当然性能如何,能否满足本项目苛刻的要求又是另一个话题,但是工业环境下是可以这样使用TC的。所以工业环境下使用软件不应该被限制住思维,一个不够,多搞几个,完成任务就行。

回到项目上,显然TC的hash引擎设计使用mmap来进行性能优化不适合本项目,再看B+树引擎设计也同一般B+树类似,没看出特色来,所以架构设计方面仍然是一筹莫展,只期待下周的需求讨论华为方能够更明确设计目的与要求。老师自然不满意这种简单的设计,要求我们看看更先进的系统,但是能用的kv系统真的不多,Berkerly DB算是最大而全的吧,可以了解一下架构设计,但对项目感觉帮助不大。

说到需求讨论,本人准备了各种问题,从系统基于的设备到可靠性与可扩展性要求乃至是否并发访问,结果博士来了句“问这些不相关的干什么,其实对方真正只是要一个能够管理大数据量而同时节省内存的算法而已”,仔细一看发过来的需求,还真是如此。所以项目需求最需要明确的是这个系统是用来干什么的,如果是一个为了算法测试用的原型系统,考虑那么多工程问题干什么呢?也许是本人太想鼓捣个工业环境用的系统玩玩了吧,以致忽略了对方提出项目的真实目的。所以需求明确是最必要的,而问出系统使用验收的环境是更关键的。

创造和沟通的合作博弈——《敏捷软件开发》书摘

最近读完敏捷著作中的经典《敏捷软件开发》,原名是Agile Software Development,感觉和以前看的有关软件工程的书都有些不同。这本书充分体现作者真正将软件开发过程管理视为一种可工程化的技术,书中的严谨与幽默,与国内要么千篇一律没有个人思考,要么完全是个人感悟无法形成理论依据,有质的区别。作者的认真严谨确实给我留下挺深的印象。这已不仅仅是思考,而是不断的完善,是一种希望最终形成体系的努力。

这里摘出整本书中个人感觉有道理的段落,也做些个人感悟,留待以后观用。

第0章
沟通的成功依赖于发送者和接受者有可以引用的共享体验(shared experience)
项目的任务不是努力达到完全的沟通,而是管理我们沟通的不完全性
三个层次——following,detaching,fluent
:书中最有趣的部分就是:那么,明天我做什么

第1章 创造和沟通的合作博弈
1.1 软件与诗歌:很贴切的比喻
想象一下,把50个人聚在一起,在有限的成本与时间内编写2万行的叙事诗
1.2软件是创造和沟通的合作博弈。
沟通的效果比沟通的形式更重要
模型就像任何一种沟通一样,只要它能使下一个人继续他的工作,这个模型就足够了。
应当对团队的工作产品进行度量的是它们在向目标组传达信息方面的充足性。
1.3
合作博弈的原则
软件开发是一个(有资源限制的)创造和沟通的合作博弈。博弈的首要目标是交付有用的,可工作的软件。次要目标,即博弈的沉淀,是为下一轮博弈做好准备。下一轮博弈可能更改或替换系统,也可能是创建一个相关的系统。
1.3.1
程序员只喜欢交流那些他们喜欢交流的事情。
在软件开发的课程表中,大学应该增加一些包含沟通密集(communication-intensive)课程。
1.3.3标志物与道具
中间工作产品成为我们用于反思的提醒物。他们提供了共享体验,以此来指向或者作为新想法的支持结构。
1.3.5
对于中间工作产品,需要进行的度量只有充分度(sufficiency):它是否足以提醒相关的小组或足以激发相关小组的灵感。
1.4这对我意味着什么
观察:
设计团队的人如何构建他们的理论
进行最后调试或程序维护的人如何构建他们的理论
与前者相比较,后者的可用信息的不同
他们不同的理论如何在产生的程序中导致不同
你如何理解你的问题随着时间的变化而发生的变化,这些变化又是如何改变你对于所要构建的解决方案的理解的
察看你的项目,然后提问:
参与这一博弈的都有谁?
哪些人在进行有限的,追求目标的团队博弈
哪些人反而在进行他们自己的无限博弈
你的团队伙伴在什么时候一起创造,以及他们在什么时候留下一些踪迹好让其他人知道他们进行到了哪一步?连续五个工作日仔细观察这些事,注意他们如何一步一步进行。
把项目决策看作是博弈中的步骤。把它想象成一种不同的博弈,穿越沼泽:
回忆一下项目的准备活动,它们就像一个对沼泽发起进攻的初始计划一样。当出现了关于这片沼泽的特点和团队的能力的新信息时,计划就要改变。
观察每个人的贡献:探查更深或更安全的点,为了让其他人能穿越沼泽而制作地图或开辟道路。

本站总访问量