俺的回收站

架构分析 解释编译原理
posts - 42, comments - 214, trackbacks - 12, articles - 1
  博客园 :: 首页 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理

2010年8月24日

摘要: 相对于以Linux为代表的开源软件阵营,开源硬件也是开 源思想的继承者。这些硬件的开发者将硬件的全部资料都对外公开,包括电路图、固件、软件、元件列表、器件列表以及印刷版图。这些资料允许任何人使用,比开 源软件的开放度更高的地方在于,作者更是允许将这些资料及硬件用于任何商业开发。 每年MAKE杂志都会来介绍这些开源硬件,2009年有超过125种开源硬件项目被总结出来,涵盖了相关的19个种类,超出2008年的成果数目的一倍之多。这19个种类的项目具体包括:3D打印机, Arduino,Arduino shields,Blinky projects,时钟,Culture jamming,开发工具与平台,游戏、趣味及娱乐,摄像机,医学与生物学相关,音乐相关(MP3),处理器(CPU),宗教相关,机器人技术相关,通信,交通相关,无人机,无线及GPS阅读全文

posted @ 2010-08-24 12:19 Riceball LEE 阅读(2058) 评论(0) 编辑

2010年8月20日

摘要: 云计算EC2兼容平台 安装实践 最近我在公司中尝试安装搭建了基于 Eucalyptus 云计算EC2兼容平台的测试环境。用一台作为控制器,一台作为虚拟机节点,在此感谢综合服务部老马的支持。Eucalyptus 的组成说明Euc 的组成可以分为5类组件,它们之间是通过 SOAP with WS-security进行通信。通过下图我们可以看到基于顶层的是Cloud Controller(clc) 和 ...阅读全文

posted @ 2010-08-20 16:01 Riceball LEE 阅读(439) 评论(0) 编辑

2010年6月2日



控制器(前端节点):
  • the cloud controller (clc)
  • the cluster controller (cc)
  • walrus (the S3-like storage service)
  • the storage controller (sc)
虚拟机节点(后端节点):
  * node controller (nc)

1. sudo apt-get install eucalyptus-cloud  eucalyptus-walrus
2. sudo apt-get install  eucalyptus-cc  eucalyptus-sc
3. sudo apt-get install eucalyptus-nc

 
architecture-1.6.png















Euc 的组成可以分为5类,它们之间是通过 SOAP with WS-security进行通信。
顶层是 cloud controller(clc) 和 walrus, 云控制器(CLC) 是Java写的,提供给外界 ec2 兼容的Web SOAP Service 和Query接口以及Web界面交互,用来管理所有的集群。执行高层对资源的规划和系统用户的管理。Walrus 是S3-compatible bucket-based storage,也是java写的,为外界提供存储服务 顶层的cls和walrus可以汇集多个集群的资源。每一个集群需要一个cc来管理计算节点(资源规划和网络控制),以及一个sc(存储控制器)来实现 EBS(Amazon Elastic Block Store)类型的块存储:所有的image文件存放于此,sc是用java写的。

Cluster controller (CC) - C 写的,提供对集群内部控制,在 Apache 內作为 Web services 來部署。
Node controller (NC) - C 写的,安在提供虚拟机服务的节点上,在 Apache 內作为 Web services 來部署。


posted @ 2010-06-02 21:37 Riceball LEE 阅读(236) 评论(0) 编辑

2010年5月7日

前面一篇: tcdatabase-1

搜索操作:根据“字段”检索出符合条件的key

cmd: misc search/metasearch [addcond/cond\0{fieldName}\0{condOperator}\0{Value}...[next] addcond/cond...] [setorder/order\0{fieldName}\0{OrderType}] [setlimit/limit/setmax/max)\0{MaxCount}[\0{SkipCount}]] [columns/get\0{FieldName1}\0{FieldNameN}] [mstype\0{SearchType}] [out/remove] [count] [hint]

搜索操作是通过search/metasearch命令进行,并可以支持联合查询。

