域添加另一台机器_巨杉Tech | SequoiaDB数据域概念解读与实践

近年来,银行各项业务发展迅猛,客户数目不断增加,后台服务系统压力也越来越大,系统的各项硬件资源也变得非常紧张。因此,在技术风险可控的基础上,希望引入大数据技术,利用大数据技术优化现有IT系统实现升级改造,搭建一个统一存储和管理历史、近线数据的服务平台,同时能够对外支持高并发、低延时的数据查询服务,以提高IT系统的计算能力,降低IT系统的建设成本,优化IT系统的服务体系,为各个业务部门提供更加优质的IT服务。这类服务平台在整个IT系统架构中实质上是一个为核心业务系统减负的系统。SequoiaDB 巨杉数据库是一款开源的金融级分布式关系型数据库,主要对高并发联机交易型场景提供高性能、可靠稳定以及无限水平扩展的数据库服务。用户可以在 SequoiaDB 巨杉数据库中创建多种类型的数据库实例,如MySQL、PostgreSQL 与 SparkSQL,以满足上层不同应用程序各自的需求。SequoiaDB巨杉数据库支持海量分布式数据存储,并且支持垂直分区和水平分区,利用这些特性可以将历史、近线数据存储到SequoiaDB中,并能够对外支持高并发、低延时的数据查询服务。目前,巨杉数据库已经成为许多银行大数据平台的一个重要组成部分,承担着历史数据平台、影像平台等多个重要业务的支撑工作。

1. 相关概念

1.1 多维分区

SequoiaDB支持水平和垂直方式分区。采用散列(hash)或范围(range)水平分区是将数据分布至多个节点,加大数据吞吐量, 加速数据查询和写入;采用范围(range)垂直分区是在一个节点内将数据逻辑划分为多个区间,每个区间作为独立的存储单元,减少查询时网络I/O, 进一步加速查询。
  • 水平分区 

散列水平分区,原理是将选择的分区键进行hash运算,根据hash值将数据分发至相应分区。范围水平分区则是直接匹配分区键和所对应的范围,存放到相应的分区。两种分区方式各有适用的场景,和运行的业务息息相关。一般不建议采用范围水平分区,除范围分区键(如月)能保证数据均衡(如每月的数据量级一致)。如图所示:e56b4c7da153e8f4bd5abba40703b6a5.png
  • 垂直分区

垂直分区是指在一个节点内集合数据按某字段,分成成多个数据段。每个范围代表一个垂直分区。数据查询、写入时自动分发至相应分区中。垂直分区极大减少硬盘数据访问,降低网络I/O,加速查询。垂直分区共享资源(同一台物理机),出发点在于将冷热数据隔离,如图所示:058b4c974f532416fe947bf657eb2090.png

1.2 复制组和域

分区组又被称为复制组,一个复制组内可以包含一个或多个数据节点(或编目节点),节点之间的数据使用异步日志复制机制,保持最终一致。域(Domain)是由若干个复制组(ReplicaGroup)组成的逻辑单元。每个域都可以根据定义好的策略自动管理所属数据,如数据切片和数据隔离等。以3台服务器为例,每台服务器9块磁盘。复制组的物理部署和域的逻辑组成如图所示:496a7f078768be9021fb2b779373207a.png采用3副本,按磁盘部署数据节点,每台机器部署9个数据节点,3台机器横向组成数据组,共9个数据组。如图域1包括数据组1-3,域2包括数据组5-9,域3包括数据组1-6,因此域在逻辑上由数据组组成,并且组成的数据组可以重叠。

2. 域的使用场景

随着用户的增加、业务的发展,银行业务系统的数据量越来越大,而且原有系统绝大部分基于关系型数据构建,表结构复杂,每个查询都需要关联若干张大数据表,导致关联查询的性能非常低。因此可以利用SequoiaDB存储海量历史、近线数据并开发数据查询统一入口,按照数据生命周期管理的规则对历史、近线数据进行统一在线存储。另外平台提供高并发、实时查询服务,解决了关系型数据库海量数据关联查询性能慢的问题。

根据业务系统历史、近线数据的需求,建立历史、近线数据存储区用于存储从源系统直接导入的原始数据,包括超出生产系统保存期限的数据以及需要按时点备份的数据。同时为提供在线、中高并发,小结果集的数据处理能力,可根据源系统不同划分多个存储区域,集群内部使用划分数据域的方式进行分类管理。

2.1 水平扩展集群

