SSDB高效能缓存系统

时间:2024-02-17 18:57:26

一、前言:描述

一个高性能的支持丰富数据结构的 NoSQL 数据库, 用于替代 Redis.

1.1 特性优点

替代 Redis 数据库, Redis 的 100 倍容量

LevelDB 网络支持, 使用 C/C++ 开发

Redis API 兼容, 支持 Redis 客户端

适合存储集合数据, 如 list, hash, zset...

客户端 API 支持的语言包括: C++, PHP, Python, Java, Go

持久化的队列服务

主从复制, 负载均

1.2 说明介绍

ssdb是一款类似于redis的nosql数据库,不过redis是基于内存的,服务器比较昂贵,ssdb则是基于硬盘存储的,很容易扩展,对于一些对速度要求不是太高的应用,
还是不错的选择。 先记录一个比较坑的东西,具体的用法以后补充。 ssdb删除数据的时候有很多中方法: flushdb 删除整个数据库中的所有数据 qclear 删除列表类型的数据 hclear 删除hash类型的数据 zclear 删除有序集合类型的梳理 del 删除字符串类型的数据

1.3 缺点说明

不过,ssdb在删除数据的时候并不会立刻释放磁盘的空间,用作者的话说就是ssdb会在合适的时候去释放,这就会造成不知不觉中ssdb占用的磁盘空间越来越大,
还不知道什么时候才会被释放,如果不及时处理的话,服务器卡死是很正常的事情,经过不断的寻找,终于被我发现了一个命令 compact , 这个命令会自动去释放
应该被释放的磁盘空间,不过在使用的时候会造成ssdb卡慢,
并且 compact 命令的执行速度也不快,但总算是可以立刻释放了,不用再担心服务器被撑爆。 需要注意的是如果服务器已经快被撑爆了,那么你在执行 compact 的时候ssdb是有可能崩溃的,而且执行一次 compact 并不会释放所有应该释放的空间,可能需要多次执行才行。 还有一个比较坑的东西就是在删除数据的时候,会造成服务阻塞,其他任何写命令都执行不了,可读不可写。。。而且删除的超级慢。。。 下面简单介绍一下ssdb的用法。

二、配置及使用

2.1 参考资料:

http://ssdb.io/docs/zh_cn/config.html

2.2 下载安装包

wget --no-check-certificate https://github.com/ideawu/ssdb/archive/master.zip

2.3 解压编译

unzip master

cd ssdb-master

make

mkdir /usr/local/ssdb/{bin,conf} –p

make install PREFIX=/usr/local/ssdb/bin/

附录Ⅰ:编译报错

如果出现如下错误:

g++ ...deps/snappy-1.1.0/.libs/libsnappy.a: No such file or directory

make[1]: *** [all] Error 1

或者

g++ ...deps/jemalloc-3.3.1/lib/libjemalloc.a: No such file or directory

make[1]: *** [all] Error 1

这是因为 Snappy 或者 Jemalloc 没有编译成功, 这一般是因为你的系统时钟有问题. 可以这样解决:

cd deps/snappy-1.1.0

autoreconf --force --install

./configure

make

或者

cd deps/jemalloc-3.3.1

autoreconf --force --install

./configure

make

附录:参数说明

注意:SSDB 的配置文件使用一个 TAB 来表示一级缩进, 不要使用空格来缩进, 无论你用1个, 2个, 3个, 4个, 5个, 6个, 7个, 8个或者无数个空格都不行!

A.工作目录,进程id文件

work_dir = /meishi/data/ssdb21/

pidfile = /var/run/ssdb21.pid

B监听网络端口

server:

        ip: 0.0.0.0

        port: 8888

#如果设置0.0.0.0需要在防火墙上做好规则

C只读模式

server:

readonly: yes|no

#SSDB 可以工作在只读模式下, 在只读模式下, 所有的写操作命令都会被服务端拒绝:

ssdb 127.0.0.1:8888> set a 2

client_error: Forbidden Command: set

(0.000 sec)

D日志配置

logger.level 日志级别

支持的日志级别有: debug, info, warn, error, fatal.

