• 设为首页
  • 收藏本站
  • 积分充值
  • VIP赞助
  • 手机版
  • 微博
  • 微信
    微信公众号 添加方式:
    1:搜索微信号(888888
    2:扫描左侧二维码
  • 快捷导航
    福建二哥 门户 查看主题

    ssdb简单介绍

    发布者: 皮3591 | 发布时间: 2025-6-20 09:12| 查看数: 109| 评论数: 0|帖子模式

    ssdb介绍

    ssdb是一款类似于redis的nosql数据库,不过redis是基于内存的,服务器比较昂贵,ssdb则是基于硬盘存储的,很容易扩展,对于一些对速度要求不是太高的应用,还是不错的选择。
    SSDB是一套基于LevelDB存储引擎的非关系型数据库(NOSQL),可用于取代Redis,更适合海量数据的存储。
    另外,rocksdb是FB在LevelDB的二次开发版本,因此也存在使用RocksDB作为存储引擎的SSDB版本,可以参考这里。
      先记录一个比较坑的东西,具体的用法以后补充。
      ssdb删除数据的时候有很多中方法:
        flushdb   删除整个数据库中的所有数据
        qclear     删除列表类型的数据
        hclear     删除hash类型的数据
        zclear     删除有序集合类型的梳理
        del          删除字符串类型的数据
      不过,ssdb在删除数据的时候并不会立刻释放磁盘的空间,用作者的话说就是ssdb会在合适的时候去释放,这就会造成不知不觉中ssdb占用的磁盘空间越来越大,还不知道什么时候才会被释放,如果不及时处理的话,服务器卡死是很正常的事情,经过不断的寻找,终于被我发现了一个命令 compact , 这个命令会自动去释放应该被释放的磁盘空间,不过在使用的时候会造成ssdb卡慢,并且 compact 命令的执行速度也不快,但总算是可以立刻释放了,不用再担心服务器被撑爆。
      需要注意的是如果服务器已经快被撑爆了,那么你在执行 compact 的时候ssdb是有可能崩溃的,而且执行一次 compact 并不会释放所有应该释放的空间,可能需要多次执行才行
      还有一个比较坑的东西就是在删除数据的时候,会造成服务阻塞,其他任何写命令都执行不了,可读不可写。。。而且删除的超级慢。。。

    安装,启动

    编译和安装
    1. wget --no-check-certificate https://github.com/ideawu/ssdb/archive/master.zip
    2. unzip master
    3. cd ssdb-master
    4. make
    5. # 将安装在 /usr/local/ssdb 目录下
    6. sudo make install
    复制代码
    启动服务
    1. # 启动主库
    2. ./ssdb-server ssdb.conf
    3. # 或者启动为后台进程
    4. ./ssdb-server -d ssdb.conf
    5. # 启动 ssdb 命令行客户端
    6. ./tools/ssdb-cli -p 8888
    7. # 停止 ssdb-server
    8. ./ssdb-server ssdb.conf -s stop
    9. # 对于旧版本
    10. kill `cat ./var/ssdb.pid`
    复制代码
    配置文件

    ssdb.conf:
    1. work_dir = ./var
    2. pidfile = ./var/ssdb.pid
    3. server:
    4.     ip: 127.0.0.1
    5.     port: 8888
    6.     # bind to public ip
    7.     #ip: 0.0.0.0
    8.     # format: allow|deny: all|ip_prefix
    9.     # multiple allows or denys is supported
    10.     #deny: all
    11.     #allow: 127.0.0.1
    12.     #allow: 192.168
    13.     # auth password must be at least 32 characters
    14.     #auth: very-strong-password
    15. replication:
    16.     binlog: yes
    17.     # Limit sync speed to *MB/s, -1: no limit
    18.     sync_speed: -1
    19.     slaveof:
    20.         # to identify a master even if it moved(ip, port changed)
    21.         # if set to empty or not defined, ip:port will be used.
    22.         #id: svc_2
    23.         # sync|mirror, default is sync
    24.         #type: sync
    25.         #ip: 127.0.0.1
    26.         #port: 8889
    27. logger:
    28.     level: debug
    29.    # 支持的日志级别有:
    30. debug, warn, error, fatal
    31. .
    32.     output: log.txt
    33.     rotate:
    34.         size: 1000000000
    35. leveldb:
    36.     # in MB
    37.     cache_size: 500
    38.     # in KB
    39.     block_size: 32
    40.     # in MB
    41.     write_buffer_size: 64
    42.     # in MB
    43.     compaction_speed: 1000
    44.     # yes|no
    45.     compression: yes
    复制代码
    一个 ssdb-server 实例占用的内存瞬时(有可能, 而且即使达到, 也只是持续短时间)最高达到(MB):
    1. cache_size + write_buffer_size * 66 + 32
    复制代码
    这是对于压缩选项没有开启的情况, 如果 compression: yes, 计算公式是:
    1. cache_size + 10 * write_buffer_size * 66 + 32
    复制代码
    你可以调整配置参数, 限制 ssdb-server 的内存占用.

    SSDB命令

    与Redis类似,SSDB也支持多种数据结构(KV list, hash, soreted set),下面列出了常用命令:
    dbsize           # 返回数据库占用空间,以字节为单位
    flushdb           # 清空数据库
    info             # 返回服务器信息
    auth password      # 验证访问密码

      结构


    KV结构

    set key value
    setx key value ttl     # 设置key的同时设置ttl
    setnx key value       # 若key已存在,则不设置
    multi_set key1 value1 key2 value2 ...
    exists key
    get key
    getset key value           # 更新key,并返回旧value
    multi_get key1 key2 ...
    keys key_start key_end limit     # 返回指定范围内的key,左开右闭区间(SSDB的key有序存储)
    rkeys key_start key_end limit
    scan key_start key_end limit
    rscan key_start key_end limit
    expire key ttl
    ttl key
    del key
    multi_del key1 key2 ...
    substr key start size         # 返回子串
    strlen key
    incr key [num]
    getbit key offset
    setbit key offset val
    bitcount key [start] [end]
    countbit key start size


    hashmap结构

    hset name key value
    multi_hset name key1 value1 key2 value2 ...
    hget name key
    multi_hget name key1 key2 ...
    hgetall name
    hkeys name key_start key_end
    hscan key_start key_end limit
    hrscan key_start key_end limit
    hdel name key            # 删除一个字段
    hclear name             # 删除所有字符
    multi_hdel name key1 key2 ...
    hexists name key
    hsize name
    hincr name key [num]
    hlist name_start name_end limit      # 列出指定范围的所有hash表
    hrlist name_start name_end limit


    list结构

    qpush_front name item1 item2 ...     # 往队头插入新元素
    qpush_back name item1 item2 ...      # 往队尾插入新元素
    qpop_front name size             # 从队头弹出若干个元素
    qpop_back name size            # 从队尾弹出若干个元素
    qtrim_front name size            # 从队头移除多个元素
    qtrim_back name size           # 从队尾移除多个元素
    qfront name                # 返回队头
    qback name                # 返回队尾
    qsize name                # 返回队长
    qget name index              # 返回指定位置元素
    qset name index val
    qrange name offset limit          # 返回一个切片
    qslice name begine end          # 返回一个切片
    qclear name
    qlist name_start name_end limit
    qrlist name_start name_end limit


    sorted set结构

    zset name key socre
    zget name key
    zdel name key
    zexists name key
    zsize name
    zincr name key num

    导出/导入

    SSDB才有LSM模型,也就是说它的key是有序存储的,因此,我们可以导出所有key的数据,也可以导出指定范围内key的数据。
    1、使用ssdb-cli 命令行客户端
    导出整个数据库:
    1. # backup current database into file backup.ssdb
    2. ssdb 127.0.0.1:8888> export backup.ssdb
    复制代码
    按照 Key 区间导出数据库(交互模式)
    1. ssdb 127.0.0.1:8888> export -i backup.ssdb
    2. input KV range[start, end]:
    3.   start(inclusive, default none): a
    4.     end(inclusive, default none): z
    5. input HASH range:
    6.   start(inclusive, default none):
    7.     end(inclusive, default none):
    8. input ZSET range:
    9.   start(inclusive, default none):
    10.     end(inclusive, default none):
    11. input QUEUE range:
    12.   start(inclusive, default none):
    13.     end(inclusive, default none):
    复制代码
    命令 export -i backup.ssdb 将导出区间 [a, z] 内的 KV, 所有的 HASH, ZSET, QUEUE.
    导入命令:
    1. # import backup.ssdb into current database
    2. ssdb 127.0.0.1:8888> import backup.ssdb
    复制代码
    import 命令会把数据库中的相同 key 给替换。
    2、SSDB 另一个专门用于导出工具是 ssdb-dump,用法如下:
    1. ./tools/ssdb-dump ip port output_folder
    复制代码
    目录 output_folder 必须不存在, 因为 ssdb-dump 会创建这个目录. 导出之后, 这个目录里将有两个子目录, data 目录里包含着数据, 还有一个空的 meta 目录.
    如果想从导出的目录恢复数据,可以将 output_folder 目录拷贝到你的服务器上面,然后修改你的 ssdb.conf 配置文件, 将 work_dir 指向 output_folder 目录, 然后重启 ssdb-server。

    限制

    最大 Key 长度 200 字节
    最大 Value 长度 31MB
    最大请求或响应长度 31MB
    单个 HASH 中的元素数量 9,223,372,036,854,775,807
    单个 ZSET 中的元素数量 9,223,372,036,854,775,807
    单个 QUEUE 中的元素数量 9,223,372,036,854,775,807
    命令最多参数个数 所有参数加起来体积不超过 31MB 大小

    Replication

    Redis的主从复制在主库挂了的时候就无法再写入数据了,而SSDB不但支持主-从结构,还支持多主结构。

    主-从配置

    #server1:
    1. replication:
    2.     slaveof:
    复制代码
    #server2:
    1. replication:
    2.     slaveof:        id: svc_1        # sync|mirror, default is sync        type: sync        ip: 127.0.0.1        port: 8888
    复制代码
    主-主配置

    #server1:
    1. replication:
    2.     slaveof:        id: svc_2        # sync|mirror, default is sync        type: mirror        ip: 127.0.0.1        port: 8889
    复制代码
    #server2:
    1. replication:
    2.     slaveof:        id: svc_1        # sync|mirror, default is sync        type: mirror        ip: 127.0.0.1        port: 8888
    复制代码
    多主配置

    在一组一共包含 n 个实例的 SSDB 实例群中, 每一个实例必须 slaveof 其余的 n-1 个实例.
    1. replication:
    2.     slaveof:        id: svc_1        # sync|mirror, default is sync        type: mirror        ip: 127.0.0.1        port: 8888    slaveof:        id: svc_2        # sync|mirror, default is sync        type: mirror        ip: 127.0.0.1        port: 8889    # ... more slaveof
    复制代码
    监控

    info命令可以返回SSDB服务状态:
    1. ssdb 127.0.0.1:8899> info
    2. binlogs
    3.     capacity : 10000000
    4.     min_seq  : 1
    5.     max_seq  : 74
    6. replication
    7.     client 127.0.0.1:55479
    8.         type     : sync
    9.         status   : SYNC
    10.         last_seq : 73
    11. replication
    12.     slaveof 127.0.0.1:8888
    13.         id         : svc_2
    14.         type       : sync
    15.         status     : SYNC
    16.         last_seq   : 73
    17.         copy_count : 0
    18.         sync_count : 44
    复制代码
    binlogs,当前实例的写操作状态:

    • capacity: binlog 队列的最大长度
    • min_seq: 当前队列中的最小 binlog 序号
    • max_seq: 当前队列中的最大 binlog 序号
    replication,可以有多条 replication 记录. 每一条表示一个连接进来的 slave(client), 或者一个当前服务器所连接的 master(slaveof).

    • slaveof|client ip:port, 远端 master/slave 的 ip:port
    • type: 类型, sync|mirror
    • status: 当前同步状态, DISCONNECTED|INIT|OUT_OF_SYNC|COPY|SYNC,见下面的解释
    • last_seq: 上一条发送或者收到的 binlog 的序号
    • slaveof.id: master 的 id(这是从 slave's 角度来看的, 你永远不需要在 master 上配置它自己的 id)
    • slaveof.copy_count: 在全量同步时, 已经复制的 key 的数量
    • slaveof.sync_count: 发送或者收到的 binlog 的数量.
    关于 status:

    • DISCONNECTED: 与 master 断开了连接, 一般是网络中断
    • INIT: 初始化状态
    • OUT_OF_SYNC: 由于短时间内在 master 有大量写操作, 导致 binlog 队列淘汰, slave 丢失同步点, 只好重新复制全部的数据
    • COPY: 正在复制基准数据的过程中, 新的写操作可能无法及时地同步
    • SYNC: 同步状态是健康的

    判断同步状态

    binlogs.max_seq 是指当前实例上的最新一次的写(写/更新/删除)操作的序号;
    replication.client.last_seq 是指已发送给 slave 的最新一条 binlog 的序号;
    所以, 如果你想判断主从同步是否已经同步到位(实时更新), 那么就判断 binlogs.max_seq 和 replication.client.last_seq 是否相等。

    SSDB协议

    SSDB协议与Redis的文本协议也类似:
    SSDB数据包的结构:
    1. Packet := Block+ '\n'
    2. Block  := Size '\n' Data '\n'
    3. Size   := literal_integer
    4. Data   := size_bytes_of_data
    复制代码
    请求:
    1. Request := Cmd Blocks*
    2. Cmd     := Block
    复制代码
    请求命令包括: get, set, del, ...
    响应:
    1. Response := Status Block*
    2. Status   := Block
    复制代码
    响应状态码包括: ok, not_found, error, fail, client_error
    示例:
    用 telnet 或者 nc 命令连接到 SSDB 服务器, 然后输入下面的代码(用最后一行空行结束):
    1. 3
    2. get
    3. 3
    4. key
    复制代码
    你将看到类似这样的响应:
    1. 2
    2. ok
    3. 3
    4. val
    复制代码
    SSDB 协议解析器的C实现:
    1. #include <stdlib.h>
    2. #include <string.h>
    3. int len = buffer->size();
    4. char *ptr = buffer->data();
    5. while(len > 0){
    6.     char *data = (char *)memchr(ptr, '\n', len);
    7.     if(data == NULL){
    8.         break;
    9.     }
    10.     data += 1;
    11.     int num = data - ptr;
    12.     if(num == 1 || (num == 2 && ptr[0] == '\r')){
    13.         // Packet received.
    14.         return OK;
    15.     }
    16.     // Size received
    17.     int size = (int)strtol(ptr, NULL, 10);
    18.     len -= num + size;
    19.     ptr += num + size;
    20.     if(len >= 1 && ptr[0] = '\n'){
    21.         len -= 1;
    22.         ptr += 1;
    23.     }else if(len >= 2 && ptr[0] == '\r' && ptr[1] == '\n'){
    24.         len -= 2;
    25.         ptr += 2;
    26.     }else{
    27.         break;
    28.     }
    29.     // Data received
    30. }
    复制代码
    到此这篇关于ssdb简单介绍的文章就介绍到这了,更多相关ssdb介绍内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

    来源:https://www.jb51.net/database/294499axu.htm
    免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

    本帖子中包含更多资源

    您需要 登录 才可以下载或查看,没有账号?立即注册

    ×

    最新评论

    QQ Archiver 手机版 小黑屋 福建二哥 ( 闽ICP备2022004717号|闽公网安备35052402000345号 )

    Powered by Discuz! X3.5 © 2001-2023

    快速回复 返回顶部 返回列表