Apache Cassandra和Apache Ignite:关系并置和分布式SQL

为什么80%的码农都做不了架构师?>>>   hot3.png

在上一篇文章中,回顾和总结了Cassandra中使用的查询驱动数据模型(或者说非常规数据模型)方法论的缺陷。事实证明,如果不对查询有深入的了解,通过该方法论将无法开发高效的应用。实际上,这种场景的应用架构上会变得更加的复杂,难于维护,并且会造成很大的数据冗余。

此外,这个问题通常会被这样的观点掩盖:“如果想要扩展性、速度以及高可用性,那么就得准备存储多份数据,并且牺牲SQL和强一致性。”,这个论调十年前可能是正确的,但是现在完全错误!

没那么夸张,我们选择了另一个ASF成员,Apache Ignite。在本文中,会讲解基于Ignite的应用架构,然后衡量它的维护成本。

我们选择的应用仍然是跟踪所有厂商生产的车辆,然后了解每个单一厂商的产能,如果看过第一篇文章,那么应该知道关系模型如下:

下一步,可以使用Ignite的CREATE TABLE命令创建这三个表,然后运行由SQL驱动的应用了么?不一定,如果不需要对存储于不同表中的数据进行关联操作,那么是可以的。但是根据前文,前提是应用需要支持两种关联的查询:

  1. Q1:获取一个厂商在特定的时间段内生产的车型。
  2. Q2:获取一个厂商特定车型的产量。

在Cassandra的案例中,我们为每个查询创建了一张表规避了关联的问题,那么用Ignite,是不是还要经历同样的过程?完全不用。事实上,Ignite的非并置的关联已经完全可用,如果三个表已经建好了,那么不需要什么额外的工作。但是,这没有比并置的高效和快速。因此,首先要多学习一下关系并置,然后了解这个概念在Ignite中是如何使用的。

基于并置关联的数据模型

关系并置在Ignite(还有其他的分布式数据库,比如Google Spanner以及MemSQL)中是一个强大的概念,它可以在以一个集群节点上存储相关的数据。那么哪些数据是相关的呢?尤其是在关系数据库的背景下,这非常简单,只需要在业务对象之间标示一个父子关系,在CREATE TABLE语句中指定一个关系键就可以了,剩下的就交给Ignite了!

还是拿车辆和厂商的应用举例,使用厂商作为父实体,车辆作为子实体是合理的。比如,按照这样配置好之后,某个厂商生产的所有车辆数据都会存储于同一个节点上,如下图所示:

如图所示,丰田生产的车辆都存储于节点1,而福特生产的车辆都存储于节点2,这就是关系并置,车辆都会存储于对应的厂商所在的节点上。

要做到这样的数据分布,Vendor表的SQL定义如下:

CREATE TABLE Vendor (id INT PRIMARY KEY,name VARCHAR,address VARCHAR
);

厂商数据会在整个集群中随机地分布,Ignite会使用主键列计算厂商数据所在的节点。 下一个是Car表:

CREATE TABLE Car (id INT,vendor_id INT,model VARCHAR,year INT,price float,PRIMARY KEY(id, vendor_id)
) WITH "affinityKey=vendor_id";

车辆表有一个affinityKey参数,配置为vendor_id列,它告诉Ignite,车辆存储于vendor_id对应的集群节点。

Production表上重复同样的过程,它的数据也是存储于vendor_id对应的集群节点上,如下:

CREATE TABLE Production (id INT,car_id INT,vendor_id INT,country VARCHAR,total INT,year INT,PRIMARY KEY(id, car_id, vendor_id)
) WITH "affinityKey=vendor_id";

这样数据模型就建完了,下一步就进入应用的代码,然后开发必要的查询。

带关联的SQL查询

Ignite集群可以使用我们熟悉的SQL进行查询,它支持分布式的SQL关联以及二级索引。 Ignite支持两种类型的关联:并置和非并置。假定要关联的表已经并置,并且本地数据全部可用,那么并置的关联会避免数据(关联所需的)的移动,这是在分布式数据库中效率最高、性能最好的。如果部分表无法实现关系并置,但是还需要进行关联,那么非并置的关联就是一个备份计划。这种类型的关联速度较慢,因为在关联时它需要在集群节点间进行数据的移动。