一般, 建议你将 logger.level 设置为 debug 级别

logger.output 日志输出

可直接写相对路径或者绝对路径, 如果相对路径, 则是相对配置文件所在的目录.

如果你想输出日志到终端屏幕, 编辑 ssdb.conf, 将

logger:

output: log.txt

修改为

logger:

output: stdout

logger.rorate.size 日志循环和清理

设置日志拆分时的大小, 单位为字节数. 按照默认的配置, 日志会按 1000MB 大小进行切分, 切分后的文件名格式如: log.txt.20150723-230422.

切分后的日志文件不会自动被清理, 你需要自己写 crontab 脚本来清理.
日志级别 

E.LevelDB 配置

leveldb.cache_size 内存缓存大小

一般地, 这个数字越大, 性能越好. 如果你的机器内存较小, 那就把它改小, 最小值是 16.

leveldb.block_size 缓存块大小,可以不用设置

leveldb.write_buffer_size 写缓冲区大小

如果你的机器内存小, 那就把它改小, 否则改大. 它应该在这个范围内: [4, 128];

leveldb.compaction_speed

一般情况下, 不用关心. 如果你的硬盘性能非常差, 同时, 你的数据几乎不变动, 也没有什么新数据写入, 可以把它改小(最好大于 50).

leveldb.compression 压缩硬盘上的数据

F.内存占用

一个 ssdb-server 实例占用的内存瞬时(有可能, 而且即使达到, 也只是持续短时间)最高达到(MB):

cache_size + write_buffer_size * 66 + 32

这是对于压缩选项没有开启的情况, 如果 compression: yes, 计算公式是:

cache_size + 10 * write_buffer_size * 66 + 32

你可以调整配置参数, 限制 ssdb-server 的内存占用.

对于一般负载的实例来说, 物理内存的持续占用是:

cache_size + write_buffer_size * 4 + 32

根据实际经验, 使用默认配置的实例, 会占用约 1GB 的内存. 这个经验你可以参考.最好设置为 yes! 如果是 yes, 一般你能存储 10 倍硬盘空间的数据, 而且性能会更好.

 

2.4 启动前准备

2.4.1 修改配置

[root@cache01 conf]# scp /usr/local/ssdb/bin/ssdb.conf /usr/local/ssdb/conf/ssdb21.conf

[root@cache01 conf]# cat /usr/local/ssdb/conf/ssdb21.conf

work_dir = /meishi/data/ssdb21/

pidfile = /var/run/ssdb21.pid

server:

        ip: 0.0.0.0

        port: 8888

        allow: 127.0.0.1

        allow: 192.168

        allow: 10.

replication:

        binlog: yes

        sync_speed: -1

        slaveof:

                #id: svc_1

                #type: mirror

                #host: 192.168.0.103

                #port: 8898 

logger:

        level: debug

        output: /meishi/log/ssdb21.log

        rotate:

                size: 1000000000


leveldb:

        cache_size: 2048

        write_buffer_size: 64

        compaction_speed: 1000

        compression: no

[root@cache01 conf]#

2.4.2 创建数据目录

[root@cache01 conf]# mkdir /meishi/data/ssdb21/

2.4.3 启动服务

[root@cache01 conf]# /usr/local/ssdb/bin/ssdb-server -d /usr/local/ssdb/conf/ssdb22.conf

#-d参数是以daemon形式在后台运行

2.4.4 加入自启动脚本

[root@cache01 conf]# tail -1 /meishi/scripts/start.sh

/usr/local/ssdb/bin/ssdb-server -d /usr/local/ssdb/conf/ssdb22.conf

三、主从配置

3.1 参考资料:

http://blog.csdn.net/richardedu/article/details/48161299

http://ssdb.io/docs/zh_cn/replication.html

3.2 修改配置文件

MASTER

[root@cache01 ~]# cat /usr/local/ssdb/conf/ssdb22.conf

# ssdb-server config

# MUST indent by TAB!


# relative to path of this file, directory must exists

work_dir = /meishi/data/ssdb22/

