@
Apache Cassandra 官网地址 https://cassandra.apache.org/ 最新版本4.1.1
Apache Cassandra 官网文档地址 https://cassandra.apache.org/doc/latest/
Apache Cassandra 源码地址 https://github.com/apache/cassandra
Apache Cassandra 是一个开源的分布式、高可用、最终一致性的NoSQL数据库,可以快速、可扩展可靠的管理海量数据,无单点故障。
NoSQL,泛指非关系型的数据库,NoSQL去掉关系数据库的关系型特性,数据之间无关系,非常容易扩展。
Cassandra是具有最终一致语义的分区宽列存储模型,最初是由Facebook设计的,它使用了一种分阶段事件驱动架构(SEDA)来实现Amazon的Dynamo分布式存储和复制技术以及谷歌的Bigtable数据和存储引擎模型的组合。
Cassandra提供了Cassandra查询语言(CQL),这是一种类似sql的语言,用于创建和更新数据库模式以及访问数据。
CQL在分区数据集上支持许多高级特性,例如:
Apache Cassandra依赖于Amazon的Dynamo分布式存储键值系统的许多技术。Dynamo系统中的每个节点都有三个主要组件
Cassandra主要利用前两个集群组件,同时使用基于日志结构化合并树(Log Structured Merge Tree, LSM)的存储引擎。特别是Cassandra依赖于Dynamo风格:
Cassandra满足大规模(PiB+)业务关键型存储需求。特别是由于应用程序要求对pb级数据集进行完整的全球复制,同时还需要始终可用的低延迟读写。
使用令牌环的一致性哈希:Cassandra使用一种称为一致散列的特殊散列形式在存储节点上划分数据。在朴素数据哈希中,通常通过对键对桶数取模的哈希来将键分配给桶。例如,如果您希望使用朴素哈希将数据分布到100个节点,您可以将每个节点分配到0到100之间的存储桶,对输入键取模100进行哈希,并将数据存储在相关的存储桶中。然而,在这个简单的方案中,添加一个节点可能会使几乎所有映射失效。
相反,Cassandra将每个节点映射到一个连续哈希环上的一个或多个令牌,并通过将一个键哈希到环上,然后沿一个方向“行走”环来定义所有权,类似于Chord算法。一致哈希与普通数据哈希的主要区别在于,当要哈希的节点(桶)数量发生变化时,一致哈希只需要移动一小部分键。


# 通过官网下载下载最新的版本
wget https://dlcdn.apache.org/cassandra/4.1.1/apache-cassandra-4.1.1-bin.tar.gz
# 解压
tar -xvf apache-cassandra-4.1.1-bin.tar.gz
# 进入目录
cd apache-cassandra-4.1.1
# 启动,如果是root用户启动bin/cassandra -R
bin/cassandra
# 查看日志
tail -f logs/system.log
# 检查Cassandra的状态
bin/nodetool status

准备三台192.168.2.100、192.168.2.101、192.168.2.102,选择两台作为种子节点,分别在每台上修改配置文件vim conf/cassandra.yaml
# 同一个集群名称一样
cluster_name: 'Test Cluster'
# 种子地址,配置多个示例,用逗号隔开
seed_provider:
- class_name: org.apache.cassandra.locator.SimpleSeedProvider
parameters:
- seeds: "192.168.2.100,192.168.2.101"
listen_address: 192.168.2.100
rpc_address: 192.168.2.100
# 下面文件路径按需修改,建议多个盘分开提高读写性能
# 数据文件(如sstable)所在的一个或多个目录,默认$CASSANDRA_HOME/data/data
data_file_directories: /data1/cassandra/data
# commitlog文件所在的目录
commitlog_directory: /data2/cassandra/commitlog
# 保存缓存的目录
saved_caches_directory: /data3/cassandra/saved_caches
# hints所在的目录
hints_directory: /data4/cassandra/hints
每台的listen_address和rpc_address修改为本机对应的,修改配置分别启动cassandra
# 需要先杀死原来的cassandra进程,也可以自己准备脚本
ps -ef | grep cassandra
# 检查Cassandra的状态
bin/nodetool status
# 查询关于令牌环的信息
bin/nodetool ring
Cassandra Query Language(CQL),CQL提供了一个类似于SQL的模型;数据存储在包含行和列的表中。因此在本文档中使用时,这些术语(表、行和列)具有与SQL中相同的定义。

CQL是一种类型化语言,支持丰富的数据类型集,包括Native类型、集合类型、用户定义类型、元组类型和自定义类型
# CQL Shell 简称cqlsh,是一个可以和Cassandra数据库通信的客户端,使用这个cqlsh客户端可以执行Cassandra查询语言(CQL)。指定IP和端口连接cql
./bin/cqlsh 192.168.2.100 9042
describe cluster;
describe keyspaces;
describe tables;

