SDB是一个开源的高性能数据库服务器, 使用Google LevelDB作为存储引擎, 支持T级别的数据, 同时支持类似Redis中的zset和hash等数据结构, 在同时需求高性能和大数据的条件下, 作为Redis的替代方案.
因为SSDB的最初目的是替代Redis, 所以SSDB会经常和Redis进行比较. 我们知道, Redis是经常的”主-从”架构, 虽然可以得到负载均衡以及数据跨地域备份的功能, 但无法实现高可用性. 考虑这种情况, Redis的主和从分别在两个IDC机房, 当主所在的机房出现故障时, 整个服务其实就相当于停止了. 因为所有写操作都失败, 而应用一般不会实现自动降级服务.
而SSDB支持”双主”架构(SSDB分布式架构: https://github.com/ideawu/ssdb/wiki/Replication), 两个或者更多的主服务器. 当其中一部分出现故障时, 剩余的主服务器仍然能正常接受写请求, 从而保证服务正常可用, 再将DNS解析修改之后, 就能在机房故障后立即恢复100%可用.
SSDB 被开发和开源出来后, 已经在生产环境经受了3个季度的考验,SSDB最先在”IT牛人博客聚合网站“进行尝试应用, 接着在360游戏部门得到大规模应用, 目前支撑的数据量已经达到数百G. 这些应用最初是使用Redis的, 迁移到SSDB的成本非常低, 涉及的代码改动极小.
SSDB开源数据库项目地址: https://github.com/ideawu/ssdb
作者博客地址: http://www.ideawu.net/blog/ssdb
安装
SSDB 的建议安装方式是源码编译安装, 建议运行环境是主流 Linux 发行版. 远程 SSH 登录你的服务器, 然后用下面的命令下载, 编译, 安装和运行:
$ sudo wget --no-check-certificate https://github.com/ideawu/ssdb/archive/master.zip
$ sudo unzip master
$ cd ssdb-master
$ sudo make
$ #optional, install ssdb in /usr/local/ssdb
$ sudo make install
# start master
$ sudo ./ssdb-server ssdb.conf
# or start as daemon
$ sudo ./ssdb-server -d ssdb.conf
# ssdb command line
$ sudo ./ssdb-cli -p 8888
# stop ssdb-server
$ sudo kill `cat ./var/ssdb.pid`
SSDB 默认安装在 /usr/local/ssdb 目录下.
ssdb-server 是服务器的程序, ssdb-cli 是命令行客户端.
SSDB配置文件 http://www.ideawu.net/blog/archives/733.html
SSDB 附带的 ssdb.conf 你不用修改便可以使用. 如果你要高度定制, 还是需要修改一些配置的.
下面做介绍. SSDB 的配置文件是一种层级 key-value 的静态配置文件,
通过一个 TAB 缩进来表示层级关系. 以 ‘#’ 号开始的行是注释. 标准的配置文件如下:
# ssdb-server config
# MUST indent by TAB!
# relative to path of this file, directory must exists
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
replication:
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: info
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: no
work_dir: 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). 你可以参考 ssdb_slave.conf 的配制.
logger: 配置日志记录. level 是日志的级别, 可以是 trace|debug|info|error. output 是日志文件的名字, SSDB 支持日志轮转, 在日志文件达到一定大小后, 将 log.txt 改名, 然后创建一个新的
log.txt.
leveldb: 配置 LevelDB 的参数. 你一般想要修改的是 cache_size 参数, 用于指定缓存大小. 适当的缓存可以提高读性能, 但是过大的缓存会影响写性能.
在使用自带的 ssdb.conf 配置文件时, SSDB 生成的日志文件按体积进行分割, 仅此而已. 所以, 你需要编写自己的 crontab 进行日志压缩和定期清理.
如果出现服务器掉电, kernel panic 等系统故障, 在系统重新启动之后, 你需要手动删除 ssdb的 PID 文件 ssdb.pid, 然后才能启动 ssdb-server.另外, 你可以参考下面的做法,
在系统启动和关机时, 启动和关闭 ssdb-server:
# /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
把件保存为 /etc/init.d/ssdb.sh(需要 root 权限), 然后执:
chmod ugo+x /etc/init.d/ssdb.sh
把 ssdb加入chkconfig,并设置开机启动。
[azureuser@mono init.d]$ sudo chkconfig --add ssdb.sh
[azureuser@mono init.d]$ chkconfig ssdb.sh on
启动、停止的命令如下:
[azureuser@mono init.d]$ sudo service ssdb.sh stop
ssdb stopped.
[azureuser@mono init.d]$ sudo service ssdb.sh start
ssdb 1.6.7
Copyright (c) 2012-2013 ideawu.com
ssdb started.
项目代码中已经加入c# 的api,https://github.com/ideawu/ssdb/tree/stable-1.6.7/api/dotnet,
在Mono上跑了一下:
[azureuser@mono dotnet]$ sudo dmcs Client.cs Link.cs Program.cs -out:ssdbClient.exe
[azureuser@mono dotnet]$ mono ssdbClient.exe
ok
1
ok
100
99
-----------------
1 kvs
a: 99
-----------------
0 kvs
-----------------
0 kvs
0
SSDB 简介
SSDB 是个 C++ 语开发的性能开源 NoSQL 数据库服务器, 持 Key-value, Key hashmap,
Key-zset(sorted set) 等数据结构, 分适合存储数亿条级别的列表, 排序表等集合
数据, 是 Redis 的替代和增强案.
SSDB 具有和 Redis 相似的 API, 持的客户端包括: PHP, C++, Python, Java, Lua, Ruby,
Nodejs, etc.
项主: https://github.com/ideawu/ssdb
PHP 使例
require_once('SSDB.php');
$ssdb = new SimpleSSDB('127.0.0.1', 8888);
$resp = $ssdb->set('key', '123');
$resp = $ssdb->get('key');
echo $resp; // output: 123
SSDB 数据类型
SSDB 持三种数据类型, 别分是 KV(key-value), Hashmap(map), Zset(sorted set). 三种数
据类型处于不同的命名区间, 所以不同类型的数据可以起相同的名字, 但不建议这么做.
KV
KV 数据类型持基本的 set(), get(), del(), incr() 种操作. KV 数据类型主要于存储离散
的, 之间没有关系(或者关系被忽略)的数据, 如图片文件,大段文本等. 一般 KV 类型都可以
被 Hashmap 替代, 但 KV 会比Hashmap 性能高些.
key value
k1 vc
k2 vx
k3 vy
Hashmap
Hashmap 类型和 KV 功能相似, 可用于存储大体积的数据, 但不同的数据项在业务上处于某
个集合. 并且, Hashmap 维护了一个集合大小的计数.
Hashmap 中的数据项是 Key-value 的键值对, 并且按 Key 的字节数组顺序进行排序.
如果数据需要经常被遍历, 则应该使用 Hashmap 来替代 KV. 对于只添加, 不更新和删除的有
排序需求的数据集合, 可以用Hashmap 来存储而不需要使用Zset, 因为 Hashmap 会比
Zset 性能高些.
name key value
h k1 vb
h k2 va
h k3 vc
Key 是按字节顺序排序的.
Zset
Zset 是一种根据数据项的权重(score, 整数值)进排序的集合, Zset 集合中的数据项是唯一,
不可重复的. Zset 可以理解为关系数据中只有 ID 主键和整数 score 字段一共两个字段的表.
因为 Zset 的排序特性, 所以可以来存储排序列表, 如商品按价格的排序列表, 商品按上架日
期的排序列表, 等等. 每一个排序列表对应一个 Zset 集合.
Zset 不能用来存储大体积的数据, 因为它是一种"索引"数据类型, 被索引的东西(集合中的数
据项)只能是 200 字节以内的字节数组(包括字符串).
name key score
z k2 0
z k3 1
z k1 2
Key 是按 score(64 位整数)的大小排序的.
使 SSDB 命令行客户端(ssdb-cli)
SSDB 的命令行客户端 ssdb-cli 可以于日常管理, 包括查看 SSDB 的运行状态(info), 还能做
一些 API 没有的操作, 如清空整个数据库.
运行 ssdb-cli
连接到 127.0.0.1:8888,
$ /usr/local/ssdb/ssdb-cli -h 127.0.0.1 -p 8888
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>
你可以输入字母 h, 然后按回车查看帮助信息.
进行KV 操作
ssdb 127.0.0.1:8888> get k
error: not_found
(0.007 sec)
ssdb 127.0.0.1:8888> set k 1
ok
(0.000 sec)
ssdb 127.0.0.1:8888> get k
1
(0.000 sec)
ssdb 127.0.0.1:8888> del k
ok
(0.000 sec)
ssdb 127.0.0.1:8888> get k
error: not_found
(0.000 sec)
ssdb 127.0.0.1:8888>
进行 hashmap 操作
ssdb 127.0.0.1:8888> hsize h
0
(0.007 sec)
ssdb 127.0.0.1:8888> hset h k1 vb
ok
(0.000 sec)
ssdb 127.0.0.1:8888> hset h k2 va
ok
(0.000 sec)
ssdb 127.0.0.1:8888> hset h k3 vc
ok
(0.000 sec)
ssdb 127.0.0.1:8888> hscan h "" "" 10
key value
-------------------------
k1 : vb
k2 : va
k3 : vc
3 result(s) (0.000 sec)
ssdb 127.0.0.1:8888> hclear h
hclear 'h' 3 key(s).
ssdb 127.0.0.1:8888> hscan h "" "" 10
key value
-------------------------
0 result(s) (0.000 sec)
ssdb 127.0.0.1:8888>
进行 zset 操作
ssdb 127.0.0.1:8888> zsize z
0
(0.000 sec)
ssdb 127.0.0.1:8888> zset z k1 2
ok
(0.000 sec)
ssdb 127.0.0.1:8888> zset z k2 0
ok
(0.000 sec)
ssdb 127.0.0.1:8888> zset z k3 1
ok
(0.000 sec)
ssdb 127.0.0.1:8888> zscan z "" "" "" 10
key score
-------------------------
k2 : 0
k3 : 1
k1 : 2
3 result(s) (0.000 sec)
ssdb 127.0.0.1:8888> zclear z
zclear 'z' 3 key(s).
ssdb 127.0.0.1:8888> zscan z "" "" "" 10
key score
-------------------------
0 result(s) (0.000 sec)
1.1 必备软件
yum install –y wget unzip gcc gcc-c++
1.2 下载安装
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
1.3 启动
# start master
./ssdb-server ssdb.conf
# or start as daemon
./ssdb-server -d ssdb.conf
# ssdb command line
./tools/ssdb-cli -p 8888
# stop ssdb-server
kill `cat ./var/ssdb.pid`
1.4 制作启动脚本
copy tools/ssdb.sh /etc/init.d/ssdb
vim /etc/init.d/init.d/ssdb.conf #修改配置文件路径
---------------------------------------------------
# ssdb Start ssdb
#
# chkconfig: 2345 08 92
# description: Starts, stops and saves tomcat
#
# config: /usr/local/ssdb/ssdb.conf
#
### BEGIN INIT INFO
# Provides: ssdb
# Required-Start:
# Required-Stop:
# Default-Start: 2 3 4 5
# Default-Stop: 0 1 6
# Short-Description: start and stop ssdb
# Description: Start, stop and save ssdb
### END INIT INFO
configs=/usr/local/ssdb/ssdb.conf
#设置开机自启动
chkconfig --add ssdb
chkconfig ssdb on
1.5 设置环境变量
vim /etc/profile
--------------------------------------------------
SSDB_HOME=/usr/local/ssdb
PATH=$SSDB_HOME:$PATH
export SSDB_HOME PATH
--------------------------------------------------
source /etc/profile
1.6 SSDB主从复制
主:
# cat /usr/local/ssdb/ssdb.conf
server:
ip: 192.168.16.202 #修改
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 #修改
从:
# cat /usr/local/ssdb/ssdb.conf
server:
ip: 192.168.16.201 #修改
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 #修改
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: 192.168.16.202 #修改
port: 8888 #修改
主从:
#./ssdb-server -d ssdb.conf
或
# /etc/init.d/ssdb restart
主从:
# /usr/local/ssdb/ssdb-cli -h 192.168.16.201 -p 8888
# /usr/local/ssdb/ssdb-cli -h 192.168.16.202 -p 8888
1.6 修改jar包启动脚本
-Dapplication.ssdb.master.host=192.168.16.202 -Dapplication.ssdb.master.port=8888 -Dapplication.ssdb.slave.host=192.168.16.201 -Dapplication.ssdb.slave.port=8888
# start master
[root@localhost soft]# ./ssdb-server ssdb.conf
# or start as daemon
[root@localhost soft]# ./ssdb-server -d ssdb.conf
# ssdb command line
[root@localhost soft]# ./tools/ssdb-cli -p 8888
# stop ssdb-server
[root@localhost soft]# kill `cat ./var/ssdb.pid`