MyException - 我的异常网
当前位置:我的异常网» 行业应用 » OCF资源脚本书写步骤

OCF资源脚本书写步骤

www.MyException.Cn  网友分享于:2013-08-06  浏览:0次
OCF资源脚本书写方法

本文为转载,原文地址:http://www.cnblogs.com/haohao-jishuzhilu/archive/2012/12/18/2823271.html

Open Cluster Framework (OCF) 资源代理

OCF RA 代理最适合用于 High Availability,特别是在您需要主资源或特殊监视功能时。这些代理通常位于 /usr/lib/ocf/resource.d/heartbeat/。其功能与 LSB 脚本的功能相似。但是,它们始终使用环境变量来执行配置,这使它们可以轻松地接受和处理参数。OCF 规范(由于它与资源代理相关)可在http://www.opencf.org/cgi-bin/viewcvs.cgi/specs/ra/resource-agent-api.txt?rev=HEAD 4 中找到。OCF 规范包含以下严格定义:操作必须返回退出代码。群集会严格遵守这些规范。有关详细信息,请参见 http://wiki.linux-ha.orgOCFResourceAgent。

OCF 返回代码

根据 OCF 规范,有一些关于操作必须返回的退出代码的严格定义。群集会始终

检查返回代码与预期结果是否相符。如果结果与预期值不匹配,则将操作视为

失败,并将启动恢复操作。

在实际应用中,如果要对某一个资源是否正常进行监控,可以根据ocf提供的一个虚设资源代理Dummy进行修改即可。

ocf:Dummy — 虚设资源代理

OCF_RESKEY_state=string Dummy [start | stop | monitor | reload | migrate_to |migrate_from | meta-data | validate-all]

这是虚设资源代理。它只跟踪是否在运行,不执行其他任何操作。它在运行中的作用是测试并用作 RA 编写程序的模板。

支持的参数:OCF_RESKEY_state=状态文件,即储存资源状态的位置。

"${HA_VARRUN}/Dummy-${OCF_RESOURCE_INSTANCE}.state"  , 一般在/usr/var/run/下

Eg: /usr/var/run/Dummy-example-check.state,example-check是ocf资源实例的名字,在heartbeat中进行设置即可。

ResourceManager 可以根据这个资源状态文件,来判断被监控的资源状态,从而做出各种判断。

Ocf:Dummy的位置一般在 /usr/lib/ocf/resource.d/pacemaker/Dummy

OCF格式的脚本的写法

这里只提供一种比较简单的方式。

HealthCPU是以Dummy为模板的监控cpu状态的ocf资源监控脚本,也是pacemaker提供的,位置一般在

/usr/lib/ocf/resource.d/pacemaker/HealthCPU

通过分析这个脚本,我们就可以触类旁通的了解ocf格式的脚本

#!/bin/sh  

#   HealthCPU OCF RA. Measures CPUs ideling and writes

#   #health-cpu status into the CIB

#...

# Inc., 59 Temple Place - Suite 330, Boston MA 02111-1307, USA.

#######################################################################

# Initialization://初始化一些ocf资源通用的一些函数资源等

. ${OCF_ROOT}/resource.d/heartbeat/.ocf-shellfuncs

#######################################################################

//metadata 转储resource agent 的元数据到标准输出,这个输出必须遵循一定的格式,//具体的格式参见:http://www.linux-ha.org/doc/dev-guides/_metadata.html

//所有的resource agent 都必须通过一特定的XML格式的元数据描述自己的目标,//以及所支持的参数等,集群管理应用需要这些元数据来提供on-line help,而且//resource agent的操作说明(man pages)也是根据这个元数据来生成的。

