混合列压缩和Oracle ZFS存储一体机

混合列压缩和Oracle ZFS存储一体机

 

混合列压缩(HCC)简介

混合列压缩(HCC)最早是Oracle Exadata的独特功能,简单说,这个功能就是将表分割成一个一个的压缩单元(CU),在压缩单元内,使用列式方式组织数据并压缩,这种压缩方式可以兼顾表的随机访问和表扫描,同时还可以得到非常高的压缩比,是一个非常实用的功能。

HCC最早只支持在EXADATA上使用,所以,最初也叫EHCC,后来,Oracle在11.2.0.3以后的版本增加了HCC对其他存储硬件的支持,当然,都是自家的产品:Pillar Axiom和Oracle ZFS存储一体机(ZFSSA)。

有意思的是,曾经出现过一段短暂的“不设限”时间,只要使用DNFS(Direct NFS)的数据库,使用任何NAS上export出来的NFS文件系统,都可以使用HCC,当然,Oracle很快以“补丁”的形式修复了这个“问题”。从这里就可以看出,其实HCC根本就是Oracle Database的标准功能,Oracle为了商业目的,在数据库中加了一个检查功能,在用户使用HCC之前,检查用户的存储,如果不是自家的产品,就不支持。那个所谓的“补丁”,应该就是进一步增强检查的功能。保证HCC只能在自家的存储产品上跑起来。

这就好比你买了辆车,开了一段时间以后,要换轮胎了,结果4S店告诉你,只能用“原厂”生产的轮胎,否则时速就上不了60,用了“原厂”的轮胎,时速200都没问题啊,实际上别的轮胎和原厂的轮胎有什么本质区别吗?没有!只是人家在车上装了检测装置,不是原厂轮胎,人家发动机就不“卖力”工作,你能怎么样?我这么说,不是在骂Oracle,相反,我是在表达我的崇敬之情,你看,Oracle这么霸气,这些客户有谁表示不服了吗?没有,说到底还是人家掌握核心技术,不服不行。

HCC和ZFSSA

Oracle存储一体机(ZFSSA)是什么呢?简单说,就是Oracle自家的NAS产品,当然,它有很多自己独特的特性,这不是本文的重点,有兴趣的人可以去Oracle的官网看相关的资料。

前面说了,Oracle数据库是在使用HCC之前,检查你的存储类型,如果不是Oracle的产品,就不让用HCC,那么到底是怎么检查的呢?答案是SNMP。

