初探巨杉分布式数据库
目录
- SequoiaDB基本架构
- SequoiaDB节点架构
- SequoiaDB安装体验、踩坑经历
- 部署方式
- 虚拟机部署
- 安装[^1]
- 部署
- 连接数据库
- 使用SequoiaDB
- 往数据库中插入数据
- Sdbshell (JS API演示)
- 不同的查询API之间的数据联动
- 实际应用场景(与其他业务项目的结合?)
- 思路一:上层应用↔ORM框架↔SQL Shell↔SequoiaDB
- 思路二:对象存储驱动
- 总结
网上介绍巨杉数据库的资料并不是很多。在这里记录一下我安装、使用SequoiaDB的基本流程,也算是作为使用分布式数据库的入门笔记,并尝试通过使用巨杉数据库,来理解巨杉数据库的原理。
下面引用的文字,如无说明均引自巨杉数据库官网。SequoiaDB的产品文档可以在产品文档查阅到1。
SequoiaDB基本架构
SequoiaDB是一个分布式数据库,它通过分层的形式对于不同的数据源提供了支持。后文的基础实操中验证了这一点。
SequoiaDB 巨杉数据库采用计算存储分离架构。数据库底层以支持分布式事务能力的存储节点构建可横向扩展的存储集群,上层通过创建多实例的方式提供 MySQL、MariaDB、PostgreSQL、以及 SparkSQL 的支持。除了支持结构化 SQL 实例以外,SequoiaDB 巨杉数据库还支持创建 JSON 和 S3对象存储实例。
SequoiaDB 巨杉数据库的分布式架构一方面可以提供针对数据表的无限横向水平扩张,另一方面在计算层通过提供不同类型数据库实例的方式,协议级兼容 MySQL、MariaDB、PostgreSQL 与 SparkSQL,原生支持跨表跨节点分布式事务能力,应用程序基本可以在零改动的基础上进行数据库迁移。除了结构化数据外,SequoiaDB 巨杉数据库可以在同一集群支持包括 JSON 和 S3 对象存储在内的非结构化数据,使整个数据库面向上层的微服务架构应用提供了完整的数据服务资源池。
SequoiaDB节点架构
SequoiaDB每个节点为一个独立进程,节点之间采用 TCP/IP 协议进行通讯,主要有以下三种角色:
- 协调节点
协调节点不存储任何用户数据。作为外部访问的接入与请求分发节点,协调节点将用户请求分发至相应的数据节点,最终合并数据节点的结果应答对外进行响应。- 编目节点
编目节点主要存储系统的节点信息、用户信息、分区信息以及对象定义等元数据。在特定操作下,协调节点与数据节点均会向编目节点请求元数据信息,以感知数据的分布规律和校验请求的正确性。- 数据节点
数据节点为用户数据的物理存储节点,海量数据通过分片切分的方式被分散至不同的数据节点。在关系型与 JSON 数据库实例中,每一条记录会被完整地存放在其中一个或多个数据节点中;而在对象存储实例中,每一个文件将会依据数据页大小被拆分成多个数据块,并被分散至不同的数据节点进行存放。
真正的集群是由多个负责不同功能的主机协调完成分布式的任务,从而实现高可用、支持高并发等的分布式数据库的设计目标。这里节点的含义我认为跟Hadoop等大数据集群中的“节点”差不多,例如Spark的 local[*]
模式也是用多线程模拟不同的节点,这三个角色设计的功能不同,所以它们在意外故障恢复时的策略也不一样。如协调节点不存储用户数据,直接重启即可。
对于分布式引擎的更多细节,可参阅分布式引擎。
SequoiaDB安装体验、踩坑经历
我本人比较喜欢通过动手实践来研究一个系统,因此接下来是我体验安装SequoiaDB并尝试研究数据库原理的过程。
部署方式
巨杉数据库SequoiaDB提供了多种部署方式:
- 线上主机(练习用 )
- Docker 镜像容器部署
- VMWare Workstation、VirtualBox镜像
- 伪集群模式部署
- 独立模式部署
- 集群模式部署
伪集群模式部署跟独立模式部署的区别在于,伪集群是创建三个数据组,每个数据组单副本,并创建一个 MySQL 实例,所有这些节点都创建在同一主机中(跟Hadoop的伪集群模式差不多,方便在本机测试分布式节点的运行情况),而独立模式需要启动一个独立模式的数据节点,即可提供数据服务,该模式中所有信息都存放在数据节点,不存在编目信息,只支持JSON API。但是显然这两种模式都只适合在开发环境下使用,在实际生产中还是需要部署到分布式节点上以实现fault tolerant、高并发等的特性。
注意:不同安装方式提供的SequoiaDB版本可能是旧的3.x版本,文档有时候默认显示的也是3.x版本,如果需要尝试5.x版本请选择好版本下载软件包自行部署!
虚拟机部署
综合比较之下,我使用VMWare下的Ubuntu虚拟机+安装SequoiaDB软件包+PostgreSQL实例+伪集群部署模式来安装SequoiaDB。
- 配置好VMWare、Ubuntu环境,下载软件包
建议在往虚拟机导入完安装包之后,在正式开始任何安装流程之前,先保存此刻虚拟机的快照! 由于文档说明并不是特别清晰,很容易会出现操作失误。借助快照,万一任何一个流程做错了还可以回退到初始状态快照重新尝试,避免直接把虚拟机搞坏了。
- 安装
libncurse5
、net-tools
(netstat
命令)
安装2
这一步需要安装SequoiaDB软件和Postgres/MySQL。
实际的软件部署提供了从setup.sh
一键安装、图形化安装、命令行安装等方式。实验下来,推荐setup.sh
一键安装的方式。具体流程可以参考数据库安装。手动点击安装另外2个安装包也是可以的。
部署
安装完成之后需要部署3。可以用cd /opt/sequoiadb && ./tools/deploy/quickDeploy.sh
快速实现部署。部署之后能生成伪集群模式的SequoiaDB数据库实例。这个SequoiaDB实例包含数据库的实例、协调节点、编目节点、数据分区、时间序列协议节点等部分。
连接数据库
这一步是关键,否则在前两步完成之后只会得到一个可以使用的普通的关系型数据库。具体过程可以参考PostgreSQL 实例>操作>连接 或者MySQL 实例>操作>连接。
对于Postgres,实际上是通过Foreign Data Wrapper连接到SequoiaDB。
create server sdb_server foreign data wrapper sdb_fdw options(address '127.0.0.1', service '11810', preferredinstance 'A', transaction 'off');
通过创建Foreign Table来访问SequoiaDB集合空间中的数据。
create foreign table test (name text, id numeric) server sdb_server options ( collectionspace 'sample', collection 'employee', decimal 'on' );
使用SequoiaDB
接下来文档就演示了一些基础的CRUD以及psql与sdbshell之间的联动。4
往数据库中插入数据
数据库可以正常CRUD,这本身包含了一个正常的关系型数据库实例。首先插入一些数据。
查询表中的所有数据。
Sdbshell (JS API演示)
sdbshell是一个简易的JS API工具,可以用JS语法操作SequoiaDB。
查看employee中的所有对象数据:
不同的查询API之间的数据联动
在前文提到,SequoiaDB是分布式数据库,对不同的数据库等提供了支持。这一点可以体现在可以从SQL Shell和sdbshell中联动数据查询的结果。
假设SequoiaDB一个集合空间(数据表)是文档中的sample.employee,已经存有2条记录
此时从psql(PostgreSQL shell)中也能查询到这两条记录。
假如再插入一条新的记录
则psql和sdbshell都能实时反映这条新的记录。这说明SequoiaDB建立了一个统一的数据存储平台,打通了不同查询API(如SQL、JS API等)之间的差异,通过不同的查询API都能够查询到相同的数据(当然形式根据不同API有所区别)。不难猜想,在实际开发中将会带来很大便利,使用不同API的上层业务可以直接使用相应的API即可对于数据库进行操作,而无需通过各种转换接口来实现,降低了开销。
实际应用场景(与其他业务项目的结合?)
文档编写到上面sdbshell和SQL shell的基础联动就结束了。
但是我们在写前后端项目的时候都知道,一般来说项目不会直接调用命令行环境的Shell,调用psql
命令或者mysql
查询数据再从stdin
、stdout
的机制读取返回数据到其他系统,而是通过MyBatis
、JPA
等等的框架与数据库通信去查询。由此衍生出的一些问题,在文档中看起来没有得到解答:
- 在真正业务中使用的时候,上面的联动机制如何结合到项目代码中?
- 其他项目如何通过SequoiaDB提供的接口与SequoiaDB进行交互?
- JS API和SQL API如何结合到真正的系统中?
- 基于别的编程语言的系统如何结合SequoiaDB使用?
- 在SequoiaDB 5.2(目前官网尚未提供下载)中还实现了实时数据湖的架构,如何体现?
思路一:上层应用↔ORM框架↔SQL Shell↔SequoiaDB
由于文档没有进一步说明,我推测一种思路是:SequoiaDB通过像foreign table和连接器等的机制,提供了从SQL Shell、SparkSQL、FlinkSQL读取数据的功能,因此可以使用MyBatis
、JPA
这些SQL查询框架的接口或者Spark的java驱动包通过项目连接数据库、Spark或Flink的方式去间接地和SequoiaDB的数据进行交互。
尝试用一个Spring小项目来验证。代码很简单,主要的Entity
、Repository
、Controller
代码如下,并配置好Spring与PostgreSQL数据库的连接。
@Entity(name = "test")
data class People (@javax.persistence.Id@GeneratedValue(strategy = GenerationType.AUTO)@Column(name = "id", nullable = false)var id: Long? = 0,var name: String = "") {}interface PeopleRepository: CrudRepository<People, Long> {}@RestController
@RequestMapping("/data")
class DataController(val peopleRepository: PeopleRepository) {@GetMappingfun getData(): MutableIterable<People> = peopleRepository.findAll()
}
启动Spring,查询此刻数据库中的数据,两边都显示有2条记录。
插入数据
Spring系统和SequoiaDB的JS API能实时查询到有3条记录。
从结果数量有变化上来说,这能够说明SequoiaDB可以结合到其他项目中。在图中,前端显示的是2、3个null
,这可能是Spring的JPA框架与PostgresSQL Foreign Table参数还没有设置正确,由于这个思路引入了Spring和ORM框架,带来了新的复杂组件(如ORM框架的SQL复杂的生成机制难以调优),难以排查具体的问题,而且在测试插入数据的时候会报错,所以这种思路只能是理论上可行。
思路二:对象存储驱动
在写完此文过了一段时间之后,发现JSON实例>驱动文档记录了不同语言的驱动与SequoiaDB直接交互的方式。
String connString = "192.168.1.2:11810";
try {Sequoiadb sdb = new Sequoiadb(connString, "", "");CollectionSpace db = sdb.createCollectionSpace("space");DBCollection cl = db.createCollection("collection");// 创建一个插入的 bson 对象BSONObject obj = new BasicBSONObject();obj.put("name", "tom");obj.put("age", 24);cl.insert(obj);
} catch (BaseException e) {System.out.println("Sequoiadb driver error, error description:" + e.getErrorType());
}
// 创建包含插入信息的 bson 对象
BSONObj obj ;
obj = BSON ( "name" << "tom" << "age" << 24 ) ;
// 将此 bson 对象插入集合中
collection.insert ( obj ) ;
通过这种方式不需要经过ORM框架和SQL Shell的中转,而是在各种语言中操作BSON(Binary JSON)对象。这使得在实际项目中不容易受到像ORM框架等不透明的组件机制影响,直接在语言级别提供了操作SequoiaDB的API和基础设施。
总结
巨杉数据库已经在超过100家金融银行业的生产系统规模使用5,这说明Sequoia系统的可靠性还是很有保障的,也得到了大规模应用。
这篇文章是对于SequoiaDB的初步介绍和借助文档初步探索SequoiaDB的记录,实践了系统安装、初步的多模数据使用查询、探索如何与实际项目的结合等的流程。从这次的使用体验上说,SequoiaDB建立了一个统一的数据底座,各种业务和平台都可以直接将数据存储到SequoiaDB中,并使用各种API进行查询,这为后续企业挖掘利用业务数据提供了可能性。
但由于文档的记述不够明晰,对于很多细节还有待具体探索和观察(比如协调节点、编目节点、数据节点具体的工作细节等、故障发生的场景SequoiaDB分布式系统如何恢复等等)。在最新的SequoiaDB 5.2中实现了湖仓一体、多模数据库容灾等新的特性,由于个人测试无法达到像真正业务一样的大体量数据,故在本文中也并未体现这些最新的特性,这可以在以后的接触中再慢慢学习。
最后,巨杉数据库的文档还有很多的提升空间,在这里建议巨杉数据库的文档可以改写组织得更加清晰易懂,更方便用户查阅。
巨杉的产品文档和Vue 3、Mapbox、PyTorch等等的文档还有一定差距,有种支离破碎的感觉,主题相近的文档散落在不同地方,需要反复翻阅才能将脉络提炼出来,希望这一点可以改进。 ↩︎
这一步也容易踩坑。对于这几个安装包,官网还有自带的安装包中也没有任何的说明。安装软件过程中的说明也是非常有限。有可能需要重复几次才能正确安装。 ↩︎
对于这一步,文档也是没有明确说明的。官网文档隐含的意思是需要安装,然后部署,才能正常使用SequoiaDB。 ↩︎
文档演示的场景实在有些匮乏了。 ↩︎
见https://www.sequoiadb.com/cn/。 ↩︎
初探巨杉分布式数据库相关推荐
- 巨杉分布式数据库在民生银行的使用
数据库是银行金融行业不可或缺的「数据基础设施」,随着银行业务的快速发展,特别是在金融科技的持续创新驱动下,针对多类型数据进行综合处理.本期案例分享特别邀请到来自民生银行信息科技部的史国畅,给大家分享民 ...
- 分布式数据库发展历程SequoiaDB 简介
一.应用程序开发向分布式转型 二.数据库如何应对微服务应用框架 集中式存储 数据紧耦合 无法弹性扩张 单点故障 碎片化存储 数据碎片化 数据无共享 运维成本高 分布式存储 微服务对应独立实例 物理分散 ...
- 数据 3 分钟 | 多家数据库厂商联合发布《分布式数据库发展路径研究》报告、巨杉数据库公布 2021 春季发布会时间...
数据 3 分钟 由 ACDU (中国 DBA 联盟) 与墨天轮联合出品的全新视频节目上线啦-三分钟带你来了解数据行业动态,节目内容主要包含数据行业最新的产品发布.公司大事件.行业新闻等.每周五更新,不 ...
- 巨杉数据库 CTO 王涛:新一代分布式数据库
2019数据技术嘉年华于11月16日在京落下了帷幕.大会历时两天,来自全国各地上千名学术精英.数据库领袖人物.数据库专家.技术爱好者在这里汇聚一堂,围绕"开源 • 智能 • 云数据 - 自主 ...
- 巨杉数据库完成数亿元D轮融资,引领金融级分布式数据库发展
金融级分布式数据库领导者巨杉数据库,于近期完成数亿元人民币D轮融资,本轮融资由中金资本领投,元禾重元与越秀产业基金跟投. 巨杉数据库是国内最早布局分布式数据库产品的公司,自2011年成立起,9年来一直 ...
- 分布式数据库技术金融应用规范3项标准出炉,巨杉数据库参与制定
近日,中国人民银行正式发布<分布式数据库技术金融应用规范 技术架构>(JR/T 0203-2020).<分布式数据库技术金融应用规范 安全技术要求>(JR/T 0204-202 ...
- 【巨杉数据库SequoiaDB】巨杉再获企业级认可,分布式数据库领跑“一亿中流”
据全球最具权威的IT研究与顾问咨询公司 Gartner 预测,DBMS(数据库管理系统)市场从2017年到2018年增长了18.4%,达到461亿美元,这是有史以来最大幅的增长,并有望在2019年超过 ...
- 巨杉数据库入围 IDC Innovator榜单,获评分布式数据库创新者
近日,巨杉数据库凭借「湖仓一体」分布式数据库在金融领域的创新应用获得 IDC Innovator 中国分布式数据库创新者殊荣.值得一提的是,这也是IDC在数字化转型盛典会议中首次面向方案提供商颁发奖项 ...
- 巨杉TechDay回顾 | 微服务下的分布式数据库架构演进与实践
内容整理自2019年6月2日巨杉TechDay技术沙龙活动. 演讲概述 当前,微服务架构已经成为应用架构转型的主流方向.本次分享,将深入解析在应用架构微服务化的趋势下,底层数据架构如何演进,分布式数据 ...
- 对话巨杉核心研发团队:分布式数据库自研之路
一直以来,数据库的核心研发团队都十分神秘,作为隐藏在幕后的隐士高人,他们对数据库发展以及数据库研发团队的看法是什么呢?本文我们就由巨杉数据库核心技术研发团队的"老司机",向大家分享 ...
最新文章
- linux 下 vi 块编辑
- 基于MD5的增强型摘要算法
- 机器人学习--ROS/AMCL实现初始化粒子撒满整张地图和分步收敛
- VTK:深度优先搜索动画用法实战
- Flink SQL解析复杂Join(转载+自己整理和补充)
- 【活动(深圳)DevOps/.NET 微服务 秋季分享会】火热报名中!
- python将txt转json_Python控制乐高EV3,以及VSCODE环境配置
- linux php 执行python,Linux(Ubuntu)下php使用exec调用python程序返回json数据
- 《天天数学》连载39:二月八日
- 7nm芯片计划受挫 英特尔股价周五收盘暴跌16.24%
- Python自动化测试的学习笔记
- Redis入门之 redis set集合的操作
- 十步完成windows服务的安装
- 【JAVA单元测试】单元测试模拟高并发操作
- 市场调查有什么好的选题推荐么?
- Unity 导入图片安卓和IOS自动转换格式ETC2或者ASTC
- Sphinx 简单应用
- 项目管理中如何制定项目目标
- grub2详解(翻译和整理官方手册)
- 毕业论文的前言写什么?
热门文章
- Android高德地图点击大头针更换大头针图片
- HTML超链接实现页面内跳转
- 台式计算机刚换的显示屏怎么设置,如何设置双屏显示(笔记本电脑双屏切换的快捷键)...
- clustalw序列比对_序列比较中ClustalW和BLAST的区别
- AD中生成交互式BOM,方便手工焊接及贴片
- Allegro_SMT手工焊接辅助程序
- [Java]一个WiFi管理器(获取WiFi连接的网关的ip和信息)和热点管理器(获取连接本机的热点的设备的ip、MAC和信息)
- html的color粉颜色,HTML颜色一览(color)
- 微信直播监控服务器,HTML5微信网页调用监控直播代码接口文档v3.02
- cesium加载OSM在线地图