# 将输出内容捕获到名为outputfile的文件
capture 'outputfile';
# 创建键空间
CREATE KEYSPACE school WITH replication = {'class':'SimpleStrategy', 'replication_factor' : 3};
# 查看捕获内容
cat outputfile

# 查看键空间
DESCRIBE school;
# 使用键空间
use school;
# 修改键空间
ALTER KEYSPACE school WITH replication = {'class':'SimpleStrategy', 'replication_factor' : 1};
DESCRIBE school;
# 删除键空间
DROP KEYSPACE school;

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>
);
# 列出当前键空间下所有表
DESCRIBE Tables;
# 查看表信息
DESCRIBE TABLE student;

# 添加字段
ALTER TABLE student ADD email text;
select * from student;
# 删除字段
ALTER table student DROP email;
select * from student
# 删除表
DROP TABLE student;
# 清空表
TRUNCATE student;

create table test1 ( id int PRIMARY KEY, name text);
create table test2 ( 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));
create table test3 ( key_one int, key_two int, name text, PRIMARY KEY(key_one, key_two));
# 为student的 name 添加索引,索引的名字为:sname, 命令:CREATE INDEX sname ON student (name);# 为student 的age添加索引,不设置索引名字,命令:CREATE INDEX ON student (age);DESCRIBE student;

可以发现 对age创建索引,没有指定索引名字,会提供一个默认的索引名:student_age_idx。
索引原理:Cassandra之中的索引的实现相对MySQL的索引来说就要简单粗暴很多了。Cassandra自动新创建了一张表格,同时将原始表格之中的索引字段作为新索引表的Primary Key!并且存储的值为原始数据的Primary Key。
# set集合添加索引CREATE INDEX ON student(interest); # map映射添加索引CREATE INDEX mymap ON student(KEYS(education)); # 删除索引drop index sname;

# 插入数据INSERT INTO student (id,address,age,gender,name) VALUES (1011,'南京路',10,2,'mike') ;# 修改数据UPDATE student set age = 11 where id= 1011;# 批量操作BEGIN BATCH INSERT INTO student (id,address,age,gender,name) VALUES (1012,'长沙路',12,1,'joo') ; INSERT INTO student (id,address,age,gender,name) VALUES (1015,'上海路',20,1,'Jack') ; UPDATE student set age = 15 where id= 1012; DELETE FROM student WHERE id=1011;APPLY BATCH;# 删除数据DELETE FROM student WHERE student_id=1011;

# 更新map类型数据UPDATE student SET education={'中学': '城市第五中学', '小学': '城市第五小学'} WHERE id = 1012;# 更新list类型数据UPDATE student SET phone = ['020-66666666', '13666666666'] WHERE id = 1012;# 更新set类型数据UPDATE student SET interest = interest + {'游戏'} WHERE id = 1012;

# 查询条件
select * from student where interest CONTAINS '电影';

# 设置数据的ttl
INSERT INTO student (id,address,age,gender,name,interest, phone,education) VALUES (1030,'朝阳路30号',20,1,'Cary',{'运动', '游戏'},['020-7777888','139876667556'],{'小学' :'第30小学','中学':'第30中学'}) USING TTL 20;

