如果时光倒流照片:HACMP 5.x 完全手册,第 2 部分:配置
来源:百度文库 编辑:偶看新闻 时间:2024/04/30 18:04:15
本系列文章的作者通过自己长期的实际项目工作经历,总结出了他对于 HACMP 设计实施的经验。本系列会分为 4 部分,会向您详细地介绍实施HACMP 过程中会经历的各个过程,如设计,配置,安装,测试等。本文为第 2 部分,会向您介绍 HAMCP 的具体配置过程。
配置准备
总的来说,配置前的准备必不可少,这一步还要仔细小心,准备不充分或有遗漏以及这步的细节疏忽会导致后面的配置出现网卡、磁盘找不到等现象。将会直接导致后面的配置失败。
修改 .rhosts
[host1][root]vi /.rhosts host1 host1_l2_boot1 host1_l1_boot1 host1_l2_svc host1_l1_svc1 host1_l1_svc2 host1_l2_boot2 host1_l1_boot2 host2 host2_l2_boot1 host2_l1_boot1 host2_l2_svc host2_l1_svc1 host2_l1_svc2 host2_l2_boot2 host2_l1_boot2在 HACMP 5.2 中为了安全起见,不再使用 /.rhosts 文件来控制两台机器之间的命令和数据交换,使用 /usr/es/sbin/cluster/etc/rhosts 文件来代替 /.rhosts 文件的功能。
注意:如果两个节点间的通讯发生了什么问题,可以检查 rhosts 文件,或者编辑 rhosts 文件加入两个节点的网络信息。为方便配置期间检查发现问题,配置期间我们让 /.rhosts 和 HACMP 的 rhosts 一致。
cp /.rhosts /usr/es/sbin/cluster/etc/rhosts rcp /.rhosts host2:/usr/es/sbin/cluster/etc/rhosts rcp /.rhosts host2:/添加共享 vg:
[host1][root][/]>lspv hdisk0 00c1fe1f0215b425 rootvg active hdisk1 00c1fe1f8d700839 rootvg active hdisk2 none none hdisk3 none none
smitty vg -> Add a Volume Group
[host1][root][/]>lspv 。。。 hdisk2 00c1eedf6ddb9f5e host1vg active hdisk3 00c1eedffa577b0e host2vg active建立文件系统
由于后面需要修改 loglv,必须建立文件系统才会有 loglv,所以需要先建立在 host1vg 上的 /ora10runc 和 host2vg 上的 /ora10run 的 JFS2 文件系统,其他文件系统在 实施中的配置 中添加。
smitty lv ->Add a Logical Volume, 注意选择 JFS2
smitty fs-> Enhanced Journaled File Systems -> Add a Journaled File System
[host1][root][/]>lsfs Name Nodename Mount Pt VFS Size Options Auto Accounting ... /dev/ora10runlv -- /ora10run jfs2 15728640 rw yes no /dev/ora10runclv -- /oraproddata jfs2 323747840 rw yes no ...修改 loglv
这一步有 2 个目的,一是避免两边 loglv 重名,二是规范 loglv 的取名,使它看起来更清楚明了。
host1vg (host2vg 也要修改)
- 查看
[host1][root][/]>varyonvg host1vg [host1][root][/]>lsvg -l host1vg host1vg: LV NAME TYPE LPs PPs PVs LV STATE MOUNT POINT ora10runclv jfs2 100 100 2 open/syncd /ora10runc loglv06 jfs2log 1 1 1 open/syncd N/Aumount vg 上所有 fs
umount /ora10runc
- 修改 loglv 名称
[host1][root][/]> chlv -n host1_loglv loglv06 0516-712 chlv: The chlv succeeded, however chfs must now be run on every filesystem which references the old log name loglv06. [host1][root][/]>lsvg -l host1vg host1vg: LV NAME TYPE LPs PPs PVs LV STATE MOUNT POINT ora10runclv jfs2 100 100 2 closed/syncd /ora10runc host1_loglv jfs2log 1 1 1 closed/syncd N/A [host1][root][/]> vi /etc/filesystems 将 "log = /dev/loglv06" 的改为 "log =/dev/host1_loglv"确认 :
[host1][root][/]>mount /ora10runc整理 vg
在每台机器上都运行以下脚本( 替换成您实际 vg 的名称 )
varyoffvg host1vg varyoffvg host2vg exportvg host1vg exportvg host2vg chdev -l hdisk2 -a pv=yes chdev -l hdisk3 -a pv=yes importvg -V 101 -n -y host1vg hdisk2 varyonvg host1vg chvg -an host1vg importvg -V 201 -n -y host2vg hdisk3 varyonvg host2vg chvg -an host2vg varyoffvg host1vg varyoffvg host2vg确认:
[host1][root][/]>lspv 。。。 hdisk2 00c1eedf6ddb9f5e host1vg hdisk3 00c1eedffa577b0e host2vg [host2][root][/]>lspv 。。。 hdisk2 00c1eedf6ddb9f5e host1vg hdisk3 00c1eedffa577b0e host2vg [host2][root][/]>lsfs Name Nodename Mount Pt VFS Size Options Auto Accounting ... /dev/ora10runlv -- /ora10run jfs2 15728640 rw yes no /dev/ora10runclv -- /oraproddata jfs2 323747840 rw yes no修改 IP 地址
按照规划,使用 smitty tcpip 命令修改 2 台机器的 IP 地址, 最终修改为:
[host1][root][/]>netstat -in Name Mtu Network Address Ipkts Ierrs Opkts Oerrs Coll en0 1500 link#2 0.9.6b.dd.e1.aa 2177624 0 1368126 0 0 en0 1500 10.2.1 10.2.1.1 2177624 0 1368126 0 0 en1 1500 link#3 0.9.6b.dd.e1.ab 1928315 0 1222071 0 0 en1 1500 10.2.2 10.2.2.1 1928315 0 1222071 0 0 en2 1500 link#4 0.11.25.8.cf.23 1532962 0 868518 0 0 en2 1500 10.2.11 10.2.11.1 1532962 0 868518 0 0 en3 1500 link#5 0.11.25.8.cd.fa 1633025 0 969811 0 0 en3 1500 10.2.12 10.2.12.1 1633025 0 969811 0 0 [host2][root][/]>netstat -in Name Mtu Network Address Ipkts Ierrs Opkts Oerrs Coll en0 1500 link#2 0.9.6b.dd.e5.64 1169895 0 1119848 0 0 en0 1500 10.2.1 10.2.1.2 1169895 0 1119848 0 0 en1 1500 link#3 0.9.6b.dd.e5.65 2070363 0 1607863 0 0 en1 1500 10.2.2 10.2.2.2 2070363 0 1607863 0 0 en2 1500 link#4 0.11.25.8.db.20 1647564 0 1178253 0 0 en2 1500 10.2.11 10.2.11.2 1647564 0 1178253 0 0 en3 1500 link#5 0.11.25.8.da.80 1631680 0 998077 0 0 en3 1500 10.2.12 10.2.12.2 1631680 0 998077 0 0修改 /etc/hosts
修改并确认每台机器的 /etc/hosts 文件为 :
127.0.0.1 loopback localhost # loopback (lo0) name/address 10.2.2.1 host1_l2_boot1 host1 10.2.1.1 host1_l1_boot1 10.2.200.1 host1_l2_svc 10.2.100.1 host1_l1_svc1 10.2.101.1 host1_l1_svc2 10.2.12.1 host1_l2_boot2 10.2.11.1 host1_l1_boot2 10.2.2.2 host2_l2_boot1 host2 10.2.1.2 host2_l1_boot1 10.2.200.2 host2_l2_svc 10.2.100.2 host2_l1_svc1 10.2.101.2 host2_l1_svc2 10.2.12.2 host2_l2_boot2 10.2.11.2 host2_l1_boot2注: 正式配置之前,主机名落在 boot IP 地址上,待配置完成后将改为服务 IP 地址上。
编写初步启停脚本
mkdir -p /usr/sbin/cluster/app/log [host1][root][/usr/sbin/cluster/app]>ls start_host1 start_host2 stop_host1 stop_host2 #start_host1 banner start host1 route delete 0 route add 0 10.2.200.254 banner end host1 exit 0 # stop_host1 banner stop host1 banner end host1 exit 0 # start_host2 banner start host2 route delete 0 route add 0 10.2.200.254 banner end start host2 #stop_host2 banner stop host2 banner end host2 exit 0编写完成后复制到另一节点上:
[host1][root][/usr/sbin/cluster]>rcp -rp app host2:/usr/sbin/cluster注意:在两个节点要保证 hosts 和启动 / 停止脚本要一样存在。 同时网关在启动脚本里要增加。
配置 tty 心跳网络 / 磁盘心跳
- 串口线心跳(两边都要增加)
smitty tty->Change / add a TTY->rs232->sa->port number : 0
确认
host1: cat /etc/hosts>/dev/tty0
host2: cat
在 host2 可看到 host1 上 /etc/hosts 的内容。
同样反向检测一下。
- 磁盘心跳参考
- 建立 1 个共享盘(1G 足够)。
- 两边在此盘上都建立 enhance current vg—〉ha_heart(取名),不用 varyon
回页首首次配置(不带应用的 HACMP 配置)
以前的绝大多数配置HACMP,没有明确的这个阶段,都是先两边各自配置用户,文件系统等,然后通过修正同步来配置,这样做的好处是不受任何约束,但坏处是脉络不清晰,在配置和日后使用时不能养成良好习惯,必然经常造成两边的不一致,使得停机整理 VG 这样各节点同步的事情重复劳动,并且很容易疏忽和遗漏。
这一步的目的是为了配置一个和应用暂时无关的“纯粹”的 HACMP,方便检测和下一步的工作,可以理解为“不带应用的 HACMP 配置”。
此外,虽然 HACMP 配置分为标准配置 (Standard) 和扩充配置(Extend)两种,但我个人觉得还是以扩充配置为主,使用起来步骤更清晰明了,容易控制。而且完全用标准配置则复杂的做不了,简单的有可能做错,不做推荐。
添加 cluster 和 node
smitty hacmp ->Initialization and Standard Configuration ->Add Nodes to an HACMP Cluster ->
* Cluster Name [test_cluster] New Nodes (via selected communication paths)[m [host1 host2] Currently Configured Node(s)这一步很重要,一般我们都是把每个节点的 boot 作为 communication path。New node 可以一起加,也可以一个一个的加。当回车以后,系统会自己 discover HACMP 的资源,显示如下:
…… There are 2 node(s) and 3 network(s) defined NODE host1: Network net_ether_01 host1_l1_boot1 10.2.1.1 Network net_ether_02 host1_l2_boot1 10.2.2.1 Network net_ether_03 host1_l2_boot2 10.2.12.1 host1_l1_boot2 10.2.11.1 NODE host2: Network net_ether_01 host2_l1_boot1 10.2.1.2 Network net_ether_02 host2_l2_boot1 10.2.2.2 Network net_ether_03 host2_l1_boot2 10.2.11.2 host1_l2_boot2 10.2.12.2 ……………………..添加 network,修改网卡归属
通过上面步骤地自动 discovery,实际一般 network 和 devices 均已添加,我们只需略做修正就可以了。
smitty hacmp->Extended Configuration->Extended TopologyConfiguration ->Configure HACMP Communication Interfaces/Devices->Change/Show Communication Interfaces/Devices
选
en0
host1_l1_boot
2
等
Change/Show a Communication Interface Type or select values in entry fields. Press Enter AFTER making all desired changes. [Entry Fields] Node Name [host1] Network Interface en2 IP Label/Address host1_l1_boot2 Network Type ether * Network Name [net_ether_03]–〉net_ether_02同样修改 host2_l1_boot1
这样可以看到 net_ether_03 没有了。
添加心跳网络
smitty hacmp ->Extended Configuration->Extended TopologyConfiguration->Configure HACMP CommunicationInterfaces/Devices->Add Communication Interfaces/Devices ->AddDiscovered Communication Interface and Devices->CommunicationDevices
- 串口心跳
# Node Device Device Path host1 tty0 /dev/tty0 host2 tty0 /dev/tty0
- 另:磁盘心跳参考
# Node Device Device Path Pvid host1 hdisk5 /dev/hdisk5 00c1eedfbf8 x host2 hdisk5 /dev/hdisk5 00c1eedfbf8 x
按 F7 逐一选中回车,将增加心跳网络,至此 HACMP 的拓扑结构已配好看确认拓扑 (toplog) 结构
smitty hacmp->Extended Configuration ->Extended TopologyConfiguration ->Show HACMP Topology ->Show Cluster Topology
Cluster Name: test_cluster Cluster Connection Authentication Mode: Standard Cluster Message Authentication Mode: None Cluster Message Encryption: None Use Persistent Labels for Communication: No NODE host1: Network net_rs232_01 host1_tty0_01 /dev/tty0 Network net_ether_01 host1_l1_boot1 10.2.1.1 host1_l1_boot2 10.2.11.1 Network net_ether_02 host1_l2_boot1 10.2.2.1 host1_l2_boot2 10.2.12.1 NODE host2: Network net_rs232_01 host2_tty0_01 /dev/tty0 Network net_ether_01 host2_l1_boot1 10.2.1.1 host2_l1_boot2 10.2.11.1 Network net_ether_02 host2_l2_boot1 10.2.2.1 host2_l2_boot2 10.2.12.1可以看到已符合规划要求,可以继续下面的配置。
添加高可用资源
- service ip
- 应用服务器
- vg 和 jfs
- 添加 应用服务器
smitty hacmp ->Extended Configuration ->Extended ResourceConfiguration ->HACMP Extended Resources Configuration->Configure HACMP Applications ->Configure HACMP ApplicationServers ->Add an Application Server
* Server Name [host1_app] * Start Script. [/usr/sbin/cluster/app/start_host1] * Stop Script. [/usr/sbin/cluster/app/stop_host1] Application Monitor Name(s)同样增加 host2_app
* Server Name [host2_app] * Start Script. [/usr/sbin/cluster/app/start_host2] * Stop Script. [/usr/sbin/cluster/app/stop_host2]
- 添加 service ip
smity hacmp ->Extended Configuration->Extended ResourceConfiguration ->HACMP Extended Resources Configuration->Configure HACMP Service IP Labels/Addresses ->Add a Service IPLabel/Address ->Configurable on Multiple Nodes
net_ether_01(10.2.1.0/24 10.2.11.0/24) * IP Label/Address host1_l1_svc * Network Name net_ether_01 Alternate HW Address to accompany IP Label/Address []同样增加其他服务 ip 地址。
- 创建资源组
smitty hacmp ->Extended Configuration-> Extended ResourceConfiguration ->HACMP Extended Resource Group Configuration-> Adda Resource Group Add a Resource Group (extended)
Type or select values in entry fields. Press Enter AFTER making all desired changes. [Entry Fields] * Resource Group Name [host1_RG] * Participating Nodes (Default Node Priority) [host1 host2] Startup Policy Online On Home Node Only Fallover Policy Fallover To Next Priority Node In The List Fallback Policy Fallback To Higher Priority Node In The List同样建立 host2_RG ,
Resource Group Name [host2_RG] * Participating Nodes (Default Node Priority) [host2 host1]注意,这里如果是主备模式,host2 仅做备机 ,则为 :
Resource Group Name [host2_RG] * Participating Nodes (Default Node Priority) [host2]
- 配置资源组
smitty hacmp ->Extended Configuration->Extended ResourceConfiguration ->HACMP Extended Resource Group Configuration->Change/Show Resources and Attributes for a Resource Group
选择 host1_RG
Change/Show All Resources and Attributes for a Resource Group Type or select values in entry fields. Press Enter AFTER making all desired changes. [Entry Fields] Resource Group Name host1_RG Participating Nodes (Default Node Priority) host1 host2 Startup Policy Online On Home Node Only Fallover Policy Fallover To Next Priority Node In The List Fallback Policy Fallback To Higher Priority Node In The List Fallback Timer Policy (empty is immediate) [] Service IP Labels/Addresses [host1_l1_svc1 host1_l1_svc2 host1_l2_svc] Application Servers [host1_app] Volume Groups [host1vg] Use forced varyon of volume groups, if necessary false同样的方法配置 host2_RG
检查和同步 HACMP 配置
( 注意: 以上 配置均在 host1 上完成, 同步至少 2 次, 先强制同步到 host2)
smitty hacmp ->Extended Configuration->Extended Verification and Synchronization
首次强制同步:
HACMP Verification and Synchronization Type or select values in entry fields. Press Enter AFTER making all desired changes. [Entry Fields] * Verify, Synchronize or Both [Both] * Automatically correct errors found during [Yes] verification? * Force synchronization if verification fails? [Yes] * Verify changes only? [No] * Logging [Standard]同步:
HACMP Verification and Synchronization Type or select values in entry fields. Press Enter AFTER making all desired changes. [Entry Fields] * Verify, Synchronize or Both [Both] * Automatically correct errors found during [Yes] verification? * Force synchronization if verification fails? [No] * Verify changes only? [No] * Logging [Standard]记得修改 /etc/hosts, 改为 svc 的地址上。
10.2.2.1 host1_l2_boot1 10.2.1.1 host1_l1_boot1 10.2.200.1 host1_l2_svc host1 10.2.100.1 host1_l1_svc1 10.2.101.1 host1_l1_svc2 10.2.12.1 host1_l2_boot2 10.2.11.1 host1_l1_boot2 10.2.2.2 host2_l2_boot1 10.2.1.2 host2_l1_boot1 10.2.200.2 host2_l2_svc host2 10.2.100.2 host2_l1_svc1 10.2.101.2 host2_l1_svc2 10.2.12.2 host2_l2_boot2 10.2.11.2 host2_l1_boot2修改 syncd daemon 的数据刷新频率
该值表示刷新内存数据到硬盘的频率,缺省为 60,HACMP 安装后一般可改为 10,在下次重起时实际生效。
smitty HACMP -> HACMP Extended Configuration > Advanced Performance Tuning
Parameters > Change/Show syncd frequency ->10
或者
/usr/es/sbin/cluster/utilities/clchsyncd 10
当然也可直接修改 /etc/rc.boot 里相应语句,但已不推荐。
到此为止我们的 HACMP 已经基本配置完成了。
启动 HACMP:
在所有节点启动 HACMP
smitty clstart
* Start now, on system restart or both now Start Cluster Services on these nodes [scmb02] BROADCAST message at startup? true Startup Cluster Lock Services? false Startup Cluster Information Daemon? true Reacquire resources after forced down ? false确认 HACMP 配置完成
使用 HACMP 的工具 clverify,cldump,clstat 检查,参见“测试维护”部分。
回页首实施中的配置
HACMP 首次配置后,这个步骤会和实际应用程序的安装配置工作交织在一起,时间跨度较长,并可能有反复,所以单独列出一部分。此过程如果不注意实施细节,会导致两边配置不一致,HACMP 在最终配置时需要重新整理 VG 或同步增加用户等工作。
本章的其他操作和“测试维护”部分的“变更与实现”有些重复,所以只对添加部分介绍。
利用 C-SPOC,我们可以实现在任一台节点机上操作共享或并发的 LVM 组件(vg,lv,fs),系统的 clcomd 的 Demon 自动同步到其他机器上。
root 237690 135372 0 Dec 19 - 0:26 /usr/es/sbin/cluster/clcomd -d增加组和用户
利用 HACMP 的功能,只需在一台机器操作,会自动同步到另一台。
增加组:
smitty hacmp-> Extended Configuration-> Security and UsersConfiguration-> -> Groups in an HACMP cluster-> Add a Group tothe Cluster
选择 host2_RG
Add a Group to the Cluster Type or select values in entry fields. Press Enter AFTER making all desired changes. [Entry Fields] Select nodes by Resource Group host2_RG *** No selection means all nodes! *** * Group NAME [dba] ADMINISTRATIVE group? false Group ID [201] ….同样在 host1_RG 增加 bea 组 .
增加用户
smitty hacmp-> Extended Configuration-> Security and UsersConfiguration-> ->Users in an HACMP cluster-> Add a User tothe Cluster
选择 host2_RG
Add a User to the Cluster Type or select values in entry fields. Press Enter AFTER making all desired changes. [TOP] [Entry Fields] Select nodes by Resource Group host2_RG *** No selection means all nodes! *** * User NAME [orarun] User ID [209]其他根据具体情况可设置
同样在 host1_RG 增加 orarunc,xcom 等用户
确认 :
[host2][root][/]>lsgroup ALL [host2][root][/]>lsusers ALL初始化用户口令
smitty hacmp ->Extended Configuration -> Security and UsersConfiguration -> Passwords in an HACMP cluster -> Change a User'sPassword in the Cluster
Selection nodes by resource group host2_RG *** No selection means all nodes! *** * User NAME [orarun] User must change password on first login? false此时需要你输入新口令更改:
COMMAND STATUS Command: running stdout: no stderr: no Before command completion, additional instructions may appear below. orarun's New password: Enter the new password again: OK 即成功增加 lv 和文件系统
利用 HACMP 的功能,只需在一台机器操作,会自动同步到另一台,无需考虑 VG 是否 varyon。
增加 lv:smitty hacmp-> System Management (C-SPOC)-> HACMP LogicalVolume Management ->Shared Logical Volumes-> Add a Shared LogicalVolume
选择 host2_RG host2vg,host2 hdisk3
Add a Shared Logical Volume Type or select values in entry fields. Press Enter AFTER making all desired changes. [Entry Fields] Resource Group Name host2_RG VOLUME GROUP name host2vg Reference node host2 * Number of LOGICAL PARTITIONS [100] PHYSICAL VOLUME names hdisk3 Logical volume NAME [oradatalv] Logical volume TYPE [jfs2]同样建立 host1_RG 的其他 lv。
建立文件系统:
smitty hacmp-> System Management (C-SPOC)-> HACMP LogicalVolume Management ->Shared File Systems -> Enhanced JournaledFile Systems -> Add an Enhanced Journaled File System on aPreviously Defined Logical Volume
选择 oradatalv host1,host2,
Node Names host1,host2, LOGICAL VOLUME name oradatalv * MOUNT POINT [/oradata] PERMISSIONS read/write …同样建立其它文件系统。
建立好后,这些文件系统自动自动 mount。
修改文件系统的目录权限,保证两边一致
[host2][root][/]>chown orarun:dba /ora10run [host2][root][/]>chown orarun:dba /oradata [host1][root][/]>chown bsx1:bea /bsx1同样其他文件系统也要如此操作。
确认:
[host2][root][/]>df -k [host2][root][/]>ls -l /oradata [host1][root][/]>df -k安装配置应用
这里包括安装配置 host2 上的数据库和 host1 上的 tuxedo、mes、通信软件,由于和 HACMP 本身关系不大,所以不再描述。
回页首最终配置 ( 带应用的 HACMP 配置 )
这一步一般在应用程序已经稳定,不做大的变动时进行。大都是在系统快上线前的一段时间进行,伴随最终设置的完成,应该跟随一个完整的测试过程。
这一步也可以理解为“带应用的 HACMP 配置”,所以主要工作是确认在 HACMP 的切换等行为中,应用脚本的正确性和健壮性。
起停脚本已经编写完备并本机测试
具体脚本的内容请参见后面的“脚本和经验“部分。
同步脚本
[host2][root][/home/scripts]>rcp -rp comm host1:/home
[host1][root][/home/scripts]>rcp -rp host2 host1:/home/scripts
[host1][root][/home/scripts]>rcp -rp host1:/home/scripts/host1 .
确认检查和处理
这一步是确认经过一段时间后,HACMP 是否需要修正和同步,参考“测试和维护“部分的”日常检查及处理“。
互拷用户的 .profile 等环境文件
[host2][root][/home/orarun]>rcp * host1:/home/ora10run
[host2][root][/home/orarun]>rcp .profile host1:/home/ora10run
[host2][root][/home/orarun]>rsh host1 chown -R orarun:dba /home/ora10run
[host1][root][/home/tuxrun]> rcp * host1:/home/tuxrun
[host1][root][/home/tuxrun]> rcp .profile host1:/home/tuxrun
[host1][root][/home/tuxrun]> rsh host2 chown -R tuxrun:bea /home/tuxrun
同样要全部互拷,不要遗漏。
也可以做如下操作,似乎更为简单:
[host2][root][/home]>tar ?cvf host2_user.tar ora10run
[host2][root][/home]>rcp host2_user.tar host1:/home
[host1][root][/home]> tar -xvf host2_user.tar
[host1][root][/home] > tar ?cvf host1_user.tar ora10runc tuxrun bsx1 xcom
[host1][root][/home]> rcp host1_user.tar host2:/home
[host2][root][/home]> tar -xvf host1_user.tar
测试:
建议实施完整测试 , 最低限度为标准测试,具体参见“测试和维护”部分。
总结
本文结合第一部分内容主要对 HACMP的后续配置进行了较为详尽的描述。实际我们通常认为的项目集成工作告一段落,这部分都是我们的实际工作整理,相信读者可以按照本文予以顺利实施。但由于实际工作中要想 HACMP 真正发挥应有的作用,测试和维护必不可少,而以往的资料很少对此作专门的论述,所以我们后面对此进行了专门的论述。