Cassandra分布式数据库
分类:分布式数据库
标签:分布式键空间集合数据类型cassandra列族Gossip协议数据库分布式数据库cql
Cassandra分布式架构
Cassandra在其节点之间具有对等分布式系统,并且数据分布在集群中的所有节点之间。集群中的每个节点都可以接受读取和写入请求,无论数据实际位于集群中的何处。
在Cassandra中,集群中的一个或多个节点充当给定数据片段的副本。如果检测到一些节点以过期值响应,Cassandra将向客户端返回最近的值。返回最新的值后,Cassandra在后台执行读修复以更新失效值。
Cassandra在后台使用Gossip协议,允许节点相互通信并检测集群中的任何故障节点。
Gossip协议主要用在分布式数据库系统中各个副本节点同步数据之用,这种场景的一个最大特点就是组成的网络的节点都是对等节点,是非结构化网络 :
- Gossip 是周期性的散播消息,把周期限定为 1 秒
- 被感染节点随机选择 k 个邻接节点(fan-out)散播消息,这里把 fan-out 设置为 3,每次最多往 3 个节点散播。
- 每次散播消息都选择尚未发送过的节点进行散播
- 收到消息的节点不再往发送节点散播,比如 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;
分类:分布式数据库
标签:分布式键空间集合数据类型cassandra列族Gossip协议数据库分布式数据库cql