参数描述:
  • * addcond/cond: 添加条件,多个条件构成一个查询,同查询之间为与(并且)关系。
    •   * fieldName为条件的字段名
    •   * condOperator代表操作类型,
    •   * value为操作对象
  • * next: 联合查询的下一个查询的开始,接下来的addcond为下一个查询。
  • * mstype: 表示联合查询之间的关系,默认是合并(OR)关系,可以是合并(OR),交集(AND)或不同(DIFF)。不过一次联合查询只能有一种关系(mstype)。
  • * setorder/order: 为这次查询指定一个排序字段,得到的结果集合将按该字段的指定方式排序。
    •   * orderType为排序类型,值如下:
    •     * STRASC:表示按照文本型字段内的文本内容在字典中排列顺序的升序。
    •     * STRDESC:表示按照文本型字段内的文本内容在字典中排列顺序的降序。
    •     * NUMASC:表示按照数值大小的升序。
    •     * NUMDESC:表示按照数值大小的降序
  • * setlimit/limit/setmax/max: 限制检索结果数量,相当于SQL语句中的“limit skip, max”。
  • * columns/get: 设置后,将不仅仅返回符合查询的keys,而且将获取指定列的值。如果只指定了columns没有指定字段,则将返回所有列的值。
  • * out/remove: 将删除符合查询的结果记录集,同时将删除的keys返回。
  • * count: 返回符合查询的记录数。
  • * hint: 将打印执行查询的调试信息。

操作类型可以分为:字符型运算,数值型运算,token型运算,全文检索型运算。
数值型运算符:
  • * NUMEQ:表示等于操作对象的数值(=)。
  • * NUMGT:表示比操作对象的数值要大(>)。
  • * NUMGE:表大于或等于操作对象的数值(>=)。
  • * NUMLT:表示比操作对象的数值要小(<)。
  • * NUMLE:表示小于或等于操作对象的数值(<=)。
  • * NUMBT:表示其大小处于操作对象文字段中被逗号分开的两个数值的中间(between 100 and 200)。
  • * NUMOREQ:表示同操作对象文字段中被逗号分开的多个数值中的其中一个是相同的( IN (100,200,278))
文本型运算符:
  • * STREQ:表示与操作对象的文字内容完全相同(=)。
  • * STRINC:表示含有操作对象文字的内容(LIKE ‘%文字%’)。
  • * STRBW:表示以操作对象的文字行列开始(LIKE ‘文字%’)。
  • * STREW:表示到操作对象的文字行列结束(LIKE ‘%文字’) 。
  • * STRAND:表示包含操作对象的文字行列中右逗号分开部分的字 段的全部(name LIKE ‘%文字(一)%’ AND name LIKE ‘%文字(二)%’)。
  • * STROR:表示包含操作对象文字段中逗号分开部分的其中一部分 (name LIKE ‘%文字(一)%’ OR name LIKE ‘%文字(二)%’) 。
  • * STROREQ:表示与操作对象文字段中逗号分开部分的其中某部分完全相同( name = ‘文字(一)’ OR name =‘文字(二)’ )。

设置索引操作

misc setindex name type
可以对“字段”建立索引, 暂不支持支持全文检索
  • * name:待索引的字段名称;
  • * type为索引类型,值如下:
    •   * TDBITLEXICAL(0):创建文本型索引
    •   * TDBITDECIMAL(1):创建数值型索引
    •   * TDBITTOKEN(2):创建标记倒排索引 ,暂不支持
    •   * TDBITQGRAM(3):创建q-gram倒排索引 ,暂不支持
    •   * TDBITOPT(9998):优化索引
    •   * TDBITVOID(9999):删除索引
    •   * TDBITREINDEX(10000): 重建索引

posted @ 2010-05-07 16:28 Riceball LEE 阅读(467) 评论(3) 编辑

为何写tcdatabase

tcdatabase 是以TC(Tokyo Cabinet)的B+Tree 数据引擎为基础开发的数据库。


TC(Tokyo Cabinet)是日本人平林幹雄开发的一款 Key-Value 键值数据库,该数据库读写非常快,哈希模式写入100万条数据只需0.402秒,读取100万条数据 只需0.334秒。
TT(Tokyo Tyrant )是由同一作者开发的 Tokyo Cabinet 数据库网络接口。它拥有自己的协议,并支持Memcached兼容协议,也可以通过HTTP协议进行 数据交换。哈希数据库读写速度大约在50000次/秒。
TC和TT目前运行在日本最大的SNS网站MIXI,在国内也有大量的生产环境应用。

