cassandra数据库
配置java环境
#下载相应的jdk软件包,然后解压安装,我这里包名称为:jdk-8u91-linux-x64.tar.gz
tar -xzf jdk-8u91-linux-x64.tar.gz ; mkdir -p /usr/java/ ; mv jdk1.8.0_25/ /usr/java/jdk1.8
#然后配置环境变量,这样可以任何地方引用jdk,如下配置:
#vi /etc/profile 最后面加入以下语句:
export JAVA_HOME=/usr/java/jdk1.8
export CLASSPATH=$CLASSPATH:$JAVA_HOME/lib:$JAVA_HOME/jre/lib
export PATH=$JAVA_HOME/bin:$JAVA_HOME/jre/bin:$PATH:$HOMR/bin
#source /etc/profile #使环境变量马上生效
#java -version #查看java版本,看到jdk1.8.0版本即代表java安装成功。
搭建cassandra
tar xf apache-cassandra-3.11.4-bin.tar.gz && mv apache-cassandra-3.11.4 /usr/local/cassandra
cd /usr/local/cassandra/bin/ && ./cassandra -R
启动cql客户端
python cql.sh
keyspace键空间操作 keyspace名不超过32个字符
create keyspace ks1 with replication = { 'class':'SimpleStrategy','replication_factor':1 }; 创建 with后接键空间属性,class:复制协议 replication_factor 几个副本
alter keyspace ks1 with replication = { 'class':'SimpleStrategy','replication_factor':2 }; 修改
desc keyspace ks1; 查询键空间结构
drop keyspace ks1; 删除
cql创建
创建列族 table 列族名不超过32字符
create table testtable( name text, age int, profile text, PRIMARY KEY (name), ); text为strings PRIMARY KEY指定主键
desc table testtable; 查看列族结构
alter table testtable with comment='test'; 修改列族属性 comment描述信息
alter table testtable add sex text; 添加列
alter table testtable drop sex; 删除列
drop table testtable; 删除列族
创建index 第二索引
create table student(orderid int,name text,age int,sex text,primary key(orderid));
create index on student(name); 对student 的name创建作为第二索引
desc table student; 注释:CREATE INDEX student_name_idx ON ks1.student (name); student_name_idx即为默认索引名
drop index student_name_idx; 删除第二索引
创建自定义数据类型
create type address(country text,provinace text,city text,road text);
desc type address; 查看自定义数据类型
alter type address add roomno int; 修改增加列
drop type address; 删除自定义数据类型
cql操作
insert into student(name,age,orderid,sex) values('zhangshan',20,10001,'man');
select * from student; 查询是否插入
update student set name='lisi' where orderid=10001; 修改数据
delete age from student where orderid=10001; 删除age的value数据 但age列不删除
delete from student where orderid=10001; 删除orderid=10001整行数据
cql查询操作
insert into student(name,age,orderid,sex) values('zhangshan',20,10001,'man');
desc student;
select * from student where orderid=10001; primary-key 可以作为where查询条件
select * from student where name='zhangshan'; 会报错 提示使用第二索引或 ALLOW FILTERING
create index on student(name);
select * from student where name='zhangshan';
select count(*) from student; 统计查询到有多少行数据
select count(*) as totalrow from student; 给输出显示的count起一个别名totalrow
map和复合主键
create table scores(name text,score map<text,int>,orderid int, primary key(orderid,name)); name和orderid都为主键
select * from scores where name=' ' allow filtering; 复合主键除了第一个主键之外使用其他主键作为where查询条件会报错,除非加上allow filtering
insert into scores(name,orderid,score) values ('zhanshan',10001,{'yuwen':89,'shuxue':99});
score map<text,int> map表示score的value为 key(text): value(int)
contains条件 包含的意思 包含这个关键字的都查出来
insert into scores(name,orderid,score) values ('lisi',10002,{'yuwen':89,'shuxue':99,'yinyu':100});
create index on scores(keys(score)); map数据类型键作为索引 将score的关键字作为索引
select * from scores where score contains key 'yinyu'; 查询score列包含key里面含有yinyu关键字的数据
in条件查询 in里面含有的都查出来
select * from scores where orderid in (10001,10002);
cassandra的cql语言与传统关系数据库sql语言的相似对比
更多cql语法查询:https://www.w3cschool.cn/cassandra/
主配置文件解读
vim cassandra.yaml
cluster_name: 'Test Cluster' 集群名字,即当前节点在cassandra集群中叫什么名字,每个节点集群名不一样
listen_address: localhost 集群监听地址,一般0.0.0.0
seed_provider 需要联系的节点地址
storage_port: 7000 节点间通讯端口
native_transport_port: 9042 本地客户端通信端口
data_file_directories 数据文件的存放目录
commitlog_directory commitlog保存路径
commit_failure_policy 提交失败时采取的策略
disk_failure_policy 磁盘故障策略
rpc_address: localhost 监听客户端连接的地址
nodetool运维工具
./nodetool version 查看cassandra版本
./nodetool status 查看节点状态
./nodetool stopdaemon 关闭cassandra服务
./nodetool clearsnapshot 删除所有快照 删除之前把所有有用的快照移到别的目录
./nodetool -h 127.0.0.1 netstats 查看节点网络连接信息
./nodetool compact 合并sstable文件
./nodetool compactionstats 显示压缩进度
./nodetool upgradesstables -a 更新sstable
./nodetool snapshot -t NAME 为键空间或列族创建快照 -t 指定快照名,不指定以当前时间戳作为快照名
./nodetool clearsnapshot -t SNAPSHOTNAME 指定要删除快照的名字 不指定清理全部快照
./nodetool refresh +keyspace +TABLENAME 加载新的sstable文件到集群中 恢复快照
./nodetool decommission 关闭当前节点,并把数据复制到环中紧邻的下一个节点
./nodetool describecluster 描述集群信息
./nodetool describering +KEYSPACE_NAME 显示圆环的节点信息
./nodetool drain 把memtable中的数据刷新sstable,并且当前节点会终止与其他节点的联系,执行完这条命令需要重启节点,一般在cassandra版本升级的时候才使用这条命令
./nodetool flush 单纯的把memtable中的数据刷新到sstable,不需要重启节点
./nodetool getendpoints 查看key分布在哪个节点上,需要三个参数: keyspace_name,table_name,key_name
./nodetool getsstables 查看key分布在哪一个sstable上,需要三个参数:keyspace_name,table_name,key_name
./nodetool rebuild 当有新的数据中心加入,运行该命令复制数据到新数据中心
./nodetool repair 在删除数据时候,cassandra并非真实的删除,而是重新插入一条数据,记录了删除的记录的信息和时间,叫做tombstone墓碑。使用nodetool repair,可以删除tombstone数据。频繁修改的数据节点可以使用这个命令节省空间,提高读速度
./nodetool tpstats 列出cassandra维护的线程池的信息,可以看到每个阶段的操作,以及他们的状态是活动中,等待还是完成
./nodetool cfstats 列族名 -H 查看表的一些信息,包括读的次数,写的次数, sstable的数量,memtable信息,压缩信息,bloomfilter信息
./nodetool cleanup 清理不需要的keyspace,当新增的数据节点或减少数据节点时,数据会重新分发,可以运行这个命令,清除不再分布在这个节点上的keyspace,唯一目的是为了节省磁盘空间
压力测试
tools/bin/cassandra-stress write -n=1000000 插入1000000数据
tools/bin/cassandra-stress read n=200000 读取200000数据
tools/bin/cassandra-stress read duration=3m 持续读取3分钟数据
列族参数
desc ks1.scores;
AND bloom_filter_fp_chance = 0.01 指定bloom_filter算法的容错率,一般 0.01-0.1
AND caching = {'keys': 'ALL', 'rows_per_partition': 'NONE'} 设置缓存方案
AND comment = '' 描述信息
AND compaction = {'class': 'org.apache.cassandra.db.compaction.SizeTieredCompactionStrategy', 'max_threshold': '32', 'min_threshold': '4'} 数据压缩策略
AND compression = {'chunk_length_in_kb': '64', 'class': 'org.apache.cassandra.io.compress.LZ4Compressor'} 数据压缩算法
AND crc_check_chance = 1.0
AND dclocal_read_repair_chance = 0.1
AND default_time_to_live = 0 数据存活时间,0表示永久
AND gc_grace_seconds = 864000
AND max_index_interval = 2048
AND memtable_flush_period_in_ms = 0 内存数据刷新时间间隔
AND min_index_interval = 128
AND read_repair_chance = 0.0 0-1之间的数值,与数据的一致性有关
AND speculative_retry = '99PERCENTILE';