• 2013-01-05

    SSDB 解决了 Snappy 导致 LevelDB 编译失败的问题

    Views: 31412 | 15 Comments

    有不少用户反馈, 对于曾经编译和安装过 LevelDB 和 Snappy 的环境, 编译 SSDB 会出错. 问题出在 LevelDB 无法正确地找到 Snappy 的库(libsnappy), 而且, SSDB 本身没有考虑 -lsnappy 选项.

    最终我决定手动修改 LevelDB 的 Makefile 和 build_detect_platform 两个文件, 完全放弃 Snappy. 但 SSDB 将会在未来的版本中增加 Snappy(直接打包附带源码), 而不是使用系统已安装的 Snappy.

    请下载 SSDB 1.1.3: https://code.google.com/p/zdb/downloads/list https://github.com/ideawu/ssdb

    开发进度预告: 经过前段时间紧张的开发, 支持主从(master-slave)复制功能的 SSDB 版本 1.2 已经基本开发完毕, 目前在整理代码, 近几天就可以发布! 该主从同步方案用 LevelDB 存储库的更新 Log, 并按 LevelDB 内部的序号组织, 所以主从同步可以容忍非常糟糕的网络环境和非期待的异常当机.

    Posted by ideawu at 2013-01-05 14:08:05 Tags: ,
  • 2012-12-28

    在PHP代码中使用LevelDB

    Views: 33071 | 3 Comments

    众所周知, LevelDB 只是一个 C/C++ 的编程语言库, 所以, PHP是无法直接使用 LevelDB 的. 如果 PHP 项目想要使用 LevelDB, 一种方法是用 C 语言开发, 把 LevelDB 封装成 PHP 的一个模块, 另一种方法是将 LevelDB 封装成一个网络服务器.

    开发 PHP 的 LevelDB 模块的方式适用性不是很高, 因为这种模式限定了必须是单机存储而且必须和 PHP 处在同一台机器. 在代码和数据分离的原则下, 将 LevelDB 封装成一个网络服务是更佳的选择.

    SSDB 就是一个 LevelDB 的服务器(LevelDB Server), 以 LevelDB 作为存储引擎, 支持 PHP/Java/Python/C/C++ 等客户端. 下面是一个 PHP 连接 SSDB, 也即 PHP 使用 LevelDB 的例子:

    <?php
    require_once('SSDB.php');
    $ssdb = new SimpleSSDB('127.0.0.1', 8888);
    $resp = $ssdb->set('key', '123');
    $resp = $ssdb->get('key');
    echo $resp; // output: 123
    

    完整 API 见 SSDB 项目 Wiki.

    SSDB 已经在 IT 牛人博客聚合网站得到应用, 非常稳定. 而且, SSDB 支持在线备份功能, 可以通过网络备份数据, 不再担心数据丢失. SSDB 还支持主从同步复制(Replication), 可用于负载均衡.

    SSDB - LevelDB Server 下载地址: https://code.google.com/p/zdb/downloads/list

    Posted by ideawu at 2012-12-28 12:00:48 Tags: ,
  • 2012-12-27

    SSDB 已经支持在线备份功能!

    Views: 26595 | 12 Comments

    SSDB 1.1.0 已经发布! 这个版本支持了在线备份功能, 可以在不停止服务的情况下备份服务器数据. 这个功能让 SSDB 更加成为一个真正生产环境的存储服务器!

    备份

    ./tools/ssdb-dump 127.0.0.1 8888 ./backup_dir
    

    这条命令从监听在 127.0.0.1:8888 的 SSDB 服务器上备份全量的数据, 保存到本地新创建的目录 backup_dir, 这个目录其实是一个 LevelDB 的数据库(db).

    恢复

    恢复方案非常简单.

    backup_dir 传输到服务器, 修改新ssdb服务器的配置文件, 将 SSDB 使用的数据库名改为 backup_dir, 然后重启 SSDB 即可.

    下一步

    SSDB 的下一个特性将是同步复制, 也即常说的"主从(Master-Slave)架构", 一旦同步复制功能加入进来, SSDB 将变得更加适合生产环境使用. 毕竟, 单份的数据总是让人不放心, 必须得复制多份保存下来才能让人安心. ssdb-dump 虽然可以达到此目的, 但还是一种被动的备份方式. 而同步复制功能将是分布式的基础. 主从架构还能用作简单的负载均衡.

    SSDB 是一个 LevelDB 服务器, 项目主页: https://code.google.com/p/zdb/

    Posted by ideawu at 2012-12-27 00:10:06 Tags: ,
  • 2012-12-19

    SSDB – 支持 zset 的 LevelDB 服务器

    Views: 25637 | No Comments

    Google 开源的 LevelDB 是一个单纯的 key-value 存储的类库, 可以理解为是一个存储引擎, 并不是常见意义的服务器. 你无法通过网络接口来使用它, 只能用 C/C++ 语言才能使用它.

    LevelDB 速度非常快, 是 Google 内部分布式存储系统 Bigtable 的存储引擎的开源版本, 作为分布式系统的一个存储节点(Tablet). LevelDB 的设计思想和 Google 内部的版本部分相同, 但肯定也被隐藏了一些接口和思想, 而这部分很可能是非常重要和关键的.

    Continue reading »

    Posted by ideawu at 2012-12-19 13:48:10 Tags: ,
  • 2012-11-16

    必须放在循环中的pthread_cond_wait

    Views: 11216 | No Comments

    消费者线程(多个):

    // *错误做法*
    lock(my_lock){
        if(wait = 1){
            pthread_cond_wait(cond, my_lock);
        }
        wait = 1;
    }
    

    生产者线程:

    lock(my_lock){
        wait = 0;
        pthread_cond_signal(cond);
    }
    

    由于在 if(wait=1) 之后和 pthread_cond_wait() 在之前, wait 有可能已经被其它消费者线程更改了.

    所以, 必须把 pthread_cond_wait() 放在循环中:

    // 正确做法
    lock(my_lock){
        while(wait = 1){
            pthread_cond_wait(cond, my_lock);
        }
        wait = 1;
    }
    
    Posted by ideawu at 2012-11-16 18:36:55
  • 2012-11-16

    C++成员函数作为pthread_create参数

    Views: 8059 | No Comments

    很久以前已经说过, C++指向类成员函数的指针非常变态, 如果要把类成员函数作为线程 pthread_create 的参数, 就更复杂!

    class A{
    public:
        void run(){
        }
    
        static void *run_helper(void *arg){
            ((A *)arg)->run();
            return (void *)NULL;
        }
    };
    
    A a;
    pthread_t t;
    pthread_create(&t, NULL, &A::run_helper, &a);
    

    本来我们希望把 a.run 作为参数, 为此, 必须创建一个 static 的 run_helper() 函数, 然后在 run_helper() 中调用 run().

    Posted by ideawu at 11:02:04
|<<<456789101112>>>| 9/12 Pages, 68 Results.