
混合列压缩和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
下面说说具体步骤:
准备ZFSSA模拟器
下载这个模拟器的OVF文件,使用VirtualBox导入并打开,按照页面的quick start guide进行初始设置。
初始设置
登录ZFSSA的BUI(Browse User Interface),进行初始化设置:
先都是一路“commit”,都用缺省值完成初始配置。
SNMP设置
在configuration页面的Services里面找SNMP,缺省是disable的
启动服务,点击指示灯图标进行配置:
配置完成后,重启服务。
存储配置
使用缺省值建立一个存储池,名字随便,我这里叫“testpool”。
NFS配置
在Share页面,增加一个Filesytem:
数据库服务器准备工作
配置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的设备。
根据网上查询的资料,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一样。