YunTable 0.1版正式发布!!!(转载)

news/2024/7/20 14:39:32 标签: 内存管理, 数据库, c/c++

源地址:http://peopleyun.com/?p=731

 

经过两个星期的努力(如果刨去学习C语言的时间),YunTable终于走完一个从无到有的历程,今天,也就是2010年7月12日,YunTable正式对外发布其0.1版,在0.1版中YunTable虽然在特性,优化和内存管理这三方面还有很多的缺失,但是总体而言,已经实现了一个身为BigTable克隆的基本要求,也就是分布式查询和管理,以及以column为核心的存储。这是0.1版的下载链接(上次因为对Skydrive的存储机制不熟,导致部分博友没有第一时间拿到0.01版的源代码,在这里向大家表示我的歉意)。

 

架构综述

首先,请看下面是YunTable0.1版的架构图:

YunTable Arch图1. YunTable架构(0.1版)

接下来,将按从上往下的顺序给大家介绍YunTable的架构:

  1.  
    1. Console:用于让用户输入YunTable的命令,主要包括四种类型的命令(add,put,get和quit),并做一些简单的解析。
    2. Master:主要接收来自Console的请求,并将这个请求转发给相应的Region。
    3. Region:其作用主要是处理Master的请求,并存储和管理大量的数据,其主要包括多个store,而存储数据的目录名为”datastore“。Region也就是BigTable论文中所提到的Tablet的服务器。
      1. Store:每个Store对应一个相应的column family,系统在初始化的时候,会为默认的column_family(default_cf)创建一个store,store存储的形式为datastore下的一个目录,目录名为其所对应的column_family,并主要包括四类文件:Memstore,YFile,YFile_data和WAL。
        1. Memstore:其是缓存在内存的数据文件,主要存储最新更新和添加的数据,每隔一段时间,在Memstore上缓存的数据都将会flush到YFile和YFile_data这两个文件中,默认时间间隔应该为60分钟,但0.1版为了测试方便,所以把设定的时间间隔暂定为10秒钟。
        2. YFile:其是持久化的文件,主要用于存储数据的Index,系统会根据从YFile中得到的Index来访问用于存储数据的YFile_data文件中的相应部分,而且由于其体积比较小,所以会在系统运行的时候被载入至内存中。
        3. YFile_data:这就是真正存储数据的文件,由于其体积比较大,所以不大会被存入内存。YFile这个两个文件参考了HBase的HFile格式和Google的SSTable格式,并做了相应的简化。
        4. WAL:全称为“Write-Ahead Log”,用于暂存那些数据更新的请求,以避免当Memstore被意外关闭时所造成的数据丢失,当Memstore完成对数据的写入时,WAL也会清空已经写入的请求。

 

 

一些限定

为了使YunTable在合理的时间内达到其0.1版,我在一些方面做了相应的范围缩小,所以YunTable0.1版有下面一些限定:

  1.  
    1. column_name和column_family_name的大小都被限制在16字节之内,如果输入column_name或者column_family_name的大小超过16字节,系统会将多余的字节自动删去。同时假设在输入的时候,如果不为这个column设定相应的column_family,系统会认定其使用系统默认的column family,也就是default_cf。
    2. 在分布式方面,为了缩小开发范围,采用了伪分布式的方式,也就是将Master和Region绑定在一起,并且只有一个初始Region可供选择。
    3. 在查询方面,暂不支持基于column的查询,但是支持基于row key的查询,具体可以看下面使用教程中的”Get“命令。
    4. 内存管理方面和性能优化方面,由于这两方面在短期内并不关键,而且”过早的优化“也不是业界所推崇的,所以在0.1版中,没有在这两方面发力。

 

 

使用教程

首先,使用make来编译生成执行文件YunTable,可通过“./yuntable”来启动YunTable,并进入YunTable的Console,也可使用make clean来清空之前生成的数据库文件。

接下来,将介绍YunTable Console所支持四种命令:

  1.  
    1. add:这个命令,是为了创建新的Column Family存在的,格式是“add column_family:column_family_name”,在这里”column family”是关键词,不可更改,而“column_family_name”则是等待用户输入的占位符,如果输入的Column Family已经存在的了,Console会显示相应的错误信息。例子:add column_family:address 。
    2. put:主要是用于添加数据,其格式是”put  row:row_key column_name:column_name_value column_family_name.column_name:column_name_value“,在这里”row”是关键词,在其冒号后输入相应的row_key,比如在后面例子里面提到的”me“,在row之后那些,都不是关键字,只要按照那些占位符输入相应参数就可以,具体也可以参看后面的例子,但要注意,如果这个column不属于系统默认的column family,那么请在column family和column之间加入用于分割的“.”,例子:put row:me name:ike sex:male address.homeaddress:sh 。
    3. get:可以通过这个命令来获取数据,主要有两个选择:第一个是“get all”,这主要是列出数据库中所有的数据,并安排row key大小的顺序(字典顺序)排列,但不会对输出的数据进行过滤。另一个是“get row:row_key”,通过这个命令会获得这个row的数据,并且会对其输出的数据进行过滤,也就说,同一row同一column只会显示最新的一个值,例子:get row:me。
    4. quit:这个命令最简单的,没有附加的命令,只有在console中输入“quit”就能退出YunTable Console。

 

 

