Redis的VM实现——终究敌不过业务架构师!

  • Post author:
  • Post category:其他


http://blog.csdn.net/freas_1990/article/details/18718251

Redis的VM机制将会成为历史,不过,回顾一下历史,未尝不是一件乐事。

我们来看一下redis的VM设计。

/* The VM pointerstructure - identifies an object in the swap file.
 *
 * This object is stored in place of the value
 * object in the main key->value hash tablerepresenting a database.
 * Note that the first fields (type, storage)are the same as the redisObject
 * structure so that vmPointer strucuters canbe accessed even when casted
 * as redisObject structures.
 *
 * This is useful as we don't know if a valueobject is or not on disk, but we
 * are always able to read obj->storage tocheck this. For vmPointer
 * structures "type" is set toREDIS_VMPOINTER (even if without this field
 * is still possible to check the kind ofobject from the value of 'storage').*/
typedef structvmPointer {
    unsigned type:4;
    unsigned storage:2; /* REDIS_VM_SWAPPED orREDIS_VM_LOADING */
    unsigned notused:26;
    unsigned int vtype; /* type of the objectstored in the swap file */
    off_t page;         /* the page at witch the object isstored on disk */
    off_tusedpages;    /* number of pages used ondisk */
} vmpointer;


vmPointer指向了某一个object在磁盘文件上的存储page起始地址和占用page数。

而这里的文件,就是通过open()调用生成的普通文件,可以用ls -l命令看到完整的属性。

再看一个redis的VM核心filter:

/* Write the specified object atthe specified page of the swap file */
int vmWriteObjectOnSwap(robj *o,off_t page) {
    if (server.vm_enabled) pthread_mutex_lock(&server.io_swapfile_mutex);
    if(fseeko(server.vm_fp,page*server.vm_page_size,SEEK_SET) == -1) {
        if (server.vm_enabled)pthread_mutex_unlock(&server.io_swapfile_mutex);
        redisLog(REDIS_WARNING,
            "Critical VM problem invmWriteObjectOnSwap(): can't seek: %s",
            strerror(errno));
        return REDIS_ERR;
    }
    rdbSaveObject(server.vm_fp,o);
    fflush(server.vm_fp);
    if (server.vm_enabled)pthread_mutex_unlock(&server.io_swapfile_mutex);
    return REDIS_OK;
}


其实,写入到VM file里的方法和RDB的方法是一样的。

Redis采用VM机制是希望把存储做成如同Oracle一样的方式,具备自动淘汰冷热数据功能,但是,它采用了RDB文件和VM机制来分别实现二进制存储、冷热淘汰的功能,确实有些画虎不成反类猫的味道。

对于一个面世不久的server软件而言,冷热数据淘汰机制,很难比Linux操作系统本身更加优秀。

redis之所以高性能最本质的原因是,数据都cache到内存里,或者热数据都cache到内存里。

VM机制试图达到既节约内存又高性能的完美地步,有些吹毛求疵了。

而最新的diskstore试图在这条路上越走越远!

然而,个人认为,这并非一条光明大道!

VM机制在生产中的失败,本质原因是应用的冷热淘汰问题而非server软件本身!传统的数据库行业,对事务要求精确,而对性能稍有容忍。互联网行业刚好相反,对事务几乎没有要求(电子商务、电子支付除外),只要性能好、稳定就行。而性能好归根结底需要把热数据cache到内存。而冷热分离归根结底需要架构师做良好的业务架构!


server软件再强,也敌不过垃圾的业务架构师!

无论是VM还是diskstore,在复杂业务面前,很难让众多的口味得到满足。

而最后的最后,只有业务架构师能把单买好!



版权声明:本文为u012275397原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。