meta_data() {

    cat <<END

<?xml version="1.0"?>

<!DOCTYPE resource-agent SYSTEM "ra-api-1.dtd">

<resource-agent name="HealthCPU" version="0.1">//HealthCPU是资源名称

<version>0.1</version>

 

<longdesc lang="en">

Systhem health agent that measures the CPU ideling and updates the #health-cpu attribute.//监控资源说明

</longdesc>

<shortdesc lang="en">System health CPU usage</shortdesc>

 

<parameters>

<parameter name="state" unique="1">// unique (可选的值: 0 或者 1) 表明对于一个特定的资源类型,一个特殊的值必须在集群中唯一. 例如, 一个高可用性的浮动IP地址 需要声明unique — 因为一个IP地址应该在集群中应该唯一

<longdesc lang="en">

Location to store the resource state in.

</longdesc>

<shortdesc lang="en">State file</shortdesc>

<content type="string" default="${HA_VARRUN}/health-cpu-{OCF_RESOURCE_INSTANCE}.state" />//这里是监控资源状态文件的地址和名称,可以直接只将health-cpu改为要监控的资源名

</parameter>

//下面的参数是表示判断资源状态阈值,yellow-limit,red-limit,可以根据资源状态来划分资源运行中出错的等级,还可以再设定其他的资源状态阈值来标识资源的状态,如果资源的状态不是一个数值,可以对资源状态进行评分,然后根据这些阈值来判断状态。当然也可以不设置这些阈值,在监控的时候,当资源正常时直接将状态标记为green,当资源出错时直接标记为yellow 或者red或者failed等。

<parameter name="yellow_limit" unique="1">

<longdesc lang="en">

Lower (!) limit of idle percentage to switch the health attribute to yellow. I.e.

the #health-cpu will go yellow if the %idle of the CPU falls below 50%.

</longdesc>

<shortdesc lang="en">Lower limit for yellow health attribute</shortdesc>

<content type="string" default="50"/>//yellow-limit的类型是string,默认值是50

</parameter>

 

<parameter name="red_limit" unique="1">

<longdesc lang="en">

Lower (!) limit of idle percentage to switch the health attribute to red. I.e.

the #health-cpu will go red if the %idle of the CPU falls below 10%.

</longdesc>

<shortdesc lang="en">Lower limit for red health attribute</shortdesc>

<content type="string" default="10"/>

</parameter>

</parameters>

//监控脚本所支持的参数,是资源监控代理所支持的动作参数,必须支持的有start、stop、monitor、meta-data、validate-all,可选的有promote、demote、migrate_to、 migrate_from 、notify。这里给出建议的timeout等的值

<actions>

<action name="start"        timeout="10" /> //starts the resource,timeout单位是秒

<action name="stop"         timeout="10" />// shuts down the resource.

<action name="monitor"      timeout="10" interval="10" start-delay="0" />//查询资源运行的状态

<action name="meta-data"    timeout="5" />// dumps the resource agent metadata.

<action name="validate-all"   timeout="10" />//确认资源的配置

</actions>

</resource-agent>

END

}

#######################################################################

dummy_usage() {

    cat <<END

usage: $0 {start|stop|monitor|validate-all|meta-data}

Expects to have a fully populated OCF RA-compliant environment set.

END

}

//开启资源监控

dummy_start() {

//这里的cpu资源不需要启动,但是如果是一个应用资源,那么就需要在这里启动这个应用资源,使应用跑起来,然后再监控应用的状态

 dummy_monitor

    if [ $? =  $OCF_SUCCESS ]; then

    return $OCF_SUCCESS

    fi

    touch ${OCF_RESKEY_state}//创建资源状态文件

}

//停止资源监控

dummy_stop() {

    dummy_monitor

    if [ $? =  $OCF_SUCCESS ]; then

    rm ${OCF_RESKEY_state}

//这里的cpu资源不需要关闭,但是如果是一个应用资源,那么就需要在这里关闭这个应用资源,使应用停止

    fi

    return $OCF_SUCCESS

}

//监控资源状态

dummy_monitor() {

    # Monitor _MUST!_ differentiate correctly between running

    # (SUCCESS), failed (ERROR) or _cleanly_ stopped (NOT RUNNING).

    # That is THREE states, not just yes/no.

   

    if [ -f ${OCF_RESKEY_state} ]; then

                    向下:

     

      IDLE=`top -b -n2 | grep Cpu | tail -1 | awk -F",|\.[0-9]%id" '{ print $4 }'`//得到系统的cpu空闲率

 

      if [ $IDLE -lt ${OCF_RESKEY_red_limit} ] ; then

        # echo "System state RED!"

        attrd_updater -n "#health-cpu" -U "red" -d "30s"//更新cpu状态,将状态写入cpu资源状态文件

        return $OCF_SUCCESS

          fi

 

      if [ $IDLE -lt ${OCF_RESKEY_yellow_limit} ] ; then

        # echo "System state yellow."

            attrd_updater -n "#health-cpu" -U "yellow" -d "30s"//持续30s都是这个情况,则将状态改变

      else

        # echo "System state green."

        attrd_updater -n "#health-cpu" -U "green" -d "30s"

          fi

      return $OCF_SUCCESS

 

    fi

      向上                                       

这一部分是监控资源状态的代码,即如果系统cpu超过预设的阈值,则将状态写入资源状态文件,是监控的主要代码。如果是一个应用的监控,则需要check它是否运行正常,然后把它的状态情况写入资源状态文件。

    if false ; then

                return $OCF_ERR_GENERIC

        fi

        return $OCF_NOT_RUNNING//资源监控已经停止了

}

dummy_validate() {

    # Is the state directory writable?

    state_dir=`dirname "$OCF_RESKEY_state"`

    touch "$state_dir/$$"

    if [ $? != 0 ]; then

    return $OCF_ERR_ARGS

    fi

    rm "$state_dir/$$"

    return $OCF_SUCCESS

}

 

: ${OCF_RESKEY_CRM_meta_interval=0}

: ${OCF_RESKEY_CRM_meta_globally_unique:="true"}

//下面设置资源状态文件

if [ "x$OCF_RESKEY_state" = "x" ]; then

    if [ ${OCF_RESKEY_CRM_meta_globally_unique} = "false" ]; then

    state="${HA_VARRUN}/Dummy-${OCF_RESOURCE_INSTANCE}.state"

   

    # Strip off the trailing clone marker

    OCF_RESKEY_state=`echo $state | sed s/:[0-9][0-9]*\.state/.state/`

    else

    OCF_RESKEY_state="${HA_VARRUN}/Dummy-${OCF_RESOURCE_INSTANCE}.state"

    fi

