为了账号安全,请及时绑定邮箱和手机立即绑定

基于leveldb引擎的高性能Nosql服务ssdb的测试使用

标签:
NoSql

前言:

SSDB是一个开源的高性能数据库服务器, 使用Google 的 LevelDB作为存储引擎, 大家有可能没听过leveldb的名字,但是淘宝的开源nosql tair大家应该有所耳闻吧,他也是基于leveldb做的开发。ssdb支持T级别的数据, 同时支持类似Redis中的zset和hash等数据结构, 在同时需求高性能和大数据的条件下, 是一个可以代替Redis的方案.

其实ssdb他的推出就是为了顶替redis的高可用性以及高度依赖硬盘的缺点。(当然他的稳定性还有待线下测试,毕竟是个nosql中的新人)

ssdb是一个持久化存储的KV系统,和Memcached、Redis这种内存型的KV系统不同,ssdb不会像Redis一样狂吃内存,而是将大部分数据存储到磁盘上。

    我个人的经验来说,redis的双主方案不靠谱,我以前写过一个keepalived redis的高可用性方案,但是这个东西,也是不好用的,切换的时候,会出现将近一分钟的恢复延迟。   配置和操作起来也算简单,出问题的时候,把redis 从改成主,也要注意下kv的数据,如果是那种实时性很强的数据,就要考虑到是否要把操作的接口暂时给堵塞起来,不然用户得到以前的数据总归不好,等数据都同步ok后,就放开堵塞。

keepalived redis 在大量的读写场景下,这时候的切换会造成不小的问题的。(sina 微博搞定了多主的方案,估计是做了很多的二次开发。)

SSDB支持多主双主的架构  SSDB分布式框架

:https://github.com/ideawu/ssdb/wiki/Replication

两个或者更多的主服务器. 当其中一部分出现故障时, 剩余的主服务器仍然能正常接受写请求, 来保证服务是可以正常使用的。

SSDB 的主要特点:

支持 zset, map 数据结构, 可替代 Redis

特别适合存储大量集合数据

使用 Google LevelDB 作为存储引擎

支持主从同步, 多主同步

客户端支持 PHP, C++, Python, Lua, Java, Ruby, nodejs, Go 等

内存占用极少

ssdb 项目地址:

https://github.com/ideawu/ssdb

安装及服务配置的方法:

wget --no-check-certificate https://github.com/ideawu/ssdb/archive/master.zip

unzip master

cd ssdb-master

make

#optional, install ssdb in /usr/local/ssdb

sudo make install

start master

./ssdb-server ssdb.conf

or start as daemon

./ssdb-server -d ssdb.conf

start slave

./ssdb-server ssdb_slave.conf

ssdb command line

./tools/ssdb-cli -p 8888

stop ssdb-server

kill `cat ./var/ssdb.pid`

需要提前先安装jemalloc内存管理器的,不然无法继续 ~

wKiom1LH7cOgVw8uAAFAaS_3n4c191.jpg

安装成功,然后跑一下 ~

wKioL1LH7hjD_HuNAADIxfTPoPU461.jpg

果然是大量兼容redis的 ~

wKioL1LH8AnyGr49AACjryGeZPo648.jpg

ssdb也可以用redis里面比较常用的hash。

#xiaorui.cc

[root@65 ~]# ssdb-cli

ssdb (cli) - ssdb command line tool.

Copyright (c) 2012-2013 ideawu.com

'h' or 'help' for help, 'q' to quit.

ssdb 127.0.0.1:8888> hset a one 1

ok

(0.000 sec)

ssdb 127.0.0.1:8888> hset a two 2

ok

(0.000 sec)

ssdb 127.0.0.1:8888> hset a three 3

ok

(0.000 sec)

ssdb 127.0.0.1:8888> hscan a "" "" 10

key             value

-------------------------

  one             : 1

  three           : 3

  two             : 2

3 result(s) (0.000 sec)hai

根据结果来排序的存储类型 zset  !

ssdb 127.0.0.1:8888>

ssdb 127.0.0.1:8888>

ssdb 127.0.0.1:8888>

ssdb 127.0.0.1:8888>

ssdb 127.0.0.1:8888> zsize b

0

(0.000 sec)

ssdb 127.0.0.1:8888> zset  b b1 1

ok

(0.000 sec)

ssdb 127.0.0.1:8888> zset b b2 2

ok

(0.000 sec)

ssdb 127.0.0.1:8888> zset b b3 33

ok

(0.000 sec)

ssdb 127.0.0.1:8888> zset b b4 8888

ok

(0.000 sec)

ssdb 127.0.0.1:8888> zscan b "" "" 10

error: client_error

(0.000 sec)

ssdb 127.0.0.1:8888> zscan b "" "" "" 10

key             score

-------------------------

  b1             : 1

  b2             : 2

  b3             : 33

  b4             : 8888

4 result(s) (0.000 sec)

ssdb 127.0.0.1:8888>

ssdb 127.0.0.1:8888> zsize b

4

(0.000 sec)

ssdb 127.0.0.1:8888> zsize b

4

(0.000 sec)

ssdb 127.0.0.1:8888> zscan b "" "" "" 10

