暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

多租户架构

原创 📵 2021-07-02
1452

1 多租户架构
多租户(Multitenant)架构在Oracle 12cR1中被引入,经过几年的发展,到现在的Oracle18c,多租户已经是一个很成熟的架构。
在多租户架构下,Oracle数据库作为多租户容器数据库(CDB:Container DataBase)运行,一个CDB可以包含0个、1个或者多个可插拔数据库(PDB:Pluggable DataBase)。每一个PDB之间是独立的,互不影响,但他们都接受CDB的管理,而在Oracle 12c之前的版本中,数据库都是Non-CDB架构的。

1.1 CDB中的容器

容器是多租户架构中数据或者元数据的逻辑结合。如下图1-1 CDB中的容器架构。
image.png

                                 图1-1 CDB中的容器架构

一个CDB中可以包含一下容器
一个CDB根容器(简称Root),它是每个PDB中所属的模式(Schema)、模式对象和非模式对象的组合。根容器中存储Oracle内部提供的元数据和公共用户,比如:PL/SQL包就是一种元数据。公共用户对所有容器都可见,只要公共用户有合适的权限,就可以连接和管理所有容器,包括PDB。
一个系统容器(System Container)。系统容器包含根容器和CDB中的所有PDB,它是CDB的一个逻辑容器。
零或者多个应用程序容器(Application Container)。应用程序容器由一个一个应用程序根容器(Application Root)和多个插到该容器的PDB组成。系统容器包含CDB根容器和CDB中的所有PDB,而应用程序容器只包含已插到应用程序根容器的PDB。应用程序根容器只属于CDB根容器,不属于其他容器。
零或者多个用户创建的PDB。
一个种子PDB(Seed PDB)。种子PDB是系统提供的模板,在CDB中可以使用该模板来创建洗的呢PDB。注意:我们无法对种子PDB中的对象进行添加或者修改

1.2 CDB架构的优点

Non-CDB架构中存在的问题,如果公司有数百套数据库,那么DBA管理成本将非常高,而且升级数据库、打补丁等工作非常耗时,也易出错,近几年来,硬件的性能提升非常明显,特别是CPU核数增加,使服务器性能大幅提升,如果一个服务器只安装一个数据库,则会造成硬件和人力的严重浪费。

1.2.1 利于数据库整合

在硬件性能足够用的情况下,可以将多个数据库中的数据集中到一个数据库中。Oracle CDB架构可以在不更改现有模式和应用程序的情况下将数据和代码合并。PDB和Non-CDB对应用程序来说是完全透明的,包括连接方式都是相同的。即使是使用Oracle DataGuard,在数据库备份和还原时,对Non-CDB和CDB来说操作都是一样的

使用CDB架构进行数据库整合有以下好处:
降低成本:通过将硬件和数据库的相关组件整合到同一组后台进程中,可以有效的共享计算CPU和内存资源,从而降低硬件和维护成本。例如,单台服务器上的100个PDB共享一个数据库实例。
数据和代码的快速迁移,在CDB架构中,可以实现将PDB快速的插到CDB中,先从CDB中拔下PDB,然后将这个PDB插到另一个CDB中,还可以在线复制PDB。如果CDB的字符集是AL32UTF8,那么不同数据库字符集的PDB可以存储在同一个CDB中,即CDB中可以插入任何字符集的PDB,并在不进行字符集转换的情况下使用它。
易于管理和监控,DBA可以通过执行单个操作(如打补丁或者执行RMAN备份)来管理环境,可以一次性管理CDB和CDB中的所有PDB,并且简化了备份策略和灾难恢复。
数据和代码的分离:数据库通过整合合并到一个物理数据库中,而PDB和Non-CDB的管理非常相似。例如:如果用户误删除了数据,那么DBA可以使用Oracle Flashback或基于时间点来恢复数据,而不影响其他的PDB。
管理权限的分离:公共用户只要有足够的权限就可以连接到任意一个PDB,而本地用户只能连接到指定的PDB。
管理员使用公共用户管理CDB或应用程序容器。由于权限只包含在授予它的PDB中,因此一个PDB上的本地用户对同一个CDB中的其他PDB没有访问权限。
管理员使用本地用户管理单个PDB。
注意:公共用户和本地用户是Oracle 12c中引入的概念,公共用户只能在CDB中创建,用来管理CDB中所有的PDB,默认情况下公共用户的名称只能以C##开头。本地用户只能访问指定的PDB,而无法访问其他的PDB。
简化性能调优:很明显,收集一个数据库的数据要比收集多个数据库的数据更容易。例如:更改一个数据库的SGA大小比修改100个数据库SGA大小简单。
简化数据库补丁和升级:采用CDB架构,可以减少需要升级的数据库的数量,减少出错机会。