之前,已经配置好了VendorCarProduction表,下一步就是利用并置关联的优势,为Q1写一个SQL:

SELECT c.model, p.country, p.total, p.year FROM Vendor as v
JOIN Production as p ON v.id = p.vendor_id
JOIN Car as c ON c.id = p.car_id
WHERE v.name = 'Ford Motor' and p.year >= 2017
ORDER BY p.year;

还能更快么?当然能。下面为Vendor.nameProduction.year列定义二级索引:

CREATE INDEX vendor_name_id ON Vendor (name);
CREATE INDEX prod_year_id ON Production (year);

针对Q2的查询也不需要额外的工作:

SELECT p.country, p.total, p.year FROM Vendor as v
JOIN Production as p ON v.id = p.vendor_id
JOIN Car as c ON c.id = p.car_id
WHERE v.name = 'Ford Motor' and c.model = 'Explorer';

现在,如果老板要求增加一个新特性时,很快就能构造出一套新的SQL满足他。 完成!作为比较,如果要支持Q2,可以看看基于Cassandra的架构是怎么搞的。

架构简化:任务完成!

Ignite的基于关系并置的数据模型,针对Cassandra的基于查询驱动的模型有如下的优点:

  • 应用的数据层基于熟悉的关系模型进行建模,易于维护;
  • 数据使用标准的SQL语法进行访问;
  • 关系并置提供了现代分布式数据库的更多好处:
    • 高效和高性能的分布式关联;
    • 并置计算;

使用Ignite替代Cassandra,简化的软件架构并不是唯一的好处,过段时间,还会有关于强一致性和内存极性能方面的想法。

本文译自Denis Magda的博客。

转载于:https://my.oschina.net/liyuj/blog/1615008

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/255579.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【pyradiomics学习】——安装pyradiomics以及简单示例

目录 数据集下载: 示例代码 参考文献: bug修复 运行结果: 数据集下载: https://www.jianguoyun.com/p/DcEwQq0Q45bOBxj09JYC (访问密码: gd8dmv) 示例代码 #!/usr/bin/env python # -*- coding: utf-8 -*- # Time : 20…

【pyradiomics学习】——影像组学特征

目录 1、形状特征(14个) 2、一阶特征(18个) 灰度共生矩阵特征(24个) 灰度区域大小矩阵特征(16个) 灰度行程矩阵特征(16个) 邻域灰度差矩阵特…

Hyper-v Server 2012 Release Candidate 部署体验

很多人知道,Microsoft Hyper-V分为两种类型:一种是作为Windows Server的一个组件,另一种是作为虚拟化产品的单独服务器。虽然两者都是技术上的Hyper-V,每个版本的特性和用例各不相同。 Hyper-V Server直接在物理机器硬件上运行&am…

面向对象的七大原则

总脉络图: 一:单一职责原则(全称:“Single-Responsibility Principle”)又称 单一功能原则 核心:解耦和增强内聚性(高内聚,低耦合) 说明: 就一个类而言,应该只专注于做一…

excel 多列匹配相等后 引用值

2019独角兽企业重金招聘Python工程师标准>>> 场景 如图下,当A、B列与E、F列皮配上,C列则引用G列的值 原理 VLOOKUP只能查找单列值。我们可以把多列值拼接后形成一个虚拟列,然后VLOOKUP函数查找这个虚拟列进行匹配。 在C1处输入下…

【BUG调试】——OSError: Caught OSError in DataLoader worker process 0

目录 问题描述: 参考链接 问题分析 解决方案 出现情况 问题描述: 在使用pytorch搭建了VGG从头开始训练时出现了以下问题: OSError: Caught OSError in DataLoader worker process 0 参考链接 参考up主视频:4.2 使用pytor…

iOS 图解多线程

转载于:https://www.cnblogs.com/OnNineMonkey/p/5385963.html

Egret之位图字体

