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

前言:

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



安装及服务配置的方法:


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
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。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#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  !


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
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的生效时间,很赞 ~

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
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服务可以写成一个启动关闭脚本。


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
# /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的命令对比 !


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
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很相像的哈!


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
[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一样。




 本文转自 rfyiamcool 51CTO博客,原文链接:http://blog.51cto.com/rfyiamcool/1348561,如需转载请自行联系原作者




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值