pidfile = /var/run/ssdb22.pid


server:

        ip: 0.0.0.0

        port: 8889

        # 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

        allow: 10.

        # auth password must be at least 32 characters

        #auth: very-strong-password

        #readonly: yes

 
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

                #host: localhost

                #port: 8889


logger:

        level: debug

        output: /meishi/log/ssdb22.log

        rotate:

                size: 1000000000


leveldb:

        # in MB

        cache_size: 2048

        # in MB

        write_buffer_size: 64

        # in MB/s

        compaction_speed: 1000

        # yes|no

        compression: no
 

SLAVE

[root@big4 conf]# cat ssdb_slave8889.conf

work_dir = /home/meishi/data/slave8889

pidfile =  /var/run/ssdb8889.pid


server:

        ip: 192.168.0.103

        port: 8889
 

replication:

        binlog: yes

        sync_speed: -1

        slaveof:

                id: svc_1

                type: sync

                host: 10.9.142.198

                port: 8889
 

logger:

        level: debug

        output: /home/meishi/log/ssdb8889.log

        rotate:

                size: 1000000000


leveldb:

        cache_size: 2048

        write_buffer_size: 64

        compaction_speed: 1000

        compression: no

 

附录:总结

Master

replication:

        binlog: yes

        slaveof:

Slave

replication:

        binlog: yes

        sync_speed: -1

        slaveof:

                id: svc_1 #id必须唯一

                type: sync #sync模式

                host: 10.9.142.198 #Master主机地址

                port: 8889 #Master端口

3.2 启动服务

略。参照上面启动方式

3.3 检查状态

MASTER

[root@big4 conf]# /usr/local/redis3.2/bin/redis-cli -h 10.9.142.198 -p 8889

10.9.142.198:8889> INFO

ssdb-server

version

1.9.4

links

2751

total_calls

30466488

dbsize

3955503996

binlogs

    capacity : 20000000

    min_seq  : 55049176

    max_seq  : 75056457

replication

client 192.168.0.103:26463

    type     : sync

    status   : SYNC

    last_seq : 75056457

serv_key_range

    kv  : "" - ""

    hash: "" - ""

    zset: "" - ""

    list: "" - ""

data_key_range

    kv  : "" - ""

    hash: "Device:00000000" - "user_recipe:99999"

    zset: "DeviceU:1002447" - "sys_msg_num"

    list: "" - ""

leveldb.stats

                               Compactions

Level  Files Size(MB) Time(sec) Read(MB) Write(MB)

--------------------------------------------------

  0        0        0       156        0      9581

  1        2       66       412    21180     20207

  2       16      184       837    46082     45987

  3      178     5549       272    17190     14476

10.9.142.198:8889>
View Code

SLAVE

[root@big4 conf]# /usr/local/redis3.2/bin/redis-cli -h 192.168.0.103 -p 8889

192.168.0.103:8889> INFO

ssdb-server

version

1.9.4

links

1

total_calls

35

dbsize

3954070831

binlogs

    capacity : 20000000

    min_seq  : 55040034

    max_seq  : 75042555

replication

slaveof 10.9.142.198:8889

    id         : svc_1

    type       : sync

    status     : SYNC

    last_seq   : 75056970

    copy_count : 75016151

    sync_count : 26502

serv_key_range

    kv  : "" - ""

    hash: "" - ""

    zset: "" - ""

    list: "" - ""

data_key_range

    kv  : "" - ""

    hash: "Device:00000000" - "user_recipe:99999"

    zset: "DeviceU:1002447" - "sys_msg_num"

    list: "" - ""

leveldb.stats

                               Compactions

Level  Files Size(MB) Time(sec) Read(MB) Write(MB)

--------------------------------------------------

  0        0        0       621        0      9767

  1        7      160      1305    22234     20997

  2       64     1597      1969    36016     35583

  3      136     4301        65     3213      1174

192.168.0.103:8889>
View Code

四、配置双主:

4.1 配置主svc_1节点

4.1.1 创建配置文件

[root@cache01 conf]# pwd

/usr/local/ssdb/conf

