Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1809011
  • 博文数量: 636
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 3950
  • 用 户 组: 普通用户
  • 注册时间: 2014-08-06 21:58
个人简介

博客是我工作的好帮手,遇到困难就来博客找资料

文章分类

全部博文(636)

文章存档

2024年(5)

2022年(2)

2021年(4)

2020年(40)

2019年(4)

2018年(78)

2017年(213)

2016年(41)

2015年(183)

2014年(66)

我的朋友

分类: 系统运维

2017-03-09 12:36:09

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

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


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



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


SSDB开源数据库项目地址: 


作者博客地址: http://www.ideawu.net/blog/ssdb


安装

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


$ sudo wget --no-check-certificate

$ 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,


在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.

项?主?:

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 


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`


阅读(422) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~