1.2.2 利于数据库管理

在CDB架构中,PDB中也会存储本身的数据和元数据,而不是将所有的PDB字典元数据都存储在同一个数据库中。通过分开存储各自的字典元数据,PDB可以更容易的作为一个独立的单元进行管理。好处如下:
更容易升级数据和代码,例如:可以不再升级CDB,而直接将PDB从现有CDB中拔出,然后插到更高版本的CDB中。
更容易在服务器之间迁移:执行负载均衡或满足SLA时,可以将应用程序数据库从本地数据中心迁移至云,或者在同一个环境中的两个服务器之间迁移。
防止PDB中的数据损坏,可以将某个PDB闪回到特定的SCN或者PDB的恢复点,而不影响其他的PDB,这个特性类似于Non-CDB的闪回数据库特性。

1.3 多租户存储的物理结构
1.3.1 数据文件的存放位置

在多租户架构中,与数据库相关的各个文件的存放位置在Oracle 11g中相关文件的存放位置有明显的区别,主要体现在PDB的数据文件上,而其他的文件,如控制文件、Redo日志文件、密码文件、参数文件都没有变化。
如果PDB的数据文件使用Oracle自动管理OMF,那么文件存放在$ORACLE_BASE/oradata/SID/DATAFILE/ PDB GUID/目录中。通过手动方式管理PDB的数据文件,理论上数据文件的存放位置是没有限制的,但是为了方便管理,建议参考标准去存放,将PDB相关的数据文件存放在单独的目录中CDB和Non-CDB有着相似的结构,除了每个PDB都有自己的表空间,如SYSTEM表空间、 SYSAUX表空间、TEMP表空间和UNDO表空间(只有本地UNDO模式才有,如果是共享UNDO模式,则所有 CDB Root和PDB共享一个UNDO表空间)
注意:默认情况下,通过DBCA创建的CDB都会启动本地UNDO模式下面分别说明本地UNDO模式和共享UNDO模式下的CDB结构
本地UNDO模式:实际上除在线Redo日志文件外,其他表空间的每个PDB中都有。所有PDB会共享CDB的在线Redo日志文件,如图1-2所示。
image.png

                          图1-2本地UNDO模式

共享UNDO模式:和本地UNDO模式唯一的区别就是,所有的PDB共享一个UNDO表空间,如图1-3
image.png
图1-3 共享UNDO模式
1.3.2查看CDB数据文件目录

查看CDB数据文件的存放位置,需要切换到相应的容器下。例如,查看某个PDB数据文件的存放目录,可以通过
alter session set container= pdbname
命令切换到相应的PDB下,然后执行命令查看;或者直接通过 CONTAINER子句来查询,如
“ select file name from containers(dba_ data files) where con_id=3;”
这里的容器ID( con id)可通过 pDbs视图或 show pdbs命令进行查看。
单实例文件系统。
由于没有启动OMF,所以所有的数据文件命名及存放目录都由DBA手动指定
SQL> show parameter db_create_file_dest
CDB root
SQL> show con_name
SQL> select file_name from dba_data_files;
PDB
切换到相应的PDB下进行查询即可
SQL> show pdbs;
SQL> alter session set container= pdbname
可以看到,CDB root数据文件所在目录中创建了一个子目录,该子目录用于存放相应的PDB数据文件
RAC环境下,启用OMF,可以看到,Oracle使用PDB的GUID来区分不同的PDB数据文件存放目录。

「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论