在集群中的所有节点上执行下列配置过程!

Oracle 9.0.1 和 9.2.0.1 使用一个名为 watchdogd 的用户空间监视后台程序来监视集群的状态情况,并在出现故障时重新启动 RAC 节点。从 Oracle 9.2.0.2 开始,此监视后台程序已被名为 hangcheck-timer 的模块所代替,该模块可以更好地解决可用性和可靠性问题。 hang-check 计时器被加载到 Linux 内核中并检查系统是否挂起。它将设置一个计时器,并在特定的时间量之后检查该计时器。有一个用于 检查挂起情况的可配置阈值,如果超过该阈值,计算机将重新启动。尽管 Oracle CRS 并不需要hangcheck-timer 模块,但 Oracle 强烈建议使用它。


hangcheck-timer.o 模块


hangcheck-timer 模块使用了一个基于内核的计时器,该计时器周期性地检查系统任务调度程序,以捕获延迟,从而确定系统的运行状况。如果系统挂起或暂停,则计时器重置该节点。hangcheck-timer 模块使用时间戳计数器 (TSC) CPU 寄存器,该寄存器在每个时钟信号处递增。由于此寄存器由硬件自动更新,因此 TCS 提供了更精确的时间度量。


安装 hangcheck-timer.o 模块


hangcheck-timer 最初只由 Oracle 提供;但是,从内核版本 2.4.9-e.12 和更高版本开始,此模块现在包含在 Red Hat Linux 中。如果您按照 第 8 节(“获取和安装何适的 Linux 内核”)中的步骤执行,则已经包含了 hangcheck-timer。使用以下命令确认:
# find /lib/modules -name "hangcheck-timer.o"
/lib/modules/2.4.21-15.ELorafw1/kernel/drivers/char/hangcheck-timer.o
/lib/modules/2.4.21-27.0.2.ELorafw1/kernel/drivers/char/hangcheck-timer.o


配置并加载 hangcheck-timer 模块


hangcheck-timer 模块有两个关键的参数:
  • hangcheck-tick:此参数定义了系统运行状况检查的间隔时段。默认值为 60 秒;Oracle 建议将它设置为 30 秒。



  • hangcheck-margin:此参数定义了 hangcheck-timer 在重启 RAC 节点前所容许的最大挂起延迟。它定义了以秒为单位的错误余量。默认值为 180 秒;Oracle 建议将它设置为 180 秒。

注意:这两个 hangcheck-timer 模块参数指示在该模块重置系统前 RAC 节点必须挂起多长时间。当以下条件为真时将会重置节点:
系统挂起时间 > (hangcheck_tick + hangcheck_margin)

配置 Hangcheck 内核模块参数


每次加载 hangcheck-timer 内核模块(手动加载或由 Oracle 加载)时,它都需要知道对我们刚刚介绍的两个参数(hangcheck-tick 和 hangcheck-margin)所使用的值。这些值需要在每次重新启动 Linux 服务器后可用。为此,请在 /etc/modules.conf 文件中创建一个具有正确值的条目,如下所示:

# su -
# echo "options hangcheck-timer hangcheck_tick=30 hangcheck_margin=180" >> /etc/modules.conf   (centos6.4里为/etc/modprobe.d/modules.conf)

每次加载 hangcheck-timer 内核模块时,它将使用由我在 /etc/modules.conf 文件中创建的条目定义的值。


手动加载 Hangcheck 内核模块以进行测试

Oracle 负责在需要时加载 hangcheck-timer 内核模块。因此,不必在任何启动文件(如 /etc/rc.local)中执行 hangcheck-timer 内核模块的 modprobe 或 insmod。

我继续在 /etc/rc.local 文件中包括 hangcheck-timer 内核模块的 modprobe 完全只是出于个人习惯。有朝一日我将戒掉这个习惯,但请注意,启动过程中包括 hangcheck-timer 内核模块的 modprobe 并无害处。

为了使自己保持清醒并能够在夜晚入睡,我始终按如下所示在每次启动时配置 hangcheck-timer 内核的加载:

# echo "/sbin/modprobe hangcheck-timer" >> /etc/rc.local


(注意:您不必在每次重新启动后使用 modprobe 或 insmod 手动加载 hangcheck-timer 内核模块。Oracle 将在需要时自动加载 hangcheck-timer 模块。)

现在,为了测试 hangcheck-timer 内核模块以验证它是否选取我们在 /etc/modules.conf 文件中定义的正确参数,请使用 modprobe 命令。尽管可以通过向其传递相应的参数(如 insmod hangcheck-timer hangcheck_tick=30 hangcheck_margin=180)来加载 hangcheck-timer 内核模块,但我们需要验证它是否选取了我们在 /etc/modules.conf 文件中设置的选项。

要手动加载 hangcheck-timer 内核模块并验证它是否使用在 /etc/modules.conf 文件中定义的正确值,请运行以下命令:

# su -
# modprobe hangcheck-timer
# grep Hangcheck /var/log/messages | tail -2
Jan 30 22:11:33 linux1 kernel:Hangcheck:starting hangcheck timer 0.8.0 (tick is 30 seconds, margin is 180 seconds).
Jan 30 22:11:33 linux1 kernel:Hangcheck:Using TSC.
我还想要验证是否加载了正确的 hangcheck-timer 内核模块。为进行确认,我通常删除内核模块(如果已经加载它),然后使用以下命令重新加载它:
# su -
# rmmod hangcheck-timer
# insmod hangcheck-timer
Using /lib/modules/2.4.21-27.0.2.ELorafw1/kernel/drivers/char/hangcheck-timer.o