SuperScylla 时空数据库 白皮书 - superengine.com.cn ·...

39
SuperScylla 时空数据库 白皮书 苏州超擎图形软件科技发展有限公司 2019 年 8 月

Transcript of SuperScylla 时空数据库 白皮书 - superengine.com.cn ·...

Page 1: SuperScylla 时空数据库 白皮书 - superengine.com.cn · 修改geohash-level、写入性能部分、场景应用 1.0.3 2019.10.17 董 玉 军 修改场景应用部分及scylla卸载方式章节

SuperScylla 时空数据库

白皮书

苏州超擎图形软件科技发展有限公司

2019 年 8 月

Page 2: SuperScylla 时空数据库 白皮书 - superengine.com.cn · 修改geohash-level、写入性能部分、场景应用 1.0.3 2019.10.17 董 玉 军 修改场景应用部分及scylla卸载方式章节

       

修订人: 范振华 文档版本号: 1.0

职位: 基础平台组 文档版本日期: 2019年8月

审核人:   审核日期:  

版本号

修订时间修订人

审核人

批准人

修改内容

1.0.1 2019.09.21董玉军

    修改安装流程以及常见问题

1.0.2 2019.10.15董玉军

    修改geohash-level、写入性能部分、场景应用

1.0.3 2019.10.17董玉军

    修改场景应用部分及scylla卸载方式章节

1.0.4 2019.11.23董玉军

范振华

 增加空间查询函数box的使用、修改完善应用场景、增加超时设置指南

文档信息

文档版本履历

   

   

   

   

文档版权说明

本文档版权所有©(2004-2019),苏州超擎图形软件科技发展公司,保留一切权力。 警告,本文档包含的所有内容是苏州超擎图形软件科技发展公司的财产,受到著作权法和国际公约的保护。未得到本公司的书面许可,不能以任何方式(电子的或机械的,包括影印)翻印或转载本文档的任何部分。本文档并不代表供应商或其代理的承诺,苏州超擎图形软件科技发展公司可在不作任何申明的情况下对本文档内容进行修改。

   

   

   

Page 3: SuperScylla 时空数据库 白皮书 - superengine.com.cn · 修改geohash-level、写入性能部分、场景应用 1.0.3 2019.10.17 董 玉 军 修改场景应用部分及scylla卸载方式章节

1产品概述

1.1产品定位

        SuperScylla 是基于ScyllaDB,实现了空间数据支持的数据库。ScyllaDB是世界上最快的分布式数据库。

        SuperScylla 是一款面向时空动态数据的分布式NoSQL数据库,提供数据接入、数据管理、数据查询等数据管理基础能力。

        SuperScylla 作为一款数据库级别的产品,可广泛应用于物联网数据管理、轨迹数据管理、海量数据高并发写入等场景,尤其适合大量写入、统计和分析的场景。

1.2产品能力

1.2.1DBMS能力

        SuperScylla是一款NoSQL数据库产品,具有数据库的典型能力,包括:查询编译器、SQL执行引擎、日志恢复机制、索引管理器、存贮管理器等主要核心模块。

1.2.2分布式能力

        SuperScylla是一个款分布式的NoSQL数据库产品,采用P2P的环形网络,实现无Master的对等节点工作机制,很大程度上保证了集群的稳定性。

        SuperScylla 采用一致性哈希token值计算,实现数据的分片管理。通过多分片副本,实现集群性能提升、分区故障容错处理。

        SuperScylla 支持多数据中心的自动同步,云上跨数据中心查询等,是地理上分布的分布式数据库。

1.2.3良好的生态兼容

        SuperScylla兼容Cassandra的客户端驱动、数据管理工具,极大降低了已有系统迁移的难题,降低了DBA的工作难度。

        Cassandra具有成熟的生态应用,在大数据处理领域具有广泛应用。

        客户端驱动涵盖几乎所有主流语言,包括:C、C++、Java、C#、Go、Nodejs、Python、Rust、Ruby等多种语言。

        数据管理工具,可以采用Datastax系列的Data Studio产品,使用和维护通过图形化界面的方式,简单易用。

        众多ETL工具均支持Cassandra协议的驱动,如 Kettle。通过ETL工具,可轻松实现多源数据与SuperScylla之间的相互迁移。

1.2.4内置时空数据支持

        SuperScylla 扩展了Scylladb 的类型,支持 GeoPoint(x,y) 的存贮、索引、查询,扩展了丰富的空间查询函数,时间+空间查询函数等,降低了时空应用的门槛。

        时空轨迹数据作为SuperScylla的一等公民,充分与数据库引擎结合到一起,数据库的分区复制、组织排序、查询过滤、在线分析等过程,都有时空数据优化的工作。SuperScylla是处理海量时空数据的不二之选。

Page 4: SuperScylla 时空数据库 白皮书 - superengine.com.cn · 修改geohash-level、写入性能部分、场景应用 1.0.3 2019.10.17 董 玉 军 修改场景应用部分及scylla卸载方式章节

图1 scylla的操作系统用户态优化

图2 scylla的CAP领域

1.3技术架构

        SuperScylla 基于 SeaStar 异步框架,采用C++编写,可广泛工作在多种Linux发行版操作系统上。

        下图是 Scylladb 程序的核心架构,SeaStar 是绕过Linux系统API的内核态调度架构,对CPU绑定、线程独占内存池、网络栈复用等细节,做了大量提升性能的优化。

        SuperScylla作为分布式数据库,遵循CAP( Consistency, Availability, Partition Tolerance)原则,是典型的 AP 系统,Consistency 可根据需求配置不同的一致性级别。

        Scylladb 采用环状的P2P网络架构,每一条记录具有一个 Partition Key (PK),采用一致性hash算法,根据 PK 计算出 token值,根据 token值可计算出落在P2P环网中的那个机器节点。

Page 5: SuperScylla 时空数据库 白皮书 - superengine.com.cn · 修改geohash-level、写入性能部分、场景应用 1.0.3 2019.10.17 董 玉 军 修改场景应用部分及scylla卸载方式章节

图3 Scylla的分布式分区

1.4行业应用

        SuperScylla的应用行业非常广泛,可作为云计算的基础设施。典型应用有:

1.4.1活动的轨迹监控分析应用

        SuperScylla 的空间扩展支持,可处理海量的轨迹点数据,支持从空间、时间、属性等多个角度创建索引,实现海量数据接入并分析实时的轨迹数据。

1.4.2时序数据数据应用

        SuperScylla不仅只支持 GeoPoint数据,SuperScylla内置了丰富的数据类型,不仅有传统的 int、string、datetime等类型,还支持集合、UDT(用户定义类型),json 格式的写入写出也是在SQL级别支持。

        使用 SuperScylla 实现物联网、时序数据应用,你只要定义好表结构,其他都交给 SuperScylla 来处理即可。

1.4.3高可用的数据存贮应用

        SuperScylla 优秀的P2P分布式网络结构、多中心的数据自动同步复制机制,可保证你的数据资产万无一失。

1.4.4社交应用数据存贮应用

        社交数据的典型需求就是规模海量,快速增长,查询读取基本都是 key- value方式。

        FaceBook 为了解决社交数据存贮的问题,研发了Cassandra,而Scylladb是C++重写的Cassandra,SuperScylla是空间增强的Scylladb,因此 SuperScylla不仅能很好的处理社交数据,还能为社交数据插上空间处理的翅膀。

1.4.5推荐和个性化引擎应用

        SuperScylla天生的列存引擎,非常适合于大数据 + 多列数据类型。

       行为数据的列宽具有不确定性,每条记录都可能不同。传统数据库处理这种数据,会导致存贮成本极高、分析极慢。而SuperScylla的列存省去了空白字段的空间,在存贮、查询、分析都带来非常高的性能提升。