key             score

-------------------------

  b1             : 1

  b2             : 2

  b3             : 33

  b4             : 8888

4 result(s) (0.000 sec)

ssdb 127.0.0.1:8888> zclear b

4

(0.000 sec)

ssdb 127.0.0.1:8888> zscan b "" "" "" 10

key             score

-------------------------

0 result(s) (0.000 sec)

ssdb 127.0.0.1:8888>

新版的ssdb也出来个ttl的东西,来控制kv的生效时间,很赞 ~

ssdb 127.0.0.1:8888> setx yoururl xiaorui.cc  10

ok

(0.000 sec)

ssdb 127.0.0.1:8888> get yoururl

xiaorui.cc

(0.000 sec)

ssdb 127.0.0.1:8888> get yoururl

xiaorui.cc

(0.000 sec)

ssdb 127.0.0.1:8888> get yoururl

xiaorui.cc

(0.000 sec)

ssdb 127.0.0.1:8888> get yoururl

xiaorui.cc

(0.000 sec)

ssdb 127.0.0.1:8888> get yoururl

not_found

(0.000 sec)

ssdb 127.0.0.1:8888> get yoururl

not_found

为了方便操作ssdb服务可以写成一个启动关闭脚本。

# /bin/sh

#

# chkconfig:345 98 98

# description: SSDB is a fast NoSQL database for storing big list of billions of elements

# processname:ssdb

case "$1" in

  'start')

    /usr/local/ssdb/ssdb-server -d /usr/local/ssdb/ssdb.conf

    echo "ssdb started."

    ;;

  'stop')

    kill `cat /usr/local/ssdb/var/ssdb.pid`

    echo "ssdb stopped."

    ;;

  'restart')

    kill `cat /usr/local/ssdb/var/ssdb.pid`

    echo "ssdb stopped."

    sleep 0.5

    /usr/local/ssdb/ssdb-server -d /usr/local/ssdb/

ssdb.conf

    echo "ssdb started."

    ;;

  *)

    echo "Usage: $0 {start|stop|restart}"

    exit 1

  ;;

esac

exit 0

直接来个redis和ssdb的命令对比 !

Redis   SSDB

kv  get get

set set

del del

incr/incrBy incr

decr/decrBy decr

getMultiple multi_get

setMultiple multi_set

del(multiple)   multi_del

keys    scan(for kv type only)

hashmap hget    hget

hset    hset

hdel    hdel

hIncrBy hincr

hDecrBy hdecr

hKeys   hkeys

hVals   hscan

hMGet   multi_hget(in schedule)

hMSet   multi_hset(in schedule)

hLen    hsize(in schedule)

zset    zScore  zget

zAdd    zset

zRem    zdel

zRange 

zRangeByScore   zscan

zIncrBy zincr

zDecrBy zdecr

zCount 

zCard   zsize(in schedule)

我们项目有很多是python写的,看了下支持的语言接口,ssdb也是支持python的,我这边就简单跑下例子 ~     果然和redis很相像的哈!

[root@65 ~]# ipython

Python 2.6.6 (r266:84292, Feb 21 2013, 23:54:59)

Type "copyright", "credits" or "license" for more information.

IPython 0.10 -- An enhanced Interactive Python.

?         -> Introduction and overview of IPython's features.

%quickref -> Quick reference.

help      -> Python's own help system.

object?   -> Details about 'object'. ?object also works, ?? prints more.

In [1]:  import pyssdb

   ...:

In [2]: c = pyssdb.Client()

In [3]: c.set('key', 'value')

Out[3]: 1

In [4]: c.get('key')

Out[4]: 'value'

In [5]: c.hset('51cto', 'devops', 'xiaorui.cc') 

Out[5]: 1

In [6]: c.hset('51cto', 'autops', 'xiaorui.cc')   

Out[6]: 1

In [9]: c.hget('51cto','')

In [10]: c.hget('51cto','devops')

Out[10]: 'xiaorui.cc'

In [13]: c.hget('51cto','autops')

Out[13]: 'xiaorui.cc'

In [14]: c.incr('counter')

Out[14]: 1

In [15]: c.incr('counter')

Out[15]: 2

In [16]: c.incr('counter')

Out[16]: 3

In [17]: c.incr('counter')

Out[17]: 4

In [18]: c.keys('a', 'z', 1)

Out[18]: ['counter']

ssdb的社区和推广的博客很热的,经常看到一些积极的问答,通过问答我自己也学到了不少东西。想让redis转到ssdb,成本很小的,只需要改改几个特定的接口就可以啦,连ssdb的客户端模块都不需要,可以直接调用redis来操作ssdb数据库。ssdb在国内的话,据说360游戏部门用的不少 ~   但是不管怎么说,ssdb属于新兴的东西,稳定性还是有待考察的,就想当初考察mongodb一样。

©著作权归作者所有:来自51CTO博客作者rfyiamcool的原创作品,谢绝转载,否则将追究法律责任

python ssdbnosql ssdbssdb redisNosql/Mysql


点击查看更多内容
TA 点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
  • 推荐
  • 评论
  • 收藏
  • 共同学习,写下你的评论
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消