Redis 替代品 SSDB 介绍及使用

SSDB 是一个 C/C++ 语言开发的高性能开源 NoSQL 数据库服务器, 支持 Key-value, Keyhashmap, Key-zset(sorted set) 等数据结构, 十分适合存储数亿条级别的列表, 排序表等集合数据, 是 Redis 的替代和增强方案。
特性:
1.替代 Redis 数据库, Redis 的 100 倍容量
2.LevelDB 网络支持, 使用 C/C++ 开发
3.Redis API 兼容, 支持 Redis 客户端
4.适合存储集合数据, 如 list, hash, zset…
5.客户端 API 支持的语言包括: C++, PHP, Python,Cpy,Java,Nodejs,Ruby, Go 等
6.持久化的队列服务

7.主从复制,支持双主(双 master)和多主架构, 负载均衡

8.图形化管理工具(phpssdbadmin)

架构图:

SSDB 具有和 Redis 相似的 API, 持的客户端包括: PHP, C++, Python, Java, Lua, Ruby,Nodejs,Go,etc。

官网地址:http://ssdb.io/
中文地址:http://ssdb.io/zh_cn/
项目地址: https://github.com/ideawu/ssdb
项目文档:https://github.com/ideawu/ssdb-docs
博客文档:http://www.ideawu.net/blog/category/ssdb

一、SSDB 与 Redis 比较

二、安装部署

SSDB 不仅仅支持主从,主主模式,还支持多主模式,下面我们以主主的模式演示一下 SSDB 的安装和使用。
环境:
192.168.36.54:8888
192.168.36.189:8888
1.安装
mkdir /home/slim/ssdb
wget https://github.com/ideawu/ssdb/archive/master.zip
unzip master
cd ssdb-master
make PREFIX=/home/slim/ssdb
make PREFIX=/home/slim/ssdb install
2.配置
SSDB 的配置文件是一种层级 key-value 的静态配置文件, 通过一个 TAB 缩进来表示层级关系. 以 ‘#’ 号开始的行是注释。

print?

1.  # ssdb-server config  
2.  # MUST indent by TAB!  
3.    
4.  # relative to path of this file, directory must exists  
5.  work_dir = ./var  
6.  pidfile = ./var/ssdb.pid  
7.    
8.  server:  
9.          ip: 192.168.36.54  
10.          port: 8888  
11.          # bind to public ip  
12.          #ip: 0.0.0.0  
13.          # format: allow|deny: all|ip_prefix  
14.          # multiple allows or denys is supported  
15.          #deny: all  
16.          #allow: 127.0.0.1  
17.          #allow: 192.168  
18.          # auth password must be at least 32 characters  
19.          #auth: very-strong-password  
20.    
21.  replication:  
22.          binlog: yes  
23.          # Limit sync speed to *MB/s, -1: no limit  
24.          sync_speed: -1  
25.          slaveof:  
26.                  # to identify a master even if it moved(ip, port changed)  
27.                  # if set to empty or not defined, ip:port will be used.  
28.                  id: svc_1  
29.                  # sync|mirror, default is sync  
30.                  type: mirror  
31.                  ip: 192.168.36.189  
32.                  port: 8888  
33.    
34.  logger:  
35.          level: debug  
36.          output: log.txt  
37.          rotate:  
38.                  size: 1000000000  
39.    
40.  leveldb:  
41.          # in MB  
42.          cache_size: 500  
43.          # in KB  
44.          block_size: 32  
45.          # in MB  
46.          write_buffer_size: 64  
47.          # in MB  
48.          compaction_speed: 1000  
49.          # yes|no  
50.          compression: yes  

另一台机器配置类似。配置说如下:

workdir: ssdb-server 的工作目录, 启动后, 会在这个目录下生成 data 和 meta 两个目录, 用来保存 LevelDB 的数据库文件. 这个目录是相对于 ssdb.conf 的相对路径, 也可以指定绝对路径。
server: ip 和 port 指定了服务器要监听的 IP 和端口号. 如果 ip 是 0.0.0.0, 则表示绑定所有的 IP. 基于安全考虑, 可以将 ip 设置为 127.0.0.1, 这样, 只有本机可以访问了.如果要做更严格的更多的网络安全限制, 就需要依赖操作系统的 iptables。
replication: 用于指定主从同步复制. slaveof.ip, slaveof.port 表示, 本台 SSDB 服务器将从这个目标机上同步数据(也即这个配置文件对应的服务器是 slave). 你可以参考 ssdbslave.conf 的配制。
logger: 配置日志记录. level 是日志的级别, 可以是 trace|debug|info|error. output 是日志文件的名字, SSDB 支持日志轮转, 在日志文件达到一定大小后, 将 log.txt 改名, 然后创建一个新的 log.txt。
leveldb: 配置 LevelDB 的参数. 你一般想要修改的是 cache_size 参数, 用于指定缓存大小. 适当的缓存可以提高读性能, 但是过大的缓存会影响写性能。

关于主-从、主-主及多主的配置请参考:http://ssdb.io/docs/zh_cn/replication.html
2.启动服务

启动:./ssdb-server -d ssdb.conf

关闭:./ssdb-server ssdb.conf -s stop

ssdb-server 命令说明:

print?

