详解NoSQL数据库Apache Cassandra的配置

在这里我们将介绍的是NoSQL数据库Apache Cassandra的配置与相关问题。现在数据库市场对于NoSQL的关注度日益升高,我们也该看到未来数据库技术的变革

上次说了安装的问题,可以参考《VirtualBox 虚拟机 Debian系统上安装Cassandra步骤及遇到的问题》。当然,在windows下也可以使用,但是要设置JAVA_HOME参数,然后启动目录 bin里的cassandra.bat。编辑cassandra.bat看到

 
 
  1. if NOT DEFINED CASSANDRA_HOME set  CASSANDRA_HOME =%CD% 

改成

 
 
  1. if NOT DEFINED CASSANDRA_HOME set  CASSANDRA_HOME = F :/apache-cassandra-0.5.1 

“F:/apache-cassandra-0.5.1”是我的安装目录。

一、cassandra的单节点服务器配置

先说下cassandra的配置,还是讲Linux下的。需要配置的文件一共有三个,当然,也可以使用默认配置。

这个三个文件分别是:

bin/cassandra.in.sh

conf/log4j.properties

conf/storage-conf.xml

其中,log4j.properties是日志的配置,其它两个是配置的运行环境。

cassandra.in.sh文件一般不需要调整,当然,加入你没有使用alternatives调整java的默认环境,而你又需要使用 jre6.0,这种情况下,可以设置cassandra.in.sh中

 
 
  1. # JAVA_HOME =/usr/local/jdk6 

JAVA_HOME=/usr/local/jre6   #这里是你的jre解压缩的路径

log4j.properties的配置网上讲的很多,就不说了。

storage-conf.xml的配置是最重要的。

第一个是Keyspaces,这个默认只设置了Keyspace1,可以增加另外的Keyspaces。客户端调用需要使用这个名字。

Keyspace节点中的KeysCachedFraction设置的键索引的内存大小。说明上也写了,假如键的数量较少,长度较长,可以增加这个 值。而设置为0,则是禁用。

接下来是设置ColumnFamily,这里配置的名称,在客户端调用时候也要是有。另外还指定了列的类型。

ReplicationFactor设置了副本的数目,这个是在分布式部署中有用,保持数据的冗余,以至于某几台服务坏掉,能保证数据完整。

CommitLogDirectory以及接下来的几行都是设置目录的,这个就不说了。

Seeds也是和分部署主从服务器部署方式有关的,本文不准备讲这个。

ThriftAddress是比较重要的,这个是设置客户端访问的,而ThriftPort是设置访问的端口。接下来的部分是和性能有关的,这些说 明可以仔细阅读。贫道对下面的设置也理解不深入,就不献丑了。

二、如何编程访问cassandra

从http://incubator.apache.org/cassandra/找了好久,找到了http://github.com /rantav/hector  (java)。这个是一个访问cassandra的包装。很遗憾的是,我使用这个包装访问时候,读取一个Key的值需要 7~8秒!!!晕倒。我开始以为是虚拟机的原因,结果部署到其他两台linux服务器上还是一样。当然这些机器和我的机器都不在同一个网段,我不知道这点 是不是会对性能有很大的影响。后来,我放到自己机器上,以及把写好的程序当道目标机器上,读取速度变成了20MS每条。性能相差也太大了。一个是速度慢得 和蚂蚁一样,而第二次则是坐上乌龟了。

其它语言的访问包装可以在http://wiki.apache.org/cassandra/ClientExamples 这里找到。当然,没 有C#的。

三、用C#和Java访问cassandra

cassandra用到了另外一个好用的东西:thrift。这个东东可以在http://www.thrift-rpc.org/下载。

具体在http://www.thrift-rpc.org/?p=thrift.git;a=shortlog;h=refs/misc /instant,一般点第一个snapshot就行了,这是最新的。版本几个小时更新一个,太牛叉了。

下载完后,搞到Linux上,解压。进入目录后进行安装。

 
 
  1. #chmod +x *  //设置执行权限  
  2. #./bootstrap.sh  
  3. #./configure  
  4. #make  
  5. #make install 

安装好了,接下来,开始生成操作。

切换到cassandra的interface目录。