2产品优势

2.1高效写入能力

Page 6: SuperScylla 时空数据库 白皮书 - superengine.com.cn · 修改geohash-level、写入性能部分、场景应用 1.0.3 2019.10.17 董 玉 军 修改场景应用部分及scylla卸载方式章节

       SuperScylla 采用 LSM(Log-Structured Merge Tree)结构的存贮引擎,不像传统数据库使用的B+树,存储引擎以追加的方式顺序写入磁盘连续存储数据,写入是可以并发写入,不需要加锁,写入速度非常高。

       SuperScylla 采用高效的 SeaStar框架实现I/O调度、CPU调度、内存管理等核心功能,性能大大领先与同类数据库产品。综合测试对比结论,SuperScylla相比高效的Cassandra数据库具有10倍以上的写入性能优势。

2.2高可靠性

       SuperScylla 采用无中心的P2P分布式架构,不存在Master节点故障问题。

       SuperScylla 使用了许多容错机制,可以支持多个节点临时失效,不影响集群。

       SuperScylla 提供了多地域容灾的多数据中心方案,轻松实现数据的跨中心复制,保障数据的安全。

2.3高扩展性

       SuperScylla采用列存的存贮结构,更改表结构的成本非常低,适合海量数据动态扩展属性的场景。

       SuperScylla 扩展集群节点非常容易,只需要启动一台机器,加入到局域网中即可,数据会自动同步复制到新增的节点中。

       集群规模的动态伸缩可通过专业的工具-nodetools来管理集群,轻松简单。

2.4空间增强

       SuperScylla 是 Scylladb + 空间数据支持,基于Scylladb 的高性能,实现了高效的空间数据管理,是高性能时空数据的不二之选。

       SuperScylla 支持 geopoint(x,y) 类型的点数据,支持对 geopoint 字段建立索引、对geopoint 字段空间过滤、空间+时间+属性条件查询等。

       SuperScylla对动态轨迹数据,内置了强大的分析处理模型,是通过几条SQL就能用起来的大数据处理平台。

2.5云化能力

       SuperScylla可安装在流行的发行版本的Linux操作系统上,安装过程简单,依赖环境少,轻松上云服务。

       SuperScylla自带的API服务,可以允许你集成数据库操作到你的业务系统中,轻松实现在线数据资产管理,数据管理更加智能化。

       SuperScylla自带的 syslog 机制,可以对接到集中的日志处理平台,降低了数据库运维的工作。SuperScylla自带的Promethus监控方案,可以让你将实时监控轻松集成到各种报表系统中,来监视你的硬件消耗情况。

3功能介绍

3.1数据定义

3.1.1UDT(用户定义类型)

Page 7: SuperScylla 时空数据库 白皮书 - superengine.com.cn · 修改geohash-level、写入性能部分、场景应用 1.0.3 2019.10.17 董 玉 军 修改场景应用部分及scylla卸载方式章节

       SuperScylla支持用户创建自定的数据类型,通过create type/alter type/drop type语句来创建/修改/删除类型。一旦创建后,UDT将通过类型名称进行引用。

       UDT包括名称、具有命名和类型的字段组成,字段可以是任意类型,包括集合或其他UDT。        在SuperScylla使用geopoint类型,需要通过UDT实现,即在KeySpace里创建UDT的geopoint,详见4.4:UDT操作指南。

参考:https://docs.scylladb.com/getting-started/types/

3.1.2DDL(数据定义语言)

名称 类型 说明

replication map用于keyspace的副本策略和选项,必须指定。副本属性包括:1)class:指定副本策略,必须指定;2)其余选项如

replication_factor等

durable_writes Simple 设置是否使用Commit log来更新keyspace,默认true;

KEYSPACE

SuperScylla中KEYSPACE的概念等同于关系数据库的Database概念。通过KEYSPACE对数据管理,通过 create keyspace/alter keyspace/drop keyspace来实现创建/修改/删除keyspace,参数包括名称、配置选项option。

option包括:

TABLE

       SuperScylla支持创建/修改/删除表,通过create table/alter table/drop table来实现,参数包括名称、定义类型的列、主键列或主键列的组合,以及其他选项。

在表中使用geopoint类型,需要遵循系统内置的写法(frozen):

详见 4.6:建表语法详解。

       geopoint类型的列,需要设置为 Partition Key,才能进行空间查询,否则只能作为普通数值列。无法为geopoint类型创建Secondary Index和 Clustering Key,详见 3.3:索引管理。

       SuperScylla允许建表时候,指定geopoint数据的分块范围,用来处理不同密集程度的数据。通过cql语句:create table demo(id int, geo frozen) with geohash_level = x; x是整数,取值范围在 1-20。如果不指定 geohash_level,则geohash_level 默认值为 13;

       SuperScylla采用geohash索引,对数据进行空间划分,geohash_level越小,每块的范围越大,反之每块的范围越小。

评估你的数据范围,选择合适的 geohash_level 尤为重要。结合场景,我们推荐配置如下:         广场、建筑内的应用,如区域人员监控、定位等。推荐 geohash_level 设置为 18;

        城市级别的数据应用,如出租车轨迹。推荐 geohash_level 设置为 16;

        全国范围的应用,如火车、飞机等轨迹。推荐geohash_level设置为10;

下表为不同 geohash_level ,每个网格代表的地理范围,常用取值有 10 - 18;

create type geopoint(x double,y double);

create table demo(id int,name text,geo frozen<geopoint>);

Page 8: SuperScylla 时空数据库 白皮书 - superengine.com.cn · 修改geohash-level、写入性能部分、场景应用 1.0.3 2019.10.17 董 玉 军 修改场景应用部分及scylla卸载方式章节

geohash_level 地理范围

1 ≤ 19,962km

2 ≤ 9981km

3 ≤ 4990km

4 ≤ 2495km

5 ≤ 1247km

6 ≤ 623km

7 ≤ 311km

8 ≤ 156km

9 ≤ 78km

10 ≤ 40km

11 ≤ 20km

12 ≤ 9.7km

13 ≤ 4.9km

14 ≤ 2.4km

15 ≤ 1.2km

16 ≤ 609m

17 ≤ 305m

18 ≤ 152m

19 ≤ 76m

20 ≤ 38m

       参考:https://docs.scylladb.com/getting-started/ddl/#create-table-statement

3.1.3MATERIALIZED VIEW

       SuperScylla支持创建/修改/删除materialized视图,通过create materialized view/altermaterialized view/drop materialized view来实现。

       每个视图包含对应于select语句所查询表格的结果行。materialized视图无法直接被更新,但所查表格的更新会直接带动视图的更新。

       创建materialized视图包括3个主要部分:

              1)用于限定视图所包含数据的select语句;

              2)视图的主键定义;

              3)视图选项参数;

参考:https://docs.scylladb.com/getting-started/mv/

Page 9: SuperScylla 时空数据库 白皮书 - superengine.com.cn · 修改geohash-level、写入性能部分、场景应用 1.0.3 2019.10.17 董 玉 军 修改场景应用部分及scylla卸载方式章节

命令 功能

desc keyspaces; 列出当前所有keyspace

desc keyspace名称; 打印指定keyspace的schema信息

desc tables; 列出当前keyspace中所有table

desc table名称; 打印指定table的schema信息

3.1.4SECONDARY INDEX

       SuperScylla支持创建/删除二级索引,包括全局二级索引和局部二级索引(全局二级索引的增强版)。

       如果列中已存在数据,则将被异步索引。当索引创建后,新数据在插入的过程中会自动进行索引。

       二级索引是在create table 之后,以附加方式进行创建,通过维护一张 value - pk 的关系映射表,实现索引列数值的查询。

       由于Scylladb 的Primary Key只支持 = 、in 查询,因此二级索引也只支持 =、 in 两种查询方式。二级索引会导致写入性能降低,因此不要给数据创建太多二级索引。

