AIX® 具有使用文件系统接口的事件通知机制,它称为 AIX Event Infrastructure。Cluster Aware AIX 用它来监控集群事件,从而减少错误检测时间。集群中一个节点上发生的事件会被通知给所有节点,从而可以轻松采取纠正措施。

Trishali Nayar, AIX 文件系统开发人员, IBM

Trishali Nayar 在 IBM India Storage Lab 工作。她毕业于 University of Pune,获得计算机工程学士学位。她原来是开发 Cluster Aware AIX 操作系统的开发团队的成员。她具有分布式文件系统开发方面的经验。她还与别人合作撰写了 IBM Redbook Implementing NFSv4 in the Enterprise: Planning and Migration Strategies



Cheryl L. Jennings, AIX 文件系统开发人员, IBM

Cheryl Jennings 毕业于 Austin 的 University of Texas,获得计算机科学学士学位。她最初在 IBM 的 AIX L3 Support 团队工作,目前在 AIX Filesystem Development 团队工作。



2011 年 10 月 10 日

简介

AIX 的新版本 6.1 TL6 和 7.1 支持集群。这意味着现在可以轻松创建 AIX 节点集群。这非常有利于构建高可用性和具有弹性的环境。Power HA 是第一个采用了这个 AIX 的新特性的软件。

在集群环境中,需要监控多种事件以保证集群正常运行。重要事件举例如下:

  • 如果有一个成员(我们称为 “节点”)宕机,需要立即通知其他节点,从而让应用程序和客户端进行故障转移,而不会中断服务。
  • 如果网络接口失效,需要用替代路径进行路由。
  • 如果磁盘损坏,需要使用其他地方的数据。
  • 如果关键的进程/守护进程关闭,需要重启。

AIX 具有使用文件系统界面的事件通知机制,它称为 AIX Event Infrastructure。

Cluster Aware AIX 用它来监控集群事件,从而减少错误检测时间。而且,可以将集群中一个节点上发生的事件通知给其他节点,从而可以轻松采取纠正措施。

AIX 上的分布式环境中运行的所有应用程序/产品/服务,都可以利用此事件通知机制。


集群事件

监控代码中用到的文件系统调用有 open()write()select()read()close()。如果要进行集群通知,那么在 write() 调用中还要使用 “CLUSTER=YES” 字符串。同样的程序还可用于本地和远程事件。如果只有远程节点,主动监控同样的事件,将会产生远程通知。

清单 1. 连续监控的代码片段
open()
write()
loop
{
     select()
     read()
}
close()2

前面的代码会连续监控集群事件。只要一有事件(本地或远程)发生,select 调用就会立即返回。read() 中返回的数据有很多有用的信息。它会告诉您哪个节点上发生了什么事件。事件通知分布在网络的所有集群节点上。

以下示例演示了当向集群中添加一个节点时,返回了什么数据。本地节点(执行添加节点命令的节点)以及集群中所有其他节点都会收到以下通知:

清单 2. 集群事件示例
BEGIN_EVENT_INFO
TIME_tvsec=1271922590
TIME_tvnsec=886742634
SEQUENCE_NUM=1
RC_FROM_EVPROD=0
BEGIN_EVPROD_INFO
EVENT_TYPE=NODE_ADD
NODE_NUMBER=1
NODE_ID=0x76497CF2CF1111DF8D83BEB25D4C4703
CLUSTER_ID=0x6EA7B08888D811DFB918BEB25635B404
END_EVPROD_INFO
END_EVENT_INFO

发生事件后所返回的数据为 <key,value> 对。这样做有很多好处。用户程序可以搜索相关的键名称,轻松获取值。

AIX Event Infrastructure 能够将消息从事件创造器(event producer)传递给用户。事件创造器不同,消息各异。举个简单的例子,网络相关的事件创造器想要发送相关的网络接口的名称,而磁盘相关事件创造器就会发送相关的磁盘名称。

同时还会提供给用户各种额外信息,它们出现在这两个分隔符之间:BEGIN_EVPROD_INFO 和 END_EVPROD_INFO。对于所有的集群事件而言,集群相关信息也会出现在这些分隔符之间。这可以帮助监控程序确定是哪个节点发生了事件。