然后,使用/home/xieping/thrift/ompiler/cpp/thrift -gen csharp cassandra.thrift 命令生成。运行该命令后,在interface目录增加了gen-csharp目录。把它搞到你的机器,然后,切换到/home/xieping /thrift/lib/csharp目录。把src目录搞下来。打开Thrift.csproj文件,右键Thrift项目,设置编译符号为 NET_2_0。新建个C#项目,把gen-csharp目录下的东西添加进去,然后,引用Thrift项目,就可以写以下代码调用:

 
 
  1. using  System;  
  2. using  Thrift.Transport;  
  3. using  Thrift.Protocol;  
  4. using  Apache.Cassandra; namespace  TestCa {      
  5. class  Program {          
  6. static   void  Main( string [] args)   
  7. {              
  8. TTransport transport =  new  TSocket( "192.168.93.30" , 9160);              
  9. TProtocol protocol =  new  TBinaryProtocol(transport);              
  10. Cassandra.Client client =  new  Cassandra.Client(protocol);              
  11. transport.Open();              
  12. System.Text.Encoding utf8Encoding = System.Text.Encoding.UTF8;              
  13. long  timeStamp = DateTime.Now.Millisecond;            
  14. ColumnPath nameColumnPath =  new  ColumnPath() {                  
  15. Column_family =  "Standard1" ,                  
  16. Column = utf8Encoding.GetBytes( "name" )              
  17. };              
  18. client.insert( "Keyspace1" ,                            
  19. "1" ,                          nameColumnPath,                          
  20. utf8Encoding.GetBytes( "测试输入1" ),    
  21. timeStamp,   
  22. ConsistencyLevel.ONE);              
  23. client.insert( "Keyspace1" ,                            
  24. "2" ,                            
  25. nameColumnPath,                            
  26. utf8Encoding.GetBytes( "测试输入2" ),                            
  27. timeStamp,                            
  28. ConsistencyLevel.ONE);              
  29. ColumnOrSuperColumn returnedColumn = client. get ( "Keyspace1""1" , nameColumnPath, ConsistencyLevel.ONE);              
  30. Console.WriteLine( "Keyspace1/Standard1 列值: 键: {0}, 值: {1}" ,                                
  31. utf8Encoding.GetString(returnedColumn.Column.Name),                              
  32. utf8Encoding.GetString(returnedColumn.Column.Value));            
  33. transport.Close();              
  34. Console.ReadKey();          
  35. }    }} 

而Java的就变成

/home/xieping/thrift/ompiler/cpp/thrift -gen java cassandra.thrift

java相应的代码

 
 
  1. import   static  me.prettyprint.cassandra.utils.StringUtils.bytes;  
  2. import  java.io.UnsupportedEncodingException;  
  3. import  org.apache.cassandra.service.Cassandra;  
  4. import  org.apache.cassandra.service.ColumnOrSuperColumn;  
  5. import  org.apache.cassandra.service.ColumnPath;  
  6. import  org.apache.cassandra.service.ConsistencyLevel;  
  7. import  org.apache.cassandra.service.InvalidRequestException;  
  8. import  org.apache.cassandra.service.NotFoundException;  
  9. import  org.apache.cassandra.service.TimedOutException;  
  10. import  org.apache.cassandra.service.UnavailableException;  
  11. import  org.apache.thrift.TException;  
  12. import  org.apache.thrift.protocol.TBinaryProtocol;  
  13. import  org.apache.thrift.protocol.TProtocol;  
  14. import  org.apache.thrift.transport.*; public   class  Program {      
  15. public   class  s{              
  16. }          
  17. /**     * @param args       
  18. * @throws Exception        
  19. */       
  20. public   static   void  main(String[] args)  throws  Exception {          
  21. Long startTime = System.currentTimeMillis();           
  22. for ( int  i =  0 ;i <  10000 ;i++){              
  23. run();          
  24. }          
  25. Long endTime = System.currentTimeMillis();         System.out.println( "程序运行到此处计算机当前毫秒数 "  + startTime);          
  26. System.out.println( "程序共计运行 " + (endTime-startTime)+ " 毫秒" );      
  27.  }          
  28. static   void  run()  throws  InvalidRequestException, UnavailableException, TimedOutException, TException, NotFoundException, UnsupportedEncodingException{        TTransport transport =  new  TSocket( "192.168.93.30" , 9160 );          
  29. TProtocol protocol =  new  TBinaryProtocol(transport);          
  30. Cassandra.Client client =  new  Cassandra.Client(protocol);          
  31. transport.open();          
  32. Long timeStamp = System.currentTimeMillis();                   
  33. ColumnPath nameColumnPath =  new  ColumnPath( "Standard1" , null ,bytes( "name" ));          
  34. client.insert( "Keyspace1" ,                        
  35. "1" ,                      nameColumnPath,                        
  36. bytes( "测试数据1" ),                      timeStamp,                      ConsistencyLevel.ONE);          
  37. client.insert( "Keyspace1" ,                        
  38. "2" ,                      nameColumnPath,                        
  39. bytes( "测试数据2" ),                      timeStamp,                      ConsistencyLevel.ONE);          
  40. ColumnOrSuperColumn returnedColumn = client.get( "Keyspace1""1" , nameColumnPath, ConsistencyLevel.ONE);                  
  41. System.out.println(String.format( "key:%s;value:%s" ,                   
  42. new  String(returnedColumn.column.name),                 new  String(returnedColumn.column.value, "utf-8" )));          
  43. transport.close();     
  44.  }    } 