SequoiaDB 在集群的管理上定义了数据域概念,一个数据域可以将多个数据组包含进来。一个集群可以根据不同的业务系统来划分不同的数据域,不仅实现将不同业务系统数据在物理层面的隔离存储,同时也实现了不同业务系统数据的统一调度管理,而且以后的集群扩容也可以根据域的使用需求而只针对此域进行集群扩容。

所以在进行扩容时,我们需要结合 SequoiaDB 数据域和业务系统需求进行扩容规划及实施。结构化数据在扩容时,可针对结构化数据所在数据域增加数据组再进行数据均衡切分到新扩容的机器上或者使子表所属数据组在新扩容机器的数据组上;非结构化数据表创建时所属数据组直接指定到新扩容机器的数据组上。

2.2 隔离业务

根据数据调研信息对业务系统进行分类,以确定业务系统的存储量、并发大小、数据生命周期等,为结构化数据在巨杉数据库中的存储规划提供信息支撑。业务系统结构化数据存储到巨杉数据库可利用数据域技术对业务系统的数据区域进行功能划分,具体划分方式如下:

  • 海量数据或者高并发查询业务系统

这类业务系统的特点是业务查询并发较大,数据所占存储空间较大,对cpu、内存、网络要求较高,利用域对这类系统进行隔离,可以使数据在写入、读取时充分利用集群中域所在机器的物理资源以提升性能。

  • 数据量较小或者查询并发数较小的业务系统

这类业务系统一般对cpu、内存、网络要求较低,所占存储空间较小。因此这类系统可以和其他并发、所占存储较小的业务系统的数据域共享数据组以节省机器资源。

  • 结构化与非结构化数据进行物理隔离

对业务系统的结构化数据和非结构化分开存储,即结构化数据存储的数据组与非结构化数据的数据组不相同,防止在同一个数据组中高并发写入、读取时产生的IO争用。

  • 跑批业务系统和数据量较大系统进行物理隔离

银行部分业务系统存在夜间以跑批的方式将非结构化数据通过接入平台写入到巨杉数据库中,这类系统在跑批会产生大量的网络请求和IO,对服务器的流量和磁盘IO有较高要求,可以对这些系统进行物理隔离,在规划时应该利用域进行物理隔离并且域中的数据组不共享,使其独占集群中部分硬件资源提升跑批性能。

3. 域的使用命令

3.1 创建域

创建一个域,域中可以包含若干个复制组(Replica Group):
db.createDomain( <name>, <groups>, [options] )
创建一个域,包含两个复制组:
db.createDomain( 'mydomain', [ 'group1', 'group2' ] )

创建一个域,包含两个复制组,并且指定自动切分。

db.createDomain( 'mydomain', [ 'group1', 'group2' ], { AutoSplit: true } )

3.2 列出域

枚举系统中所有由用户创建的域。
db.listDomains()

3.3 获取指定域

db.getDomain( <name> )

3.4 删除域

db.dropDomain( <name> )
删除一个之前创建的域:
db.dropDomain( 'mydomain' )
删除一个包含集合空间的域,返回错误:
> db.dropDomain( 'hello' )(nofile):0 uncaught exception: -256> getLastErrMsg( -256 )Domain is not empty

3.5 更改域的属性

domain.alter( <options> )
示例1:1.首先创建一个域,包含两个复制组,开启自动切分
var domain = db.createDomain( 'mydomain', ['data1', 'data2'], { AutoSplit: true } )v
2.从域中删除一个复制组 data2,添加另一个复制组 data3,最后域中包含 data1 和 data3 两个复制组
domain.alter( { Groups: ['data1', 'data3'] } )
示例2:1.首先创建一个域,包含一个复制组,复制组中包含表 foo.bar。
 var domain = db.createDomain( 'mydomain', ['group1'] )
2.从域中删除原复制组,添加另一个复制组,将因把拥有数据的 group1 从域中删除而报错
domain.alter( { Groups: ['group2'] } )(nofile):0 uncaught exception: -256Domain is not empty

3.6 查询表所属域

