版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
Linux集群服务的安装部署第12章Linux集群服务的安装部署集群是企业应用在IT环境部署中常用的一项重要技术,对于广大系统管理员而言,集群相对单机应用更难掌握,同时参考资料相对较少,实验环境也比较复杂。本书第10章描述了在企业应用中磁盘冗余为系统数据保护带来的众多好处,这实际上反映的就是系统高可用性的概念;结合第11章内容,本章将通过Oracle在Linux中的高可用集群安装部署,以及Apache在Linux下的负载均衡部署来进行实例讲解,深入浅出地阐述集群概念,希望能解决Linux管理员遇到的实际问题。12.1
集群的优势及分类集群的定义:"集群是一种计算机系统,它通过一组松散集成的计算机软件和/或硬件连接起来,从而高度紧密地协作以完成计算工作。从某种意义上讲,它可以被看作一台计算机。集群系统中的单个计算机通常称为节点。节点之间通常通过局域网来连接,但也有其他的可能连接方式。集群计算机通常用来改进单个计算机的计算速度和/或可靠性。"在设计或部署集群环境时,除了要求有多台服务器用于实现冗余以外,设备的冗余也十分重要,服务器中的冗余设备可以有效降低单台服务器的宕机几率。它们主要包括:网卡绑定磁盘阵列(请参考本书第10章内容)磁盘多路径绑定冗余电源集群通常被划分为4大类:高可用集群(HighAvailability,简称HA)负载均衡集群(LoadBalancing)高性能集群(HighPerformanceComputing,简称HPC)网格计算(GridComputing)缘于企业应用的多样性,我们一般在企业应用中会通过"高可用集群"或"负载均衡集群"来实现集群。这两类集群有较高的易用性和通用性,可用于各种Web服务器、数据库服务器、企业中间件及应用系统,以保障企业核心应用服务的持续运行并提高系统的整体性能。"高性能集群"及"网格计算"多用于科学计算领域或需要进行持续统计的行业,如航天环境模拟、地震分析、化学分析、气候研究、石油勘探、碰撞模拟、股票分析及电影特效等。12.2
集群系统规划在开始讲述集群中的各种实际配置操作之前,我们需要先了解下集群系统的要求、标准及注意事项。行业中常常会看到"5个9(FiveNine)"标准,用于评估一套处于工作运行状态的集群在全年内的可用性表现。一个集群系统全年的可用性指标计算公式为:系统可用率=(总评估时间-总失效时间)/总评估时间其中:总失效时间=计划内停机时间+计划外停机时间最后得出一个计算的百分比值,如99.999%,这里的每一个9都代表了不同的年度"总失效时间":99.999%35天4天8小时50分钟5分钟
从上面的"系统可用率"计算公式中我们可以看出,"总评估时间"是一个恒定的值,要提高"系统可用率",最重要的就是减少系统的整体"总失效时间"时间,这就要求系统尽量避免"单点故障"。因为一旦系统要求"总失效时间"在10分钟以内,便意味着当出现问题时,维护人员根本没有时间对系统进行排错,甚至没有时间进行设备的人工更换。因此,集群系统要求对软硬件环境的方方面面做到未雨绸谬,让更多的设备及服务可以在集群策略中实现自动切换,以减少"总失效时间"。在Linux系统中,我们可以采取各方面的技术来提高系统的可用性,如:网卡绑定:将多个网卡连接到不同的交换机上,并在操作系统中将它们绑定为同一个IP,客户端通过这个IP实现系统访问;当网络中的某个交换机或系统中的某个网卡发生故障时,系统会根据配置策略通过冗余的网卡进行传输。磁盘多路径绑定:与网卡绑定的功能类似,在规划中服务器通常会通过多个HBA光纤卡连接到磁盘阵列以提高系统磁盘连路的可用性;磁盘多路径绑定,就是将这些HBA卡所连接的相同磁盘存储设备绑定为一个系统存储设备的连接符以供应用程序使用。冗余电源:除网络及磁盘外,电源是系统中另一个很容易发生"单点故障"的设备,通过在服务器中使用双路电源,并连接两路独立的"市电(城市供电系统是多路供电的,一般IDC机房都会配有多路供电,以防止因某线路出现供电问题向导致系统瘫痪)"可以达到电源冗余的效果。当然还应该在服务器电源与"市电"之间加入带稳压功能的UPS,以提高电流的稳定性。12.3
网卡绑定12.3.1
配置前的准备以下是服务器中的网卡配置,当中有两个网卡,都是通过DHCP来自动获取IP地址:[root@localhost
~]#
ifconfig
[root@localhost
~]#
cat
/etc/sysconfig/network-script/ifcfg-eth0
Realtek
Semiconductor
Co.,
Ltd.
RTL-8139/8139C/8139C+
DEVICE=eth0
BOOTPROTO=dhcp
HWADDR=54:52:00:35:f9:a0
ONBOOT=yes
TYPE=Ethernet
[root@localhost
~]#
cat
/etc/sysconfig/network-script/ifcfg-eth1
Realtek
Semiconductor
Co.,
Ltd.
RTL-8139/8139C/8139C+
DEVICE=eth1
BOOTPROTO=dhcp
HWADDR=54:52:00:7a:37:ce
ONBOOT=yes
TYPE=Ethernet
注意:当系统中有多个网卡需要进行设置时,建议将网卡的MAC地址与ethX文件中的HWADDR一一对应,否则系统重启后网卡的eth号很可能会发生改变,在设置了网卡绑定的生产系统中,这是非常危险的。确认系统中已经安装了sysstat包,以便进行bonding测试:[root@localhost
~]#
rpm
-ivh
/mnt/cdrom/
Server/sysstat-7.0.2-
1.el5.x86_64.rpm
[root@localhost
~]#
rpm
-q
sysstat
sysstat-7.0.2-1.el5
12.3.2
网卡绑定配置配置驱动模块修改文件/etc/modprobe.conf,找到:alias
eth0
8139cp
alias
eth1
8139cp
注意:8139cp为网卡型号。在此内容后加入:########
Bonding
##########
alias
bond0
bonding
options
bonding
max_bonds=1
建立bonding网卡配置新建文件/etc/sysconfig/network-scripts/ifcfg-bond0,输入以下内容:DEVICE=bond0
ONBOOT=yes
BOOTPROTO=static
IPADDR=1
NETMASK=
USERCTL=no
BONDING_OPTS="mode=1
miimon=100
primary=eth0"
BONDING_OPTS参数解释
此参数用于指定网卡绑定时的属性,以下是对常用参数进行的解释:miimon参数:指定网卡故障时的切换时间间隔以ms为单位。primary参数:指定默认的主网卡设备。mode参数:0-轮询模式,所绑定的网卡会针对访问以轮询算法进行平分。1-高可用模式,运行时只使用一个网卡,其余网卡作为备份,在负载不超过单块网卡带宽或压力时建议使用。2-基于HASH算法的负载均衡模式,网卡的分流按照xmit_hash_policy的TCP协议层设置来进行HASH计算分流,使各种不同处理来源的访问都尽量在同一个网卡上进行处理。3-广播模式,所有被绑定的网卡都将得到相同的数据,一般用于十分特殊的网络需求,如需要对两个互相没有连接的交换机发送相同的数据。4-802.3ab负载均衡模式,要求交换机也支持802.3ab模式,理论上服务器及交换机都支持此模式时,网卡带宽最高可以翻倍(如从1Gbps翻到2Gbps)5-适配器输出负载均衡模式,输出的数据会通过所有被绑定的网卡输出,接收数据时则只选定其中一块网卡。如果正在用于接收数据的网卡发生故障,则由其他网卡接管,要求所用的网卡及网卡驱动可通过ethtool命令得到speed信息。6-适配器输入/输出负载均衡模式,在"模式5"的基础上,在接收数据的同时实现负载均衡,除要求ethtool命令可得到speed信息外,还要求支持对网卡MAC地址的动态修改功能。xmit_hash_policy参数(此参数对mode参数中的2、4模式有影响):layer1-通过MAC地址进行HASH计算。计算公式:(MACsrc⊕MACdest)%Nslavelayer3+4-通过TCP及UDP端口及其IP地址进行HASH计算。计算公式:((portsrc⊕portdest)⊕(IPsrc⊕IPdest))%Nslave注意:mode参数中的0、2、3、4模式要求交换机支持"portsgroup"功能并能进行相应的设置,例如在Cisco中要将所连接的端口设为"trunkgroup"。选择绑定模式的建议如果系统流量不超过单个网卡的带宽,请不要选择使用mode1之外的模式,因为负载均衡需要对流量进行计算,这对系统性能会有所损耗。建议mode5、mode6只在交换机不支持"portsgroup"的情况下选用。如果交换机及网卡都确认支持802.3ab,则实现负载均衡时尽量使用mode4以提高系统性能。修改被绑定网卡的配置修改/etc/sysconfig/network-scripts/ifcfg-eth0为:#
Realtek
Semiconductor
Co.,
Ltd.
RTL-8139/8139C/8139C+
DEVICE=eth0
MASTER=bond0
SLAVE=yes
HWADDR=54:52:00:35:f9:a0
ONBOOT=yes
修改/etc/sysconfig/network-scripts/ifcfg-eth1为:#
Realtek
Semiconductor
Co.,
Ltd.
RTL-8139/8139C/8139C+
DEVICE=eth1
MASTER=bond0
SLAVE=yes
HWADDR=54:52:00:7a:37:ce
ONBOOT=yes
启动网卡绑定设备导入bonding驱动:[root@localhost
~]#
modprobe
-i
bonding
max_bonds=1
bonding:
Warning:
either
miimon
or
arp_interval
and
arp_ip_target
module
parameters
must
be
specified,
otherwise
bonding
will
not
detect
link
failures!
see
bonding.txt
for
details.
此时系统会发出一个警告,意思是bonding驱动要求提供miimon参数或arp_inerval参数与arp_ip_target参数的组合,否则系统将无法检测出网卡设备连接是否失效。由于miimon已经在/etc/sysconfig/network-scripts/ifcfg-bond0中设定,所以可以不用理会此警告。重启网络[root@localhost
~]#
/etc/init.d/network
restart
bonding:
Warning:
either
miimon
or
arp_interval
and
arp_ip_target
module
parameters
must
b
e
specified,
otherwise
bonding
will
not
detect
link
failures!
see
bonding.txt
for
details.
[root@localhost
~]#
cat
network
Shutting
down
interface
eth0
[
OK
]
Shutting
down
interface
eth1
[
OK
]
Shutting
down
loopback
interface:
[
OK
]
Bringing
up
loopback
interface:
[
OK
]
Bringing
up
interface
bond0:
[
OK
]
网络重启完毕,此时由于/etc/sysconfig/network-scripts/ifcfg-bond0中的设置,miimon参数已经生效。以上"导入bonding驱动"及"重启网络"的操作也可以通过重新启动操作系统来实现,但对于一些正在生产环境中运行的系统,一般要求进行系统维护时不影响系统的正常运作。通过以上两个操作可以将系统的"总失效时间"降到最低。如何配置多级网卡绑定设备在实际环境中,常常需要在多个网卡中进行两两绑定。例如,服务器共有4个网卡,分另为eth0、eth1、eth2、eth3,要求对它们两两绑定成bond0和bond1设备,此时需要对以上设定进行一些修改。(1)参考"12.2.2网卡绑定配置"中的"配置驱动模块"部分内容,将/etc/modprobe.conf修改为:########
Bonding
##########
alias
bond0
bonding
alias
bond1
bonding
options
bonding
max_bonds=2
(2)参考"12.2.2网卡绑定配置"中的"建立bonding网卡配置"部分内容,建立bond1的设备配置文件,并相应地修改eth2和eth3的配置,重启网络即可。12.3.3
网卡绑定效果测试测试12-1:在mode1模式且两个网卡都工作正常的情况下进行1GB数据拷贝。[root@localhost~]#
sar
-n
'DEV'1|
grep
-E
'
IFACE|eth0|eth1|bond0'|head
-n
-4
07:16:53
PM
IFACE
rxpck/s
txpck/s
rxbyt/s
txbyt/s
rxcmp/s
txcmp/s
rxmcst/s
07:16:55
PM
eth0
7995.59
4098.53
11983858.
82
274905.88
0.00
0.00
0.00
07:16:55
PM
eth1
0.00
0.00
0.00
0.00
0.00
0.00
0.00
07:16:55
PM
bond0
7995.59
4098.53
11983858.82
274905.88
0.00
0.00
0.00
测试2:在mode1模式,断开eth0上的网线时进行1G数据拷贝[root@localhost
~]#
sar
-n
'DEV'
1|grep
-E
'
IFACE|eth0|eth1|bond0'|head
-n
-4
07:16:41
PM
IFACE
rxpck/s
txpck/s
rxbyt/s
txbyt/s
rxcmp/s
txcmp/s
rxmcst/s
07:19:43
PM
eth0
0.00
0.00
0.00
0.00
0.00
0.00
0.00
07:19:43
PM
eth1
7354.87
3770.10
11023542.19
252876.52
0.00
0.00
0.00
07:19:43
PM
bond07354.87
3770.10
11023542.19
252876.52
0.00
0.00
0.00
测试3:在mode0模式,且两个网卡都正常工作的情况下进行1G数据拷贝[root@localhost~]#
sar-n
'DEV'
1|grep-E
'IFACE
|eth0|eth1|bond0'|head
-n
-4
07:23:15
PM
IFACE
rxpck/s
txpck/s
rxbyt/s
txbyt/s
rxcmp/s
txcmp/s
rxmcst/s
07:23:16
PM
eth0
2994.74
1818.95
4478934.74
129511.58
0.00
0.00
0.00
07:23:16
PM
eth1
3117.89
1817.89
4671258.95
129223.16
0.00
0.00
0.00
07:23:16
PM
bond06112.63
3636.84
9150193.68
258734.74
0.00
0.00
0.0012.4
磁盘多路径绑定12.4.1
配置前的准备要求服务器上已经有两个HBA卡,并连接到了相同的磁盘。此时使用fidsk-l命令查看磁盘,将会发现有两个空间大小完全相同的磁盘。[root@localhost
~]#
fdisk
-l
……
……
Disk
/dev/sdb:
104
MB,
104857600
bytes
4
heads,
50
sectors/track,
1024
cylinders
Units
=
cylinders
of
200
*
512
=
102400
bytes
Device
Boot
Start
End
Blocks
Id
System
Disk
/dev/sdc:
6291
MB,
6291456000
bytes
194
heads,
62
sectors/track,
1021
cylinders
Units
=
cylinders
of
12028
*
512
=
6158336
bytes
Disk
/dev/sdc
doesn't
contain
a
valid
partition
table
Disk
/dev/sdd:
6291
MB,
6291456000
bytes
194
heads,
62
sectors/track,
1021
cylinders
Units
=
cylinders
of
12028
*
512
=
6158336
bytes
Disk
/dev/sdd
doesn't
contain
a
valid
partition
table
通过scsi_id命令可确认sdc和sdd是同一个磁盘:
[root@
localhost
~]#
/sbin/scsi_id
-g
-u
-s
/block/sdb
0QEMU_QEMU_HARDDISK_scsi0-hd1
[root@
localhost
~]#
/sbin/scsi_id
-g
-u
-s
/block/sdc
14945540000000000000000000100000005004d000000d00f
[root@
localhost
~]#
/sbin/scsi_id
-g
-u
-s
/block/sdd
14945540000000000000000000100000005004d000000d00f
确认系统已经安装了multipath软件包:[root@localhost
~]#
rpm
-ivh
/mnt/cdrom/Server/
device-mapper-multipath-0.4.7-17.el5.x86_64.rpm
[root@localhost
~]#
rpm
-q
device-mapper-
multipath
device-mapper-multipath
-0.4.7-17.el5
12.4.2
磁盘多路径绑定配置修改配置文件/etc/multipath.conf找到以下内容并将其注释:#blacklist
{
#
devnode
"*"
#}
这是设备的黑名单列表,系统中可能存在多个可进行绑定的磁盘设备,此列表可以对那些不要求绑定的设备进行过滤,以避免使用中的误操作。配置文件在默认情况下会过滤所有设备,因此系统不会为任何设备匹配绑定链接,将这个部分注释掉之后,multipath会为系统中除本地磁盘以外的所有磁盘设备匹配绑定链接。启动多路径绑定[root@localhost
~]#
/etc/init.d/multipathd
start
[root@localhost
~]#
multipath
-ll
14945540000000000000000000100000005004d000000d00f
dm-3
IET,VIRTUAL-DISK
[size=5.9G][features=0][hwhandler=0\_
round-robin
0
[prio=1][active]
\_
2:0:0:0
sdc
8:32
[active][ready]
\_
round-robin
0
[prio=1][enabled]
\_
1:0:0:0
sdd
8:48
[active][ready]
0QEMU_QEMU_HARDDISK_scsi0-hd1dm-2
QEMU,QEMU
HARDDISK
[size=100M][features=0][hwhandler=0]
\_
round-robin
0
[prio=1][active]
\_
0:0:1:0
sdb
8:16
[active][ready]
此时系统发现了两组磁盘,一组的wwid是0QEMU_QEMU_HARDDISK_scsi0-hd1,绑定了服务器中名为sdb的USB设备;另一组的wwid是14945540000000000000000000100000005004d000000d00f,绑定了服务器通过两路HBA或iSCSI连接的相同磁盘设备,设备名分另为sdc和sdd。在系统运行过程中,为USB设备配置多路径绑定很明显是没有必要的,通过/etc/multipath.conf中的blacklist列表可以过滤此设备。再次修改/etc/multipath.conf,找到blacklist项解开注释,并修改为:blacklist
{
wwid
0QEMU_QEMU_HARDDISK_scsi0-hd1
}
清空所有磁盘绑定设备:[root@localhost
~]#
multipath
-F
重启多路径绑定服务,并使此服务自动启动:[root@localhost
~]#
/etc/init.d/multipathd
restart
[root@localhost
~]#
chkconfig
multipathd
on
[root@localhost
~]#
multipath
-ll
14945540000000000000000000100000005004d000000d00f
dm-2
IET,VIRTUAL-DISK
[size=5.9G][features=0][hwhandler=0\_
round-robin
0
[prio=1][active]
\_
2:0:0:0
sdc
8:32
[active][ready]
\_
round-robin
0
[prio=1][enabled]
\_
1:0:0:0
sdd
8:48
[active][ready]
挂载多路径设备:[root@localhost
~]#
mkfs.ext3
/dev/dm-2
[root@localhost
~]#
mkdir
/mnt/multipath
[root@localhost
~]#
mount
/dev/dm-2
/mnt/multipath
如果需要启动自动挂载,请在/etc/fstab中添加相应的挂载项。multipath.conf配置文件详解(以下内容可以不作修改)除blacklist外,此配置文件中还有一个比较重要的配置项--defaults,用于定义多路径绑定的运行策略。defaults
{
udev_dir
/dev
#设备所在的位置
polling_interval
10
#路径检查间隔
selector
"round-robin
0"
#路径间的轮询操作算法
path_grouping_policy
failover
#路径冗
余策略(配置默认:multibus)
getuid_callout
"/sbin/scsi_id
-g
-u
-s
/block/%n"
#判
断相同设备的规则
prio_callout
/bin/true
#判断设备优先级的方式
path_checker
readsector0
#路径状态的检查模式
rr_min_io
100
#I/O论询的路径切换间隔
max_fds
8192
#允许同时打开
的最大文件描述符
rr_weight
priorities
#轮询时是否使用加权方式
failback
immediate
#发现路径
失效时的操作方式
no_path_retry
fail
#路径失效重试
user_friendly_names
yes
#是否使用友好的设备名
}
主要参数如下:path_grouping_policy:路径冗余策略。multibus-在同一个绑定设备中,所有路径均拥有相同的优先级,因此读写操作通过多路径来实现负载均衡。一旦某一路径失效,访问便会被分流到其他的可用路径。failover-在同一个绑定设备中,只有一个路径拥有优先权,因此磁盘操作都使用同一个路径,一旦此路径失效,操作便会重定向到另一个可用路径。默认值为multibus。建议:与网卡bonding中的模式选择类似,在磁盘I/O低于单个HBA卡的I/O处理能力时,建议使用failover模式,这是因为multibus会消耗额外的CPU资源以进行计算。path_checker:路径状态的检查模式。
readsector0-通过0扇区检查磁盘连路的可用状态,这是一个十分通用的模式。
directio-以直接I/O方式检查磁盘连路的可用状态。
除以上两个模式外,还有tur、emc_clariion、hp_sw模式,它们适用于不同的设备。
默认值为:readsector0。rr_min_io:I/O轮询的路径切换间隔。
此值定义了在multibus模式中多个路径之间切换的密度,意思为每N次I/O操作后切换到下一个路径后再进行操作。此值过小会导致I/O路径的频繁切换;过大则会导致在大规模操作时切换延迟,发挥不了应有的性能。只有当path_grouping_policy为multibus时才有效。
默认值为1000。max_fds:允许同时打开的最大文件描述符,此参数只在RHEL5.2及之后版本中有效。user_friendly_names:设为yes时系统会自动使用/dev/dm-X作为绑定的设备名;如果设为no,系统将会使用当前磁盘的wwid作为设备名。12.4.3
磁盘多路径绑定效果测试通过在不同模式中、在多路径设备下建立1GB文件,并在建立过程中断开正在运行的路径来进行测试。本测试数据是通过虚拟化实现百兆网络连接iSCSI获得的。测试用例:[root@localhost
~]#
dd
if=/dev/zero
of=/mnt/multipath/1g.file
bs=1M
count=1024
查看需要监测的各个磁盘设备的设备号:[root@localhost
~]#
ll
/dev/
|
grep
-E
'sdc|sdd|dm-2'
brw-rw----
1
root
root
253,
2
Mar
14
16:03
dm-2
brw-r-----
1
root
disk
8,
32
Mar
14
16:03
sdc
brw-r-----
1
root
disk
8,
48
Mar
14
16:03
sdd
测试12-4:在multibus模式且两个路径设备都工作正常的情况下创建1GB数据文件。[root@localhost~]#
sar
-d
1|grep-E
'DEV|dev8-32|
dev8-48|dev253-2'|head
-n
-4
10:12:21
PM
DEV
tps
rd_sec/s
wr_sec/s
avgrq-sz
avgqu-sz
await
svctm
%util
10:12:22
PM
dev8-32
10.87
0.00
7826.09
720.00
93.16
10278.50
100.10
108.80
10:12:22
PM
dev8-48
7.61
0.00
6086.96
800.00
116.55
11292.29
143.00
108.80
10:12:22
PM
dev253-2
2176.09
0.00
17408.70
8.00
18821.40
8565.27
0.50
108.80
测试12-5:multibus模式,在创建1GB数据文件的过程中断开sdc(dev8-32)。[root@localhost
~]#
sar
-d
1
|
grep
-E
'DEV|
dev8-32|dev8-48|dev253-2'
|
head
-n
-4
10:12:39
PM
DEV
tps
rd_sec/s
wr_sec/s
avgrq-sz
avgqu-sz
await
svctm
%util
10:12:39
PM
dev8-32
0.00
0.00
0.00
0.00
119.19
0.00
0.00
105.47
10:12:39
PM
dev8-48
17.89
0.00
18324.21
1024.00
147.39
12036.06
58.94
105.47
10:12:39
PM
dev253-2
3667.37
0.00
29338.95
8.00
32732.49
7517.17
0.29
105.47
测试12-6:failover模式,在两个路径设备都工作正常的情况下创建1GB数据文件。[root@localhost
~]#
sar
-d
1
|
grep
-E
'DEV|dev8-32
|dev8-48|dev253-2'
|
head
-n
-4
10:17:34
PM
DEV
tps
rd_sec/s
wr_sec/s
avgrq-sz
avgqu-sz
await
svctm
%util
10:17:34
PM
dev8-32
14.44
0.00
14791.11
1024.00
165.54
9563.23
77.08
111.33
10:17:34
PM
dev8-48
0.00
0.00
0.00
0.00
0.00
0.00
0.00
0.00
10:17:34
PM
dev253-2
4551.11
0.00
36408.89
8.00
21191.13
3884.95
0.24
111.33
测试12-7:failover模式,在创建1GB数据文件的过程中断开sdc(dev8-32)。[root@localhost
~]#
sar
-d
1
|
grep
-E
'DEV|dev8-32|
dev8-48|dev253-2'
|
head
-n
-4
10:18:04
PM
DEV
tps
rd_sec/s
wr_sec/s
avgrq-sz
avgqu-sz
await
svctm
%util
10:18:05
PM
dev8-32
0.00
0.00
0.00
0.00
123.19
0.00
0.00
109.02
10:18:05
PM
dev8-48
15.22
0.00
15582.61
1024.00
153.14
10457.79
71.64
109.02
10:18:05
PM
dev253-2
4319.57
0.00
34556.52
8.00
34073.93
4715.56
0.25
109.02
12.5
I/O屏障技术红帽集群套件(RedHatClusterSuite)中要求硬件能支持I/O屏障(Fenceing)技术,这与众多第三方集群方案不同,由于此技术增加了系统架构的复杂性,很多用户不理解为何还要使用此技术。Fencing主要用于防止集群系统的"脑裂(Brain-Split)",在"脑裂"发生之前,通过硬件信号方式对服务器进行断电或者对光纤链路进行断链来保护客户的重要数据。红帽集群套件中明确要求建立集群的服务器支持Fence设备,这些设备主要包括:服务器或刀片中心控制设备:Bull
Fame
(PAP)
Management
Console
Dell
DRAC
3/4/5/MC
Fujitsu-Siemens
RSB
HP
ILO
1/2
IBM
Blade
Center/RSA
II
Intel
IPMI
over
LAN
专用UPS电源交换机:APC
MasterSwitch
AP79XX系列
WTI
IPS系列
WTI
MPC-8H
(5.3)
WTI
NBB-1600/1600-CE
WTI
RSM-8R4
(5.3)
WTI
TPS-2
SAN光纤控制设备:Brocade
Silkworm
2400/2800/3200
Dell
PowerVault
56F
McData
Sphereon
4500
Vixel
9200
通过以上设备可以有效地保证服务器的集群工作,如果没有这些设备,则可以选择使用以下方案。Fence_scsiFence_scsi基于SAN设备的SCSI-3PersistentReservation(SCSI-3PR)永久保留功能,当前已有部分SAN存储设备支持此功能。但请注意,此功能不可与multipath一同使用。虚拟化Fence支持红帽RHEL5系列的虚拟机之间实现Fencing操作,可实现本地物理服务器间的虚拟机Fencing或跨服务器的虚拟机Fencing,以结合RHCS提供的虚拟机集群方案。手动Fence通过此功能实现Fencing时,要求管理员进行手工辅助操作,严禁此功能在生产环境中使用。在学习过程中通过此功能可以更深入地了解Fencing的工作原理,后面章节会给出实际的测试用例。由以上内容可知,红帽支持大量的Fence设备,特别是比如IBMRSAII、HPilo、IntelIPMIoverLAN这样的由品牌服务器自带的功能,它们通常会被长期空置,没有发挥到任何功能,红帽RHCS通过Fence技术使这些设备得到了合理应用。后面章节会结合实际环境讲述Fence设备的设置及部署规划。12.6
高可用集群上面几个小节中,我闪介绍了服务器中各种冗余设备的用处及配置方法。下面首先介绍高可用集群的原理,然后介绍在RHEL5中对应Oracle数据库服务的配置方法。12.6.1
高可用集群原理图12-1展现了一个典型的高可用集群,图中描述了高可用集群的各个硬件组成部分,下面就图中提到的一些技术名词进行解释。服务器集群:由两台以上服务器组成,加入到集群的服务器被称为"节点"。通常以私有网络作为"心跳",当集群中的一台服务器出现故障时,其他服务器会按照集群中设定的接管机制实现"故障切换(Failover)"。为保证服务器网络及其与外部存储的连接,通常会对网卡进行"网卡绑定",对外部存储的HBA卡链接进行"多路径绑定"。心跳:服务器集群中的服务器通过"心跳"机制来判断自身及集群中的其他服务器是否存活,通常"心跳"会通过RJ45接口或COM接口实现。网卡绑定:参考本章"12.3网卡绑定"一节的内容。磁盘多路径绑定:参考本章"12.4磁盘多路径绑定"一节的内容。虚拟IP及公共网络:集群软件或硬件通过TCP/IP协议对客户端可见的公共网络公开了一个虚拟的网络IP,此IP由集群机制管理,指向当前"活动"的集群服务器"节点"。对于客户端而言,集群就相当于一个服务器,可以实现透明访问。
(点击查看大图)图12-1
高可用集群示意图12.6.2
红帽集群套件RHCS的工作原理本节将对红帽集群套件RHCS(RedHatClusterSuite)进行详细讲解,为下一节的配置实战进行铺垫。读者也可以选择直接跳过本节,阅读并动手完成"12.6.3RHCS+Oracle配置实战图解"一节的实例后,再重新对本节内容进行详细阅读,以加强对红帽RHCS集群套件的理解。图12-2是RHEL5系列版本中RHCS的架构示意图:此图与红帽官方的架构图有所不同,图12-2主要展示了RHCS中常用的组件,通过简单的图例来描述RHCS架构中各个组件之件的关系。下面对这些组件进行详细解释:
(点击查看大图)图12-2
RHCS架构示意图cman集群管理器cman是一个基于内核的对称通用集群管理器。它由两部分组成:连接管理器(cnxman),用于处理成员、消息、投票数、事件通知和过渡;服务管理器(SM),用于处理那些需要通过各种方式进行集群管理的应用及外部系统。cman是RHCS中最核心的服务,可通过系统中的serivce命令进行启/停操作;DLM、GFS、CLVM及Fence都依赖于cman群集管理器。rgmanager资料组管理器rgmanager(ResourceGroupManager)基于cman并使用DLM动态锁管理机制。与cman一样,rgmanager也是RHCS中的一个核心服务,可通过系统中的serivce命令进行启/停操作;rgmanager管理并为集群中的Service(服务)和Resources(资源)提供Failover错误切换功能。Service(服务)每个服务都被指定存在于一个FailoverDomain中,并与多个Resources(资源)关联。每个服务可以理解为实际操作中的一个应用,如Web服务器、Java中间件、数据库、文件共享系统、邮件系统等。这些应用在运行时不但对应用程序本身有要求(如某个运行指令或多个运行脚本的组合),还要提供对诸如虚拟IP、文件系统等资源的支持。FailoverDomain(错误切换域)每个FailoverDomain都与两个或两个以上的Node(服务器节点)进行绑定,FailoverDomain指定了集群中某个Service运行时的范围,也就是指定此Service将会由哪些服务器提供Failover错误切换功能。每个Node都允许与多个FailoverDomain进行绑定,也就是说每个Node都可以为多个Service服务,因此可以实现"主动/主动(双活动)"方式的集群配置。Resources(资源)Resources指的是组成一个应用所需的各种组件,通常包括:应用程序、虚拟IP、文件系统。资源与Service组合时,往往还会体现出一定的层次关系,例如:通常系统都要求确认虚拟IP及文件系统都已经正常连接及挂载后,才可以运行某个应用程序,这个顺序一旦调转,就会使应用程序运行出错。Fence机制在RHCS集群运行时,为了避免因出现不可预知的情况而造成的"脑裂"现象(如:心跳线断连,此时两台服务器都无法找到对方,无法向对方发出操作指令,都各自认为自己是主节点;又或者主服务器系统崩溃,系统能接收到备用服务器的操作指令,但无法返回运行情况的确认信号,导致备用服务器无法获知系统资源的使用情况),系统要求通过Fence机制来保障系统切换时的I/O使用安全。如上所述,Fence主要就是通过服务器或存储本身的硬件管理接口,又或者是外部电源管理设备,来对服务器或存储发起直接的硬件管理指令,控制服务器或存储链路的开关。因此,Fence机制也被称为"I/O屏障"技术。当"脑裂"发生时彻底断开问题服务器的所有I/O连接,保证问题服务器不能对集群中的I/O资源(共享的文件系统资源)进行任何操作,严格保证集群环境中企业核心数据的完整性。12.6.3
RHCS+Oracle配置实战图解(1)在RHCS中,最难理解的是Fence机制,下面的配置过程将首先以"手动Fence"为例进行讲解,以更深入地描述Fence在集群运行过程中的运行步骤及作用,最后再换成真实的Fence设备。需要注意的是,虽然通过"手动Fence"可以完整地配置RHCS,但在生产环境中不推荐这样做,因为一旦出现硬件级故障的话,"手动Fence"需要管理员通过人工干预方式进行系统切换。1.安装红帽集群套件RHCS安装RHCS主要有以下3个途径:通过RHEL5AP高级平台版介质进行安装,并在安装过程中输入通过网站激活后得到的InstallNumber,选中相应的"Cluster(集群)"组件。通过RHCSS(RedHatClusterSolutionSuite,红帽集群解决方案套件)的安装光盘进行安装,RHCSS的好处是已经附带了多种流行数据库的支持接口,并可以提供磁盘镜像(Mirro)及企业系统备份功能。注意:购买RHCSS订阅时就已经包括了上门安装服务,会有专人为客户进行生产环境下的安装配置。通过RHEL5AP高级平台版介质进行手动安装,将安装介质挂载到/media/cdrom,然后进行以下操作:(1)建立文件/etc/yum.repos.d/mycdrom.repo,内容如下:[Base]
name=RHEL5
ISO
Base
baseurl=file:///media/cdrom/Server
enabled=1
gpgcheck=0
[Cluster]
name=RHEL5
ISO
Cluster
baseurl=file:///media/cdrom/Cluster
enabled=1
gpgcheck=0
(2)执行yum命令进行集群组件的安装:#
yum
install
cman
rgmanager
system-config-cluster
luci
ricci
2.红帽集群套件RHCS配置前的准备在两台服务器中分别安装RHCS,并按照表12-1所示配置服务器。表12-1
RHCS集群配置说明Server1Server2hostname(/etc/sysconfig/hostname)/etc/hostslocalhost.localdomainlocalhost1server12server2Fence设备(例如通过IBM服务器的RSAII接口实现Fence功能,如果没有此类设备则可以跳过)1/24Account:USERIDPassword:PASSW0RD这里的0为“零”2/24Account:USERIDPassword:PASSW0RD这里的0为“零”eth0(用于内部网,作为心跳)1/242/24eth1(用于外部网,提供服务,与将要设置的虚拟IP在同一网段)1/242/24网络连接连接方案1:两台服务器的Fence设备及eth0、eth1连接到同一网络中连接方案2:两台服务器的Fence设备及eth0连接到同一私有网络中,eth1与外网相连Oracle安装ORACLE_HOME:/u01/app/oracle/product/10.2.0/db_1ORACLE_SID:TESTDBOracle数据目录(DatabaseArea)OracleDatabaseArea:/u02/oradata两个服务器通过命令fdisk-l,可以看到相同的外部存储磁盘,如/dev/sdc在/dev/sdc中建立ext3文件系统,并挂载到目录/u02中,将Oracle数据安装到/u02/oradata由于数据存放在外部存储中,因此系统进行Failover切换后数据不会丢失,保证了数据的一致性具体的Oracle安装步骤请参考本书第11章内容
3.通过system-config-cluster配置RHCS打开一个终端并通过root用户身份运行命令system-config-cluster,或通过"系统"|"管理"|"服务器设置"|"system-config-cluster"来打开集群配置界面。建立新集群建立一个新的集群,命名为"new_cluster"。请注意:集群的名称要求少于16个字符,否则集群启动时会出现问题,如图12-3所示。对于双节点的集群来说,"CustomConfigureMulticast"和"UseaQuorumDisk"都可以不作设置。CustomConfigureMulticast:用于指定一个用于本集群的多播地址。UseaQuorumDisk:当多个节点要求仲裁机制时,指定仲裁策略。在实际应用中,超过两个节点的集群应用相对还是比较少,因此本书只涉及到RHCS双节点的配置。有兴趣了解"QuorumDisk"的读者可以参考红帽公司的官方文档。添加节点(1)在图12-4左边的树状目录中选中"ClusterNodes",单击"AddaClusterNode"添加集群节点。(2)在"NodeProperties"窗口中填入两个节点的机器名,分别为和,如图12-5所示。此处不但添加了节点,还同时指定了集群的"心跳"。由于在/etc/hosts中已经指定了两个节点名称对应的IP分别为1和2,因此两台服务器通过此网络接口对连即可成为"心跳线"。
图12-3
新建集群
(点击查看大图)图12-4
添加集群节点12.6.3
RHCS+Oracle配置实战图解(2)添加Fence设备(1)在图12-4左边的树状节点中选中"FenceDevices",单击"AddaFenceDevice"打开Fence配置窗口。(2)在"AddaNewFenceDevice"下拉菜单中选中"ManualFencing"以手动Fencing。(3)在"Name"处为Fence设备自定义一个名称,如"m_fencing",如图12-6所示。
图12-5
加入节点
图12-6
添加手动Fence设备节点与Fence设备绑定(1)在图11-7左边的树状目录中选中"",单击"ManageFencingForThisNode"。(2)为节点添加一个"FenceLevel"(注:为进一步保证集群"脑裂"时的有效切换,RHCS允许对一个节点添加多个Fence设备并建立分级的Fence操作)。
(点击查看大图)图12-7
为节点添加FenceLevel(3)选中"Fence-Level-1",单击"AddaNewFencetothisLevel",在"FenceProperties"窗口的"AddaNewFence"下拉菜单中选择刚才建立的名为"m_fencing"的设备,如图12-8所示。
图12-8
指定FenceLevel使用的Fence设备(4)在节点上重复以上步骤,将其与名为"m_fencing"的设备绑定。新建FailoverDomain(1)在图12-4左边的树状目录中选中"FailoverDomains",单击"CreateaFailoverDomain"。(2)在"NamefornewFailoverDomain"文本框中指定自定义的FailoverDomain名称,如ora_domain,如图12-9所示。
图12-9
新建FailoverDomain(3)通过"AvailableClusterNodes"下拉菜单将及server2.加入到当前的FailoverDomain中,如图12-10所示。RestrictFailoverToThisDomainsMembers:指派给这个FailoverDomain的Service只可以在当前加入的成员上执行;如果不选此项,Service将允许在本集群中的任何节点进行Failover切换。为保证系统的严谨性,建议选中此项。PrioritizedList:用于调整FailoverDomain中节点的优先级别,指定Service优先在哪个节点中运行。(注:对于双节点情况,如果,两台服务器的性能相同,那么一般不需要设置它们的优先关系,先启动服务器为主服务器,后启动的的为备用服务器。当主服务器出现故障,备用服务器进行Service接管后,即使主服务器通过检修重新加入集群,由于主/备服务器性能相同,因此没有必要再浪费时间进行Service切换)添加Resource-IPAddress(1)在图12-4左边的树状目录中选中"Resources",单击"CreateaResource"。(2)在"SelectaResourceType"下拉菜单中选中"IPAddress"并填入IP地址,如0,如图12-11所示。此地址就是上面提到的"虚拟IP",对于每一个通过网络进行连接的Service来说,都要求至少有一个独立的"虚拟IP"。
图12-10
为FailoverDomain添加节点
图12-11
添加IPAddress资源12.6.3
RHCS+Oracle配置实战图解(3)添加Resource-FileSystem(1)在图12-4左边的树状目录中选中"Resources",单击"CreateaResource"。(2)在"SelectaResourceType"下拉菜单中选中"FileSystem",并按图12-12所示指定文件系统资源的名称、文件系统类型、挂载点及使用的磁盘设备。Options:执行mount指令时的特殊参数,与mount指令的"-o"参数相同。FileSystemID:RHCS中要求每个FileSystem都有一个唯一的ID号,此项一般不用指定,系统会自动进行分配。Forceunmount-一旦服务要求切换,在进行umount操作时使用-f参数Reboothostnodeifunmountfails-若umount失败,则尝试对此系统进行重启操作。Checkfilesystembeforemounting-挂载文件系统前通过fsck命令对文件系统进行检查,这可以更好地保证文件系统的完整性,但对于大文件系统来说,这将花费很长的时间。添加Resource-Script(1)在图12-4左边的树状目录中选中"Resources",单击"CreateaResource"。(2)在"SelectaResourceType"下拉菜单中选中"Script",为此资源定义一个"Name"为ora_script、以/etc/init.d/dbora为脚本文件的Scrgt资源,如图12-13所示。/etc/init.d/dbora是一个用于对Oracle进行启动(start)、停止(stop)及状态检查(status)的脚本,RHCS要求每个脚本都支持这3种参数操作,并根据应用的实际运行情况返回"0(表示正常)"或"非0(表示运行异常)"。RHCS就是靠这些参数及返回值来判断应用程序运行得正常与否,以保证当应用软件由于自身或其他原因而导致异常时进行Failover切换(本书将在后面的章节中为读者详细分析/etc/init.d/dbora脚本的运行过程)。
图12-12
添加FileSystem资源
图12-13
添加Script资源建立Service(1)在图12-4左边的树状目录中选中"Services",单击"CreateaService",新建一个名为ora_serivce的服务,如图12-14所示。
图12-14
新建Service(2)在"ServiceManagement"窗口的"FailoverDomain"中选择之前建立的ora_domain,此窗口用于指定FailoverDomain与Service之间的关系,以及Service与Resrouces之间的关系,是集群配置中最重要的一环。(3)单击"AddSharedResourcetothisservice",在列表框中选择之前建立的IPAddress资源:0。单击"OK"按钮,使之添加到本Service的资源列表中,如图12-15所示。也可以通过"Createanewresourceforthisservice"建立对应本Service的私有资源属性,这些属性将不可以再在其他Service中使用。有些资源要求体现出一定的层次关系,如:通常系统都要求确认虚拟IP及文件系统都已经正常连接及挂载后,才可以运行某个应用程序,这个顺序一旦调转,将会使应用程序运行出错。通过选中"0
IPAddress
Shared",然后单击"AttachaSharedResourcetotheselection"可以将其他共享资源添加为此资源的子项,以实现顺序地启动及关闭,如图12-16所示。
(点击查看大图)图12-15
向Service加入IPAddress资源
(点击查看大图)图12-16
向IPAddress加入下级资源(4)在列表框中选择之前建立的名为ora_fs的FileSystem资源,单击"OK"按钮将它加入为IPAddress的下级资源,如图12-17所示。
(点击查看大图)图12-17
向IPAddress加入下级FileSystem资源(5)选中"ora_fs
FileSystem
Shared",然后单击"AttachaSharedResourcetotheselection",将ora_script加入,作为它的子资源,如图12-18所示。
(点击查看大图)图12-18
向FileSystem加入下级Script资源12.6.3
RHCS+Oracle配置实战图解(4)至此,资源添加完成,服务启动时将先尝试对IP进行接管,然后尝试挂载文件系统,最后运行应用所需的脚本中的start方法,如/etc/init.d/dborastart。如果这3个资源均被正常启动,则服务启动成功;否则,任何一个资源启动异常,都将导致服务起动失败。此时RHCS会尝试在FailoverDomain中的其他节点启动服务。同理,停止服务是启动顺序的反过程:先通过脚本中的stop方法停止应用,然后卸载文件系统,最后清除IP。RecoveryPolicy:指定进行切换时所使用的策略,通过RHCS的rgmanager可以在运行时对服务中的各个资源进行检测,一旦检查到某个资源的status操作发生异常,就按照此策略进行操作。Restart-如果发现资源出现异常,则先在本地尝试重启服务,如果重启失败则执行Relocate操作。Relocate-停止当前节点中与本服务相关的所有资源,由另一台服务器进行服务及资源的接管。Disable-在所有节点中停止服务,不进行任何操作。一般建议在测试环境中使用"Relocate",因为这样可以很好地展示系统切换的过程;在生产环境中则建议使用"Restart",因为有不少异常通过本地重启服务是可以解决的,这样可以最大限度缩短系统切换所消耗的时间。其他选项:AutostartThisService-rgmanager启动时自动启动此Service。RunExclusive-指定此Service以独占方式运行,一旦此Service运行在某个服务器之上,集群就将拒绝其他的Service在此服务器上运行。完成后的集群如图12-19所示。
(点击查看大图)图12-19
完成后的集群效果保存配置文件通过File|Save,保存配置文件为/etc/cluster/cluster.conf。4.Oracle集群脚本讲解以下是一个用于在RHCS中实现Oracle启停及状态管理的脚本,使用时请对应实际环境自行修改ORACLE_HOME、ORACLE_SID等参数。另外,此脚本只作为学习及练习的参考,不能保证在生产环境上的运行稳定性。#!/bin/bash
#
#
/etc/init.d/dbora
#
#
chkconfig:
2345
02
98
#
description:
oracle
is
meant
to
run
under
Linux
Oracle
Server
#
Source
function
library.
.
/etc/rc.d/init.d/functions
ORACLE_HOME=/u01/app/oracle/product/10.2.0/db_1
ORACLE_SID=TESTDB
ORACLE_NAME=oracle
LOCKFILE="$ORACLE_HOME/.oracle.lock"
RESTART_RETRIES=3
DB_PROCNAMES="pmon"
LSNR_PROCNAME="tnslsnr"
#RETVAL=0
#Start
the
oracle
Server
#The
following
command
assumes
that
the
oracle
login
will
not
prompt
the
password
start()
{
echo
"Starting
Oracle10g
Server...
"
tmpfile=/home/oracle/'basename
$0'-start.$$
logfile=/home/oracle/'basename
$0'-start.log
#
#
Set
up
our
sqlplus
script.
Basically,
we're
trying
to
#
capture
output
in
the
hopes
that
it's
useful
in
the
case
#
that
something
doesn't
work
properly.
#
echo
"startup"
>
$tmpfile
echo
"quit"
>>
$tmpfile
su
-
$ORACLE_NAME
-c
"sqlplus
\"/
as
sysdba\"
<
$tmpfile
&>
$logfile"
if
[
$?
-ne
0
];
then
echo
"ORACLE_HOME
Incorrectly
set?"
echo
"See
$logfile
for
more
information."
return
1
fi
#
#
If
we
see:
#
ORA-.....:
failure,
we
failed
#
rm
-f
$tmpfile
grep
-q
"failure"
$logfile
if
[
$?
-eq
0
];
then
rm
-f
$tmpfile
echo
"ORACLE_SID
Incorrectly
set?"
echo
"See
$logfile
for
more
information."
return
1
fi
echo
"Starting
listern..."
((su
-
$ORACLE_NAME
-c
"$ORACLE_HOME/bin/lsnrctl
start")
>>
$logfile
2>&1)
||
return
1
#return
$?
if
[
-n
"$LOCKFILE"
];
then
touch
$LOCKFILE
fi
#/usr/local/tomcat/bin/catalina.sh
start
return
0
}
stop()
{
echo
"Shutting
down
Oracle10g
Server..."
declare
tmpfile
declare
logfile
tmpfile=/home/oracle/`basename
$0`-stop.$$
logfile=/home/oracle/`basename
$0`-stop.log
if
[
-z
"$LOCKFILE"
]
||
[
-f
$LOCKFILE
];
then
echo
else
echo
"oracle
is
not
run"
return
0
fi
#
Setup
for
Stop
...
echo
"shutdown
abort"
>
$tmpfile
echo
"quit"
>>
$tmpfile
su
-
$ORACLE_NAME
-c
"sqlplus
\"/
as
sysdba\"
<
$tmpfile
&>
$logfile"
if
[
$?
-ne
0
];
then
echo
"ORACLE_HOME
Incorrectly
set?"
echo
"See
$logfile
for
more
information."
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 川幼毕业生就业前景解析
- 测试工装售后回租合同
- 铁道机车试题及答案
- 天车电气维修试题及答案
- 2026年辽宁省导游基础知识考试卷及答案(六)
- 第四季度护理三基理论知识考核试题
- 《无脊椎动物主要类群精讲|教师备课专用》
- 耐用消费产业行业研究:消费反弹重视顺价链与资本动作积极标的创想三维上市撬动3D打印关注度
- 《初中语文九年级下册第3单元复习课|体系梳理 + 综合训练教案》
- 幼儿园开展的亲子活动种类
- 血浆病毒灭活技术的应用
- 品质红线管理办法
- 社区固定资产管理制度
- 2025年江苏省苏州市中考道德与法治试卷及答案
- 银川科技学院《中国古代文学(四)》2023-2024学年第二学期期末试卷
- 《小学数学教学论》课件-第一章
- 《危险货物港口作业重大事故隐患判定指南》解读与培训
- 2020铁路路基工程施工安全技术规程
- 2025年电子消毒灭菌器项目可行性研究报告
- 博士医生®血糖仪4279操作说明-培训课件
- 沪教版(五四学制)(2024)六年级下册单词表+默写单
评论
0/150
提交评论