帮酷LOGO
0 0 评论
  • 显示原文与译文双语对照的内容
文章标签:HTTP  Light  KEY  PAIR  数据  Key Value  
LMDB + H2O = a fast REST key-value database server in C

  • 源代码名称:pearldb
  • 源代码网址:http://www.github.com/willemt/pearldb
  • pearldb源代码文档
  • pearldb源代码下载
  • Git URL:
    git://www.github.com/willemt/pearldb.git
  • Git Clone代码到本地:
    git clone http://www.github.com/willemt/pearldb
  • Subversion代码到本地:
    $ svn co --depth empty http://www.github.com/willemt/pearldb
    Checked out revision 1.
    $ cd repo
    $ svn up trunk
    
  • https://travis-ci.org/willemt/pearldb.png

    什么?

    PearlDB是一个持久的HTTP key-value 对数据库。 它使用 LMDB 存储数据,而使用 H2O用于 HTTP。

    PearlDB完全用C 编写。

    持久连接和管道建立在。

    PearlDB使用 bmon 来批处理LMDB写入。

    目标

    • 速度
    • 低延迟
    • 持久性- 一个HTTP响应表示写在磁盘上
    • 外部简单( RESTful inteface )
    • 内部简洁( 简洁的代码库)
    • 由于CRUD是RESTful的,你可以假设使用一个HTTP反向代理缓存来扩展读取。 你可以使用多个缓存来创建最终一致的数据库

    快速入门

    
    
    
    
    sudo add-apt-repository -y ppa:willemt/pearldb
    
    
    sudo apt-get update
    
    
    sudo apt-get install pearldb
    
    
    
    

    用法

    下面的示例使用优秀的httpie

    启动

    
    
    
    
    build/pearl --daemonize --port 8000 --db_size 1 --pid_file pearl.pid
    
    
    echo daemonizing...
    
    
    
    
    
    
    
    
    daemonizing...
    
    
    
    

    我们得到一个值得到一个值。

    在这种情况下,密钥是"x"。 但如果它不存在的话我们得到 404.

    
    
    
    
    http -h --ignore-stdin 127.0.0.1:8000/x/
    
    
    
    
    
    
    
    
    HTTP/1.1 404 NOT FOUND
    
    
    Date:.. .,.. ... .... ...... GMT
    
    
    Connection: keep-alive
    
    
    Server: h2o/2.2.4
    
    
    content-length: 0
    
    
    
    

    您必须指定一个路径。

    
    
    
    
    http -h --ignore-stdin 127.0.0.1:8000/| head -n 1
    
    
    
    
    
    
    
    
    HTTP/1.1 400 BAD PATH
    
    
    
    

    我们使用PUT创建或者更新 key-value 对。 放置是持久的,我们只在更改磁盘时响应。

    
    
    
    
    echo "MY VALUE" | http -h PUT 127.0.0.1:8000/x/
    
    
    
    
    
    
    
    
    HTTP/1.1 200 OK
    
    
    Date:.. .,.. ... .... ...... GMT
    
    
    Connection: keep-alive
    
    
    Server: h2o/2.2.4
    
    
    transfer-encoding: chunked
    
    
    
    

    在资源上立即发生变更。 这里有完整的隔离插件,因此没有脏读( )。

    现在我们可以通过一个获取来获取数据:

    
    
    
    
    http --ignore-stdin 127.0.0.1:8000/x/
    
    
    
    
    
    
    
    
    MY VALUE
    
    
    
    

    末尾的斜杠是可选的。

    
    
    
    
    http --ignore-stdin 127.0.0.1:8000/x
    
    
    
    
    
    
    
    
    MY VALUE
    
    
    
    

    用户必须预先指定数据库的容量。 PearlDB不支持自动调整大小。 如果将数据库置于容量之上,放置将失败。

    
    
    
    
    head -c 1000000/dev/urandom | base64 > tmp_file
    
    
    du -h tmp_file | awk '{ print $1 }'
    
    
    cat tmp_file | http -h PUT 127.0.0.1:8000/1/
    
    
    rm tmp_file
    
    
    
    
    
    
    
    
    1.3M
    
    
    HTTP/1.1 400 NOT ENOUGH SPACE
    
    
    Date:.. .,.. ... .... ...... GMT
    
    
    Connection: keep-alive
    
    
    Server: h2o/2.2.4
    
    
    content-length: 0
    
    
    
    

    不能置于嵌套资源下。

    
    
    
    
    echo 'DATA' | http -h PUT 127.0.0.1:8000/x/nested_resource/
    
    
    
    
    
    
    
    
    HTTP/1.1 400 BAD PATH
    
    
    Date:.. .,.. ... .... ...... GMT
    
    
    Connection: keep-alive
    
    
    Server: h2o/2.2.4
    
    
    content-length: 0
    
    
    
    

    不带钥匙的 ( POST )

    如果你希望PearlDB为你生成一个密钥,只需使用。

    
    
    
    
    echo "MY POSTED VALUE" | http -h POST 127.0.0.1:8000/> posted.txt
    
    
    cat posted.txt
    
    
    
    
    
    
    
    
    HTTP/1.1 200 OK
    
    
    Date:.. .,.. ... .... ...... GMT
    
    
    Connection: keep-alive
    
    
    Server: h2o/2.2.4
    
    
    location:.. .
    
    
    transfer-encoding: chunked
    
    
    
    

    响应中的位置头包含新创建的资源的URI。 URI是URL安全的base64编码的UUID4.

    
    
    
    
    http --ignore-stdin -b GET 127.0.0.1:8000$(grep location: posted.txt | sed -e 's/location://' | tr -d 'rn')
    
    
    
    
    
    
    
    
    MY POSTED VALUE
    
    
    
    

    提供带有POST的URL ( IE。密钥) 没有意义,并将导致 400.

    
    
    
    
    echo "MY POSTED VALUE" | http -h POST 127.0.0.1:8000/xxxx/
    
    
    
    
    
    
    
    
    HTTP/1.1 400 BAD
    
    
    Date:.. .,.. ... .... ...... GMT
    
    
    Connection: keep-alive
    
    
    Server: h2o/2.2.4
    
    
    content-length: 0
    
    
    
    

    获取密钥

    你可以使用/key/XXX/嵌套资源获取 MATCH 前缀的键。

    
    
    
    
    echo '' | http PUT 127.0.0.1:8000/1/>/dev/null
    
    
    echo '' | http PUT 127.0.0.1:8000/199/>/dev/null
    
    
    echo '' | http PUT 127.0.0.1:8000/102/>/dev/null
    
    
    echo '' | http PUT 127.0.0.1:8000/2/>/dev/null
    
    
    http GET 127.0.0.1:8000/key/1/
    
    
    
    
    
    
    
    
    1
    
    
    102
    
    
    199
    
    
    
    

    没有前缀你就得到所有的钥匙。

    
    
    
    
    http GET 127.0.0.1:8000/key//| sed -e '/^.*=$/d'
    
    
    
    
    
    
    
    
    1
    
    
    102
    
    
    199
    
    
    2
    
    
    x
    
    
    
    

    存在检查

    若要检查是否存在,请使用HEAD方法。 这很好,因为PearlDB不会浪费带宽发送文档正文。

    
    
    
    
    http -h --ignore-stdin HEAD 127.0.0.1:8000/x/
    
    
    
    
    
    
    
    
    HTTP/1.1 200 OK
    
    
    Date:.. .,.. ... .... ...... GMT
    
    
    Connection: keep-alive
    
    
    Server: h2o/2.2.4
    
    
    
    

    删除

    删除是持久的- 我们只在对磁盘进行更改时响应。

    
    
    
    
    http -h --ignore-stdin DELETE 127.0.0.1:8000/x/
    
    
    
    
    
    
    
    
    HTTP/1.1 200 OK
    
    
    Date:.. .,.. ... .... ...... GMT
    
    
    Connection: keep-alive
    
    
    Server: h2o/2.2.4
    
    
    transfer-encoding: chunked
    
    
    
    

    当然,在删除后,密钥不再存在:

    
    
    
    
    http -h --ignore-stdin 127.0.0.1:8000/x/
    
    
    
    
    
    
    
    
    HTTP/1.1 404 NOT FOUND
    
    
    Date:.. .,.. ... .... ...... GMT
    
    
    Connection: keep-alive
    
    
    Server: h2o/2.2.4
    
    
    content-length: 0
    
    
    
    

    比较和交换( CAS )

    一种形式的机会并发控制插件可以通过etag服务。

    当客户端提供首选参数时: 获取请求上的ETag标头我们生成一个 ETag。 如果与ETag匹配,客户端可以使用来执行条件更新( ),。 如果ETag已经更改,则放置操作将失败。 ,操作非常好,因为没有锁定;如果一个客户端的一个,操作失败,那么 IE 就成功了。 已经有进展了。

    设想两个客户端试图更新相同的密钥。 客户端 1请求 ETag。 ETag是通过ETag头提供的。

    
    
    
    
    echo 'SWEET DATA' | http -h --ignore-stdin PUT 127.0.0.1:8000/x/>/dev/null
    
    
    http -h --ignore-stdin GET 127.0.0.1:8000/x/Prefers:ETag > etag.txt
    
    
    cat etag.txt
    
    
    
    
    
    
    
    
    HTTP/1.1 200 OK
    
    
    Date:.. .,.. ... .... ...... GMT
    
    
    Connection: keep-alive
    
    
    Server: h2o/2.2.4
    
    
    etag:.. .
    
    
    transfer-encoding: chunked
    
    
    
    

    如果客户端 1再次请求 ETag,则发送相同的ETag:

    
    
    
    
    http -h --ignore-stdin GET 127.0.0.1:8000/x/Prefers:ETag > etag2.txt
    
    
    cat etag2.txt
    
    
    diff <(grep etag etag.txt) <(grep etag etag2.txt)
    
    
    
    
    
    
    
    
    HTTP/1.1 200 OK
    
    
    Date:.. .,.. ... .... ...... GMT
    
    
    Connection: keep-alive
    
    
    Server: h2o/2.2.4
    
    
    etag:.. .
    
    
    transfer-encoding: chunked
    
    
    
    

    客户端 2在x 上执行。 这将使ETag无效。

    
    
    
    
    echo 'SURPRISE' | http -h PUT 127.0.0.1:8000/x/
    
    
    
    
    
    
    
    
    HTTP/1.1 200 OK
    
    
    Date:.. .,.. ... .... ...... GMT
    
    
    Connection: keep-alive
    
    
    Server: h2o/2.2.4
    
    
    transfer-encoding: chunked
    
    
    
    

    客户端 1使用条件放置来使用if匹配标记更新"x"。 由于ETag失效,我们不提交,并且响应 412个先决条件失败。

    
    
    
    
    echo 'MY NEW VALUE BASED OFF OLD VALUE' | http -h PUT 127.0.0.1:8000/x/If-Match:$(grep etag: etag.txt | sed -e 's/etag://' | tr -d 'rn')
    
    
    
    
    
    
    
    
    HTTP/1.1 412 BAD ETAG
    
    
    Date:.. .,.. ... .... ...... GMT
    
    
    Connection: keep-alive
    
    
    Server: h2o/2.2.4
    
    
    content-length: 0
    
    
    
    

    一旦出现这种情况,我们就可以重新尝试 PUT GET。

    
    
    
    
    http -h GET 127.0.0.1:8000/x/Prefers:ETag > etag3.txt
    
    
    cat etag3.txt
    
    
    
    
    
    
    
    
    HTTP/1.1 200 OK
    
    
    Date:.. .,.. ... .... ...... GMT
    
    
    Connection: keep-alive
    
    
    Server: h2o/2.2.4
    
    
    etag:.. .
    
    
    transfer-encoding: chunked
    
    
    
    

    PUT将成功,因为ETag仍然有效。

    
    
    
    
    echo 'NEW VALUE' | http -h PUT 127.0.0.1:8000/x/If-Match:$(grep etag: etag3.txt | sed -e 's/etag://' | tr -d 'rn')
    
    
    
    
    
    
    
    
    HTTP/1.1 200 OK
    
    
    Date:.. .,.. ... .... ...... GMT
    
    
    Connection: keep-alive
    
    
    Server: h2o/2.2.4
    
    
    transfer-encoding: chunked
    
    
    
    

    但是,如果我们再次使用 ETag,它将会失败。

    
    
    
    
    echo 'NEW VALUE2' | http -h PUT 127.0.0.1:8000/x/If-Match:$(grep etag: etag3.txt | sed -e 's/etag://' | tr -d 'rn')
    
    
    
    
    
    
    
    
    HTTP/1.1 412 BAD ETAG
    
    
    Date:.. .,.. ... .... ...... GMT
    
    
    Connection: keep-alive
    
    
    Server: h2o/2.2.4
    
    
    content-length: 0
    
    
    
    

    关于etag的说明:

    • 重新启动时,PearlDB将丢失所有ETag信息
    • 在启动PearlDB时产生一个随机的ETag前缀
    • etag应具有短寿命( IE。 <1日)

    命令行选项

    你可以使用选项方法检查资源可以使用哪些HTTP方法。 当HAProxy使用选项方法作为 healthcheck 时,这很有用。

    
    
    
    
    http -h --ignore-stdin OPTIONS 127.0.0.1:8000/x/
    
    
    
    
    
    
    
    
    HTTP/1.1 200 OK
    
    
    Date:.. .,.. ... .... ...... GMT
    
    
    Connection: keep-alive
    
    
    Server: h2o/2.2.4
    
    
    allow: HEAD,GET,PUT,DELETE,OPTIONS
    
    
    transfer-encoding: chunked
    
    
    
    
    
    
    
    
    http -h --ignore-stdin OPTIONS 127.0.0.1:8000/
    
    
    
    
    
    
    
    
    HTTP/1.1 200 OK
    
    
    Date:.. .,.. ... .... ...... GMT
    
    
    Connection: keep-alive
    
    
    Server: h2o/2.2.4
    
    
    allow: POST,OPTIONS
    
    
    transfer-encoding: chunked
    
    
    
    

    关闭

    
    
    
    
    cat pearl.pid | xargs kill -9
    
    
    echo shutdown
    
    
    
    
    
    
    
    
    shutdown
    
    
    
    

    建筑

    
    
    
    
    sudo apt-get install git cmake automake libtool libssl-dev
    
    
    make libuv
    
    
    make libh2o
    
    
    make libck
    
    
    make
    
    
    
    


    文章标签:数据  HTTP  Light  KEY  Key Value  PAIR  

    Copyright © 2011 HelpLib All rights reserved.    知识分享协议 京ICP备05059198号-3  |  如果智培  |  酷兔英语