关于TC和TT详尽的介绍可以看看张宴2010年4月2日在“2010年数据库技术大会”的演讲PPT:Tokyo Cabinet Key-Value数据库及其扩展应用PPT

在TC中key-value数据对中value有结构并能对value中字段进行索引的数据引擎是TCTDB(Table Database)。TCTDB是在TCHDB哈希数据库的基础上,对value部分做的增强:value是带字段结构,value是由若干字段名-字段值对组成。(详见张宴PPT)。

 

TCTDB即具备了Key-Value数据库的高效读写性能,又具备了MySQL单表能实现的一些功能,即: SELECT .... FROM table WHERE .... ORDER BY .... LIMIT xxx,xxx


TCTDB的不足:
  • * 一个Table Database仅支持一个表,也就是说value中的字段必须固定一样。假设项目组使用了80多个表,这意味着你需要开启了80多个 ttserver为每一个“表”提供支持。
  • * 功能的增强,也就意味着要牺牲性能。TCTDB 表格型数据库的平均读取速度大约在40万条/秒,相比 TCHDB哈希数据库的180万条/秒和TCBDB B+Tree数据库 的100万条/秒要慢。
  • * TCTDB虽然可以建立数值型索引,但是它是将所有value数据都当成字符型来处理的,无法区分value类型。
  • * TCTDB单数据库文件存储的记录数上亿条后,性能会有比较明显的下降。
  • * 不能单独获取value中的某一个字段的值;
  • * 不能支持仅更新UPDATE key中某一个字段:必须先取出value的全部字段,再存入;
  • * 查询没有时间限制,如果有一个超大数据量的查询就可以把服务搞僵死

So,为了解决TCTDB一个database只能使用一个表,以及不能获取(更新)value中某个字段值的问题,我动了写tcdatabase的念头。
目前tcdatabase 数据格式为Spec.2. 当前Spec.2的实现功能如下。

tcdatabase的数据存储

tcdatabase的数据存储被分为3个文件进行存储:分别是数据文件、数据配置文件、数据索引文件。
* 1、[data.tcb]: 数据文件改用采用TCBDB(B+Tree Database)进行存储,——为了解决数据量上亿后的HashDB性能的问题。
* 2、[data.tcb].cfg: 数据配置采用TCHDB(Hash Database), 只要内存缓存设置适当配置信息就会在内存中。
* 3、[data.tcb].idx: 索引同样采用TCBDB存储。

注意:字段名称必须在整个数据库中保持唯一。暂不支持全文索引。

 

tcdatabase兼具TCBDB和TCTDB的特点。主要特点如下:


读写操作

写操作

 

写操作分为行写和列写操作。

行写:和TCTDB完全一样,写入整行(row)数据,包含所有字段。
分为 misc put, misc putcat, misc putkeep
misc putkeep: 添加新记录,如果企图覆盖已有记录会报错。
misc put: 添加新记录或者覆盖已有记录,注意覆盖的新值中不能有新字段。
misc putcat 覆盖已有记录并可以给已有记录添加新字段。

列写:和TCBDB一样。仅对key的单列进行写入
put(".[KeyName].[FieldName]", "FieldValue")
必须使用put命令进行(不能使用 misc put,这是行写方式)。
必须以"."字符打头表示列写方式,keyName和字段名之间用"."分隔。

读操作

读操作也分为行读和列读操作。

行读操作:和TCTDB完全一样,读取整行(row)数据,包含所有字段。
misc get(char * name)

列读操作:和TCBDB一样。可以读取某key的单列值的信息,也可以获取某key的字段列表信息
读取单列:get(".[KeyName].[FieldName]")
读取key的字段名称列表信息:get("/[KeyName]")
必须使用get命令进行(不能使用 misc get,这是行读方式)。

 

tcdatabase 开源

tcdatabase: http:code.google.com/p/tcdatabase

注意:当前你必须从代码仓库中checkout方为Spec.2的最新版本,下载包中的为Spec.1的版本。

 

参考与感谢:

posted @ 2010-05-07 07:00 Riceball LEE 阅读(629) 评论(0) 编辑

2010年3月5日

