免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 7837 | 回复: 19
打印 上一主题 下一主题

SPHiveDB: 基于 sqlite 的数据库服务器 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-05-24 00:06 |只看该作者 |倒序浏览
在 share nothing 的架构中,如果数据规模很大,为了提高可用性,通常采用数据库分片(database sharding)的策略。常见的分片策略是按主键把数据分散到不同的数据库中。在使用常规的 RDBMS 的场景中,分片策略中使用的数据库个数通常在100以下。在某些特殊的场景中,可能希望采用更极端的分片方法,比如在类似地址本这种应用中,可以为每个用户创建一个数据库。

SPHiveDB 就是为这种极端的分片方法而实现的一个数据库服务器。SPHiveDB 基于 sqlite ,用 JSONRPC over HTTP 为 sqlite 提供了网络访问接口。为了能够支持大量的数据库实例,SPHiveDB 把多个 sqlite 数据库合并保存到一个文件中;支持同时使用多个数据库文件。

http://code.google.com/p/sphivedb/
http://freshmeat.net/urls/01b9b3be9ec4e19ebd6a8e6208f3a0a1
http://sphivedb.googlecode.com/files/spmemvfs-0.2.src.tar.gz

内部结构示意图



SPHiveDB 使用 Tokyo Cabinet 作为最终的物理存储,每个用户对应的 sqlite 数据库以用户名为 key 保存在 Cabinet 中。为了支持能够从 Cabinet 中加载 sqlite 数据库,为 sqlite 实现了一个 memvfs 。通过 memvfs ,使得 sqlite 能够在内存中加载和保存数据。SPHiveDB 支持一个进程同时使用多个 Cabinet 文件,使得单一 server 能够支持尽可能大的存储空间。


JSONRPC 请求和响应示例


  1. {
  2.         "method" : "execute",
  3.         "params" : [
  4.                 {
  5.                         "dbfile" : 0,
  6.                         "user" : "foobar",
  7.                         "dbname" : "addrbook",
  8.                         "sql" : [
  9.                                 "insert into addrbook values ( 1, \"foo@bar.com\" )",
  10.                                 "select * from addrbook"
  11.                         ]
  12.                 }
  13.         ],
  14.         "id" : "foobar"
  15. }
复制代码


dbfile 指定操作哪一个 Cabinet 文件;user + dbname 指定操作哪一块数据;sql 需要执行的 sql 语句,支持批量执行多个 sql 语句,使用 all-or-nothing 的策略,要么全部成功,要么全部失败。dbname 还用于指明第一次操作一块数据时,用什么语句来创建 sqlite 数据库。用于创建 sqlite 数据库的语句保存在 sphivedbsvr.ini 配置文件中。以 ddl. 开头的配置节用于指定对应数据库的创建语句。


  1. [ddl.addrbook]
  2. create table if not exists addrbook ( id int, addr varchar(64) );
复制代码


  1. {
  2.         "result" : [
  3.                 {
  4.                         "name" : [ "affected", "last_insert_rowid" ],
  5.                         "type" : [ "int", "int" ],
  6.                         "row" : [ [ 1, 1 ] ]
  7.                 },
  8.                 {
  9.                         "name" : [ "id", "addr" ]
  10.                         "type" : [ "int", "varchar(64)" ],
  11.                         "row" : [ [ "1", "foo@bar.com" ] ],
  12.                 }
  13.         ],
  14.         "id" : "foobar"
  15. }
复制代码


result 返回 sql 语句执行的结果,name 对应的 array 为 column 的名字,type 对应的 array 为 column 的类型,row 对应的 array 是返回 recordset 。特别地,对于 INSERT/UPDATE/DELETE 也使用类似 select 的方式来返回,affected 是 sql 语句执行之后 sqlite3_changes 返回的值,last_insert_rowid 是 sql 语句执行之后 sqlite3_last_insert_rowid 返回的值。

[ 本帖最后由 iunknown 于 2009-12-6 21:45 编辑 ]

评分

参与人数 2可用积分 +12 收起 理由
c/unix + 2 精品文章
prolj + 10 我很累,佩服

查看全部评分

论坛徽章:
0
2 [报告]
发表于 2009-05-24 00:19 |只看该作者
好像连SQL都没支持全

论坛徽章:
1
射手座
日期:2013-08-21 13:11:46
3 [报告]
发表于 2009-05-24 01:41 |只看该作者
sqllite对sql标准的支持还算好的吧,那个sql ce.....简直连玩具都不如

论坛徽章:
0
4 [报告]
发表于 2009-05-24 20:19 |只看该作者
原帖由 prolj 于 2009-5-24 00:19 发表
好像连SQL都没支持全



SQLite 支持的 SQL 不全面,这个倒没有详细追究过。
如果有可能,可否说一下有哪些 SQL 是不支持的,以后遇到问题也能比较快发现。

选择 SQLite 是因为它足够小,并且支持在内存中加载和保存,刚好符合我的预期。
之前也看过 eXtreame DB ,不过这个不是开源的。

