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

本文涉及的产品
云数据库 Redis 版,社区版 2GB
推荐场景:
搭建游戏排行榜
简介:

前言:

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,如需转载请自行联系原作者




相关实践学习
基于Redis实现在线游戏积分排行榜
本场景将介绍如何基于Redis数据库实现在线游戏中的游戏玩家积分排行榜功能。
云数据库 Redis 版使用教程
云数据库Redis版是兼容Redis协议标准的、提供持久化的内存数据库服务,基于高可靠双机热备架构及可无缝扩展的集群架构,满足高读写性能场景及容量需弹性变配的业务需求。 产品详情:https://www.aliyun.com/product/kvstore     ------------------------------------------------------------------------- 阿里云数据库体验:数据库上云实战 开发者云会免费提供一台带自建MySQL的源数据库 ECS 实例和一台目标数据库 RDS实例。跟着指引,您可以一步步实现将ECS自建数据库迁移到目标数据库RDS。 点击下方链接,领取免费ECS&RDS资源,30分钟完成数据库上云实战!https://developer.aliyun.com/adc/scenario/51eefbd1894e42f6bb9acacadd3f9121?spm=a2c6h.13788135.J_3257954370.9.4ba85f24utseFl
相关文章
|
1月前
javaWeb服务详解【客户端调用】(含源代码,测试通过,注释) ——Dept实体类
javaWeb服务详解【客户端调用】(含源代码,测试通过,注释) ——Dept实体类
8 0
|
1月前
javaWeb服务详解(含源代码,测试通过,注释) ——Dept的Dao层
javaWeb服务详解(含源代码,测试通过,注释) ——Dept的Dao层
10 0
|
1月前
javaWeb服务详解【客户端调用】(含源代码,测试通过,注释) ——测试
javaWeb服务详解【客户端调用】(含源代码,测试通过,注释) ——测试
8 0
|
1月前
javaWeb服务详解【客户端调用】(含源代码,测试通过,注释) ——Emp实体类
javaWeb服务详解【客户端调用】(含源代码,测试通过,注释) ——Emp实体类
7 0
|
1月前
javaWeb服务详解(含源代码,测试通过,注释) ——web.xml
javaWeb服务详解(含源代码,测试通过,注释) ——web.xml
7 0
|
1月前
javaWeb服务详解(含源代码,测试通过,注释) ——applicationContext.xml
javaWeb服务详解(含源代码,测试通过,注释) ——applicationContext.xml
6 0
|
1月前
javaWeb服务详解(含源代码,测试通过,注释) ——Emp的Service层
vjavaWeb服务详解(含源代码,测试通过,注释) ——Emp的Service层
5 0
|
1月前
javaWeb服务详解(含源代码,测试通过,注释) ——Dept的Service层
javaWeb服务详解(含源代码,测试通过,注释) ——Dept的Service层
8 0
|
1月前
javaWeb服务详解(含源代码,测试通过,注释) ——Emp的Dao层
javaWeb服务详解(含源代码,测试通过,注释) ——Emp的Dao层
7 0
|
1月前
javaWeb服务详解(含源代码,测试通过,注释) ——Emp实体类
javaWeb服务详解(含源代码,测试通过,注释) ——Emp实体类
7 0

热门文章

最新文章