[root@cache01 conf]# cat ssdb8881.conf

work_dir = /meishi/data/ssdb8881/

pidfile = /var/run/ssdb8881.pid

 

server:

        ip: 10.9.142.198

        port: 8881

replication:

        binlog: yes

        sync_speed: -1

        slaveof:

                id: svc_1

                type: mirror

                host: 192.168.0.103

                port: 8881

logger:

        level: debug

        output: /meishi/log/ssdb8881.log

        rotate:

                size: 1000000000

leveldb:

        cache_size: 2048

        write_buffer_size: 64

        compaction_speed: 1000

        compression: no

4.1.2 拷贝配置文件

[root@cache01 conf]# scp ssdb8881.conf ssdb8882.conf

[root@cache01 conf]# scp ssdb8881.conf ssdb8883.conf

[root@cache01 conf]# scp ssdb8881.conf ssdb8884.conf

[root@cache01 conf]# scp ssdb8881.conf ssdb8885.conf

4.1.3 修改配置文件

[root@cache01 conf]# sed -i \'s#8881#8882#g\' ssdb8882.conf

[root@cache01 conf]# sed -i \'s#8881#8883#g\' ssdb8883.conf

[root@cache01 conf]# sed -i \'s#8881#8884#g\' ssdb8884.conf

[root@cache01 conf]# sed -i \'s#8881#8885#g\' ssdb8885.conf

4.1.4 创建数据目录

[root@cache01 conf]# mkdir /meishi/data/ssdb8881/ -p

[root@cache01 conf]# mkdir /meishi/data/ssdb8882/ -p

[root@cache01 conf]# mkdir /meishi/data/ssdb8883/ -p

[root@cache01 conf]# mkdir /meishi/data/ssdb8884/ -p

[root@cache01 conf]# mkdir /meishi/data/ssdb8885/ -p

4.1.5 启动程序

[root@cache01 conf]# /usr/local/ssdb/bin/ssdb-server -d /usr/local/ssdb/conf/ssdb8881.conf

[root@cache01 conf]# /usr/local/ssdb/bin/ssdb-server -d /usr/local/ssdb/conf/ssdb8882.conf

[root@cache01 conf]# /usr/local/ssdb/bin/ssdb-server -d /usr/local/ssdb/conf/ssdb8883.conf

[root@cache01 conf]# /usr/local/ssdb/bin/ssdb-server -d /usr/local/ssdb/conf/ssdb8884.conf

[root@cache01 conf]# /usr/local/ssdb/bin/ssdb-server -d /usr/local/ssdb/conf/ssdb8885.conf

4.1.6 检查启动状态

[root@cache01 conf]# netstat -lnpt |grep ssdb

tcp        0      0 10.9.142.198:8881           0.0.0.0:*                   LISTEN      21206/ssdb-server   

tcp        0      0 10.9.142.198:8882           0.0.0.0:*                   LISTEN      21224/ssdb-server   

tcp        0      0 10.9.142.198:8883           0.0.0.0:*                   LISTEN      21240/ssdb-server   

tcp        0      0 10.9.142.198:8884           0.0.0.0:*                   LISTEN      21286/ssdb-server   

tcp        0      0 10.9.142.198:8885           0.0.0.0:*                   LISTEN      21302/ssdb-server

4.1.7 加入自启动脚本

[root@cache01 conf]# tail -6 /meishi/scripts/start.sh  

#启动ssdb

/usr/local/ssdb/bin/ssdb-server -d /usr/local/ssdb/conf/ssdb8881.conf

/usr/local/ssdb/bin/ssdb-server -d /usr/local/ssdb/conf/ssdb8882.conf

/usr/local/ssdb/bin/ssdb-server -d /usr/local/ssdb/conf/ssdb8883.conf

/usr/local/ssdb/bin/ssdb-server -d /usr/local/ssdb/conf/ssdb8884.conf

/usr/local/ssdb/bin/ssdb-server -d /usr/local/ssdb/conf/ssdb8885.conf

[root@cache01 conf]#
View Code

4.2 配置主svc_2节点

