SSDB 数据库
SSDB数据库
SSDB是一套基于LevelDB存储引擎的非关系型数据库(NOSQL),可用于取代Redis,更适合海量数据的存储。
另外,rocksdb是FB在LevelDB的二次开发版本,因此也存在使用RocksDB作为存储引擎的SSDB版本,可以参考这里。
编译和安装
wget --no-check-certificate https://github.com/ideawu/ssdb/archive/master.zip
unzip master
cd ssdb-master
make
# 将安装在 /usr/local/ssdb 目录下
sudo make install
启动服务
# 启动主库
./ssdb-server ssdb.conf # 或者启动为后台进程
./ssdb-server -d ssdb.conf # 启动 ssdb 命令行客户端
./tools/ssdb-cli -p # 停止 ssdb-server
./ssdb-server ssdb.conf -s stop
# 对于旧版本
kill `cat ./var/ssdb.pid`
配置文件
ssdb.conf:
work_dir = ./var
pidfile = ./var/ssdb.pid server:
ip: 127.0.0.1
port: 8888
# bind to public ip
#ip: 0.0.0.0
# format: allow|deny: all|ip_prefix
# multiple allows or denys is supported
#deny: all
#allow: 127.0.0.1
#allow: 192.168
# auth password must be at least 32 characters
#auth: very-strong-password replication:
binlog: yes
# Limit sync speed to *MB/s, -1: no limit
sync_speed: -1
slaveof:
# to identify a master even if it moved(ip, port changed)
# if set to empty or not defined, ip:port will be used.
#id: svc_2
# sync|mirror, default is sync
#type: sync
#ip: 127.0.0.1
#port: 8889 logger:
level: debug
# 支持的日志级别有:debug, warn, error, fatal
.
output: log.txt
rotate:
size: 1000000000 leveldb:
# in MB
cache_size: 500
# in KB
block_size: 32
# in MB
write_buffer_size: 64
# in MB
compaction_speed: 1000
# yes|no
compression: yes
一个 ssdb-server 实例占用的内存瞬时(有可能, 而且即使达到, 也只是持续短时间)最高达到(MB):
cache_size + write_buffer_size * 66 + 32
这是对于压缩选项没有开启的情况, 如果 compression: yes, 计算公式是:
cache_size + 10 * write_buffer_size * 66 + 32
你可以调整配置参数, 限制 ssdb-server 的内存占用.
SSDB命令
与Redis类似,SSDB也支持多种数据结构(KV list, hash, soreted set),下面列出了常用命令:
dbsize # 返回数据库占用空间,以字节为单位
flushdb # 清空数据库
info # 返回服务器信息
auth password # 验证访问密码
KV结构
set key value
setx key value ttl # 设置key的同时设置ttl
setnx key value # 若key已存在,则不设置
multi_set key1 value1 key2 value2 ...
exists key
get key
getset key value # 更新key,并返回旧value
multi_get key1 key2 ...
keys key_start key_end limit # 返回指定范围内的key,左开右闭区间(SSDB的key有序存储)
rkeys key_start key_end limit
scan key_start key_end limit
rscan key_start key_end limit
expire key ttl
ttl key
del key
multi_del key1 key2 ...
substr key start size # 返回子串
strlen key
incr key [num]
getbit key offset
setbit key offset val
bitcount key [start] [end]
countbit key start size
hashmap结构
hset name key value
multi_hset name key1 value1 key2 value2 ...
hget name key
multi_hget name key1 key2 ...
hgetall name
hkeys name key_start key_end
hscan key_start key_end limit
hrscan key_start key_end limit
hdel name key # 删除一个字段
hclear name # 删除所有字符
multi_hdel name key1 key2 ...
hexists name key
hsize name
hincr name key [num]
hlist name_start name_end limit # 列出指定范围的所有hash表
hrlist name_start name_end limit
list结构
qpush_front name item1 item2 ... # 往队头插入新元素
qpush_back name item1 item2 ... # 往队尾插入新元素
qpop_front name size # 从队头弹出若干个元素
qpop_back name size # 从队尾弹出若干个元素
qtrim_front name size # 从队头移除多个元素
qtrim_back name size # 从队尾移除多个元素
qfront name # 返回队头
qback name # 返回队尾
qsize name # 返回队长
qget name index # 返回指定位置元素
qset name index val
qrange name offset limit # 返回一个切片
qslice name begine end # 返回一个切片
qclear name
qlist name_start name_end limit
qrlist name_start name_end limit
sorted set结构
zset name key socre
zget name key
zdel name key
zexists name key
zsize name
zincr name key num
导出/导入
SSDB才有LSM模型,也就是说它的key是有序存储的,因此,我们可以导出所有key的数据,也可以导出指定范围内key的数据。
1、使用ssdb-cli 命令行客户端
导出整个数据库:
# backup current database into file backup.ssdb
ssdb 127.0.0.1:> export backup.ssdb
按照 Key 区间导出数据库(交互模式)
ssdb 127.0.0.1:> export -i backup.ssdb
input KV range[start, end]:
start(inclusive, default none): a
end(inclusive, default none): z
input HASH range:
start(inclusive, default none):
end(inclusive, default none):
input ZSET range:
start(inclusive, default none):
end(inclusive, default none):
input QUEUE range:
start(inclusive, default none):
end(inclusive, default none):
命令 export -i backup.ssdb 将导出区间 [a, z] 内的 KV, 所有的 HASH, ZSET, QUEUE.
导入命令:
# import backup.ssdb into current database
ssdb 127.0.0.1:> import backup.ssdb
import 命令会把数据库中的相同 key 给替换。
2、SSDB 另一个专门用于导出工具是 ssdb-dump,用法如下:
./tools/ssdb-dump ip port output_folder
目录 output_folder 必须不存在, 因为 ssdb-dump 会创建这个目录. 导出之后, 这个目录里将有两个子目录, data 目录里包含着数据, 还有一个空的 meta 目录.
如果想从导出的目录恢复数据,可以将 output_folder 目录拷贝到你的服务器上面,然后修改你的 ssdb.conf 配置文件, 将 work_dir 指向 output_folder 目录, 然后重启 ssdb-server。
限制
最大 Key 长度 200 字节
最大 Value 长度 31MB
最大请求或响应长度 31MB
单个 HASH 中的元素数量 9,223,372,036,854,775,807
单个 ZSET 中的元素数量 9,223,372,036,854,775,807
单个 QUEUE 中的元素数量 9,223,372,036,854,775,807
命令最多参数个数 所有参数加起来体积不超过 31MB 大小
Replication
Redis的主从复制在主库挂了的时候就无法再写入数据了,而SSDB不但支持主-从结构,还支持多主结构。
主-从配置
#server1:
replication:
slaveof:
#server2:
replication:
slaveof:
id: svc_1
# sync|mirror, default is sync
type: sync
ip: 127.0.0.1
port: 8888
主-主配置
#server1:
replication:
slaveof:
id: svc_2
# sync|mirror, default is sync
type: mirror
ip: 127.0.0.1
port: 8889
#server2:
replication:
slaveof:
id: svc_1
# sync|mirror, default is sync
type: mirror
ip: 127.0.0.1
port: 8888
多主配置
在一组一共包含 n 个实例的 SSDB 实例群中, 每一个实例必须 slaveof 其余的 n-1 个实例.
replication:
slaveof:
id: svc_1
# sync|mirror, default is sync
type: mirror
ip: 127.0.0.1
port: 8888
slaveof:
id: svc_2
# sync|mirror, default is sync
type: mirror
ip: 127.0.0.1
port: 8889
# ... more slaveof
监控
info命令可以返回SSDB服务状态:
ssdb 127.0.0.1:8899> info
binlogs
capacity : 10000000
min_seq : 1
max_seq : 74
replication
client 127.0.0.1:55479
type : sync
status : SYNC
last_seq : 73
replication
slaveof 127.0.0.1:8888
id : svc_2
type : sync
status : SYNC
last_seq : 73
copy_count : 0
sync_count : 44
binlogs,当前实例的写操作状态:
- capacity: binlog 队列的最大长度
- min_seq: 当前队列中的最小 binlog 序号
- max_seq: 当前队列中的最大 binlog 序号
replication,可以有多条 replication 记录. 每一条表示一个连接进来的 slave(client), 或者一个当前服务器所连接的 master(slaveof).
- slaveof|client ip:port, 远端 master/slave 的 ip:port
- type: 类型, sync|mirror
- status: 当前同步状态, DISCONNECTED|INIT|OUT_OF_SYNC|COPY|SYNC,见下面的解释
- last_seq: 上一条发送或者收到的 binlog 的序号
- slaveof.id: master 的 id(这是从 slave's 角度来看的, 你永远不需要在 master 上配置它自己的 id)
- slaveof.copy_count: 在全量同步时, 已经复制的 key 的数量
- slaveof.sync_count: 发送或者收到的 binlog 的数量.
关于 status:
- DISCONNECTED: 与 master 断开了连接, 一般是网络中断
- INIT: 初始化状态
- OUT_OF_SYNC: 由于短时间内在 master 有大量写操作, 导致 binlog 队列淘汰, slave 丢失同步点, 只好重新复制全部的数据
- COPY: 正在复制基准数据的过程中, 新的写操作可能无法及时地同步
- SYNC: 同步状态是健康的
判断同步状态
binlogs.max_seq 是指当前实例上的最新一次的写(写/更新/删除)操作的序号;
replication.client.last_seq 是指已发送给 slave 的最新一条 binlog 的序号;
所以, 如果你想判断主从同步是否已经同步到位(实时更新), 那么就判断 binlogs.max_seq 和 replication.client.last_seq 是否相等。
SSDB协议
SSDB协议与Redis的文本协议也类似:
SSDB数据包的结构:
Packet := Block+ '\n'
Block := Size '\n' Data '\n'
Size := literal_integer
Data := size_bytes_of_data
请求:
Request := Cmd Blocks*
Cmd := Block
请求命令包括: get, set, del, ...
响应:
Response := Status Block*
Status := Block
响应状态码包括: ok, not_found, error, fail, client_error
示例:
用 telnet 或者 nc 命令连接到 SSDB 服务器, 然后输入下面的代码(用最后一行空行结束):
3
get
3
key
你将看到类似这样的响应:
2
ok
3
val
SSDB 协议解析器的C实现:
#include <stdlib.h>
#include <string.h> int len = buffer->size();
char *ptr = buffer->data();
while(len > ){
char *data = (char *)memchr(ptr, '\n', len);
if(data == NULL){
break;
}
data += ;
int num = data - ptr;
if(num == || (num == && ptr[] == '\r')){
// Packet received.
return OK;
}
// Size received
int size = (int)strtol(ptr, NULL, ); len -= num + size;
ptr += num + size;
if(len >= && ptr[] = '\n'){
len -= ;
ptr += ;
}else if(len >= && ptr[] == '\r' && ptr[] == '\n'){
len -= ;
ptr += ;
}else{
break;
}
// Data received
}
SSDB 数据库的更多相关文章
- SSDB 数据库如何换用 rocksdb 引擎?
牧童遥指杏花村,一枝红杏出墙来… SSDB 数据库如何换用 rocksdb 引擎? idea's blog 2014-04-12 71 阅读 rocksdb NoSQL SSDB 数据库使用的是 G ...
- php版redis插件,SSDB数据库,增强型的Redis管理api实例
php版redis插件,SSDB数据库,增强型的Redis管理api实例 SSDB是一套基于LevelDB存储引擎的非关系型数据库(NOSQL),可用于取代Redis,更适合海量数据的存储.另外,ro ...
- SSDB数据库笔记
目录 环境 配置文件 启动服务器 客户端 SSDB:一个高性能的支持丰富数据结构的 NoSQL 数据库, 用于替代 Redis. 参考文献: SSDB官网 环境 win10 下 wsl 环境 ubun ...
- 2014-08-07 SSDB 使用 rocksdb 引擎
http://www.ideawu.net/blog/archives/824.html 为了满足各位对 Facebook 出品的 rocksdb 的爱好, SSDB 数据库也可以使用 rocksdb ...
- 跨平台轻量级redis、ssdb代理服务器(C++ 11编写)
dbproxy 是我业余采用C++11编写的跨平台代理服务器(并使用lua和自己的网络库),以扩展系统负载,同时使用多个后端数据库,后端数据库支持redis和ssdb. 需要由用户自己编写lua脚本控 ...
- ssdb主从及双主模型配置和简单管理
ssdb主从及双主模型配置和简单管理 levelDB是一个key->value 的数据存储库,其只能在本地保存数据,支持持久化,并且支持保存非常大的数据,单机redis在保存较大数据的时候数十G ...
- Linux下Redis主从复制以及SSDB主主复制环境部署记录
前面的文章已经介绍了redis作为缓存数据库的说明,本文主要说下redis主从复制及集群管理配置的操作记录: Redis主从复制(目前redis仅支持主从复制模式,可以支持在线备份.读写分离等功能.) ...
- ssdb使用笔记
ssdb是一款类似于redis的nosql数据库,不过redis是基于内存的,服务器比较昂贵,ssdb则是基于硬盘存储的,很容易扩展,对于一些对速度要求不是太高的应用,还是不错的选择. 先记录一个比较 ...
- ssdb的高可用,源码分析
ssdb,一个高性能的支持丰富数据结构的 NoSQL 数据库, 用于替代 Redis.——这是其官网的自我介绍. ssdb在leveldb存储库的基础上进行改造和丰富,添加了类似redis操作的接口, ...
随机推荐
- 问题-栈S最多能容纳4个元素,现有6个元素按A、B、C、D、E、F顺序进栈,问可能的出栈顺序。
住栈的特性:对于取出栈内元素每次只能从栈顶开始取(后进先出(栈满时,只能先出后进)) 由于栈内只能容纳4个元素: 所以 E F不可能第一个出栈: 当栈内少于四个元素时 既可以选择进栈,也可以选择出栈 ...
- hibernate DetachedCriteria实现多表关联查询createAlias的使用
记录本例查询初衷: 有表: 表1,表2,表3 关系 1 many-to-one 2 2 many-to-one 3 结果:要通过表3中的条件反向查询表1中相关的数据 public Page<We ...
- shell 题
(1)有一推主机地址:a.baidu.com.....z.baidu.com如何从这些数据中提取出.baidu.com之前的字母,如:a b...z? #cat f1.txt | while read ...
- iOS开发----音频播放、录音、视频播放、拍照、视频录制
随着移动互联网的发展,如今的手机早已不是打电话.发短信那么简单了,播放音乐.视频.录音.拍照等都是很常用的功能.在iOS中对于多媒体的支持是非常强大的,无论是音视频播放.录制,还是对麦克风.摄像头的操 ...
- java 中变量的存储与引用
java交换两个变量的值 1.幼儿园版 package tst; public class Test { public static void main(String[] args) { String ...
- NuGet包调试源码的方法
如果按照nuget官网给出的网址:https://docs.nuget.org/create/creating-and-publishing-a-symbol-package 那么你会发觉下载符号包的 ...
- C#产生随机颜色
在.net Framework中提供了一个专门用来产生随机数的类System.Random.C#可以用Random产生随机的R.G.B值,从而生成随机的颜色. 对于随机数,计算机不可能产生完全随机的数 ...
- PHP滚动日志
PHP滚动日志类库 PHP记录日志,我之前接触过的有按照年月分文件夹,然后按照日分文件的日志记录方式,这种方式有利有弊,有他的使用场景,我今天要说的是另一种日志记录方式--文件滚动方式记录日志,当然了 ...
- Oracle 数据库对象
数据库对象是数据库的组成部分,常常用CREATE命令进行创建,可以使用ALTER命令修改,用DROP执行删除操作.前面已经接触过的数据库对象有表.用户等. 今天将学习更多的Oracle数据库对象: 同 ...
- 通往WinDbg的捷径(二)
原文:http://www.debuginfo.com/articles/easywindbg2.html译者:arhat时间:2006年4月14日关键词:CDB WinDbg 保存 dumps 在我 ...