var catalog=new Sdbcatalog.SYSCAT.SYSCOLLECTIONSPACES.find({“NAME”:”bs_customer”}

4. 操作环境

这一章将通过一个具体的例子来演示如何通过数据域和多维分区存放不同时间周期的数据。4.1 环境说明操作演示环境包含6台主机,主机名分别为:sdb01, sdb02,sdb03 和 sdb04, sdb05, sdb06。一共有6个数据组,其中:group1,group2,group3这三个数据组在sdb01,sdb02和sdb03这三台机器上,剩下的group4,group5,group6在sdb04,sdb05和sdb06这三台机器上,见下图:

1aa91535e22a30a0cd75c0a3316c4d97.png

f164fe26c35b5b16d63c85c8727e6cd7.png

c881337c964ad619ed01f2f5caaeef52.png

c54a4ebd6de1419c4ecf9176bdafd0d0.png

83b42c0c626583600fcd002538ecb0e1.png

c0f85b4d7ea8db745f58aef038cd7f26.png

4.2 创建数据域

在sdb上创建两个数据域d2018和d2019。其中,d2018对应group1,group2和group3这三个数据组,d2019对应group4,group5和group6这三个数据组。
db.createDomain("d2018",["group1","group2","group3"])db.createDomain("d2019",["group4","group5","group6"])

2d3d20f2533c396ec3999522a71f0022.png

4.3 创建多维分区表

创建一个多维分区表,包含一个用户余额主表user_amout和两个用户余额子表 user_amout2018, user_amout2019。其中,user_amout2018对应数据域d2018,user_amout2019对应数据域d2019。
  • 在sdb上创建集合空间和集合

db.createCS("user_all")db.createCS("user_2018",{Domain:"d2018"})db.createCS("user_2019",{Domain:"d2019"})db.user_all.createCL("user_amount",{ShardingKey:{acct_mon:1},ShardingType:'range',IsMainCL: true,EnsureShardingIndex:false})db.user_2018.createCL("user_amount2018",{ShardingKey:{user_id:1},ShardingType:'hash',EnsureShardingIndex:false,AutoSplit:true});db.user_2019.createCL("user_amount2019",{ShardingKey:{user_id:1},ShardingType:'hash',EnsureShardingIndex:false,AutoSplit:true});db.user_all.user_amount.attachCL("user_2018.user_amount2018",{LowBound:{acct_mon:{$date:"2018-01-01"}},UpBound:{acct_mon:{$date:"2019-01-01"}}});db.user_all.user_amount.attachCL("user_2019.user_amount2019",{LowBound:{acct_mon:{$date:"2019-01-01"}},UpBound:{acct_mon:{$date:"2020-01-01"}}});

3323c18524a8d2c5aeedc3dcb73f7a2e.png

4d54f8169c7f318691d45b7665338b59.png

  • 在mysql上创建表

create database user_all;use user_all;create table user_amount ( user_id int not null ,   acct_mon date  not null ,   amount int not null )COMMENT="sequoiadb:{table_options:{ShardingKey:{acct_mon:1},ShardingType:'range',IsMainCL: true,EnsureShardingIndex:false}}" ;

f5f2a949d824f40ad2f0595348aa4b7c.png

4.4 往多维分区表中导入不同时间周期的记录

insert into user_amount values(1001,'2018-05-01',1000);insert into user_amount values(2001,'2018-07-01',3000);insert into user_amount values(3001,'2018-09-01',5000);insert into user_amount values(1001,'2019-05-01',2000);insert into user_amount values(2001,'2019-07-01',6000);insert into user_amount values(3001,'2019-09-01',9000);

95282b1201ea91859fb517a2bf7530f4.png

4.5 检查各个数据节点上的数据

db = new Sdb("sdb01",11830)db.user_2018.user_amount2018.find()db = new Sdb("sdb01",11840)db.user_2018.user_amount2018.find()db = new Sdb("sdb01",11850)db.user_2018.user_amount2018.find()db = new Sdb("sdb04",11860)db.user_2019.user_amount2019.find()db = new Sdb("sdb04",11870)db.user_2019.user_amount2019.find()db = new Sdb("sdb04",11880)db.user_2019.user_amount2019.find()

24bc017b1536cf614682ce822e90d7d2.png

16954d135fa88dae64b0fe71dfde5054.png

5f96df9414fae996ef8fbb4d1ee66ff5.png

6f702f3471d4bbf4ea49af4f76554999.png

从上述截图可以看出,user_id为2001和3001的用户,其2018年的余额数据在11830这个数据节点上,该节点对应数据组group1,部署在sdb01,sdb02和sdb03这三台主机上。这两个用户2019年的余额数据部署在11860这个数据节点上,该节点对应数据组group4,部署在sdb04,sdb05和sdb06这三台主机上。user_id为1001的用户情况类似,其2018年的余额数据部署在sdb01,sdb02和sdb03这三台主机上,其2019年的余额数据部署在sdb04,sdb05和sdb06这三台主机上。

从上述操作演示可以看出,通过数据域可以很方便的将不同时间周期的数据存放到不同的主机上。当2020的数据即将生成时,只需在新扩的主机上创建相应的子表,然后在挂载到主表user_amount上,即可存放2020年的用户余额数据。

7c36854e06ec3b68d7134f0d94f1fc95.png往期技术干货

巨杉内核笔记 | MVCC多版本控制原理

巨杉内核笔记 | 分布式事务漫谈巨杉内核笔记 | 会话(Session)

巨杉Tech | SequoiaDB高可用原理详解

巨杉Tech | 分布式数据库负载管理WLM实践

巨杉Tech | 巨杉数据库的HTAP场景实践

巨杉Tech | SequoiaDB SQL实例高可用负载均衡实践

巨杉Tech | 并发性与锁机制解析与实践

巨杉Tech | 几分钟实现巨杉数据库容器化部署

巨杉Tech | “删库跑路”又出现,如何防范数据安全风险?

巨杉Tech | 分布式数据库千亿级超大表优化实践

社区分享 | SequoiaDB + JanusGraph 实践

巨杉Tech | 巨杉数据库的并发 malloc 实现

巨杉数据库v5.0 Beta版正式发布

巨杉数据库无人值守智能自动化测试实践

巨杉Tech | 读写分离机制与实践巨杉Tech | 巨杉数据库数据高性能数据导入迁移实践

09dc2ca65c2e9b57e2c002ee0690c749.png

e1f312b5253c4e41961797882e005ffd.png

1c3043a1e68987a69f36e8b25161e069.png

点击,获取更多精彩内容

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

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

相关文章

推荐一个接口文档工具

ShowDoc 转载于:https://www.cnblogs.com/LW-baiyun/p/8003975.html

云计算的概念_云计算概念掀起涨停潮 美利云奠定板块龙头地位

温馨提示&#xff1a;股市风险时刻存在&#xff0c;文中所提个股仅为个人观点&#xff0c;请勿盲目跟随操作&#xff0c;笔者希望大家都做到不贪婪&#xff0c;不恐惧&#xff0c;不瞎猜&#xff0c;不跟风做一个纪律严明轻松淡定的股票交易者。社4月26日讯&#xff0c;沪深两市…

Python 第三方模块之 PDFMiner(pdf信息提取)

PDFMiner简介 pdf提取目前的解决方案大致只有pyPDF和PDFMiner。据说PDFMiner更适合文本的解析&#xff0c;首先说明的是解析PDF是非常蛋疼的事&#xff0c;即使是PDFMiner对于格式不工整的PDF解析效果也不怎么样&#xff0c;所以连PDFMiner的开发者都吐槽PDF is evil. 不过这些…

TFS2017持续发布中调用PowerShell启停远程应用程序

目前团队项目中有多个Web、服务以及与大数据平台对接接口等应用&#xff0c;每次的发布和部署采用手工的方式进行。停止应用程序&#xff0c;拷贝发布包&#xff0c;启动应用程序&#xff0c;不停的循环着&#xff0c;并且时不时地会出现一些人为错误性问题。这种模式消耗的很多…

Flask 多线程

参数 app.run()中可以接受两个参数&#xff0c;分别是threaded和processes&#xff0c;用于开启线程支持和进程支持。 threaded&#xff1a; 是否开启多线程&#xff0c;默认不开启。 if __name__ __main__:app.run(threadedTrue)processes&#xff1a;进程数量&#xff0c…

基于LVS对LAMP做负载均衡集群

一、简介 LVS是Linux Virtual Server的简称&#xff0c;也就是Linux虚拟服务器, 是一个由章文嵩博士发起的自由软件项目&#xff0c;它的官方站点是www.linuxvirtualserver.org。现在LVS已经是 Linux标准内核的一部分&#xff0c;在Linux2.4内核以前&#xff0c;使用LVS时必须要…

Python_Day1

1、猜年龄游戏&#xff1a; &#xff08;1&#xff09;&#xff1a;每循环3次&#xff0c;counter值返回为0&#xff0c;重新开始循环&#xff1b;&#xff08;2&#xff09;&#xff1a;continue 意思是跳出当前循环&#xff1b;&#xff08;3&#xff09;&#xff1…

kafka 入门

初识 Kafka 什么是 Kafka Kafka 是由 Linkedin 公司开发的&#xff0c;它是一个分布式的&#xff0c;支持多分区、多副本&#xff0c;基于 Zookeeper 的分布式消息流平台&#xff0c;它同时也是一款开源的 基于发布订阅模式的消息引擎系统。 Kafka 的基本术语 消息&#xf…

实体词典 情感词典_tidytextpy包 | 对三体进行情感分析

腾讯课堂 | Python网络爬虫与文本分析TidyTextPy前天我分享了 tidytext | 耳目一新的R-style文本分析库 但是tidytext不够完善&#xff0c;我在tidytext基础上增加了情感词典&#xff0c;可以进行情感计算&#xff0c;为了区别前者&#xff0c;将其命名为tidytextpy。大家有时间…

Python基础第一天

一、内容 二、练习 练习1 题目&#xff1a;使用while循环输出1 2 3 4 5 6 8 9 10 方法一&#xff1a; 图示&#xff1a; 代码&#xff1a; count 1 while count < 11:if count ! 7:print(count)count 1输出结果&#xff1a; 1 2 3 4 5 6 8 9 10 View Code方法二&#xff1…

vaOJ10369 - Arctic Network

1 /*2 The first line of each test case contains 1 < S < 100, the number of satellite channels!3 注意&#xff1a;S表示一共有多少个卫星&#xff0c;那么就是有 最多有S-1个通道&#xff01; 然后将最小生成树中的后边的 S-1通道去掉就行了&#xff01; 4…

在ffmpeg中加入x264模块

引言&#xff1a;最近一直致力于多媒体应用开发&#xff0c;一说起编码解码就不得不说下FFmpeg。FFmpeg是一个集录制、转换、音/视频编码解码功能为一体的完整的开源解决方案。FFmpeg的开发是基于Linux操作系统&#xff0c;但是可以在大多数操作系统中编译和使用。下面就详细介…

RabbitMQ实例教程:发布/订阅者消息队列

消息交换机&#xff08;Exchange&#xff09; RabbitMQ消息模型的核心理念是生产者永远不会直接发送任何消息给队列&#xff0c;一般的情况生产者甚至不知道消息应该发送到哪些队列。 相反的&#xff0c;生产者只能发送消息给交换机&#xff08;Exchange&#xff09;。交换机的…

OAuth 2.0(网转)

&#xff08;一&#xff09;背景知识 OAuth 2.0很可能是下一代的“用户验证和授权”标准&#xff0c;目前在国内还没有很靠谱的技术资料。为了弘扬“开放精神”&#xff0c;让业内的人更容易理解“开放平台”相关技术&#xff0c;进而长远地促进国内开放平台领域的发展&#xf…

kafka 自动提交 和 手动提交

Consumer 需要向 Kafka 汇报自己的位移数据&#xff0c;这个汇报过程被称为提交位移&#xff08;Committing Offsets&#xff09;。因为 Consumer 能够同时消费多个分区的数据&#xff0c;所以位移的提交实际上是在分区粒度上进行的&#xff0c;即 Consumer 需要为分配给它的每…

前端之 JavaScript 常用数据类型和操作

JavaScript 常用数据类型有&#xff1a;数字、字符串、布尔、Null、Undefined、对象 JavaScript 拥有动态类型 JavaScript 拥有动态类型。这意味着相同的变量可用作不同的类型 var x; // 此时x是undefined var x 1; // 此时x是数字 var x "Alex" …

Postgres中tuple的组装与插入

1.相关的数据类型 我们先看相关的数据类型&#xff1a; HeapTupleData(src/include/access/htup.h) typedef struct HeapTupleData {uint32 t_len; /* length of *t_data */ItemPointerData t_self; /* SelfItemPointer */Oid t_tableOid; /* ta…

Python 自动生成环境依赖包 requirements

一、生成当前 python 环境 安装的所有依赖包 1、命令 # cd 到项目路径下&#xff0c;执行以下命令 pip freeze > requirements.txt# 或者使用如下命令 pip list --formatfreeze > requirements.txt 2、常见问题 1、中使用 pip freeze > requirements.txt 命令导出…

DenyHosts 加固centos系统安全

DenyHosts是Python语言写的一个程序&#xff0c;它会分析sshd的日志文件&#xff08;/var/log/secure&#xff09;&#xff0c;当发现重 复的攻击时就会记录IP到/etc/hosts.deny文件&#xff0c;从而达到自动屏IP的功能 DenyHosts官方网站 http://denyhosts.sourceforge.net 下…

手机uc怎么放大页面_手机网站怎样做可以提高用户体验度?——竹晨网络

目前&#xff0c;手机已经占据了人们大多数的闲暇时间&#xff0c;互联网的流量开始逐渐向移动端倾斜&#xff0c;重视移动端的用户体验&#xff0c;就可以给客户端增加很多意想不到的功能。但是还是有很多公司和站长不知道手机网站应该怎么建才能符合用户的使用习惯。下面&…