1、cassandra安装
-
下载并解压
tar -xzvf apache-cassandra-3.11.10-bin.tar.gz -C /usr/local/
-
创建三个存放数据的文件夹
[root@hadoop102 cassandra-3.11.10]# mkdir data [root@hadoop102 cassandra-3.11.10]# mkdir commitlog [root@hadoop102 cassandra-3.11.10]# mkdir saved_caches
-
conf/cassandra.yaml配置上面三个文件夹
data_file_directories: - /usr/local/cassandra-3.11.10/data commitlog_directory: /usr/local/cassandra-3.11.10/commitlog saved_caches_directory: /usr/local/cassandra-3.11.10/saved_caches
-
启动cassandra:
[root@hadoop102 cassandra-3.11.10]# bin/cassandra Running Cassandra as root user or group is not recommended - please start Cassandra using a different system user. If you really want to force running Cassandra as root, use -R command line option.
提示:官方不推荐root启动,若必须用root用户启动,需加上-R参数。
首次运行cassandra之后,会产生logs文件夹
查看cassandra pid(
ps -ef|grep cassandra
),再用kill -9 命令即可结束进程为方便启动、关闭,自定义脚本:
#!/bin/sh CASSANDRA_DIR="/usr/local/cassandra-3.11.10" echo "************cassandra***************" case "$1" in start) echo "* *" echo "* starting *" nohup $CASSANDRA_DIR/bin/cassandra -R >> $CASSANDRA_DIR/logs/system.log 2>&1 & echo "* started *" echo "* *" echo "************************************" ;; stop) echo "* *" echo "* stopping *" PID_COUNT=`ps aux |grep CassandraDaemon |grep -v grep | wc -l` PID=`ps aux |grep CassandraDaemon |grep -v grep | awk {'print $2'}` if [ $PID_COUNT -gt 0 ];then echo "* try stop *" kill -9 $PID echo "* kill SUCCESS! *" else echo "* there is no ! *" echo "* *" echo "************************************" fi ;; restart) echo "* *" echo "********* restarting ******" $0 stop $0 start echo "* *" echo "************************************" ;; status) $CASSANDRA_DIR/bin/nodetool status ;; *) echo "Usage:$0 {start|stop|restart|status}" exit 1 esac
2、cassandra基本概念
2.1、数据模型
-
列:是cassandra基本数据结构单元,具有三个值:名称、值、时间戳。不需要事先定义好,只需要在KeySpace里定义列族即可
-
列族:包含了多行的容器,每行里面有列。
CF的两种类型:
- 静态CF:字段名固定
- 动态CF:字段名由程序计算提供,CF只能定义字段类型
主键:cassandra可以通过PRIMARY KEY关键字创建主键,分为两种:
- single column primary key:单列主键
- composite primary key:多列主键
-
键空间(KeySpace):类似于关系数据库里的库,键空间包含一个或者多个列族。创建的时候可以指定一些属性:副本因子,副本策略,Durable_writes(是否启用 CommitLog 机制)
-
副本因子:决定数据有几份副本(所有的副本都同样重要,没有主从之分。可以为每个数据中心定义副本因子。副本策略设置应大于1,但是不能超过集群中的节点数。)
-
副本策略:描述副本放在集群中的策略
SimpleStrategy:适用于只有一个数据中心,为集群指定简单的副本因子
NetworkTopologyStrategy(网络拓扑策略):推荐方式,可以扩展到多数据中心,可以单独为每个数据中心设置复制因子
-
2.2、cassandra.yaml
-
cluster_name:同一集群下节点该项配置要一致
-
listen_address:cassandra需要监听的主机名,默认localhost
-
commitlog_directory:commit log的保存目录,压缩包安装方式默认是/var/lib/cassandra/commitlog。通过前面的了解,我们可以知道,把这个目录和数据目录分开存放到不同的物理磁盘可以提高性能。
-
data_file_directories:数据文件的存放目录,压缩包安装方式默认是/var/lib/cassandra/data。为了更好的效果,建议使用RAID 0或SSD。
-
save_caches_directory:保存表和行的缓存,压缩包安装方式默认是/var/lib/cassandra/saved_caches。
3、CQL Shell
cqlsh 默认连接本机9042端口
3.1键空间操作
-
创建键空间:
cqlsh> create KEYSPACE school with replication = {'class': 'SimpleStrategy','replication_factor': 3}; cqlsh> DESCRIBE KEYSPACES; school system_schema system_auth system system_distributed system_traces cqlsh> DESCRIBE school CREATE KEYSPACE school WITH replication = {'class': 'SimpleStrategy', 'replication_factor': '3'} AND durable_writes = true;
durable_writes默认为true
-
连接键空间:
use school;
-
修改键空间,比如修改副本因子:
cqlsh:school> ALTER KEYSPACE school WITH replication = {'class': 'SimpleStrategy', 'replication_factor': 1}; cqlsh:school> DESCRIBE school CREATE KEYSPACE school WITH replication = {'class': 'SimpleStrategy', 'replication_factor': '1'} AND durable_writes = true;
-
删除键空间:
DROP KEYSPACE school ;
3.2 表操作
首先要进入到键空间:use <KeySpace>
-
创建表:
CREATE TABLE student( id int PRIMARY KEY, name text, age int, gender tinyint, address text , interest set<text>, phone list<text>, education map<text, text> );
类似于sql
-
查看表:
DESCRIBE TABLE student
-
删除表:
drop table student
3.3、索引(Key)
cassandra有五种key:
-
primary key 主键:
cassandra中primary key概念比较宏观,可以由一个或者多个列组合,用来获取某一行的数据
如果主键由多列构成,就称作composite primary key,或compound primary key
create table testTab ( key_one int, key_two int, name text, PRIMARY KEY(key_one, key_two) );
-
partition key 分区key
在组合主键的情况下(上面的例子),第一个部分称作partition key,第二个部分称作clustering key。
partition key作用就是:Cassandra会对其做一个hash计算,并自己决定将这一条记录放在哪个节点
分区键也可以组合而成,这叫做composite partition key:
create table testTab ( key_part_one int, key_part_two int, key_clust_one int, key_clust_two int, key_clust_three uuid, name text, PRIMARY KEY((key_part_one,key_part_two), key_clust_one, key_clust_two, key_clust_three) );
一个组合分区键,三个集群键。
-
composite key 复合key
-
compound key 复合key
-
clustering key 集群
以下情况不要用索引:
- 这列的值很多的情况下,因为你相当于查询了一个很多条记录,得到一个很小的结果。
- 表中有couter类型的列
- 频繁更新和删除的列
- 在一个很大的分区中去查询一条记录的时候(也就是不指定分区主键的查询
4、cassandra集群搭建
4.1、准备
三台centos7虚拟机:hadoop102:192.168.10.102;hadoop103:192.168.10.103;hadoop104:192.168.10.104;选择前两台主机作为seed节点。
seed节点作用:
一个新节点加入集群需要通过种子节点发现集群中其他的节点,至少需要一个活跃的seed,节点加入集群之后,下次启动就不需要种子节点了。可设置任何一个作为种子节点。
4.2、配置修改
需要在每台机器的配置文件cassandra.yml中进行一些修改,包括:
-
cluster_name 集群名字,每个节点都要一样
-
seeds 填写2个节点的ip作为 种子节点,每个节点的内容都要一样
seed_provider: # Addresses of hosts that are deemed contact points. # Cassandra nodes use this list of hosts to find each other and learn # the topology of the ring. You must change this if you are running # multiple nodes! - class_name: org.apache.cassandra.locator.SimpleSeedProvider parameters: # seeds is actually a comma-delimited list of addresses. # Ex: "<ip1>,<ip2>,<ip3>" - seeds: "192.168.10.102,192.168.10.103"
-
listen_address 填写当前节点所在机器的IP地址
-
rpc_address 填写当前节点所在机器的IP地址
遇到的问题:
nodetool status报错:
error: No nodes present in the cluster. Has this node finished starting up?
-- StackTrace --
java.lang.RuntimeException: No nodes present in the cluster. Has this node finished starting up?
解决办法:将集群中的主机内的data、commitlog、saved_caches文件夹全部删除,重新创建
5、YCSB测试Cassandra性能
官方文档地址:https://github.com/brianfrankcooper/YCSB/tree/master/cassandra
-
根据文档提示先创建测试所需要的keyspace和table:
cqlsh> create keyspace ycsb WITH REPLICATION = {'class' : 'SimpleStrategy', 'replication_factor': 3 }; cqlsh> USE ycsb; cqlsh> create table usertable ( y_id varchar primary key, field0 varchar, field1 varchar, field2 varchar, field3 varchar, field4 varchar, field5 varchar, field6 varchar, field7 varchar, field8 varchar, field9 varchar);
replication_factor 将会影响性能
根据文档,设置cassandra的配置文件:cassandra.properties,这里我只设置了hosts为三个节点地址。
bin/ycsb load cassandra-cql -P workloads/workloada -P cassandra.properties
加载数据后,执行run指令:
[OVERALL], RunTime(ms), 5770 [OVERALL], Throughput(ops/sec), 173.3102253032929 [TOTAL_GCS_PS_Scavenge], Count, 3 [TOTAL_GC_TIME_PS_Scavenge], Time(ms), 16 [TOTAL_GC_TIME_%_PS_Scavenge], Time(%), 0.2772963604852686 [TOTAL_GCS_PS_MarkSweep], Count, 0 [TOTAL_GC_TIME_PS_MarkSweep], Time(ms), 0 [TOTAL_GC_TIME_%_PS_MarkSweep], Time(%), 0.0 [TOTAL_GCs], Count, 3 [TOTAL_GC_TIME], Time(ms), 16 [TOTAL_GC_TIME_%], Time(%), 0.2772963604852686 [READ], Operations, 503 [READ], AverageLatency(us), 2882.1988071570577 [READ], MinLatency(us), 1156 [READ], MaxLatency(us), 51743 [READ], 95thPercentileLatency(us), 5719 [READ], 99thPercentileLatency(us), 10799 [READ], Return=OK, 503 [CLEANUP], Operations, 1 [CLEANUP], AverageLatency(us), 2216960.0 [CLEANUP], MinLatency(us), 2215936 [CLEANUP], MaxLatency(us), 2217983 [CLEANUP], 95thPercentileLatency(us), 2217983 [CLEANUP], 99thPercentileLatency(us), 2217983 [UPDATE], Operations, 497 [UPDATE], AverageLatency(us), 2949.549295774648 [UPDATE], MinLatency(us), 811 [UPDATE], MaxLatency(us), 31791 [UPDATE], 95thPercentileLatency(us), 5899 [UPDATE], 99thPercentileLatency(us), 18767 [UPDATE], Return=OK, 497
同样和之前的HBase测试一样,通过改变读写请求比例、请求数、记录条数,测试数据如下:
如测试结果所示:当请求种类多读少写时,cassandra的性能表现并不如HBase优秀;但当请求偏向写操作时,cassandra的性能表现与HBase的性能表现差距并不大,但是读请求处理的延迟没有HBase的低。