Cassandra学习笔记一:
最近尝试搭建一个云存储平台,在不断的对比之后,决定采用cassandra作为底层数据库。这里记录cassandra的学习过程。
Cassandra是一个混合型的非关系的数据库,主要特性是分布式、基于Column的结构化和高伸展性。Cassandra的主要特点就是它不是 一个数据库,而是由一堆数据库节点共同构成的一个分布式网络服务,对Cassandra 的一个写操作,会被复制到其他节点上去,对Cassandra的读操作,也会被路由到某个节点上面去读取。Cassandra集没有中心节点,各个节点 的地位完全相同。
Cassandra的系统架构是基于DHT(分布式哈希表)的完全P2P架构,与传统的基于 Sharding的数据库集相比,Cassandra可以几乎无缝地加入或删除节点,非常适于对于节点规模变化比较快的应用场景。Cassandra的 数据会写入多个节点,来保证数据的可靠性,在一致性、可用性和网络分区耐受能力(CAP)的折衷问题上,Cassandra比较灵活,用户在读取时可以指 定要求所有副本一致(高一致性)、读到一个副本即可(高可用性)或是通过选举来确认多数副本一致即可(折衷)。这样,Cassandra可以适用于有节 点、网络失效,以及多
数据中心的场景。
首先介绍一下cassandra的启动和配置。
一、下载cassandra
/ 最新版的cassandra 1.0.8可以从这里获取,下载tar压缩包。cassandra使用JAVA编写,因此无平台限制,只要有JAVA即可。我是在windows下安装的cassandra,但linux下也差不多。
二、配置环境变量
包括JAVA和cassandra自己的环境变量。JAVA环境变量的配置说明很多,这里只说一下cassandra的环境变量配置。
右键我的电脑->属性->高级->环境变量,在系统变量里新建一个,name里输入Cassandra_Home,path输入cassandra的目录。如我的cassandra解压在D盘根目录,那么path输入D:\apache-cassandra-1.0.8。配置好后,在命令行界面输入 echo %Cassandra_Home%查看是否配置成功。
三、修改配置文件
cassandra的配置文件位于cassandra目录的conf文件夹下,我们需要配置的是cassandra.yaml和log4j-server.properties。若你在conf里不到cassandra.yaml,而是一个xml文件,那请去下载最新版的cassandra。
log4j-server.properties需要配置log4j.appender.R.File属性,这是log文件的路径,我将它配置为D:/apache-cassandra-1.0.8/my/log/log。注意,这里的路径是“文件”的路径,不是“目录”的路径。
cassandra.yaml需要配置较多。
cluster_name:这是集的名字,可以使用默认设置,我将它修改为FirstCluster。一个集里,所有节点的配置文件里这个属性都应该设置为相同的,这样它们才能互相到。
initial_token:默认留空,我们可以配置为0或其它数字,现在先留空。
data_file_directories:存放数据库数据文件的目录路径(不是文件路径),我将它配置为D:/apache-cassandra-1.0.8/my/data。
commitlog_directory:存放提交日志的目录路径。
java环境变量自动配置 saved_caches_directory:缓存文件夹路径。
还有一些属性,目前不需要配置,在后面进行集的时候配置。
另外注意,以上所有路径最好都使用正斜杠,因为反斜杠在程序里会解析为特殊的符号。
四、启动cassandra
命令行进入cassandra目录的bin文件夹,启动cassandra.bat(linux下启动cassandra),cassandra开始运行。这个命令行窗口不能关闭,否则cassandra也被关闭了。
提示不到MX4J,可以忽视,或者去下一个mx4j-tools.jar并拷贝在cassandra目录下的lib文件夹内。
无法跳过的错误通常是环境变量配置不对或配置文件配置错误,按提示解决即可。
五、测试cassandra
命令行进入cassandra目录的bin文件夹,启动cassandra-cli.bat。首先尝试连接到本机上的cassandra服务:
connect localhost/9160; (分号一定不能少)
若成功,会提示你 成功连接到FirstCluster。接着创建一个keyspace:
create keyspace DEMO;
这一步有可能失败,通常失败提示是:cannot locate cassandra.yaml。若遇见这个提示,将conf文件夹下的cassandra.yaml拷贝到bin文件夹下即可。
创建成功后,进入DEMO keyspace:
use DEMO;
创建一个column family:
create column family Student;
往里面插入记录:
set Student[utf8('1')][utf8('id')] = utf8(‘10010’);
set Student[utf8('1')][utf8('name')] = utf8('fykhlp');
查询记录:
get Student[utf8('1')]; 或 list Student;
六、附cassandra数据模型
1.keyspace:相当于关系型数据库里的数据库,前文所说的cluster相当于服务名。
2.columnFamily:相当于关系型数据库里的表,它里面只有两列,即key和columns。但是co
lumns里面可以有很多的记录,如上图studentA里的columns。上面的插入语句里,1就是columnFamily里的key(studentA),id是columns里的name,10010是value。
3.column:cassandra里的最基本的存储单位,由name、value和timestamp组成。timestamp是时间戳,name表示你插入的属性名,如age或height,value是属性的值(实际上也反过来用)。具体来说,column相当于关系型数据库里的一条记录,里面的每条(age、height)相当于记录的某个字段。
4.superColumn:特殊的columns,它的value部分可以包含多个columns。
Cassandra学习笔记二:
这里,我们开始搭建一个cassandra集。
一、了解token
token是cassandra里相当重要的一个概念,它是cassandra用来平衡集内各节点负载的一个属性。cassandra里有不同的token分配策略,推荐采用默认的RandomPartitioner分区
策略。在这个策略下,token是一个0~2的127次方之间的一个整数(这也意味着理论上cassandra可以支持2的127次方个节点)。之所以是2的127次方,是因为MD5 HASH固定输出128位的数,去掉一位符号位,剩下127位。
cassandra会将你插入数据时的key进行md5 HASH,得到一个127位的数,然后将这个数与各节点的token比较来决定存储到哪个节点上。它根据以下规则进行节点选择:
1.数据将存储到拥有最近的比key的hash值大的token的节点上;
2.若key的hash值比最大的token大,那将被存储到具有最小token的节点上。
在配置文件cassandra.yaml里,有一个配置是initial_token,这里就是配置该节点的token值。该值留空时,cassandra会自动给该节点分配一个token,依据以下规则:
1.若该节点已经被配置好准备加入集,则cassandra会根据集现有的token来分配一个最平衡的token给该节点。很明显,分配一个token给新加入的节点,会让现有的某个节点减少一半的负载。若集里有多个token都是一样平衡, 则它会选择一个可以分担目前存储了最多数据的节点的token。
2.若该节点还未准备好加入集,则cassandra会认为这个节点是引导节点,并分配一个固定值给它。所以若你分别单独配置两台节点,然后再尝试将它们集,则会报告token重复。最好的方法应该是先单独配置第一台节点作为引导节点,然后后面的节点配置时应该也同时配置加入集(后文说明),这样它们会自动获得一个平衡的token。
配置文件里的token仅在系统第一次启动时被使用,然后该值被写入system文件,以后系统启动将不再从配置文件读取token。因此若你发现两台节点的token重复,你无法通过改变配置文件里的token来改变节点的token。正确的修改方法是删除自定义data文件夹里的所有文件,重新启动服务。
token会直接影响集里节点所承受的负载,我们应该尽量保证每个节点所负责的token范围是平衡的。若你发现节点的负载不平衡,你可以手动改变它们的token来让它们平衡。先计算出每台节点的token(平均分配),然后使用nodetool工具改变它。下面给出一个java里计算token的方法,参数是节点数。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论