1 , 关于位图字体的制作 2 , egret官方提供的资源 看看cartoon-font.fnt的内容 {"file":"cartoon-font.png","frames":{ "A":{"x":1,"y":54,"w":21,"h":24,"offX":2,"offY&qu…

图像处理基本算法-滤波

线性滤波器的向量表示: W是一个大小为m*n的滤波器的系数,Z为由滤波器覆盖的相应图像的灰度值。 线性滤波器所能是实现的就是乘积求和操作。 几种常见的滤波器: 平滑空间滤波器如均值滤波 统计排序滤波器如中值滤波 锐化空间滤波器如锐化…

20145122《Java面向对象程序设计》实验二实验报告

实验名称: Java面向对象程序设计 实验内容: 初步掌握单元测试和TDD理解并掌握面向对象三要素:封装、继承、多态初步掌握UML建模熟悉S.O.L.I.D原则了解设计模式 PSP时间 步骤耗时百分比需求分析1h12.5%设计1h12.5%代码实现3h37.5%测试1h12.5%分…

iOS中AutoLayer自动布局流程及相关方法

关于UIView的Layer,IOS提供了三个方法: 1、layoutSubviews 系统重写布局:在iOS5.1和之前的版本,此方法的缺省实现不会做任何事情(实现为空),iOS5.1之后(iOS6开始)的版本,此方法的缺省实现是使用你设置在此view上面的co…

均值滤波 中值滤波 高斯平滑滤波

均值滤波是典型的线性滤波算法,它是指在图像上对目标像素给一个模板,该模板包括了其周围的临近像素(以目标象素为中心的周围8个像素,构成一个滤波模板,即去掉目标像素本身),再用模板中的全体像素…

linux 安装RedisLive

为什么80%的码农都做不了架构师?>>> RedisLive 用来监控Redis,便于redis性能分析 安装步骤: 1.安装pip(代码参考:https://github.com/pypa/pip) 官方网站:https://pypi.python.org/…

高斯滤波和双向滤波的区别与联系

1. 简介 图像平滑是一个重要的操作,而且有多种成熟的算法。这里主要简单介绍一下Bilateral方法(双边滤波),这主要是由于前段时间做了SSAO,需要用bilateral blur 算法进行降噪。Bilateral blur相对于传统的高斯blur来说…

Eclipse变量名自动补全问题 自定义上屏按键为TAB

Eclipse空格等号等都可以上屏,这样有时候输入变量名再按空格就会自动补全,非常讨厌。那么怎么办呢? 1.首先你的Eclipse需要装有 Eclipse plug-in development environment 和 Eclipse JDT Plug-in Developer Resources 或者直接去下载一个和…

Dreamweaver CS6 Mac破解版

介于之前小子分享的Mac版的Adobe的PS CS6和Illustrator CS6,有用户要求小子分享下Dreamweaver,小子当然乐意效劳。 Dreamweaver CS6 是世界顶级软件厂商Adobe推出的一套拥有可视化编辑界面,用于制作并编辑网站和移动应用程序的网页设计软件。…

【pyqt5学习】——graphicView显示matplotlib图像

目录 一、导入模块 二、自定义一个matplotlib窗口类Figure 三、利用QT_designer绘制窗口 四、写逻辑代码 五、结果展示 一、导入模块 import matplotlibmatplotlib.use("Qt5Agg") from matplotlib.backends.backend_qt5agg import FigureCanvasQTAgg from matplo…

what is ssao

说到ssao 就要从ao说起,ao,即间接环境光遮蔽技术。我们知道现实中的光线,除了来自太阳和电灯的直射光线以外,光线碰到物体以后,还会再次反射,折射,而再次反射折射的过程中,又会被其他…

【pyqt5学习】——groupBox显示matplotlib图像

目录 一、导入模块 二、创建matplotlib窗口类 三、qt_designer设计窗口 四、逻辑代码 五、结果展示 一、导入模块 import matplotlibmatplotlib.use("Qt5Agg") from matplotlib.backends.backend_qt5agg import FigureCanvasQTAgg from matplotlib.figure impor…

杭电1027Ignatius and the Princess II模拟

地址:http://acm.hdu.edu.cn/showproblem.php?pid1027 题目: Problem DescriptionNow our hero finds the door to the BEelzebub feng5166. He opens the door and finds feng5166 is about to kill our pretty Princess. But now the BEelzebub has t…