cassandra学习笔记一
cassandra权威指南读书笔记--读写数据
cassandra权威指南读书笔记--读写数据写cassandra除了轻量级事务,不⽀持别的事务。
cassandra是追加写,写的速度⾮常快。
cassandra还有hint⽇志,这个数据库总是可写的,⽽且单个列的写操作是原⼦的。
hint并不是⼀定写在协调节点,⼀般是写在下线节点的某个⾮副本的邻居节点。
写⼀致性ANY:写hint也算成功ONE:写hint和memtable才算成功。
协调节点会根据keyspace的副本数确定哪些是副本节点,如果副本节点不够满⾜⼀致性级别,直接报错。
多DC时,客户端发请求到协调节点,协调节点同时会转发请求到所有DC的⼀个协调节点。
如果涉及别的DC的⼀致性级别,对应节点会响应结果给原协调节点。
commitlog⽂件名格式:CommitLog-<version>-<timestamp>.log的模式命名。
version是commitlog格式的⼀个整数。
cassandra 3.0的版本提交⽇志的格式是6。
mitLogDescriptor可以根据cassandra版本查到commitlog版本。
SSTable每个keyspace有⼀个⽬录,每个⽬录下⾯有对应的表的⽬录,⽬录名由表名+UUID组成的,UUID是⽤来区别不同schema的表,因为表结构可能会变。
表的⽬录下⾯是SSTable。
SSTable包含多个⽂件,这些⽂件采⽤通⽤的命名规则:<version>-<generation>-<implementation>-<component>.dbversion是⼀个两字符序列,表⽰SSTable格式的主\次版本。
可以在org.apache.io.sstable.Descriptor类中了解不同的SSTable格式版本。
generation 是⼀个索引数,每次为⼀个表创建⼀个新的SSTable时,索引数就会递增。
Cassandra分享1-基本概念
基本概念
吴小宁
分享内容
• 基本概念 • 案例分享 • 数据模型 • Repair • 集群监控
• 性能调优
哪些公司在用?
Apple,10PB,75,000节点 Netflix,420TB,2,500节点,每天1万亿请求 中国宜搜,300TB,270节点,每天8亿请求 eBay,250TB,超过100节点
基本原理 - 读机制
接收到读请求的节点成为协调节点(任何节点都可接收请求) 根据读一致性要求,从选中的节点获取副本数据 从其他节点收到副本后,经过计算,将结果返回给客户端
部署方式 - 多数据中心
两个数据中心,在线业务和离线分析 两地三中心,用于灾备 数据中心之间准实时同步
基本原理 - 分区键
SELECT lon, lat, speed, heading FROM gps_data WHERE VIN = 868120133697190
VIN = 868120133697190
集群1000个节点
根据分区键计算token 根据token知道数据落在哪个节点
分区键的用途:知道数据在哪个节点上
ACID vs CAP 续
此C非彼C
CAP - 3选2(针对分布式数据库系统)
Consistency - 每次读都能读到最新的数据;所有用户读到的数据是一致的;数据在所有节点上是一致的 Availability - 集群永远可用;能够响应读写请求;读总能找到一个可用的副本,不一定是最新的 Partition tolerance - 能够应对局部网络问题,比如某些节点之间不可达
NoSQL
NoSQL数据库(键值、列式存储、文档、图片) 列式存储(HBase) 键值存储(Redis、HBase、Cassandra)
实验训练1 在Cassandra中创建数据库和表作业
实验训练1 在Cassandra中创建数据库和表作业简介本次实验训练旨在帮助学生掌握在Cassandra中创建数据库和表的基本操作。
通过完成本作业,您将学会如何使用CQL (Cassandra Query Language)在Cassandra中创建数据库和表。
步骤以下是在Cassandra中创建数据库和表的步骤:2. 启动Cassandra:安装完成后,启动Cassandra数据库服务。
3. 连接到Cassandra:使用Cassandra的命令行界面或者Cassandra Studio等工具,连接到Cassandra数据库。
4. 创建数据库:使用CQL命令 `CREATE KEYSPACE` 创建一个新的数据库。
例如,可以创建名为 `mydatabase` 的数据库:CREATE KEYSPACE mydatabase WITH replication ={'class':'SimpleStrategy', 'replication_factor':1};这将创建一个名为 `mydatabase` 的数据库,并使用简单策略进行复制(副本因子为1)。
5. 使用数据库:使用CQL命令 `USE` 切换到刚才创建的数据库。
例如:USE mydatabase;这将把当前会话切换到名为 `mydatabase` 的数据库。
6. 创建表:使用CQL命令 `CREATE TABLE` 创建一个新表。
例如,可以创建名为 `mytable` 的表:CREATE TABLE mytable (id UUID PRIMARY KEY,name TEXT,age INT);这将创建一个名为 `mytable` 的表,该表包含 `id`、`name` 和`age` 这三个列,并且 `id` 列被设置为主键。
总结通过本次实验训练,您已经学会了如何在Cassandra中创建数据库和表。
cassandra学习笔记五
Cassandra集群没有中心节点,各个节点的地位完全相同,它们通过一种叫做gossip的协议维护集群的状态。
通过gossip,每个节点都能知道集群中包含哪些节点,以及这些节点的状态,这使得Cassandra集群中的任何一个节点都可以完成任意key的路由,任意一个节点不可用都不会造成灾难性的后果。
一、Gossip算法背景Gossip算法如其名,灵感来自办公室八卦,只要一个人八卦一下,在有限的时间内所有的人都会知道该八卦的信息,这种方式也与病毒传播类似,因此Gossip有众多的别名“闲话算法”、“疫情传播算法”、“病毒感染算法”、“谣言传播算法”。
但Gossip并不是一个新东西,之前的泛洪查找、路由算法都归属于这个范畴,不同的是Gossip给这类算法提供了明确的语义、具体实施方法及收敛性证明。
二、Gossip算法特点Gossip算法又被称为反熵(Anti-Entropy),熵是物理学上的一个概念,代表杂乱无章,而反熵就是在杂乱无章中寻求一致,这充分说明了Gossip的特点:在一个有界网络中,每个节点都随机地与其他节点通信,经过一番杂乱无章的通信,最终所有节点的状态都会达成一致(很神奇)。
每个节点可能知道所有其他节点,也可能仅知道几个邻居节点,只要这些节点可以通过网络连通,最终他们的状态都是一致的。
三、Gossip本质Gossip是一个带冗余的容错算法,更进一步,Gossip是一个最终一致性算法。
虽然无法保证在某个时刻所有节点状态一致,但可以保证在“最终”所有节点一致,“最终”是一个现实中存在,但理论上无法证明的时间点。
因此Gossip 适合没有很高一致性要求的场景。
因为Gossip不要求节点知道所有其他节点,因此又具有去中心化的特点,节点之间完全对等,不需要任何的中心节点。
实际上Gossip可以用于众多能接受“最终一致性”的领域:失败检测、路由同步、Pub/Sub、动态负载均衡。
但Gossip的缺点也很明显,冗余通信会对网路带宽、CUP资源造成很大的负载,而这些负载又受限于通信频率,该频率又影响着算法收敛的速度。
顶象工程师手记:Cassandra在风控数据处理中的实践
Cassandra是一套开源分布式NoSQL数据库系统。
由Facebook开发,主要用于储存收件箱等简单格式数据,集GoogleBigTable的数据模型与Amazon Dynamo的完全分布式的架构于一身。
2008年,Facebook将 Cassandra 开源,并被Digg、Twitter等知名公司引入,成为了一种流行的分布式结构化数据存储方案。
Cassandra是一个混合型的非关系的数据库,类似于Google的BigTable。
其主要功能比Dynamo (分布式的Key-Value存储系统)更丰富,但支持度却不如文档存储MongoDB(介于关系数据库和非关系数据库之间的开源产品,是非关系数据库当中功能最丰富,最像关系数据库的。
支持的数据结构非常松散,是类似json的bjson格式,因此可以存储比较复杂的数据类型)。
Cassandra 可以用到哪里?Cassandra具有常见NoSQL 分布式数据库,其自带的命令行工具完备,兼容性强,甚至Windows机器都可以安装,因此维护、升级都相对比较简单。
它有着很人性化的Web管理界面,兼容大部分SQL语法。
可以设置多个“中心”,这一点跟Hadoop based的HBase / Hive 很不一样。
Cassandra读写性能和可扩展非常好。
由于它是一堆数据库节点共同构成的一个分布式网络服务,只要对Cassandra 的一个节点就行写操作,会被复制到其他节点上去。
同理,对Cassandra的一个节点进行读操作,也会被路由到某个节点上面去读取。
因此,对于一个Cassandra群集来说,扩展性能是比较简单的事情,只管在群集里面添加节点就可以了。
非常适合金融、电商等记录系统日志、产品的目录管理、实时数据存储等等要求高的行业。
我们把Cassandra应用在了数据对象服务的数据提供上,由于有多个“中心”,又减少了对于Hadoop环境的依赖,在维护管理上会非常便捷,又能大幅提升数据的存储以及查询性能。
CASS应用总结
CASS应用总结
Cassandra是一个开源的NoSQL数据库,它的用途是提供高可用性和超高可扩展性的分布式存储系统。
这种分布式系统主要用于分析应用由于其可拓展性,持久性,高可用性和简单的操作性。
它是一个强大的大规模分布式部署技术,支持多数据中心同步备份。
以下是Cassandra应用的一些常见场景:
1、应用程序分析:Cassandra适用于大数据分析,在业务和IT智能中都需要使用它来进行分析,从而获得更好的业务决策。
它可以有效地处理海量数据,以支持复杂的查询和大规模的数据挖掘。
2、事物处理:Cassandra的事务处理能力使得它最适合金融交易应用,能够保证交易的一致性,降低交易的可能失误率。
3、社会媒体分析:Cassandra也可用于社会媒体分析,允许实时分析消费者评论趋势,实时追踪和记录消费者社会状况。
4、实时传感器跟踪:由于其抗拒空轮回的特性,Cassandra也可以用于实时传感器跟踪,以支持实时监控和决策支持系统。
5、日志存储:Cassandra也可用于存储日志,以支持可靠的实时数据收集,便于检测和追踪应用程序错误和行为。
6、企业协同:Cassandra也可用于企业协同,帮助企业更好地将其工作流程集成到组织之中,从而增强其工作效率。
cassandra 学习笔记
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开发入门文档第一部分
Cassandra开发⼊门⽂档第⼀部分Cassandra的特点横向可扩展性:Cassandra部署具有⼏乎⽆限的存储和处理数据的能⼒。
当需要额外的容量时,可以简单地将更多的机器添加到集群中。
当新机器加⼊集群时,Cassandra需要对现有数据进⾏重新平衡,以使扩展集群中的每个节点具有⼤致相等的份额。
⽽且,Cassandra集群的性能与集群内的节点数成正⽐。
当您继续添加实例时,读写吞吐量将保持线性增长。
⾼可⽤性:Cassandra集群中的所有节点都是没有主节点的对等节点。
如果⼀台机器变得不可⽤,Cassandra将继续向与该机器共享数据的其他节点写⼊数据,并在失败的节点重新加⼊集群时对操作进⾏排队和更新。
这意味着在⼀个典型的配置中,多个节点必须同时发⽣故障,才能在Cassandra的可⽤性中出现任何应⽤程序可见的中断。
写优化:传统的关系数据库和⽂档数据库针对读取性能进⾏了优化。
将数据写⼊关系数据库通常涉及对磁盘上的复杂数据结构进⾏就地更新,以便维护能够⾼效灵活地读取的数据结构。
从磁盘I/O的⾓度来看,更新这些数据结构是⼀项⾮常昂贵的操作,⽽磁盘I/O通常是数据库性能的限制因素。
由于写操作⽐读操作更昂贵,因此通常会避免对关系数据库进⾏任何不必要的更新,即使以额外的读操作为代价。
另⼀⽅⾯,Cassandra对写吞吐量进⾏了⾼度优化,事实上,它从不修改磁盘上的数据;它只附加到现有⽂件或创建新⽂件。
这在磁盘I/O上要容易得多,这意味着Cassandra可以提供惊⼈的⾼写吞吐量。
由于向Cassandra写⼊数据和在Cassandra中存储数据都很便宜,因此⾮规范化成本很低,是确保在各种访问场景中可以有效读取数据的好⽅法。
结构化记录:我们看到的前三个数据库特性通常出现在分布式数据存储中。
然⽽,诸如Riak和Voldemort这样的数据库纯粹是键值存储;这些数据库不知道存储在特定键中的记录的内部结构。
这意味着诸如只更新记录的⼀部分、只读取记录中的某些字段或检索在给定字段中包含特定值的记录等有⽤的功能是不可能的。
Cassandra数据库的基本原理与实践
Cassandra数据库的基本原理与实践Cassandra是一款基于NoSQL思想的分布式数据库,它也是最早的大规模分布式NoSQL数据库之一。
Cassandra的特点是高可用、高扩展性和高性能,被广泛应用于互联网领域。
本文将介绍Cassandra的基本原理和实践,通过深入了解Cassandra,让读者更好地利用它来满足商业应用的需求。
一、Cassandra的基本原理1. 数据模型Cassandra的数据模型是基于列(column)的,每个列都有一个标识符和一个值。
列可以分组成行(row),每个行有一个键(key)来表示,这个键对应的值是一组列。
此外,Cassandra还有一个概念叫做超列(super column),它可以嵌套列和行。
2. 数据存储在Cassandra中,数据是按键(key)进行存储的,每个键对应一个值,这个值可以是一个列或一组列。
Cassandra会将数据自动分布到多个节点上,确保数据的高可用和容错性。
数据的分布是基于一致性哈希算法实现的,这个算法可以将键映射到一个节点上,确保数据的负载均衡和分布式存储。
此外,Cassandra还支持副本复制机制,让数据在多个节点之间进行同步和复制,保证了数据的高可用性和容错性。
3. 数据读写Cassandra的读操作是基于键的,每次读操作都返回一个行(row),这个行包含了键和对应的列。
读操作可以从一个节点或多个节点进行,每个节点都可以返回一个完整的行,这样可以保证读操作的高可用性和性能。
Cassandra的写操作是基于列的,每次写操作只影响一个列,写操作可以异步进行,这样可以提高写操作的性能和吞吐量。
4. 数据一致性Cassandra的一致性模型是最终一致性,这个模型可以在多个节点之间实现数据的同步和复制,但是不保证数据在任何时刻都是一致的。
由于Cassandra的数据分布式存储,所以数据的同步和复制可能存在一些延迟和不一致性,这需要应用程序通过其他方式来处理。
cassandra数据库语法
cassandra数据库语法Cassandra数据库语法详解Cassandra是一种高度可扩展的分布式数据库,它采用了NoSQL 的数据模型。
在使用Cassandra进行开发和管理数据库时,掌握其语法是非常重要的。
本文将详细介绍Cassandra数据库的语法,帮助读者更好地理解和应用该数据库。
一、创建和管理键空间1. 创建键空间在Cassandra中,键空间是一个顶级命名空间,用于组织表和其他对象。
创建键空间的语法如下:CREATE KEYSPACE <键空间名称> WITH replication = {'class':'SimpleStrategy', 'replication_factor':<副本因子>};2. 使用键空间创建完键空间后,可以使用以下语法切换到指定的键空间:USE <键空间名称>;3. 查看键空间要查看当前所有的键空间,可以使用以下语法:DESCRIBE KEYSPACES;二、创建和管理表1. 创建表在Cassandra中,表是存储数据的基本单元。
创建表的语法如下:CREATE TABLE <表名> (<列名1> <数据类型1>,<列名2> <数据类型2>,...PRIMARY KEY (<主键列>));2. 删除表要删除已经存在的表,可以使用以下语法:DROP TABLE <表名>;3. 修改表结构可以使用ALTER TABLE语法对已存在的表进行修改,如添加列、删除列、更改数据类型等操作。
三、数据操作1. 插入数据插入数据的语法如下:INSERT INTO <表名> (<列名1>, <列名2>, ...) VALUES (<值1>, <值2>, ...);2. 查询数据查询数据的语法如下:SELECT <列名1>, <列名2>, ... FROM <表名> WHERE <条件>;3. 更新数据更新数据的语法如下:UPDATE <表名> SET <列名1>=<值1>, <列名2>=<值2>, ... WHERE <条件>;4. 删除数据删除数据的语法如下:DELETE FROM <表名> WHERE <条件>;四、索引和过滤器1. 创建索引在Cassandra中,可以创建索引以提高数据的查询效率。
cassandra学习笔记四
现在开始深入了解一下cassandra的数据模型。
cassandra是一种NoSQL数据库,NoSQL并不是指没有SQL语句,而是指No Relational。
cassandra的数据模型结合了Dynamo的key/value和BigTable的面向列的特点,主要被设计为存储大规模的分布式数据。
一、cassandra数据模型的特点1.它基于key-value模型cassandra的数据库由ColumnFamilies组成,一个ColumnFamily是一个key-value键值对的集合。
若和关系型数据库类比,ColumnFamily相当于表,而里面的key-value键值对相当于表里的一条记录。
2.它的key-value模型有多层嵌套ColumnFamily里的每条记录都是一个key-value对,value部分存放的是无限制的Columns。
每个Column都有一个Column Name和value,因此Column实际也是一个key-value对。
但Column的value部分已经是最基本的数据存储单元,不能再向下嵌套了。
在这种嵌套下,ColumnFamily的每条记录都包含一个key 和一个由Columns组成的value(至少有一个Column),也就是说ColumnFamily 的value只是一个中间人,实际存储数据的是value里的Columns。
如下图所示。
上面所说的是双层嵌套,还有一种三层嵌套。
在这种情况下,ColumnFamily 每条记录的value部分不是Columns,而是一种被称为SuperColumn的结构。
SuperColumn的key是SuperColumn name,它的value部分可以存储多个Columns,如下图所示:这样就有以下三种嵌套:ColumnFamily: key - value(SuperColumn)SuperColumn: key(SuperColumn name) - value(Column)Column: key(Column name) - valueSuperColumn里不能再存储SuperColumn,因此cassandra的嵌套最多为三层。
CASS学习心得
CASS学习心得
本次CASS学习,使我受益匪浅,对CASS有了一个更加深入的了解,
下面我对CASS的学习进行记录。
首先,要认识到CASS能够实现高性能、可靠性和可扩展性的重要性。
它是一种适用于分布式系统和大规模数据库系统的开放源代码分布式数据
存储系统。
CASS提供了一种用于构建应用程序的出色的架构,可以支持
各种用例,包括事务处理、日志存储、文本、时间序列存储和图形数据分
析等。
其次,要了解CASS存储的数据是以表格结构存储的,可以通过CQL
语句来进行数据操作,实现数据的增删改查等操作。
同时,CQL也可以为
用户提供优势,比如可以使用聚合函数进行数据统计,以及使用索引来提
高查询性能等等。
此外,CASS还提供了灵活的控制权限机制。
CASS通过用户名、密码、键空间和表空间等机制,来控制用户对表或表中数据的访问权限,以及用
户在表上执行的操作权限。
最后,CASS有许多优点,例如低延迟、快速复制、高吞吐量、分片
及数据存储等。
这些特性使得CASS成为大规模复杂数据库的完美解决方案,可以应用于分布式系统,以便满足大数据的需求。
总之,通过本次学习,我更加掌握了CASS的知识,重新深入了解到
可靠。
cass教程
cass教程Cassandra教程: 从入门到精通概述:Cassandra,全称为Apache Cassandra,是一个高度可扩展的分布式数据库管理系统。
它设计用于管理庞大的数据,可以在多台服务器上进行分布式部署,从而提供高可用性和容错能力。
本教程旨在为读者提供深入了解Cassandra的基本概念和操作的综合指南。
目录:1. Cassandra的基本概念1.1 分布式数据库管理系统1.2 横向扩展和可靠性1.3 Cassandra的数据模型2. Cassandra的安装和配置2.1 安装Java Development Kit (JDK)2.2 下载和安装Cassandra2.3 配置Cassandra集群3. 创建和管理数据库3.1 启动和停止Cassandra服务器 3.2 创建数据库3.3 数据库管理操作4. 数据模型和数据类型4.1 键空间(Keyspace)4.2 表(Table)4.3 列(Column)4.4 数据类型5. Cassandra查询语言(CQL)5.1 CQL简介5.2 CQL数据定义语句5.3 CQL数据操作语句6. Cassandra的读写操作6.1 读取数据6.2 写入数据6.3 批量写入数据6.4 数据一致性和写入策略7. 数据复制和一致性7.1 数据复制策略7.2 复制因子和副本7.3 数据复制的一致性问题8. Cassandra集群管理8.1 添加和移除节点8.2 节点故障和恢复8.3 数据迁移9. 性能调优和最佳实践9.1 数据建模的最佳实践9.2 查询性能优化9.3 节点调优和硬件要求10. Cassandra中的事务管理 10.1 Cassandra的事务特性 10.2 处理并发和原子性操作11. 实例和用例11.1 Cassandra在企业中的用例11.2 Cassandra在互联网应用中的应用12. Cassandra的安全性和备份12.1 Cassandra的安全机制12.2 数据备份和恢复策略结束语:本教程覆盖了Cassandra的各个方面,从基本概念到高级应用,旨在帮助读者全面了解和掌握这个分布式数据库管理系统。
Cassandra个人学习笔记总结
Cassandra学习笔记---李鑫(***********************)一、Cassandra 1.0的新特性:1:列簇压缩。
(这是此项目开始以来呼声最高的需求),可以有效提升系统的存储能力,提高读取效率。
2:增强的内存和硬盘空间管理3:可调整的压缩策略。
提出了一种新的有创造性的压缩算法。
这种算法可以作用于每一列。
4:允许将Cassandra安装为Windows系统服务。
通过如下命令行bin\cassandra.bat install获得从Windows系统服务中移除:bin\cassandra.bat uninstall5:对写一致性的增强及效率提升提供了对hinted handoff的2种增强方式:◆Hint data数据存储的更有效率,有效降低了临时存储Hint data的那些节点的加载压力◆在原来的“失效检测”中存在一个窗口期,会导致数据写失败。
目前新版本中对Hint data数据的存储无需等到失效节点被标记为“失效”。
这意味着运行全节点修复以调和“写错误”不再是必须的了(但节点修复依然还是推荐周期性进行,仅仅在多节点同步失败或整个节点的数据都被破坏情况下才是必须的,而这两种情况均是小概率事件)。
基于这个改进,数据修复的概率从100%降低到了10%。
这将极大提升整个集群的数据吞吐率。
(减少了“读修复”)。
二、DataStax OpsCenter一个基于Web的Cassandra的图形化管理和监控工具,采用Python开发。
注意:DataStax OpsCenter在MacOS目前不支持,其仅仅支持Linux平台。
在Linux下可以通过wget命令来获取相关的安装包,如下:$ wget /community/dsc-cassandra-1.0.5-bin.tar.gz$ wget /community/dsc-1.0.1-demo-bin.tar.gz$ wget /community/opscenter-1.3.1-free.tar.gz解压这些分发包:$ tar -xzvf dsc-cassandra-1.0.5-bin.tar.gz$ tar -xzvf dsc-1.0.1-demo-bin.tar.gz$ tar -xzvf opscenter-1.3.1-free.tar.gz$ rm *.tar.gz三、Cassandra集群部署规划在规划正式生产环境中的Cassandra集群部署时,首先必须考虑计划存储的数据量,以及前端主要应用系统常态情况及极值情况下的负载(读/写)压力。
微服务实战之Cassandra
微服务实战之Cassandra概述一提到数据存储马上我们就会想到数据库,一想数据库就会想到Oracle, MySQL等关系数据库。
其实今天摆在我们面前有更多选择,例如•迷你版的关系数据库 SQLite•流行的开源数据库 MySQL•强大的开源数据库 PGSQL•时间序列数据库InfluxDB和众多的 NoSQL 数据存储系统•Cassandra•Riak•Redis•MongoDB以及分布式文件存储系统•HDFS•Swift (Openstack Object Storage)Cassandra 是 NoSQL 的典型代表产品, 具有极佳的线性可扩展性和高可用性, 同时性能也不错, 跨Data center的复制也还行, 不足之处在于它做不到强一致性, 不要指望写入Cassandra的数据, 别人立马就能正确无误地由读出来. 与大多数NOSQL产品一样, 它所能保证的只能是最终一致性.先复习一下相关理论CAP著名的CAP理论提出一致性,可用性,分区容错性,三者不可兼得C:Consistency,一致性, 在不同的地方和时间点上数据总是一致的A:Availability,可用性, 在任何地点和时间都可以使用服务P:Partition tolerance,分区容错性,即使出现网络故障系统依然具有可靠大多数nosql 产品都选择了牺牲强一致性,保证可用性和分区容错性,以及最终一致性,Cassandra 也是如此ACID传统关系数据库用 ACID 来保证强一致性, 这个 Cassandra 是做不到的A: Atomicity,原子性C: Consistency,一致性I: Isolation,隔离性D: Durability,持久性BASE大多数 NOSQL 系统采用的方式BA:Basically Available,基本可用S:Soft State,软状态,即中间可能不一致的状态E:Eventually Consistent,最终一致性分布式哈希表和一致性哈希DHT-distributed hash table 分布哈希表, 一种去中心化的分布式系统, 提供类似于哈希表查找服务, 键值对存储在DHT中, 任何参于的节点都可根据 key 来存储相应的值DHT的特点是1.独立自主性: 各个节点各自为战, 不需要中央的协调和控制节点2.容错性: 任何一个节点加入,离开或损毁, 系统依然可用3.可扩展性: 可以任意增加节点以提高系统容量打个比方, 我有一篮12个鸡蛋, 可以放在三个篮子里用最简单的取余法, 将鸡蛋编号0~17除以3, 每个篮子里放4个鸡蛋假如增加或减少一个篮子, 都不是问题, 我只要根据编号取余一下子就能确定地找到那个鸡蛋当然这里的取余法太 low 了, 虽然数据分布绝对均匀, 但是一旦增减篮子我们就需要移动鸡蛋来满足约束条件一致性哈希就是比取余法更高级点的哈希算法, 一致性表示即使有篮子的增减, 无需移动数据依然可以根据编号确定地找到想找的鸡蛋, 并且通过虚拟节点技术使得数据分布也比较均匀举例如下package com.github.walterfan.util;import mons.logging.Log;import mons.logging.LogFactory;import java.security.MessageDigest;import java.security.NoSuchAlgorithmException;import java.util.Collection;import java.util.Map;import java.util.SortedMap;import java.util.TreeMap;interface HashFunction {Integer hash(String keyStr);}class MD5Hash implements HashFunction {public Integer hash(String keyStr) {byte[] bKey=mac("MD5", keyStr);return ((int) (bKey[3] & 0xFF) << 24)| ((int) (bKey[2] & 0xFF) << 16)| ((int) (bKey[1] & 0xFF) << 8)| (bKey[0] & 0xFF);}public static byte[] mac(String alga, String str) {MessageDigest md;try {md = MessageDigest.getInstance(alga);return md.digest(str.getBytes());} catch (NoSuchAlgorithmException e) {throw new IllegalArgumentException(e);}}}public class ConsistentHash<T> {private static Log logger = LogFactory.getLog(ConsistentHash.class);private final HashFunction hashFunction;private final int numberOfReplicas;private final SortedMap<Integer, T> circle = new TreeMap<Integer, T>();public ConsistentHash(HashFunction hashFunction, intnumberOfReplicas,Collection<T> nodes) {this.hashFunction = hashFunction;this.numberOfReplicas = numberOfReplicas;for (T node : nodes) {add(node);}}public void add(T node) {for (int i = 0; i < numberOfReplicas; i++) {circle.put(hashFunction.hash(node.toString() + i), node);}}public void remove(T node) {for (int i = 0; i < numberOfReplicas; i++) {circle.remove(hashFunction.hash(node.toString() + i));}}public T get(String keyStr) {if (circle.isEmpty()) {return null;}int hash = hashFunction.hash(keyStr);if (!circle.containsKey(hash)) {SortedMap<Integer, T> tailMap = circle.tailMap(hash);hash = tailMap.isEmpty() ? circle.firstKey() : tailMap.firstKey();}return circle.get(hash);}public String toString() {StringBuilder sb = new StringBuilder("");for(Map.Entry<Integer, T> entry : circle.entrySet()) {sb.append(entry.getKey());sb.append("=");sb.append(entry.getValue());sb.append("\n");}return sb.toString();}/*** @param args*/public static void main(String[] args) {java.util.List<String> nodes = new java.util.ArrayList<String>(3);nodes.add("1");nodes.add("2");ConsistentHash<String> continuum = new ConsistentHash<String>(new MD5Hash(), 8, nodes);String strID = "16580";String node = continuum.get(strID);System.out.println("select node: " + node + " for " + strID);java.util.Map<String, Integer> statMap = testDistribution(continuum);System.out.println(statMap);continuum.add("3");node = continuum.get(strID);System.out.println("add node 3, select node: " + node + " for " + strID);java.util.Map<String, Integer> statMap1 = testDistribution(continuum);System.out.println(statMap1);continuum.remove("3");node = continuum.get(strID);System.out.println("remove node 3, select node: " + node + " for " + strID);java.util.Map<String, Integer> statMap2 = testDistribution(continuum);System.out.println(statMap2);}private static java.util.Map<String, Integer> testDistribution( ConsistentHash<String> continuum) {java.util.Map<String, Integer> statMap = new java.util.HashMap<String, Integer>();for(int i = 10000; i < 20000; i++) {String svr = continuum.get("server" + i);//System.out.println(i + ". server: " + svr);Integer cnt = statMap.get(svr);if(null == cnt) {statMap.put(svr, 1);} else {statMap.put(svr, cnt + 1);}}return statMap;}}输出如下select node: 2 for 16580{1=5891, 2=4109}add node 3, select node: 2 for 16580{1=4703, 2=2517, 3=2780}remove node 3, select node: 2 for 16580{1=5891, 2=4109}安装brew install cassandra22工具cqlsh./cqlsh 192.168.3.5 -u test - passnode tool./nodetool -h 192.168.3.5 ringnodetool statusDatacenter: datacenter1=======================Status=Up/Down|/ State=Normal/Leaving/Joining/Moving-- Address Load Tokens Owns (effective) Host ID RackUN 127.0.0.1 1015.55 KB 256 100.0% 9ec3a333-81bc-4945-9db1-ef1a13b62cde rack1CQL类似 SQL , 详细语法参见SELECT * from system.schema_keyspaces limit 10;SELECT * from system.schema_columnfamilies limit 10;SELECT * from system.schema_columns limit 10;创建一个表空间CREATE KEYSPACE pimsWITH REPLICATION = {'class' : 'NetworkTopologyStrategy','datacenter1' : 1} ;架构及特点Cassandra 写的时候是将数据追加到可用节点的 commit log 上,因而速度很快1.将数据追加到 commit log 上2.更新内存的数据结构 memTable3.内存数据如果超过了最大限值, 则储存到磁盘上的 SSTable 中相比之下, Cassandra 读的速度比较慢, 因为它要根据主键至少读取两个节点, 经过数据比较后得出结果参见Cassandra Architecture in briefGossip 协议流言协议, 俗话说, 流言蜚语, 一传十, 十传百, 尽人皆知. Gossip 协议就是采用了类似的方法将消息迅速从一个结点复制到其他结点. 传递时需要注意的就是传递的广度和深度, 不要造成回环具体实现可参见 https:///apache/incubator-gossip Gossiper 类随机选择一个节点来发送消息GossipDigestSyncMessage, 接收消息节点发回确认消息, 发送节点回应, 这轮消息同步即完成 (send-receive-ack), 如果同步失败, 则将此节点标记为可疑节点, 连续发生同步失败则可认为此节点已经挂掉了, 具体算法为 Phi Accural Failure Detection.核心结构Node 节点也就是你存储数据的地方, 一般我们至少部署三台Cassandra 节点在读写的时候同时向三台节点发出请求, 任意两台返回响应即可N < W + RN 为复制的节点数W 为写数据的最少返回节点数R 为读数据的最少返回节点数3 < 2 + 2如果是 7 台节点, 复制因子设为3, 根据key 哈希过后会找到三台结点,依然是3 < 2 + 2复制因子设为4, 那就是7 < 4 + 4, 不过一般复制到三个结点也就够了datacenter 数据中心一组相关节点的集合, 可以是物理上的一个数据中心, 也可以是虚拟的数据中心一般我们认为不同的数据中心应该位于不同的网络位置. 一个数据中心内的节点是在同一个网段中的Cluster 集群A cluster contains one or more datacenters. It can span physical locations.一个集群包含一个或多个数据中心, 它可能会跨越多个物理位置. Commit log 提交LogAll data is written first to the commit log for durability. After all its data has been flushed to SSTables, it can be archived, deleted, or recycled.所有的数据都会先写到commit log中持久化, 当数据被刷新到SSTables 后, 相关的commit log可以被归档,删除或回收Table 表类似于关系数据库, 表就是行的集合, 行由列组成, 列又分为主键和值SSTable 排序字串表排序的字符串表(SSTable)是一种不可变的数据文件, Cassandra定期向其写入memtable。
离职系列文章之Cassandra使用经验
离职系列文章之Cassandra使用经验离职“系列文章”只写一篇肯定是不对的……前文写了Redis集群之后,大家纷纷表示我在吐槽公司太穷机器挫,其实我真不是故意要吐槽的……于是很纠结写完Redis之后要不要写Cassandra,因为Cassandra用的机器更挫,直到离职前不久才换了几台新机器……从去年3月开始调研依赖,接触C*也有一年多了。
中间写过一些文章,但总体上不是很系统,而且其实也不是很确定写的是不是一定正确;一些是读代码之后的笔记,主要是针对2.1的。
所以在这个离职的欢乐祥和的时刻,想跳过细节谈经验和感受。
当然我觉得我写这种文章也是有局限的,因为除了C*之外,其他的开源分布式数据库(尤其是HBase)都没用过,所以很难用实战来对比说到底哪个更好、哪个适合什么场景、哪个坑更少。
本来是想接着像前文一样先说技术背景的。
但是写了上千字的历史故事后看了下感觉对文章主旨没啥帮助,而且怎么看怎么还像是在吐槽,于是就都删了,直接进入正题……当然,阅读本文需要一定的Cassandra基础,比如数据模型、大概的原理等等。
入门的东西就不太想说了。
Cassandra是靠时间戳谁大谁赢来维护版本的,这个时间戳在初期是由client提供,后来变成默认由接受client请求的节点提供,同时可选由client指定任意一个timestamp。
有些地方说这属于最终一致性,有些地方说看W+R和N的关系,大于是强一致,小于等于是最终一致性,我觉得都不对。
因为分布式系统的时间戳是无法协调一致的,一旦因为时间戳不准,先写的时间戳反而更大,后写的数据是永远读不到的。
因此C*只能说是如果W+R>N那么可以马上读到时间戳最大的,如果<=那么能最终读到时间戳最大的,这属于哪种一致性我就不清楚了。
当然这里会有些小优化,比如一个C*进程内提供的时间戳是保证绝对单增的,来抵消闰秒等特殊情况。
本质上这都是把分布式系统中一个非常难搞的问题——时序——给简化了从而完全不是问题了。
cassandra手册
cassandra手册
Cassandra 是一个开源的分布式 NoSQL 数据库管理系统,它旨在提供高度可扩展性和高性能的数据存储解决方案。
Cassandra 手册涵盖了该数据库的各种方面,包括安装、配置、数据建模、查询语言、性能优化等内容。
下面我将从多个角度来介绍 Cassandra 手册的内容。
首先,Cassandra 手册包括了安装和配置方面的内容。
这部分内容会详细介绍如何在不同操作系统上安装 Cassandra,并提供了配置文件的说明,帮助用户根据自己的需求进行定制化配置。
其次,Cassandra 手册涵盖了数据建模方面的内容。
这部分内容会介绍如何设计适合 Cassandra 数据存储的数据模型,包括表的设计、主键的选择、数据分布等方面的最佳实践。
另外,Cassandra 手册还包括了查询语言方面的内容。
这部分内容会介绍 Cassandra 的查询语言 CQL(Cassandra Query Language),包括查询操作、更新操作、事务支持等内容,帮助用户编写高效的数据查询和更新操作。
此外,Cassandra 手册还会涵盖性能优化、故障排除、安全性设置等方面的内容。
这些内容会帮助用户更好地理解和使用Cassandra 数据库,从而更好地满足其业务需求。
总的来说,Cassandra 手册是一份全面的指南,涵盖了Cassandra 数据库的各个方面,帮助用户更好地理解和使用这一强大的分布式 NoSQL 数据库管理系统。
希望我的回答能够帮助你更好地了解 Cassandra 手册的内容。
Cassandra关键技术详解
Cassandra关键技术详解1.NoSQL运动与Cassandra系统所谓键值存储就是用一个键来表达事物的属性,而用一个值来表达这个特征(属性)的取值。
键值数据广泛存在于社交网络、工业大数据等应用当中。
键值存储的代表是Facebook基于谷歌和亚马逊技术开发的Cassandra系统。
键值存储是一类非常重要的大数据存储系统,主要管理模式动态变化的、弱结构化数据键值存储系统,起源于2010年前后的NoSQL运动。
1.1 NoSQL运动NoSQL一词最早出现于1998年是意大利学者Carlo Strozzi开发的一个轻量开源,但不支持SQL语言的关系数据库。
2009年6月,在哥伦比亚广播集团旗下的互动媒体公司世界上最大的社会音乐平台Lastfm的技术总监Jon Oskarsson组织了首次NoSQL的研讨会,这次会议上Rackspace的Eric Evans再次提出了NoSQL的概念,这次只有一天时间的技术分享会成为引爆NoSQL运动的标志性事件。
如果说1998年的NoSQL项目仅仅是否定了SQL语言,而本次NoSQL运动的发展则围绕着三个否定,即否定关系模型、否定ACID事务、否定SQL语言,其核心是否定关系模型。
因此,对NoSQL最普遍的解释是"非关系型的",强调Key-Value 存储和文档数据库的优点,而不是单纯的反对RDBMS。
大数据促进了NoSQL的迅速繁荣,出现了大量的技术多样的NoSQL系统,这些NoSQL系统主要可以分为三大类:即文档系统(MongoDB)、键值系统(Cassandra、Hbase)和图系统(Neo4J)。
1.2 Cassandra NoSQL数据库简介本文主要介绍键值存储的代表Cassandra系统,Apache Cassandra是一套2008年开源的分布式NoSQL数据库系统,由就职于脸谱公司的两位工程师开发。
Cassandra的技术主要来源于两个方法,一个是谷歌的Bigtable,也就是我们常说的大表,作为Cassandra的数据模型;另一个是Amazon中的DynamoDB,主要借鉴了它的P2P架构。
cassandra 偏移量
cassandra 偏移量
摘要:
1.介绍Cassandra 偏移量
2.Cassandra 中的数据存储和分区
3.偏移量的作用
4.偏移量的设置与优化
5.总结
正文:
Cassandra 偏移量是一个在Cassandra 数据库中经常被提及的概念。
Cassandra 是一个分布式NoSQL 数据库,它的数据是按照row key 分区存储的。
偏移量在Cassandra 中主要起到两个作用:一是决定数据在磁盘上的存储位置,二是影响数据的读取性能。
在Cassandra 中,数据存储是按照row key 的哈希值进行分区的。
每个分区内的数据都有对应的偏移量,这些偏移量定义了数据在磁盘上的存储位置。
通常情况下,偏移量是连续的,但也可以通过设置偏移量来调整数据的存储位置。
偏移量的设置与优化对于Cassandra 的性能至关重要。
如果偏移量设置得不好,可能会导致数据在磁盘上分布不均匀,从而影响读取性能。
为了避免这种情况,Cassandra 提供了多种策略来优化偏移量的设置,例如使用随机偏移量或者使用取模运算来调整偏移量。
总之,Cassandra 偏移量是影响数据存储和读取性能的重要因素。
cassandra 传参数
cassandra 传参数摘要:1.介绍Cassandra 的基本概念2.阐述Cassandra 中的参数传入方式3.详述如何在Cassandra 中使用传参数4.总结Cassandra 传参数的重要性和优势正文:Cassandra 是一款高性能、可扩展的分布式NoSQL 数据库,其设计初衷是为了处理海量数据。
Cassandra 采用了数据分布和数据复制的技术,以实现高可用性、可扩展性和数据容错。
在Cassandra 中,传参数是一种重要的功能,可以实现对数据库的灵活控制。
在Cassandra 中,参数传入方式主要有两种:一种是在创建表时指定参数,另一种是在查询时动态传入参数。
在创建表时指定参数,可以通过在创建语句中使用"WITH"子句来实现。
例如,创建一个带有"bloom_filter_fp_rate"参数的表,可以使用如下语句:```CREATE TABLE my_table (id INT PRIMARY KEY,name TEXT,age INT) WITH bloom_filter_fp_rate = 0.1;```在查询时动态传入参数,可以通过在查询语句中使用"WHERE"子句来实现。
例如,假设有一个名为"my_table"的表,其中有一个名为"age"的列,我们可以使用如下语句查询年龄大于30 的数据:```SELECT * FROM my_table WHERE age > 30;```在Cassandra 中,使用传参数可以带来很多优势。
首先,传参数可以提高SQL 的复用性,避免因为参数不同而编写大量的重复代码。
其次,传参数可以实现对数据库的灵活控制,满足不同场景下的需求。
最后,传参数可以提高代码的可读性和可维护性,降低开发和维护的难度。
总之,Cassandra 中的参数传入方式为开发者提供了极大的便利,使得开发者可以更加高效地操作数据库。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
最近尝试搭建一个云存储平台,在不断的对比之后,决定采用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使用JA V A编写,因此无平台限制,只要有JA V A即可。
我是在windows下安装的cassandra,但linux下也差不多。
二、配置环境变量
首先要配置环境变量,包括JA V A和cassandra自己的环境变量。
JA V A环境变量的配置说明很多,这里不详述。
cassandra的环境变量配置:右键我的电脑->属性->高级->环境变量,在系统变量里新建一个,name里输入Cassandra_Home,path输入cassandra的目录。
如我的cassandra解压在D盘根目录,那么path输入D:\apache-cassandra-1.0.8。
配置好后,在命令行界面输入echo %Canssandra_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:存放提交日志的目录路径。
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。
但是columns里面可以有很多的记录,如上图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。