每个TUXEDO应用程序都有一个配置文件,它告诉TUXEDO系统,应该如何配置和部署服务进程,应该为服务进程提供什么样的运行环境。这个配置文件的作用与J2EE规范中的部署描述符是一样的,它告诉TUXEDO系统(相当于J2EE规范中的容器),应该如何配置和调度服务进程(相当于J2EE规范中的EJB组件)。
TUXEDO的配置文件有两个版本:ASCII版本和二进制版本。ASCII版本的配置文件通常称为UBBCONFIG,二进制版本的配置文件通常称为TUXCONFIG。UBBCONFIG文件由管理员编写,并通过tmloadcf转换成TUXEDO系统能够识别的二进制格式。TUXEDO系统对配置文件的命名和存放位置没有特别要求,只要在启动时候能够通过$TUXCONGIF环境变量找到正确的二进制配置文件就可以。习惯上,ASCII版的文件名通常含有ubb字样,如UBBConfignt、ubbsimple、simple.ubb等,这些文件常被称为“ubb”文件。二进制版本的文件名通常命名为tuxconfig,并且存放在$APPDIR目录下。
UBBCONFIG文件是有层次的,如图所示。它由9个段组成:*RESOURCES、*MACHINES、*GROUPS、*NETGROUPS、*NETWORK、*SERVERS、*SERVICES、*INTERFACES和*ROUTING,每个段标识前都有一个星号(*)。其中只有*RESOURCES、*MACHIENS和*GROUPS段是必须的,其他段都是可选的。
*RESOURCES段定义了应用级的配置参数,如IPCKYES、MASTER��MODEL、MAXACCESSERS、MAXSERVERS、MAXCONV等,这些配置对当前应用中参与计算的所有主机有效。
*MACHINES段定义了在当前应用中参与计算的主机信息,通常包括主机名、逻辑主机名(LMID)、TUXEDO系统的安装路径、事务日志等。
*GROUPS段定义了资源组信息。资源组是服务进程的逻辑集合,也是可部署的最小逻辑单元。资源组定义了组内服务进程共同访问的资源管理器,同时也定义了这些进程应该部署到哪一个逻辑主机上。
*NETGROUPS段定义了在LAN环境中的网络组信息。
*NETWORK段定义了LAN环境中的网络配置信息。
*SERVERS段定义要部署的所有服务进程的信息,包括进程名、命令行参数,以及所属的资源组等。如果*SERVERS段被忽略,只有BBL进程会启动。
*SERVICES段定义了于有名服务器相关的信息,包括优先级、负载引资、服务超时和DDR路由标规则等。
*INTERFACES段定义了当前应用中CORBA接口的默认参数信息。
*COUNTING段定义了DDR路由规则,供*SERVICES段使用。
在段定义的顺序方面,*RESOURCES和*MACHINES必须一次作为前两个段来定义,*GROUPS段必须定义在*SERVERS、*SERVICES和*ROUTING之前,*NETGROUPS必须定义在*NETWORK之前。
二、*RESOURCES段的配置
*RESOURCES段定义了应用级的配置参数,它是必须的,而且必须作为UBBCONFIG文件的第一部分出现。下面通过一个*RESOUCES实例来详细说一下*RESOUCES段的配置
*RESOUCES IPCKEY 123456 DOMAINID simpapp MASTER SITE1 MAXACCESSERS 10 MAXSERVERS 5
MAXSERVICES 10
MODEL SHM LDBAL N
这个段中只配置了8个参数。实际上,*RESOUCES段中的参数远不止这些,不过,只有IPCKEY、MASTER和MODEL3个参数是必须的,其他参数可以不定义,TUXEDO会给其一个默认值。下面就对*RESOURCES中可能出现的所有配置做一个介绍
IPCKEY 32769
IPCKEY是IPC资源的标识符,它是一个取值在32768~262143之间的整数。在单机环境下,IPCKEY标识着公告板的入口地址。在多机环境下(MP模式),它标识着DBBL进程的消息队列名。同一台主机上的任何两个应用程序,IPCKEY值不能相同。
MASTER SITE1 ,SITE2
MASTER指定了作为主节点(Master节点)的逻辑主机标识(LMID)。Master节点维护着TUXCONFIG配置文件的主拷贝。在多级环境下,Master节点会把TUXCONFIG配置文件复制到每一个非Master节点(non-Master)上。MASTER参数最多可以指定两个LMID,第二个LMID作为备用Master节点。
MODEL SHM
MODEL定义了TUXEDO应用程序的配置类型。可取值SHM或MP,即单机模式还是多机模式。SHM可理解为SingleHost Model 或就Share Memory,指的是当前配置中只能有一台物理主机,即*MACHINES段中只能有一个主机定义。这时,OPTIONS参数定义和*NETGROUPS段将会被忽略。MP可理解为Multi-PROCESSORS,指的是当前配置中有两台以上的物理主机,即*MACHINES段中包含两个以上主机定义。
*RESOURCES中还有很多参数,如果不显示地指定这些参数的取值,它们的默认值就会生效。在大多数情况下,这些参数的默认值不满足要求,因此需要显示地设置。
DOMAINID simpapp
DOMAINID指定一个字符串作为管理域的标识符,没有实际意义。
UID 501 GID 1001 PERM 0666
这三个参数控制着TUXEDO应用程序对系统IPC资源的存取权限。UID 和 GID 是可对该TUXEDO应用系统进行管理的用户ID和组ID。在UNIX下,如果不指定,默认执行tmloadcf的用户ID和组ID,在NT下该设置默认用户为Adminstrator,组ID和GID都为0。PERM定义了TUXEDO应用程序对系统IPC资源的访问权限,默认值为0666,即任何用户都具有对IPC资源进行读写的权限。
MAXACCESSERS 10
MAXACCESSERS定义了公告板的最大容量,即同时可以容纳多少个客户机和服务器,取值范围在0~32768之间,默认值为50。
MAXSERVERS 5
MAXSERVERS指定公告板可以容纳的最大服务器数量。取值在0~8192之间,默认值为50。所有系统提供的服务器和用户开发的服务器都计算在内。
MAXSERVICES 10
MAXSERVICES指定公告板可以容纳的最大服务数量,取值在0~32768之间,默认值为100.
*RESOURCES参数还有很多,此处省略不再讲解。
三、*MACHINES段的配置
*MACHINSES段是必须的,而且应该作为UBBCONFIG文件的第二部分出现,即紧跟在*RESOURCES段之后。它定义了当前应用中参与计算的主机信息,主要包括主机名、逻辑主机名(LMID)、TUXEDO系统的安装路径(TUXDIR)和事物日志(TLOG)等。下面配置一个*MACHINES段配置的实例。
*MACHINSES JQ LMID=SITE
APPDIR="C:\TuxDAP\solutions\simpapp\local"
TUXCONFIG="C"\TuxDAP\soultions\simpapp\local\tuxconfig"
TUXDIR="C:\bea\tuxedo"
包括主机名在内,这段例子一共配置了5个参数。事实���,*MACHINSES段中可以配置的参数也不止这些,不过只有主机名(本例中的JQ)、LMID、 APPDIR、TUXCONFIG、TUXDIR 是必须的,其他参数都可以不定义。
下面就对*MACHINSES段中可能出现的所有配置参数做个介绍。
JQ LMID=SITE1
这一行定义了主机名(JQ)和主机逻辑标识SITE1。在UNIX下,可以使用“uname -n”命令来查看主机名,在NT平台下,主机名保存在%COMPUTERNAME%环境变量中,可以使用 eacho %COMPUTERNAME%命令来查看。如果主机名超过8个字符或含有特殊字符,请使用双引号引起来。主机逻辑标识符LMID是一个字符串,它和主机名用着一一对应的关系,通常定义成SITEn的形式,这个值会被*RESOURCES段中的MASTER参数和*GROUPS段中的LMID参数引用到,若要包含特殊字符,也请用双引号引起来。
APPDIR="C:\TuxDAP\solutions\simpapp\local"
APPDIR定义了TUXEDO应用程序(如a.out等可执行文件)在磁盘上存放的路径,必须是绝对路径,并且用双引号引起来。
TUXCONFIG="C"\TuxDAP\soultions\simpapp\local\tuxconfig"
TUXCONFIG定义了二进制形式的TUXEDO配置文件在磁盘上存放的路径,必须是绝对路径,并且用双引号引起来。参数值必须与TUXCONFIG环境变量严格保持一致,包括大小写。
TUXDIR="C:\bea\tuxedo"
TUXDIR定义了TUXEDO系统在当前主机上的安装路径,必须是绝对路径,并且用双引号引起来。TUXEDIR指定的目录不能位于远程文件系统上。
*MACHINSES还有很多参数,此处省略不再解释。
四、*GROUPS段的配置
*GROUPS也是配置文件中必须有的一个段,它定义了资源组的信息。资源组是服务器的逻辑集合,是可部署的最小逻辑单元。每个资源组都对应一个LMID,这表示资源组内的所有服务器都将部署到LMID代表的主机上。资源组还可以对应一个TMS,这表示组内的所有服务器都可能访问到某个RM(资源管理器),这个RM的事物由TMS来管理,组内的所有服务器对这个RM的存取操作都会受到TMS的监视。
每个配置文件中必须包含至少一个组。下面是一个*GROUPS段的配置实例
*
GROUPS
GROUP1 LMID="SITE1" GRPNO=1 TMSNAME="TMS_ORA10g" TMSCOUNT=2
OPENINFO=
"Oracle_XA:Oracle_XA+Acc=P/scott/tiger+SesTm=120+MaxCur=5+LogDir=."
这段例子定义了一个组GROUP1,“LMID=SITE1” 表示GROUP1中的所有服务器都将部署到SITE1主机上,“TMSNAME=TMS_ORA10g”表示GROUP1中所有服务器对Oracle数据库的存取操作都受到TMA_ORA10g的监视,TMSCOUNT=2表示TUXEDO将启动两个TMA_ORA10g实例来监视事务。OPENINFO串提供了建立和RM的链接所必须的参数。
每个组都有一个组标识,如上例中的GROUP1,后面跟着一些参数,其中只有LMID和GROUPNO是必须的,其他参数都是可选的。
LMID="SITE1"
指定一个逻辑主机SITE1,表明当前组内的所有服务器都将部署到这台主机上
GRPNO=1
为当前组指定一个编号,任何两个组的编号不得相同。组编号取值在0~30000之间
TMSNAME="TMS_ORA10g"
如果要求组内的服务器支持分布式事务,那么就必须通过TMSNAME参数来指定一个TMS(事务管理服务器),在使用tmboot启动应用程序时,就会相应的启动TMSCOUNT个TMS器的实例,这些实例自动构成一个MSSQ集合。
TMSCOUONT=2
这个参数指定要启动的TMS实例的个数。
ENVFILE="C:\TuxDAP\solutions\rm\ora10g\ENVFILE"
这个参数与*MACHINES段中定义同名参数的意义相同。
OPENINFO= "TUXEDO/SQL:C:\TuxDP\devices\bankdll;bankdb;readwerite"
OPENINFO串提供了打开RM连接所必须的参数。这个参数对应于DTP模型中的open-string。
除了上述几个参数外,*GROUPS还有很多参数,这里不再介绍。
五、*NETGROUPS段的配置
*NETGROUPS段用于定义网络组。在多机模式下,一个应用程序会跨越网络,分布在多台主机上,那么这些主机之间应该以一种什么样的优先级进行通信的问题,就可以通过网络组来解决。一台主机可以属于任意多个网络组,一个网络组中可以包含任意多台主机,同时属于一个网络组的主机之间才能通信。在默认情况下,每一台主机都属于一个隐含的网络组DEFAULTNET(组编号是0),也就是说,在默认情况下,任何两台主机之间都是可以通信的。
假设一个TUXEDO应用程序部署在3台主机SITE1、SITE2、SITE3 上,如图所示,SITE1和SITE2同处于本地LAN中的一个网段,SITE3位于远程网络中。SITE3通过2MB专线连接到本地LAN。如果SITE1要把一个请求转发到SITE2或SITE3去处理,很显然,我们希望它把请求转给SITE2,而不是SITE3,那么应该怎么配置呢?针对这种情况,我们可以配置一个网络组LOCALGROUP,使它的优先级高于隐含的DEFAULTNET,然后在*NETWORK段中进行配置,使SITE1和SITE2同时属于这个组,配置如下:
*NETGROUPS
DEFALUTNET NETGRPNO=0 NETPRIO=100
LOCALGROUP NETGRPNO=1 NETPRIO=300
NETPRIO是网络组的优先级,取值在0~8192之间,默认取值为100。NETGRPNO是网络组的编号,必须大于0。如果网络组的优先级相同,那么编号小的组将被优先使用。
*NETGROUP段不是必须的,即便是在多机模式下也是可以忽略的。
六、*NETWORK段的配置
*NETWEORK段定义了网络相关的配置。如果*RESOURCES段中的MODEL参数定义为MP,并且OPTIONS参数中包含了LAN,则必须使用*NETWORK段来对每一台主机的tlisten和桥进程进行配置。下面是一个*NETWORK段的配置实例
SITE1 NADDR="//10.130.1.199:5898" NLSADDR="//10.130.1.199:3050"
SITE2 NADDR="//10.130.1.104:5898" BRIDGE="/dev/tcp"
NLSADDR="//10.130.1.104:3050"
以上定义了3个参数,事实上,*NETWORK中可定义的参数不止这些,下面就对这个段中可能出现的参数做个介绍:
NADDR="//10.130.1.199:5898"
指定在当前主机上桥进程监听的地址和端口,其他桥进程通过这个地址和它建立连接。端口的取值没有限制,建议是用大于1024小于65535的整数。
B RIDGE="/dev/tcp"
指定BRIDGE访问网络使用的设备名。只有使用TLI(Transport Layer Inteface)接口的TUXEDO系统才需要指定,对于Socket接口的系统,不需要指定。
NLSADDR="//10.130.1.199:3050"
指定tlisten进程使用的网络地址,格式与NADDR相同。tlisten是一个后台进程,用于为其他TUXEDO系统提供远程连接服务。
NETGROUP=LOCALGROUP
指定当前主机所属的网络组,这个组必须是在*NETGROUPS段中定义过的。如果没有指定,则默认属于DEFAULTNET组。
七、*SERVERS段的配置
*SERVERS段定义要部署的有服务进程的信息,包括进程名、命令行参数、服务进程所属的资源组等。*SERVERS段可以被忽略,如果被忽略,则在tmboot时,只会启动BBL。下面是一个*SERVERS段的配置实例
*SERVERS
DEFALUT:RESTART=Y MAXGEN=5 REPLYQ=Y CLOPT="-A"
TLR SRVGRP=BANKB1 SRVID=1 CLOPT="-A-- -T 100 -e 1000.00"
XFER SRVGRP=BANKB1 SRVID=4
该段中定义了两个服务,分别是TLR和XFER。DEFAULT中定义的参数对下面说有的服务都起作用。除了*RESOURCES段以外,其他所有的段中都可以使用DEFAULT指令来定义一些相同的参数。下面对*SERVERS段中可能出现的参数做个介绍,这些参数中只有SRVGRP和SRVID是必须的。
SRVGRP=BANKB1
指定服务进程所属的资源组,这些资源资源组必须在*GROUPS段中定义过。
SRVID=4
指定服务进程的编号,取值在0~30000之间。同一个资源组中的两个进程,编号不能相同。
CLOPT="-A-- -T 100 -e 1000.00"
为服务进程指定命令行参数。这个参数被两个连续的减号"--"分成前后两个部分,前面的部分由服务进程的main(int argc,char *argv[])函数捕捉处理,后面的部分由服务进程中的tpsvrinit(int argc,char *argv[])函数捕捉处理
八、*SERCICES段的配置
*SERVICES段定义了与有名服务器相关的信息,包括优先级、负载因子、服务超时和数据依赖路由规则等。*SERVICES段可以被忽略,如果被忽略,则服务进程公告的所有服务都是用TUXEDO���供的默认配置。下面是一个*SERVICES段的配置实例。
*SERVICES
DEFAULT: LOAD=50 AUTOTRAN=Y TRANTIME=30
WITHDRAWAL PRIO=50 ROUTING=ACCOUNT_ID DEPOSIT PRIO=50 ROUTING=ACCOUNT_ID TRANSFER PRIO=50 ROUTING=ACCOUNT_ID INQUIRY PRIO=50 ROUTING=ACCOUNT_ID OPEN_ACCT PRIO=40 ROUTING=BRANCH_ID TLR_ADD PRIO=20 ROUTING=BRANCH_ID
TBAL PRIO=20 ROUTING=b_id
这个例子中定义了7个服务,DEFAULT指令中定义的“LOAD=50 AUTOTRAN=Y TRANTIME=30”参数对7个服务都有效,除非某个服务显示地重新定义了这些参数。下面对*SERVICES段中可能出现的参数做个介绍:
LOAD=50
定义当前服务的负载因子,取值在1~32767之间,如果不指定,默认取值为50。load取值越大,说明当前服务器的负载越大,处理时间越长,如图所示,Server1,Server2,Server3当前负载分别为1420,1450,1400,当客户机请求A时,虽然Server1,Server2都能处理,但最终由Server1来处理,因为它的负载最下。同理,当客户机请求B服务时,最终会由Server3来处理请求。
PRIO=50
指定当前服务的优先级因子,取值在1~100之间,如果不指定,默认值为50。PRIO取值越大,说明当前服务的优先级就越高,在服务器请求队列中优先出对的几率就越大。
SRVGRP=GROUP1
如果有多个资源组同时提供了某一服务,那么���可以通过 SRVGRP参数来对他们进行区分,这里指定的资源组必须是在*GROUPD段中定义过的。
AUTOTRAN=Y
指定当前服务被调用时,是否自动启动一个事务。可取值Y或N,如果不指定,默认值为N,表示不会自动启动一个事务。与J2EE中的EJB事务相比,取值为为Y相当于把一个EJB事务设置为Required,即这个服务会自动融入调用者的事务环境,如果调用者没有事务环境,TUXEDO会自动启动一个事务,并让服务在这个事务环境中执行。取值为N相当于把一个EJB事务设置为Support,即调用者如果有事务环境,则这个服务就会融入其中,如果调用者没有事务环境,则这个服务就在非事务状态下执行。AUTOTRAN和TRANTIME只适用于DTP应用程序。
TRANTIME
以秒为单位,指定自动事务的超时时间,取值在0到2的31次方之间,如果不指定,默认值为30秒,0表示事务超时有当前主机支持的最大超时决定。这个参数和AUTOTRAN只适用于DTP应用程序。
九、*ROUNTING段的配置
可以在不同的资源组中配置相同的服务器,这样就可以为这些服务器提供的服务配置数据依赖路由。TUXEDO系统收到针对这些服务的调用请求后,就会根据请求缓冲区中某个特征字段的取值,来决定把请求转发给哪一个组中的服务器处理。
如图所示,3个资源组BANKB1、BANKB2和BANKB3中都部署了服务器TLR。TLR提供的WITHDRAWAL服务分别用于处理账号空间10000~49999、50000~79999、80000~109999中的取款业务,这时路���规则可以按下面的方式来定义:
*ROUNTING
ACCOUNT_ID FIELD=ACCOUNT_ID BUFTYPE="FML"
RANGES="10000-49999:BANKB1,
50000-79999:BANKB2,80000-109999:BANKB3"
上面这个例子中定义了一个路由规则ACCOUNT_ID,它以请求缓冲区中账号字段ACCOUNT_ID的取值为判断标准,把账号在10000-49999之间的交易请求转发到BANKB1组中处理,把账号50000-79999之间的交易请求转发到BANKB2组中处理,把账号在80000-109999之间的交易请求转发到BANKB3组中处理。在*SERVICES段中可以通过下面的配置来引用路由规则ACCOUNT_ID:
*SERVICES
WITHDRAWAL PRIO=50 LOAD=50 AUTOTRAN=Y TRANTIME=30
ROUNTING=ACCOUNT_ID
*ROUNTING段的配置比较简单,尽管如此,下面还是对这个段中可能出现的参数做个介绍。
FIELD=ACCOUNT_ID
指定请求缓冲区中用做路由选择的字段名,对于XML缓冲区类型,字段名用XPATH表示,格式为“root_element/child_slement/child_element/../../@attribute_name”。
FIELDTYPE=ACCOUNT_ID
指定路由字段的数据类型,可取值有:CHAR、SHORT、LONG、FLOAT、DOUBLE和STRING,如果不指定,默认值为STRING。
RANGES="0-2:DBG1,3-5:DBG2,6-9:DBG3".
指定取值范围和资源组的对应关系。如果路由字段取值落在某个定义的范围之间,就把请求转发给对应的资源组内的服务区处理。取值范围通常是一个区间,但也可以是单个值或一个星号(*)。如"MIN-5"表示小于或等于5的所有整数,"6-MAX"表示大于等于6的多有整数。星号表示默认的取值范围,也就是说,如果一个字段的取值不再任何明确定义的区间内,就会转发到星号对应的资源组去处理。一个RANGE中只能有一个星号入口。
BUFTYPE="FML"
指定DDR的请求缓冲区类型和子类型,可取值:FML/FML32、XML、VIEW/VIEW32、X_C_TYPE和X_COMMON。也就是说,CARRAY、STRING和MBSTRING是不支持DDR的。只有VIEW/VIEW32、X_C_TYPE和X_COMMON支持子类型,其他都没有子类型,主类型和子类型之间使用冒号分隔开,如"VIEW:aud"。
TUXEDO8.0开始支持XML缓冲区,因此使用XML字段来定义路由规则的情况也很多,如果使用元素(CODE)来定义路由规则,那么路由字段应该定义如下:
ORDER FIELD="ORDER/HEADER/@ORDERNO" FIELDTYPE=long BUFTYPE="XML"
RANGES="0-9999"DBG1,10000-MAX:DBG3"
十、小结
TUXEDO配置文件描述了应用程序应该如何部署到TUXEDO系统上,以及TUXEDO系统应该为应用程序提供一个什么样的运行环境。从形式上看,TUXEDO配置文件分为ASCII码和二进制两个版本,ASCII版本的配置文件通常称为UBBCONFIG,二进制版本通常称为TUXCONFIG,他们之间可以通过tmloadcf和tmunloadcf命令来相互转换。从构成上看,UBBCONFIG由9个段组成,在这些段中,只有*RESOURCES、*MACHINES、*GROUPS段是必须的,其他段都是可选的。每个段都有很多参数,有些参数是必须定义的,有些参数是可选的,大多数参数都有默认值,如果没有显示地为这些参数指定取值,则默认值有效。
使用tmloadcf加载配置文件时,经常会碰到各种各样的问题,最常报的错误信息由下面几种。
CMDTUX_CAT:873:ERROR:TUXCONFIG environment variable not set
这种错误最好解决,只需要设置TUXCONFIG环境变量即可。tmloadcf将生成这个环境变量指向的二进制配置文件。
CMDTUX_CAT:111:ERROR:TUXCONFIG(C:\TuxDAP\solutions\simpapp\local\tux)
of machine JQ must be the same as the TUXCONFIG enviroment
variable(C:\TuxDAP\solutions\simpapp\local\tuxconfig)
这个错误信息说的是TUXCONFIG环境变量的值与UBBCONFIG文件的*MACHINSES段中的TUXCONFIG参数的值不完全相同。TUXEDO系统要求这两个值必须完全相同。包括每个字母的大小写。
CMDTUX_CAT:868:ERROR:tmloadcf cannot run on a non-master node
这个错误信息说的是tmloadcf不能再非Master节点上运行,通常由*MACHINES段中定义的主机名与实际主机名不匹配引起。
CMDTUX_CAT:883:ERROR:tmloadcf cannot run on a active node
这个错误信息说的是tmloadcf不能在活动节点上执行。这说明应用程序已经启动,只需使用tmshutdown关闭它,然后执行tmloadcf,就不会再出新这种错误。
本篇文章参考了经乾老师的《TUXEDO系统经典》一书,如果,想了解更多的配置文件参数,可以去看看这本书!