原文标题: facebookde 的 NoSQL数据库cassandra的配置与调用(java&&c#)
Cassandra是一个混合型的非关系的数据库,类似于Google的BigTable。其主要功能比Dynomite(分布式的Key-Value存储系统)更丰富,但支持度却不如文档存储MongoDB(介于关系数据库和非关系数据库之间的开源产品,是非关系数据库当中功能最丰富,最像关系数据库的。支持的数据结构非常松散,是类似json的bjson格式,因此可以存储比较复杂的数据类型。)Cassandra最初由Facebook开发,后转变成了开源项目。它是一个网络社交云计算方面理想的数据库。以Amazon专有的完全分布式的Dynamo为基础,结合了Google BigTable基于列族(Column Family)的数据模型。P2P去中心化的存储。很多方面都可以称之为Dynamo 2.0。 功能   Cassandra的主要特点就是它不是一个数据库,而是由一堆数据库节点共同构成的一个分布式网络服务,对Cassandra 的一个写操作,会被复制到其他节点上去,对Cassandra的读操作,也会被路由到某个节点上面去读取。对于一个Cassandra群集来说,扩展性能是比较简单的事情,只管在群集里面添加节点就可以了。   这里有很多理由来选择Cassandra用于您的网站。和其他数据库比较,有三个突出特点: 模式灵活 :使用Cassandra,像文档存储,你不必提前解决记录中的字段。你可以在系统运行时随意的添加或移除字段。这是一个惊人的效率提升,特别是在大型部署上。 真正的可扩展性 :Cassandra是纯粹意义上的水平扩展。为给集群添加更多容量,可以指向另一台电脑。你不必重启任何进程,改变应用查询,或手动迁移任何数据。 多数据中心识别 :你可以调整你的节点布局来避免某一个数据中心起火,一个备用的数据中心将至少有每条记录的完全复制。
NoSQLMap是一款开源Python工具,可以帮助安全测试人员自动化对NoSQL数据库进行攻击测试。目前这款工具的漏洞利用程序围绕MongoDB,但是以后会支持更多的NoSQL数据库,如 CouchDB, Redis和CassandraNoSQLMap是一款Python编写的开源工具,常用于审计NoSQL数据库中的自动注入攻击、为了从数据库中揭露数据而利用NoSQL数据库使用NoSQL的Web应用的默认配置弱点。它这样命名是为了几年Bernardo Damele和Miroslav创作的流行的SQL工具SQLmap,它的设计理念来源于Ming Chow在Defcon中发表的很棒的演讲-”Abusing NoSQL Databases”。该工具目前主要应用于MongoDB,但是它在未来的版本中还会支持其他基于NoSQL的平台,如CouchDB, Redis和Cassandra等。当前该项目的目的是为简单攻击MongoDB服务器和一些web应用提供渗透测试工具,以及用通过概念攻击来证明某NoSQL应用不会受到SQL注入。主要功能:自动化MongoDB和CouchDB数据库枚举和克隆攻击。通过MongoDB web应用提取数据库名称、用户和哈希密码。为使用默认访问和枚举版本的MongoDB和CouchDB数据库扫描子网或IP列表。字典攻击、暴力破解恢复的MongoDB和CouchDB的哈希密码。针对MongoClient的PHP应用程序参数注入攻击,返回所有数据库中的记录。Javascript函数变量转移和任意代码注入,返回所有数据库中的记录。类似于盲SQL注入的用于验证无来自应用程序的反馈的Javascript注入漏洞的时序攻击。使用方法启动./nosqlmap.py或python nosqlmap.py.基本菜单1-Set options (do this first) 2-NoSQL DB Access Attacks 3-NoSQL Web App attacks 4-Exit 标签:NoSQLMap
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值