还有,如果大家第一次使用YunTable的话,可以参考下面附录里面的两个Test Case,特别推荐Test Case1,也就是短的那一个。

 

今后的安排

关于YunTable的未来,首先,我将会在《剖析云计算》一书的实践篇中,对YunTable的实现和其背后的理论进行详细的讲解。其次,关于YunTable未来的发展,我还没有明确的规划,所以如果大家有兴趣在今后参与YunTable开发的话,可以直接在使用和分析YunTable之后将自己的想法发到我的邮箱ikewu83@gmail.com,等我有空了之后,大家可以一起来商量商量,同时也可以直接动手改代码,来对YunTable进行更新和添加。

 

附录:

下面是两个YunTable的Test Case,一长一短,如果大家有兴趣的话,可以试一下。

Test Case1(短) 
make 
make clean 
./yuntable 
1. add column_family:address 
2. put row:me name:ike sex:male address.homeaddress:sh 
3. get all 
4. quit

Test Case 2(长) 
1) begin part 
make 
make clean 
./yuntable 
1. get all

2) add part 
1. add column_family:address 
*2. add column_family:address 
3.  add  column_family:address2

3) put part 
1. put row:me name:ike sex:male address.homeaddress:sh 
2. put row:m22 name:zhu sex:male address.homeaddress:sh address2.workaddress:bj 
3. put row:m1 name:wu sex:male address.homeaddress:sh 
*4. put row:m3 name:hua sex:male address3.playaddress:sh 
5. put row:me name:wu sex:female address.homeaddress:bj

4) test log part 
1. quit 
./yuntable

5) get part 
1. get all 
2. get row:me 
*3. get row:wrong 
4. quit

*开头的命令,应该返回相应的错误信息。

 

转载于:https://www.cnblogs.com/licheng/archive/2010/09/09/1821907.html


http://www.niftyadmin.cn/n/733629.html

相关文章

LWN:跟set_fs()说再见吧!

关注了就能看到更多这么棒的文章哦~Saying goodbye to set_fs()By Jonathan CorbetSeptember 24, 2020https://lwn.net/Articles/832121/DeepL assisted translationset_fs()函数在 Linux 内核的最初阶段就已经存在了。它是分离用户空间和内核空间的内存的机制中的关…

C语言库函数---fwrite

函数原型: size_t fwrite(const void* buffer, size_t size, size_t count, FILE* stream); (1)buffer:是一个指针,对fwrite来说,是要获取数据的地址; (2)size&#xff1…

零基础学Web前端需要避开的几个学习误区

随着近期网上关于华为“鸿蒙”操作系统消息的不断流出,国产操作系统再一次被重视起来,作为国产操作生态系统中重要的组成,[Web前端请添加链接描述](http://www.suzxms.com.cn/web/)的作用不可忽视。Web前端开发人员逐渐成了市场上极具竞争力的…

LWN:OpenWrt与SELinux!

关注了就能看到更多这么棒的文章哦~OpenWrt and SELinuxBy Jake EdgeSeptember 30, 2020https://lwn.net/Articles/832876/DeepL assisted translationSELinux 是一种常用的安全机制,能够以许多有效的方式来限制用户空间发起的攻击。它也普遍被认为是一个…

C语言库函数---flock

需要的头文件: sys/file.h 作用: 函数会依照operation所指定的方式对参数fd所指文件做各种锁定和解锁的动作,此函数只能锁定整个文件,不能锁定文件的某一个部分 函数原型: int flock(int fd,int operation); 参数解释&…

Maven学习总结(十)——使用Maven编译项目gbk的不可映射问题

2019独角兽企业重金招聘Python工程师标准>>> Maven学习总结(十)——使用Maven编译项目gbk的不可映射问题 一、问题描述 今天在MyEclipse中使用Maven编译项目源代码时,结果如下了如下的错误 百思不得其解啊,java源代码在MyEclipse中显示是没有…

LWN:关于preempt_count()的四个小讨论!

关注了就能看到更多这么棒的文章哦~Four short stories about preempt_count()By Jonathan CorbetSeptember 18, 2020https://lwn.net/Articles/831678/DeepL assisted translation这个话题是从 Thomas Gleixner 的一个简单 patch 开始的,它对 preemptio…

LWN:Collabora Online从Document基金会移出去了!

关注了就能看到更多这么棒的文章哦~Collabora Online moves out of The Document FoundationBy Jonathan CorbetOctober 2, 2020https://lwn.net/Articles/833233/DeepL assisted translationThe Document Foundation(TDF)成立于 2010 年&…