参考:https://docs.scylladb.com/getting-started/secondary_indexes/

3.1.5SCHEMA

       SuperScylla支持通过desc命令来查看schema信息,包括keyspace、table。

3.2数据操作

3.2.1插入操作

       插入数据支持单条insert sql,也支持批量插入模式(Batch)。通过批量插入模式,加速数据写入。

       通过Cassandra客户端的BatchStatement来实现批量插入数据。

3.2.2查询操作

       支持基本函数、空间函数对table进行条件过滤,非主键字段需要配合Secondary index来实现。

查询条件支持:

       1)基本函数:等于、大于、小于、IN

       2)空间函数:intersects() 、contains() 、within() 、coverby() 、nearby()

查询函数支持:

       基本函数:count()、max() 、min() 、sum() 、avg()

       空间函数: distance()、as_wkt()、string()、as_geojson

 select * from geo_table where clause;

 select function(field) from geo_table;

Page 10: SuperScylla 时空数据库 白皮书 - superengine.com.cn · 修改geohash-level、写入性能部分、场景应用 1.0.3 2019.10.17 董 玉 军 修改场景应用部分及scylla卸载方式章节

       针对没有建索引的字段查询,SuperScylla需要进行全表扫描过滤,这种情况在海量数据时,响应时间可能是很长的。因此对于无法通过索引命中的查询,需要在 where 语句后面加上 ALLOW FILTERING语句,允许数据库通过扫表过滤数据。如:

3.2.3更新操作

       update操作的where条件仅支持primary key,且构成primary key的列必须要写全,这是因为update语句的执行过程需要从海量数据中快速定位到数据地址;此外,update的更新只能更新非主键字段。如:

备注:暂不支持geopoint类型的字段做Partition key时的更新操作

3.2.4删除操作

       同update语言,delete操作仅支持基于primary key的where语句。如:

备注:暂不支持geopoint类型的字段做Partition key时的删除操作

参考:https://docs.scylladb.com/getting-started/dml/

3.3索引管理

3.3.1索引类型

Primary Key:

       必须在create table时指定。

       Primary Key 由Partition Key 和 Clustering Key组成, Partition Key决定了数据的分区机制,Clustering Key列可以支持范围过滤查询。

       支持以下几种模式:

              primary key(id):单列partition key,只能=、in条件查询;

              primary key(id, time):单列partition key、单列clustering key,time是clustering key,time列可以范围查询。               primary key((id,age), time):组合列partition key、单列clustering key,(id,age)为partition key,time 为 clustering key;

              primary key(id, age, time):单列partition key、多列clustering key,id为 partition key,(age, time)为clustering key;

Secondary Index

       二级索引支持非primary key列的查询,仅支持等于、in 查询。建议列值控制在一定个数范围内,否则索引意义不大。

       二级索引通过 create index on table 语句创建,语法详见4.7:索引指南。

       分布式数据库,需要用户根据自己的场景,设计合理的schema,以达到最高性能。

 select * from table where b > 1 allow filtering(b是普通列)

 update table set b = 2 where a = 1 (a是pk列,b是普通列)

 delete from table where a = 1 (a是pk列)

Page 11: SuperScylla 时空数据库 白皮书 - superengine.com.cn · 修改geohash-level、写入性能部分、场景应用 1.0.3 2019.10.17 董 玉 军 修改场景应用部分及scylla卸载方式章节

       Partition Key应当选择列值不多、能区分出业务单元的字段。例如用城市名称来做partition key,将不同城市数据放到不同分区,提高数据库性能。

       Clustering Key用来满足需要范围过滤的字段,如数值类型、时间类型等字段,Clustering key必须建表时候指定,不能后期变更。

       Secondary Index用来做辅助索引,仅支持 =、in 查询,适合 key=value类型的场景,value的可能数值量尽量少。

3.4集群工作

3.4.1集群架构

       SuperScylla采用分布式、可扩展的设计理念。一个SuperScylla集群包含多个节点或SuperScylla实例,以环形展示。所有节点在shared-nothing模式下应该保持一致。

       SuperScylla还实现了面向Vnode的架构。一个虚拟节点表示了所属于单个节点的相邻token范围,一个物理节点可以配置多个非相邻的虚拟节点。

3.4.2工作方式

       Keyspace的副本策略定义了如何在节点上复制数据,例如replication_factor定义了给定的token或token范围将存储在2个节点上(或复制在一个附加节点上)。

       在table的定义中,主键子句至少指定一个列partition key,还可以指定clustering key列。主键唯一标识表中的每个partition/row的组合,而clustering key指示数据(行)如何在给定partition内排序。

       Row是用于与主键相关联的列的容器。主键代表了从表中获取数据所需的一个或多个列。

       token是一个范围值,用于标识节点和分区, partition key是分区的唯一标识符,表示为由主键哈希处理得到的token值。如下图,一个3节点的集群划分了0-1200的token范围。

       partition key是查找组成分区的row集合的主要方式,用于标识集群中存储给定分区的节点,同时用于将数据分布到集群的节点中。partition key默认使用murmur3哈希函数来决定数据在集群中所存储的节点 。

Page 12: SuperScylla 时空数据库 白皮书 - superengine.com.cn · 修改geohash-level、写入性能部分、场景应用 1.0.3 2019.10.17 董 玉 军 修改场景应用部分及scylla卸载方式章节

参考:https://docs.scylladb.com/architecture/ringarchitecture/

4使用指南

4.1安装部署

4.1.1机器环境

       操作系统:centos7.3 (x86_64)

       内存:16G以上,CPU数量X 2

       CPU数:8核以上

       存储空间:500G以上,固态硬盘(否则无法发挥SuperScylla的高性能)

       集群节点:3台以上服务器、万兆网络

4.1.2安装流程

       1.将SuperScylla软件安装包superscylla.tar.gz拷贝到/root/目录下

       2.将superscylla.tar.gz解压,解压后进入目录

       3.运行install_scylla.sh脚本,进行SuperScylla安装及启动前的配置。

       出现scylla is installed则证明SuperScylla安装成功。后续的提示则是启动前的配置。

       根据System NIC list的提示输入使用的网卡信息,示例中以ens160为例:

tar -zxvf superscylla.tar.gz

 cd superscylla

./install_scylla.sh

Page 13: SuperScylla 时空数据库 白皮书 - superengine.com.cn · 修改geohash-level、写入性能部分、场景应用 1.0.3 2019.10.17 董 玉 军 修改场景应用部分及scylla卸载方式章节

       之后会对输入的网卡信息进行再次确认输入(并以此次输入为准):

       接下来是对使用的cpu进行设置,Logical CPU是逻辑cpu的总数,SuperScylla中对cpu进行设置时是默认使用所有CPU。若需指定使用cpu的个数,可参看7.1节中的“cpu配置”部分。

       在SuperScylla在安装完成后,启动前的另一种配置可参看7.1节。关于集群搭建的配置在下文4.2节中进行说明。

       4.进行SuperScylla的使用配置

SuperScyllaDB的远程访问配置

              远程访问的配置主要涉及到scylla.yaml文件的配置。

              涉及到的修改部分如下:

              设置节点的IP地址

                     listen_address:当前机器ip(如192.168.1.101)

              本地端口(默认即可):

                     native_transport_port:9042

              设置数据库对外访问

                     rpc_address:0.0.0.0

              对外端口号(默认即可):

                     rpc_port: 9160(有需要可修改)

              设置broadcast_rpc_address,start_rpc与rpc_keepalive

                     broadcast_rpc_address:当前机器ip(如192.168.1.101)

                     start_rpc: true

                     rpc_keepalive: true

              设置种子节点ip:

                     seeds: 当前机器ip(如192.168.1.101)

       5.启动SuperScylla服务

       停止SuperScylla服务使用如下命令