lscluster –m 命令会提供某个节点上现存集群的详细信息。

清单 3. lscluster –m 命令的输出结果
Node name: imaginary.ibm.com
        Cluster shorthand id for node:3uuid for node:6f5b24cc-cbab-11df-8c2c-001125085b7a
        State of node:UP  NODE_LOCAL
        Smoothed rtt to node:0
        Mean Deviation in network rtt to node:0
        Number of zones this node is a member in:0
        Number of clusters node is a member in:1
        CLUSTER NAME       TYPE  SHID   UUID
        clust1             local        6f56fffa-cbab-11df-8c2c-001125085b7a

        Number of points_of_contact for node:0
        Point-of-contact interface & contact state
         n/a

返回的数据中高亮显示的三个字段(cluster shorthand id for node、uuid for node 和 cluster UUID)中的信息能够帮助确定集群中的节点。

任何集群事件发生时,此信息都会在键 NODE_NUMBER、NODE_ID 和 CLUSTER_ID 字段中分别返回。

SEQUENCE number 字段会显示事件发生的次数。

从远程节点接收到的事件不包含用户、进程信息或栈追踪,即使事件创造器支持。


Cluster Aware AIX 上可用的事件创造器(producer)

本节会介绍仅在集群环境中可用的所有事件创造器的详细信息(例如,当系统是集群的一部分时)。

nodeList

当集群列表中节点发生变化时,nodeList 事件创造器会发出通知。集群成员发生变化是个重要事件,对集群中其他节点很有用。

EVENT_TYPE 字段会有以下值:

  • NODE_ADD:当集群中添加节点时会触发。例如,使用 chcluster 命令。
  • NODE_DELETE:当集群中移除节点时会触发。例如,使用 chcluster 命令。

NODE_NUMBER 和 NODE_ID 能帮助识别有问题的相关节点。

清单 4. nodeList 事件发生后的输出结果

BEGIN_EVENT_INFO
TIME_tvsec=1271922590
TIME_tvnsec=886742634
SEQUENCE_NUM=1
RC_FROM_EVPROD=0
BEGIN_EVPROD_INFO
EVENT_TYPE=NODE_DELETE
NODE_NUMBER=1
NODE_ID=0x76497CF2CF1111DF8D83BEB25D4C4703
CLUSTER_ID=0x6EA7B08888D811DFB918BEB25635B404
END_EVPROD_INFO
END_EVENT_INFO

nodeState

nodeState 事件创造器监控集群中某个节点的状态。

EVENT_TYPE 字段会有以下值:

  • NODE_UP:当一个节点启动时会触发(例如,重启或从 HMC 激活后)。
  • NODE_DOWN:当一个节点宕机时会触发(例如,关机、重启或崩溃)。

NODE_NUMBER 和 NODE_ID,帮助识别有问题的相关节点。

清单 5. nodeState 事件发生后的输出结果
BEGIN_EVENT_INFO
TIME_tvsec=1271921536
TIME_tvnsec=68254861
SEQUENCE_NUM=1
RC_FROM_EVPROD=0
BEGIN_EVPROD_INFO
EVENT_TYPE=NODE_UP
NODE_NUMBER=2
NODE_ID=0x76497CF2CF1111DF8D83BEB25D4C4703
CLUSTER_ID=0x6EA7B08888D811DFB918BEB25635B404
END_EVPROD_INFO
END_EVENT_INFO

nodeAddress

nodeAddress 事件创造器监控集群中某个节点的网络地址。

EVENT_TYPE 字段会有以下值:

  • ADDRESS_ADD:添加地址(别名)时会触发(例如,使用 ifconfigchdev 命令)。
  • ADDRESS_DELETE:移除地址(别名)时会触发(例如,使用 ifconfigchdev 命令)。

还会提供有关接口的 INTERFACE_NAME,以及 IP 地址的 FAMILY、ADDRESS 和 NETMASK。