* MongoDB vs Redis vs Tokyo Tyrant
准备对MongoDB, Redis以及Tokyo Tyrant的读写做一个简单的测试,为了进行相对公平的测试,需要了解他们背后的实现机制,下面是一些比较:

存储实现的比较:
   * 内存文件映像(Memory-File Mapping) Redis, MongoDB
   * 文件 + Cache  Tokyo Tyrant
   * 内存: Redis, Tokyo Tyrant
Key/Value索引形式:
  * B+ Tree  : MongoDB, Tokyo Tyrant
  * Hash Table: Redis, Tokyo Tyrant
  * Fixed Length: Tokyo Tyrant

从上面的比较可以看出,Redis和MongoDB是基于系统内存映像文件,数据能命中在内存的时候读写操作性能应该是非常强的,当然,反过来,如果数据十分分散不能在内存命中,那么内存页的切换开销将是非常可怕的,MongoDB和Redis数据文件不同的是将数据存放在多个文件中,每当上一个存满的时候就会创建新的数据空间文件。鉴于MongoDB 是主要比较对象,而其采用B+Tree进行存储,故TT也使用B+Tree引擎进行比较。

那么该测试什么自然就可以得知:尽管使用内存映像文件读写操作会很快(快到什么程度),但是当写满内存以后呢?

文件大小限制:
32bit: MongoDB <= 2G
       TT no limits if u ./configure --enable-off
64bit: MongoDB和TT均无限制。

注:Redis 总是受限于内存的大小。

为了进行相对公平的测试:
首先通过虚拟机对内存的使用进行同等限制,因为MongoDB和Redi实际上读写都是在内存操作的(利用MemoryMap文件),故当数据库的大小超过内存大小时候的性能尤为重要。故用虚拟机来设置一个较小的内存大小,来快速观察数据库大小超过内存的时候的性能。
这里设置虚拟机内存256M,实际可使用内存200M左右,CPU 2核,Unbuntu Server 9.10

测试记录:
Key: 512的随机字符串
Value: 大约5k的随机字符串
每项记录数据大小:大约5.5k
计划插入数据100000条:5.5k*1000=5.5M*100=550M 数据量大约 550M。

注:key开始是用1k的随机字符串来测试,但是在测试mongoDB 报告key too large to index, 因此减小key的大小到512字节。

当没有任何数据的时候:
MongoDB的大小: 
  64M: (db.0, db.1, ..)data FIle
  16M: (database.ns) name space index file.

TC的大小:
133K btree.tcb
256  fixed.tcf
517K hash.tch

Redis的大小:
VirtualMemFile: 41M redis-3546.vm
DB: 0M
注:redis的文件初始大小基本等于你设置的内存以及内存页的大小,可以自己调整。redis通过定时存盘的策略进行保存,定时策略可以自行设置。
通常情况下,redis的数据库必须<=内存,如果要让redis的数据库大于内存,那么必须在配置中打开vm_enabled选项(貌似没用,当插入数据超过内存后,会被Unbuntu的后台保护进程给杀掉,如果设置了最大使用的内存,则数据已有记录数达到内存限值后不能继续插入新值)。

key/value 功能:
Redis: 读写key/value,value可以有各种结构,但Value无索引。
MongoDB: 以collection组织,key如果不特别指定将由系统作为ObjectId产生(指定使用“_id”字段),value是结构化的,value里的字段可以被索引。
TokyoTyrant: 读写key/value,table 数据引擎支持结构化的value和字段索引,其它数据引擎不支持,b+tree可以用key索引。

基准测试机器:
虚拟机是跑在 2 CPU 2.26G Intel Core 2 Duo,内存为2G
虚拟机:
  CPU  2核
  内存 256M
  操作系统:Unbuntu Server 9.10 32bit

使用软件版本:
  * MongoDB: mongodb-linux-i686-2010-02-26
  * TokyoTyrant:  TT1.1.40; TC1.4.42
  * Redis: 2010-03-01(GIT SRC)

启动:
redis-server ./redis.conf(设置了最大内存210兆:maxmemory 210000000, vm-enable=yes,vm-max-memory 20000000,vm-pages 1342177)
./ttserver -port 1974 /data/db/tt.tcb
 bin/mongod -port 1974 --dbpath /data/db/mongo

