美文网首页
SSDB概要及其双主功能分析

SSDB概要及其双主功能分析

作者: 昆仑枫 | 来源:发表于2020-03-18 20:25 被阅读0次

    1、概述

    谷歌的LevelDB数据库引擎基于文件存储系统,所以它支撑量大的数据而不因为内存的限制受取约束。SSDB封装其API并支持了网络访问功能,相当于SSDB是LevelDB的一层壳。SSDB兼容Redis的大部分客户端指令,对接Redis的代码可以快速移植到SSDB。

    SSDB的用户包括百度搜索业务、360游戏中心、京东等多个国内一二线互联网厂商使用,稳定性较有保障。

    2、安装部署

    2.1、安装

    显示用下面两个指令安装基础工具后

    • yum install -y gcc*
    • yum install -y unzip zip
    • yum install -y autoconf

    再按照官方的在github项目的安装指引安装即可

    3、主要底层机制

    3.1主从同步策略

    SSDB 的主从同步策略非常简单, 就是把主(Master)上的所有写操作(Binlogs), 在从(Slave)上再执行一遍,和Mysql主从同步的的Stream模式类似。多主可以理解为互为主从。

    当然操作记录binlog不是无限记录的,ssdb只记录1000万次操作记录,更早的数据无法提现到binlog中。所以新节点加入会有一个copy的阶段,copy初始数据完成后才会进入sync阶段,通过binlog保持同步。

    更为详细的说明可以查看作者的文档(由于文章成文较早,作者的对非SSDB的问题说法不一定对,要注意判断)

    3.2 数据库引擎LevelDB

    levelDB是一个key->value 的数据存储库,其只能在本地保存数据,支持持久化,并且支持保存非常大的数据,单机redis在保存较大数据的时候数十G的时候会出现响应慢等问题,而单机levelDB数据在150G以内的时候依然可以保持比较好的性能,其随机写入key->value的数据每秒可达到40W条,每秒随机读在6W,写比读还要快,因此适用于写操作大于读操作的场景。

    4、对Redis常用指令支持度

    SSDB对Redis1的代码支持还是有些缺失,想要完全不改代码不一定做得到

    • keys、flush 实测不支持,这个对正式环境使用影响较小,正式环境一般不用
    • set key value EX seconds 不支持,有一定影响,但代码上修改拆成两步操作接口,较快修改
    • 删除整个hash、zset、lilst必须使用SSDB的客户端执行hclear、zclear、qclear命令, 无法使用Redis客户端的del key删除。影响比较大,意味着可能要使用SSDB客户端
    • 不支持set数据结构,set用hash替代勉强可以接受

    5、性能表现

    官方宣称其性能能达到Redis相当的水平。

    我使用redis-benchmark这个工具,用300个连接、随机key、十万次指令在挂载高效云盘并有IO优化的云服务器上进行各种不同情况的压测以对比redis和ssdb的性能,期间仅变动ip、端口、单数据包大小(-d参数)

    redis-benchmark -h ip地址  -p 端口 -r 100000 -t get,set,lpush,lpop -n 100000 -c 300 -d 1000 -q
    

    5.1、单机本机压测性能

    单数据包大小为1k时ssdb性能get、set指令超过8、9成

    redis表现

    SET: 82987
    GET: 84175
    

    ssdb表现如下,在set指令上差距较大

    SET: 60496
    GET: 76687
    

    将单元数据调大为10k时,ssdb性能表现下降较大

    redis表现

    SET: 75187
    GET: 83752
    

    ssdb表现如下,在set指令上性能下降较大

    SET: 29095
    GET: 51229
    

    5.2 单实例非本机性能测试

    使用1k大小的单数据包测试ssdb和客户端在同一个阿里云大区的不同服务器时的性能。

    • 比起本机压测,性能下降了10-30%,应该主要是网络延时
    SET: 47687
    GET: 42337
    

    5.3、双主同步性能

    5.3.1、双主配置

    配置双主,修改ssdb.conf文件的replication:slaveof 中四个字段即可。其中host和port为另一个实例的ip和por;id字段填写对方的实例id,id自行分配,在集群中唯一即可;双主时type字段用mirror。

    双主的配置示例

    server1

    replication:
        slaveof:
            id: svc_2
            type: mirror
            host: svc_2的ip
            port: 8889
    

    server2

    replication:
        slaveof:
            id: svc_1
            type: mirror
            host: svc_1的ip
            port: 8888
    

    配置完毕启动实例后连接ssdb数据库使用info指令获取集群同步状态信息

    如果配置主从,主机不配置slaveof下的字段,从机配置即可,type需要设置为sync。

    如果是多主,在一组一共包含 n 个实例的 SSDB 实例群中, 每一个实例必须在slaveof配置其余的n-1个实例,示例如下:

    replication:
        slaveof:
            id: svc_1
            type: mirror
            host: localhost
            port: 8888
        slaveof:
            id: svc_2
            type: mirror
            host: localhost
            port: 8889
        # ... more slaveof
    
    5.3.2、双主集群下性能

    阿里云同一个大区的两个ECS组成双主集群情况下性能和单机没什么区别

    SET: 62829.86 
    GET: 81314.03 
    

    不同大区异地同步性能因为没有足够大的专线带宽,测试时带宽会成为瓶颈,没有进行。

    6、评价及优缺点

    优点

    • 因为大量使用硬盘存储,成本较低,支持海量数据,这个可能就是很多互联网大厂使用的原因
    • 兼容redis的大部分指令,从redis切换过来成本比较低

    缺点

    • 个人项目,社区和持续维护方面和Redis差距非常大。比如项目的issue列表里有一些比较严重的可用性Bug,未见到明确修改的答复和计划。例如这个https://github.com/ideawu/ssdb/issues/1256
    • 性能测试时发现使用10K的数据包性能下跌相较Redis下降较严重。
    • 限制占用带宽的配置 sync_speed 没有效果,设置了也会占满带宽
    • 对Hash、list等集合的del指令不支持带来比较严重的影响
    • 复杂度比Redis高不少,毕竟要了解LevelDb

    总的来说,SSDB明显优势是海量数据存储和低成本以及有双主模式。但是由于社区和开发者都不活跃,使用者要做好有专人深入研究并看源码解决问题的准备,否则不建议使用。

    7、参考资料

    相关文章

      网友评论

          本文标题:SSDB概要及其双主功能分析

          本文链接:https://www.haomeiwen.com/subject/zracyhtx.html