SDB是一个开源的高性能数据库服务器, 使用Google LevelDB作为存储引擎, 支持T级别的数据, 同时支持类似Redis中的zset和hash等数据结构, 在同时需求高性能和大数据的条件下, 作为Redis的替代方案.

Redis是经常的”主-从”架构, 虽然可以得到负载均衡以及数据跨地域备份的功能, 但无法实现高可用性. 考虑这种情况, Redis的主和从分别在两个IDC机房, 当主所在的机房出现故障时, 整个服务其实就相当于停止了. 因为所有写操作都失败, 而应用一般不会实现自动降级服务.

SSDB支持”双主”架构(SSDB分布式架构: https://github.com/ideawu/ssdb/wiki/Replication), 两个或者更多的主服务器. 当其中一部分出现故障时, 剩余的主服务器仍然能正常接受写请求, 从而保证服务正常可用, 再将DNS解析修改之后, 就能在机房故障后立即恢复100%可用.



SSDB 被开发和开源出来后, 已经在生产环境经受了3个季度的考验,SSDB最先在”IT牛人博客聚合网站“进行尝试应用, 接着在360游戏部门得到大规模应用, 目前支撑的数据量已经达到数百G. 这些应用最初是使用Redis的, 迁移到SSDB的成本非常低, 涉及的代码改动极小.

安装

SSDB 的建议安装方式是源码编译安装, 建议运行环境是主流 Linux 发行版. 远程 SSH 登录你的服务器, 然后用下面的命令下载, 编译, 安装和运行:

$ sudo 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
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
 
ssdb-server 的工作目录, 启动后, 会在这个目录下生成 data 和 meta 两个目录, 用来保存 LevelDB 的数据库文件. 这个目录是相对于 ssdb.conf 的相对路径, 也可以指定绝对路径.

如果 ip 是 0.0.0.0, 则表示绑定所有的 IP. 基于安全考虑, 可以将 ip 设置为 127.0.0.1, 这样, 只有本机可以访问了. 如果要做更严格的更多的网络安全限制, 就需要依赖操作系统的 iptables.
 
 replication: 用于指定主从同步复制. slaveof.ip, slaveof.port 表示, 本台 SSDB 服务器将从这个目标机上同步数据(也即这个配置文件对应的服务器是 slave). 你可以参考 ssdb_slave.conf 的配制.
 
level 是日志的级别, 可以是 trace|debug|info|error. output 是日志文件的名字, SSDB 支持日志轮转, 在日志文件达到一定大小后, 将 log.txt 改名, 然后创建一个新的 
log.txt.
 
用于指定缓存大小. 适当的缓存可以提高读性能, 但是过大的缓存会影响写性能.
 
 在使用自带的 ssdb.conf 配置文件时, SSDB 生成的日志文件按体积进行分割, 仅此而已. 所以, 你需要编写自己的 crontab 进行日志压缩和定期清理. 
    
在系统重新启动之后, 你需要手动删除 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 使⽤⽰例
 <?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 数据类型
三种数
据类型处于不同的命名区间, 所以不同类型的数据可以起相同的名字, 但不建议这么做.

 KV
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
 
./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`