4.2.1 创建配置文件

[root@big4 conf]# pwd

/usr/local/ssdb/conf

[root@big4 conf]# cat ssdb8881.conf

work_dir = /home/meishi/data/ssdb8881/

pidfile = /var/run/ssdb8881.pid

 

server:

        ip: 192.168.0.103

        port: 8881

replication:

        binlog: yes

        sync_speed: -1

        slaveof:

                id: svc_2

                type: mirror

                host: 10.9.142.198

                port: 8881

logger:

        level: debug

        output: /home/meishi/log/ssdb8881.log

        rotate:

                size: 1000000000

leveldb:

        cache_size: 2048

        write_buffer_size: 64

        compaction_speed: 1000

        compression: no

[root@big4 conf]#

4.2.2 拷贝配置文件

[root@big4 conf]# scp ssdb8881.conf ssdb8882.conf

[root@big4 conf]# scp ssdb8881.conf ssdb8883.conf

[root@big4 conf]# scp ssdb8881.conf ssdb8884.conf

[root@big4 conf]# scp ssdb8881.conf ssdb8885.conf

4.2.3 修改配置文件

[root@big4 conf]# sed -i \'s#8881#8882#g\' ssdb8882.conf

[root@big4 conf]# sed -i \'s#8881#8883#g\' ssdb8883.conf

[root@big4 conf]# sed -i \'s#8881#8884#g\' ssdb8884.conf

[root@big4 conf]# sed -i \'s#8881#8885#g\' ssdb8885.conf

4.2.4 创建数据目录

[root@big4 conf]# mkdir  /home/meishi/data/ssdb8881

[root@big4 conf]# mkdir  /home/meishi/data/ssdb8882

[root@big4 conf]# mkdir  /home/meishi/data/ssdb8883

[root@big4 conf]# mkdir  /home/meishi/data/ssdb8884

[root@big4 conf]# mkdir  /home/meishi/data/ssdb8885

4.2.5 启动程序

[root@big4 conf]# /usr/local/ssdb/bin/ssdb-server -d /usr/local/ssdb/conf/ssdb8881.conf

[root@big4 conf]# /usr/local/ssdb/bin/ssdb-server -d /usr/local/ssdb/conf/ssdb8882.conf

[root@big4 conf]# /usr/local/ssdb/bin/ssdb-server -d /usr/local/ssdb/conf/ssdb8883.conf

[root@big4 conf]# /usr/local/ssdb/bin/ssdb-server -d /usr/local/ssdb/conf/ssdb8884.conf

[root@big4 conf]# /usr/local/ssdb/bin/ssdb-server -d /usr/local/ssdb/conf/ssdb8885.conf

4.2.6 检查启动状态

[root@big4 conf]# netstat -lnpt |grep ssdb

tcp        0      0 192.168.0.103:8881          0.0.0.0:*                   LISTEN      4415/ssdb-server    

tcp        0      0 192.168.0.103:8882          0.0.0.0:*                   LISTEN      4504/ssdb-server    

tcp        0      0 192.168.0.103:8883          0.0.0.0:*                   LISTEN      4509/ssdb-server    

tcp        0      0 192.168.0.103:8884          0.0.0.0:*                   LISTEN      4541/ssdb-server    

tcp        0      0 192.168.0.103:8885          0.0.0.0:*                   LISTEN      4563/ssdb-server

4.2.7 加入自启动脚本

[root@big4 conf]# tail -6 /home/start.sh  

#启动ssdb

/usr/local/ssdb/bin/ssdb-server -d /usr/local/ssdb/conf/ssdb8881.conf

/usr/local/ssdb/bin/ssdb-server -d /usr/local/ssdb/conf/ssdb8882.conf

/usr/local/ssdb/bin/ssdb-server -d /usr/local/ssdb/conf/ssdb8883.conf

/usr/local/ssdb/bin/ssdb-server -d /usr/local/ssdb/conf/ssdb8884.conf

/usr/local/ssdb/bin/ssdb-server -d /usr/local/ssdb/conf/ssdb8885.conf

[root@big4 conf]#