• 全内存的redis用习惯了?那能突破内存限制类redis产品ssdb呢?


               首先说一下背景,在双十一的时候,我们系统接受X宝的订单推送,同事原先的实现方式是使用redis的List作为推送数据的承载,在非大促的场景下,

    一切运行正常,内存占用大概3-4G,机器是16G内存。由于提前预计不足,在双十一来临的时候,订单瞬时量达到了平时的10X倍,内存非常吃紧,情况算

    是非常紧急了,采取的临时解决方案就是再开一个redis,将程序中的redis地址指向这台新的,重启一下程序,把数据暂时引导过去。

    一:分析

             redis确实是一个好东西,一个如此强大的内存数据结构服务器,全内存存储,有些场景,恰恰你会死在全内存上,而且相对ssd硬盘来说,内存还是

    太小了。内存很便宜,但是内存和ssd比起来很贵,况且有些场景你可能根本不需要使用全内存,使用硬盘也许会更能帮助我们节省成本,你可能会说,现

    在业界标准已经差不多是kafka了,有时候我们还需要redis里面的hash,也就是说我现在需要kafka + redis 的一个综合体的产品,这就是本篇和大家说到的

    ssdb,当然ssdb和kafka还是不能相提并论的哈,毕竟我是在选择一个轻量级的解决方案。

    二:ssdb说明

            ssdb是一个使用leveldb做为底层存储的nosql数据库,好处就是可以利用redis中的所有数据结构,而且数据还是基于硬盘的,所以可以存储的数据比

    redis大的不要太多,官方文档的说法就是用来替代redis的,而且让你眼前一亮的就是,它对.net还是比较友好的,一个很不错的解决方案,不过成熟度不

    如redis,大家前期可以当缓存用用,或者存储一些非关键性数据,节省节省内存空间。目前我在项目中用起来了。

    1. 使用hash来存customerID 和customerNick的映射关系。

    2. 使用List来承载X宝的订单推送。

    三:快速搭建

          官方下载:http://ssdb.io, 有一点要注意的就是官方文档明确表示,CentOS7的文件句柄设置问题,建议不要在centos7上进行搭建,具体的说明

    可以看看这个:http://ssdb.io/docs/zh_cn/config.html ,大家可以用用centos6.5或者ubantu吧。

    1. wget下载和unzip解压。

    [root@localhost apps]# wget https://codeload.github.com/ideawu/ssdb/zip/master
    
    --2017-12-02 03:02:18-- https://codeload.github.com/ideawu/ssdb/zip/master
    
    Resolving codeload.github.com (codeload.github.com)... 192.30.255.120, 192.30.255.121
    
    Connecting to codeload.github.com (codeload.github.com)|192.30.255.120|:443... connected.
    
    HTTP request sent, awaiting response... 200 OK
    
    Length: 1595060 (1.5M) [application/zip]
    
    Saving to: ‘master’
    
     
    100%[==================================================================>] 1,595,060 69.3KB/s in 36s
    
     
    2017-12-02 03:02:57 (43.7 KB/s) - ‘master’ saved [1595060/1595060]
    
    [root@localhost apps]#unzip master
    
    [root@localhost apps]# ls
    
    master ssdb-master

     2. 使用make对C++代码进行编译

    [root@localhost ssdb-master]# make

    3. 编译完之后,一泡尿的功夫,这个ssdb-server可执行文件就出来了。

    [root@localhost ssdb-master]# ls
    api              ChangeLog  Dockerfile  Makefile   ssdb.conf        tools      version
    build_config.mk  data       docs        README.md  ssdb-server      var
    build.sh         deps       LICENSE     src        ssdb_slave.conf  var_slave

    4.然后我们把ssdb.conf配置一下

        这里面有三个配置要注意下:

    <1> work_dir: 存放data和meta的目录,可以在ssdb-master文件夹下mkdir data文件夹。

    <2> ip:设为0.0.0.0,让所有的主机都能够连接上来。

    <3> port  8888 :这个是默认的ssdbserver端口号,大家可以看情况修改。

    完整配置如下:

    # ssdb-server config
    # MUST indent by TAB!
    
    # absolute path, or relative to path of this file, directory must exists
    work_dir = /usr/apps/ssdb-master/data
    pidfile = ./var/ssdb.pid
    
    server:
            ip: 0.0.0.0
            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
            # auth password must be at least 32 characters
            #auth: very-strong-password
            #readonly: yes
            # in ms, to log slowlog with WARN level
            #slowlog_timeout: 5
    
    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: log.txt
            rotate:
                    size: 1000000000
    
    leveldb:
            # in MB
            cache_size: 500
            # in MB
            write_buffer_size: 64
            # in MB/s
            compaction_speed: 1000
            # yes|no
            compression: yes

     5. 启动ssdb-server,指定一下配置文件,采取静默启动

    [root@localhost ssdb-master]# ./ssdb-server ./ssdb.conf -d
    ssdb-server 1.9.6
    Copyright (c) 2012-2015 ssdb.io
    
    [root@localhost ssdb-master]# netstat -tlnp
    Active Internet connections (only servers)
    Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name    
    tcp        0      0 192.168.122.1:53        0.0.0.0:*               LISTEN      1869/dnsmasq        
    tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN      1115/sshd           
    tcp        0      0 127.0.0.1:631           0.0.0.0:*               LISTEN      1117/cupsd          
    tcp        0      0 0.0.0.0:8888            0.0.0.0:*               LISTEN      12994/./ssdb-server 
    tcp        0      0 127.0.0.1:25            0.0.0.0:*               LISTEN      1627/master         
    tcp6       0      0 :::22                   :::*                    LISTEN      1115/sshd           
    tcp6       0      0 ::1:631                 :::*                    LISTEN      1117/cupsd          
    tcp6       0      0 ::1:25                  :::*                    LISTEN      1627/master         
    [root@localhost ssdb-master]# 

      可以看到,上面的8888端口已经成功开启,没毛病。

    四:使用C#客户端

            在http://ssdb.io/docs/zh_cn/clients.html上面列出了各个语言的客户端SDK,这里我就选择C#的SDK:https://github.com/ssdb/dotnetssdb

          可以看到,里面没啥东西,就三个破文件,里面并没有实现ssdb应该有的所有功能,所以大家可以根据自己的需要进行封装,连接池啥的都要

    你自己根据需要实现吧,好了,接下来我用hash简单的测试一下:

        class Program
        {
            static void Main(string[] args)
            {
                Client client = new Client("192.168.23.153", 8888);
    
                client.hset("customerHash", "customerID", "1000");
    
                string val = string.Empty;
    
                client.hget("customerHash", "customerID", out val);
    
                Debug.WriteLine("customerID= " + val);
    
                client.close();
            }
        }

        好了,本篇先就说到这里,希望对你有帮助。

  • 相关阅读:
    mysql复合索引的优点和注意事项
    linux服务器时间更新
    mysql慢日志
    Proftpd linux服务器FTP安装配置
    js 截取字符串
    在工信部注销网站备案
    史玉柱传奇
    css white-space属性
    获取微信授权
    禁用ipv6
  • 原文地址:https://www.cnblogs.com/huangxincheng/p/7955473.html
Copyright © 2020-2023  润新知