zoukankan      html  css  js  c++  java
  • SSDB高效能缓存系统

    一、前言:描述

    一个高性能的支持丰富数据结构的 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]#

     

     

     

  • 相关阅读:
    [Android][Framework]裁剪SystemServer服务以及关闭SystemFeature
    [TensorFlow]Tensor维度理解
    [Objective-C]用Block实现链式编程
    [iOS]创建界面方法的讨论
    [Objective-C]编程艺术 笔记整理
    [Objective-C] Copy 和 MutableCopy
    win10的react native 开发环境搭建,使用Android模拟器
    填坑:Windows下使用OpenSSL生成自签证书(很简单,一个晚上搞明白的,让后来者少走弯路)
    转载:量化投资中常用python代码分析(一)
    转载:python生成以及打开json、csv和txt文件
  • 原文地址:https://www.cnblogs.com/supery007/p/12974942.html
Copyright © 2011-2022 走看看