1、NoSQL数据库原理第6章 Cassandra原理和使用 2 Cassandra的特点l ASF旗下开源软件,目前由Datastax公司(为主)进行维护l 环形对等架构,没有主节点的概念,也没有主节点失效的问题l 借鉴了亚马逊的Dynamo系统,在一致性模型等技术上有自己的特点,(在一些细节上存在差异)。Amazon公司的论文“Dynamo:Amazons Highly Available Key-value Store”,介绍了其研发的Dynamo分布式数据存储系统的一些关键问题。l 底层仍是键值对结构l 提供CQL语言,类似于SQL语言,简单易用第6章 Cassandra原理和使用6.1
2、概述 3 Dynamo是一个基于点对点模式的分布式键值对存储系统。l 节点对称。各个节点的角色、权重基本相同,简化整个集群系统的配置和维护。l 去中心化。在对称的基础上,避免通过主节点对集群进行集中控制。l 水平扩展性。以主机为单位实现横向扩展,扩展方式较简单,扩展对集群整体的影响较小。l 支持异构设备。支持异构设备指在扩展节点时,可以使用和原节点配置不同(如性能更高)的主机,即集群中可以存在多种配置的主机。l 采用多副本数据机制,但强调弱一致性和高可用性,即CAP理论中的AP。实际上Dynamo和Cassandra中的一致性和可用性权重是可以根据用户策略调整的。l 采用基于键值对和列族等概念
3、的数据模式。第6章 Cassandra原理和使用6.2 Cassandra的技术原理 4 6.2.1 Amazon Dynamo 1基于一致性哈希算法(或分布式哈希,DHT)的拓扑划分 用0n(例如0-255)的数字形成一个环,每个数字是环上的一个“地址”l 0255,即地址空间是256个。Dynamo实际地址空间为2的128次方。l 节点的地址,但并不是所有地址都对应有实际的节点。新节点加入、旧节点退出不影响其他节点的地址和分布l 数据(哈希后)也映射到0n的数值上。每个节点负责一定的区域,根据数据映射的数值,对应到相应节点,并由节点负责该数据的写入和存储、查询和管理等。l 虚拟节点的概念
4、每个节点根据能力不同,分为多个虚拟节点(即占用多个地址)。节点数量变多,更容易均匀分布。可以根据物理节点的能力不同,分成不同数量的虚拟节点。第6章 Cassandra原理和使用6.2 Cassandra的技术原理 5 6.2.1 Amazon Dynamo 2数据多副本 每个节点处理存储映射到自身负责区域的数据,还需要将这些数据存储到N-1个后继节点中。l 通过首选列表确定节点存储在不同的物理节点l 节点增减时,会影响节点的存储范围,但只会影响相邻节点 3数据读写和一致性 Dynamo中的任何节点都可以接收客户端对key的任意读写操作,并将数据最终转发存储到协调器节点,读写请求则通过HTTP实
5、现第6章 Cassandra原理和使用6.2 Cassandra的技术原理 6 6.2.1 Amazon Dynamo 4数据一致性 用户可以在(读)写完部分副本(设为R或W)而非全部N个副本时,就返回写入成功l 出现部分节点故障时,提高系统可用性 R、W、N可由用户配置l R、W为1,可用性最强,一致性最差l R、W为N,可用性最差,一致性最强l 在一致性要求高时,推荐R+WN,而实时性要求高时,则R+W sstable)l Commitlog(即HBase的WAL)l 基于时间戳区分数据版本l Sstable(类似HBase的storefile)使用了布隆过滤器l 二层机架感知策略 理论上
6、Cassandra集群可以跨数据中心部署第6章 Cassandra原理和使用6.2 Cassandra的技术原理 20 6.3.1 单节点部署Cassandra Cassandra可以部署在Windows或Linux集群上 需要适合的Java运行环境(推荐Java8版本)和网络环境(IP地址、主机名、防火墙规则等)l 9042(默认的CQL本地服务端口)、9160(默认的Cassandra服务端口)、7000(Cassand集群内节点间通信端口)、7199(Cassandra JMX 监控端口)等端口 在Centos上可以采用“yum”命令在线安装最新稳定版本第6章 Cassandra原理和使
7、用6.3 Cassandra部署与配置 21 6.3.1 单节点部署Cassandra Centos上的在线安装方法 编辑/etc/yum.repos.d/cassandra.repo”l cassandral name=Apache Cassandral baseurl=https:/www.apache.org/dist/cassandra/redhat/311x/l gpgcheck=1l repo_gpgcheck=1l gpgkey=https:/www.apache.org/dist/cassandra/KEYS执行:l yum-y install Cassandra第6章 Cas
8、sandra原理和使用6.3 Cassandra部署与配置也可以在官网直接下载软件包解压并进行后续配置,但此时程序的启动方式和相关路径与yum安装时有所不同 22 6.3.2 Cassandra的配置文件 前文“Yum”安装后的/etc/Cassandra/conf目录,或直接解压软件包,得到conf目录,存放各类配置文件l 重要的配置文件为cassandra.yaml第6章 Cassandra原理和使用6.3 Cassandra部署与配置cassandra.yaml 23 6.3.2 Cassandra的配置文件 cassandra.yamll cluster_name:Test Clust
9、erl num_tokens:256l partitioner:org.apache.cassandra.dht.Murmur3Partitionerl hinted_handoff_enabled:truel data_file_directories:/var/lib/cassandra/datal commitlog_directory:/var/lib/cassandra/commitlogl hints_directory:/var/lib/cassandra/hintsl saved_caches_directory:/var/lib/cassandra/saved_cachesl
10、 listen_address:,表示当前节点的监听地址(本节点地址)第6章 Cassandra原理和使用6.3 Cassandra部署与配置 24 6.3.2 Cassandra的配置文件 cassandra.yamll seed_provider:l -class_name:org.apache.cassandra.locator.SimpleSeedProviderl parameters:l#seeds is actually a comma-delimited list of addresses.l#Ex:,l -seeds:192.168.209.180l 表示配置种子节点的生成规
11、则(上述为默认规则)和编辑种子节点的列表,根据注释提示,多个种子列表之间以逗号分割,列表整体用双括号包括。配置文件cassandra-env.sh包含了对脚本环境变量的配置,作用类似于前文提到的hadoop-env.sh或hbase-env.sh。第6章 Cassandra原理和使用6.3 Cassandra部署与配置 25 6.3.3 Cassandra集群部署 前提l 确认各个节点之间的网络互通。l 在各个节点上安装相同版本的Cassandra软件。l 在各个节点的cassandra.yaml中进行如下配置。配置项:l cluster_name:各个节点的集群名称必须是相同的。l-seed
12、s:在各个节点上配置一系列相同的种子节点,各个节点上的种子节点列表可以是不同的。在已经存在的Cassandra集群中加入新节点,配置过程也是一样的第6章 Cassandra原理和使用6.3 Cassandra部署与配置 26 6.3.4 集群启动 在CentOS 7上使用yum方式安装,可以参考如下命令。重新加载系统守护程序:systemctl daemon-reload 启动Cassandra:systemctl start Cassandra 如果需要重新启动Cassandra:systemctl restart Cassandra 如果希望Cassandra随系统自动启动,则可运行:sy
13、stemctl enable cassandra 执行启动命令后,可以通过下列命令查看运行效果:l nodetoolinfol nodetool status第6章 Cassandra原理和使用6.3 Cassandra部署与配置 27 6.3.4 集群启动第6章 Cassandra原理和使用6.3 Cassandra部署与配置 28 6.4.1 cqlsh环境简介 CQL(CassandraQuery language)CQL的shell环境:cqlsh Cassandra提供了“SQL”语言支持,即相应的命令行环境,以适应传统数据库操作者的习惯l 但受限于底层数据结构,无法真正实现对SQL
14、语言的支持,只是“like SQL”第6章 Cassandra原理和使用6.4 CQL语言与cqlsh环境不支持批量写入(包括insert、update或delete)。不支持join查询。不支持事务、锁等机制。不支持 group by、having、max、min、sum、distinct 等分组聚合查询语法。条件查询时的限制较多。296.4.1 cqlsh环境简介CQL的shell环境:cqlsh进入shell环境:l cqlsh 从cqlsh shell环境中退出:l exit在shell环境中查看CQL所支持的所有功能:l Help查看版本信息(cqlsh、Cassandra和CQL等
15、的版本):l show version;描述集群信息(集群的名称和所使用的环地址分区算法):l describe cluster;查看键空间列表(类似于查看数据库列表):l desc keyspaces;清空之前屏幕显示的信息,执行:l Clear;第6章 Cassandra原理和使用6.4 CQL语言与cqlsh环境 30 6.4.1 cqlsh环境简介第6章 Cassandra原理和使用6.4 CQL语言与cqlsh环境常见的CQL命令列表 31 6.4.1 cqlsh环境简介 可以将多条CQL语句保存成文本文件(.cql文件)。.cql文件可以在系统命令行中被执行:l cqlsh-fil
16、e file_name 并在cqlsh环境中利用SOURCE命令执行:l SOURCE file_name第6章 Cassandra原理和使用6.4 CQL语言与cqlsh环境 32 6.4.2 键空间管理 类似于关系型数据库中“数据库”的概念l 系统键空间system_schema:存储集群状态和配置信息等 键空间的基本属性l 名称、副本复制策略和复制因子 创建键空间(名称为ks1)的基本语句l CREATE KEYSPACE ks1 WITH REPLICATION=class:SimpleStrategy,:1;l SimpleStrategy即为为副本复制策略,即在单数据中心情况下的“
17、顺时针复制”策略;l 复制因子(replication_factor)设置为1第6章 Cassandra原理和使用6.4 CQL语言与cqlsh环境 33 6.4.2 键空间管理 创建键空间(名称为ks1)的详细语句l CREATE KEYSPACE ks1 WITH REPLICATION=class:NetworkTopologyStrategy,dc1:3,dc2:2 AND DURABLE_WRITES=false;副本复制策略“NetworkTopologyStrategy”,即可以跨数据中心的二级机架感知策略,此时还需要配置l,:,:l 分别指示每个数据中心的数据副本数量 Dura
18、ble_writes:是否使用预写日志,跨数据中心时,可以关闭,降低数据传输量第6章 Cassandra原理和使用6.4 CQL语言与cqlsh环境 34 6.4.2 键空间管理 删除键空间l drop keyspace ks1;查看键空间列表l describe keyspaces;描述特定的键空间信息l describe keyspace;使用/切换键空间l use;修改键空间属性(修改复制因子数量)l ALTER KEYSPACE ks1 WITH REPLICATION=class:SimpleStrategy,replication_factor:2;l 键空间必须是已经存在的第6章
19、 Cassandra原理和使用6.4 CQL语言与cqlsh环境 35 6.4.3 数据表管理 切换键空间:use ks1;查看ks1键空间中的所有表:desc tables;l 或者在系统键空间(system_schema)下,执行:SELECT*FROM system_schema.tables WHERE keyspace_name=ks1;建立一个示例表:l CREATE TABLE address(name text PRIMARY KEY,phone list);l 或:CREATE TABLE address(name text,phone list,PRIMARY KEY(na
20、me);l name为主键(底层为行键),类型为字符串(text)l Phone为一个字符串的list列表类型第6章 Cassandra原理和使用6.4 CQL语言与cqlsh环境 36 6.4.3 数据表管理 使用复合型主键建表:l CREATE TABLE address_2(name text,No int,phone list,PRIMARY KEY(name,No);分区和分区键(partition key):l 分区是指对大数据表进行横向分割(即HBase中的Region),分区的依据则是分区键的散列值,具有相同分区键的数据将存储在同一个数据分区l 分区键是复合主键(的一部分),分
21、区键也可以指定为复合列。l CREATE TABLE address_3(firstname text,lastname text,No int,phone list,PRIMARY KEY(firstname,lastname),No);l firstname、lastname和No作为复合主键,且firstname、lastname作为复合的分区键,No为分簇键。第6章 Cassandra原理和使用6.4 CQL语言与cqlsh环境 37 6.4.3 数据表管理 复合主键的其他部分为分簇键(列)。l 分簇列是主键的一部分,但不作为分区依据,只作为分区之内(或节点之内)的排序依据,分簇列在全
22、局上是无序的。在采用复合主键时,还可以采用下列语句定义分簇列(Clustering Key):l CREATE TABLE address_4(name text,No int,phone list,PRIMARY KEY(name,No)WITH CLUSTERING ORDER BY(No DESC);l DESC表示在一个分区内,按No列降序排列 在理论上主键、分区键和分簇键等都属于行键(key)的一部分。第6章 Cassandra原理和使用6.4 CQL语言与cqlsh环境 38 6.4.3 数据表管理 查看表结构(address为表名):desctable address;修改表结构
23、l 添加一列:ALTER TABLE address ADD age int;l 修改布隆过滤器误报率:ALTER TABLE addresswithbloom_filter_fp_chance=0.01 删除数据并重建表(address为表名)l TRUNCATE address;第6章 Cassandra原理和使用6.4 CQL语言与cqlsh环境 39 6.4.4 CQL的数据类型 1原生类型:字符串、整型、浮点型等(1)字符串l ascii:ASCII格式字符串l text/varchar:UTF8编码字符串(2)整型l tinyint:8位有符号长整型l smallint:16位有符
24、号长整型l int:32位有符号长整型l bigint:64位有符号长整型l varint:任意精度整数整型(3)浮点型l decimal:可变精度十进制l float:32位浮点(IEEE-754二进位浮点数算术标准)l double:64位浮点(IEEE-754二进位浮点数算术标准)第6章 Cassandra原理和使用6.4 CQL语言与cqlsh环境 40 6.4.4 CQL的数据类型(4)时间型l date:日期(没有相应的时间值)格式为:yyyy-mm-ddl time:毫秒精度的时间(没有相应的日期值)。一般格式为:HH:MM:SS.fff,.fff为毫秒数,在赋值时为可选值l t
25、imestamp:时间戳(日期和时间),精度为毫秒。l timeuuid:基于时间的UUIDl duration:持续时间,使用ISO8601格式:类似于1y2mo3d1h30m15s100ms形式,l Cassandra无法完全保证duration格式数据的意义,因而产生排序困难。例如,可能无法得知1mo和29d哪个更大,甚至也无法判断1d和24h的大小,因此duration不能在表的主键中使用。第6章 Cassandra原理和使用6.4 CQL语言与cqlsh环境 41 6.4.4 CQL的数据类型(5)其他类型l blob:任意字节数组l boolean:true或falsel coun
26、ter:计数器l inet:IP地址,支持IPv4(4字节长)或IPv6(16字节长)l uuid:长度为128位的UUID,一般采用TYPE4,即基于随机数生成UUID。第6章 Cassandra原理和使用6.4 CQL语言与cqlsh环境UUID标准存在多种版本:基于时间的 Type1;DCE 安全 Type2;基于名称的 Type3;随机生成的 Type4;42 6.4.4 CQL的数据类型(1)Map(键值对集合)l Map中的键是唯一的。建立键空间语句中的replication参数就是Map类型。l 内容形式为:mapl 声明方式为:tags map,表示tags是一系列键值对的集合
27、,其中键和值都是text类型。l Map支持根据键更新或删除元素。(2)Set(唯一值集合)l 内容形式为:set l 声明方式为:tags set,表示tags是一个text类型的集合。(3)List(是非唯一值的顺序集合)l 内容形式为:listl 声明方式为:tags list,表示tags是一个text类型的列表,指明一个列表中的位置,即可操作执行元素。第6章 Cassandra原理和使用6.4 CQL语言与cqlsh环境 436.4.4 CQL的数据类型(4)Frozen(集合的序列化)l 将前述集合型元素进行序列化。在没有进行Frozen限定时,集合类型均可以对内部的单个元素进行操
28、作,但Frozen限定后,就只能对整体进行操作。3用户自定义类型:l CREATE TYPE scores(subject text,score int);l 用户可以修改自定义类型(比如增加元素),删除未被使用的自定义类型4元组类型l 元组(tuple)类型可以看作是另一种用户自定义类型。例如在建表语句中使用如下元组类型:l CREATE TABLE ks1.testtable1(l col1 text,l col2 int,l col3 tuple,l PRIMARY KEY(col1,col2)l)l 其中,col3列被定义为一个元组类型,其中包含两个元素,类型均为text。和UDT不同
29、,元组不会定义各个元素的名字。第6章 Cassandra原理和使用6.4 CQL语言与cqlsh环境 44 6.5.1 基本数据查询 SELECT语句:l SELECT column_list FROM keyspace_name.table_nameWHERE prinmary_key_conditions AND clustering_columns_conditions|PRIMARY KEY LIMIT 基本查询:SELECT*from ks1.testtable1;PERPARTITION LIMIT子句:限制返回元素 使用oder by和groupby子句来控制返回结果的顺序和分组
30、,但所涉及的列必须为主键列l 和底层的键值对结构相对应 SELECT*from ks1.address_3 where firstname in(apple,banana,cherry)AND lastname in(apple,banana,cherry)order by no DESC PERPARTITION limit 10;第6章 Cassandra原理和使用6.5 CQL数据查询 45 6.5.1 基本数据查询 分页显示:PAGING ON|OFF 显示效果折叠:expand on;将返回结果显示为JSON形式:l SELECT json*from ks1.address _3;聚
31、合查询l Count():计数。l Max()和Min():求最大和最小值。l Sum():求和。l Avg():求平均值。例如:l SELECT COUNT(*)FROM testtable1;l SELECT sum(col2)FROM testtable1;第6章 Cassandra原理和使用6.5 CQL数据查询 466.5.2 条件查询利用WHERE子句可以在SELECT、UPDATE或DELETE语句中设置限定条件,但只针对主键。此外对于分区列、分簇列,其限制条件并不一样。l 对于分区列,可以使用等于(=)、范围比较(、=)和存在(IN)三种条件。l 对分簇列进行条件限制,则必须先
32、对该分簇列之前的主键列(分区列或分簇列)使用等于(=)或存在(IN)条件,最后一个分簇列只支持等于(=)和范围比较(=、=),不支持存在(IN)条件。l 如果不符合上述语句的条件查询顺序,Cassandra可能会报错,并中止语句运行。l 如果分区列有多个,而where条件中只涉及部分分区列,Cassandra也会报同样的错误。l 可以通过ALLOW FILTERING 子句关闭一些限制第6章 Cassandra原理和使用6.5 CQL数据查询 47 6.5.2 条件查询 理解分区键和分簇键的排序规则l TABLE test(l key int,l col1 int,l col2 int,l c
33、ol3 int,l col4 int,l PRIMARY KEY(key),col1,col2,col3,col4)l);第6章 Cassandra原理和使用6.5 CQL数据查询 key|col1|col2|col 3|col4-+-+-+-+-100|1|1|1|1 100|1|1|1|2 100|1|1|1|3 100|1|1|2|1 100|1|1|2|2 100|1|1|2|3 100|1|2|2|1 100|1|2|2|2 100|1|2|2|3 100|2|1|1|1 100|2|1|1|2 100|2|1|1|3 100|2|1|2|1 100|2|1|2|2 100|2|1|
34、2|3 100|2|2|2|1 100|2|2|2|2 100|2|2|2|3 48 6.5.2 条件查询 为了避免条件查询时进行大范围扫描而引起的性能瓶颈,Cassandra会要求依次对key、col1、col2和col3使用等于、范围或存在(IN)条件中的一种,col4则只允许使用等于或范围条件。例如:l SELECT*FROM test WHERE key=100 AND col1 IN(1,2)AND col2=1 AND col3=1 AND col4=(1,2)AND(col3,col4)=(1,1,2)AND(col_3,col_4)(2,3);因为切片上下限所用的列是不一致的。
35、第6章 Cassandra原理和使用6.5 CQL数据查询 50 6.5.3 索引机制 Cassandra可以对数据表建立一个或多个二级索引。这些索引可以使用在普通列、集合列等场景,但不能应用在计数器列。这些列索引信息会维护在一个隐藏表中。对没有建立索引的非主键列进行条件查询,系统会报错“执行效率无法预测”解决方案1:l select*from address where age=1 ALLOW FILTERING;l 可以屏蔽报错,但执行效率可能确实很低 解决方案2:建立索引的语句l CREATE INDEX indexofaddress ON address(age);第6章 Cassan
36、dra原理和使用6.5 CQL数据查询 51 6.5.3 索引机制 删除索引(indexofaddress):drop index indexofaddress;一般情况下,索引会在后台自动维护,维护时不会阻塞读写操作。如果需要手动维护索引,可以在命令行下使用命令:l nodetool rebuild_index 手动维护索引(indexofaddress),可以执行:l nodetool rebuild_index ks1 adressindexofadress 关于该指令的详细参数可用下面语句查询:nodetool help rebuild_index 注意nodetool命令不是在cql
37、sh环境中运行的,而是在操作系统的命令行环境中执行。第6章 Cassandra原理和使用6.5 CQL数据查询 52 6.5.4 使用标量函数 CAST显示格式转换:SELECT cast(col2 as text)from ks1.testtable;writetime(column_name):返回结果的写入时间(毫秒级时间戳)l SELECT WRITETIME(col2)from ks1.testtable;l 注意该语句无法用于任何主键列,因为行键并没有单独的时间戳。TOKEN(column_name):根据列值计算哈希地址l SELECT token(col2)from ks1.t
38、esttable1;TTL(column_name):显示该列的生存期,仅针对键值对中的值(列),因此对于主键列无法使用。uuid():无参数,用来在INSERT和UPDATE语句中生成uuid。第6章 Cassandra原理和使用6.5 CQL数据查询 53 6.6.1 插入、更新和删除 数据插入l INSERT INTO keyspace_name.table_name(column_list)l VALUES(column_values)l IF NOT EXISTS l USING TTL seconds|TIMESTAMP epoch_in_microseconds;text类型变量
39、需要用单引号包括,Tuple类型需要用小括号包括其元素集合,各个元素之间用逗号隔开l insert into ks1.testtable1(col1,col2,col3)values(some text,1,(the key,the value);如果对相同主键的行进行重复插入,则后插入的值会覆盖之前的值。第6章 Cassandra原理和使用6.6 CQL数据更新 54 6.6.1 插入、更新和删除 数据更新l UPDATE keyspace_name.table_namel USING TTL time_value|USING TIMESTAMP timestamp_valuel SET a
40、ssignment,assignment,.l WHERE row_specificationl IF EXISTS|IF condition AND condition;示例如下:l update ks1.testtable1 set col3=(new key,new value)where col1=some text and col2=1;第6章 Cassandra原理和使用6.6 CQL数据更新 55 6.6.1 插入、更新和删除 数据更新 pdate语句不能更新主键,即col1和col2不能被更新,因为主键列在底层数据结构中作为行键存储,如果更改行键,则需要遍历所有相关键值对,并进
41、行更新,这相当于进行了数据查找、数据删除和新行插入,开销可能很大。update的where条件必须为全部主键的限定条件,这是为了能够直接找到完整的行键(限定条件),再更新相应的值。如果需要对非主键进行条件限定,则需要采用IF子句进行限定,例如:l update ks1.testtable1 set col3=(new key 2,new value 2)where col1=some text and col2=1 IFcol3=(new key,new value);第6章 Cassandra原理和使用6.6 CQL数据更新 56 6.6.1 插入、更新和删除 数据更新 下面的例子采用了IF
42、 EXISTS条件,即存在符合条件的记录时,才进行更新:l update ks1.testtable1 set col3=(new key 2,new value 2)where col1=some text and col2=1 IF EXISTS;数据删除l DELETE column_name(term),.FROM keyspace_name.table_name USING TIMESTAMP timestamp_value WHERE PK_column_conditions IF EXISTS|IF static_column_conditions;第6章 Cassandra原理
43、和使用6.6 CQL数据更新 57 6.6.1 插入、更新和删除 数据删除 基本操作示例如下:l delete col3 from ks1.testtable1 where col1=some text and col2=1;l delete from ks1.testtable1 where col1=other text and col2=10;语句对where条件的要求和update中一致。由于Cassandra数据的每一个逻辑行由多个键值对构成,因此在删除时,既可以选择删除一个逻辑行,也可以选择只删除该行中的某几个键值对。此时该行还有其他数据存在,被删除单元会显示为null。第6章 C
44、assandra原理和使用6.6 CQL数据更新 58 6.6.1 插入、更新和删除 插入JSONl insert into ks1.testtable1 json col1:json text 2,col2:2000,col3:1,2;l 不涉及的列会自动赋值为null INSERT和UPDATE语句中可以加入一些可选条件:l USING TTL seconds规定了该条目数据的存活时间(seconds),到达时间后,该条目被自动设置为删除状态,该数据默认为0,即永远存活。l TIMESTAMP规定是否采用指定时间戳(epoch_in_microseconds)作为新数据的时间戳,如果不指定
45、,则系统自动将写入时间作为新数据的时间戳。第6章 Cassandra原理和使用6.6 CQL数据更新 596.6.1 插入、更新和删除批处理是指同时执行一系列数据更改操作,这样有助于减少客户端和服务器之间的网络交互。主要用于INSERT、UPDATE和DELETE等操作。语法如下所示:l BEGIN BATCH USING TIMESTAMP epoch_microsecondsl INSERT USING TIMESTAMP epoch_microsecondsl UPDATE l DELETE l APPLY BATCH;USING TIMESTAMP epoch_microseconds
46、是一个可选项,将所有数据操作的时间戳设置为指定内容(微秒时间戳,形式如1481124356754405),如果不填写此项,则被更新数据的时间戳为实际写入时间。第6章 Cassandra原理和使用6.6 CQL数据更新 60 6.6.2 读写一致性第6章 Cassandra原理和使用6.6 CQL数据更新等级等级描述描述一致性一致性可用性可用性ALL必须成功读写数据的所有副本必须成功读写数据的所有副本最高最高最低最低EACH_QUORUM在所有数据中心,执行在所有数据中心,执行QUORUM策略策略(针对写操作)(针对写操作)QUORUM在多副本中,成功读写半数以上的副本即判定操作成功,例如如在多
47、副本中,成功读写半数以上的副本即判定操作成功,例如如果数据有三个副本,则读取其中两个果数据有三个副本,则读取其中两个LOCAL_QUORUM局限在当前(节点所在的)数据中心,执行局限在当前(节点所在的)数据中心,执行QUORUM策略。避免策略。避免跨数据中心通信跨数据中心通信ONE/TWO/THREE有有1(或(或2、3)个节点(副本)操作成功,则判定操作成功,读)个节点(副本)操作成功,则判定操作成功,读取时表示在多个数据副本中,只读取取时表示在多个数据副本中,只读取1(或(或2、3)个副本)个副本ONE时时最低最低(READ)ONE时时最高最高(READ)LOCAL_ONE局限在当前(节点
48、所在的)数据中心,执行局限在当前(节点所在的)数据中心,执行ONE策略。避免跨数策略。避免跨数据中心通信据中心通信ANY确保一个副本被写入成功,或者暗示移交数据被成功存储,仅在确保一个副本被写入成功,或者暗示移交数据被成功存储,仅在写操作中使用写操作中使用最低最低(WRITE)最高最高(WRITE)SERIAL仅在读取中使用,系统会返回尚未提交的最新数据。当采用该设仅在读取中使用,系统会返回尚未提交的最新数据。当采用该设置时,将无法在置时,将无法在UPDATE和和INSERT语句中使用语句中使用IFNOTEXISTS或或IFEXISTS子句子句LOCAL_SERIAL仅在读取中使用,系统会返回
49、尚未提交的最新数据,但只返回当仅在读取中使用,系统会返回尚未提交的最新数据,但只返回当前数据中心的数据前数据中心的数据 61 6.6.2 读写一致性 当设置一致性等级为ONE时,实际是选择了CAP理论中的AP,即强调分布式数据的可用性(查询效率);当设置一致性等级为ALL时,则是选择了CP,即强调数据的强(读取)一致性。也就是说,Cassandra将权衡可用性与一致性的决定权交给了用户。查看当前一致性设置,在cqlsh中执行:l CONSISTENCY;将当前环境的读写一致性设置为所需等级,执行:l CONSISTENCY ONE|quorum|ALL|;之后cqlsh中执行的语句都将遵循该设
50、置。第6章 Cassandra原理和使用6.6 CQL数据更新 62 6.6.2 读写一致性 IF(子句)轻量级事务:在满足某个条件时执行更新语句(INSERT、UPDATE或DELETE),这可以看作是一种轻量级事务,或称为Compare and Set CAS。l insert into ks1.testtable1(col1,col2,col3)values(some text,1,(another key,another value)IF NOT EXISTS;l where条件可以使用=、=、!=和IN等运算符。l 注意,在INSERT语句中使用IF NOT EXISTS条件时,不能