cassandra简介
Cassandra是一个开源的分布式NoSQL数据库管理系统,最初由Facebook开发,并于2008年开源。它被设计成高度可扩展、高性能、分布式的数据库系统,用于处理大规模的数据。Cassandra采用了分布式架构和无中心化设计,能够提供高可用性和容错性。
Cassandra具有以下特点:
- 分布式:数据被分布存储在多个节点上,可以动态地增加节点以扩展存储容量和处理能力。
- 高可用性:Cassandra使用复制和自动故障转移来确保数据的高可用性。
- 灵活的数据模型:支持弹性的数据模型,可以适应各种数据类型和数据访问模式。
- 支持查询语言CQL:Cassandra Query Language (CQL)类似于SQL,提供了丰富的查询和数据操作功能。
- 跨数据中心复制:能够在不同数据中心之间进行数据复制,支持多地域部署。
Cassandra通常用于需要处理大规模数据、高写入和读取吞吐量的场景,如社交网络、日志分析、时间序列数据等。它已经被许多大型互联网公司和企业广泛应用。
nodetool是什么?
nodetool 是 Apache Cassandra 提供的一个用于管理和监控 Cassandra 集群的命令行工具。通过 nodetool,用户可以执行各种操作,如查看集群状态、管理节点、执行数据修复、手动触发压缩操作等。nodetool 提供了丰富的命令选项,可以帮助管理员轻松地管理 Cassandra 集群。
一些常用的 nodetool 命令包括:
- nodetool status:查看集群中每个节点的状态信息,包括节点的 IP 地址、数据中心、负载情况等。
- nodetool repair:触发数据修复操作,用于确保数据的一致性和完整性。
- nodetool decommission:将一个节点从集群中移除,通常用于扩容或节点替换时。
- nodetool cleanup:清理失效节点上的无效数据副本,以释放磁盘空间。
- nodetool compaction:手动触发数据压缩操作,可以帮助减少数据碎片和节省磁盘空间。
- nodetool snapshot:创建数据快照,用于备份或恢复数据。
- nodetool flush:将内存中的数据刷新到磁盘,确保数据持久化。
-
在 CassandraDb 环境中创建您自己的键空间。
下面通俗解释几个这段任务中的几个概念:
-
列族:列族相当于关系数据库的表Table,是包含了多行(Row)的容器
-
键空间(Keyspace): Cassandra的键空间(KeySpace)相当于关系型数据库的数据库,我们创建一个键空间就是创建了一个数据库。键空间包含一个或多个列族(Column Family);
语法: CREATE KEYSPACE <identifier> WITH <properties>; 使用例子: Create keyspace convert_key with replicaton= { 'class':strategy name, --strategy name:副本放置策略, --包括: --简单策略SimpleStrategy、 --网络拓扑策略NetworkTopologyStrategy, --选择其中的一个 'replication_factor': 3 --代表 复制因子,放置在不同节点上的数据的副本数 }; use 你的键空间名字;
-
-
创建表
-
注意这里使用了uuid作为user_id的类型
CREATE TABLE users ( userid UUID PRIMARY KEY, --还是必须要规定主键,uuid是一种通用唯一标识符 username TEXT, password TEXT ); CREATE TABLE files ( fileid UUID PRIMARY KEY, filename TEXT, filepath TEXT, updatetime date, );
-
-
增删改
-
增加记录(注意:cassandra中不能一次性插入多行,只能一个insert插入一行语句)
这里给出users的填充例子,注意这里的userid使用now()函数进行赋值,now() 函数用于生成当前时间的时间戳(时间戳(timestamp)是指表示特定时间点或时间间隔的数字值):
INSERT INTO users (userid, username, password) VALUES (now(), 'JohnDoe', 'password123'); INSERT INTO users (userid, username, password) VALUES (now(), 'JaneSmith', 'securepass'); INSERT INTO users (userid, username, password) VALUES (now(), 'MikeJohnson', 'mypass123'); INSERT INTO users (userid, username, password) VALUES (now(), 'EmilyDavis', 'password456'); INSERT INTO users (userid, username, password) VALUES (now(), 'AlexWilson', 'hello123'); INSERT INTO users (userid, username, password) VALUES (now(), 'SarahBrown', 'pass1234');
-
修改数据:
UPDATE 表名字 SET 列名称=改变之后的值 WHERE 条件;
-
删除行:
DELETE FROM 表名字 WHERE 条件;
-
PRIMARY KEY主键
Cassandra 中,通过定义表的主键(PRIMARY KEY)来组织数据存储和索引。主键由分区键(Partition Key)和聚簇列(Clustering Columns)组成。
比如在主键定义 PRIMARY KEY ((fileid,filename),updatedate)
中:
(fileid,filename)
是组合起来形成分区键。这意味着数据将根据fileid
和filename
的值进行分区,即相同fileid
和filename
值的数据将存储在同一个分区中。updatedate
列则是聚簇列,它用于在分区内对数据进行排序。在这种情况下,数据将按照updatedate
列的值在分区内进行排序存储。CREATE TABLE user1 ( userid UUID, username TEXT, password TEXT, PRIMARY KEY((userid,username),password) ); CREATE TABLE file1 ( fileid UUID, filename TEXT, filepath TEXT, updatetime date, PRIMARY KEY((fileid,filename),updatedate) );
索引
- 为什么需要列族的索引?因为Cassandra 查询语言 (CQL) SELECT 查询缺乏通常我们使用 SQL 操作 JOIN、GROUP BY ,并且WHERE操作也大大收到限制。 在 SQL 中,您可以按任何列进行筛选查询,而在 CQL 中,你只能按分布键(分区键)、簇键(簇列)和二级指标。默认情况下,DBMS 不提供按非键列(紫色的列就是)搜索的功能。那么如果我们想根据非键列索引怎么办,两个方法
-
方法1-创建index
-
-
语法: create index 这个索引的名字 on 表名(非键列名); 例如: create index usernameindex on users(username); 删除这个index语法: drop index 这个索引的名字: 在这: drop index usernameindex;
这样就可以进行索引:
-
方法2-使用allow filtering:
标量函数
-
使用
toTimestamp()
将日期时间值转换为时间戳:SELECT fileid, filename, toTimestamp(updatetime) AS timestamp_updatetime FROM files;
-
使用
now()
获取当前日期和时间:SELECT fileid, filename, now() AS current_datetime FROM files;
指示TTL
-
要在Cassandra中添加具有TTL(生存时间)的行,使用INSERT语句并在列值后面指定TTL值。下面是一个示例:
INSERT INTO files (fileid, filename, filepath, updatetime) VALUES (uuid(), 'example.txt', '/path/to/example.txt', '2023-02-12') USING TTL 3600;
在上述示例中,我们向
files
表插入一行数据,并在最后使用USING TTL
子句设置TTL值为3600秒(1小时)。这意味着插入的数据将在1小时后自动过期。请注意,TTL值是以秒为单位的整数。在指定TTL时,请根据实际需求选择适当的值。
INSERT操作:这条消息消失之后这条记录消失,如果insert的内容是和某条记录相同的也可以实现,此时和更新的效果相同,并且TTL时间之后,那条更新的消息也消失。INSERT INTO my_table (id, data) VALUES (123, 'Example Data') USING TTL 3600;
-
UPDATE my_table USING TTL 7200 SET data = 'Updated Data' WHERE id = 123;