论坛徽章:
0
5 [报告]
发表于 2009-05-24 22:23 |只看该作者
原帖由 iunknown 于 2009-5-24 20:19 发表



SQLite 支持的 SQL 不全面,这个倒没有详细追究过。
如果有可能,可否说一下有哪些 SQL 是不支持的,以后遇到问题也能比较快发现。

选择 SQLite 是因为它足够小,并且支持在内存中加载和保存,刚好符 ...

不好意思,只对其实现感冒,使用不感冒。只是依稀记得,所以说“好像”。

论坛徽章:
0
6 [报告]
发表于 2009-06-14 13:08 |只看该作者
发布 0.2 版。新增特性
1.在数据目录中,增加一层子目录,以便容纳更多的 tokyo cabinet 数据库文件。和 0.1 版的数据文件分布不兼容了。
2.按数据库种类,分成不同的文件。
3.根据配置文件中的 create table 语句,自动修改已经存在的 sqlite 数据库。目前只支持 add column 这一类的修改。

http://code.google.com/p/sphivedb/
http://sphivedb.googlecode.com/files/sphivedb-0.2.src.tar.gz

数据文件和目录的结构示意图



对应的配置文件



  1. [ddl.addrbook]
  2. create table if not exists addrbook ( id  INTEGER PRIMARY KEY AUTOINCREMENT, addr varchar(64), freq int, unique( addr ) );

  3. [ddl.album]
  4. create table if not exists album ( id  INTEGER PRIMARY KEY AUTOINCREMENT, name varchar(64), desc varchar(256), path varchar(256), size int );

复制代码


这里展示了每个用户有两个数据库的情况,一个是 addrbook ,一个是 album 。
1)tokyo cabinet 文件以数据库名作为前缀,以 0 开始编号。
2)同样编号的各种数据库文件放在同一个子目录中。
3)每个子目录存放 100 个编号。

论坛徽章:
0
7 [报告]
发表于 2009-06-21 19:41 |只看该作者

发布 0.3 版本

发布 0.3 版本。新增特性:
增加 spsqlitesvr ,接口和 sphivedbsvr 一样,使用同样的协议格式,唯一不同的就是数据的实际存储方式。spsqlitesvr 不使用 tokyo cabinet 来保存 sqlite 数据库,每个 sqlite 数据库直接对应一个文件。

文件的分布方式如下图所示:

论坛徽章:
5
2015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:53:172015亚冠之水原三星
日期:2015-06-02 16:34:202015年亚冠纪念徽章
日期:2015-10-19 18:13:37程序设计版块每日发帖之星
日期:2015-11-08 06:20:00
8 [报告]
发表于 2009-06-21 19:55 |只看该作者

论坛徽章:
0
9 [报告]
发表于 2009-06-26 22:40 |只看该作者

发布 0.4 版

发布 0.4 版。新增特性
1.支持在一个数据库中创建多个表
2.把 sqlite 的错误代码和错误信息返回给客户端

http://sphivedb.googlecode.com/files/sphivedb-0.4.src.tar.gz

支持多个表,简单的例子如下

  1. [ddl.addrbook]
  2. create table addrgroup ( gid INTEGER PRIMARY KEY AUTOINCREMENT, name varchar(64) );
  3. create table addrbook ( id INTEGER PRIMARY KEY AUTOINCREMENT, gid int, addr varchar(64), freq int, unique( addr ) );
复制代码


假设地址本需要支持分组,有一个 addrgroup 表,addrbook 表有一个 gid 来标识每个地址所属的组。

至此,sphivedb 的功能算是比较完整了。

论坛徽章:
0
10 [报告]
发表于 2009-07-04 21:37 |只看该作者

发布 0.5 版

发布 0.5 版。新增特性
1.增加完整的 C++ client api ,支持多个 server
2.增加 java client api ,还不支持 http 长连接
3.增加了一个压力测试工具,压力测试结果表明 sphivedbsvr 的确比 spsqlitesvr 快
4.修正了一个加锁失败的 bug

http://sphivedb.googlecode.com/files/sphivedb-0.5.src.tar.gz

client 端配置文件,配置连接池和多个 server

  1. $bash# cat sphivedbcli.ini

  2. [SocketPool]
  3. ConnectTimeout = 6
  4. SocketTimeout  = 6
  5. MaxIdlePerEndPoint = 10
  6. MaxIdleTime = 3600

  7. [EndPointTable]
  8. EndPointCount = 2
  9. TableKeyMax = 1000           ; 指明目前使用多少个 cabinet 文件

  10. [EndPoint0]
  11. KeyMin = 0
  12. KeyMax = 499                 ; server0 负责处理的文件是 0-499
  13. ServerIP = 192.168.119.128
  14. ServerPort = 8080

  15. [EndPoint1]
  16. KeyMin = 500
  17. KeyMax = 999                 ; server1 负责处理的文件是 500-999
  18. ServerIP = 192.168.119.129
  19. ServerPort = 8080

复制代码
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP