Oracle Clusterware的心跳
Oracle clusterware 使用两种心跳设备来验证成员的状态,保证集群的完整性;一是对voting disk的心跳,ocssd进程每秒向votedisk写入一条心跳信息;二是节点间的私有以太网的心跳,两种心跳机制都有一个对应的超时时间,分别叫做misscount和disktimeout:
misscount 用于定义节点间心跳通信的超时,单位为秒;
disktimeout ,默认200秒,定义css进程与vote disk连接的超时时间;
reboottime ,发生裂脑并且一个节点被踢出后,这个节点将在reboottime的时间内重启;默认是3秒;
其中misscount默认值见下表
用下面的命令查看上述参数的实际值:1. # crsctl get css misscount
2. # grep misscount $CRS_HOME/log/hostname/cssd/ocssd.log
[CSSD]2008-11-27 22:29:42.397 [1] >TRACE: clssnmInitNMInfo: misscount set to 600
在下面两种情况发生时,css会踢出节点来保证数据的完整,:
(1) Private Network IO time > misscount,会发生split brain即裂脑现象,产生多个“子集群”(subcluster) ,这些子集群进行投票来选择哪个存活,踢出节点的原则按照下面的原则:
节点数目不一致的,节点数多的subcluster存活;节点数相同的,node ID小的节点存活。
(2) Vote Disk IO Time > disktimeout ,踢出节点原则如下:失去半数以上vote disk连接的节点将在reboottime的时间内重启;例如有5个vote disk,当由于网络或者存储原因某个节点与其中>=3个vote disk连接超时时,该节点就会重启。当一个或者两个vote disk损坏时则不会影响集群的运行。
可以手工修改这三个参数的值,单位都是秒:(谨慎使用)
$CRS_HOME/bin/crsctl set css misscount
$CRS_HOME/bin/crsctl set css reboottime
$CRS_HOME/bin/crsctl set css disktimeout
或者重新设置成默认值:crsctl unset css misscount
Clusterware的私有网络
在Oracle 10g/11g中,Oracle的私有网络(private network)包括clusterware的私有网络和数据库实例的私有网络:
clusterware的私有网络主要包括css数据的传送,即用一种特殊的ping命令来检测其他机器的状态;
数据库实例的私有网络,包括RDMS和ASM的,用于cache fusion(GCS/GES)数据的传输。
当我们只使用一个私有网卡的时,同时传送上面两类的数据。如果我们在安装时指定了两个私有网卡,首先使用如下面$CRS_HOME/bin/oifcfg getif命令来得到所有网络接口列表,这些信息保存在ocr中:
# oifcfg getif
en0 10.200.56.0 global public
en3 192.168.3.0 global cluster_interconnect
en5 192.168.5.0 global cluster_interconnect
情况会有所不同,clusterware的私有网络,目前(10g/11g)只能使用一个网络接口,对应于/etc/hosts中定义的private hostname的那个网卡,可以通过查看ocssd的log来确定:
当/etc/hosts 中定义private hostname为192.168.3.233时看到 :
[ CSSD]2009-01-16 17:34:12.406 [1029] >TRACE: clssgmPeerListener: Listening on (ADDRESS=(PROTOCOL=tcp)(DEV=12) (HOST=192.168.3.233)(PORT=45527))
这个是与其他节点css进行通信的信息:
[ CSSD]2009-01-16 17:36:27.463 [1029] >TRACE: clssgmConnectToNode: node 2 clsc (ADDRESS=(PROTOCOL=tcp)(DEV=12) (HOST=192.168.3.234)(PORT=37732)) - size 64 ver 1
当/etc/hosts 中定义private hostname为192.168.5.233时,css使用了另外一个网络:
[ CSSD]2009-01-16 18:59:56.411 [1029] >TRACE: clssgmPeerListener: Listening on (ADDRESS=(PROTOCOL=tcp)(DEV=12) (HOST=192.168.5.233)(PORT=50415))
Oracle实例的私有网络
Oracle实例的心跳网络使用方式的优先级从高到低如下:
(1) 如果使用了第三方集群的IPC,替换了对应$ORACLE_HOME/lib/libskgxnX.so文件,那么数据库实例的cache fusion会使用对应的网络协议,而忽略ocr中和数据库初始化参数中cluster_interconnects的配置,下面的例子当中就使用了VCSIPC,可以从对应的alert log中验证:
db_name = r10g
open_cursors = 300
pga_aggregate_target = 1237319680
Fri Mar 13 14:00:35 2009
Oracle instance running with ODM: Veritas 6.0 ODM Library, Version 1.1
cluster interconnect IPC version:
VERITAS IPC 5.1.0.0 15:16:24 Feb 12 2009
IPC Vendor 86 proto 76
Version 1.0
PMON started with pid=2, OS id=4399196
DIAG started with pid=3, OS id=3936288
(2) 如果没有使用第三方IPC,则优先使用数据库初始化参数的cluster_interconnects配置,这个参数的格式为if1:if2:...:ifn,可以不同于crs的私有网络,需要注意的是,该参数不支持多个网卡的故障切换;
(3) 没有上面两个配置,数据库会使用oifcfg列出的心跳的网络,在对应的告警日志中可以得到:
Interface type 1 en6 192.168.61.0 configured from OCR for use as a cluster interconnect
Interface type 1 en0 10.182.0.0 configured from OCR for use as a public interface
. . . .
Cluster communication is configured to use the following interface(s) for this instance
192.168.61.0
(4) 没有1和2的配置,并且oifcfg也没有配置cluster_interconnect,则数据库会使用共有网络进行心跳信息的传输,这种配置其实是配置失败的情况,数据库虽然能够启动,但急需DBA修正,在告警日志中可以看到:
WARNING: No cluster interconnect has been specified. Depending on
the communication driver configured Oracle cluster traffic
may be directed to the public interface of this machine.
Oracle recommends that RAC clustered databases be configured
with a private interconnect for enhanced security and
performance.
对于一个已经有的系统,可以用下面几种方法确认数据库实例的心跳配置,包括网卡名称,IP地址,使用的网络协议:
(1) 最简单的方法:可以在数据库的后台报警日志中得到。具体参见上面列出的告警日志;
(2) 使用oradebug ;
SQL> oradebug setmypid
SQL> oradebug ipc
SQL> oradebug tracefile_name
找到对应trace文件的这一行:socket no 10 IP 10.0.0.1 UDP 49197
(3) 从数据字典中得到(V$CLUSTER_INTERCONNECTS 和 V$CONFIGURED_INTERCONNECTS),或查询x$ksxpia
SQL> SELECT * FROM V$CLUSTER_INTERCONNECTS; ----Oracle 11g 开始支持此试图
NAME IP_ADDRESS IS_ SOURCE
------------------------------ ---------------- --- -------------------------------
en3 192.168.2.31 NO Oracle Cluster Repository
en5 192.168.3.231 NO Oracle Cluster Repository
SQL> SELECT * FROM V$CONFIGURED_INTERCONNECTS;
NAME IP_ADDRESS IS_ SOURCE
------------------------------ ---------------- --- -------------------------------
en3 192.168.2.31 NO Oracle Cluster Repository
en5 192.168.3.231 NO Oracle Cluster Repository
en0 10.200.59.231 YES Oracle Cluster Repository
SQL> select * from x$ksxpia ;
ADDR INDX INST_ID PUB_KSXPIA PICKED_KSXPIA NAME_KSXPIA IP_KSXPIA
---------------- ---------- ---------- ---------- --------------- --------------- ----------------
00000001104AAF28 0 1 N OCR en6 192.168.61.121
00000001104AAF28 1 1 Y OCR en0 10.182.6.211
为了避免心跳网络成为系统的单一故障点,简单地我们可以使用操作系统绑定的网卡来作为Oracle的心跳网络,以AIX为例,我们可以使用etherchannel技术,假设系统中有ent0/1/2/3四块网卡,我们绑定2和3作为心跳:
#mkdev -c adapter -s pseudo -t ibm_ech -a adapter_names='ent2,ent3' ## 将生成网卡设备ent4
#/usr/lib/methods/defif
#lsdev -Cc adapter | grep ent
#lsattr -El ent4
#ifconfig en4 inet 192.168.3.231 netmask 255.255.255.0 up
在Solaris上可以使用dladm来创建链路聚合:
# dladm create-aggr -d bge2 -d bge3 1
# ifconfig aggr1 plumb 192.168.3.231 netmask 255.255.255.0 up
# dladm show-aggr
# ifconfig -a
同样在HPUX和Linux对应的技术分别叫APA和bonding。
UDP私有网络的调优
当使用UDP作为数据库实例间cashe fusion的通信协议时,在操作系统上需要调整相关参数,以提高UDP传输效率,并在较大数据时避免出现超出OS限制的错误:
(1) UDP数据包发送缓冲区:大小通常设置要大于(db_block_size * db_multiblock_read_count )+4k,
(2) UDP数据包接收缓冲区:大小通常设置10倍发送缓冲区;
(3) UDP缓冲区最大值:设置尽量大(通常大于2M)并一定要大于前两个值;
各个平台对应查看和修改命令如下:
Solaris 查看 ndd /dev/udp udp_xmit_hiwat udp_recv_hiwat udp_max_buf ;
修改 ndd -set /dev/udp udp_xmit_hiwat 262144
ndd -set /dev/udp udp_recv_hiwat 262144
ndd -set /dev/udp udp_max_buf 2621440
AIX 查看 no -a |egrep “udp_|tcp_|sb_max”
修改 no -p -o udp_sendspace=262144
no -p -o udp_recvspace=1310720
no -p -o tcp_sendspace=262144
no -p -o tcp_recvspace=262144
no -p -o sb_max=2621440
Linux 查看 文件/etc/sysctl.conf
修改 sysctl -w net.core.rmem_max=2621440
sysctl -w net.core.wmem_max=2621440
sysctl -w net.core.rmem_default=262144
sysctl -w net.core.wmem_default=262144
HP-UX 不需要
HP TRU64 查看 /sbin/sysconfig -q udp
修改: 编辑文件/etc/sysconfigtab
inet: udp_recvspace = 65536
udp_sendspace = 65536
Windows 不需要