我主要使用Ruby来执行此操作,但到目前为止我的攻击计划如下:使用gemsrdf、rdf-rdfa和rdf-microdata或mida来解析给定任何URI的数据。我认为最好映射到像schema.org这样的统一模式,例如使用这个yaml文件,它试图描述数据词汇表和opengraph到schema.org之间的转换:#SchemaXtoschema.orgconversion#data-vocabularyDV:name:namestreet-address:streetAddressregion:addressRegionlocality:addressLocalityphoto:i
我有一个涉及多台机器、消息队列和事务的问题。因此,例如用户点击网页,点击将消息发送到另一台机器,该机器将付款添加到用户的帐户。每秒可能有数千次点击。事务的所有方面都应该是容错的。我以前从未遇到过这样的事情,但一些阅读表明这是一个众所周知的问题。所以我的问题。我假设安全的方法是使用两阶段提交,但协议(protocol)是阻塞的,所以我不会获得所需的性能,我是否正确?我通常写Ruby,但似乎Redis之类的数据库和Rescue、RabbitMQ等消息队列系统对我的帮助不大——即使我实现某种两阶段提交,如果Redis崩溃,数据也会丢失,因为它本质上只是内存。所有这些让我开始关注erlang和
我正在编写一个简单的静态Rack应用程序。查看下面的config.ru代码:useRack::Static,:urls=>["/elements","/img","/pages","/users","/css","/js"],:root=>"archive"map'/'dorunProc.new{|env|[200,{'Content-Type'=>'text/html','Cache-Control'=>'public,max-age=6400'},File.open('archive/splash.html',File::RDONLY)]}endmap'/pages/search.
导读:随着叮咚买菜业务的发展,不同的业务场景对数据分析提出了不同的需求,他们希望引入一款实时OLAP数据库,构建一个灵活的多维实时查询和分析的平台,统一数据的接入和查询方案,解决各业务线对数据高效实时查询和精细化运营的需求。经过调研选型,最终引入ApacheDoris作为最终的OLAP分析引擎,Doris作为核心的OLAP引擎支持复杂地分析操作、提供多维的数据视图,在叮咚买菜数十个业务场景中广泛应用。作者|叮咚买菜资深数据工程师韩青叮咚买菜创立于2017年5月,是一家专注美好食物的创业公司。叮咚买菜专注吃的事业,为满足更多人“想吃什么”而努力,通过美好食材的供应、美好滋味的开发以及美食品牌的孵
C#实现简易绘图工具一.引言实验目的:通过制作窗体应用程序(C#画图软件),熟悉基本的窗体设计过程以及控件设计,事件处理等,熟悉使用C#的winform窗体进行绘图的基本步骤,对于面向对象编程有更加深刻的体会.Tutorial任务设计一个具有基本功能的画图软件**·包括简单的新建文件,保存,重新绘图等功能**·实现一些基本图形的绘制,包括铅笔和基本形状等,学习橡皮工具的创建**·设计一个合理舒适的UI界面**注明:你可能需要先了解一些关于winform窗体应用程序绘图的基本知识,以及关于GDI+类和结构的知识二.实验环境Windows系统下的visualstudio2017C#窗体应用程序三.
我正在尝试在Rails上安装ruby,到目前为止一切都已安装,但是当我尝试使用rakedb:create创建数据库时,我收到一个奇怪的错误:dyld:lazysymbolbindingfailed:Symbolnotfound:_mysql_get_client_infoReferencedfrom:/Library/Ruby/Gems/1.8/gems/mysql2-0.3.11/lib/mysql2/mysql2.bundleExpectedin:flatnamespacedyld:Symbolnotfound:_mysql_get_client_infoReferencedf
目录前言滤波电路科普主要分类实际情况单位的概念常用评价参数函数型滤波器简单分析滤波电路构成低通滤波器RC低通滤波器RL低通滤波器高通滤波器RC高通滤波器RL高通滤波器部分摘自《LC滤波器设计与制作》,侵权删。前言最近需要学习放大电路和滤波电路,但是由于只在之前做音乐频谱分析仪的时候简单了解过一点点运放,所以也是相当从零开始学习了。滤波电路科普主要分类滤波器:主要是从不同频率的成分中提取出特定频率的信号。有源滤波器:由RC元件与运算放大器组成的滤波器。可滤除某一次或多次谐波,最普通易于采用的无源滤波器结构是将电感与电容串联,可对主要次谐波(3、5、7)构成低阻抗旁路。无源滤波器:无源滤波器,又称
@作者:SYFStrive @博客首页:HomePage📜:微信小程序📌:个人社区(欢迎大佬们加入)👉:社区链接🔗📌:觉得文章不错可以点点关注👉:专栏连接🔗💃:感谢支持,学累了可以先看小段由小胖给大家带来的街舞👉微信小程序(🔥)目录自定义组件-behaviors 1、什么是behaviors 2、behaviors的工作方式 3、创建behavior 4、导入并使用behavior 5、behavior中所有可用的节点 6、同名字段的覆盖和组合规则总结最后自定义组件-behaviors 1、什么是behaviorsbehaviors是小程序中,用于实现
需求:要创建虚拟机,就需要给他提供一个虚拟的磁盘,我们就在/opt目录下创建一个10G大小的raw格式的虚拟磁盘CentOS-7-x86_64.raw命令格式:qemu-imgcreate-f磁盘格式磁盘名称磁盘大小qemu-imgcreate-f磁盘格式-o?1.创建磁盘qemu-imgcreate-fraw/opt/CentOS-7-x86_64.raw10G执行效果#ls/opt/CentOS-7-x86_64.raw2.安装虚拟机使用virt-install命令,基于我们提供的系统镜像和虚拟磁盘来创建一个虚拟机,另外在创建虚拟机之前,提前打开vnc客户端,在创建虚拟机的时候,通过vnc
遍历文件夹我们通常是使用递归进行操作,这种方式比较简单,也比较容易理解。本文为大家介绍另一种不使用递归的方式,由于没有使用递归,只用到了循环和集合,所以效率更高一些!一、使用递归遍历文件夹整体思路1、使用File封装初始目录,2、打印这个目录3、获取这个目录下所有的子文件和子目录的数组。4、遍历这个数组,取出每个File对象4-1、如果File是否是一个文件,打印4-2、否则就是一个目录,递归调用代码实现publicclassSearchFile{publicstaticvoidmain(String[]args){//初始目录Filedir=newFile("d:/Dev");Datebeg