MongoDB
如上所述测试添加10万条数据:
内存,刚开始的时候虚拟内存占用48564,物理内存占用 3432,在插入2000条数据后,虚拟内存到达143M,物理内存33M,内存增长很迅速。最后虚拟内存稳定在1048M,物理内存则在160M-211M徘徊。
CPU占用率最低的时候为6%,最高的时候达到30%,平时在8%-10%之间。
从测试看,每次分配DB空间的时候所有插入操作被冻结,最坏的一次插入2000条耗时1分多(这个时候正好有分配空间文件发生),平时,插入2000条数据大约耗时17-18秒。
最后MongoDB的数据文件总大小达到:977M

接着测试MongoDB读取10万条记录(非命中形式:该key是随机产生的,因此大都不会存在数据库中)

内存:虚拟内存稳定在1048M,物理内存占用在90M-94M。
CPU:最低占用8%,最高到45%;平时在10%-12%左右。
读取2000条记录大约耗时3-4秒,第一次用了6秒。

Redis
同样测试添加10万条数据:
内存,开始的时候忘记看了,大致较开始的虚拟内存占用112M,物理内存82M,在4万条记录的时候VM占用196M,物理内存占用163M,最后的时候VM占用237M,物理内存204M。
CPU:最低占用3%,最高的时候15%,平时在7%-11%之间。
当Redis向磁盘写入数据的时候,有变慢(2000条记录耗时21秒),平时存2000条记录大约耗时18-19秒左右。
不过没有设定maxmemory的时候,在大约写入 6万多个数据后服务器被挂掉。当设置最大使用内存(200M)后,达到内存限制,写入不了(已写入48136个数据),但是不会挂了。
Redis文件在写入48136个数据时候的大小(包括VM文件):277M,其中VM 41M,数据库236M。

接着测试Redis读取10万条记录(非命中形式:该key大都不会存在数据库中)
内存:虚拟内存237M,物理内存占用204M
CPU:在26%-43%

读取2000条记录大约耗时在3-4秒。

Tokyo Tyrant
如上所述测试添加10万条数据:采用默认配置参数运行TT B+Tree
内存:初始的时候VM: 76928 物理内存: 1232,在插入的过程内存的增加很少,在插入到4万条记录的时候虚拟内存仅为99540,物理内存23M,到最后虚拟内存117M,物理内存37M。
CPU占用率始终稳定在2%

在插入到5万条记录前,平均插入2000条耗时约19-20秒,到8万条记录前时候,插入2000条耗时20-22秒,再接下来的2万条,平均插入2000条耗时在慢慢增加并有震荡,28秒,最后到42秒(B+Tree的索引节点在内存中满了?可能需要调整参数?)。
TT的数据库只有一个文件大小为:589M 

接着测试TT读取10万条记录(非命中形式:该key大都不会存在数据库中)
内存稳定在:VM110M;物理内存36M。
CPU:最低2%,最高6%,平时在4%

读取2000条记录大约耗时在7-8秒,偶尔6秒或9秒。

