[翻译]有关cassandra的存储引擎

Cassandra使用一个类似于日志结构的结合树(Log-Structured Merge Tree)的存储结构,不像传统关系数据库那样使用B-Tree。 Cassandra会避免在写之前去读。

“写前读”(Read-before-write), 特别是在一个大的分布式系统里,会对读性能产生影响,还会带来其它问题,比如,两个客户端同时去读,其中一个去更新该行的A列,另外一个去更新该行的B列,就可能把对A列的更新覆盖掉。“写前读”,也会破坏cache,增加IO。

为了避免“写前读”的情况,cassandra的存储引擎会对即将要进行的插入、更新进行整理,只会按顺序,以追加的模式仅写入这一行更新的部分。

一个日志模式的存储引擎,为了避免数据相互覆盖,使用顺序IO去更新数据写入普通硬盘HDD或者固态硬盘SSD是必须的。

在HDD中,随机写比顺序写会导致大量的寻址操作,这个寻址操作的危害是相当大的。使用顺序IO,从而避免更多写入被放大和磁盘故障,Cassandra特别适合廉价的、大众消费的SSD。

  1. 杨真真说道:

    上个问题有点儿问题,正确的是这样的:
    create or replace function bigint_plus(res list)
    returns null on null input
    returns bigint
    language java
    as ‘
    java.util.List results = res;
    Long result = 0l;
    if(results.size() > 1){
    for(Long element : results){
    result += element;
    }
    }else{
    result = results.get(0);
    }
    return result;
    ‘;

    表结构:
    create table IF NOT EXISTS mykeyspace1.r_sp_flow_5m(
    sp text,
    record_time timestamp,
    area_flow_rate map,
    area_isp_flow_rate map,
    flow_rate bigint,
    r_d_flow_rate bigint,
    isp_flow_rate map,
    PRIMARY KEY (sp,record_time)
    );
    我想查询select bigint_plus([flow_rate,r_d_flow_rate]) from r_sp_flow_5m;但是这样写不对,请问这种的该怎么写

  2. 杨真真说道:

    cassandra里写了一个udf:
    create or replace function bigint_plus(res list)
    returns null on null input
    returns bigint
    language java
    as ‘
    java.util.List results = res;
    Long result = 0l;
    if(results.size() > 1){
    for(Long element : results){
    result += element;
    }
    }else{
    result = results.get(0);
    }
    return result;
    ‘;
    那我cql查询的时候怎么用这个定义的bigint_plus函数呢?

  3. 杨真真说道:

    cassandra里的session,每次打开都比较慢,session能一直开着吗?

    1. 大岩不灿说道:

      不是能不能,就需要一直开着,一个session就是一个连接池。

  4. 杨真真说道:

    create table IF NOT EXISTS mykeyspace1.r_sp_flow_5m(
    sp text,
    record_time timestamp,
    area_flow_rate map,
    area_isp_flow_rate map,
    flow_rate bigint,
    isp_flow_rate map,
    PRIMARY KEY (sp,record_time)
    );

    当我查询:
    SELECT record_time,isp_flow_rate FROM mykeyspace1.r_sp_flow_1m WHERE record_time>=’2016-07-18 04:00:00+0800′
    AND record_time<'2016-07-18 10:45:00+0800' AND sp IN ('wasu','tbugc','vimg','vvod','t2cn','shcdn','shsis','shclo', 'cmvid','tvxio','spmk','SHPOR','qnw','hlwb1','hlvd','dlb','cmcctemp','CMCCTST','hlzb','shcacti','zwxx','7nlgw', 'SH_LOGDOWN','hdff','hdcj','xlwhls','dlbapk','xjsx','astvxx','sdtv','borncloud','9xiu','51auto','ADN_PORTAL', 'xinan','testhz','ph51','cdvcloud','xinanbj','testbj','xinangd','testgd','xinanhb','testhb','zqlive', 'bjbgp_top01','bjbgp_top02','whunicom_top01','whcnnet_top02','tongbu','xinan_sc','winisms','test_sc', 'test2_sc','Hxat','thaima','tjnsbd','shcnnet_top01','shcnnet_top02','shatacacti','tbfwl','zsctnet_top01', 'zsctnet_top02','tyoum','ywbnzzt','domainnslookup','ywbnffdc','wanbatv','tfengx','vpntest','tqiku', 'tqijia','huoxiu','sptest','tianmai','tbokecc','szlive','tjac','hmlive','tvgdn','wmsj','elive','nullsp', 'bestv','downloadtest','ltdk','yiyun','testhls','suicam','gystv','tmmb','huaxia','htlive','gdctms', '139b2b','ttest','zjxs','wepiao','dfsj','chunshuitang','adncst','dusl','workercn','ebhnet','unixidc', 'wanke','mgtv','gouwubang','teddymobile','yppl','xlwlive','koolearn','shatacloud','suning','xiaoying', '163upload','pudonglive','nwd','jiayou','tvmore','sportlive','cqtj','aipai','fyfx','5173cdn','vtccloud', 'shatalibs','tcpmeituan','klhz','jjhlive','hn_live_165','qjwl','xdy','xlwtest','gotlive','yunduan', 'yjwl','gensee','gcloud','zbjy','kdwl','vhall','blive','xlwcdn','gly') ; 这样查询的效率比较慢,请问有什么好的办法可以提高查询效率吗

    1. 大岩不灿说道:

      sp是分区主键,你的sp由不一样,这个查询肯定不快。
      你可以异步并发请求每个sp。

留言

提示:你的email不会被公布,欢迎留言^_^

*

验证码 *