设置参与机器上的 NFS 客户机
instance-owner 目录可用之后,便可以将该目录导入其他数据库分区服务器。
- 用以下命令在其他服务器中创建共享目录:
mkdir /db2home
-
添加一个条目到 /etc/fstab 文件,使 NFS 在启动时自动挂载文件系统: 清单 3. 参与机器的 /etc/fstab 示例
server1:/db2home /db2home nfs rw,timeo=300,retrans=5,hard,intr,bg,suid |
其中 server1 是 instance-owner 服务器名称,下表列出了其他一些选项: 表 3. NFS 挂载选项
选项 |
描述 |
rw |
使用读写权限来导出文件系统。 |
timeo |
这个值的单位是十分之一秒,表示 RPC 超时后进行第一次重传之前所需等待的时间。默认值是7/10。 |
retrans |
在重大操作被中止或者控制台上显示 “server not responding” 消息之前必须重传的次数。 |
hard |
如果NFS文件操作超时较多,则在控制台上报告“server not responding”,并一直重新尝试。这是默认情况 |
intr |
如果 NFS 文件操作超时较多,并且是硬(hard)挂载,那么允许由信号中断文件操作,使操作中断。 |
bg |
如果第一次 NFS 挂载尝试超时,则在后台重试挂载。 |
suid |
这个值允许 set-user-identifier 位 (SUID) 或 set group-identifier 位 (SGID) 生效。 |
- 用以下命令在其他数据库分区服务器上挂载导出的文件系统:
mount server1:/db2home /db2home
检验 NFS 锁监控程序
DB2 需要一个 NFS 锁监控程序来在集群中所有参与机器之间共享 instance-owner 目录。可以通过使用 chkconfig 命令来检验 NFS 锁监控程序是否已启用:
chkconfig nfslock
可以通过以下命令启用 NFS 锁监控程序和重新启动 nfslock:
- chkconfig nfslock on
- /etc/rc.d/nfslock restart
检验 NFS 锁和 NSM (Network Status Monitor) 服务
NSM 服务 rpc.statd 实现了一个重启通知服务,NFS 文件锁服务(rpc.lockd)将用到这个服务。可以使用以下命令检验这些服务的状态:
- ps -ef | grep rpc.statd
- ps -ef| grep rps.lockd
步骤 6. 创建所需的组和用户
在数据库分区环境中,需要为 DB2 创建三个组和用户 ID,如下表所示:
表 4. 所需的 DB2 组和用户
用户 ID |
组 ID |
描述 |
db2inst1 |
db2iadm1 |
DB2 实例用户 ID 和组 ID |
db2fenc1 |
db2fadm1 |
DB2 fenced 用户 ID 和组 ID |
dasusr1 |
dasadm1 |
DB2 Administration Server 用户 ID 和组 ID |
在所有参与机器上的 DB2 instance owner ID 和密码应该是一致的,而且,它的 home 目录应该在 NFS 共享目录中。fenced ID 应该配置为与 DB2 instance owner ID 相同。DAS 用户 ID 和密码在所有参与机器上可以各不相同;但是,为了简化配置和维护,可能需要使 DAS 用户 ID 和密码一致。
例如,您可以用以下命令在所有机器上创建 DB2 组,创建 DB2 用户 ID 以及设置初始密码:
- groupadd -g 999 db2iadm1
- groupadd -g 998 db2fadm1
- groupadd -g 997 dasadm1
- useradd -u 1100 -g db2iadm1 -m -d /db2home/db2inst1 db2inst1 -p password1
- useradd -u 1101 -g db2fadm1 -m -d /db2home/db22fenc1 db2fenc1 -p password2
- useradd -u 1102 -g dasadm1 -m -d /home/dasadm1 dasusr1 -p password3
- passwd db2inst1
- passwd db2fenc1
- passwd dasusr1
步骤 7. 在 instance-owning 机器和所有参与机器上安装 DB2 UDB
可以使用 db2_install 脚本通过 RPM 安装实用程序在 Linux 系统上安装所有的 DB2 ESE 包。您可以使用该脚本首先在 instance-owning 机器上安装 DB2,然后在参与机器上安装 DB2。
由于必须在每个参与机器上安装 DB2,所以最好将安装代码放在一个共享的盘(例如在我们这个例子中是 /db2home)上。也可以将您的设置记录到一个响应文件中,然后使用该文件来配置其他的机器。
首先,为了安装 DB2,必须以 root 用户登录:
- 输入 db2_install 命令启动 db2_install 脚本,该脚本存放在 CD-ROM 的根目录下。
- 当 db2_install 提示输入产品关键字时,输入 DB2.ESE。
步骤 8. instance-owning 机器的配置
这台机器将被视作 instance-owning 机器,因为它存储和共享 instance owner 的 home 目录。sqllib 目录正是位于这个目录中,此外在此目录中的还有 Database Manager Configuration 文件 (DBM CFG)、Instance Profile Registry、Node 目录和 System Database 目录。由于这些文件是共享的,所以对任何一个文件的更新在所有参与机器上都可以看到。为了配置 instance-owning 机器,需要执行以下步骤:
- 创建一个 DB2 实例
您应该使用 DB2 instance owner ID 登录到系统,然后在 /opt/IBM/db2/V8.2/instance 下执行 db2icrt 创建一个供所有机器共享的 DB2 实例:
- cd /opt/IBM/db2/V8.1/instance
- ./db2icrt -u db2fenc1 db2inst1
其中 -u 指定 fenced ID。
需要注意的是,一个 DPF Instance 实际上存在于每个参与机器上,它们都使用相同的实例名、密码和共享 home 目录。当使用 DPF 时,被分区的是数据库,而不是实例。
- 启用 FCM
所有参与机器必须通过一个通信设施互连,例如一个高速 TCPIP 网络。Fast Communications Manager (FCM) 被设计用来处理数据库分区服务器之间的通信。为了启用 FCM,在所有参与机器上的 /etc/services 文件中必须预留一个端口范围。DB2 提供在 /etc/services 文件中已经被预留的一个默认的端口范围;默认情况下,DB2 会修改 /etc/services 文件,以便将端口 60000-60003 用于分区之间的通信,端口 50000 用于应用程序通信。DB2 在创建实例时会为此预留一些端口。每个逻辑分区需要一个端口,并且每台机器需要预留相同的端口。每个条目包含一个端口名和端口号。
除了基本的配置外,FCM 端口看上去应该如下所示: 清单 4. /etc/services 中的 FCM 端口
DB2c_db2inst1 50000/tcp #Add FCM port information # DB2_db2inst1 60000/tcp DB2_db2inst1_1 60001/tcp DB2_db2inst1_2 60002/tcp DB2_db2inst1_END 60003/tcp |
从 清单 4 中可以看出,端口名是由实例名加上前缀 "DB2_" 得到的。最后一个端口名由实例名加上前缀 "DB2_" 和后缀 "_END" 得到。第一个端口名与最后一个端口名之间的端口名以 "_<序列号>" 为后缀。 端口号后面必须跟上 "/tcp"。
- 更新 DB2 实例参数
使用 instance owner ID 登录到机器,并指定 DB2 将使用哪些协议。为了初始化协议,需要使用以下命令更新 DB2COMM profile 注册表变量: db2set DB2COMM=TCPIP
此外,需要在数据库管理器(DBM)配置参数中更新服务名,以指示哪些端口名将用于与 DB2 服务器和远程客户机的通信。这可以通过使用以下命令来完成: db2 update dbm cfg using SVCENAME db2c_db2inst1
- 创建 DB2 Administration Server (DAS)
如果要使用诸如 Configuration Assistant、Control Center、Replication Center 或 Development Centermust 之类的 GUI 工具,则必须让 DAS 处于运行状态。您可以作为 DAS 用户登录,然后使用以下命令创建一个 DAS 服务器:
- cd /opt/IBM/db2/V8.1/instance
- ./dascrt -u dasusr1
其中选项 -u 指定 DAS 的用户 ID。
可以用 DAS 管理用户 ID 登录,并执行命令 db2admin start 来启动 DAS 服务器。若要自动启动 DAS 服务器,则需要使用 DAS 管理用户 ID 并执行以下命令:
- cd /opt/IBM/db2/V8.1/instance
- ./dasauto -on
为了显示 autostart 状态,可以执行: ./dasauto ?
- 更新 db2nodes.cfg 文件
最后,需要更新 $HOME/sqllib/db2nodes.cfg 文件。db2nodes.cfg 文件包含配置信息,告诉 DB2 哪个服务器上的哪个分区参与了该实例。该文件有四列:
- 数据库分区号
- 服务器主机名
- 逻辑端口号
- 用于分区之间通信的网络接口(可选)
每个条目表示一个特定服务器上的一个数据库分区,该分区参与了该实例的数据库分区。例如,下面的 db2nodes.cfg 文件定义了四个数据分区。数据分区 0 和 1 在 server1 上,数据分区 2 和 3 在 server2 上。每个服务器有两个逻辑端口(每个逻辑分区对应一个),即端口 0 和 1。 清单 5. 示例 db2nodes.cfg
0 server1 0 1 server1 1 2 server2 0 3 server2 1 |
- 更新 .rhosts 文件以允许远程命令
为了允许执行远程命令,每个数据库分区必须有在所有其他参与服务器上执行远程命令的权限。因此,必须在 /db2home/db2inst1/.rhosts 文件中为每个服务器提供一个条目。.rhosts 文件应该有两列,分别为主机名和 instance owner ID。例如, .rhosts 文件中的下列条目表示参与一个实例的两个服务器。 清单 6. 示例 .rhosts
server1 db2inst1 server2 db2inst1 |
应该使用以下命令来确保只有 root 拥有读和写的访问权: chmod 600 /db2home/db2inst1/.rhosts
步骤 9. 参与机器上的配置
为了配置参与机器,需要执行以下步骤:
- 启用 FCM
必须作为 root 用户登录到每台参与机器上,并将用于 FCM 定义的相同的端口名和端口号添加到 /etc/services 文件中。
- 创建 DB2 Administration Server
必须在所有参与机器上安装 DAS。关于详细信息,请参考在配置 instance-owning 机器时创建 DB2 Administration Server 的方法。
步骤 10. 检验
完成所有更新后,可能需要重新启动服务器,并在所有参与服务器上执行命令 db2_all date 来确保成功完成。
重要概念
下面是关于具有 DPF 功能的 DB2 的一些重要的概念,您应该清楚这些概念。
编目分区
DB2 编目是由数据库管理器维护的一组表和视图。这些表和视图包含元数据,也就是关于数据库和它的对象的信息,例如对表、视图和索引的描述和关于用户在这些对象上所拥有的权限的安全信息。
编目分区是存放数据库编目表的数据库分区。在分区数据库环境中,每个数据库可以在一个不同的数据库分区服务器上有它的编目分区。数据库的编目分区是在运行 CREATE DATABASE 命令的数据库分区服务器上自动创建的。
协调分区
用户与分区数据库的交互是通过一个数据库分区,即用于那个用户的协调分区创建的。协调分区与应用程序运行在同一个数据库分区上,或者,对于远程应用程序,协调分区运行在应用程序所连接的那个数据库分区上。任何数据库分区都可以用作协调节点,或者被变成协调节点。
协调分区之所以被这样称呼,是因为运行在它上面的、与应用程序通信的协调代理。您可以控制将哪个分区用作协调分区。例如,为了连接到分区 3,可以发出:
- set client connect_dbpartitionnum 3
- connect to SAMPLE
数据库分区组
数据库分区组是由一个或多个数据库分区组成的一个组。在为数据库创建表之前,首先创建用于存储表空间的数据库分区组,然后创建用于存储表的表空间。
可以在一个数据库中定义包含一个或多个数据库分区的有名称的子集。每个子集称作一个数据库分区组。每个包含不止一个数据库分区的子集称作多分区数据库分区组。多分区数据库分区组只能用属于相同实例的数据库分区来定义。一个数据库分区可以属于不止一个分区组。
例如,图 5 展示了一个由 5 个分区组成的数据库分区组:
图 5. 3 个示例数据库分区组
在这种情况下,Database Partition Group 1 横跨除一个数据库分区外的所有数据库分区。它还包含一个名为 'Database Partition Group 2' 的单分区数据库分区组。另外,'Database Partition Group 3' 也与 Database Partition Group 1 共享了一个数据库分区。
可以用 CREATE DATABASE PARTITION GROUP 语句创建新的数据库分区,用 ALTER DATABASE PARTITION GROUP 语句修改数据库分区。
数据被划分到一个数据库分区组中的所有分区上,可以为数据库分区组添加一个或多个数据库分区,或者从中去掉数据库分区。属于数据库系统配置一部分的每个数据库分区都必须在一个名为 db2nodes.cfg 的分区配置文件中定义。一个数据库分区组最多可以包含为数据库系统定义的所有数据库分区。
当创建或修改一个数据库分区组时,就会有一个与之关联的分区映射。数据库管理器可以通过将分区映射与分区键和散列算法相结合,来确定数据库分区组中的哪些数据库分区将存储给定的数据行。在一个非分区数据库中,不需要分区键或分区映射。过一会儿我们将详细讨论这些概念。
一个数据库分区是数据库的一部分,其中具有用户数据、索引、配置文件和事务日志。有一些默认的数据库分区组是在数据库创建时被创建的:
- IBMCATGROUP - 用于包含系统编目的表空间的默认数据库分区组。
- IBMTEMPGROUP - 用于系统临时表空间的默认数据库分区组。
- IBMDEFAULTGROUP - 用于包含用户表的表空间的默认数据库分区组。
用于已声明的临时表的用户临时表空间可以在 IBMDEFAULTGROUP 或任何用户创建的数据库分区组中创建,但不能在 IBMTEMPGROUP 中创建。
为了创建一个新的由 db2nodes.cfg 中所有分区组成的分区组,可以发出以下命令:
create database partition group ALLPART on all dbpartitionnums
如果您想创建一个新的分区组,且这个分区组只包含分区 1 和 2,可以发出如下命令:
create database partition group PART12 on dbpartitionnums (1,2)
分区兼容性
可对分区键的对应列的基本数据类型进行比较,并可将它们声明为是分区兼容的(partition compatible)。分区兼容的数据类型具有如下属性:具有相同值但有不同类型的两个变量会按相同的分区算法映射至同一个分区号。 分区兼容性具有下列特征:
- 基本数据类型与另一个相同的基本数据类型兼容。
- 内部格式用于 DATE、TIME 和 TIMESTAMP 数据类型。它们彼此都不兼容,且都不与 CHAR 兼容。
- 分区兼容性不受带有 NOT NULL 或 FOR BIT DATA 定义的列的影响。
- 对兼容数据类型的 NULL 值的处理是完全相同的;对不兼容数据类型的 NULL 值的处理可能不相同。
- 用户定义的类型的基本数据类型用于分析分区兼容性。
- 对分区键中相同值的小数的处理是完全相同的,即使它们的标度和精度不同。
- 字符串中(CHAR、VARCHAR GRAPHIC 或 VARGRAPHIC)的尾部空格会被散列算法忽略。
- BIGINT、SMALLINT 和 INTEGER 是兼容的数据类型。
- REAL 和 FLOAT 是兼容的数据类型。
- 不同长度的 CHAR 和 VARCHAR 是兼容的数据类型。
- GRAPHIC 和 VARGRAPHIC 是兼容的数据类型。
- 分区兼容性不适用于 LONG VARCHAR、LONG VARGRAPHIC、CLOB、DBCLOB 和 BLOB 数据类型,因为它们不能作为分区键。
并置
并置(collocation)是安置同一个数据库分区中包含相关数据的不同表中的行。并置的表使 DB2 可以更有效地使用连接策略。
您可能会发现,作为对特定查询的响应,两个或多个表频繁地提供数据。在此情况下,您会希望这样的表中的相关数据的位置尽可能地靠近。在数据库被物理地划分为两个或多个数据库分区的环境中,必须有一种方法可将划分的表的相关碎片尽可能地靠近。完成此过程的功能称为表并置。
当存取用于连接或子查询的多个表时,DB2(R) 通用数据库(DB2 UDB)能够识别要连接的数据是否位于相同数据库分区上。于是 DB2 就可以在存储数据的数据库分区上执行连接或子查询,而不必在数据库分区之间移动数据。这种局部地执行连接或子查询的能力具有显著的性能优点。
要发生并置,表必须:
- 在相同数据库分区组中,且这个数据库分区组不能处在再分配期间。(在再分配期间,数据库分区组中的表可能使用不同的分区映射 —— 它们不是并置的。)
- 有包含相同数量的列的分区键。
- 分区键的相应列是分区兼容的。
如果一个表在一个单分区数据库分区组中,且该分区组是在另一个表所在的同一个分区上定义的,那么也可以发生并置。
缓冲池
缓冲池是处理期间用于存放数据页和从中读取、修改数据页的一个内存区域。默认情况下,当创建一个缓冲池时,在每个分区上都会创建这样的缓冲池。为了容易管理,通常最好的做法是使每个分区上的缓冲池大小一致。但是,也可以改变特定分区上的缓冲池大小。例如,若要将分区 4 的 'BUF8K' 缓冲池改为 400MB,可以发出命令:
alter bufferpool BUF8K dbpartitionnum 4 size 51200
还可以通过指定一个数据库分区组来选择在哪几个分区上创建缓冲池,在此情况下,只有在数据库分区组中的那些分区上才会创建缓冲池。
表空间
表空间是存储数据库对象的容器集合的抽象。表空间在数据库与存储在数据库中的表之间提供了一个间接层。对于每个表空间,在存储设备上都有一个空间与之对应。一个表中的数据、索引、long 字段和 LOB 部分可以存储在相同的表空间中,也可以分别放到不同的表空间中,以提高性能。
数据库分区表达式
当定义一个横跨同一台机器上多个逻辑数据库分区的表空间的容器时,为了避免一个以上的逻辑分区具有相同的路径/设备名称,通常使用数据库分区表达式(Database Partition Expression)。通过使用数据库分区号作为容器名称的一部分,可以确保容器名称在各分区当中是惟一的。这可以作为手动地为每个分区指定位置的替代方法。
可以使用参数 " $N" ([blank]$N) 来表示一个数据库分区表达式,它可以用在容器名称的任何地方,而且可以指定多个数据库分区表达式。数据库分区表达式以一个空格字符结束;数据库分区表达式计算完毕后,空格后的内容附在容器名称的后面。 如果容器名称中在数据库分区表达式后面没有空格字符,则认为剩下的字符串是表达式的一部分。
参数的使用只能以如下一种格式出现(在这个例子中,假设分区号是 5):
表 5. 常见数据库分区表达式
语法 |
例子 |
值 |
[blank]$N |
" $N" |
5 |
[blank]$N+[number] |
" $N+1011" |
1016 |
[blank]$N%[number] |
" $N%3" (% 是模块) |
2 |
[blank]$N+[number]%[number] |
" $N+12%13" |
4 |
[blank]$N%[number]+[number] |
" $N%3+20" |
22 |
如果使用类似于上面的字符串,并且分区号仍然是 5,那么将看到:
表 6. 数据库分区表达式的使用
例子 |
容器名称 |
'/dbdir/node $N /cont1' |
'/dbdir/node5/cont1' |
'/ $N+1000 /file1' |
'/1005/file1' |
' $N%10 /container' |
'5/container' |
'/dir/ $N%5+2000 /dmscont' |
'/dir/2000/dmscont' |
如果在一个由两个分区组成的数据库上发出以下语句:
CREATE TABLESPACE TBSP1 MANAGED BY DATABASE USING (device '/dev/container $N' 10000)
那么将看到下列容器被创建:
- /dev/container0 - on DATABASE PARTITION 0
- /dev/container1 - on DATABASE PARTITION 1
|