小结:
MongoDB和Redis写入数据不是直接写入磁盘,所以当重启系统时候没有存盘的数据将全部丢失。TT实际上也有内存缓冲,不过和前者相比要小的多。
以上测试并不完善,只是一个开始,比如没有测试小数据(以数字作为key,100字节Value),没有测试较大的数据(20K左右);没有测试在命中情况下的性能;没有测试并发读写的性能,据闻MongoDB的并发读写效率不是特别出色,MongoDB的特色在于支持的查询语言非常强大,其语法有点类似于面向对象的查询语言,几乎可以实现类似关系数据库单表查询的绝大部分功能,并实现了存储节点的自动sharding管理等配套功能;以及由于MongoDB是分布在多个文件中,当数据量远大内存,分布在足够多的文件的时候的性能;对开启同步日志后的Replication测试....对于TT来说,需要对TT的其它数据引擎进行测试,以及TT的各种数据引擎如何优化?TC/TT在mixi的实际应用当中,存储了2000万条以上的数据,同时支撑了上万个并发连接,是一个久经考验的项目。TC在保证了极高的并发读写性能的同时,具有可靠的数据持久化机制,同时还支持类似关系数据库表结构的hashtable以及简单的条件,分页和排序操作,是一个很棒的NoSQL数据库。TC的主要缺点是在数据量达到上亿级别以后,并发写数据性能会大幅度下降(读不受影响),NoSQL: If Only It Was That Easy提到,他们发现在TC里面插入1.6亿条2-20KB数据的时候,写入性能开始急剧下降。Redis本质上是一个Key-Value类型的内存数据库,很像memcached,整个数据库统统加载在内存当中进行操作,定期通过异步操作把数据库数据flush到硬盘上进行保存。因为是纯内存操作,Redis的性能非常出色,Redis最大的魅力是支持保存List链表和Set集合的数据结构,而且还支持对List进行各种操作,例如从List两端push和pop数据,取 List区间,排序等等,对Set支持各种集合的并集交集操作,此外单个value的最大限制是1GB,不像memcached只能保存1MB的数据,Redis可以用来实现很多有用的功能,比方说用他的List来做FIFO双向链表,实现一个轻量级的高性能消息队列服务,用他的Set可以做高性能的tag系统等等。另外Redis也可以对存入的Key-Value设置expire时间,因此也可以被当作一个功能加强版的memcached来用。

测试程序和详细记录见附件: testbench.tgz.zip

 

Refs:
* http://porteightyeight.com/2009/11/09/redis-benchmarking-on-amazon-ec2-flexiscale-and-slicehost/
* http://www.eb163.com/club/viewthread.php?tid=2470
* http://timyang.net/data/mcdb-tt-redis/
* http://www.javaeye.com/topic/524977
* http://bjclark.me/2009/08/04/nosql-if-only-it-was-that-easy/

posted @ 2010-03-05 11:56 Riceball LEE 阅读(4731) 评论(0) 编辑

2009年12月13日

摘要: 通过我这段时间的学习和总结,我对云计算分类整理如下 所谓云计算可以认为是VMM + Cloud Service + Cloud Storage 的结果,那么为啥要云化?从互联网发展趋势来看:* 数据规模越来越大,并且增长得也越来越快:在1977年产生的电子数据大约40exabytes(1000PB)。而到了2010年数据规模将达到988exabytes。NYSE 每天大约产生 1TB 的数据, F...阅读全文

posted @ 2009-12-13 19:06 Riceball LEE 阅读(1957) 评论(7) 编辑

2008年9月16日

摘要: IBM和林登实验室共同声明两家公司的研究小组已经成功从Second Life Preview Grid(预览网格)传送到一个运行OpenSim服务器的虚拟世界, 这是虚拟化身首次从一个虚拟世界走到另一个虚拟世界. 这也是虚拟化身在不同虚拟世界中自由穿梭重要的第一步. 林登实验室从2007年9月就开始筹建Architecture Working Group(架构工作组), 一个专门致力于虚拟世界互通...阅读全文

posted @ 2008-09-16 22:06 Riceball LEE 阅读(319) 评论(0) 编辑

摘要: OpenSimulator项目,也就是OpenSIM,是基于BSD开源协议的虚拟世界服务器项目,它是用C#开发的,类似于SecondLife的网格服务,可以创建和部署虚拟世界,以及在各个OpenSim虚拟世界中跳转。目前OpenSim尚在Apha阶段,不过已经有人在OpenSim中模拟出了N体仿真。并且已经有人已经在部署OpenSim的虚拟世界:http://osgrid.org/。据路透社报道:...阅读全文

posted @ 2008-09-16 22:03 Riceball LEE 阅读(870) 评论(2) 编辑

2008年9月13日

摘要: 评估比较产品,解决方案,技术方案的难题在于确定它们是否能针对问题域有效的解决问题。首先要明确服务是完成一定业务功能的组件,服务是可以自包含的和自解释的,通过良好组织定义的标准接口提供服务。服务是被各种不同的策略驱动的。以架构师的角度来看,SOA 面向服务的统一管理必须解决服务的安全,服务的管理(监视,守护),服务的依存管理等诸如此类的各种服务管理策略问题。OK, 统一管理机构的要解决的核心问题就是...阅读全文

posted @ 2008-09-13 07:36 Riceball LEE 阅读(932) 评论(1) 编辑