Cassandra分布式数据库

标签:

本文出自jvm123.com-java技术分享站:http://jvm123.com/2019/11/cassandra-fen-bu.html

Cassandra分布式架构

Cassandra在其节点之间具有对等分布式系统,并且数据分布在集群中的所有节点之间。集群中的每个节点都可以接受读取和写入请求,无论数据实际位于集群中的何处。

在Cassandra中,集群中的一个或多个节点充当给定数据片段的副本。如果检测到一些节点以过期值响应,Cassandra将向客户端返回最近的值。返回最新的值后,Cassandra在后台执行读修复以更新失效值。

Cassandra在后台使用Gossip协议,允许节点相互通信并检测集群中的任何故障节点。

Gossip协议主要用在分布式数据库系统中各个副本节点同步数据之用,这种场景的一个最大特点就是组成的网络的节点都是对等节点,是非结构化网络 :

  1. Gossip 是周期性的散播消息,把周期限定为 1 秒
  2. 被感染节点随机选择 k 个邻接节点(fan-out)散播消息,这里把 fan-out 设置为 3,每次最多往 3 个节点散播。
  3. 每次散播消息都选择尚未发送过的节点进行散播
  4. 收到消息的节点不再往发送节点散播,比如 A -> B,那么 B 进行散播的时候,不再发给 A。

Cassandra 数据模型

键空间 (Keyspace)

键空间是Cassandra中数据的最外层容器。Cassandra中的一个键空间的基本属性有:

  • 复制因子 – 它是集群中将接收相同数据副本的计算机数。
  • 副本放置策略 – 它只是把副本放在介质中的策略。我们有简单策略(机架感知策略),旧网络拓扑策略(机架感知策略)和网络拓扑策略(数据中心共享策略)等策略。
  • 列族(数据表) – 键空间是一个或多个列族的列表的容器。列族又是一个行集合的容器。每行包含有序列。列族表示数据的结构。每个键空间至少有一个,通常是许多列族。

创建键空间的语法如下

CREATE KEYSPACE Keyspace name
WITH replication = {'class': 'SimpleStrategy', 'replication_factor' : 3};

SimpleStrategy为副本放置策略;3为复制因子;列族(数据表)的操作将在下面介绍。

Cassandra 表操作

创建表

-- 格式
CREATE (TABLE | COLUMNFAMILY) <tablename>
('<column-definition>' , '<column-definition>')
(WITH <option> AND <option>);
-- 示例
CREATE TABLE emp(
  emp_id int PRIMARY KEY,
  emp_name text,
  emp_city text,
  emp_sal varint,
  emp_phone varint
);

修改表

-- 格式
ALTER (TABLE | COLUMNFAMILY) <tablename> <instruction>;
-- 示例
ALTER TABLE emp ADD emp_email text;
ALTER TABLE emp DROP emp_email;

删除表

DROP TABLE emp;

创建索引

-- 格式
CREATE INDEX <identifier> ON <tablename>;
--
CREATE INDEX name ON emp1 (emp_name);

删除索引

-- 格式
DROP INDEX <identifier>;
--
drop index name;

Cassandra数据操作

insert

-- 格式
INSERT INTO <tablename>(<column1 name>, <column2 name>....)
VALUES (<value1>, <value2>....)
USING <option>
-- 
INSERT INTO emp(emp_id, emp_name, emp_city,emp_phone, emp_sal) 
VALUES(1,'ram', 'Hyderabad', 9848022338, 50000);

update

-- 格式
UPDATE <tablename>
SET <column-name> = <new-value>
<column-name> = <value>....
WHERE <condition>
--
UPDATE emp SET emp_city='Delhi', emp_sal=50000
WHERE emp_id=2;

select

-- 格式
SELECT FROM <table-name> WHERE <condition>;
--
SELECT * FROM emp WHERE emp_sal=50000;

delete

-- 格式
DELETE FROM <identifier> WHERE <condition>;
--
DELETE FROM emp WHERE emp_id=3;

batch批处理

使用BATCH,您可以同时执行多个修改语句(插入,更新,删除)。其语法如下:

-- 格式
BEGIN BATCH
<insert-stmt>/ <update-stmt>/ <delete-stmt>
APPLY BATCH
-- 
BEGIN BATCH
    INSERT INTO emp (emp_id, emp_city, emp_name, emp_phone, emp_sal)
              values(4,'Pune','rajeev',9848022331, 30000);
    UPDATE emp SET emp_sal = 50000 WHERE emp_id =3;
    DELETE emp_city FROM emp WHERE emp_id = 2;
APPLY BATCH;

Cassandra集合数据类型

集合数据类型:list、set、map

list

-- 创建
CREATE TABLE data(name text PRIMARY KEY, email list<text>);
-- 插入数据
INSERT INTO data(name, email) VALUES ('ramu', ['abc@gmail.com','cba@yahoo.com'])
-- 更新数据
UPDATE data
SET email = email +['xyz@tutorialspoint.com']
where name = 'ramu';

set

-- 创建
CREATE TABLE data2 (name text PRIMARY KEY, phone set<varint>);
-- 插入数据
INSERT INTO data2(name, phone)VALUES ('rahman', {9848022338,9848022339});
-- 更新数据
UPDATE data2
SET phone = phone + {9848022330}
where name = 'rahman';

map

-- 创建
CREATE TABLE data3 (name text PRIMARY KEY, address map<timestamp, text>);
-- 插入数据
INSERT INTO data3 (name, address)
VALUES ('robin', {'home' : 'hyderabad' , 'office' : 'Delhi' } );
-- 更新数据
UPDATE data3
SET address = address+{'office':'mumbai'}
WHERE name = 'robin';

Cassandra自定义数据类型

-- 格式
CREATE TYPE <keyspace-name>.<data-typename> (variable1, variable2);
-- 示例
CREATE TYPE tutorialspoint.card_details (
  num int,
  pin int,
  name text,
  cvv int,
  phone set<int>
);
-- 修改type
ALTER TYPE typename
ADD field_name field_type;
-- 查看类型
describe type card_details;
-- 删除
drop type card;

describe

describe keyspece|table|type keyspaceName;

发表评论