1.   ./ssdb-server -h  
2.  ssdb-server 1.9.0  
3.  Copyright (c) 2012-2015 ssdb.io  
4.    
5.  Usage:  
6.      ./ssdb-server [-d] /path/to/ssdb.conf [-s start|stop|restart]  
7.  Options:  
8.      -d    run as daemon  
9.      -s    option to start|stop|restart the server  
10.      -h    show this message  

三、ssdb 客户端工具使用

print?

1.  ./ssdb-cli -h 192.168.36.189 -p 8888  
2.  ssdb 192.168.36.189:8888> set key abc  
3.  ok  
4.  (0.002 sec)  
5.  ssdb 192.168.36.189:8888> get key  
6.  abc  
7.  (0.001 sec)  

测试一下分别在两台机器添加数据,都可以正常同步。

ssdb-cli 命令说明:

print?

1.  ssdb 192.168.36.189:8888> help  
2.    
3.  # display ssdb-server status  
4.          info  
5.  # escape/do not escape response data  
6.          : escape yes|no  
7.  # export/import  
8.          export [-i] out_file  
9.                  -i      interactive mode  
10.          import in_file  
11.    
12.  see http://ssdb.io/docs/php/ for commands details  

info:返回状态消息

escape:对命令返回数据进行编码

export/import:导入导出数据

四、ssdb 服务监控

info 命令返回的信息

print?

1.  ssdb 192.168.36.189:8888> info  
2.  version  
3.          1.9.0  
4.  links  
5.          1  
6.  total_calls  
7.          6  
8.  dbsize  
9.          0  
10.  binlogs  
11.              capacity : 10000000  
12.              min_seq  : 0  
13.              max_seq  : 2  
14.  replication  
15.          client 192.168.36.54:55472  
16.              type     : mirror  
17.              status   : SYNC  
18.              last_seq : 2  
19.  replication  
20.          slaveof 192.168.36.54:8888  
21.              id         : svc_1  
22.              type       : mirror  
23.              status     : SYNC  
24.              last_seq   : 2  
25.              copy_count : 0  
26.              sync_count : 1  
27.  servkeyrange 28. kv : "" - "" 29. hash: "" - "" 30. zset: "" - "" 31. list: "" - "" 32. datakeyrange 33. kv : "key" - "xxx" 34. hash: "" - "" 35. zset: "" - "" 36. list: "" - "" 37. leveldb.stats 38. Compactions 39. Level Files Size(MB) Time(sec) Read(MB) Write(MB) 40. -------------------------------------------------- 41. 42. 21 result(s) (0.002 sec) 

1.binlogs
当前实例的写操作状态.
capacity: binlog 队列的最大长度
minseq: 当前队列中的最小 binlog 序号
maxseq: 当前队列中的最大 binlog 序号
2.replication
可以有多条 replication 记录. 每一条表示一个连接进来的 slave(client), 或者一个当前服务器所连接的 master(slaveof).
slaveof|client ip:port, 远端 master/slave 的 ip:port。
type: 类型, sync|mirror.
status: 当前同步状态, DISCONNECTED|INIT|OUTOFSYNC|COPY|SYNC。
lastseq: 上一条发送或者收到的 binlog 的序号。
slaveof.id: master 的 id(这是从 slave’s 角度来看的, 你永远不需要在 master 上配置它自己的 id)。
slaveof.copycount: 在全量同步时, 已经复制的 key 的数量。
slaveof.sync_count: 发送或者收到的 binlog 的数量。
3.关于 status:
DISCONNECTED: 与 master 断开了连接, 一般是网络中断。
INIT: 初始化状态。
OUTOFSYNC: 由于短时间内在 master 有大量写操作, 导致 binlog 队列淘汰, slave 丢失同步点, 只好重新复制全部的数据。
COPY: 正在复制基准数据的过程中, 新的写操作可能无法及时地同步。
SYNC: 同步状态是健康的.
4.判断同步状态
binlogs.max_seq 是指当前实例上的最新一次的写(写 / 更新 / 删除)操作的序号, replication.client.lastseq 是指已发送给 slave 的最新一条 binlog 的序号。所以, 如果你想判断主从同步是否已经同步到位(实时更新), 那么就判断 binlogs.maxseq 和 replication.client.lastseq 是否相等。
五、备份与恢复
1.备份
支持了在线备份功能, 可以在不停止服务的情况下备份服务器数据,这个功能让 SSDB 更加成为一个真正生产环境的存储服务器。
./ssdb-dump 192.168.36.189 8888 ./backupdir
这条命令从监听在 192.168.36.189:8888 的 SSDB 服务器上备份全量的数据, 保存到本地新创建的目录 backupdir, 这个目录其实是一个 LevelDB 的数据库(db)。
2.恢复
将 backupdir 传输到服务器, 修改新 ssdb 服务器的配置文件, 将 SSDB 使用的数据库名改为 backup_dir, 然后重启 SSDB 即可。
3.使用主从(Master-Slave)架构实时备份

注意:
1.一般, 建议你将 logger.level 设置为 debug 级别。详情参考:日志解读
2.利用配置文件的 deny, allow 指令限制可信的来源 IP 访问,提高服务的安全。
3.SSDB 的配置文件使用一个 TAB 来表示一级缩进, 不要使用空格来缩进, 无论你用 2 个, 3 个, 4 个, 或者无数个空格都不行!
4.一定要记得修改你的 Linux 内核参数, 关于 max open files(最大文件描述符数)的内容,详情参考:构建 C1000K 的服务器

参考文档:
1.SSDB 入门基础
2.SSDB Redis 替代品