cassandra在服务端像leveldb一样进行插入初试成功

Posted longbigfish

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了cassandra在服务端像leveldb一样进行插入初试成功相关的知识,希望对你有一定的参考价值。

经过研究,决定在 cql3/QueryProcessor.java 里面下手。

 

这里有两个函数,第一个是

            public ResultMessage process(String queryString, QueryState queryState, QueryOptions options, long queryStartNanoTime)

该函数接受到 String 类型的sql语句,进行规整处理(判断是否合法),然后 调用 函数

            processStatement(prepared, queryState, options, queryStartNanoTime);

进行具体的处理。

 

我们在同一个类里面建立bench函数

        public void Bench(String queryString, QueryState queryState, QueryOptions options, long queryStartNanoTime)

在 process 函数开始时调用bench函数。

但是注意:如果不加处理,cassandra启动后会陷入某种无限循环导致一直无法进入服务状态(客户端无法操作数据库)

因此,在调用 bench 之前,加入if语句,判断如果 queryString 中含有某字符(bench)再调用bench函数。

注意需要将判断语句放在开始,这样可以使用任意的 query语句触发bench函数。否则如果放在后面,如果query语句非法,规整处理会直接返回。

 

 

bench函数被调用后,可以更改传递过来的 sql语句,然后调用    

          processStatement 

完成处理。

 

测试:在bench函数中使用insert语句,结果插入成功。

 

 

------------------------------问题

只能插入一条,如果插入多条的话,会发生错误。

WriteTimeout: Error from server: code=1100 [Coordinator node timed out waiting for replica nodes‘ responses] message="Operation timed out - received only 0 responses." info={‘received_responses‘: 0, ‘required_responses‘: 1, ‘consistency‘: ‘ONE‘}

以上是关于cassandra在服务端像leveldb一样进行插入初试成功的主要内容,如果未能解决你的问题,请参考以下文章

如何从 cassandra 或 hbase 中提取 leveldb 类型的数据存储(sstable + memtable)?

Cassandra-LSM树

经典开源代码分析——Leveldb高效存储实现

在 OpenSuse 上将 Cassandra 作为服务运行

ledisDB底层实现——本质上就是用leveldb这样的底层存储,和ssdb一样,meta里存的是hashlist等的元数据

添加新服务器时对 Cassandra 中的数据进行重新分区