From wikipedia https://en.wikipedia.org/wiki/CAP_theorem
In theoretical computer science, the CAP theorem, also named Brewer‘s theorem after computer scientist Eric Brewer, states that it is impossible for a distributed data store to simultaneously provide more than two out of the following three guarantees:[1][2][3]
Consistency Availability Partition tolerance Every read receives the most recent write or an error Every request receives a (non-error) response – without guarantee that it contains the most recent write The system continues to operate despite an arbitrary number of messages being dropped (or delayed) by the network between nodes In other words, the CAP Theorem states that in the presence of a network partition, one has to choose between consistency and availability. Note that consistency as defined in the CAP Theorem is quite different from the consistency guaranteed in ACID database transactions.
维基上对CAP有简单的解释
C 一致性 读请求要么读到最新值,要么触发错误
A 可用性 每个请求都能收到一个非错误的相应,不保证读取的一定是最新值
P 分区容忍性 系统可在网络节点之间丢包或者包延迟的情况下继续运行
CAP理论说,分布式系统无法三者兼顾,须有舍得。
As a distributed system, multiple nodes are required to balance and handle growing loads, which is why P is usually required as default. Since the module has more than one nodes, scacrificing either consistency or 100% availability is unavoidable according to the theory.
作为分布式系统,为了负载均衡以及应对日益增长的访问压力,分区容忍性通常都是需要的。根据CAP理论,我们只好在一致性与100%可用之间做出一定的牺牲。
ACID is typical property of traditional relational databse.
ACID是传统关系型数据库的特点。
Atomicity Atomicity requires that each transaction be "all or nothing": if one part of the transaction fails, then the entire transaction fails, and the database state is left unchanged
原子性 一个事务中所有操作都必须全部完成,要么全部不完成。
Consistency The consistency property ensures that any transaction will bring the database from one valid state to another.
一致性 事务将把数据库从一个状态带入另一个状态。
Isolation The isolation property ensures that the concurrent execution of transactions results in a system state that would be obtained if transactions were executed sequentially, i.e., one after the other.
隔离性 各种事务并发执行会感觉到和串行无差。
Durability The durability property ensures that once a transaction has been committed, it will remain so, even in the event of power loss, crashes, or errors.
持久性 一旦事务完成,宕机,断电都不会影响
Another consistent model is called BASE ( Basically Available, Soft state, Eventual consistency)
另一个与之相对的一致性模型叫做BASE,基本可用,柔性事务,最终一致性。
Cassandra is NoSQL database. Directed by CAP theory, it sacfrices some features of traditional database like table joins and acid transactions. But the trade off may worth it. Cassandra handles high incoming data velocity, supports very large data volumes, and no single point of failure.
Cassandra是非关系型数据库。在CAP理论的指导下,它牺牲掉了传统数据库的一些特性,比如联合查询,ACID事务。然而Cassandra可以处理较高的数据写入速率,支持大数据存储,也没有单点失败的问题,可谓有得有失。
Cassandra is well known for its impressive performance in both reading and writing data.
Data is written to Cassandra in a way that provides both full data durability and high performance. Data written to a Cassandra node is first recorded in an on-disk commit log and then written to a memory-based structure called a memtable. When a memtable’s size exceeds a configurable threshold, the data is written to an immutable file on disk called an SSTable. Buffering writes in memory in this way allows writes always to be a fully sequential operation, with many megabytes of disk I/O happening at the same time, rather than one at a time over a long period. This architecture gives Cassandra its legendary write performance.
写入Cassandra节点的数据会首先写入commit日志,之后写入内存中的memtable。当memtable大到超过阈值,数据会写入磁盘上的SSTable持久化文件。缓冲写使得写操作总是顺序操作,让许多兆的IO读写能同时发生。这种架构给予了Cassandra传奇的写入速度。
Sharding is a familiar term for dba who manages relational database cluster. Cassandra automatically distributes and maintains data across a cluster thus freeing developers and archtects. Canssandra has an internal component called partioner. It take a row‘s primary key, calculates a token and then assign to a predicatable node.
对于关系型数据库的DBA,分片是一个很常听到的术语。而Cassandra能够自动的分布和维护集群的数据,这对开发者和构架师都是一个好消息。Cassandra 内部有一个叫做partioner的组件,它根据数据行的主键,计算出token,然后以可预测的方式分配给数据节点。
Cassandra introduced CQL as query language.
Cassandra使用CQL来进行数据查询
CREATE TABLE test.demo ( id int, name text, PRIMARY KEY (id) )
insert into test.demo (id, name) values (1, ‘hello‘) select * from test.demo
Result:
How to use cassandra in Java?
Java里面怎么使用Cassandra呢? 参见下面代码片段 (注意红色部分,Cassandra支持给插入的数据加入TTL)
Statement statement = QueryBuilder.insertInto("test","demo") .value("id", 1) .value("name", "hello") .using(QueryBuilder.ttl(MSG_TTL)); //We can set ttl for a row
session.execute(statement);
Here we go a little deeper into Cassandra data storage. The first element in the PRIMARY KEY is what we call a partition key. In this case, it‘s "id".
Partition key is responsible for data distribution in the cluster. Cassandra use consistent hashing to distribute data so that data reorganization when nodes are added or removed can be minimized.
Data center below has four nodes. Each is responsible for a hash range. Suddenly, node B run into failure, data should be stored in B will be relocated to A instead.
这里我们稍微多谈谈Cassandra的数据存储。 主键的第一部分叫做分区键,这个例子中是id。分区键用于数据分区,具体地,Cassandra通过一致性哈希来进行分区,这还可以减少节点增减带来的数据转移。
如下图所示的数据中心,有4个节点,每个节点负责一段哈希范围。突然,节点B宕机,本应该存储在B的数据就会转移去节点A,而不是到所有的节点去。
In practice, we can add many more nodes (far larger than real nodes) to the ring. The additional virtual nodes can be mapped to the real nodes so that data can be distributed evenly among nodes.
实际使用中,我们可以增加许多的虚拟节点到哈希环上。然后把多余的虚拟节点映射到真实节点上,这样数据的分布可以更加均匀。