4.2搭建集群

       集群部署,单个数据中心(3个节点):

   vim /etc/scylla/scylla.yaml

systemctl start scylla-server

systemctl stop scylla-server

Page 14: SuperScylla 时空数据库 白皮书 - superengine.com.cn · 修改geohash-level、写入性能部分、场景应用 1.0.3 2019.10.17 董 玉 军 修改场景应用部分及scylla卸载方式章节

       集群搭建主要涉及到scylla.yaml文件。

       集群搭建示例:

       假设3个节点的ip分别为:

              192.168.1.101,192.168.1.102,192.168.1.103

       修改如下:

       对192.168.1.101节点作出如下修改(此节点做为seeds,选择最稳定的机器作为seeds节点):

       修改scylla.yaml文件

       设置数据中心形式

              endpoint_snitch: SimpleSnitch

       设置节点的IP地址               listen_address:192.168.1.101(当前节点ip)

       本地端口(默认即可):

              native_transport_port:9042

       设置数据库对外访问

              rpc_address:0.0.0.0

       对外端口号(默认即可):

              rpc_port: 9160(有需要可修改)

       设置broadcast_rpc_address,start_rpc与rpc_keepalive

              broadcast_rpc_address:192.168.1.101(当前节点ip)

              start_rpc: true

              rpc_keepalive: true

       修改集群名称和种子节点

              cluster_name: 自定义名称(默认为Test Cluster)

              seeds: 192.168.1.101

       对192.168.1.102,192.168.1.103节点(此节点做为seeds)作出修改:

              除需要填写当前节点ip地址部分,其余设置均与192.168.1.101的设置相同。

              设置完成后,先启动seed,然后启动其他节点。启动成功后,可通过nodetool status查看集群状态,nodetool的更多使用方式可参看4.10.2节。

4.3Cqlsh的安装与使用

安装:

       在superscylla安装完成后会自动安装cqlsh。

       在未安装superscylla的机器上,使用yum install -y cqlsh进行安装。

连接与运行:

 vim /etc/scylla/scylla.yaml

Page 15: SuperScylla 时空数据库 白皮书 - superengine.com.cn · 修改geohash-level、写入性能部分、场景应用 1.0.3 2019.10.17 董 玉 军 修改场景应用部分及scylla卸载方式章节

语法:

示例:

退出:

       在cqlsh命令行输入 exit 即可退出cqlsh。

4.4创建KEYSPACE

语法:

       properties一般包括策略,复制因子及写入选项。

策略:

简单策略(SimpleStrategy):

       在一个数据中心的情况下使用简单的策略。 在这个策略中,第一个副本被放置在所选择的节点上,剩下的节点被放置在环的顺时针方向,而不考虑机架或节点的位置。

网络拓扑策略(NetworkTopologyStrategy):

       该策略用于多个数据中心。 在此策略中,您必须分别为每个数据中心提供复制因子。

       复制因子:

              复制因子是放置在不同节点上的数据的副本数。超过两个复制因子能够很好的保证没有单点故障,因此设置3个及以上复制因子是一种很好的设置方式。

       写入选项-Durable_writes:

              默认情况下,表的durable_writes属性设置为true,但可以将其设置为false(即设置为持久写入)。当Durable_writes设置为false时,策略不能设置为简单策略。

示例:

验证KeySpace

语法:

使用KeySpace 语法:

cqlsh ip port(ip与port间的空格不能省略)

cqlsh 192.168.1.201 9042

CREATE KEYSPACE <identifier> WITH <properties>;

CREATE KEYSPACE lkse WITH REPLICATION = {'class':'SimpleStrategy',

'replication_factor' : 3};(常用)

CREATE KEYSPACE lkse WITH REPLICATION = {'class':'NetworkTopologyStrategy',

'replication_factor' : 3} AND DURABLE_WRITES =false;

DESCRIBE keyspaces;

Page 16: SuperScylla 时空数据库 白皮书 - superengine.com.cn · 修改geohash-level、写入性能部分、场景应用 1.0.3 2019.10.17 董 玉 军 修改场景应用部分及scylla卸载方式章节

示例:

描述KeySpace

语法:

示例:

4.5创建UDT

语法:

示例:

       geopoint类型须使用上述语句创建自定义类型

验证描述是否已创建想要创建的类型:

4.6创建表

语法:

示例:

单个主键:

复合主键:

USE <identifier>;

USE lkse;

DESCRIBE <identifier>;

DESCRIBE lkse;

create type type_name(col_name data_type,col_name data_type);

create type geopoint(x double,y double);`

DESCRIBE type type_name;

CREATE (TABLE | COLUMNFAMILY) <tablename>('<column-definition>', '<column-

definition>')(WITH <option> AND <option>)

create table demo(id int primary key,name text,geo frozen<geopoint>);

create table demo(id int ,name text,geo frozen<geopoint>,primary key(id));

Page 17: SuperScylla 时空数据库 白皮书 - superengine.com.cn · 修改geohash-level、写入性能部分、场景应用 1.0.3 2019.10.17 董 玉 军 修改场景应用部分及scylla卸载方式章节

4.7数据操作(DML)

4.7.1普通查询

语法:

示例:

4.7.2空间查询

intersects查询

       语法:

create table demo(uuid timeuuid,utc bigint,point frozen<geopoint>,valid

int,primary(point,utc,uuid));

   SELECT [ DISTINCT ] ( select_clause | '*' )

   FROM table_name

  [ WHERE where_clause ]

  [ ORDER BY ordering_clause ]

  [ PER PARTITION LIMIT (integer | bind_marker) ]

  [ LIMIT (integer | bind_marker) ]

  [ ALLOW FILTERING ]

  [ BYPASS CACHE ]

  select_clause ::= selector [ AS identifier ] ( ',' selector [ AS identifier

] )

  selector ::= column_name

  | term

  | CAST '(' selector AS cql_type ')'

  | function_name '(' [ selector ( ',' selector )* ] ')'

  | COUNT '(' '*' ')'

  where_clause ::= relation ( AND relation )*

  relation ::= column_name operator term

   '(' column_name ( ',' column_name )* ')' operator tuple_literal

  TOKEN '(' column_name ( ',' column_name )* ')' operator term

  operator ::= '=' | '<' | '>' | '<=' | '>=' | '!=' | IN | CONTAINS | CONTAINS

KEY

  ordering_clause ::= column_name [ ASC | DESC ] ( ',' column_name [ ASC |

DESC ] )*

SELECT name, occupation FROM users WHERE userid IN (199, 200, 207);

SELECT name AS user_name, occupation AS user_occupation FROM users;

SELECT time, value

FROM events

WHERE event_type = 'myEvent'

AND time > '2011-02-03'

AND time <= '2012-01-01';

SELECT COUNT (*) AS user_count FROM users;

 select * from table where column_name.intersects(GEO_WKT);

Page 18: SuperScylla 时空数据库 白皮书 - superengine.com.cn · 修改geohash-level、写入性能部分、场景应用 1.0.3 2019.10.17 董 玉 军 修改场景应用部分及scylla卸载方式章节

       其中,column_name必须是geopoint类型列,GEO_WKT支持点、线、面几何类型。

       示例:

       如果查询的GEO_WKT是bounding box(矩形范围框,下文中简称bbox),可按如下示例进行查询。其中bound box的组织形式为(minx,miny,maxx,maxy),minx,miny分别为查询矩形框的左下点x,y坐标,maxx,maxy分别为查询矩形框的右上点x,y坐标。

       示例:

contains查询

       语法:

       其中,column_name必须是geopoint类型列,GEO_WKT支持点、线、面几何类型。

       示例:

       如果为bbox格式的空间查询,可参看上文中intersects部分中的bbox查询。

within查询

       语法:

       其中,column_name必须是geopoint类型列,GEO_WKT支持点、线、面几何类型。

       示例:

       如果为bbox格式的空间查询,可参看上文中intersects部分中的bbox查询。

coverby查询

       语法:

       其中,column_name必须是geopoint类型列,GEO_WKT支持点、线、面几何类型。

       示例:

 select * from demo where point.intersects(‘POINT(120.122 32.431)’);`

 select * from demo where point.intersects(box(minx,miny,maxx,maxy));`

 select * from table where column_name.contains(GEO_WKT);

 select * from demo where point.contains(‘POINT(120.122 32.431)’);`

 select * from table where column_name.within(GEO_WKT);

 select * from demo where point.within(‘POLYGON((120.122 32.431,120.134

32.442,120.136 32.421))’);

 select * from table where column_name.coverby(GEO_WKT);

 select * from demo where point.coverby(‘POLYGON((120.122 32.431,120.134

32.442,120.136 32.421))’);