清单 6. nodeAddress 事件发生后的输出结果
BEGIN_EVENT_INFO
TIME_tvsec=1271922254
TIME_tvnsec=9053410
SEQUENCE_NUM=0
RC_FROM_EVPROD=0
BEGIN_EVPROD_INFO
EVENT_TYPE=ADDRESS_ADD
INTERFACE_NAME=et0
FAMILY=2
ADDRESS=0x0A0A0A0A
NETMASK=0xFF000000
NODE_NUMBER=2
NODE_ID=0x76497CF2CF1111DF8D83BEB25D4C4703
CLUSTER_ID=0x6EA7B08888D811DFB918BEB25635B404
END_EVPROD_INFO
END_EVENT_INFO

networkAdapterState

networkAdapterState 事件创造器监控集群中某个节点的网络接口。

EVENT_TYPE 字段会有以下值:

  • ADAPTER_UP:网络接口启动时会触发(例如,使用 ifconfigsmit tcpipchdev 命令)。
  • ADAPTER_DOWN:网络接口关闭时会触发(例如,使用 ifconfigsmit tcpipchdev 命令)。
  • ADAPTER_ADD:添加网络接口时会触发(例如,使用 mkdev 命令)。
  • ADAPTER_DEL:移除网络接口时会触发(例如,使用 rmdev 命令)。

INTERFACE_NAME 字段会提供有关接口的名称。

清单 7. networkAdapterState 事件发生后的输出结果
BEGIN_EVENT_INFO
TIME_tvsec=1271920539
TIME_tvnsec=399378269
SEQUENCE_NUM=1
RC_FROM_EVPROD=0
BEGIN_EVPROD_INFO
EVENT_TYPE=ADAPTER_UP
INTERFACE_NAME=en0
NODE_NUMBER=2
NODE_ID=0x76497CF2CF1111DF8D83BEB25D4C4703
CLUSTER_ID=0x6EA7B08888D811DFB918BEB25635B404
END_EVPROD_INFO
END_EVENT_INFO

nodeContact

nodeContact 事件创造器监控集群中某个节点的最后一次连接状态。

EVENT_TYPE 字段有 CONNECT_UP 和 CONNECT_DOWN 值。当节点重启、关机、崩溃或使用 mkdevrmdev 等命令时会触发此事件。

INTERFACE_NAME 字段会提供有关接口的名称。

清单 8. nodeContact 事件发生后的输出结果
BEGIN_EVENT_INFO
TIME_tvsec=1271921874
TIME_tvnsec=666770128
SEQUENCE_NUM=0
RC_FROM_EVPROD=0
BEGIN_EVPROD_INFO
EVENT_TYPE=CONNECT_DOWN
INTERFACE_NAME=en1
NODE_NUMBER=2
NODE_ID=0x76497CF2CF1111DF8D83BEB25D4C4703
CLUSTER_ID=0x6EA7B08888D811DFB918BEB25635B404
END_EVPROD_INFO
END_EVENT_INFO

clDiskList

clDiskList 事件创造器通知集群中磁盘列表何时发生变化。有一些 AIX 命令,如 chcluster 可以帮助在集群中添加或移除磁盘,从而触发此事件。

在事件输出结果中,EVENT_TYPE 键有两个值。使用其中任何一个都可以知道集群中是添加还是移除了磁盘。

EVENT_TYPE 字段会有以下值:

  • DISK_ADD:集群中添加磁盘时会触发(例如,使用 chcluster 命令)。
  • DISK_DELETE:集群中移除磁盘时会触发(例如,使用 chcluster 命令)。

DISK_NAME 和 DISK_UID 值可帮助识别相关的磁盘。

清单 9. clDiskList 事件发生后的输出结果
BEGIN_EVENT_INFO
TIME_tvsec=1271927983
TIME_tvnsec=696543410
SEQUENCE_NUM=0
RC_FROM_EVPROD=0
BEGIN_EVPROD_INFO
EVENT_TYPE=DISK_ADD
DISK_NAME=cldisk1
DISK_UID=3E213600A0B800016726C000000FF4B8677C80F1724-100 FAStT03IBMfcp
NODE_NUMBER=2
NODE_ID=0xF079E8C801C11DFB918BEB25635B404
CLUSTER_ID=0x6EA7B08888D811DFB918BEB25635B404
END_EVPROD_INFO
END_EVENT_INFO

clDiskState

clDiskState 事件创造器监控集群中的磁盘。

