- VisualStudio2022插件的安装及使用-编程手把手系列文章
- pprof-在现网场景怎么用
- C#实现的下拉多选框,下拉多选树,多级节点
- 【学习笔记】基础数据结构:猫树
本文分享自华为云社区《【GaussTech速递】技术解读之GaussDB多租技术》,作者:GaussDB数据库.
随着云计算时代的到来,多租户的概念也逐渐广为人知。“多租户”使得租户之间可以共享物理资源,能够帮助用户节约硬件成本和运维成本,提高资源利用效率。同时,在实现的过程中,考虑到共享带来的安全、隔离等问题以及后续业务面临的扩展需求,“多租户”在隔离性和扩展性方面也进行了相应的设计实现.
那么,在数据库领域是如何实现“多租户”呢?
业界有虚拟机多租、容器多租、数据库内核多租等多种技术可以实现多租户.
虚拟机多租和容器多租,顾名思义就是在一台物理服务器上部署多个虚拟机或者容器,然后在虚拟机或者容器内进行数据库服务的部署。这类技术方案在安全性和隔离性方面具有天然的优势.
数据库内核多租,是由数据库内核提供的多租户特性。相比于虚拟机多租和容器多租,内核多租没有虚拟化管理层、OS(Operating System,简称操作系统)层、数据库公共层的额外开销,而且底噪小,在资源整合、资源的弹性伸缩等方面具备天然优势。数据库内核多租通过将数据库内核语义与成熟的资源隔离技术栈相整合,实现更高的Scale-Down(缩容)能力,极大地提升了数据库在计算资源方面的利用率.
GaussDB支持被部署在虚拟机或者容器内,给客户提供整体虚拟机/容器多租的解决方案,同时也提供了数据库内核多租特性,满足客户不同业务场景的需求.
本文将对GaussDB数据库内核集中式场景下提供的多租技术进行重点介绍.
GaussDB多租是指在一个数据库实例中划分出多个逻辑处理单元,我们称这个逻辑单元为PDB(pluggable database),每个PDB具备物理数据库的绝大多数能力,同时相互隔离.
在数据库初始化时,会生成一个template pdb作PDB创建的模板.
集群内可以创建多个资源计划,每个资源计划下挂载多个plan directive,每个plan directive对应一个PDB,PDB通过plan directive配置自己的资源规格,包括CPU、内存、IO等.
图1 GaussDB多租架构 。
一个PDB归属于一个独立的业务或公司。独立的业务或公司可以连接到自己的PDB运行数据库业务.
多租户架构的目的是为了让多用户或者多业务使用同一套数据库集群,PDB数据的隔离性是实现该架构的基础.
假设同一个公司的两个业务共享同一个数据库实例,业务A的相关数据可以被业务B查看,这是完全不可接受的行为.
GaussDB数据库的PDB之间数据完全隔离,实现租户数据完全独立、互不干扰,保障租户数据的安全隐私:
(1)每个PDB除了有自己的表、索引等对象数据,也有自己的用户、角色、表空间以及定时任务等对象.
(2)除了数据库对象,PDB的其它属性也完全隔离。比如:每个PDB有独立的兼容模式、线程组、GUC配置参数等.
图2 PDB之间数据完全隔离 。
PDB之间数据互相隔离,但用户业务开发并不需要感知是使用了一个PDB还是一个物理实例,对用户业务开发来说,使用PDB和使用物理实例的操作没有区别.
PDB资源的分配与变更由GaussDB内核接管,并不依赖任何外部组件。每个PDB可以设置自己的资源规格,包括CPU、内存以及IO.
GaussDB内核通过资源计划管理所有PDB的资源,每个资源计划包含了多个资源计划指令,每个资源计划指令设置了一个PDB的资源规格.
上层可以调用资源计划高级包接口,完成资源的分配与变更。系统中可以有多个资源计划,可以通过资源计划的切换,做到一键切换所有PDB资源规格的能力.
图3 PDB资源的变更和切换 。
每个PDB的资源使用由GaussDB内核中的资源管理模块管理。相较于将资源分配交由外部组件(虚拟机,容器等)管理,GaussDB通过实现数据库内核的自主资源分配,在保证租户资源按照配额公平使用的前提下,也可获得以下优势:
(1)提高资源利用率:租户间的后台工作整合,通过合理的调度算法,最大限度地利用系统空闲资源.
(2)内核感知资源分配,根据资源分配情况,动态调整CPU占比,内存大小以及线程池、连接池等资源,最终获得更优的整体表现.
(3)在物理机资源充足的情况下,PDB的资源变更通过SQL语句即可完成,实现资源秒级变更,业务无感知.
相比而言,目前云上虚拟机的规格变更耗费时间较长,需要先变更备机,然后主备倒换,然后进行其他变更操作,端到端时间约为:(虚拟机关机 + IaaS资源调度+新虚拟机开机+数据库拉起)X 数据库节点个数.
(4)内核中所有PDB公用一套系统资源,有效的减少了内核底噪的资源占用.
GaussDB内核多租技术的实例发放效率领先于其他的多租技术.
以虚拟机多租为例,虚拟机实例的发放需要先申请一定规格的虚拟机,然后再部署GaussDB集群,需要消耗10-30分钟或者更多的时间.
而GaussDB内核多租技术,内核中管理了PDB的创建/打开/关闭/删除。在物理机上部署GaussDB的基础上,使用几个SQL语句即可完成这些操作,秒级时间内即可实现实例的发放.
GaussDB多租支持的PDB规格配置见下表:
可以看到,GaussDB支持1U(1个CPU)级别的PDB规格,而当前虚拟机多租和容器多租一般只能提供8U级别的商用规格。这是因为:
以GaussDB为例,存在auto vacuum、慢/全量SQL收集等后台任务.
例如TPS,QPS等.
这些任务都需要消耗CPU,故虚拟机/容器实例做到更小规格(例如2U)基本不太可能。而内核多租是在GaussDB进程中划分了多个逻辑实例,所有逻辑实例共享同一份后台任务,管控的指标监控连接一次就可以收集到所有PDB的数据,大大减少了数据库底噪,因此内核多租可以很好的支持1U逻辑实例的发放.
另外,GaussDB后续会继续优化PDB规格。比如,后续计划支持1U4G的PDB规格,以满足更多客户场景的需求.
对于不需要一直运行的数据库业务,GaussDB支持关闭该业务的PDB并释放资源。关闭PDB非常简单,内核中只需要执行语句:ALTER PLUGGABLE DATABASE [pdbname] CLOSE语句即可.
PDB关闭即意味着业务无法连接到这个逻辑实例,用户可以释放PDB的CPU、内存、IO资源,对不使用的资源不计费,实现节约成本.
GaussDB在WDR(Workload Diagnosis Report 负载诊断报告)工具中适配了多租特性,可在WDR报告中查看PDB信息,以及PDB级别的SQL Statistics等性能数据视图.
(1)WDR报告中的PDB信息章节 。
(2)WDR报告SQL统计信息章节 。
如下图所示,细化的统计信息中添加了“DB Name列”,PDB归属信息会显示在该列.
(3)SQL Detail和Object Stats等章节中也添加了PDB信息,在此不一一列举.
添加了PDB信息的WDR报告,可方便DBA了解指定时间段内PDB级别的系统资源使用情况以及数据库运行情况,进行相应的运维处理.
GaussDB内核提供的多租技术特性,在安全隔离的前提下,具备更高的资源利用效率,更快的实例发放效率和资源变更效率。同时将租户相关的信息集成到WDR报告中,可以提升了客户运维的便利性。因此,客户可根据自身企业的组织结构,匹配相应的多租户配置,更高效地利用现有资源,为企业节约成本.
。
点击关注,第一时间了解华为云新鲜技术~ 。
。
最后此篇关于技术解读数据库如何实现“多租户”?的文章就讲到这里了,如果你想了解更多关于技术解读数据库如何实现“多租户”?的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
我的问题是如何在 python 中创建一个简单的数据库。我的例子是: User = { 'Name' : {'Firstname', 'Lastname'}, 'Address' : {'Street
我需要创建一个与远程数据库链接的应用程序! mysql 是最好的解决方案吗? Sqlite 是唯一的本地解决方案吗? 我使用下面的方法,我想知道它是否是最好的方法! NSString *evento
给定两台 MySQL 服务器,一台本地,一台远程。两者都有一个包含表 bohica 的数据库 foobar。本地服务器定义了用户 'myadmin'@'%' 和 'myadmin'@'localhos
我有以下灵活的搜索查询 Select {vt:code},{vt:productcode},{vw:code},{vw:productcode} from {abcd AS vt JOIN wxyz
好吧,我的电脑开始运行有点缓慢,所以我重置了 Windows,保留了我的文件。因为我的大脑还没有打开,所以我忘记事先备份我的 MySQL 数据库。我仍然拥有所有原始文件,因此我实际上仍然拥有数据库,但
如何将我的 Access 数据库 (.accdb) 转换为 SQLite 数据库 (.sqlite)? 请,任何帮助将不胜感激。 最佳答案 1)如果要转换 db 的结构,则应使用任何 DB 建模工具:
系统检查发现了一些问题: 警告:?:(mysql.W002)未为数据库连接“默认”设置 MySQL 严格模式 提示:MySQL 的严格模式通过将警告升级为错误来修复 MySQL 中的许多数据完整性问题
系统检查发现了一些问题: 警告:?:(mysql.W002)未为数据库连接“默认”设置 MySQL 严格模式 提示:MySQL 的严格模式通过将警告升级为错误来修复 MySQL 中的许多数据完整性问题
我想在相同的 phonegap 应用程序中使用 android 数据库。 更多说明: 我创建了 phonegap 应用程序,但 phonegap 应用程序不支持服务,所以我们已经在 java 中为 a
Time Tracker function clock() { var mytime = new Date(); var seconds
我需要在现有项目上实现一些事件的显示。我无法更改数据库结构。 在我的 Controller 中,我(从 ajax 请求)传递了一个时间戳,并且我需要显示之前的 8 个事件。因此,如果时间戳是(转换后)
我有一个可以收集和显示各种测量值的产品(不会详细介绍)。正如人们所期望的那样,显示部分是一个数据库+建立在其之上的网站(使用 Symfony)。 但是,我们可能还会创建一个 API 来向第三方公开数据
我们将 SQL Server 从 Azure VM 迁移到 Azure SQL 数据库。 Azure VM 为 DS2_V2、2 核、7GB RAM、最大 6400 IOPS Azure SQL 数据
我正在开发一个使用 MongoDB 数据库的程序,但我想问在通过 Java 执行 SQL 时是否可以使用内部数据库进行测试,例如 H2? 最佳答案 你可以尝试使用Testcontainers Test
已关闭。此问题不符合Stack Overflow guidelines 。目前不接受答案。 已关闭 9 年前。 此问题似乎与 a specific programming problem, a sof
我正在尝试使用 MSI 身份验证(无需用户名和密码)从 Azure 机器学习服务连接 Azure SQL 数据库。 我正在尝试在 Azure 机器学习服务上建立机器学习模型,目的是我需要数据,这就是我
我在我的 MySQL 数据库中使用这个查询来查找 my_column 不为空的所有行: SELECT * FROM my_table WHERE my_column != ""; 不幸的是,许多行在
我有那个基地:http://sqlfiddle.com/#!2/e5a24/2这是 WordPress 默认模式的简写。我已经删除了该示例不需要的字段。 如您所见,我的结果是“类别 1”的两倍。我喜欢
我有一张这样的 table : mysql> select * from users; +--------+----------+------------+-----------+ | userid
我有表: CREATE TABLE IF NOT EXISTS `category` ( `id` int(11) NOT NULL, `name` varchar(255) NOT NULL
我是一名优秀的程序员,十分优秀!