Page 19: SuperScylla 时空数据库 白皮书 - superengine.com.cn · 修改geohash-level、写入性能部分、场景应用 1.0.3 2019.10.17 董 玉 军 修改场景应用部分及scylla卸载方式章节

       如果为bbox格式的空间查询,可参看上文中intersects部分中的bbox查询。

nearby查询

       语法:

       其中,column_name必须是geopoint类型列,GEO_WKT支持点几何类型,meter为double型。

       示例:

       如果为bbox格式的空间查询,可参看上文中intersects部分中的bbox查询。

4.7.3 辅助查询工具函数

count函数

       语法:

       返回符合条件的行数。

       示例:

distance函数

       语法:

       其中,column_name必须是geopoint类型列,GEO_WKT支持点几何类型。返回double型距离值(米)。

       示例:

as_geojson函数

       语法:

       其中,column_name是geopoint类型列,返回几何列的geojson格式。若指定field_name,则返回的geojson带有field_name的属性值,field_name支持一个或多个。

       示例:

 select * from table where column_name.nearby(GEO_WKT, meter);

 select * from demo where point.nearby(`POINT(120.49 30.13)`, 10);

 select count(*) from table where clause;

 select count(*) from demo where point.intersects(‘POINT(120.122 32.431)’);

 select distance(column_name, GEO_WKT) from table;

 select distance(point, ‘POINT(120.122 32.431)’) from demo;

 select as_geojson column_name[,field_name] from table;

 select as_geojson point,uuid from demo;

Page 20: SuperScylla 时空数据库 白皮书 - superengine.com.cn · 修改geohash-level、写入性能部分、场景应用 1.0.3 2019.10.17 董 玉 军 修改场景应用部分及scylla卸载方式章节

as_wkt函数

       语法:

       其中,column_name必须是geopoint类型列。返回几何列的WKT值。

       示例:

string函数

       语法:

       其中,column_name支持基本类型,不支持geopoint类型列。返回列值字符串。

       示例:

4.7.4插入操作

插入语法如下:

例如:

TTL解释:在设定的TTL后面的数值秒后,数据会自动删除

4.7.5删除操作

删除语法如下:

例如:

 select as_wkt(column_name) from table;

 select as_wkt(point) from demo;`

 select string(column_name) from table;

 select string(id) from demo;

INSERT INTO `table_name` ( `names_values` )

: [ USING `update_parameter` ( AND `update_parameter` )* ]

names_values: `names` VALUES `tuple_literal`

names: '(' `column_name` ( ',' `column_name` )* ')'

INSERT INTO NerdMovies (movie, director, main_actor, year)

VALUES ('Serenity', 'Joss Whedon', 'Nathan Fillion', 2005)

USING TTL 86400;

DELETE [ `simple_selection` ( ',' `simple_selection` ) ]

: FROM `table_name`

: [ USING `update_parameter` ( AND `update_parameter` )* ]

: WHERE `where_clause`

: [ IF ( EXISTS | `condition` ( AND `condition` )*) ]

Page 21: SuperScylla 时空数据库 白皮书 - superengine.com.cn · 修改geohash-level、写入性能部分、场景应用 1.0.3 2019.10.17 董 玉 军 修改场景应用部分及scylla卸载方式章节

4.7.6更新操作

更新语法:

示例:

备注:

       更新语句的where表达式必须是Primary Key过滤。

4.7.7批量模式

语法:

DELETE FROM NerdMovies USING TIMESTAMP 1240003134

WHERE movie = 'Serenity';

DELETE phone FROM Users

WHERE userid IN (C73DE1D3-AF08-40F3-B124-3FF3E5109F22, B70DE1D0-9908-4AE3-BE34-

5573E5B09F14);

UPDATE `table_name`

: [ USING `update_parameter` ( AND `update_parameter` )* ]

: SET `assignment` ( ',' `assignment` )*

: WHERE `where_clause`

: [ IF ( EXISTS | `condition` ( AND `condition` )*) ]

update_parameter: ( TIMESTAMP | TTL ) ( `integer` | `bind_marker` )

assignment: `simple_selection` '=' `term`

:| `column_name` '=' `column_name` ( '+' | '-' ) `term`

:| `column_name` '=' `list_literal` '+' `column_name`

simple_selection: `column_name`

:| `column_name` '[' `term` ']'

:| `column_name` '.' `field_name

condition: `simple_selection` `operator` `term`

UPDATE NerdMovies USING TTL 400

SET director = 'Joss Whedon',

main_actor = 'Nathan Fillion',

year = 2005

WHERE movie = 'Serenity';

UPDATE UserActions

SET total = total + 2

WHERE user = B70DE1D0-9908-4AE3-BE34-5573E5B09F14

AND action = 'click';

BEGIN [ UNLOGGED | COUNTER ] BATCH

: [ USING `update_parameter` ( AND `update_parameter` )* ]

: `modification_statement` ( ';' `modification_statement` )*

: APPLY BATCH

modification_statement: `insert_statement` | `update_statement` |

`delete_statement`

Page 22: SuperScylla 时空数据库 白皮书 - superengine.com.cn · 修改geohash-level、写入性能部分、场景应用 1.0.3 2019.10.17 董 玉 军 修改场景应用部分及scylla卸载方式章节

示例:

4.8索引指南

       SuperScylla的索引概念有primary key,partition key,clustering key,Secondary index等四种。

4.8.1PRIMARY KEY

       是一个宏观概念,用于从表中取出数据(可以理解为一级索 引),primary key可以由一个或多个column组合而成,当primary key由多列组合而成时,即为composite primary key(多列key)。

       例如:

              primary key (key_part_one) ;

              primary key (key_part_one,key_part_two);

       在组合主键的情况下,第一部分称作partition key(key_part_one即为 partition key),第二部分是clustering key(key_part_two)。

示例:

单列做主键

多列主键

       此示例中的id即为partition key,age即为clustering key。

多列partition key及多列clustering key做主键

4.8.2PARTITION KEY

       负责将数据分布在集群节点上,可以由一列或多列组成。当 primary key在表中的key只有一个field的情况下,其与partition key是等 效的。

4.8.3CLUSTERING KEY

       负责在partition中的数据排序,可以由一列或多列组成。

BEGIN BATCH