fi

//预设了cpu状态阈

if [ "x${OCF_RESKEY_red_limit}" = "x" ] ; then

  OCF_RESKEY_red_limit=10

fi

if [ "x${OCF_RESKEY_yellow_limit}" = "x" ] ; then

  OCF_RESKEY_yellow_limit=50

fi

 

case $__OCF_ACTION in

meta-data) meta_data

       exit $OCF_SUCCESS

       ;;

start)     dummy_start;;

stop)      dummy_stop;;

monitor)   dummy_monitor;;

validate-all) dummy_validate;;

usage|help)   dummy_usage

       exit $OCF_SUCCESS

       ;;

*)     dummy_usage

       exit $OCF_ERR_UNIMPLEMENTED

       ;;

esac

rc=$?

ocf_log debug "${OCF_RESOURCE_INSTANCE} $__OCF_ACTION : $rc"

exit $rc

 

根据这个例子,可以看出,我们监控某个程序的时候,可以检测后,将它的状态写入资源状态文件,通过这个文件将资源的状态传给资源管理器,从而得到监控资源的目的。 

文章评论

为什么程序员都是夜猫子
为什么程序员都是夜猫子
编程语言是女人
编程语言是女人
旅行,写作,编程
旅行,写作,编程
5款最佳正则表达式编辑调试器
5款最佳正则表达式编辑调试器
每天工作4小时的程序员
每天工作4小时的程序员
程序员和编码员之间的区别
程序员和编码员之间的区别
那些性感的让人尖叫的程序员
那些性感的让人尖叫的程序员
程序员最害怕的5件事 你中招了吗?
程序员最害怕的5件事 你中招了吗?
亲爱的项目经理,我恨你
亲爱的项目经理,我恨你
什么才是优秀的用户界面设计
什么才是优秀的用户界面设计
一个程序员的时间管理
一个程序员的时间管理
如何区分一个程序员是“老手“还是“新手“?
如何区分一个程序员是“老手“还是“新手“?
10个帮程序员减压放松的网站
10个帮程序员减压放松的网站
“肮脏的”IT工作排行榜
“肮脏的”IT工作排行榜
60个开发者不容错过的免费资源库
60个开发者不容错过的免费资源库
初级 vs 高级开发者 哪个性价比更高?
初级 vs 高级开发者 哪个性价比更高?
程序员的一天:一寸光阴一寸金
程序员的一天:一寸光阴一寸金
10个调试和排错的小建议
10个调试和排错的小建议
2013年中国软件开发者薪资调查报告
2013年中国软件开发者薪资调查报告
我是如何打败拖延症的
我是如何打败拖延症的
Java程序员必看电影
Java程序员必看电影
老美怎么看待阿里赴美上市
老美怎么看待阿里赴美上市
程序员眼里IE浏览器是什么样的
程序员眼里IE浏览器是什么样的
我跳槽是因为他们的显示器更大
我跳槽是因为他们的显示器更大
不懂技术不要对懂技术的人说这很容易实现
不懂技术不要对懂技术的人说这很容易实现
程序员必看的十大电影
程序员必看的十大电影
Web开发人员为什么越来越懒了?
Web开发人员为什么越来越懒了?
聊聊HTTPS和SSL/TLS协议
聊聊HTTPS和SSL/TLS协议
科技史上最臭名昭著的13大罪犯
科技史上最臭名昭著的13大罪犯
十大编程算法助程序员走上高手之路
十大编程算法助程序员走上高手之路
2013年美国开发者薪资调查报告
2013年美国开发者薪资调查报告
总结2014中国互联网十大段子
总结2014中国互联网十大段子
那些争议最大的编程观点
那些争议最大的编程观点
中美印日四国程序员比较
中美印日四国程序员比较
“懒”出效率是程序员的美德
“懒”出效率是程序员的美德
我的丈夫是个程序员
我的丈夫是个程序员
为啥Android手机总会越用越慢?
为啥Android手机总会越用越慢?
程序员周末都喜欢做什么?
程序员周末都喜欢做什么?
写给自己也写给你 自己到底该何去何从
写给自己也写给你 自己到底该何去何从
鲜为人知的编程真相
鲜为人知的编程真相
程序员应该关注的一些事儿
程序员应该关注的一些事儿
当下全球最炙手可热的八位少年创业者
当下全球最炙手可热的八位少年创业者
 程序员的样子
程序员的样子
团队中“技术大拿”并非越多越好
团队中“技术大拿”并非越多越好
Web开发者需具备的8个好习惯
Web开发者需具备的8个好习惯
Java 与 .NET 的平台发展之争
Java 与 .NET 的平台发展之争
漫画:程序员的工作
漫画:程序员的工作
程序员都该阅读的书
程序员都该阅读的书
看13位CEO、创始人和高管如何提高工作效率
看13位CEO、创始人和高管如何提高工作效率
软件开发程序错误异常ExceptionCopyright © 2009-2015 MyException 版权所有