每个节点集群都必须有通用的存储设备可用,或者是通过 Storage Area Network (SAN),或者是通过 SAS 子系统。这些存储设备是集群共享磁盘或是存储库磁盘。

EVENT_TYPE 字段有 DISK_UP 和 DISK_DOWN 值。当磁盘启动或关闭时都会触发此事件。

DISK_NAME 可帮助识别相关的集群磁盘。集群中所有节点上都有全局设备视图,它为集群中所有节点的磁盘提供了的单独的设备名称(例如,在集群中所有节点上,cldisk1 指的都是同一块物理磁盘)。

清单 10. clDiskState 事件发生后的输出结果
BEGIN_EVENT_INFO
TIME_tvsec=1271935734
TIME_tvnsec=265210314
SEQUENCE_NUM=1
RC_FROM_EVPROD=0
BEGIN_EVPROD_INFO
EVENT_TYPE=DISK_DOWN
DISK_NAME=cldisk1
NODE_NUMBER=2
NODE_ID=0x76497CF2CF1111DF8D83BEB25D4C4703
CLUSTER_ID=0x6EA7B08888D811DFB918BEB25635B404
END_EVPROD_INFO
END_EVENT_INFO

repDiskState

repDiskState 事件创造器监控存储库磁盘。集群存储库磁盘用作所有集群配置数据的中央存储库。

当存储库磁盘启动或关闭时,EVENT_TYPE 字段值为 REP_UP 和 REP_DOWN。

DISK_NAME 返回存储库磁盘名。

清单 11. repDiskState 事件发生后的输出结果
BEGIN_EVENT_INFO
TIME_tvsec=1271933757
TIME_tvnsec=134003703
SEQUENCE_NUM=1
RC_FROM_EVPROD=0
BEGIN_EVPROD_INFO
EVENT_TYPE=REP_UP
DISK_NAME=caa_private0
NODE_NUMBER=3
NODE_ID=0x76497CF2CF1111DF8D83BEB25D4C4703
CLUSTER_ID=0x6EA7B08888D811DFB918BEB25635B404
END_EVPROD_INFO
END_EVENT_INFO

diskState

diskstate 事件创造器监控本地磁盘的变化。只有对存储框架支持的磁盘才会发出此通知。本事件不会传递给集群中的其他节点,只会发送给发生此事件的节点。

当本地磁盘启动或关闭时,EVENT_TYPE 字段值为 LOCAL_UP 和 LOCAL_DOWN。

DISK_NAME 可帮助识别有关的本地磁盘。

清单 12. diskState 事件发生后的输出结果
BEGIN_EVENT_INFO
TIME_tvsec=1271935029
TIME_tvnsec=958362343
SEQUENCE_NUM=1
RC_FROM_EVPROD=0
BEGIN_EVPROD_INFO
EVENT_TYPE=LOCAL_UP
DISK_NAME=hdisk1
NODE_NUMBER=2
NODE_ID=0x76497CF2CF1111DF8D83BEB25D4C4703 
CLUSTER_ID=0x6EA7B08888D811DFB918BEB25635B404
END_EVPROD_INFO
END_EVENT_INFO

vgState

vgState 事件创造器验证某个磁盘上 Volume Group 的状态。

无论本地(在 diskState 中注册)还是集群(共享和存储库)磁盘启动或关闭事件发生,都会触发本磁盘上卷组的 VG_UP 和 VG_DOWN 事件。通过使用本事件创造器,应用程序可以通过 LVM 子系统验证磁盘上 Volume Group 的状态。varyonvgvaryoffvg 等命令会触发此事件。

它还会在 DISK_NAME 和 VG_NAME 字段中传递相关的磁盘名和卷组名。

清单 13. vgState 事件发生后的输出结果
BEGIN_EVENT_INFO
TIME_tvsec=1271915408
TIME_tvnsec=699408296
SEQUENCE_NUM=0
RC_FROM_EVPROD=0
BEGIN_EVPROD_INFO
EVENT_TYPE=VG_UP
DISK_NAME=hdisk5
VG_NAME=myvg1
NODE_NUMBER=2
NODE_ID=0x76497CF2CF1111DF8D83BEB25D4C4703 
CLUSTER_ID=0x6EA7B08888D811DFB918BEB25635B404
END_EVPROD_INFO
END_EVENT_INFO