INSERT INTO users (userid, password, name) VALUES ('user2', 'ch@ngem3b', 'second

user');

UPDATE users SET password = 'ps22dhds' WHERE userid = 'user3';

INSERT INTO users (userid, password) VALUES ('user4', 'ch@ngem3c');

DELETE name FROM users WHERE userid = 'user1';

APPLY BATCH;

create table demo1(id int,name text,primary key(id));

create table demo1(id int,name text,age int,primary key(id,age));

create table demo1(id int,name text,age int,x float,y float,uuid timeuuid,

primary key((id,age),(x,y));

Page 23: SuperScylla 时空数据库 白皮书 - superengine.com.cn · 修改geohash-level、写入性能部分、场景应用 1.0.3 2019.10.17 董 玉 军 修改场景应用部分及scylla卸载方式章节

       SuperScylla中所有的数据都只能根据Primary Key中的字段来排序。因此, 如果想根据某个column来排序,必须将该column加到Primary key中, 如 primary key (id, c1, c2 ,c3), 其中id是partition key, c1,c2 ,c3是Clustering Key。

       如果想用id和c1作为partition key, 只需添加括号写成: primary key ((id, c1), c2 ,c3))即可。

4.8.4SECONDARY INDEX

       scylla中除了primary key外,还有二级索引,作为辅助索引就是通过找到一级索引,进而获取数据。

       语法:

       CREATE INDEX命令用于在用户指定的列上创建一个索引。如果指定的列已 存在数据,在执行CREATE INDEX后,则会在指定数据列上创建索引。

       创建索引的规则:

              1.由于主键已编入索引,无法在主键列上创建二级索引。

              2.二级索引不支持集合索引,如create index on table(id,age);

       示例:

创建索引:

查询:

       二级索引的查询只支持“=”、”in”查询。

4.9客户端驱动

Python-driver

获取方式:pip install cassandra-driver

Python-driver相关链接

Java-driver

Java-driver相关链接

C/C++ driver

C/C++ driver 相关链接

Csharp-driver

Csharp-driver相关链接

Ruby-driver

Ruby-driver相关链接

Php-driver

Php-driver相关链接

 CREATE INDEX <identifier> ON <tablename>;

 CREATE INDEX test_index ON demo (valid);

 select * from demo where valid=xxx;

Page 24: SuperScylla 时空数据库 白皮书 - superengine.com.cn · 修改geohash-level、写入性能部分、场景应用 1.0.3 2019.10.17 董 玉 军 修改场景应用部分及scylla卸载方式章节

Nodejs-driver

Nodejs-driver相关链接

Go-driver

Go-driver相关链接

4.10管理工具

4.10.1ScyllaDB图形界面管理工具

       可对ScyllaDB进行管理的工具有许多,此处以NoSQL Manager for Cassandra(windows版本)为例,对其操作进行简单的说明。

1.软件下载地址

ScyllaDB图形界面管理工具下载链接

2.下载完成,直接点击,运行安装,安装后打开软件,打开如下:

3.创建ScyllaDB连接

       点击红色框选部分,根据窗口提示,完成相关参数填写,进行ScyllaDb的连接。

       成功连接后,如下图:

Page 25: SuperScylla 时空数据库 白皮书 - superengine.com.cn · 修改geohash-level、写入性能部分、场景应用 1.0.3 2019.10.17 董 玉 军 修改场景应用部分及scylla卸载方式章节

4.创建keyspace

       在连接名称上右击,选择Create new Keyspace, 填写相关参数。

       创建成功后如下图:

Page 26: SuperScylla 时空数据库 白皮书 - superengine.com.cn · 修改geohash-level、写入性能部分、场景应用 1.0.3 2019.10.17 董 玉 军 修改场景应用部分及scylla卸载方式章节

5.创建表(修改表)

       点击刚刚创建的lkse,在Tables上右击选择Create new Table

       设置表名

       设置字段名称及类型,以及是否为主键的设置(主键部分可参考4.8节)

       添加完字段后选择左上角的勾,完成表的创建

       结果如下:

6.插入/删除数据

       打开对应的表后,通过+,-进行数据的增添及修改

Page 27: SuperScylla 时空数据库 白皮书 - superengine.com.cn · 修改geohash-level、写入性能部分、场景应用 1.0.3 2019.10.17 董 玉 军 修改场景应用部分及scylla卸载方式章节

7.查询及cql的使用

       选择工具栏的CQL

       编写查询脚本,即可进行查询

       此外,通过cql脚本的编写,可完成创建keyspace,创建表,插入、更新、删除数据,查询等操作。

4.10.2集群管理工具nodetool

       nodetool是SuperScylla自带的外围工具,通过JMX可以动态修改当前进程中内 存数据。

       常用命令介绍:

              nodetool status:查看集群所有node的心跳状态。

              nodetool info:查看当前节点进程全局信息。

              nodetool decommission: 关闭当前节点,并把数据复制到环中紧邻的下一 个节点。

              nodetool snapshot:用于创建keyspace或table的快照信息,即数据备份, 可用于数据的恢复。

              nodetool refresh:把memtable中的数据刷新到sstable,不需要重启节点。

              nodetool netstats:获取节点的网络连接信息。

              nodetool rebuild:当有新的数据中心加入,运行这个命令复制数据到数据中 心。

              nodetool compact [keyspacename [tablename]]: 合并sstable文件。省略表,则压缩keyspace下面的所有表;省略keyspace,则压缩所有keyspace下的所有表。

              nodetool compactionstats:显示当前正在压缩的任务进度。

5性能指标

Page 28: SuperScylla 时空数据库 白皮书 - superengine.com.cn · 修改geohash-level、写入性能部分、场景应用 1.0.3 2019.10.17 董 玉 军 修改场景应用部分及scylla卸载方式章节

 Scylla(无空

间)四node连接副本数1

Scylla(空间主键)坐标数值范围: 0 ~ 1e-2 四node连接

副本1

Scylla(空间主键)坐标数值范围: 0 ~ 1e-2 四node连接

副本3

并发数 400并发    

数据量 1000万数据    

吞吐量K/S

138846 134253 123937

最小延时

(ms)0.46 0.47 0.49

最大延时

(ms)110.51 138.48 75.78

平均延时

(ms)2.82 2.94 3.2

95%通过

(ms)6.81 7.52 6.8

99%通过

(ms)9.47 11.27 9.73

超时失败

(个)488 557 584

5.1写入性能

测试环境:

              数据库服务器: 32x cpu,64G内存,10G带宽,100万PPS,SSD硬盘,4台

              测试客户端:32x cpu,64G内存,10G带宽,100万PPS,SSD硬盘,单机

测试场景

              并发连接写入,8个字段,每次提交一条记录

       下列表格是针对SuperScylla在不同副本、节点数,坐标范围以及不同并发下的1000万数据的写入测试。

400并发

600并发

Page 29: SuperScylla 时空数据库 白皮书 - superengine.com.cn · 修改geohash-level、写入性能部分、场景应用 1.0.3 2019.10.17 董 玉 军 修改场景应用部分及scylla卸载方式章节

 Scylla(无空

间)四node连接副本数1

Scylla(空间主键)坐标数值范围: 0 ~ 1e-2 四node连接

副本1

Scylla(空间主键)坐标数值范围: 0 ~ 1e-2 四node连接

副本3

并发数 600并发    

数据量 1000万数据    

吞吐量K/S

145813 142767 132101

最小延时

(ms)0.45 0.46 0.45

最大延时

(ms)130.39 266.58 120.24

平均延时

(ms)3.96 4.04 4.47

95%通过

(ms)9.79 9.8 10.01

99%通过

(ms)12.72 12.85 13.62

超时失败

(个)637 1021 333

800并发

Page 30: SuperScylla 时空数据库 白皮书 - superengine.com.cn · 修改geohash-level、写入性能部分、场景应用 1.0.3 2019.10.17 董 玉 军 修改场景应用部分及scylla卸载方式章节

 Scylla(无空

间)四node连接副本数1

Scylla(空间主键)坐标数值范围: 0 ~ 1e-2 四node连接

副本1

Scylla(空间主键)坐标数值范围: 0 ~ 1e-2 四node连接

副本3

并发数 800并发    

数据量 1000万数据    

吞吐量K/S

153680 153617 137944

最小延时

(ms)0.47 0.43 0.52

最大延时

(ms)734.13 58.29 86.95

平均延时

(ms)5.02 5.01 5.66

95%通过

(ms)12.21 11.92 12.35

99%通过

(ms)15.73 15.65 16.02

超时失败

(个)989 354 0

1000并发

Page 31: SuperScylla 时空数据库 白皮书 - superengine.com.cn · 修改geohash-level、写入性能部分、场景应用 1.0.3 2019.10.17 董 玉 军 修改场景应用部分及scylla卸载方式章节

 Scylla(无空

间)四node连接副本数1

Scylla(空间主键)坐标数值范围: 0 ~ 1e-2 四node连接

副本1

Scylla(空间主键)坐标数值范围: 0 ~ 1e-2 四node连接

副本3

并发数 1000并发    

数据量 1000万数据    

吞吐量K/S

165071 158826 143895

最小延时

(ms)0.44 0.48 0.45

最大延时

(ms)158.51 392.19 103.1

平均延时

(ms)5.94 6.02 6.74

95%通过

(ms)15.64 13.41 14.95

99%通过

(ms)19.48 18.68 19.65

超时失败

(个)222 1510 3377

2000并发

Page 32: SuperScylla 时空数据库 白皮书 - superengine.com.cn · 修改geohash-level、写入性能部分、场景应用 1.0.3 2019.10.17 董 玉 军 修改场景应用部分及scylla卸载方式章节

 Scylla(无空

间)四node连接副本数1

Scylla(空间主键)坐标数值范围: 0 ~ 1e-2 四node连接

副本1

Scylla(空间主键)坐标数值范围: 0 ~ 1e-2 四node连接

副本3

并发数 2000并发    

数据量 1000万数据    

吞吐量K/S

182940 179762 172181

最小延时

(ms)0.48 0.45 0.47

最大延时

(ms)121.96 254.74 225.64

平均延时

(ms)13.12 10.78 11.3

95%通过

(ms)15.93 22.72 21.8

99%通过

(ms)17.85 30.15 28.9

超时失败

(个)2418 664 3552

       测试结论:

              1、客户端驱动配置多个ScyllaDB连接,写入更高效

              2、空间数据的token越离散,写入效率越高,接近无空间类型的效率

              3、ScyllaDB 副本数3个时,无明显性能下降

              4、ScyllaDB 集群在2000并发以上写入,无明显效率提升,因此吞吐量最高大约在 18万/秒

6典型场景应用        在具体的场景应用过程中,需根据场景的特性以及关心的属性信息构建数据表,但建表时应注意,parition key的常规字段只支持=、in查询,空间字段支持intersects,nearby,coverby等空间查询,clustering key支持=、>、<等查询,因此在构建数据表时需根据实际场景应用的字段进行primary key的选择。

6.1轨迹查询

Page 33: SuperScylla 时空数据库 白皮书 - superengine.com.cn · 修改geohash-level、写入性能部分、场景应用 1.0.3 2019.10.17 董 玉 军 修改场景应用部分及scylla卸载方式章节

pk ck 查询路径

geom +vid

time走空间索引,支持geom的空间函数单独查询(不支持vid单独查询)

geom time + vid 走空间索引,ck必须先给定时间

geom vid + time 走空间索引,ck必须先给定车牌

vid time 车牌走索引,时间排序过滤;若时间精度不够,记录会覆盖

vidtime +uuid

车牌走索引,时间排序过滤

       轨迹查询主要应用的字段是空间地理位置信息、车辆唯一标识信息以及时间信息,因此在建表时应该考虑将空间位置字段作为partiton key(下文简称pk),车辆唯一标识及时间信息作为clusteringkey(下文简称ck)。关于partition key、clustering key等索引介绍信息可参看4.8索引指南章节。

       建表时Primary Key的情况与查询路径对照表(geom为空间字段,vid为车牌号,time为时间,uuid为唯一标识):

       创建表的语句为(示例中vid字段为车辆唯一标识字段,如车牌号):

       插入数据的语句为:

       下面是几个查询场景的示例:

       1.查询某段时间内,车牌号为A123456的轨迹(查询字段为vid+tick)

       2.查询某段时间、某个范围内的车辆信息(查询字段为geom+tick)

       3.查询某段时间、速度超过55km/h的车辆(查询字段为tick+speed)

create table demo(geom frozen<geopoint>, vid text, speed float, tick timestamp, 

primary key(geom,vid,tick));

insert into demo(geom,vid,speed,tick) values((1,1), '京A123456', 60,'2019-10-

01 10:00:00+0800');

insert into demo(geom,vid,speed,tick) values((1.1,1.1), '京A234567', 80,'2019-

10-01 10:03:00+0800');

insert into demo(geom,vid,speed,tick) values((1.1,1.5), '京A345678', 60,'2019-

10-01 10:04:00+0800');

select * from demo where vid = '京A123456' and tick < '2019-10-

1 10:03:00' and tick > '2019-09-30' allow filtering;

select * from demo where geom.within('POLYGON((1 0.99,1.001 1.001,0.99 1.001,1 0

.99))') and tick < '2019-10-1 10:03:00' and tick > '2019-09-30' allow filtering;

select * from demo where speed > 55 and tick < '2019-10-

1 10:03:00' and tick > '2019-09-30' allow filtering;

Page 34: SuperScylla 时空数据库 白皮书 - superengine.com.cn · 修改geohash-level、写入性能部分、场景应用 1.0.3 2019.10.17 董 玉 军 修改场景应用部分及scylla卸载方式章节

       4.查询某个范围、速度超过55km/h的车辆(查询字段为geom+speed)

       5.查询某个范围、车牌号为A123456的车辆信息(查询字段为geom+vid)

6.2超速

       超速场景下的应用主要关心的字段是空间位置信息以及速度信息,因此在建表的过程中考虑将空间位置信息、速度信息以及车辆唯一标识作为primary key,其中空间位置信息作为partition key,速度信息及车辆标识为clustering key。

       关于建表时Primary Key的情况与查询路径可参看6.1节中的对照表。

       创建表的语句如下(vid为车辆唯一标识,如车牌号):

       插入数据的语句为:

       下面是几个查询场景的示例:

       1.某个范围内、速度超过55km/h的车辆(查询字段为geom+speed)

       2.某段时间、某个范围、速度超过55km/h的车辆(查询字段为geom+speed+tick)

6.3传感器

       传感器场景下的应用主要关心的字段是空间位置信息以及一些传感器获取的属性信息,如温度、水压、水高警戒线等,因此在建表的过程中考虑将空间位置信息、时间信息以及需要关注的传感器属性信息作为primary key,下面将以温度传感器作为示例进行说明。

select * from demo where geom.within('POLYGON((1 0.99,1.001 1.001,0.99 1.001,1 0

.99))') and speed > 55 allow filtering;

select * from demo where geom.within('POLYGON((1 0.99,1.001 1.001,0.99 1.001,1 0

.99))') and vid = '京A123456';

create table demo1(geom frozen<geopoint>, vid text, speed float, tick timestamp,

 primary key(geom,speed,vid));

insert into demo1(geom,vid,speed,tick) values((1,1), '京A123456', 60,'2019-10-

01 10:00:00+0800');

insert into demo1(geom,vid,speed,tick) values((1.1,1.1), '京A234567', 80,'2019-

10-01 10:03:00+0800');

insert into demo1(geom,vid,speed,tick) values((1.1,1.5), '京A345678', 60,'2019-

10-01 10:04:00+0800');

select * from demo1 where geom.within('POLYGON((1 0.99,1.001 1.001,0.99 1.001,1 

0.99))') and speed > 55;

select * from demo1 where geom.intersects('POLYGON((1 0.99,1.001 1.001,0.99 1.00

1,1 0.99))') and speed > 55 and tick < '2019-10-1 10:03:00' and tick > '2019-09-

30' allow filtering;

Page 35: SuperScylla 时空数据库 白皮书 - superengine.com.cn · 修改geohash-level、写入性能部分、场景应用 1.0.3 2019.10.17 董 玉 军 修改场景应用部分及scylla卸载方式章节

       关于建表时Primary Key的情况与查询路径可参看6.1节中的对照表。

       创建表的语句如下(示例中temper字段为温度,uuid为传感器的唯一标识):

       插入数据的语句为:

       下面是几个查询场景的示例:

       1.某个范围、温度超过50的机器(查询字段为geom+temper)

       2.某个时间、温度超过50的机器(查询字段为geom+tick)

       3.某段时间、某个范围、温度超过50的机器(查询字段为geom+temper+tick)

7常见问题

7.1SuperScylla启动前的另一种配置方式

执行下述命令

根据提示进行yes/no 的选择

create table demo2(geom frozen<geopoint>, uuid text, temper float, tick timestam

p, primary key(geom,temper,uuid));

insert into demo2(geom,uuid,temper,tick) values((1,1), 'machine123456', 60,'2019

-10-01 10:00:00+0800');

insert into demo2(geom,uuid,temper,tick) values((1.1,1.1), 'machine345678', 50,'

2019-10-01 10:03:00+0800');

insert into demo2(geom,uuid,temper,tick) values((1.1,1.5), 'machine567896', 49.6

,'2019-10-01 10:04:00+0800');`

select * from demo2 where geom.within('POLYGON((1 0.99,1.001 1.001,0.99 1.001,1 

0.99))') and temper > 50;

select * from demo2 where temper > 50 and tick < '2019-10-

1 10:03:00' and tick > '2019-09-30' allow filtering;

select * from demo2 where geom.within('POLYGON((1 0.99,1.001 1.001,0.99 1.001,1 

0.99))') and temper > 50 and tick < '2019-10-1 10:03:00' and tick > '2019-09-

30' allow filtering;

scylla_setup

- Do you want to run check your kernel version?

   yes

- Do you want to verify the ScyllaDB packages are installed?

   yes

Page 36: SuperScylla 时空数据库 白皮书 - superengine.com.cn · 修改geohash-level、写入性能部分、场景应用 1.0.3 2019.10.17 董 玉 军 修改场景应用部分及scylla卸载方式章节

cpu配置

       添加如下内容:

              CPUSET="--cpuset 0-3 " 其中0-3可根据机器cpu个数进行修改

       CPUSET可设置的属性如下:

              --cpuset 使用的cpu核数,假设机器cpu数目为4,此项可设置为0-3

- Do you want the Scylla server service to automatically start when the Scylla

node boots?

  no

- Do you want to enable Scylla to check if there is a newer version of Scylla

available?

  no

- Do you want to disable SELinux?

   yes

- Do you want to setup Network Time Protocol(NTP) to auto-synchronize the

current time on the node?

  no

- Do you want to setup RAID0 and XFS?

   yes

- Are you sure you want to setup RAID0 and XFS?

  no

- Do you want to enable coredumps?

   yes

- Do you want to setup a system-wide customized configuration for Scylla?

   yes

  根据提示输入:本例中输入为ens160 (绑定网卡)

- Do you want to enable Network Interface Card (NIC) and disk(s) optimization?

   yes

- Do you want iotune to study your disks IO profile and adapt Scylla to it?

  no(此处选yes若卡顿,则重新运行选no,后面进行手动配置,建议直接选no)

- Do you want to install node exporter to export Prometheus data from the node?

   yes

- Do you want to set the CPU scaling governor to Performance level on boot?

   yes

- Do you want to enable fstrim service?

   yes

  待scylla_setup运行完成后,进行SuperScylla的cpu及io配置

vim /etc/scylla.d/cpuset.conf

Page 37: SuperScylla 时空数据库 白皮书 - superengine.com.cn · 修改geohash-level、写入性能部分、场景应用 1.0.3 2019.10.17 董 玉 军 修改场景应用部分及scylla卸载方式章节

              --smp 每个CPU核使用的线程数,此处无需设置该属性。

io配置

编辑io.conf文件

添加如下内容:

编辑io_properties.yaml

添加如下内容:

7.2scylla.yaml修改集群名称后重启报错

       如果启动时报如下错误:

       错误原因:之前启动过,集群信息已写入系统表,集群改新名字相当于换集群,需要将之前集群的数据全部删除。

       错误解决方法如下:

       删除成功后重新启动即可。

7.3远程机器无法访问

       可查看防火墙状态,并对防火墙进行相关设置,开放相关端口号。centos7默认使用的是firewall作为防火墙。

       查看防火墙状态的命令如下:

       启动防火墙命令如下:

vim /etc/scylla.d/io.conf

SEASTAR_IO="--num-io-queues=1 --io-properties-

file=/etc/scylla.d/io_properties.yaml"

vim /etc/scylla.d/io_properties.yaml

disks:

  - mountpoint: /

      read_iops: 3455

      read_bandwidth: 613666496

      write_iops: 2009

      write_bandwidth: 210046176

Startup failed: exceptions::configuration_exception (Saved cluster name !=

configured name Scylla Cluster)

rm -rf /var/lib/scylla/data/*

rm -rf /var/lib/scylla/commitlog/*

systemctl status firewalld

Page 38: SuperScylla 时空数据库 白皮书 - superengine.com.cn · 修改geohash-level、写入性能部分、场景应用 1.0.3 2019.10.17 董 玉 军 修改场景应用部分及scylla卸载方式章节

       开放某个端口,如9042

       使修改生效

7.4SuperScylla的超时设置

       编辑scylla.yaml文件

根据应用情况,选择性编辑该文件中的如下选项,时间可自行设置,单位为ms:

7.5SuperScylla的卸载

7.5.1联网状态下卸载

       联网状态下卸载,可使用yum进行卸载,卸载过程中,被卸载的包的相关依赖包也会一并卸载,卸载顺序如下:

7.5.2离线状态下卸载

       离线状态下卸载,可使用rpm卸载,卸载顺序如下:

systemctl start firewalld

firewall-cmd --permanent --zone=public --add-port=9042/tcp

firewall-cmd --reload

vim /etc/scylla/scylla.yaml

read_request_timeout_in_ms: 1000000

write_request_timeout_in_ms: 1000000

range_request_timeout_in_ms: 1000000

counter_write_request_timeout_in_ms: 1000000

cas_contention_timeout_in_ms: 1000000

truncate_request_timeout_in_ms: 1000000

request_timeout_in_ms: 1000000

yum remove scylla-conf.x86_64 -y

yum remove scylla-kernel-conf.x86_64 -y

yum remove scylla-python3.x86_64 -y

yum remove scylla-tools-core.noarch -y

rpm -e scylla

rpm -e scylla-jmx

rpm -e scylla-tools

Page 39: SuperScylla 时空数据库 白皮书 - superengine.com.cn · 修改geohash-level、写入性能部分、场景应用 1.0.3 2019.10.17 董 玉 军 修改场景应用部分及scylla卸载方式章节

rpm -e scylla-server

rpm -e scylla-python3

rpm -e scylla-kernel-conf

rpm -e scylla-conf

rpm -e scylla-tools-core

rpm -e PyYAML