在ZFSSA的官方文档中,明确指出,如果想让数据库使用HCC等特定的功能,必须保证ZFSSA的SNMP服务是开启的,并且保证从数据库节点,使用snmp方式,可以查询到ZFSSA的相关配置信息。(https://docs.oracle.com/cd/E56021_01/html/E55851/goqdr.html#scrolltoc)。

ZFSSA与数据库系统的集成

在ZFSSA的官方文档中,在与Oracle系统集成时,都把它定位为备份服务器,都是在讲如何将存储通过NFS方式挂在EXADATA或SuperCluster上,然后使用rman进行备份。但是如果只是这样,ZFSSA不就白支持HCC了吗?所以,我认为ZFSSA和Oracle系统的集成应用至少还应该有2种:

1. 连接普通的数据库服务器,作为存储端,支持HCC可以符合一些对性能要求不高,但是有大量数据的场景,可以利用HCC充分利用存储空间,在表扫描多的场景下,对性能也有一定帮助。

2. EXADATA存储扩容。这个当然不是指所有场景,而是指计算能力足够,但是存储容量不够的EXADATA部署场景,在这种场景下,如果预算有限,可以考虑不购买EXADATA或存储扩展柜来扩容,而是买ZFSSA。连接ZFSSA和EXADATA,在ZFSSA上创建专门的非活跃数据使用的磁盘组和表空间,将非活跃数据移动到这些表空间,并进行混合列压缩。

我说的第2种应用方式,可能有人会问,活跃数据和非活跃数据区分太繁琐了,DBA的工作量太大怎么办?我的回答是:这个工作其实可以通过一定时间的积累,根据系统的特点将主要步骤脚本化,定时执行脚本就好了。如果这也嫌累,那我只能建议你升级数据库到12c了。Oracle早就为这种场景预备了信息生命周期管理(ILM)和自动数据优化(ADO)功能,简单说,就是利用热图(Heat Map)功能,记录数据库中活跃的表,然后配合一定的规则,使用ADO功能,自动移动或压缩非活跃数据。11g时就提出了ILM概念,但是没有Heat Map的辅助,没有实际意义。

在Oracle ILM和ADO的官方文档中,专门阐过述存储分层,在线归档等概念,本质上讲,EXADATA的cell和ZFSSA,就是不同层的存储,成本不同,效率也不同。而运用规则自动移动非活跃数据到ZFS上,其实就是在线归档的一种表现形式。

ILM和ADO不是本文的重点,具体实施方法,网上很多。

Oracle 12c HCC实验

下面通过实验,介绍一下数据库如何连接ZFSSA,并实现HCC功能的。

为了方便大家研究,我们使用ZFSSA模拟器,在虚拟机上模拟一个ZFSSA,这个虚拟机Oracle有提供下载:http://www.oracle.com/technetwork/server-storage/sun-unified-storage/downloads/sun-simulator-1368816.html

模拟器文档:http://download.oracle.com/otn/utilities_drivers/servers-storage/storage/open-storage/sunstorage7000/SimulatorGuide.pdf

下面说说具体步骤:

准备ZFSSA模拟器

下载这个模拟器的OVF文件,使用VirtualBox导入并打开,按照页面的quick start guide进行初始设置。

初始设置

clip_image002

clip_image004

登录ZFSSA的BUI(Browse User Interface),进行初始化设置:

clip_image006

先都是一路“commit”,都用缺省值完成初始配置。

SNMP设置

在configuration页面的Services里面找SNMP,缺省是disable的

clip_image008

启动服务,点击指示灯图标进行配置:

clip_image010

配置完成后,重启服务。

存储配置

使用缺省值建立一个存储池,名字随便,我这里叫“testpool”。

clip_image012

NFS配置

在Share页面,增加一个Filesytem:

clip_image014

clip_image016

数据库服务器准备工作

配置NFS

在/etc/hosts文件中,增加ZFSSA主机名解析:

[root@vbox12 ~]# more /etc/hosts

127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4

::1 localhost localhost.localdomain localhost6 localhost6.localdomain6

192.168.0.51 vbox12.hthorizon.com vbox12

192.168.0.94 sunstorage.hthorizon.com sunstorage

在/etc/fstab中增加NFS挂载信息:

[root@vbox12 ~]# more /etc/fstab

#

# /etc/fstab

# Created by anaconda on Sat Apr 16 00:53:51 2016

#

# Accessible filesystems, by reference, are maintained under ‘/dev/disk’

# See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info

#

/dev/mapper/vg_vbox12-lv_root / ext4 defaults 1 1

UUID=d83854a8-fe57-4815-abeb-ce93aa0e80b8 /boot ext4 defaults 1 2

/dev/mapper/vg_vbox12-lv_swap swap swap defaults 0 0

tmpfs /dev/shm tmpfs defaults 0 0

devpts /dev/pts devpts gid=5,mode=620 0 0

sysfs /sys sysfs defaults 0 0

proc /proc proc defaults 0 0

sunstorage:/export/testnfs /testnfs nfs rw,bg,hard,nointr,tcp,nfsvers=3,timeo=600,rsize=1048576,wsize=1048576,noac 0 0

注意mount option,如果使用OISP,nfsvers必须等于4。

配置数据库使用DNFS

打开数据库的DNFS支持:

$ cd $ORACLE_HOME/rdbms/lib

$ make –f ins_rdbms.mk dnfs_on

在$ORACLE_HOME/dbs/目录下,创建文件oranfstab,内容:

[oracle@vbox12 dbs]$ more oranfstab

server: sunstorage

path: 192.168.0.94

export: /export/testnfs mount: /testnfs

management: 192.168.0.94

验证snmp功能:

[root@vbox12 ~]# snmpget -v1 -c public sunstorage 1.3.6.1.4.1.42.2.225.1.4.2.0

SNMPv2-SMI::enterprises.42.2.225.1.4.2.0 = STRING: “Sun Storage 7000”

“snmpget“工具包含在net-snmp-utility rpm包中。

数据库实例是调用libnetsnmp.so,来实现snmp查询的,如果在/usr/lib64目录中没有这个文件,需要建立符号链接,我的系统是OEL 6.5,链接要指向libnetsnmp.so.20.0.0:

[root@vbox12 lib64]# ln -s libnetsnmp.so.20.0.0 libnetsnmp.so

创建一个测试表空间:

Connected to:

Oracle Database 12c Enterprise Edition Release 12.1.0.2.0 – 64bit Production

With the Partitioning, OLAP, Advanced Analytics and Real Application Testing options

SQL> create tablespace testtbs datafile ‘/testnfs/oradata/testtbs.dbf’ size 30M;

Tablespace created.

SQL> select * from v$dnfs_servers;

ID

———-

SVRNAME

——————————————————————————–

DIRNAME

——————————————————————————–

MNTPORT NFSPORT NFSVERSI WTMAX RTMAX CON_ID RDMAENABLE

———- ———- ——– ———- ———- ———- —————-

RDMAPORT

———-

1

sunstorage

/export/testnfs

ID

———-

SVRNAME

——————————————————————————–

DIRNAME

——————————————————————————–

MNTPORT NFSPORT NFSVERSI WTMAX RTMAX CON_ID RDMAENABLE

———- ———- ——– ———- ———- ———- —————-

RDMAPORT

———-

53794 2049 NFSv3.0 1048576 1048576 0 No

0

没有真正使用NFS空间之前,v$dnfs_servers视图中是没有信息的,一旦使用了,就会有显示。这说明dnfs配置是正确的。

重启数据库,在alert中看到信息:

Sun Apr 17 02:48:24 2016

ALTER DATABASE OPEN

Sun Apr 17 02:48:24 2016

Direct NFS: channel id [0] path [192.168.0.94] to filer [sunstorage] via local [] is UP

Sun Apr 17 02:48:24 2016

Direct NFS: attempting to mount /export/testnfs on filer sunstorage defined in oranfstab

Sun Apr 17 02:48:24 2016

Direct NFS: channel config is:

Sun Apr 17 02:48:24 2016

channel id [0] local [] path [192.168.0.94]

Sun Apr 17 02:48:24 2016

Direct NFS: mount complete dir /export/testnfs on sunstorage mntport 53794 nfsport 2049 using NFS version 3

Sun Apr 17 02:48:24 2016

Issuing SNMP query over mgmt_path 192.168.0.94

Sun Apr 17 02:48:24 2016

Found NAS server Sun Storage 7000

测试HCC

创建query high级别压缩的表:

SQL> create table test (col1 number,col2 varchar2(10)) compress for query high tablespace testtbs;

Table created.

在缺省表空间(就是没有使用ZFS的表空间)创建表,使用HCC:

SQL> create table test1 (col1 number,col2 varchar2(10)) compress for query high;

create table test1 (col1 number,col2 varchar2(10)) compress for query high

*

ERROR at line 1:

ORA-64307: Exadata Hybrid Columnar Compression is not supported for

tablespaces on this storage type

提示存储类型(本地磁盘)不被支持

尝试12c HCC新特性,row level locking:

SQL> create table test (col1 number,col2 varchar2(10)) compress for query high row level locking tablespace testtbs;

create table test (col1 number,col2 varchar2(10)) compress for query high row level locking tablespace testtbs

*

ERROR at line 1:

ORA-64309: Hybrid Columnar Compression with row-level locking is not supported

for tablespaces on this storage type.

HCC的row level locking是12c的新特性,以前在使用HCC时,是以CU为单位加锁的,12c可以以ROW为单位加锁,但是文档中,这个新特性只支持EXADATA,果然和文档说的一样。高配版和“乞丐版“还是要体现出差异啊。

其他

我在测试其他NAS时,用wireshark捕获snmp包:发现Oracle实例是优先查找Sun Storage 7xxx的,如果不是,还会再进行第2次snmp查询,查看是否是NetApp的设备,如果还不是,会进行第3次查询,查看是否是Pillar Axiom的设备。

clip_image018

根据网上查询的资料,OID 中789,代表的是NetApp,Oracle查存储是不是NetApp的干什么呢?为竞争对手加速吗?

另外,后来在网上看到国外的高手讨论,要想做HCC的“越狱“,理论上有两种方法:

1. 编译自己的libnetsnmp.so,一旦查询指定的oid,就返回Sun Storage 7xxx,因为net-snmp是开源的,所以理论上可行。

2. 自己做一个NAS,装x86版的Solaris,安装ZFSSA的软件,修改设备信息,让snmp查询返回Sun Storage 7xxx

当然,这些都是出于研究学习的目的,就算有人成功了,性质也和用黑客工具激活的windows一样。

Comments are closed.