一般事件创造器

当系统是集群的一部分时,其他事件创造器(如 modFile、modDir、 utilFs、waitTmCPU、waitersFreePg、waitTmPgInOut、vmo、schedo 和 processMon)也支持远程通知。

只要在 write() 系统调用中另外加上 CLUSTER=YES 字符串就可以发送和接收此类事件的远程通知。还需要在其他节点上监控这些事件才能接收远程通知。

以下示例演示了当集群上某个节点上的 /etc/passwd 文件修改后,会返回什么内容。事件发生的本地节点会收到如下通知:

清单 14. “本地” 集群事件示例
Event corresponding to /aha/fs/modFile.monFactory/etc/passwd.mon 
has occurred.BEGIN_EVENT_INFO
TIME_tvsec=1285753875
TIME_tvnsec=613266683
SEQUENCE_NUM=0
PID=8192002
UID=0
UID_LOGIN=0
GID=0
PROG_NAME=vi
RC_FROM_EVPROD=1000
BEGIN_EVPROD_INFO
NODE_NUMBER=2
NODE_ID=0x31E6CEAECA3711DF89F6BEB25D4C4703
CLUSTER_ID=0xAD3903B4CB9B11DF90E9BEB25635B404
END_EVPROD_INFO
STACK_TRACE
ahafs_evprods+70C
aha_process_vnop+160
vnop_rdwr+7DC
vno_rw+B4
rwuio+100
rdwr+188
kewrite+104
.svc_instr
write+1A4
putfile+154
wop+154
commands+1F8C
vmain+154
vop+4AC
commands+1E44
main+7E4
__start+68
END_EVENT_INFO

集群中监控此事件的所有节点也会立即收到通知。

清单 15. “远程” 集群事件示例
Event corresponding to /aha/fs/modFile.monFactory/etc/passwd.mon 
has occurred.BEGIN_EVENT_INFO
TIME_tvsec=1285753875
TIME_tvnsec=538355111
SEQUENCE_NUM=0
RC_FROM_EVPROD=0
BEGIN_EVPROD_INFO
NODE_NUMBER=2
NODE_ID=0x31E6CEAECA3711DF89F6BEB25D4C4703
CLUSTER_ID=0xAD3903B4CB9B11DF90E9BEB25635B404
END_EVPROD_INFO
END_EVENT_INFO

结束语

可以通过使用 AIX Event Infrastructure 来监控 Cluster Aware AIX 事件。这些都集成在 AIX 6.1 TL6 和 7.1 版本中。需要得到事件通知的用户和管理员可以利用此架构并从中受益。监控事件通知还能提升系统的性能。

参考资料

学习

获得产品和技术

  • 试用 IBM 软件 。下载试用版、登录到在线试用版、在沙箱环境下使用产品或通过云访问。有 100 多种 IBM 产品试用版可供选择。

讨论

条评论

developerWorks: 登录

标有星(*)号的字段是必填字段。


需要一个 IBM ID?
忘记 IBM ID?


忘记密码?
更改您的密码

单击提交则表示您同意developerWorks 的条款和条件。 查看条款和条件

 


在您首次登录 developerWorks 时,会为您创建一份个人概要。您的个人概要中的信息(您的姓名、国家/地区,以及公司名称)是公开显示的,而且会随着您发布的任何内容一起显示,除非您选择隐藏您的公司名称。您可以随时更新您的 IBM 帐户。

所有提交的信息确保安全。

选择您的昵称



当您初次登录到 developerWorks 时,将会为您创建一份概要信息,您需要指定一个昵称。您的昵称将和您在 developerWorks 发布的内容显示在一起。

昵称长度在 3 至 31 个字符之间。 您的昵称在 developerWorks 社区中必须是唯一的,并且出于隐私保护的原因,不能是您的电子邮件地址。

标有星(*)号的字段是必填字段。

(昵称长度在 3 至 31 个字符之间)

单击提交则表示您同意developerWorks 的条款和条件。 查看条款和条件.

 


所有提交的信息确保安全。


static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=10
Zone=AIX and UNIX
ArticleID=764376
ArticleTitle=监控 AIX 集群中的事件
publish-date=10102011