﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>C++博客-oldworm-随笔分类-云计算</title><link>http://www.cppblog.com/oldworm/category/15070.html</link><description /><language>zh-cn</language><lastBuildDate>Fri, 21 Jan 2011 11:28:51 GMT</lastBuildDate><pubDate>Fri, 21 Jan 2011 11:28:51 GMT</pubDate><ttl>60</ttl><item><title>关于内存数据库</title><link>http://www.cppblog.com/oldworm/archive/2011/01/21/139015.html</link><dc:creator>袁斌</dc:creator><author>袁斌</author><pubDate>Fri, 21 Jan 2011 05:37:00 GMT</pubDate><guid>http://www.cppblog.com/oldworm/archive/2011/01/21/139015.html</guid><wfw:comment>http://www.cppblog.com/oldworm/comments/139015.html</wfw:comment><comments>http://www.cppblog.com/oldworm/archive/2011/01/21/139015.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.cppblog.com/oldworm/comments/commentRss/139015.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/oldworm/services/trackbacks/139015.html</trackback:ping><description><![CDATA[&nbsp;
<p><span>关于内存数据库</span></p>
<p>&nbsp;</p>
<p><span>最近要将一些数据放到内存里面做很高的并发操作，考虑了很多方案，</span></p>
<p><span><span>1、&nbsp;</span></span><span>简单点使用</span><span>map hash_map</span><span>等自己管理。</span></p>
<p><span><span>2、&nbsp;</span></span><span>用</span><span>sqlite</span><span>内存表。</span></p>
<p><span><span>3、&nbsp;</span></span><span>用</span><span>fastdb</span><span>内存数据库。</span></p>
<p><span><span>4、&nbsp;</span></span><span>用</span><span>ExtremeDb</span><span>，</span><span>TimesTen</span><span>等。</span></p>
<p><span>比较测试了一下</span><span>123</span><span>，发现还是自己实现速度最快，比</span><span>fastdb</span><span>模式快</span><span>3-5</span><span>倍，</span><span>fastdb</span><span>模式比</span><span>sqlite</span><span>内存表模式快</span><span>10</span><span>倍左右，由于自己实现不具有典型通用性，多线程下访问效率会下降，要管理多线程下各种更新查找等还是比较麻烦的，所以在</span><span>1</span><span>和</span><span>3</span><span>方案之间纠结。</span></p>
<p><span>为了使得决策更好一些，暂时还没做决定，顺便到万方等上面搜索了一些论文来看，看来看去看得真来气啊，虽然都叫内存数据库但各种实现的都有，有用</span><span>gdbm</span><span>来做的，有直接</span><span>map</span><span>管理的，有</span><span>hash</span><span>管理数据的，有</span><span>t</span><span>树管理的，有数组队列管理的，有的明显就是个不大变的东西还弄个啥事务的，靠，刚刚居然还看到一篇鸟文《电网监控系统实时数据库的设计与实现》里面的测试居然是</span><span>1000</span><span>条，插入时间</span><span>80</span><span>毫秒，真可笑啊，区区这么点数据也好意思测，还要花</span><span>80</span><span>毫秒，还自以为很快，这个速度至少可提高</span><span>1000</span><span>倍以上啊，这帮垃圾，写的啥鸟文章，研究个屁啊。</span></p>
<p><span>看完这十来篇论文，俺的思绪又回到</span><span>1999</span><span>年，当年我给别人优化过一个电信计费的软件（看的论文里面有好几篇讲电信计费的），当时有个朋友的朋友拿了个需求过来，</span><span>7000</span><span>万条记录，原来计算费单要花十几个小时吧，我帮他改了下，十来分钟就算完了，朋友很满意，当时的做法很简单，就是弄了个</span><span>mmtable</span><span>，大体就是跟</span><span>map</span><span>类似的东西吧，那个时候</span><span>map</span><span>还没流行起来，俺也不知道，所以就自己弄了个内存表，内部基本就是二分查找了，那个时候我对</span><span>hash</span><span>都不大熟悉，</span><span>B</span><span>树之类的算法刚接触也不会用，就这么个东西当时的电脑也只要花十来分钟，我估计就算是那个老程序放在现在的普通台式机上要不了几秒钟就可算完。也不知道这么几千万条记录的小需求怎么在这帮人眼里就成了什么海量数据，对俺来说跟玩似的，区区几千万嘛，不过是俺拿来测试用的。</span></p>
<p><span>去年中做了个</span><span>md5 hash</span><span>反查的东西，数据都是几百亿到几万亿的，后来的效果就是一个文件可存万亿记录，一次查询平均</span><span>1.2</span><span>次</span><span>IO</span><span>，即使全放在</span><span>SATA</span><span>磁盘上也就十来毫秒而已。</span></p>
<p><span>区区几千万条记录咋就叫什么海量数据呢，海量个毛啊，内存都放得下的叫什么海量，现在服务器动不动都是几十</span><span>G</span><span>内存，区区千万根本算不上什么，查询定位都可到微妙了，</span><span>1</span><span>秒插入至少千万条了，居然还看到</span><span>1000</span><span>条插入的测试，真是不得不佩服国内这帮垃圾研究生的水平，也不知道这种论文咋就能通过审查，只能得出结论他们的老师也都是猪。</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span>骂归骂自己的问题还需要继续努力，对咱目前的需求来说自己管理数据，即使一个线程都搞得定，因为不过区区几个表，几十万条记录而已，不过这种</span><span>10</span><span>年前咱就会的技术还真是拿不出手，怎么的也得做得更好一点，呵呵，继续研究吧，多线程下内存数据库，从概念上看的确是个很有吸引力的东西，要是性能跟得上，其实在很多地方可以取代普通的数据结构用法了，可以大大减少编程难度，甚至我在想如果有个支持事务的内存数据库，之前设计的</span><span>cad</span><span>类软件的</span><span>undo/redo</span><span>都可以用事务来实现，完全可以抛弃先前设计的复杂结构，其实这种东西即使不用内存数据库就算是用个</span><span>sqlite</span><span>都完全能搞定，唉，往事不堪回首啊，看来数据库方面的确得多花功夫，特别是多线程和分布式模式下的内存数据库。</span></p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<img src ="http://www.cppblog.com/oldworm/aggbug/139015.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/oldworm/" target="_blank">袁斌</a> 2011-01-21 13:37 <a href="http://www.cppblog.com/oldworm/archive/2011/01/21/139015.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>实用云计算环境简述</title><link>http://www.cppblog.com/oldworm/archive/2010/10/03/128471.html</link><dc:creator>袁斌</dc:creator><author>袁斌</author><pubDate>Sun, 03 Oct 2010 06:23:00 GMT</pubDate><guid>http://www.cppblog.com/oldworm/archive/2010/10/03/128471.html</guid><wfw:comment>http://www.cppblog.com/oldworm/comments/128471.html</wfw:comment><comments>http://www.cppblog.com/oldworm/archive/2010/10/03/128471.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.cppblog.com/oldworm/comments/commentRss/128471.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/oldworm/services/trackbacks/128471.html</trackback:ping><description><![CDATA[<p><span><span>实用云计算环境简述</span></span></p>
<p><span>&nbsp;</span></p>
<p><span><span>如今</span><span><span>it</span></span><span>领域没听说过云计算的绝对是</span><span><span>out</span></span><span>了，虽然大家都知道云计算，虽然很多高校很多专业都开设了云计算专业，虽然很多人都在讨论云计算，虽然也有少数人走在了应用云计算的前列，然而，可悲的是，大多数人对云计算的认识仅限于</span><span><span>amazon</span></span><span>、</span><span><span>google</span></span><span>、</span><span><span>microsoft</span></span><span>、</span><span><span>ibm</span></span><span>有能力架设云计算环境，其他公司都靠边，甚至唯他们的云计算才叫云计算，别的企业根本不可能做云计算，各级政府部门最搞笑了，动不动花多少钱引进某某云计算环境，填补某某空白，多少</span><span><span>cpu</span></span><span>多少机器每秒多少万亿次计算，最终是不是一堆浪费电力的摆设也没有人知道，也没人去过问。</span></span></p>
<p><span><span>略感欣慰的是，很多企业都在务实地部署自己的云计算环境，大如腾讯、淘宝、百度、小如我们这样刚成立的小公司，其实要部署一个私有云计算环境并没有那么难，以我个人的经验来看，如果有一个精干的小团队，几个人一个月部署一个私有云计算环境是完全可能可行的。在我看来，所谓云计算就是分布式存储</span><span><span>+</span></span><span>分布式计算，不局限于底下</span><span><span>os</span></span><span>是</span><span><span>win</span></span><span>还是</span><span><span>*nix</span></span><span>，也不局限于是局域网环境还是广域网环境，也不管上面跑的是</span><span><span>c++</span></span><span>的程序还是</span><span><span>javascript</span></span><span>的程序，下面简单介绍下我设计的一个即时查询价格的云计算体系：</span></span></p>
<p><span><span>我一直在</span><span><span>win</span></span><span>下开发，</span><span><span>win</span></span><span>用得非常熟练，所以我把云计算环境部署在</span><span><span>windows</span></span><span>之上，当然也考虑到</span><span><span>windows</span></span><span>的机器众多，</span><span><span>tasknode</span></span><span>可轻易找到非常多的目标机器，我部署的云计算环境主要分两类节点，</span><span><span>jobserver</span></span><span>和</span><span><span>tasknode</span></span><span>，</span><span><span>jobserver</span></span><span>主管任务切割、任务调度，</span><span><span>tasknode</span></span><span>是计算节点。另外还有一些节点，</span><span><span>jobowner</span></span><span>可连接</span><span><span>jobserver</span></span><span>并提交任务，并可查询该任务的执行情况，</span><span><span>admin</span></span><span>可连接</span><span><span>jobserver</span></span><span>查询</span><span><span>jobserver</span></span><span>的状态。</span></span></p>
<p>&nbsp;</p>
<p><span><span><img alt="" src="http://hi.csdn.net/attachment/201009/11/0_1284185181MQMI.gif"></span></span></p>
<p><span><span>其实这些上篇博客已经写过，我再讲的详细一点，看具体的执行情况，首先</span><span><span>jobowner</span></span><span>给</span><span><span>jobserver</span></span><span>提交</span><span><span>package</span></span><span>，这个</span><span><span>package</span></span><span>是一个</span><span><span>zip</span></span><span>文件，包含一组文件，</span><span><span>jobowner</span></span><span>提交</span><span><span>package</span></span><span>之后</span><span><span>jobserver</span></span><span>会根据约定的规则管理</span><span><span>package</span></span><span>，并在</span><span><span>jobserver</span></span><span>展开该</span><span><span>package</span></span><span>，如下：</span></span></p>
<p>&nbsp;</p>
<p><span><span><img alt="" src="http://hi.csdn.net/attachment/201009/11/0_12841851885aa5.gif">&nbsp;</span></span></p>
<p><span><span><span>Jobowner</span></span><span>连到</span><span><span>jobserver</span></span><span>之后，发出如下的命令到</span><span><span>jobserver</span></span></span></p>
<p><span><span>0x49 0x0 0x0 0x0 0x2 0x0 0xb 0x0 127.0.0.1 0x0 ppsget.dll 0x0</span></span></p>
<p><span><span><span>{type:[0,1,2,3,4],rmax:5,wb:"pc",text:"</span></span><span>诺基亚</span><span><span> e63"} 0x0</span></span></span></p>
<p><span><span>上面是用我设计的一种混合显示格式显示的包数据，可以看到里面带上了</span><span><span>ppsget.dll</span></span><span>，这就是指定包内部名，其实还可以这样</span><span><span>ppsget.dll:getpage</span></span><span>，如此一个</span><span><span>dll</span></span><span>就可支持多个</span><span><span>IJobTask</span></span><span>输出，</span><span><span>getpage</span></span><span>只是获得其中一个</span><span><span>IJobTask</span></span><span>接口（关于</span><span><span>IJobTask</span></span><span>接口参考上一篇云计算实践</span><span><span>2</span></span><span>的文章）。具体命令是</span><span><span>json</span></span><span>格式，主要是为了方便信息传输和解析。</span><span><span>Jobserver</span></span><span>接收到该命令之后，调用</span><span><span>ppsget.dll</span></span><span>的</span><span><span>IJobTask</span></span><span>接口中的</span><span><span>split</span></span><span>函数，将该任务分解，之后调度</span><span><span>Tasknode</span></span><span>执行，</span><span><span>tasknode</span></span><span>收到</span><span><span>jobserver</span></span><span>发过来的任务之后，检查包名称，如果缺少就会主动向</span><span><span>jobserver</span></span><span>要求发送相应的包，并进行部署，待部署完成之后从包获取指定的</span><span><span>IJobTask</span></span><span>接口，执行该接口的</span><span><span>map</span></span><span>函数，将结果按照约定的格式发给</span><span><span>jobserver</span></span><span>，最后由</span><span><span>jobserver</span></span><span>调用</span><span><span>IJobTask</span></span><span>中的</span><span><span>reduce</span></span><span>函数进行打包，最后将结果发给</span><span><span>jobowner</span></span><span>并记录相关</span><span><span>Log</span></span><span>。</span></span></p>
<p><span><span>上图中还可看到一个</span><span><span>HashCrackCloud.dll</span></span><span>，这是另一个云计算环境下破解</span><span><span>md5</span></span><span>密码的</span><span><span>dll</span></span><span>，这个上篇文章也写了一下，这里就不详述了。</span></span></p>
<p><span>&nbsp;</span></p>
<p><span><span>为使得</span><span><span>tasknode</span></span><span>可适应各种机器环境，我把</span><span><span>tasknode</span></span><span>设计为一个</span><span><span>dll</span></span><span>，该</span><span><span>dll</span></span><span>内部自己管理消息及任务执行，该</span><span><span>dll</span></span><span>可被加载到各种容器进程（如</span><span><span>gui</span></span><span>进程、</span><span><span>console</span></span><span>进程、</span><span><span>service</span></span><span>进程）等执行，看下我的</span><span><span>tasknode</span></span><span>和它的容器进程：</span></span></p>
<p>&nbsp;</p>
<p><span><span><img alt="" src="http://hi.csdn.net/attachment/201009/11/0_1284185194THk2.gif"></span></span></p>
<p><span><span>这也算是我的得意设计吧，这样设计的</span><span><span>tasknode</span></span><span>在</span><span><span>windows</span></span><span>系统下的确具有很高的灵活性。</span></span></p>
<p><span><span>这样的</span><span><span>tasknode</span></span><span>甚至可直接加载在</span><span><span>jobserver</span></span><span>进程，也可被任意</span><span><span>win</span></span><span>系列机器的任意进程加载参与运算，用主动加载或被动加载都很方便，极大的方便了云计算环境的部署，反正具体执行的任务都由</span><span><span>package</span></span><span>完成，</span><span><span>tasknode</span></span><span>只要按照约定的规则部署</span><span><span> package</span></span><span>即可，所以这种云计算环境是非常轻量级又非常灵活的，开发一个新的任务只要做一个新的</span><span><span>IJobTask</span></span><span>即可，目前我这套体系除了没有考虑太多安全性之外，这个云计算环境的实施还是非常容易的，实际上我们这个</span><span><a href="http://www.shprog.com/pps.aspx"><span><span>价格查询</span></span></a></span><span>的后台云计算环境只用了不到</span><span><span>2</span></span><span>周的时间就开发完成。</span></span></p>
<p><span><span>再看下</span><span><span>jobserver</span></span><span>记录的每个</span><span><span>job</span></span><span>的</span><span><span>log</span></span><span>：</span></span></p>
<p>&nbsp;</p>
<p><span><span><img alt="" src="http://hi.csdn.net/attachment/201009/11/0_1284185215UbEq.gif"></span></span></p>
<p><span><span>从</span><span><span>log</span></span><span>中可很容易的分析出一个</span><span><span>job</span></span><span>每个</span><span><span>task</span></span><span>的执行情况，并可根据这些数据进行相应的优化处理。</span></span></p>
<p><span><span>之所以把</span><span><span>jobserver</span></span><span>和</span><span><span>tasknode</span></span><span>以及</span><span><span>package</span></span><span>都写出来，主要是为了表达一个看法，要实现一个简单的云计算环境其实并不难，有经验的团队很容易就能做出来，参考下</span><span><span>google</span></span><span>的</span><span><span>map/reduce</span></span><span>论文，按照自己的需要简化实现，真理在实践中，如果只是仰望</span><span><span>google</span></span><span>、</span><span><span>amazon</span></span><span>，那就真的是在云中雾里，另一个想要表达的就是云的形式是多种多样的，并不一定</span><span><span>amazone</span></span><span>、</span><span><span>google</span></span><span>的云计算环境才是标准的，对实用派来说，形式都是次要的，实用才是关键的。</span></span></p>
<img src ="http://www.cppblog.com/oldworm/aggbug/128471.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/oldworm/" target="_blank">袁斌</a> 2010-10-03 14:23 <a href="http://www.cppblog.com/oldworm/archive/2010/10/03/128471.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>