<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>悠 悠 堂</title>
	<atom:link href="http://www.yoyotown.com/?feed=rss2" rel="self" type="application/rss+xml" />
	<link>http://www.yoyotown.com</link>
	<description>青青子衿，悠悠我心。</description>
	<lastBuildDate>Thu, 03 Jun 2010 15:00:41 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.1</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>纳斯达克上市公司招聘</title>
		<link>http://www.yoyotown.com/?p=583</link>
		<comments>http://www.yoyotown.com/?p=583#comments</comments>
		<pubDate>Thu, 03 Jun 2010 02:25:27 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Linux System]]></category>
		<category><![CDATA[招聘]]></category>

		<guid isPermaLink="false">http://www.yoyotown.com/?p=583</guid>
		<description><![CDATA[职位名称：系统工程师
所属部门：技术部
招聘人数：1人
工作地点：北京市海淀区北四环西路58号理想国际大厦8层
工作职责：
1、负责地产、房产频道Linux/Unix系统维护，包括：部署、配置、调优、故障排除、应急响应等；
2、负责系统的整体架构设计；
3、开发系统日常管理工具，完成工作所需的文档；
任职资格：
1、熟悉网络理论(如 OSI七层模型,TCP状态机)，网络协议（TCP/IP）等；
2、熟练配置apache、php、mysql、memcached、rsync、squid、nginx等服务；
3、熟练编写shell脚本，熟悉Perl、Python、PHP任其一种语言优先；
4、有大型网站运维经验者优先，熟悉分布式架构；
5、有较强的学习能力及良好的表达能力，愿意积极主动的思考如何把工作做好；
6、有团队合作精神，思维清晰，细致耐心，责任心强，能独立完成工作，承受较大工作压力；
7、大学专科以上学历，3年以上相关工作经验。
由于某些原因，具体公司名字不写了，有意者将简历请发至 dongliang[at]leju.sina.com.cn（有意者请发world档，发邮件时请将[at]改成@，邮件主题请包含关键词“系统工程师”，便于邮件识别）
最受欢迎日志2009/03/12 -- Open VPN安装设置2009/03/10 -- yoyotown.com上线啦！2009/12/08 -- Heartbeat实现Nginx高可用性(style 1.x)2009/12/18 -- Nginx、php-cgi启动停止脚本2009/03/08 -- 配置MySQL主从复制(Replication)]]></description>
			<content:encoded><![CDATA[<p>职位名称：系统工程师<br />
所属部门：技术部<br />
招聘人数：1人<br />
工作地点：北京市海淀区北四环西路58号理想国际大厦8层</p>
<p><strong>工作职责：</strong></p>
<p>1、负责地产、房产频道Linux/Unix系统维护，包括：部署、配置、调优、故障排除、应急响应等；<br />
2、负责系统的整体架构设计；<br />
3、开发系统日常管理工具，完成工作所需的文档；</p>
<p><strong>任职资格：</strong></p>
<p>1、熟悉网络理论(如 OSI七层模型,TCP状态机)，网络协议（TCP/IP）等；<br />
2、熟练配置apache、php、mysql、memcached、rsync、squid、nginx等服务；<br />
3、熟练编写shell脚本，熟悉Perl、Python、PHP任其一种语言优先；<br />
4、有大型网站运维经验者优先，熟悉分布式架构；<br />
5、有较强的学习能力及良好的表达能力，愿意积极主动的思考如何把工作做好；<br />
6、有团队合作精神，思维清晰，细致耐心，责任心强，能独立完成工作，承受较大工作压力；<br />
7、大学专科以上学历，3年以上相关工作经验。</p>
<p>由于某些原因，具体公司名字不写了，有意者将简历请发至 dongliang[at]leju.sina.com.cn（有意者请发world档，发邮件时请将[at]改成@，邮件主题请包含关键词“系统工程师”，便于邮件识别）</p>
<h3  class="related_post_title">最受欢迎日志</h3><ul class="related_post"><li>2009/03/12 -- <a href="http://www.yoyotown.com/?p=203" title="Open VPN安装设置">Open VPN安装设置</a></li><li>2009/03/10 -- <a href="http://www.yoyotown.com/?p=153" title="yoyotown.com上线啦！">yoyotown.com上线啦！</a></li><li>2009/12/08 -- <a href="http://www.yoyotown.com/?p=507" title="Heartbeat实现Nginx高可用性(style 1.x)">Heartbeat实现Nginx高可用性(style 1.x)</a></li><li>2009/12/18 -- <a href="http://www.yoyotown.com/?p=563" title="Nginx、php-cgi启动停止脚本">Nginx、php-cgi启动停止脚本</a></li><li>2009/03/08 -- <a href="http://www.yoyotown.com/?p=79" title="配置MySQL主从复制(Replication)">配置MySQL主从复制(Replication)</a></li></ul>]]></content:encoded>
			<wfw:commentRss>http://www.yoyotown.com/?feed=rss2&amp;p=583</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>配置管理工具Puppet简介、安装</title>
		<link>http://www.yoyotown.com/?p=574</link>
		<comments>http://www.yoyotown.com/?p=574#comments</comments>
		<pubDate>Thu, 27 May 2010 08:21:05 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Linux配置管理]]></category>
		<category><![CDATA[cfengine]]></category>
		<category><![CDATA[puppet]]></category>

		<guid isPermaLink="false">http://www.yoyotown.com/?p=574</guid>
		<description><![CDATA[前言：
系统管理员经常陷入一系列的重复任务中：如升级软件包、管理配置文件、系统服务、cron任务以及添加新的配置、修复错误等。这些任务通常是重复低效的，解决这类任务的第一反应是让他们自动化，于是出现了定制脚本。由于环境复杂，定制脚本和应用程序一再被重复开发，并且很难适合多种平台，灵活性和功能也很难保证，于是像Puppet这样的自动化配置管理工具便出现了。
在开源世界里，有很多配置工具可供选择，这个领域一些关键的产品有：
Puppet(http://puppet.reductivelabs.com/):

Ruby写成的配置管理工具，使用C/S架构，使用declarative language配置客户端。

Cfengine(http://www.cfengine.org):

最先发布的开源配置工具之一，1993年发布，同样是C/S架构，通常应用于教育机构。

LCFG(http://www.lcfg.org/):

 C/S架构的配置管理工具，使用XML定义配置。

Bcfg2

Python编写的C/S架构的配置管理工具，使用规格书和客户机响应配置目标主机。

本文档致力于描述使用Puppet管理你的主机、应用程序、后台程序和各种服务。
Puppet简介：
1. Puppet的用途 
Puppet是开源的基于Ruby的系统配置管理工具，依赖于C/S的部署架构。主要开发者是Luke Kanies，遵循GPLv2版权协议。从1997年开始Kanies参与UNIX的系统管理工作，Puppet的开发源于这些经验。因为对已有的配置工具不甚满意，从2001年到2005年间，Kanies开始在Reductive实验室从事工具的开发。很快，Reductive实验室发布了他们的旗舰产品——Puppet。
2. Pupput的特性 
许多系统配置管理工具工作的方式非常类似，如cfengine。是什么让Puppet与众不同？
Puppet的语法允许你创建一个单独脚本，用来在你所有的目标主机上建立一个用户。所有的目标主机会依次使用适用于本地系统的语法解释和执行这个模块。举例：如果这个配置是在Red Hat服务器上执行，建立用户使用useradd命令；如果这个配置是在FreeBSD主机上执行，使用的是adduser命令。
Puppet另一个卓越的地方是它的灵活性。源于开源软件的天性，你可以自由的获得Puppet的源码，如果你遇到问题并且有能力的话，你可以修改或者加强Puppet的代码去适用于你的环境。另外，社区开发者和捐献者还在不断增强Puppet的功能。一个大的开发者和用户社区也致力于提供Puppet的文档和技术支持。
Puppet也是易于扩展的。定制软件包的支持功能和特殊的系统环境配置能够快速简单的添加进Puppet的安装程序中。
3. Puppet的工作模式 
Puppet是一个C/S架构的配置管理工具，在中央服务器上安装puppet-server软件包（被称作Puppet master）。在需要管理的目标主机上安装puppet客户端软件（被称作Puppet Client）。当客户端连接上Puppet master后，定义在Puppet master上的配置文件会被编译，然后在客户端上运行。每个客户端默认每半个小时和服务器进行一次通信，确认配置信息的更新情况。如果有新的配置信息或者配置信息已经改变，配置将会被重新编译并发布到各客户端执行。也可以在服务器上主动触发一个配置信息的更新，强制各客户端进行配置。如果客户端的配置信息被改变了，它可以从服务器获得原始配置进行校正。
4. Puppet的未来 
最后，Puppet是一个年轻的工具，仍然处于开发和发展中。Puppet社区快速壮大，并且许多新的想法不断融入，促使开发、更新和模块每天都在呈现。
安装配置：
1. Puppet在RedHat/CentOS系统上安装
Puppet是基于Ruby写成的，所以安装前要准备好Ruby环境。在中心的Server上安装puppet-server包，并运行puppetmasterd进程；在被管理机上安装puppet包，并运行puppetd进程。另外，在每台主机上配置好自己的hostname，之后每台机器要以hostname区分。
1). 安装ruby环境：
yum install ruby ruby-rdoc
2). 安装puppet
Server端安装：
rpm -Uvh http://download.fedora.redhat.com/pub/epel/5/i386/epel-release-5-3.noarch.rpm
yum install puppet-server
chkconfig &#8211;level 2345 puppetmaster on
修改hosts，添加下面行：
Vi /etc/hosts
172.16.228.30   puppet.sina.com.cn puppet
172.16.228.29   web1.sina.com.cn web1
客户端安装：
rpm -Uvh http://download.fedora.redhat.com/pub/epel/5/i386/epel-release-5-3.noarch.rpm
yum install puppet
chkconfig &#8211;level 2345 puppet on
修改hosts，添加下面行：
Vi /etc/hosts
172.16.228.30   puppet.sina.com.cn puppet
172.16.228.29   web1.sina.com.cn web1
3). 启动puppet
Server端首次运行前，编辑/etc/puppet/manifests/site.pp文件，内容可以用最基本的：
# Create &#8220;/tmp/testfile&#8221; if it doesn&#8217;t [...]]]></description>
			<content:encoded><![CDATA[<p><strong>前言：</strong></p>
<p>系统管理员经常陷入一系列的重复任务中：如升级软件包、管理配置文件、系统服务、cron任务以及添加新的配置、修复错误等。这些任务通常是重复低效的，解决这类任务的第一反应是让他们自动化，于是出现了定制脚本。由于环境复杂，定制脚本和应用程序一再被重复开发，并且很难适合多种平台，灵活性和功能也很难保证，于是像Puppet这样的自动化配置管理工具便出现了。</p>
<p>在开源世界里，有很多配置工具可供选择，这个领域一些关键的产品有：</p>
<p>Puppet(http://puppet.reductivelabs.com/):</p>
<ul>
<li>Ruby写成的配置管理工具，使用C/S架构，使用declarative language配置客户端。</li>
</ul>
<p>Cfengine(http://www.cfengine.org):</p>
<ul>
<li>最先发布的开源配置工具之一，1993年发布，同样是C/S架构，通常应用于教育机构。</li>
</ul>
<p>LCFG(http://www.lcfg.org/):</p>
<ul>
<li> C/S架构的配置管理工具，使用XML定义配置。</li>
</ul>
<p>Bcfg2</p>
<ul>
<li>Python编写的C/S架构的配置管理工具，使用规格书和客户机响应配置目标主机。</li>
</ul>
<p>本文档致力于描述使用Puppet管理你的主机、应用程序、后台程序和各种服务。</p>
<p><strong>Puppet</strong><strong>简介：</strong></p>
<p><strong>1. Puppet</strong><strong>的用途</strong><strong> </strong></p>
<p>Puppet是开源的基于Ruby的系统配置管理工具，依赖于C/S的部署架构。主要开发者是Luke Kanies，遵循GPLv2版权协议。从1997年开始Kanies参与UNIX的系统管理工作，Puppet的开发源于这些经验。因为对已有的配置工具不甚满意，从2001年到2005年间，Kanies开始在Reductive实验室从事工具的开发。很快，Reductive实验室发布了他们的旗舰产品——Puppet。</p>
<p><strong>2. Pupput</strong><strong>的特性</strong><strong> </strong></p>
<p>许多系统配置管理工具工作的方式非常类似，如cfengine。是什么让Puppet与众不同？</p>
<p>Puppet的语法允许你创建一个单独脚本，用来在你所有的目标主机上建立一个用户。所有的目标主机会依次使用适用于本地系统的语法解释和执行这个模块。举例：如果这个配置是在Red Hat服务器上执行，建立用户使用useradd命令；如果这个配置是在FreeBSD主机上执行，使用的是adduser命令。</p>
<p>Puppet另一个卓越的地方是它的灵活性。源于开源软件的天性，你可以自由的获得Puppet的源码，如果你遇到问题并且有能力的话，你可以修改或者加强Puppet的代码去适用于你的环境。另外，社区开发者和捐献者还在不断增强Puppet的功能。一个大的开发者和用户社区也致力于提供Puppet的文档和技术支持。</p>
<p>Puppet也是易于扩展的。定制软件包的支持功能和特殊的系统环境配置能够快速简单的添加进Puppet的安装程序中。</p>
<p><strong>3. Puppet</strong><strong>的工作模式</strong><strong> </strong></p>
<p>Puppet是一个C/S架构的配置管理工具，在中央服务器上安装puppet-server软件包（被称作Puppet master）。在需要管理的目标主机上安装puppet客户端软件（被称作Puppet Client）。当客户端连接上Puppet master后，定义在Puppet master上的配置文件会被编译，然后在客户端上运行。每个客户端默认每半个小时和服务器进行一次通信，确认配置信息的更新情况。如果有新的配置信息或者配置信息已经改变，配置将会被重新编译并发布到各客户端执行。也可以在服务器上主动触发一个配置信息的更新，强制各客户端进行配置。如果客户端的配置信息被改变了，它可以从服务器获得原始配置进行校正。</p>
<p><strong>4. Puppet</strong><strong>的未来</strong><strong> </strong></p>
<p>最后，Puppet是一个年轻的工具，仍然处于开发和发展中。Puppet社区快速壮大，并且许多新的想法不断融入，促使开发、更新和模块每天都在呈现。</p>
<p><strong>安装配置：</strong></p>
<p><strong><span style="font-weight: normal;"><strong>1. Puppet</strong><strong>在</strong><strong>RedHat/CentOS</strong><strong>系统上安装</strong></span></strong></p>
<p>Puppet是基于Ruby写成的，所以安装前要准备好Ruby环境。在中心的Server上安装puppet-server包，并运行puppetmasterd进程；在被管理机上安装puppet包，并运行puppetd进程。另外，在每台主机上配置好自己的hostname，之后每台机器要以hostname区分。</p>
<p>1). 安装ruby环境：</p>
<p>yum install ruby ruby-rdoc</p>
<p>2). 安装puppet</p>
<p>Server端安装：</p>
<p>rpm -Uvh http://download.fedora.redhat.com/pub/epel/5/i386/epel-release-5-3.noarch.rpm</p>
<p>yum install puppet-server</p>
<p>chkconfig &#8211;level 2345 puppetmaster on</p>
<p>修改hosts，添加下面行：</p>
<p>Vi /etc/hosts</p>
<p>172.16.228.30   puppet.sina.com.cn puppet</p>
<p>172.16.228.29   web1.sina.com.cn web1</p>
<p>客户端安装：</p>
<p>rpm -Uvh http://download.fedora.redhat.com/pub/epel/5/i386/epel-release-5-3.noarch.rpm</p>
<p>yum install puppet</p>
<p>chkconfig &#8211;level 2345 puppet on</p>
<p>修改hosts，添加下面行：</p>
<p>Vi /etc/hosts</p>
<p>172.16.228.30   puppet.sina.com.cn puppet</p>
<p>172.16.228.29   web1.sina.com.cn web1</p>
<p>3). 启动puppet</p>
<p>Server端首次运行前，编辑/etc/puppet/manifests/site.pp文件，内容可以用最基本的：</p>
<p># Create &#8220;/tmp/testfile&#8221; if it doesn&#8217;t exist.</p>
<p>class test_class {</p>
<p>file { &#8220;/tmp/testfile&#8221;:</p>
<p>ensure =&gt; present,</p>
<p>mode =&gt; 644,</p>
<p>owner =&gt; root,</p>
<p>group =&gt; root</p>
<p>}</p>
<p>}</p>
<p># tell puppet on which client to run the class</p>
<p>node web1.sina.com.cn {</p>
<p>include test_class</p>
<p>}</p>
<p>启动Server端：</p>
<p>service puppetmaster start</p>
<p>启动客户端：</p>
<p>/etc/init.d/puppet once -v</p>
<p>这时客户机会去连server，但是由于连接是在ssl上的，而Server还没有sign过客户端的cert，客户机被断开。</p>
<p>到Server端执行：puppetca -list，会显示等待签名的客户端的主机名，执行：puppetca -sign &lt;客户端主机名&gt; 即可为其签名。</p>
<p>在Server端为web1.sian.com.cn授权：</p>
<p>puppetca -list</p>
<p>web1.sian.com.cn</p>
<p>puppetca -sign web1.sian.com.cn</p>
<p>这时再到客户机上启动puppetd，即可看到客户在正常地连接server，并且应用Server上为客户端定制的配置策略。</p>
<p>启动客户端：</p>
<p>/etc/init.d/puppet once -v</p>
<p>4). 测试：</p>
<p>也可以将日志直接打印到终端上进行测试：</p>
<p>Server端：puppetmasterd -d &#8211;no-daemonize -v &#8211;trace</p>
<p>客户端：puppetd &#8211;test &#8211;trace &#8211;debug</p>
<p><strong>2. puppet</strong><strong>配置文件</strong><strong> </strong></p>
<p>主配置文件（puppet.conf）：</p>
<p>1). 配置文件命名空间：</p>
<p>main 通用配置选项</p>
<p>puppetd 客户端配置选项</p>
<p>puppetmasterd 服务端配置选项</p>
<p>2). main命名空间选项：</p>
<p>confdir 配置文件目录，默认在/etc/puppet</p>
<p>vardir 动态数据目录，默认在/var/lib/puppet</p>
<p>logdir 日志目录，默认在/var/log/log</p>
<p>rundir puppet PID目录，默认在/var/run/puppet</p>
<p>statedir state目录，默认在$vardir/state</p>
<p>statefile state文件，默认在$statedir/state.yaml</p>
<p>ssldir SSL证书目录，默认在$vardir/ssl</p>
<p>trace 发生错误时显示跟踪信息，默认false</p>
<p>filetimeout 检测配置文件状态改变的时间周期，单位秒，默认15秒</p>
<p>syslogfacility 指定syslog功能为user级，默认为daemon级</p>
<p>3). puppetmasterd命名空间选项:</p>
<p>user 后台进程执行的用户</p>
<p>group 后台进程执行的组</p>
<p>mainfestdir mainfests文件存储目录，默认为$confdir/mainfests</p>
<p>mainfest mainfest站点文件的名字，默认为site.pp</p>
<p>bindaddress 后台进程绑定的网卡地址接口</p>
<p>masterport 后台进程执行的端口，默认为8140</p>
<p>4). puppet命名空间选项:</p>
<p>server puppet puppet服务器名，默认为puppet</p>
<p>runinterval seconds puppet应用配置的时间间隔，默认1800秒（0.5小时）</p>
<p>puppetdlockfie file puppet lock文件位置，默认$statedir/puppetdlock</p>
<p>puppetport port 后台进程执行的端口，默认8139</p>
<p>文件服务配置文件（fileserver.conf）：</p>
<p>[files]</p>
<p>path /var/lib/puppet/files</p>
<p>allow 121.14.1.*</p>
<p>allow 60.28.228.0/24</p>
<p>allow *.house.sina.com.cn</p>
<p>deny *.sina.com.cn</p>
<p>path定义文件存放路径，通过allow/deny来控制访问权限。</p>
<p><strong>3. </strong><strong>puppet</strong><strong>命令集</strong></p>
<p><strong> </strong></p>
<p>1). puppet 用于执行用户所写独立的mainfests文件</p>
<p># puppet -l /tmp/manifest.log manifest.pp</p>
<p>2). puppetd 运行在被管理主机上的客户端程序</p>
<p># puppetd &#8211;server puppet.leju.com</p>
<p>3). puppetmasterd 运行在管理机上的服务器程序</p>
<p># puppetmasterd</p>
<p>4). puppetca puppet认证程序</p>
<p># puppetca -l</p>
<p>pclient.leju.com</p>
<p># puppetca -s pclient.leju.com</p>
<p>5). puppetrun 用于连接客户端，强制运行本地配置文件</p>
<p># puppetrun -p 10 &#8211;host host1 &#8211;host host2 -t remotefile -t webserver</p>
<p>6). filebucket 客户端用于发送文件到puppet file bucket的工具</p>
<p># filebucket -b /tmp/filebucket /my/file</p>
<p>7). ralsh 转换配置信息到puppet配置代码</p>
<p># ralsh user luke</p>
<p>user { &#8216;luke&#8217;:</p>
<p>home =&gt; &#8216;/home/luke&#8217;,</p>
<p>uid =&gt; &#8216;100&#8242;,</p>
<p>ensure =&gt; &#8216;present&#8217;,</p>
<p>comment =&gt; &#8216;Luke Kanies,,,&#8217;,</p>
<p>gid =&gt; &#8216;1000&#8242;,</p>
<p>shell =&gt; &#8216;/bin/bash&#8217;,</p>
<p>groups =&gt; ['sysadmin','audio','video','puppet']</p>
<p>}</p>
<p>8). puppetdoc 打印puppet参考文档</p>
<p># puppetdoc -r type &gt; /tmp/type_reference.rst</p>
<p># puppetdoc &#8211;outputdir /tmp/rdoc &#8211;mode rdoc /path/to/manifests</p>
<p># puppetdoc /etc/puppet/manifests/site.pp</p>
<h3  class="related_post_title">最受欢迎日志</h3><ul class="related_post"><li>2009/03/12 -- <a href="http://www.yoyotown.com/?p=203" title="Open VPN安装设置">Open VPN安装设置</a></li><li>2009/03/10 -- <a href="http://www.yoyotown.com/?p=153" title="yoyotown.com上线啦！">yoyotown.com上线啦！</a></li><li>2009/12/08 -- <a href="http://www.yoyotown.com/?p=507" title="Heartbeat实现Nginx高可用性(style 1.x)">Heartbeat实现Nginx高可用性(style 1.x)</a></li><li>2009/12/18 -- <a href="http://www.yoyotown.com/?p=563" title="Nginx、php-cgi启动停止脚本">Nginx、php-cgi启动停止脚本</a></li><li>2009/03/08 -- <a href="http://www.yoyotown.com/?p=79" title="配置MySQL主从复制(Replication)">配置MySQL主从复制(Replication)</a></li></ul>]]></content:encoded>
			<wfw:commentRss>http://www.yoyotown.com/?feed=rss2&amp;p=574</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Nginx、php-cgi启动停止脚本</title>
		<link>http://www.yoyotown.com/?p=563</link>
		<comments>http://www.yoyotown.com/?p=563#comments</comments>
		<pubDate>Fri, 18 Dec 2009 02:38:05 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Linux基础]]></category>
		<category><![CDATA[Shell脚本]]></category>
		<category><![CDATA[Nginx]]></category>
		<category><![CDATA[php-cgi]]></category>
		<category><![CDATA[shell]]></category>

		<guid isPermaLink="false">http://www.yoyotown.com/?p=563</guid>
		<description><![CDATA[为了方便Nginx和php-cgi的启动停止写了一个脚本，将下面脚本保存为/etc/init.d/nginxd，支持service nginxd start&#124;stop&#124;restart&#124;reload&#124;status
注意：标亮的行可能需要按你的环境修改
#!/bin/sh

# source function library
. /etc/rc.d/init.d/functions

# Source networking configuration.
. /etc/sysconfig/network

# Check that networking is up.
[ ${NETWORKING} = &#34;no&#34; ] &#38;&#38; exit 0

RETVAL=0
prog=&#34;nginx&#34;

nginxDir=/usr/local/nginx
nginxd=$nginxDir/sbin/nginx
nginxConf=$nginxDir/conf/nginx.conf
nginxPid=$nginxDir/logs/nginx.pid

nginx_check()
{
	if [[ -e $nginxPid ]]; then
		ps aux &#124;grep -v grep &#124;grep -q nginx
		if (( $? == 0 )); then
			echo &#34;$prog already running...&#34;
			exit 1
		else
			rm -rf $nginxPid &#38;&#62; /dev/null
		fi
	fi
}

phpcgi_check()
{
	netstat -tunlp &#124;grep -q php-cgi
	if (( $? [...]]]></description>
			<content:encoded><![CDATA[<p>为了方便Nginx和php-cgi的启动停止写了一个脚本，将下面脚本保存为/etc/init.d/nginxd，支持service nginxd start|stop|restart|reload|status</p>
<p><span style="color: #0000ff;">注意：标亮的行可能需要按你的环境修改</span></p>
<pre class="brush: bash; highlight: [15,16,17,18,47];">#!/bin/sh

# source function library
. /etc/rc.d/init.d/functions

# Source networking configuration.
. /etc/sysconfig/network

# Check that networking is up.
[ ${NETWORKING} = &quot;no&quot; ] &amp;&amp; exit 0

RETVAL=0
prog=&quot;nginx&quot;

nginxDir=/usr/local/nginx
nginxd=$nginxDir/sbin/nginx
nginxConf=$nginxDir/conf/nginx.conf
nginxPid=$nginxDir/logs/nginx.pid

nginx_check()
{
	if [[ -e $nginxPid ]]; then
		ps aux |grep -v grep |grep -q nginx
		if (( $? == 0 )); then
			echo &quot;$prog already running...&quot;
			exit 1
		else
			rm -rf $nginxPid &amp;&gt; /dev/null
		fi
	fi
}

phpcgi_check()
{
	netstat -tunlp |grep -q php-cgi
	if (( $? == 0 )); then
		echo &quot;php-cgi already running...&quot;
		return 1
	fi
}

phpcgi_start()
{
	phpcgi_check
	if (( $? == 0 )); then
		echo -n $&quot;Starting php-cgi:&quot;
		daemon /usr/bin/spawn-fcgi -a 127.0.0.1 -p 9000 -u nobody -g nobody -C 64 -f /usr/bin/php-cgi
		RETVAL=$?
		echo
                [ $RETVAL = 0 ] &amp;&amp; touch /var/lock/subsys/php-cgi
                return $RETVAL
	fi
}

phpcgi_stop()
{
	echo -n $&quot;Stopping php-cgi:&quot;
	phpcgi_pid=`netstat -tnlp |grep php-cgi |awk '{print $7}' |awk -F'/' '{print $1}'`
        kill -9 $phpcgi_pid &amp;&gt;/dev/null
        RETVAL=$?
	killall -9 php-cgi &amp;&gt;/dev/null
	RETVAL=$RETVAL+$?
	if (( $RETVAL == 0 )); then
		echo_success
	else
		echo_failure
	fi
        echo
	[ $RETVAL = 0 ] &amp;&amp; rm -f /var/lock/subsys/php-cgi
}

start()
{
	nginx_check
	if (( $? != 0 )); then
		true
	else
		echo -n $&quot;Starting $prog:&quot;
		daemon $nginxd -c $nginxConf
		RETVAL=$?
		echo
		[ $RETVAL = 0 ] &amp;&amp; touch /var/lock/subsys/nginx
		return $RETVAL
	fi
}

stop()
{
	echo -n $&quot;Stopping $prog:&quot;
	killproc $nginxd
	RETVAL=$?
        echo
        [ $RETVAL = 0 ] &amp;&amp; rm -f /var/lock/subsys/nginx $nginxPid
}

reload()
{
	echo -n $&quot;Reloading $prog:&quot;
	killproc $nginxd -HUP
	RETVAL=$?
        echo
}

case &quot;$1&quot; in
        start)
		phpcgi_start
                start
                ;;
        stop)
		phpcgi_stop
                stop
                ;;
        restart)
		phpcgi_stop
                stop
		phpcgi_start
                start
                ;;
        reload)
                reload
                ;;
        status)
                status $prog
                RETVAL=$?
                ;;
        *)
                echo $&quot;Usage: $0 {start|stop|restart|reload|status}&quot;
                RETVAL=1
esac
exit $RETVAL</pre>
<h3  class="related_post_title">相关日志</h3><ul class="related_post"><li>2009/12/11 -- <a href="http://www.yoyotown.com/?p=558" title="MySQL-Nginx-Pacemaker-corosync(openais)-drbd active/passive cluster">MySQL-Nginx-Pacemaker-corosync(openais)-drbd active/passive cluster</a></li><li>2009/12/10 -- <a href="http://www.yoyotown.com/?p=552" title="Heartbeat/corosync+pacemaker+ldirectord 实现Nginx负载均衡">Heartbeat/corosync+pacemaker+ldirectord 实现Nginx负载均衡</a></li><li>2009/12/09 -- <a href="http://www.yoyotown.com/?p=511" title="Heartbeat实现Nginx高可用性(style 2.x)">Heartbeat实现Nginx高可用性(style 2.x)</a></li><li>2009/12/08 -- <a href="http://www.yoyotown.com/?p=507" title="Heartbeat实现Nginx高可用性(style 1.x)">Heartbeat实现Nginx高可用性(style 1.x)</a></li><li>2009/03/08 -- <a href="http://www.yoyotown.com/?p=63" title="在脚本中使用gmail作为邮件传输代理（MTA）发信">在脚本中使用gmail作为邮件传输代理（MTA）发信</a></li></ul>]]></content:encoded>
			<wfw:commentRss>http://www.yoyotown.com/?feed=rss2&amp;p=563</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>MySQL-Nginx-Pacemaker-corosync(openais)-drbd active/passive cluster</title>
		<link>http://www.yoyotown.com/?p=558</link>
		<comments>http://www.yoyotown.com/?p=558#comments</comments>
		<pubDate>Fri, 11 Dec 2009 06:18:03 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[MySQL]]></category>
		<category><![CDATA[高可用性]]></category>
		<category><![CDATA[cluster]]></category>
		<category><![CDATA[corosync]]></category>
		<category><![CDATA[drbd]]></category>
		<category><![CDATA[ha]]></category>
		<category><![CDATA[Nginx]]></category>
		<category><![CDATA[pacemaker]]></category>

		<guid isPermaLink="false">http://www.yoyotown.com/?p=558</guid>
		<description><![CDATA[ 
系统：CentOS 5.4
IP分配：
HA1		eth0：192.168.0.66	eth1：192.168.10.1
HA2		eth0：192.168.0.69	eth1：192.168.10.2
VIP		192.168.0.120
DRBD(Distributed Replicated Block Device)，DRBD 号称是 &#8220;网络 RAID&#8221;，开源软件，由
LINBIT 公司开发。DRBD
实际上是一种块设备的实现,主要被用于Linux平台下的高可用(HA)方案之中。他有内核模块和相关程序而组成，通过网络通信来同步镜像整个设备，有点
类似于一个网络RAID-1的功能。也就是说当你将数据写入本地的DRBD设备上的文件系统时,
数据会同时被发送到网络中的另外一台主机之上，并以完全相同的形式记录在文件系统中。本地节点与远程节点的数据可以保证实时的同步，并保证IO的一致性。
所以当本地节点的主机出现故障时,远程节点的主机上还会保留有一份完全相同的数据,可以继续使用，以达到高可用的目的。
 

 
一、安装DRBD
在HA1和HA2上安装DRBD。
wget http://oss.linbit.com/drbd/8.3/drbd-8.3.5.tar.gz
[root@HA1 ~]# tar xzvf drbd-8.3.5.tar.gz
[root@HA1 ~]# cd drbd-8.3.5
[root@HA1 drbd-8.3.5]# make clean all
[root@HA1 drbd-8.3.5]# make install
[root@HA1 drbd-8.3.5]# cd
[root@HA1 ~]# vi /etc/drbd.conf
global {
    usage-count yes;    # 是否参加使用者统计，yes为参加
}
common {
  syncer { rate 100M; }    # 设置网络同步速率,建议改为实际网络速率
}

# [...]]]></description>
			<content:encoded><![CDATA[<p><span style="font-size: small;"> </span></p>
<p>系统：CentOS 5.4<br />
IP分配：</p>
<pre class="brush: plain;">HA1		eth0：192.168.0.66	eth1：192.168.10.1
HA2		eth0：192.168.0.69	eth1：192.168.10.2
VIP		192.168.0.120</pre>
<p><span style="font-size: small;">DRBD(Distributed Replicated Block Device)，DRBD 号称是 &#8220;网络 RAID&#8221;，开源软件，由<br />
LINBIT 公司开发。DRBD<br />
实际上是一种块设备的实现,主要被用于Linux平台下的高可用(HA)方案之中。他有内核模块和相关程序而组成，通过网络通信来同步镜像整个设备，有点<br />
类似于一个网络RAID-1的功能。也就是说当你将数据写入本地的DRBD设备上的文件系统时,<br />
数据会同时被发送到网络中的另外一台主机之上，并以完全相同的形式记录在文件系统中。本地节点与远程节点的数据可以保证实时的同步，并保证IO的一致性。<br />
所以当本地节点的主机出现故障时,远程节点的主机上还会保留有一份完全相同的数据,可以继续使用，以达到高可用的目的。</span></p>
<p><span style="font-size: small;"> </span></p>
<div id="vy6e" style="text-align: left; font-family: Times New Roman;"><img style="width: 630px; height: 344px;" src="http://docs.google.com/File?id=dmswbz7_282f3kmk7dj_b" alt="" /></div>
<p><span style="font-size: small;"> </span></p>
<p><span style="font-size: small;">一、安装DRBD</span></p>
<p><span style="font-size: small;">在HA1和HA2上安装DRBD。<br />
wget http://oss.linbit.com/drbd/8.3/drbd-8.3.5.tar.gz</span></p>
<p><span style="font-size: small;">[root@HA1 ~]# tar xzvf drbd-8.3.5.tar.gz<br />
[root@HA1 ~]# cd drbd-8.3.5<br />
[root@HA1 drbd-8.3.5]# make clean all<br />
[root@HA1 drbd-8.3.5]# make install<br />
[root@HA1 drbd-8.3.5]# cd</span></p>
<p>[root@HA1 ~]# vi /etc/drbd.conf</p>
<pre class="brush: plain;">global {
    usage-count yes;    # 是否参加使用者统计，yes为参加
}
common {
  syncer { rate 100M; }    # 设置网络同步速率,建议改为实际网络速率
}

# 一个DRBD设备(即:/dev/drbdX)，叫做一个&quot;资源&quot;。
resource &quot;r0&quot; {
  protocol C;    #  数据同步协议，C表示收到远程主机的写入确认后才认为写入完成
  startup {
  }
  disk {
    on-io-error detach;
  }
  handlers {
    split-brain &quot;/usr/lib/drbd/notify-split-brain.sh root&quot;; # 自动修复脑裂问题
  }
  net {
    # 设置主备机之间通信使用的信息算法.
    cram-hmac-alg sha1;
    shared-secret &quot;FooFunFactory&quot;;
    # 自动修复脑裂问题
    after-sb-0pri discard-zero-changes;
    after-sb-1pri discard-secondary;
    after-sb-2pri disconnect;
  }
  syncer {
  }
  # 每个主机的说明以&quot;on&quot;开头，后面是主机名
  on HA1 {
    device    /dev/drbd0;
    disk    /dev/sdb;
    # 设置DRBD的监听端口,用于与另一台主机通信
    address    192.168.0.66:7789;
    # metadata的存放位置
    # internal表示将metadata存放到drbd挂在的磁盘分区的最后的位置上
    meta-disk    internal;
  }

  on HA2 {
    device     /dev/drbd0;
    disk       /dev/sdb;
    address    192.168.0.69:7789;
    meta-disk  internal;
  }
}</pre>
<p><span style="font-size: small;">DRBD将数据的各种信息块保存在一个专用的区域里，这些metadata包括了</span></p>
<p><span style="font-size: small;">a，DRBD设备的大小<br />
b，产生的标识<br />
c，活动日志<br />
d，快速同步的位图</span></p>
<p><span style="font-size: small;">metadata的存储方式有内部和外部两种方式，使用哪种配置都是在资源配置中定义的</span></p>
<p><span style="font-size: small;">内部metadata：内部metadata存放在同一块硬盘或分区的最后的位置上</span></p>
<p><span style="font-size: small;">优点：metadata和数据是紧密联系在一起的，如果硬盘损坏，metadata同样就没有了，同样在恢复的时候，metadata也会一起被恢复回来<br />
缺点：metadata和数据在同一块硬盘上，对于写操作的吞吐量会带来负面的影响，因为应用程序的写请求会触发metadata的更新，这样写操作就会造成两次额外的磁头读写移动。</span></p>
<p><span style="font-size: small;">外部metadata：外部的metadata存放在和数据磁盘分开的独立的块设备上</span></p>
<p><span style="font-size: small;">优点：对于一些写操作可以对一些潜在的行为提供一些改进<br />
缺点：metadata和数据不是联系在一起的，所以如果数据盘出现故障，在更换新盘的时候就需要认为的干预操作来进行现有node对心硬盘的同步了</span></p>
<p><span style="font-size: small;">[root@HA1 ~]# scp /etc/drbd.conf HA2:/etc/</span></p>
<p><span style="font-size: small;">初始化并启动两个系统上的 DRBD 服务:<br />
[root@HA1 ~]# drbdadm create-md r0<br />
[root@HA1 ~]# service drbd start<br />
Starting DRBD resources: [ d(r0) s(r0) n(r0) ].</span></p>
<p><span style="font-size: small;">将 HA1 配置为主节点:<br />
[root@HA1 ~]# drbdadm &#8211;overwrite-data-of-peer primary r0</span></p>
<p><span style="font-size: small;">两个设备开始同步数据：<br />
[root@HA2 ~]# service drbd status<br />
drbd driver loaded OK; device status:<br />
version: 8.3.5 (api:88/proto:86-91)<br />
GIT-hash: ded8cdf09b0efa1460e8ce7a72327c60ff2210fb build by root@HA2, 2009-11-13 01:58:29<br />
m:res  cs          ro                 ds                     p  mounted  fstype<br />
&#8230;    sync&#8217;ed:    0.6%               (6108/6140)M<br />
0:r0   SyncTarget  Secondary/Primary  Inconsistent/UpToDate  C</span></p>
<p><span style="font-size: small;">&#8230;&#8230;&#8230;</span></p>
<p><span style="font-size: small;">[root@HA2 ~]# service drbd status<br />
drbd driver loaded OK; device status:<br />
version: 8.3.5 (api:88/proto:86-91)<br />
GIT-hash: ded8cdf09b0efa1460e8ce7a72327c60ff2210fb build by root@HA2, 2009-11-13 01:58:29<br />
m:res  cs          ro                 ds                     p  mounted  fstype<br />
&#8230;    sync&#8217;ed:    45.6%              (3344/6140)M<br />
0:r0   SyncTarget  Secondary/Primary  Inconsistent/UpToDate  C</span></p>
<p><span style="font-size: small;">&#8230;&#8230;&#8230;</span></p>
<p><span style="font-size: small;">同步数据完成：<br />
[root@HA2 ~]# service drbd status<br />
drbd driver loaded OK; device status:<br />
version: 8.3.5 (api:88/proto:86-91)<br />
GIT-hash: ded8cdf09b0efa1460e8ce7a72327c60ff2210fb build by root@HA2, 2009-11-13 01:58:29<br />
m:res  cs              ro                 ds                     p  mounted  fstype<br />
&#8230;    sync&#8217;ed:100.0%  (4/6140)M<br />
0:r0   SyncTarget      Secondary/Primary  Inconsistent/UpToDate  C<br />
[root@HA2 ~]# service drbd status<br />
drbd driver loaded OK; device status:<br />
version: 8.3.5 (api:88/proto:86-91)<br />
GIT-hash: ded8cdf09b0efa1460e8ce7a72327c60ff2210fb build by root@HA2, 2009-11-13 01:58:29<br />
m:res  cs         ro                 ds                 p  mounted  fstype<br />
0:r0   Connected  Secondary/Primary  UpToDate/UpToDate  C</span></p>
<p><span style="font-size: small;">[root@HA1 ~]# cat /proc/drbd<br />
version: 8.3.5 (api:88/proto:86-91)<br />
GIT-hash: ded8cdf09b0efa1460e8ce7a72327c60ff2210fb build by root@HA1, 2009-11-13 01:53:51<br />
0: cs:Connected ro:Primary/Secondary ds:UpToDate/UpToDate C r&#8212;-<br />
ns:6291228 nr:0 dw:0 dr:6291228 al:0 bm:384 lo:0 pe:0 ua:0 ap:0 ep:1 wo:b oos:0</span></p>
<p><span style="font-size: small;">两个节点上的块设备都完全同步之后,使用诸如ext3的文件系统格式化主节点上的 DRBD 设备。<br />
[root@HA1 ~]# mkfs.ext3 /dev/drbd0</span></p>
<p><span style="font-size: small;">测试DRBD服务：<br />
手动挂载DRBD设备，并测试写入文件。<br />
[root@HA1 ~]# mount -o rw /dev/drbd0 /data/<br />
[root@HA1 ~]# echo &#8220;This is a test line.&#8221; &gt; /data/test.txt<br />
卸载DRBD设备并将HA1设置为从设备。<br />
[root@HA1 ~]# umount /data/<br />
[root@HA1 ~]# drbdadm secondary r0<br />
将HA2设置为主设备。<br />
[root@HA2 ~]# drbdadm primary r0<br />
[root@HA2 ~]# service drbd status<br />
drbd driver loaded OK; device status:<br />
version: 8.3.5 (api:88/proto:86-91)<br />
GIT-hash: ded8cdf09b0efa1460e8ce7a72327c60ff2210fb build by root@HA2, 2009-11-13 01:58:29<br />
m:res  cs         ro                 ds                 p  mounted  fstype<br />
0:r0   Connected  Primary/Secondary  UpToDate/UpToDate  C<br />
挂载DRBD设备并验证能够读出在HA1上写入的文件。<br />
[root@HA2 ~]# mount -o rw /dev/drbd0 /data/<br />
[root@HA2 ~]# cat /data/test.txt<br />
This is a test line.<br />
卸载DRBD设备并将HA2设置为从设备。<br />
[root@HA2 ~]# umount /data/<br />
[root@HA2 ~]# drbdadm secondary r0</span></p>
<p><span style="font-size: small;">将HA1设置为主设备。<br />
[root@HA1 ~]# drbdadm primary r0</span></p>
<p><span style="font-size: small;">查看HA2的DRDB状态：<br />
[root@HA2 ~]# service drbd status<br />
drbd driver loaded OK; device status:<br />
version: 8.3.5 (api:88/proto:86-91)<br />
GIT-hash: ded8cdf09b0efa1460e8ce7a72327c60ff2210fb build by root@HA2, 2009-11-13 01:58:29<br />
m:res  cs         ro                 ds                 p  mounted  fstype<br />
0:r0   Connected  Secondary/Primary  UpToDate/UpToDate  C</span></p>
<p><span style="font-size: small;">在HA1和HA2上配置hosts<br />
[root@HA1 ~]# cat /etc/hosts</p>
<pre class="brush: plain;"># Do not remove the following line, or various programs
# that require network functionality will fail.
127.0.0.1 vpc localhost.localdomain localhost
::1 localhost6.localdomain6 localhost6
192.168.10.1 HA1
192.168.10.2 HA2</pre>
<p></span></p>
<p><span style="font-size: small;"> </span><span style="font-size: small;">在HA1和HA2上配置时间同步：<br />
</span><span style="font-size: small;">[root@HA1 ~]# crontab -e<br />
</span><span style="font-size: small;">
<pre class="brush: plain;">*/5     *       *       *       *       /usr/sbin/ntpdate ntp.api.bz</pre>
<p></span><br />
<span style="font-size: small;"> </span></p>
<p>二、在HA1和HA2安装MySQL和Nginx并将数据迁移到/data目录<br />
[root@HA1 ~]# yum install -y mysql-server<br />
[root@HA1 ~]# cat /etc/my.cnf<br />
<span style="font-size: small;">
<pre class="brush: plain;">[mysqld]
datadir=/data/mysql
socket=/data/mysql/mysql.sock
user=mysql
bind-address=192.168.0.120</pre>
<p></span></p>
<p><span style="font-size: small;">[root@HA1 ~]# cp -r /var/lib/mysql/ /data/<br />
[root@HA1 ~]# cd /data/<br />
[root@HA1 data]# chown -R mysql.mysql mysql/<br />
[root@HA1 data]# service mysqld start<br />
Starting MySQL:                                            [  OK  ]<br />
[root@HA1 data]# service mysqld stop<br />
Stopping MySQL:                                            [  OK  ]</span></p>
<p><span style="font-size: small;">注意：数据迁移只需在HA1上做。</span></p>
<p><span style="font-size: small;">安装Nginx略，具体见Nginx 0.7.x + PHP 5.2.8（FastCGI）搭建胜过Apache十倍的Web服务器（http://blog.s135.com/post/366/）</span></p>
<p><span style="font-size: small;">[root@HA1 ~]# chkconfig &#8211;level 2345 mysqld off<br />
[root@HA2 ~]# chkconfig &#8211;level 2345 mysqld off<br />
注意：不要在外部启动HA使用的资源，一切让HA去控制。</span></p>
<p><span style="font-size: small;">编写nginx lsb资源代理脚本（注意nginx安装路径）：<br />
[root@HA1 ~]# cat /etc/init.d/nginxd</span></p>
<pre class="brush: bash; highlight: [15,16,17,18];">#!/bin/sh

# source function library
. /etc/rc.d/init.d/functions

# Source networking configuration.
. /etc/sysconfig/network

# Check that networking is up.
[ ${NETWORKING} = &quot;no&quot; ] &amp;&amp; exit 0

RETVAL=0
prog=&quot;nginx&quot;

nginxDir=/usr/local/nginx
nginxd=$nginxDir/sbin/nginx
nginxConf=$nginxDir/conf/nginx.conf
nginxPid=$nginxDir/nginx.pid

nginx_check()
{
    if [[ -e $nginxPid ]]; then
        ps aux |grep -v grep |grep -q nginx
        if (( $? == 0 )); then
            echo &quot;$prog already running...&quot;
            exit 1
        else
            rm -rf $nginxPid &amp;&gt; /dev/null
        fi
    fi
}

start()
{
    nginx_check
    if (( $? != 0 )); then
        true
    else
        echo -n $&quot;Starting $prog:&quot;
        daemon $nginxd -c $nginxConf
        RETVAL=$?
        echo
        [ $RETVAL = 0 ] &amp;&amp; touch /var/lock/subsys/nginx
        return $RETVAL
    fi
}

stop()
{
    echo -n $&quot;Stopping $prog:&quot;
    killproc $nginxd
    RETVAL=$?
    echo
    [ $RETVAL = 0 ] &amp;&amp; rm -f /var/lock/subsys/nginx $nginxPid
}

reload()
{
    echo -n $&quot;Reloading $prog:&quot;
    killproc $nginxd -HUP
    RETVAL=$?
    echo
}

case &quot;$1&quot; in
        start)
                start
                ;;
        stop)
                stop
                ;;
        restart)
                stop
                start
                ;;
        reload)
                reload
                ;;
        status)
                status $prog
                RETVAL=$?
                ;;
        *)
                echo $&quot;Usage: $0 {start|stop|restart|reload|status}&quot;
                RETVAL=1
esac
exit $RETVAL</pre>
<p><span style="font-size: small;">[root@HA1 ~]# chmod +x  /etc/init.d/nginxd<br />
[root@HA1 ~]# scp  /etc/init.d/nginxd HA2: /etc/init.d/nginxd</span></p>
<p><span style="font-size: small;">三、安装配置corosync和pacemaker</span></p>
<p><span style="font-size: small;">corosync是基于OpenAIS构建的集群引擎，可替代heartbeat进行心跳检测。<br />
The Corosync Cluster Engine is an <a title="Open source" href="http://en.wikipedia.org/wiki/Open_source">open source</a> project Licensed under the <a class="mw-redirect" title="BSD License" href="http://en.wikipedia.org/wiki/BSD_License">BSD License</a> derived from the <a class="new" title="OpenAIS project (page does not exist)" href="http://en.wikipedia.org/w/index.php?title=OpenAIS_project&amp;action=edit&amp;redlink=1">OpenAIS project</a>. OpenAIS uses a UDP multicast based communication protocol to periodically check for node availability.</span></p>
<p><span style="font-size: small;">[root@HA1 ~]# wget -O /etc/yum.repos.d/pacemaker.repo http://clusterlabs.org/rpm/epel-5/clusterlabs.repo<br />
[root@HA1 ~]# wget ftp://ftp.pbone.net/mirror/centos.karan.org/el5/extras/testing/i386/RPMS/libesmtp-1.0.4-6.el5.kb.i386.rpm<br />
[root@HA1 ~]# rpm -ivh libesmtp-1.0.4-6.el5.kb.i386.rpm<br />
[root@HA1 ~]# yum install -y pacemaker corosync</span></p>
<p><span style="font-size: small;">[root@HA1 ~]# corosync-keygen<br />
Corosync Cluster Engine Authentication key generator.<br />
Gathering 1024 bits for key from /dev/random.<br />
Press keys on your keyboard to generate entropy.<br />
Writing corosync key to /etc/corosync/authkey.</span></p>
<p>[root@HA1 ~]# scp /etc/corosync/authkey HA2:/etc/corosync/<br />
[root@HA1 ~]# cp /etc/corosync/corosync.conf.example /etc/corosync/corosync.conf<br />
[root@HA1 ~]# vi !$</p>
<pre class="brush: plain; highlight: [10,34,35,36,37,38,39];"># Please read the corosync.conf.5 manual page
compatibility: whitetank

totem {
version: 2
secauth: off
threads: 0
interface {
ringnumber: 0
bindnetaddr: 192.168.10.0
mcastaddr: 226.94.1.1
mcastport: 5405
}
}

logging {
fileline: off
to_stderr: yes
to_logfile: yes
to_syslog: yes
logfile: /var/log/corosync.log
debug: off
timestamp: on
logger_subsys {
subsys: AMF
debug: off
}
}

amf {
mode: disabled
}

service {
        # Load the Pacemaker Cluster Resource Manager
        ver:       0
        name:      pacemaker
        use_mgmtd: yes
}</pre>
<p><span style="font-size: small;">[root@HA1 ~]# scp /etc/corosync/corosync.conf HA2:/etc/corosync/corosync.conf<br />
[root@HA1 ~]# service corosync start<br />
Starting Corosync Cluster Engine (corosync):               [  OK  ]<br />
[root@HA1 ~]# chkconfig &#8211;level 2345 corosync on</span></p>
<p><span style="font-size: small;">在HA2上执行：<br />
[root@HA2 ~]# chown root:root /etc/corosync/authkey<br />
[root@HA2 ~]# chmod 400 /etc/corosync/authkey<br />
[root@HA2 ~]# service corosync start<br />
Starting Corosync Cluster Engine (corosync):               [  OK  ]<br />
[root@HA2 ~]# chkconfig &#8211;level 2345 corosync on</span></p>
<p><span style="font-size: small;">四、配置CRM资源</span></p>
<pre class="brush: plain;">[root@HA1 ~]# crm
crm(live)# configure
crm(live)configure# node HA1
crm(live)configure# node HA2
# 配置drbd原始资源
crm(live)configure# primitive drbd ocf:linbit:drbd \
 params drbd_resource=&quot;r0&quot; \
 meta migration-threshold=&quot;10&quot;
# 配置drbd资源监控
crm(live)configure# monitor drbd 30s:20s
# 配置文件系统原始资源
crm(live)configure# primitive fs ocf:heartbeat:Filesystem \
 params device=&quot;/dev/drbd0&quot; directory=&quot;/data&quot; fstype=&quot;ext3&quot;
# 配置mysql原始资源，使用lsb代理
crm(live)configure# primitive mysqld lsb:mysqld
# 配置nginx原始资源，使用lsb代理
crm(live)configure# primitive nginxd lsb:nginxd
# 配置共享IP原始资源
crm(live)configure# primitive vip ocf:heartbeat:IPaddr2 \
 params ip=&quot;192.168.0.120&quot; nic=&quot;eth0:0&quot;
# 创建资源组保障资源在某一节点上按顺序启动和停止
crm(live)configure# group mysql-group fs vip mysqld nginxd
# 配置drbd主资源约束
crm(live)configure# ms ms-drbd-mysql drbd \
 meta master-max=&quot;1&quot; master-node-max=&quot;1&quot; clone-max=&quot;2&quot; clone-node-max=&quot;1&quot; notify=&quot;true&quot;
# 配置资源位置约束，保证mysql-group资源组启动在drbd主资源上
crm(live)configure# colocation mysql-on-drbd inf: mysql-group ms-drbd-mysql:Master
# 配置资源启动顺序约束，保证drbd启动后启动mysql-group资源组
crm(live)configure# order mysql-after-drbd inf: ms-drbd-mysql:promote mysql-group:start
crm(live)configure# property $id=&quot;cib-bootstrap-options&quot; \
 expected-quorum-votes=&quot;2&quot; \
 stonith-enabled=&quot;false&quot; \
 no-quorum-policy=&quot;ignore&quot; \
 start-failure-is-fatal=&quot;false&quot;
crm(live)configure# commit
crm(live)configure# end
crm(live)#</pre>
<p><span style="font-size: small;"> </span></p>
<p>五、测试</p>
<p><span style="font-size: small;">[root@HA1 ~]# crm status</span></p>
<p><span style="font-size: small;">============<br />
Last updated: Fri Nov 20 22:47:51 2009<br />
Stack: openais<br />
Current DC: HA2 &#8211; partition with quorum<br />
Version: 1.0.6-f709c638237cdff7556cb6ab615f32826c0f8c06<br />
2 Nodes configured, 2 expected votes<br />
2 Resources configured.<br />
============</span></p>
<p><span style="font-size: small;">Online: [ HA1 HA2 ]</span></p>
<p><span style="font-size: small;"> Master/Slave Set: ms-drbd-mysql<br />
Masters: [ HA1 ]<br />
Slaves: [ HA2 ]<br />
Resource Group: mysql-group<br />
fs    (ocf::heartbeat:Filesystem):    Started HA1<br />
vip    (ocf::heartbeat:IPaddr2):    Started HA1<br />
mysqld    (lsb:mysqld):    Started HA1<br />
nginxd    (lsb:nginxd):    Started HA1</span></p>
<p><span style="font-size: small;">关闭HA1，在HA2上查看HA状态：<br />
[root@HA2 ~]# crm_mon -i1</span></p>
<p><span style="font-size: small;">============<br />
Last updated: Sat Nov 21 01:31:13 2009<br />
Stack: openais<br />
Current DC: HA2    - partition WITHOUT quorum<br />
Version: 1.0.6-f709c638237cdff7556cb6ab615f32826c0f8c06<br />
2 Nodes configured, 2 expected votes<br />
2 Resources configured.<br />
============</span></p>
<p><span style="font-size: small;">Online: [ HA2 ]<br />
OFFLINE: [ HA1 ]</span></p>
<p><span style="font-size: small;"> Master/Slave Set: ms-drbd-mysql<br />
Masters: [ HA2 ]<br />
Stopped: [ drbd:1 ]<br />
Resource Group: mysql-group<br />
fs (ocf::heartbeat:Filesystem):    Started HA2<br />
vip        (ocf::heartbeat:IPaddr2):    Started HA2<br />
mysqld     (lsb:mysqld):   Started HA2<br />
nginxd     (lsb:nginxd):   Started HA2</span></p>
<p><span style="font-size: small;">启动HA1，资源自动迁移到HA1：<br />
</span><span style="font-size: small;">[root@HA1 ~]# crm_mon -i1</span></p>
<p><span style="font-size: small;">============<br />
Last updated: Mon Nov 23 15:42:52 2009<br />
Stack: openais<br />
Current DC: HA2    - partition with quorum<br />
Version: 1.0.6-f709c638237cdff7556cb6ab615f32826c0f8c06<br />
2 Nodes configured, 2 expected votes<br />
2 Resources configured.<br />
============</span></p>
<p><span style="font-size: small;">Online: [ HA1 HA2 ]</span></p>
<p><span style="font-size: small;"> Master/Slave Set: ms-drbd-mysql<br />
Masters: [ HA1 ]<br />
Slaves: [ HA2 ]<br />
Resource Group: mysql-group<br />
fs (ocf::heartbeat:Filesystem):    Started HA1<br />
vip        (ocf::heartbeat:IPaddr2):    Started HA1<br />
mysqld     (lsb:mysqld):   Started HA1<br />
nginxd     (lsb:nginxd):   Started HA1</span></p>
<p><span style="font-size: small;">手动迁移资源到HA2<br />
[root@HA1 ~]# crm resource migrate mysql-group HA2</span></p>
<p><span style="font-size: small;">[root@HA2 ~]# crm_mon -i1</span></p>
<p><span style="font-size: small;">============<br />
Last updated: Mon Nov 23 15:43:42 2009<br />
Stack: openais<br />
Current DC: HA2    - partition with quorum<br />
Version: 1.0.6-f709c638237cdff7556cb6ab615f32826c0f8c06<br />
2 Nodes configured, 2 expected votes<br />
2 Resources configured.<br />
============</span></p>
<p><span style="font-size: small;">Online: [ HA1 HA2 ]</span></p>
<p><span style="font-size: small;"> Master/Slave Set: ms-drbd-mysql<br />
Masters: [ HA2 ]<br />
Slaves: [ HA1 ]<br />
Resource Group: mysql-group<br />
fs (ocf::heartbeat:Filesystem):    Started HA2<br />
vip        (ocf::heartbeat:IPaddr2):    Started HA2<br />
mysqld     (lsb:mysqld):   Started HA2<br />
nginxd     (lsb:nginxd):   Started HA2</span></p>
<p><span style="font-size: small;"><br />
六、解决脑裂（split brain</span><span style="font-size: small;">）问题：</span></p>
<p><span class="f14" style="font-size: small;">在“双机热备”高可用（HA）系统中，当联系2个节点的“心跳线”断开时，本来为一整体、动作<br />
协调的HA系统，就分裂成为2个独立的个体。由于相互失去了联系，都以为是对方出了故障，2个节点上的HA软件像“裂脑人”一样，“本能”地争抢“共享资<br />
源”、争起“应用服务”，就会发生严重后果：或者共享资源被瓜分、2边“服务”都起不来了；或者2边“服务”都起来了，但同时读写“共享存储”，导致数据<br />
损坏（常见如数据库轮询着的联机日志出错）。</span></p>
<p><span class="f14" style="font-size: small;">对付HA系统“裂脑”的对策大概有以下几条：</span></p>
<p>1）添加冗余的心跳线，例如双线条线。尽量减少“裂脑”发生机会。</p>
<p>2）启用磁盘锁。正在服务一方锁住共享磁盘，“裂脑”发生时，让对方完全“抢不走”共享磁盘资源。但使用锁磁盘也会有一个不小的问题，如果占用共<br />
享盘的一方不主动“解锁”，另一方就永远得不到共享磁盘。现实中假如服务节点突然死机或崩溃，就不可能执行解锁命令。后备节点也就接管不了共享资源和应用<br />
服务。于是有人在HA中设计了“智能”锁。即，正在服务的一方只在发现心跳线全部断开（察觉不到对端）时才启用磁盘锁。平时就不上锁了。</p>
<p>3）设置仲裁机制。例如设置参考IP（如网关IP），当心跳线完全断开时，2个节点都各自ping一下 参考IP，不通则表明断点就出在本端，<br />
不仅“心跳”、还兼对外“服务”的本端网络链路断了，即使启动（或继续）应用服务也没有用了，那就主动放弃竞争，让能够ping通参考IP的一端去起服<br />
务。更保险一些，ping不通参考IP的一方干脆就自我重启，以彻底释放有可能还占用着的那些共享资源。</p>
<p><span style="font-size: small;">手动解决DRBD脑裂问题：<br />
[root@HA2 ~]# drbdadm down all<br />
[root@HA2 ~]# drbdadm create-md all</span></p>
<p><span style="font-size: small;">六、参考</span></p>
<p><span style="font-size: small;"><a id="nchs" title="Integrating DRBD with Pacemaker clusters" href="http://www.drbd.org/users-guide-emb/ch-pacemaker.html">Integrating DRBD with Pacemaker clusters</a><br />
<a id="rzr6" title="DRBD MySQL HowTo" href="http://www.clusterlabs.org/wiki/DRBD_MySQL_HowTo">DRBD MySQL HowTo</a><br />
</span><span style="font-size: small;"><a id="vvr3" title="Split brain notification and automatic recovery" href="http://www.drbd.org/users-guide/s-split-brain-notification-and-recovery.html">Split brain notification and automatic recovery</a><br />
<a id="jgor" title="Manual split brain recovery" href="http://www.drbd.org/users-guide/s-resolve-split-brain.html">Manual split brain recovery</a></span></p>
<p><br style="font-family: Times New Roman;" /></p>
<h3  class="related_post_title">相关日志</h3><ul class="related_post"><li>2009/12/10 -- <a href="http://www.yoyotown.com/?p=552" title="Heartbeat/corosync+pacemaker+ldirectord 实现Nginx负载均衡">Heartbeat/corosync+pacemaker+ldirectord 实现Nginx负载均衡</a></li><li>2009/12/09 -- <a href="http://www.yoyotown.com/?p=511" title="Heartbeat实现Nginx高可用性(style 2.x)">Heartbeat实现Nginx高可用性(style 2.x)</a></li><li>2009/12/08 -- <a href="http://www.yoyotown.com/?p=507" title="Heartbeat实现Nginx高可用性(style 1.x)">Heartbeat实现Nginx高可用性(style 1.x)</a></li><li>2009/12/18 -- <a href="http://www.yoyotown.com/?p=563" title="Nginx、php-cgi启动停止脚本">Nginx、php-cgi启动停止脚本</a></li><li>2009/12/10 -- <a href="http://www.yoyotown.com/?p=546" title="用CRM命令行工具配置集群资源">用CRM命令行工具配置集群资源</a></li></ul>]]></content:encoded>
			<wfw:commentRss>http://www.yoyotown.com/?feed=rss2&amp;p=558</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Heartbeat/corosync+pacemaker+ldirectord 实现Nginx负载均衡</title>
		<link>http://www.yoyotown.com/?p=552</link>
		<comments>http://www.yoyotown.com/?p=552#comments</comments>
		<pubDate>Thu, 10 Dec 2009 06:18:11 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Linux服务]]></category>
		<category><![CDATA[高可用性]]></category>
		<category><![CDATA[corosync]]></category>
		<category><![CDATA[ha]]></category>
		<category><![CDATA[heartbeat]]></category>
		<category><![CDATA[ldirectord]]></category>
		<category><![CDATA[Nginx]]></category>
		<category><![CDATA[pacemaker]]></category>

		<guid isPermaLink="false">http://www.yoyotown.com/?p=552</guid>
		<description><![CDATA[系统：CentOS 5.4
IP分配：
HA1		eth0：192.168.0.66	eth1：192.168.10.1
HA2		eth0：192.168.0.69	eth1：192.168.10.2
VIP		192.168.0.120
1. 安装pacemaker和heartbeat
[root@HA1 ~]# wget -O /etc/yum.repos.d/pacemaker.repo http://clusterlabs.org/rpm/epel-5/clusterlabs.repo
[root@HA1 ~]# wget ftp://ftp.pbone.net/mirror/centos.karan.org/el5/extras/testing/i386/RPMS/libesmtp-1.0.4-6.el5.kb.i386.rpm
[root@HA1 ~]# rpm -ivh libesmtp-1.0.4-6.el5.kb.i386.rpm
[root@HA1 ~]# yum install -y pacemaker heartbeat
2. 安装ldirectord
[root@HA1 ~]# yum install -y ldirectord
3. 配置
3.1 配置Heartbeat
[root@HA1 ~]# cp /usr/share/doc/heartbeat-3.0.1/{ha.cf,authkeys} /etc/ha.d/
[root@HA1 ~]# cat /etc/ha.d/authkeys
auth 1
1 crc
[root@HA1 ~]# cat /etc/ha.d/ha.cf &#124;grep -v &#8220;#&#8221;
logfile	/var/log/ha-log
logfacility	local0
keepalive 2
deadtime 30
warntime 10
initdead 120
udpport	695
ucast eth1 192.168.10.2     # 注意此处HA2改为：ucast eth1 192.168.10.1
auto_failback on
watchdog [...]]]></description>
			<content:encoded><![CDATA[<p>系统：CentOS 5.4<br />
IP分配：</p>
<pre class="brush: plain;">HA1		eth0：192.168.0.66	eth1：192.168.10.1
HA2		eth0：192.168.0.69	eth1：192.168.10.2
VIP		192.168.0.120</pre>
<p>1. 安装pacemaker和heartbeat<br />
[root@HA1 ~]# wget -O /etc/yum.repos.d/pacemaker.repo http://clusterlabs.org/rpm/epel-5/clusterlabs.repo<br />
[root@HA1 ~]# wget ftp://ftp.pbone.net/mirror/centos.karan.org/el5/extras/testing/i386/RPMS/libesmtp-1.0.4-6.el5.kb.i386.rpm<br />
[root@HA1 ~]# rpm -ivh libesmtp-1.0.4-6.el5.kb.i386.rpm<br />
[root@HA1 ~]# yum install -y pacemaker heartbeat</p>
<p>2. 安装ldirectord<br />
[root@HA1 ~]# yum install -y ldirectord</p>
<p>3. 配置<br />
3.1 配置Heartbeat<br />
[root@HA1 ~]# cp /usr/share/doc/heartbeat-3.0.1/{ha.cf,authkeys} /etc/ha.d/</p>
<p>[root@HA1 ~]# cat /etc/ha.d/authkeys</p>
<pre class="brush: plain;">auth 1
1 crc</pre>
<p>[root@HA1 ~]# cat /etc/ha.d/ha.cf |grep -v &#8220;#&#8221;</p>
<pre class="brush: plain;">logfile	/var/log/ha-log
logfacility	local0
keepalive 2
deadtime 30
warntime 10
initdead 120
udpport	695
ucast eth1 192.168.10.2     # 注意此处HA2改为：ucast eth1 192.168.10.1
auto_failback on
watchdog /dev/watchdog
node	HA1
node	HA2
ping 192.168.0.1
respawn hacluster /usr/lib/heartbeat/ipfail
apiauth ipfail gid=haclient uid=hacluster
crm	on</pre>
<p>3.2 用corosync替换heartbeat（可选）<br />
corosync是基于OpenAIS构建的集群引擎，可替代heartbeat进行心跳检测。<br />
The <strong>Corosync Cluster Engine</strong> is an <a title="Open source" href="http://en.wikipedia.org/wiki/Open_source">open source</a> project Licensed under the <a class="mw-redirect" title="BSD License" href="http://en.wikipedia.org/wiki/BSD_License">BSD License</a> derived from the <a class="new" title="OpenAIS project (page does not exist)" href="http://en.wikipedia.org/w/index.php?title=OpenAIS_project&amp;action=edit&amp;redlink=1">OpenAIS project</a>. OpenAIS uses a UDP multicast based communication protocol to periodically check for node availability.</p>
<p>[root@HA1 ~]# yum install -y corosync<br />
[root@HA1 ~]# corosync-keygen<br />
Corosync Cluster Engine Authentication key generator.<br />
Gathering 1024 bits for key from /dev/random.<br />
Press keys on your keyboard to generate entropy.<br />
Writing corosync key to /etc/corosync/authkey.</p>
<p>[root@HA1 ~]# scp /etc/corosync/authkey HA2:/etc/corosync/<br />
[root@HA1 ~]# cp /etc/corosync/corosync.conf.example /etc/corosync/corosync.conf<br />
[root@HA1 ~]# vi !$</p>
<pre class="brush: plain; highlight: [10,34,35,36,37,38,39];"># Please read the corosync.conf.5 manual page
compatibility: whitetank

totem {
version: 2
secauth: off
threads: 0
interface {
ringnumber: 0
bindnetaddr: 192.168.10.0
mcastaddr: 226.94.1.1
mcastport: 5405
}
}

logging {
fileline: off
to_stderr: yes
to_logfile: yes
to_syslog: yes
logfile: /var/log/corosync.log
debug: off
timestamp: on
logger_subsys {
subsys: AMF
debug: off
}
}

amf {
mode: disabled
}

service {
        # Load the Pacemaker Cluster Resource Manager
        ver:       0
        name:      pacemaker
        use_mgmtd: yes
}</pre>
<p>[root@HA1 ~]# scp /etc/corosync/corosync.conf HA2:/etc/corosync/corosync.conf<br />
[root@HA1 ~]# service corosync start<br />
Starting Corosync Cluster Engine (corosync):               [  OK  ]<br />
[root@HA1 ~]# chkconfig &#8211;level 2345 corosync on<br />
[root@HA1 ~]# chkconfig &#8211;level 2345 heartbeat off</p>
<p>在HA2上执行：<br />
[root@HA2 ~]# chown root:root /etc/corosync/authkey<br />
[root@HA2 ~]# chmod 400 /etc/corosync/authkey<br />
[root@HA2 ~]# service corosync start<br />
Starting Corosync Cluster Engine (corosync):               [  OK  ]<br />
[root@HA2 ~]# chkconfig &#8211;level 2345 corosync on<br />
[root@HA2 ~]# chkconfig &#8211;level 2345 heartbeat off</p>
<p>3.3 安装配置ldirectord<br />
[root@HA1 ~]# cat /etc/ha.d/ldirectord.cf</p>
<pre class="brush: plain;">checktimeout=5
checkinterval=7
autoreload=yes
logfile=&quot;/var/log/ldirectord.log&quot;
quiescent=yes
emailalert=shidl@baihe.com
# A server with a page at the main root of the site that displays &quot;Nginx&quot;
virtual=192.168.0.120:80
real=192.168.0.66:80 gate
real=192.168.0.69:80 gate
service=http
request=&quot;/lb.html&quot;    # 在根目录下编写lb.html，内容为live
receive=&quot;live&quot;
scheduler=wlc
protocol=tcp
checktype=negotiate</pre>
<p>3.4 配置hosts<br />
[root@HA1 ~]# cat /etc/hosts</p>
<pre class="brush: plain;"># Do not remove the following line, or various programs
# that require network functionality will fail.
127.0.0.1		vpc localhost.localdomain localhost
::1		localhost6.localdomain6 localhost6
192.168.10.1	HA1
192.168.10.2	HA2</pre>
<p>3.5 配置lo:0设备</p>
<pre class="brush: plain;">[root@HA1 ~]# cat &gt;&gt;/etc/sysconfig/network-scripts/ifcfg-lo:0&lt;&lt;EOF
&lt;pre&gt;DEVICE=lo:0
IPADDR=192.168.0.120
NETMASK=&quot;255.255.255.255&quot;
ONBOOT=yes
NAME=loopback

EOF</pre>
<p>3.6 启用转发，禁用arp<br />
[root@HA1 ~]# vi /etc/sysctl.conf<br />
修改net.ipv4.ip_forward = 0为net.ipv4.ip_forward = 1<br />
添加下面行：</p>
<pre class="brush: plain;">net.ipv4.conf.all.arp_ignore = 1
net.ipv4.conf.eth0.arp_ignore = 1
net.ipv4.conf.all.arp_announce = 2
net.ipv4.conf.eth0.arp_announce = 2</pre>
<p>[root@HA1 ~]# sysctl -p</p>
<p># 将配置拷贝到HA2<br />
[root@HA1 ~]# scp /etc/ha.d/{ha.cf,authkeys,ldirectord.cf} HA2:/etc/ha.d/<br />
[root@HA1 ~]# scp /etc/{hosts,sysctl.conf} HA2:/etc/<br />
[root@HA1 ~]# scp /etc/sysconfig/network-scripts/ifcfg-lo:0 HA2:/etc/sysconfig/network-scripts/</p>
<p>在HA2上修改/etc/ha.d/ha.cf<br />
将ucast eth1 192.168.10.2 改为：ucast eth1 192.168.10.1<br />
并使sysctl.conf配置生效：<br />
[root@HA2~]# sysctl -p</p>
<p>3.7 在HA1和HA2上配置并安装好nginx<br />
编写nginx lsb资源代理脚本（注意nginx安装路径）：<br />
[root@HA1 ~]# cat /etc/init.d/nginxd</p>
<pre class="brush: bash; highlight: [15,16,17,18];">#!/bin/sh

# source function library
. /etc/rc.d/init.d/functions

# Source networking configuration.
. /etc/sysconfig/network

# Check that networking is up.
[ ${NETWORKING} = &quot;no&quot; ] &amp;&amp; exit 0

RETVAL=0
prog=&quot;nginx&quot;

nginxDir=/usr/local/nginx
nginxd=$nginxDir/sbin/nginx
nginxConf=$nginxDir/conf/nginx.conf
nginxPid=$nginxDir/nginx.pid

nginx_check()
{
    if [[ -e $nginxPid ]]; then
        ps aux |grep -v grep |grep -q nginx
        if (( $? == 0 )); then
            echo &quot;$prog already running...&quot;
            exit 1
        else
            rm -rf $nginxPid &amp;&gt; /dev/null
        fi
    fi
}

start()
{
    nginx_check
    if (( $? != 0 )); then
        true
    else
        echo -n $&quot;Starting $prog:&quot;
        daemon $nginxd -c $nginxConf
        RETVAL=$?
        echo
        [ $RETVAL = 0 ] &amp;&amp; touch /var/lock/subsys/nginx
        return $RETVAL
    fi
}

stop()
{
    echo -n $&quot;Stopping $prog:&quot;
    killproc $nginxd
    RETVAL=$?
    echo
    [ $RETVAL = 0 ] &amp;&amp; rm -f /var/lock/subsys/nginx $nginxPid
}

reload()
{
    echo -n $&quot;Reloading $prog:&quot;
    killproc $nginxd -HUP
    RETVAL=$?
    echo
}

case &quot;$1&quot; in
        start)
                start
                ;;
        stop)
                stop
                ;;
        restart)
                stop
                start
                ;;
        reload)
                reload
                ;;
        status)
                status $prog
                RETVAL=$?
                ;;
        *)
                echo $&quot;Usage: $0 {start|stop|restart|reload|status}&quot;
                RETVAL=1
esac
exit $RETVAL</pre>
<p>[root@HA1 ~]# chmod +x  /etc/init.d/nginxd<br />
[root@HA1 ~]# scp  /etc/init.d/nginxd HA2: /etc/init.d/nginxd</p>
<p>[root@HA1 ~]# service network restart<br />
[root@HA1 ~]# service heartbeat start</p>
<p>[root@HA2 ~]# service network restart<br />
[root@HA2 ~]# service heartbeat start</p>
<p>4. 配置集群资源：</p>
<p>Heartbeat和其他应用提供的ocf代理脚本或许会有错误，我们可以用下面方法排错：<br />
要检查 OCF 脚本,请首先设置所需的环境变量。例如,当测试IPaddr OCF 脚本时,您必须通过设置一个变量名称前缀为 OCF_RESKEY_的环境变量来设置变量 ip 的值。对于此示例,可运行以下命令:</p>
<pre class="brush: plain;">export OCF_RESKEY_ip=
/usr/lib/ocf/resource.d/heartbeat/IPaddr validate-all
/usr/lib/ocf/resource.d/heartbeat/IPaddr start
/usr/lib/ocf/resource.d/heartbeat/IPaddr stop</pre>
<p>如果此操作不成功,很可能是您缺少某个必需变量或者只是输错了参数。</p>
<p>排错ldirectord ocf代理脚本：<br />
export OCF_ROOT=/usr/lib/ocf<br />
根据自己的环境设置修改下面两行：<br />
[root@HA1 ~]# vi /usr/lib/ocf/resource.d/heartbeat/ldirectord</p>
<pre class="brush: plain;">LDIRCONF=${OCF_RESKEY_configfile:-/etc/ha.d/ldirectord.cf}
LDIRECTORD=${OCF_RESKEY_ldirectord:-/usr/sbin/ldirectord}</pre>
<p>[root@HA1 ~]# /usr/lib/ocf/resource.d/heartbeat/ldirectord monitor<br />
[root@HA1 ~]# echo $?<br />
7     # ldirectord未运行返回7，运行正常返回0</p>
<p>[root@HA1 ~]# crm<br />
crm(live)# configure<br />
crm(live)configure# node HA1<br />
crm(live)configure# node HA2<br />
crm(live)configure# primitive ldirectord ocf:heartbeat:ldirectord \<br />
&gt;	params configfile=&#8221;/etc/ha.d/ldirectord.cf&#8221; \<br />
&gt;	op monitor interval=&#8221;30s&#8221; timeout=&#8221;20s&#8221; \<br />
&gt;	meta migration-threshold=&#8221;10&#8243; target-role=&#8221;Started&#8221;<br />
crm(live)configure# primitive vip ocf:heartbeat:IPaddr2 \<br />
&gt;	params lvs_support=&#8221;true&#8221; ip=&#8221;192.168.0.120&#8243; cidr_netmask=&#8221;24&#8243; broadcast=&#8221;192.168.0.255&#8243; \<br />
&gt;	op monitor interval=&#8221;1m&#8221; timeout=&#8221;20s&#8221; \<br />
&gt;	meta migration-threshold=&#8221;10&#8243;<br />
crm(live)configure# primitive nginxd lsb:nginxd \<br />
&gt;	op monitor interval=&#8221;30s&#8221; timeout=&#8221;20s&#8221; \<br />
&gt;	meta migration-threshold=&#8221;10&#8243; target-role=&#8221;Started&#8221;<br />
crm(live)configure# group load-balancing vip ldirectord<br />
crm(live)configure# clone cl-nginxd nginxd<br />
crm(live)configure# location perfer-ha1 load-balancing \<br />
&gt;	rule $id=&#8221;prefer-ha1-rule&#8221; 100: #uname eq HA1<br />
crm(live)configure# property stonith-enabled=&#8221;false&#8221; \<br />
&gt;	no-quorum-policy=&#8221;ignore&#8221; \<br />
&gt;	start-failure-is-fatal=&#8221;false&#8221; \<br />
&gt; <span style="font-family: Courier New;">expected-quorum-votes=&#8221;2&#8243;</span><br />
crm(live)configure# verify<br />
crm(live)configure# commit<br />
crm(live)configure# end<br />
crm(live)# status</p>
<p>============<br />
Last updated: Thu Nov 12 01:00:13 2009<br />
Stack: Heartbeat<br />
Current DC: HA2 &#8211; partition with quorum<br />
Version: 1.0.6-f709c638237cdff7556cb6ab615f32826c0f8c06<br />
2 Nodes configured, 2 expected votes<br />
2 Resources configured.<br />
============</p>
<p>Online: [ HA2 HA1 ]</p>
<p>Clone Set: cl-nginxd<br />
Started: [ HA2 HA1 ]<br />
Resource Group: load-balancing<br />
vip    (ocf::heartbeat:IPaddr2):    Started HA1<br />
ldirectord    (ocf::heartbeat:ldirectord):    Started HA1</p>
<p>crm(live)# quit<br />
bye</p>
<p>5. 验证<br />
[root@HA1 ~]# ipvsadm -l<br />
IP Virtual Server version 1.2.1 (size=4096)<br />
Prot LocalAddress:Port Scheduler Flags<br />
-&gt; RemoteAddress:Port           Forward Weight ActiveConn InActConn<br />
TCP  192.168.0.120:http wlc<br />
-&gt; 192.168.0.69:http            Route   1      0          0<br />
-&gt; 192.168.0.66:http            Local   1      0          0</p>
<p>用浏览器访问网站看是否正常。</p>
<div id="i3ot" style="text-align: left;"><img style="width: 463px; height: 323px;" src="http://docs.google.com/File?id=dmswbz7_280gkhw2xgp_b" alt="" /></div>
<p>禁用HA1的eth1网卡，在HA2上看故障转移情况。<br />
[root@HA2 ~]# crm<br />
crm(live)# status</p>
<p>============<br />
Last updated: Thu Nov 12 18:40:54 2009<br />
Stack: Heartbeat<br />
Current DC: HA2 &#8211; partition WITHOUT quorum<br />
Version: 1.0.6-f709c638237cdff7556cb6ab615f32826c0f8c06<br />
2 Nodes configured, 2 expected votes<br />
2 Resources configured.<br />
============</p>
<p>Online: [ HA2 ]<br />
OFFLINE: [ HA1 ]</p>
<p>Clone Set: cl-nginxd<br />
Started: [ HA2 ]<br />
Stopped: [ nginxd:0 ]<br />
Resource Group: load-balancing<br />
vip    (ocf::heartbeat:IPaddr2):    Started HA2<br />
ldirectord    (ocf::heartbeat:ldirectord):    Started HA2</p>
<p>启用HA1的eth1网卡，在HA1上看故障转移情况。</p>
<p>[root@HA1 ~]# crm status</p>
<p>============<br />
Last updated: Thu Nov 12 18:42:55 2009<br />
Stack: Heartbeat<br />
Current DC: HA1 &#8211; partition with quorum<br />
Version: 1.0.6-f709c638237cdff7556cb6ab615f32826c0f8c06<br />
2 Nodes configured, 2 expected votes<br />
2 Resources configured.<br />
============</p>
<p>Online: [ HA2 HA1 ]</p>
<p>Clone Set: cl-nginxd<br />
Started: [ HA1 HA2 ]<br />
Resource Group: load-balancing<br />
vip    (ocf::heartbeat:IPaddr2):    Started HA1<br />
ldirectord    (ocf::heartbeat:ldirectord):    Started HA1</p>
<p>6. 参考：</p>
<p><a class="CategoryTreeLabel  CategoryTreeLabelNs0 CategoryTreeLabelPage" href="http://www.clusterlabs.org/wiki/Load_Balanced_MySQL_Replicated_Cluster">Load Balanced MySQL Replicated Cluster</a><br />
<a class="CategoryTreeLabel  CategoryTreeLabelNs0 CategoryTreeLabelPage" href="http://www.clusterlabs.org/wiki/Debian_Lenny_HowTo">Debian Lenny HowTo</a></p>
<h3  class="related_post_title">相关日志</h3><ul class="related_post"><li>2009/12/11 -- <a href="http://www.yoyotown.com/?p=558" title="MySQL-Nginx-Pacemaker-corosync(openais)-drbd active/passive cluster">MySQL-Nginx-Pacemaker-corosync(openais)-drbd active/passive cluster</a></li><li>2009/12/09 -- <a href="http://www.yoyotown.com/?p=511" title="Heartbeat实现Nginx高可用性(style 2.x)">Heartbeat实现Nginx高可用性(style 2.x)</a></li><li>2009/12/08 -- <a href="http://www.yoyotown.com/?p=507" title="Heartbeat实现Nginx高可用性(style 1.x)">Heartbeat实现Nginx高可用性(style 1.x)</a></li><li>2009/12/10 -- <a href="http://www.yoyotown.com/?p=546" title="用CRM命令行工具配置集群资源">用CRM命令行工具配置集群资源</a></li><li>2009/12/08 -- <a href="http://www.yoyotown.com/?p=504" title="HA体系架构及内部处理流程">HA体系架构及内部处理流程</a></li></ul>]]></content:encoded>
			<wfw:commentRss>http://www.yoyotown.com/?feed=rss2&amp;p=552</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>用CRM命令行工具配置集群资源</title>
		<link>http://www.yoyotown.com/?p=546</link>
		<comments>http://www.yoyotown.com/?p=546#comments</comments>
		<pubDate>Thu, 10 Dec 2009 05:47:05 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[高可用性]]></category>
		<category><![CDATA[CRM]]></category>
		<category><![CDATA[ha]]></category>
		<category><![CDATA[heartbeat]]></category>
		<category><![CDATA[Resource]]></category>

		<guid isPermaLink="false">http://www.yoyotown.com/?p=546</guid>
		<description><![CDATA[1. 创建群集资源
可以创建以下类型的资源：
原始资源:原始资源是最基本的资源类型。
资源组:资源组包含一系列需要放置在一起、按顺序启动和以反序停止的资源。
克隆资源:克隆资源是可以在多个主机上处于活动状态的资源。如果各个资源代理支持，则任何资源均可克隆。
主资源:主资源是一种特殊的克隆资源，主资源可以具有多种模式。主资源必须只能包含一个组或一个常规资源。
资源选项:
您可以为添加的每个资源定义选项。群集使用这些选项来决定资源的行为方式，它们会告知 CRM 如何对待特定的资源。可使用 crm_resource &#8211;meta 命令或 GUI 来设置资源选项。
原始资源选项:
priority	如果不允许所有的资源都处于活动状态，群集会停止优先级较低的资源以便保持较高优先级资源处于活动状态。
target-role	群集应试图将此资源保持在何种状态，允许的值：Stopped 和 Started。
is-managed	是否允许群集启动和停止资源，允许的值：true和 false。
resource-stickiness	资源留在所处位置的自愿程度如何，默认为default- resource-stickiness 的值。
migration-threshold	节点上的此资源应发生多少故障后才能确定该节点没有资格主管此资源,默认值：none。
multiple-active	如果发现资源在多个节点上活动，群集该如何操作，允许的值：block（将资源标记为未受管）、stop_only 和 stop_start。
failure-timeout	在恢复为如同未发生故障一样正常工作（并允许资源返回它发生故障的节点）之前，需要等待几秒钟,默认值：never。
资源操作:
默认情况下，群集将不会确保您的资源一直正常。要指示群集如此操作，需要向资源的定义中添加一个监视操作。可为所有类或资源代理添加监视操作。
ID			：您的操作名称。必须是唯一的。
name		：要执行的操作。常见值：monitor、start 和 stop。
interval	：执行操作的频率。单位：秒。
timeout	：	需要等待多久才能声明操作失败。
requires	：需要满足什么条件才能发生此操作。允许的值：nothing、quorum 和 fencing。默认值取决于是否启用屏障和资源的类是否为 stonith。对于 STONITH 资源，默认值为 nothing。
on-fail		：此操作失败时执行的操作。允许的值：
ignore：假装资源没有失败。
block：不对资源执行任何进一步操作。
stop：停止资源并且不在其他位置启动该资源。
restart：停止资源并（可能在不同的节点上）重启动。
fence：关闭资源失败的节点 (STONITH)。
standby：将所有资源从资源失败的节点上移走。
enabled		如果值为 false，将操作视为不存在。允许的值：true、false。
原始资源包含的参数：
元属性：元属性是可以为资源添加的选项。它们告诉 CRM 如何处理特定资源。
实例属性：实例属性是特定资源类的参数,用于确定资源类的行为方式及其控制的服务实例。
操作：可以为资源添加监视操作。监视操作指示群集确保资源状况依然正常。所有资源代理类都可以添加监视操作。您还可以设置特定参数,如为 start 或stop 操作设置 timeout值。
定义原始资源：primitive   唯一ID   资源代理类型：资源代理的提供程序：资源代理名称  实例属性   操作  元属性
例如：
primitive Virtual-IP-Tomcat ocf:heartbeat:IPaddr2
params lvs_support=&#34;true&#34; ip=&#34;192.168.1.100&#34; cidr_netmask=&#34;24&#34; broadcast=&#34;192.168.1.255&#34; \
        op monitor interval=&#34;1m&#34; timeout=&#34;10s&#34; [...]]]></description>
			<content:encoded><![CDATA[<p>1. 创建群集资源</p>
<p>可以创建以下类型的资源：<br />
原始资源:原始资源是最基本的资源类型。<br />
资源组:资源组包含一系列需要放置在一起、按顺序启动和以反序停止的资源。<br />
克隆资源:克隆资源是可以在多个主机上处于活动状态的资源。如果各个资源代理支持，则任何资源均可克隆。<br />
主资源:主资源是一种特殊的克隆资源，主资源可以具有多种模式。主资源必须只能包含一个组或一个常规资源。</p>
<p>资源选项:<br />
您可以为添加的每个资源定义选项。群集使用这些选项来决定资源的行为方式，它们会告知 CRM 如何对待特定的资源。可使用 crm_resource &#8211;meta 命令或 GUI 来设置资源选项。</p>
<p>原始资源选项:<br />
priority	如果不允许所有的资源都处于活动状态，群集会停止优先级较低的资源以便保持较高优先级资源处于活动状态。<br />
target-role	群集应试图将此资源保持在何种状态，允许的值：Stopped 和 Started。<br />
is-managed	是否允许群集启动和停止资源，允许的值：true和 false。<br />
resource-stickiness	资源留在所处位置的自愿程度如何，默认为default- resource-stickiness 的值。<br />
migration-threshold	节点上的此资源应发生多少故障后才能确定该节点没有资格主管此资源,默认值：none。<br />
multiple-active	如果发现资源在多个节点上活动，群集该如何操作，允许的值：block（将资源标记为未受管）、stop_only 和 stop_start。<br />
failure-timeout	在恢复为如同未发生故障一样正常工作（并允许资源返回它发生故障的节点）之前，需要等待几秒钟,默认值：never。</p>
<p>资源操作:<br />
默认情况下，群集将不会确保您的资源一直正常。要指示群集如此操作，需要向资源的定义中添加一个监视操作。可为所有类或资源代理添加监视操作。<br />
ID			：您的操作名称。必须是唯一的。<br />
name		：要执行的操作。常见值：monitor、start 和 stop。<br />
interval	：执行操作的频率。单位：秒。<br />
timeout	：	需要等待多久才能声明操作失败。<br />
requires	：需要满足什么条件才能发生此操作。允许的值：nothing、quorum 和 fencing。默认值取决于是否启用屏障和资源的类是否为 stonith。对于 STONITH 资源，默认值为 nothing。<br />
on-fail		：此操作失败时执行的操作。允许的值：<br />
ignore：假装资源没有失败。<br />
block：不对资源执行任何进一步操作。<br />
stop：停止资源并且不在其他位置启动该资源。<br />
restart：停止资源并（可能在不同的节点上）重启动。<br />
fence：关闭资源失败的节点 (STONITH)。<br />
standby：将所有资源从资源失败的节点上移走。<br />
enabled		如果值为 false，将操作视为不存在。允许的值：true、false。</p>
<p>原始资源包含的参数：<br />
元属性：元属性是可以为资源添加的选项。它们告诉 CRM 如何处理特定资源。<br />
实例属性：实例属性是特定资源类的参数,用于确定资源类的行为方式及其控制的服务实例。<br />
操作：可以为资源添加监视操作。监视操作指示群集确保资源状况依然正常。所有资源代理类都可以添加监视操作。您还可以设置特定参数,如为 start 或stop 操作设置 timeout值。</p>
<p>定义原始资源：primitive   唯一ID   资源代理类型：资源代理的提供程序：资源代理名称  实例属性   操作  元属性<br />
例如：</p>
<pre class="brush: plain;">primitive Virtual-IP-Tomcat ocf:heartbeat:IPaddr2
params lvs_support=&quot;true&quot; ip=&quot;192.168.1.100&quot; cidr_netmask=&quot;24&quot; broadcast=&quot;192.168.1.255&quot; \
        op monitor interval=&quot;1m&quot; timeout=&quot;10s&quot; \
        meta migration-threshold=&quot;10&quot;
primitive ldirectord ocf:heartbeat:ldirectord \
        params configfile=&quot;/etc/ha.d/ldirectord.cf&quot; \
        op monitor interval=&quot;2m&quot; timeout=&quot;20s&quot; \
        meta migration-threshold=&quot;10&quot; target-role=&quot;Started&quot;
primitive tomcat lsb:tomcat \
        op monitor interval=&quot;30s&quot; timeout=&quot;10s&quot; \
        meta migration-threshold=&quot;10&quot; target-role=&quot;Started&quot;
primitive mysql ocf:heartbeat:mysql \
        params binary=&quot;/usr/bin/mysqld_safe&quot; config=&quot;/etc/my.cnf&quot; datadir=&quot;/var/lib/mysql&quot; user=&quot;mysql&quot; pid=&quot;/var/lib/mysql/mysql.pid&quot; socket=&quot;/var/lib/mysql/mysql.sock&quot; test_passwd=&quot;password&quot; test_table=&quot;ldirectord.connectioncheck&quot; test_user=&quot;slave_user&quot; \
        op monitor interval=&quot;20s&quot; timeout=&quot;10s&quot; \
        meta migration-threshold=&quot;10&quot; target-role=&quot;Started&quot;</pre>
<p>migration-threshold用来定义资源的故障次数，假设已经为资源配制了一个首选在节点上运行的位置约束。如果那里失败了,系统会检查 migration-threshold 并与故障计数进行比较。如果故障计数 &gt;= migration-threshold,会将资源迁移到下一个自选节点。<br />
默认情况下,一旦达到阈值,就只有在管理员手动重置资源的故障计数后(在修复故障原因后),才允许在该节点上运行有故障的资源。<br />
但是,可以通过设置资源的 failure-timeout 选项使故障计数失效。如果设置migration-threshold=2 和 failure-timeout=60s ，将会导致资源在两次故障后迁移到新的节点,并且可能允许在一分钟后移回(取决于黏性和约束分数)。<br />
迁移阈值概念有两个例外,在资源启动失败或停止失败时出现:启动故障会使故障计数设置为 INFINITY,因此总是导致立即迁移。停止故障会导致屏障(stonith-enabled 设置为 true 时,这是默认设置)。如果不定义 STONITH资源(或 stonith-enabled 设置为 false),则该资源根本不会迁移。</p>
<p>重置资源的故障计数：对指定节点上的指定资源执行 crm_resource -C 和 crm_failcount -D 命令。</p>
<p>如果在创建时将资源的初始状态设置为 stopped(target-role 元属性的值为 stopped),则资源在创建后不会自动启动。要想启动资源使用命令：crm resource start 资源ID</p>
<p>配置资源监视（可以在定义资源时用op monitor命令定义）</p>
<p>虽然 High Availability Extension 可以检测节点故障，但也能够检测节点上的各个资源何时发生故障。如果希望确保资源运行，则必须为该资源配置资源监视。资源监视包括指定超时和/或启动延迟值以及间隔。间隔告诉 CRM 检查资源状态的频率。</p>
<pre class="brush: plain;">[root@HA1 ~]# crm
crm(live)# configure
crm(live)configure# monitor mysql monitor interval=&quot;20s&quot; timeout=&quot;10s&quot;</pre>
<p>2. 配置资源约束：<br />
配置好所有资源只是完成了该作业的一部分。即便群集熟悉所有必需资源,它可能还无法进行正确处理。资源约束允许您指定在哪些群集节点上运行资源、以何种顺序装载资源,以及特定资源依赖于哪些其他资源。</p>
<p>三种不同的约束:<br />
Resource Location(资源位置)： 位置约束定义资源可以、不可以或首选在哪些节点上运行。<br />
Resource Collocation(资源排列)： 排列约束告诉群集资源可以或不可以在某个节点上一起运行。<br />
Resource Order(资源顺序)：排序约束定义操作的顺序。</p>
<p>定义约束时，还需要指定分数。各种分数是群集工作方式的重要组成部分。其实，从迁移资源到决定在已降级群集中停止哪些资源的整个过程是通过以某种方式操纵<br />
分数来实现的。分数按每个资源来计算，资源分数为负的任何节点都无法运行该资源。在计算出资源分数后，群集选择分数最高的节点。INFINITY（无穷<br />
大）目前定义为 1,000,000。加减无穷大遵循以下 3 个基本规则：<br />
任何值 + 无穷大 = 无穷大<br />
任何值 &#8211; 无穷大 = -无穷大<br />
无穷大 &#8211; 无穷大 = -无穷大<br />
定义资源约束时，也可以指定每个约束的分数。分数表示您指派给此资源约束的值。分数较高的约束先应用，分数较低的约束后应用。通过使用不同的分数为既定资源创建更多位置约束，可以指定资源要故障转移至的目标节点的顺序。</p>
<p>指定资源故障转移节点<br />
资源在出现故障时会自动重启动。如果在当前节点上无法实现重启动，或如果在当前节点上发生 N 次故障，则资源会试图故障转移到其他节点。您可以多次定义资源的故障次数（migration-threshold），在该值之后资源会迁移到新节点。</p>
<p>指定资源故障回复节点（资源黏性）<br />
当原始节点恢复联机并位于群集中时，资源可能会故障回复到该节点。如果希望阻止资源故障回复到故障转移前运行的节点上，或如果希望指定其他的节点让资源进行故障回复，则必须更改资源黏性值。在创建资源时或在创建资源后，都可以指定指定资源黏性。</p>
<p>在指定资源黏性值时，请考虑以下情况：<br />
值为 0：这是默认选项。资源放置在系统中的最适合位置。这意味着当负载能力“较好”或较差的节点变得可用时才转移资源。此选项的作用几乎等同于自动故障回复，只是资源可能会转移到非之前活动的节点上。<br />
值大于 0：资源更愿意留在当前位置，但是如果有更合适的节点可用时会移动。值越高表示资源越愿意留在当前位置。<br />
值小于 0：资源更愿意移离当前位置。绝对值越高表示资源越愿意离开当前位置。<br />
值为 INFINITY：如果不是因节点不适合运行资源（节点关机、节点待机、达到migration-threshold 或配置更改）而强制资源转移，资源总是留在当前位置。此选项的作用几乎等同于完全禁用自动故障回复。<br />
值为 -INFINITY：资源总是移离当前位置。</p>
<p>定义位置约束：location  唯一ID  资源ID  规则</p>
<pre class="brush: plain;">location Prefer-Node1 ldirectord
rule $id=&quot;prefer-node1-rule&quot; 100: #uname eq NODE1</pre>
<p>资源排列约束：<br />
colocation 命令用于定义哪些资源应在相同主机上运行,哪些资源应在不同主机上运行。通常情况下使用以下顺序:</p>
<pre class="brush: plain;">crm(live)configure# order rsc1 rsc2
crm(live)configure# colocation rsc2 rsc1</pre>
<p>只能设置 +INFINITY 或 -INFINITY 的分数来定义必须始终或决不能在同一节点上运行的资源。例如,要始终在同一个主机上运行 ID 为filesystem_resource 和 nfs_group 的两个资源,可使用以下约束:</p>
<pre class="brush: plain;">crm(live)configure# colocation nfs_on_filesystem inf: nfs_group filesystem_resource</pre>
<p>对于主从属配置,除在本地运行资源以外,还有必要了解当前节点是否为主节点。这可以通过附加 to_role 或 from_role 属性来检查。</p>
<p>排序约束：<br />
有时提供启动资源的顺序是必要的。例如,在设备可用于系统之前,您不能装入文件系统。使用排序约束可在另一个资源满足某个特殊条件之前或之后启动或停止某项服务,如已启动、已停止或已升级到主资源。可使用 crm 中的以下命令来配置排序约束:</p>
<pre class="brush: plain;">crm(live)configure# order nfs_after_filesystem mandatory: filesystem_resource nfs_group</pre>
<p>3. 配置群集资源组：<br />
某些群集资源与其他组件或资源相关,要求每个组件或资源以特定的顺序启动并在相同的服务器上运行。为了简化配置,引入资源组的概念。<br />
资源组具有以下属性:<br />
启动和停止资源：资源以显示顺序启动,以相反顺序停止。<br />
相关性：如果组中某个资源在某处无法运行,则该组中位于其之后的任何资源都不允许运行。<br />
组内容：组可能仅包含一些原始群集资源。要引用组资源的子代,请使用子代的 ID代替组的 ID。<br />
限制：尽管在约束中可以引用组的子代,但通常倾向于使用组的名称。<br />
黏性：黏性在组中可以累加。每个活动的组成员可以将其黏性值累加到组的总分中。因此,如果默认的 resource-stickiness 值为 100,而组中有七个成员,其中五个成员是活动的,则组总分为 500,更喜欢其当前位置。</p>
<p>定义资源组：group  唯一ID  资源列表<br />
例如：</p>
<pre class="brush: plain;">group Load-Balancing Virtual-IP-Tomcat ldirectord</pre>
<p>4. 配置克隆资源：<br />
可能希望某些资源在群集的多个节点上同时运行。为此,必须将资源配置为克隆资源。可以配置为克隆资源的资源示例包括 STONITH 和群集文件系统(如OCFS2)。如果受资源的资源代理支持,则可以克隆任何资源。克隆资源的配置甚至也有不同,具体取决于资源驻留的节点。<br />
资源克隆有三种类型:<br />
匿名克隆：这是最简单的克隆类型。这种克隆类型在所有位置上的运行方式都相同。因此,每台计算机上只能有一个匿名克隆实例是活动的。<br />
全局唯一克隆：这些资源各不相同。一个节点上运行的克隆实例与另一个节点上运行的实例不同,同一个节点上运行的任何两个实例也不同。<br />
状态克隆：这些资源的活动实例分为两种状态:主动和被动。有时也称为主要和辅助,或主和从。状态克隆可以是匿名克隆也可以是全局唯一克隆。</p>
<p>定义克隆资源：clone  唯一ID  资源ID<br />
例如：</p>
<pre class="brush: plain;">clone cl-tomcat tomcat
clone cl-mysql mysql</pre>
<p>状态克隆：</p>
<pre class="brush: plain;">primitive drbd_mysql ocf:linbit:drbd \
        params drbd_resource=&quot;mysql&quot; \
        op monitor interval=&quot;15s&quot;
ms ms_drbd_mysql drbd_mysql \
        meta master-max=&quot;1&quot; master-node-max=&quot;1&quot; \
        clone-max=&quot;2&quot; clone-node-max=&quot;1&quot; \
        notify=&quot;true&quot;</pre>
<p>5. 设置CRM其他属性<br />
如果是两个节点的集群，应该设置no-quorum-policy为ignore，如果一个节点down掉，另一个节点仍能正常运行。设置start-failure-is-fatal 为false 允许你为每一个资源设置migration-threshold属性。如果没有定义stonith资源则必须设置stonith-enabled为false。</p>
<pre class="brush: plain;">property no-quorum-policy=&quot;ignore&quot; \
        start-failure-is-fatal=&quot;false&quot; \
        stonith-enabled=&quot;false&quot;</pre>
<p>6. 迁移群集资源:</p>
<pre class="brush: plain;">crm(live)# resource
crm(live)resource# migrate VIP node2</pre>
<p>7. 启动/停止资源:</p>
<pre class="brush: plain;">crm resource start resource-ID
crm resource stop resource-ID</pre>
<p>8. 在特定节点上执行：<br />
使节点变成备份节点</p>
<pre class="brush: plain;">crm node standby</pre>
<p>使节点变成活动节点</p>
<pre class="brush: plain;">crm node online</pre>
<h3  class="related_post_title">相关日志</h3><ul class="related_post"><li>2009/12/10 -- <a href="http://www.yoyotown.com/?p=552" title="Heartbeat/corosync+pacemaker+ldirectord 实现Nginx负载均衡">Heartbeat/corosync+pacemaker+ldirectord 实现Nginx负载均衡</a></li><li>2009/12/09 -- <a href="http://www.yoyotown.com/?p=511" title="Heartbeat实现Nginx高可用性(style 2.x)">Heartbeat实现Nginx高可用性(style 2.x)</a></li><li>2009/12/08 -- <a href="http://www.yoyotown.com/?p=507" title="Heartbeat实现Nginx高可用性(style 1.x)">Heartbeat实现Nginx高可用性(style 1.x)</a></li><li>2009/12/08 -- <a href="http://www.yoyotown.com/?p=504" title="HA体系架构及内部处理流程">HA体系架构及内部处理流程</a></li><li>2009/12/11 -- <a href="http://www.yoyotown.com/?p=558" title="MySQL-Nginx-Pacemaker-corosync(openais)-drbd active/passive cluster">MySQL-Nginx-Pacemaker-corosync(openais)-drbd active/passive cluster</a></li></ul>]]></content:encoded>
			<wfw:commentRss>http://www.yoyotown.com/?feed=rss2&amp;p=546</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Heartbeat实现Nginx高可用性(style 2.x)</title>
		<link>http://www.yoyotown.com/?p=511</link>
		<comments>http://www.yoyotown.com/?p=511#comments</comments>
		<pubDate>Wed, 09 Dec 2009 02:36:26 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[高可用性]]></category>
		<category><![CDATA[ha]]></category>
		<category><![CDATA[heartbeat]]></category>
		<category><![CDATA[Nginx]]></category>

		<guid isPermaLink="false">http://www.yoyotown.com/?p=511</guid>
		<description><![CDATA[1.x并不能监控资源的状态，要想监控资源的状态，可以自己写监控脚本或者使用Mon脚本来监控服务，每当监控到资源（Nginx）Down掉后使用service heartbeat stop将heartbeatDown掉，这样便会发生故障转移。或者使用heartbeat的style
2.x版本，配置CRM（Cluster Resource Managemenet）来管理资源。
一、使用1.x配置Heartbeat （参见《Heartbeat实现Nginx高可用性(style 1.x)》）
二、修改1.x的配置为2.x
1. 在ha.cf中添加下面行
# 开启集群资源管理器，使用heartbeat 2.x模式
crm on
# respwn列出将要执行和监控的命令
# respwn使得Heartbeat以userid（在本例中为hacluster）的身份来执行该进程并监视该进程的执行情况
# 如果其死亡便重启之。
# ipfail插件的用途是检测网络故障，并作出合理的反应，如果需要的话使集群资源故障转移。
# respawn
respawn hacluster /usr/lib/heartbeat/ipfail
apiauth ipfail gid=haclient uid=hacluster
respawn hacluster /usr/lib/heartbeat/cibmon -d
apiauth cibmon   uid=hacluste
2.将haresources资源文件转换成cib.xml文件
执行下面命令：
mv /etc/ha.d/haresources /etc/ha.d/haresources.bak
/usr/lib/heartbeat/haresources2cib.py /etc/ha.d/haresources.bak
会在/var/lib/heartbeat/crm下生成cib.xml
运行heartbeat后会在/var/lib/heartbeat/crm目录下生成cib.xml.last、cib.xml.sig、cib.xml.sig.last文件，此时再修改cib.xml需要先删除上面三个文件，rm -rf /var/lib/heartbeat/crm/cib.xml.*
CRM支持两种资源类型ocf和lsb：
LSB格式的脚本必须支持status功能，必须能接收start,stop,status三个参数；
OCF格式的脚本则必须支持start,stop,monitor三个参数。
其中status和monitor参数是用来监控资源的，非常重要。
如果是LSB风格的脚本，运行./nginxd status时候，返回值包含OK或则running则表示资源正常 ，返回值包含No或者stopped则表示资源不正常。
如果是OCF风格的脚本，运行./nginxd monitor时， 返回0表示资源是正常的，返回7表示资源出现问题。
ocf格式的启动脚本在/usr/lib/ocf/resource.d/heartbeat下面。
lsb的脚步一般在/etc/init.d/下面。
如：IPaddr使用的是ocf格式的控制脚本，路径为：/usr/lib/ocf/resource.d/heartbeat/IPaddr
修改style 1.x下的nginxd脚本使其支持monitor参数从而支持ocf格式：
[root@HA1 ~]# cat /usr/lib/ocf/resource.d/heartbeat/nginxd

#!/bin/sh

# source function library
. /etc/rc.d/init.d/functions

# Source networking configuration.
. /etc/sysconfig/network

# Check that networking is up.
[ ${NETWORKING} = &#34;no&#34; [...]]]></description>
			<content:encoded><![CDATA[<p>1.x并不能监控资源的状态，要想监控资源的状态，可以自己写监控脚本或者使用Mon脚本来监控服务，每当监控到资源（Nginx）Down掉后使用service heartbeat stop将heartbeatDown掉，这样便会发生故障转移。或者使用heartbeat的style<br />
2.x版本，配置CRM（Cluster Resource Managemenet）来管理资源。</p>
<p>一、使用1.x配置Heartbeat （参见<a id="p:yi" title="《Heartbeat实现Nginx高可用性(style 1.x)》" href="http://www.yoyotown.com/?p=507">《Heartbeat实现Nginx高可用性(style 1.x)》</a>）</p>
<p>二、修改1.x的配置为2.x</p>
<p>1. 在ha.cf中添加下面行<br />
# 开启集群资源管理器，使用heartbeat 2.x模式<br />
crm on<br />
# respwn列出将要执行和监控的命令<br />
# respwn使得Heartbeat以userid（在本例中为hacluster）的身份来执行该进程并监视该进程的执行情况<br />
# 如果其死亡便重启之。<br />
# ipfail插件的用途是检测网络故障，并作出合理的反应，如果需要的话使集群资源故障转移。<br />
# respawn<br />
respawn hacluster /usr/lib/heartbeat/ipfail<br />
apiauth ipfail gid=haclient uid=hacluster<br />
respawn hacluster /usr/lib/heartbeat/cibmon -d<br />
apiauth cibmon   uid=hacluste</p>
<p>2.<span style="font-family: SimSun;">将haresources资源文件转换成cib.xml文件<br />
执行下面命令：<br />
mv </span>/etc/ha.d/haresources /etc/ha.d/haresources.bak<br />
/usr/lib/heartbeat/haresources2cib.py /etc/ha.d/haresources.bak<br />
会在/var/lib/heartbeat/crm下生成cib.xml</p>
<p>运行heartbeat后会在/var/lib/heartbeat/crm目录下生成cib.xml.last、cib.xml.sig、cib.xml.sig.last文件，此时再修改cib.xml需要先删除上面三个文件，rm -rf /var/lib/heartbeat/crm/cib.xml.*</p>
<p>CRM支持两种资源类型ocf和lsb：<br />
LSB格式的脚本必须支持status功能，必须能接收start,stop,status三个参数；<br />
OCF格式的脚本则必须支持start,stop,monitor三个参数。<br />
其中status和monitor参数是用来监控资源的，非常重要。<br />
如果是LSB风格的脚本，运行./nginxd status时候，返回值包含OK或则running则表示资源正常 ，返回值包含No或者stopped则表示资源不正常。<br />
如果是OCF风格的脚本，运行./nginxd monitor时， 返回0表示资源是正常的，返回7表示资源出现问题。</p>
<p>ocf格式的启动脚本在/usr/lib/ocf/resource.d/heartbeat下面。<br />
lsb的脚步一般在/etc/init.d/下面。<br />
如：IPaddr使用的是ocf格式的控制脚本，路径为：/usr/lib/ocf/resource.d/heartbeat/IPaddr</p>
<p>修改style 1.x下的nginxd脚本使其支持monitor参数从而支持ocf格式：<br />
[root@HA1 ~]# cat /usr/lib/ocf/resource.d/heartbeat/nginxd</p>
<p><span style="font-family: Courier New;">
<pre class="brush: bash; highlight: [15,16,17,18,65,66,67,68,69,70,71,72,73];">#!/bin/sh

# source function library
. /etc/rc.d/init.d/functions

# Source networking configuration.
. /etc/sysconfig/network

# Check that networking is up.
[ ${NETWORKING} = &quot;no&quot; ] &amp;&amp; exit 0

RETVAL=0
prog=&quot;nginx&quot;

nginxDir=/usr/local/nginx
nginxd=$nginxDir/sbin/nginx
nginxConf=$nginxDir/conf/nginx.conf
nginxPid=$nginxDir/nginx.pid

nginx_check()
{
    if [[ -e $nginxPid ]]; then
        ps aux |grep -v grep |grep -q nginx
        if (( $? == 0 )); then
            echo &quot;$prog already running...&quot;
            exit 1
        else
            rm -rf $nginxPid &amp;&gt; /dev/null
        fi
    fi
}

start()
{
    nginx_check
    if (( $? != 0 )); then
        true
    else
        echo -n $&quot;Starting $prog:&quot;
        daemon $nginxd -c $nginxConf
        RETVAL=$?
        echo
        [ $RETVAL = 0 ] &amp;&amp; touch /var/lock/subsys/nginx
        return $RETVAL
    fi
}

stop()
{
    echo -n $&quot;Stopping $prog:&quot;
    killproc $nginxd
    RETVAL=$?
    echo
    [ $RETVAL = 0 ] &amp;&amp; rm -f /var/lock/subsys/nginx $nginxPid
}

reload()
{
    echo -n $&quot;Reloading $prog:&quot;
    killproc $nginxd -HUP
    RETVAL=$?
    echo
}

monitor()
{
    status $prog &amp;&gt; /dev/null
    if (( $? == 0  )); then
        RETVAL=0
    else
        RETVAL=7
    fi
}

case &quot;$1&quot; in
        start)
                start
                ;;
        stop)
                stop
                ;;
        restart)
                stop
                start
                ;;
        reload)
                reload
                ;;
        status)
                status $prog
                RETVAL=$?
                ;;
        monitor)
                monitor
                ;;
        *)
                echo $&quot;Usage: $0 {start|stop|restart|reload|status|monitor}&quot;
                RETVAL=1
esac
exit $RETVAL</pre>
<p></span></p>
<p>查看cib.xml关于nginxd资源的配置情况： </p>
<pre class="brush: xml;">&lt;primitive class=&quot;ocf&quot; id=&quot;nginxd_2&quot; provider=&quot;heartbeat&quot; type=&quot;nginxd&quot;&gt;
    &lt;operations&gt;
        &lt;op id=&quot;nginxd_2_mon&quot; interval=&quot;20s&quot; name=&quot;monitor&quot; timeout=&quot;10s&quot;/&gt;
    &lt;/operations&gt;
&lt;/primitive&gt;</pre>
<p>修改下面的值：<br />
interval=&#8221;20s&#8221;<br />
timeout=&#8221;10s&#8221;<br />
即每20秒检测资源运行情况，如果发现资源不在，则尝试启动资源，如果10s后还未启动成功，则资源切换到另一节点，上述的数值可以缩减的更小，如果使用默认的2分钟会给人一种服务down掉没有重启或者切换的感觉。</p>
<p>3. 创建用户和用户组</p>
<p style="margin: 0in;"><span style="font-size: small;"><span style="font-family: Calibri;">heartbeat</span><span style="font-family: SimSun;">需要</span><span style="font-family: Calibri;">haclient</span><span style="font-family: SimSun;">用户组和</span><span style="font-family: Calibri;">hacluster</span><span style="font-family: SimSun;">用户，如果编译时没有创建用户及组需要执行本步操作。两个节点做同样的操作，并保证</span><span style="font-family: Calibri;">haclient</span><span style="font-family: SimSun;">和</span><span style="font-family: Calibri;">hacluster</span><span style="font-family: SimSun;">的</span><span style="font-family: Calibri;">ID</span><span style="font-family: SimSun;">一样。</span></span></p>
<p style="margin: 0in;">groupadd -g 500 haclient</p>
<p style="margin: 0in;">useradd -u 500 -g haclient hacluster</p>
<p>修改heartbeat目录权限：<br />
find / -type d -name &#8220;heartbeat&#8221; -exec chown -R hacluster {} ;<br />
find / -type d -name &#8220;heartbeat&#8221; -exec chgrp -R haclient {} ;</p>
<p>如果没有上述账户，启动heartbeat后将会出现下面的错误，系统会被重启：<br />
EMERG: Rebooting system.  Reason: /usr/lib/heartbeat/cib</p>
<p>如果nginxd在系统启动时是自启动的，需要关闭它：<br />
chkconfig &#8211;leve 2345 nginxd off</p>
<p>在两个节点上启动heartbeat：<br />
service heartbeat start</p>
<p>在HA1上启动nginxd资源：<br />
crm_resource -r nginxd_2 -p target_role -v started</p>
<p>CRM监控情况：<br />
crm_mon -i1<br />
Refresh in 1s&#8230;</p>
<p>============<br />
Last updated: Sun Nov  8 03:20:15 2009<br />
Current DC: ha2 (cc3f9eb0-22be-4b1a-b0c7-706ea75d932f)<br />
2 Nodes configured.<br />
1 Resources configured.<br />
============</p>
<p>Node: ha2 (cc3f9eb0-22be-4b1a-b0c7-706ea75d932f): online<br />
Node: ha1 (ad69968f-2db6-40a0-b71b-7433a689aab9): online</p>
<p>Resource Group: group_1<br />
IPaddr_192_168_2_100        (ocf::heartbeat:IPaddr):        Started ha1<br />
nginxd_2    (ocf::heartbeat:nginxd):        Started ha1</p>
<p>三、CRM管理</p>
<p>启动/停止资源<br />
#crm_resource -r nginxd_2 -p target_role -v started<br />
#crm_resource -r nginxd_2 -p target_role -v stopped<br />
查看资源跑在那个节点上<br />
crm_resource -W -r nginxd_2<br />
将资源从当前节点转移到另个一节点<br />
#crm_resource -M -r nginxd_2<br />
将资源转移到指定节点<br />
#crm_resource -M -r nginxd_2 -H HA1<br />
允许资源回到正常的节点<br />
#crm_resource -U -r nginxd_2<br />
将资源从CRM中删除<br />
#crm_resource -D -r nginxd_2 -t primitive<br />
将资源从CRM中禁用<br />
#crm_resource -p is_managed -r nginxd_2 -t primitive -v off<br />
将资源从新从CRM中启用<br />
#crm_resource -p is_managed -r nginxd_2 -t primitive -v on<br />
重启资源<br />
#crm_resource -C -H HA1 -r nginxd_2<br />
检查所有节点上未在CRM中的资源<br />
#crm_resource -P<br />
检查指定节点上未在CRM中的资源<br />
#crm_resource -P -H HA1<br />
检查所有节点上未在CRM中的资源<br />
#crm_resource -P<br />
检查指定节点上未在CRM中的资源<br />
#crm_resource -P -H HA1</p>
<p>四、测试</p>
<p>1. 手动停掉HA1上的nginx，heartbeat会尝试重启它。<br />
service nginxd stop</p>
<p>2. 在HA1上改名nginx配置文件，heartbeat尝试重启失败会自动进行故障转移。<br />
mv /usr/local/nginx/conf/nginx.conf /usr/local/nginx/conf/nginx.conf.bak<br />
service nginxd stop</p>
<p># 资源进行了自动故障转移<br />
<span style="color: #0000ff;">crm_mon -i1</span><br />
Refresh in 1s&#8230;</p>
<p>============<br />
Last updated: Sun Nov  8 03:37:59 2009<br />
Current DC: ha2 (cc3f9eb0-22be-4b1a-b0c7-706ea75d932f)<br />
2 Nodes configured.<br />
1 Resources configured.<br />
============</p>
<p>Node: ha2 (cc3f9eb0-22be-4b1a-b0c7-706ea75d932f): online<br />
Node: ha1 (ad69968f-2db6-40a0-b71b-7433a689aab9): online</p>
<p><span style="color: #ff0000;">Resource Group: group_1</span><br style="color: #ff0000;" /><span style="color: #ff0000;"> IPaddr_192_168_2_100        (ocf::heartbeat:IPaddr):        Started ha2</span><br style="color: #ff0000;" /><span style="color: #ff0000;"> nginxd_2    (ocf::heartbeat:nginxd):        Started ha2</span></p>
<p>Failed actions:<br />
nginxd_2_monitor_20000 (node=ha1, call=7, rc=7): complete<br />
nginxd_2_start_0 (node=ha1, call=9, rc=1): complete</p>
<p>在HA1上将资源转移到正常的节点：</p>
<p>mv /usr/local/nginx/conf/nginx.conf.bak /usr/local/nginx/conf/nginx.conf<br />
service heartbeat restart</p>
<p>3. 拔掉HA1的eth1网线，看资源是否自动故障转移</p>
<p>在HA2上查看资源情况：<br />
<span style="color: #0000ff;">crm_mon -i1</span><br />
Refresh in 1s&#8230;</p>
<p>============<br />
Last updated: Sun Nov  8 04:02:01 2009<br />
Current DC: ha2 (cc3f9eb0-22be-4b1a-b0c7-706ea75d932f)<br />
2 Nodes configured.<br />
1 Resources configured.<br />
============</p>
<p>Node: ha2 (cc3f9eb0-22be-4b1a-b0c7-706ea75d932f): online<br />
Node: ha1 (ad69968f-2db6-40a0-b71b-7433a689aab9): OFFLINE</p>
<p>Resource Group: group_1<br />
IPaddr_192_168_2_100        (ocf::heartbeat:IPaddr):        Started ha2<br />
nginxd_2    (ocf::heartbeat:nginxd):        Started ha2</p>
<p>资源从HA1自动故障转移到HA2。</p>
<p>插上HA1的eth1网线，资源自动转回到HA1。<br />
<span style="color: #0000ff;">crm_mon -i1</span><br />
efresh in 1s&#8230;</p>
<p>============<br />
Last updated: Sun Nov  8 04:05:16 2009<br />
Current DC: ha2 (cc3f9eb0-22be-4b1a-b0c7-706ea75d932f)<br />
2 Nodes configured.<br />
1 Resources configured.<br />
============</p>
<p>Node: ha2 (cc3f9eb0-22be-4b1a-b0c7-706ea75d932f): online<br />
Node: ha1 (ad69968f-2db6-40a0-b71b-7433a689aab9): online</p>
<p>Resource Group: group_1<br />
IPaddr_192_168_2_100        (ocf::heartbeat:IPaddr):        Started ha1<br />
nginxd_2    (ocf::heartbeat:nginxd):        Started ha1</p>
<p>排错：如果出现错误，查看heartbeat日志进行解决。</p>
<p>参考：<br />
1. <a id="vgnn" title="Writing your own OCF Resource Agent" href="http://www.linux-ha.org/OCFResourceAgent">Writing your own OCF Resource Agent</a><a id="zua7" title="Heartbeat Resource Agents" href="http://www.linux-ha.org/HeartbeatResourceAgent"> Heartbeat Resource Agents</a><br />
2.<a id="s03v" title="用Heartbeat配置Linux高可用性集群" href="http://linux.chinaitlab.com/linuxjq/744842.html"> 用Heartbeat配置Linux高可用性集群</a><br />
3. <a id="mwou" title="heartbeat2.x的测试终结篇" href="http://linux.chinaunix.net/bbs/archiver/?tid-1051263.html">heartbeat2.x的测试终结篇</a><br />
4. <a id="zmfh" title="crm_resource man page" href="http://linux.die.net/man/8/crm_resource">crm_resource man page</a><br />
5. <a id="sz_i" title="Getting Started With Heartbeat" href="http://www.linux-ha.org/GettingStartedWithHeartbeat">Getting Started With Heartbeat</a></p>
<h3  class="related_post_title">相关日志</h3><ul class="related_post"><li>2009/12/10 -- <a href="http://www.yoyotown.com/?p=552" title="Heartbeat/corosync+pacemaker+ldirectord 实现Nginx负载均衡">Heartbeat/corosync+pacemaker+ldirectord 实现Nginx负载均衡</a></li><li>2009/12/08 -- <a href="http://www.yoyotown.com/?p=507" title="Heartbeat实现Nginx高可用性(style 1.x)">Heartbeat实现Nginx高可用性(style 1.x)</a></li><li>2009/12/11 -- <a href="http://www.yoyotown.com/?p=558" title="MySQL-Nginx-Pacemaker-corosync(openais)-drbd active/passive cluster">MySQL-Nginx-Pacemaker-corosync(openais)-drbd active/passive cluster</a></li><li>2009/12/10 -- <a href="http://www.yoyotown.com/?p=546" title="用CRM命令行工具配置集群资源">用CRM命令行工具配置集群资源</a></li><li>2009/12/08 -- <a href="http://www.yoyotown.com/?p=504" title="HA体系架构及内部处理流程">HA体系架构及内部处理流程</a></li></ul>]]></content:encoded>
			<wfw:commentRss>http://www.yoyotown.com/?feed=rss2&amp;p=511</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Heartbeat实现Nginx高可用性(style 1.x)</title>
		<link>http://www.yoyotown.com/?p=507</link>
		<comments>http://www.yoyotown.com/?p=507#comments</comments>
		<pubDate>Tue, 08 Dec 2009 12:12:34 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[高可用性]]></category>
		<category><![CDATA[ha]]></category>
		<category><![CDATA[heartbeat]]></category>
		<category><![CDATA[Nginx]]></category>

		<guid isPermaLink="false">http://www.yoyotown.com/?p=507</guid>
		<description><![CDATA[一、准备工作
1. 系统：两台CentOS 5.4虚拟机
2. Hostname：HA1，HA2
3. IP地址：HA1   eth0：192.168.2.10   eth1：192.168.10.1
HA2   eth0：192.168.2.20   eth1：192.168.10.2
4. VIP：192.168.2.100   （Failover转移用的IP）
二、安装
1. Nginx编译安装
tar xzvf pcre-7.9.tar.gz
cd pcre-7.9
./configure
make
make install
cd ..
tar xzvf nginx-0.7.63.tar.gz
cd nginx-0.7.63
./configure &#8211;user=nobody &#8211;group=nobody &#8211;prefix=/usr/local/nginx &#8211;with-http_stub_status_module &#8211;with-http_ssl_module
make
make install
Nginx具体配置略。
2. Heartbeat编译安装
tar xzvf libnet-1.1.2.1.tar.gz
cd libnet
./configure
make
make install
cd ..
创建用户和用户组
heartbeat需要haclient用户组和hacluster用户两个节点做同样的操作，并保证haclient和hacluster的ID一样。
groupadd -g 500 haclient
useradd -u 500 -g haclient hacluster
tar jxvf STABLE-2.1.4.tar.bz2
cd Heartbeat-STABLE-2-1-STABLE-2.1.4/
./ConfigureMe configure
make
make install
# 拷贝配置文件到相应目录
cp doc/ha.cf /etc/ha.d/
cp doc/haresources /etc/ha.d/
cp doc/authkeys /etc/ha.d/
cd !$   # 跳转到/etc/ha.d/目录
三、配置Heartbeat
在/etc/ha.d/目录下进行配置：
1. [...]]]></description>
			<content:encoded><![CDATA[<p>一、准备工作</p>
<p>1. 系统：两台CentOS 5.4虚拟机<br />
2. Hostname：HA1，HA2<br />
3. IP地址：HA1   eth0：192.168.2.10   eth1：192.168.10.1<br />
HA2   eth0：192.168.2.20   eth1：192.168.10.2<br />
4. VIP：192.168.2.100   （Failover转移用的IP）</p>
<p>二、安装</p>
<p>1. Nginx编译安装<br />
tar xzvf pcre-7.9.tar.gz<br />
cd pcre-7.9<br />
./configure<br />
make<br />
make install<br />
cd ..</p>
<p>tar xzvf nginx-0.7.63.tar.gz<br />
cd nginx-0.7.63<br />
./configure &#8211;user=nobody &#8211;group=nobody &#8211;prefix=/usr/local/nginx &#8211;with-http_stub_status_module &#8211;with-http_ssl_module<br />
make<br />
make install</p>
<p>Nginx具体配置略。</p>
<p>2. Heartbeat编译安装</p>
<p>tar xzvf libnet-1.1.2.1.tar.gz<br />
cd libnet<br />
./configure<br />
make<br />
make install<br />
cd ..</p>
<p>创建用户和用户组</p>
<p style="margin: 0in;"><span style="font-size: small;"><span style="font-family: Calibri;">heartbeat</span><span style="font-family: SimSun;">需要</span><span style="font-family: Calibri;">haclient</span><span style="font-family: SimSun;">用户组和</span><span style="font-family: Calibri;">hacluster</span><span style="font-family: SimSun;">用户两个节点做同样的操作，并保证</span><span style="font-family: Calibri;">haclient</span><span style="font-family: SimSun;">和</span><span style="font-family: Calibri;">hacluster</span><span style="font-family: SimSun;">的</span><span style="font-family: Calibri;">ID</span><span style="font-family: SimSun;">一样。</span></span></p>
<p style="margin: 0in;">groupadd -g 500 haclient</p>
<p style="margin: 0in;">useradd -u 500 -g haclient hacluster</p>
<p>tar jxvf STABLE-2.1.4.tar.bz2<br />
cd Heartbeat-STABLE-2-1-STABLE-2.1.4/<br />
./ConfigureMe configure<br />
make<br />
make install<br />
# 拷贝配置文件到相应目录<br />
cp doc/ha.cf /etc/ha.d/<br />
cp doc/haresources /etc/ha.d/<br />
cp doc/authkeys /etc/ha.d/<br />
cd !$   # 跳转到/etc/ha.d/目录</p>
<p>三、配置Heartbeat</p>
<p>在/etc/ha.d/目录下进行配置：<br />
1. vi authkeys   # 节点认证方式，这里使用第一种crc<br />
auth 1<br />
1 crc<br />
＃ 修改authkeys权限为600<br />
chmode 600 authkeys</p>
<p>2. 编辑/etc/ha.d/ha.cf：<br />
[root@HA1 ha.d]# cat ha.cf |sed &#8216;/^#/d&#8217;<br />
# 开启HA的debug日志，建议调试完后关闭此日志<br />
debugfile /var/log/ha-debug<br />
# 开启HA日志<br />
logfile    /var/log/ha-log<br />
# 设置日志打印级别<br />
logfacility    local0<br />
# 多长时间建材一次心跳<br />
keepalive 2<br />
# 连续多长时间检测失败示对方挂掉，单位秒<br />
deadtime 30<br />
# 连续多长时间检测失败开始警告提示，单位秒<br />
warntime 10<br />
# 为服务重启预留一段时间，在这段时间不进行心跳检测<br />
initdead 120<br />
# 默认端口是UDP 694，我改为了695，如果在局域网还有人在玩Heartbeat，并且他用广播，你最好改个端口<br />
# 否则可能会导致认证失败<br />
udpport    695<br />
# 使用单播通信，在HA2上修改为ucast    eth1 192.168.10.1<br />
ucast    eth1 192.168.10.2<br />
# 主节点恢复正常后是否再切换回来<br />
auto_failback on<br />
# 设置看门狗<br />
# Watchdog在实现上可以是硬件电路也可以是软件定时器，能够在系统出现故障时自动重新启动系统。<br />
# 在Linux 内核下,<br />
watchdog的基本工作原理是：当watchdog启动后(即/dev/watchdog<br />
设备被打开后)，<br />
# 如果在某一设定的时间间隔内/dev/watchdog没有被执行写操作,<br />
# 硬件watchdog电路或软件定时器就会重新启动系统。<br />
watchdog /dev/watchdog<br />
# 节点列表，主节点在前，不要写反了<br />
node    HA1<br />
node    HA2</p>
<p>3. [root@HA1 ha.d]# cat haresources</p>
<p># <span style="font-family: SimSun;">每一行代表一个资源组,</span><span style="font-family: SimSun;">资源组启动顺序是从左往右，关闭的顺序是从右往左。<br />
</span><span style="font-family: SimSun;">＃ 一个资源组里面不同资源之间以空格分隔，</span><span style="font-family: SimSun;">不同的资源组之间没有必然关系</span><br />
# <span style="font-family: SimSun;">资源组的第一列是我们在</span><span style="font-family: SimSun;">ha.cf</span><span style="font-family: SimSun;">配置文件中</span><span style="font-family: SimSun;">列出的节点</span><span style="font-family: SimSun;">之一，而且应该是准备作为</span><span style="font-family: SimSun;">主</span><span style="font-family: SimSun;">节点的那一个</span><span style="font-family: SimSun;">节点</span><span style="font-family: SimSun;">。</span><br />
# <span style="font-family: SimSun;">每个资源都是一个脚本，可以放在</span><span style="font-family: Calibri;">/etc/init.d</span><span style="font-family: SimSun;">目录下面，也可以在</span><span style="font-family: Calibri;">/usr/local/etc/ha.d/</span><span style="font-family: SimSun;">resource</span><span style="font-family: Calibri;">.d</span><span style="font-family: SimSun;">目录下。<br />
# 这些脚本必须要支持</span><span style="font-family: Calibri;">start和</span><span style="font-family: Calibri;">stop参数。</span><span style="font-family: SimSun;"><br />
# </span><span style="font-family: SimSun;">脚本的参数通过</span><span style="font-family: Calibri;">::</span><span style="font-family: SimSun;">来分隔。<br />
</span># 主节点   VIP      资源名<br />
HA1    192.168.2.100    nginxd</p>
<p>4. 编写nginxd资源脚本，放到/etc/rc.d/init.d/和/etc/ha.d/resource.d/下</p>
<pre class="brush: bash; highlight: [15,16,17,18];">#!/bin/sh

# source function library
. /etc/rc.d/init.d/functions

# Source networking configuration.
. /etc/sysconfig/network

# Check that networking is up.
[ ${NETWORKING} = &quot;no&quot; ] &amp;&amp; exit 0

RETVAL=0
prog=&quot;nginx&quot;

nginxDir=/usr/local/nginx
nginxd=$nginxDir/sbin/nginx
nginxConf=$nginxDir/conf/nginx.conf
nginxPid=$nginxDir/nginx.pid

nginx_check()
{
    if [[ -e $nginxPid ]]; then
        ps aux |grep -v grep |grep -q nginx
        if (( $? == 0 )); then
            echo &quot;$prog already running...&quot;
            exit 1
        else
            rm -rf $nginxPid &amp;&gt; /dev/null
        fi
    fi
}

start()
{
    nginx_check
    if (( $? != 0 )); then
        true
    else
        echo -n $&quot;Starting $prog:&quot;
        daemon $nginxd -c $nginxConf
        RETVAL=$?
        echo
        [ $RETVAL = 0 ] &amp;&amp; touch /var/lock/subsys/nginx
        return $RETVAL
    fi
}

stop()
{
    echo -n $&quot;Stopping $prog:&quot;
    killproc $nginxd
    RETVAL=$?
    echo
    [ $RETVAL = 0 ] &amp;&amp; rm -f /var/lock/subsys/nginx $nginxPid
}

reload()
{
    echo -n $&quot;Reloading $prog:&quot;
    killproc $nginxd -HUP
    RETVAL=$?
    echo
}

case &quot;$1&quot; in
        start)
                start
                ;;
        stop)
                stop
                ;;
        restart)
                stop
                start
                ;;
        reload)
                reload
                ;;
        status)
                status $prog
                RETVAL=$?
                ;;
        *)
                echo $&quot;Usage: $0 {start|stop|restart|reload|status}&quot;
                RETVAL=1
esac
exit $RETVAL</pre>
<p>5. 设置hosts<br />
[root@HA1 ha.d]# cat /etc/hosts<br />
# Do not remove the following line, or various programs<br />
# that require network functionality will fail.<br />
127.0.0.1        vpc localhost.localdomain localhost<br />
::1        localhost6.localdomain6 localhost6<br />
192.168.10.1    HA1<br />
192.168.10.2    HA2<br />
<br style="color: #ff0000;" /><span style="color: #ff0000;">注：在HA1和HA2上进行二、三步（安装、配置heartbeat）操作</span></p>
<p>6. 启动heartbeat<br />
注意：主服务器和备份服务器的时间同步，如果相差太多heartbeat可能发生故障。</p>
<p>service heartbeat restart<br />
查看heartbeat的日志启动信息（日志对于排错很有帮助）<br />
tail -100 /var/log/ha-log<br />
heartbeat[13821]: 2009/11/07_19:41:27 info: Configuration validated. Starting heartbeat 2.1.4<br />
heartbeat[13822]: 2009/11/07_19:41:27 info: heartbeat: version 2.1.4<br />
heartbeat[13822]: 2009/11/07_19:41:27 info: Heartbeat generation: 1257517561<br />
heartbeat[13822]: 2009/11/07_19:41:27 info: glib: ucast: write socket priority set to IPTOS_LOWDELAY on eth1<br />
heartbeat[13822]: 2009/11/07_19:41:27 info: glib: ucast: bound send socket to device: eth1<br />
heartbeat[13822]: 2009/11/07_19:41:27 info: glib: ucast: bound receive socket to device: eth1<br />
heartbeat[13822]: 2009/11/07_19:41:27 info: glib: ucast: started on port 695 interface eth1 to 192.168.10.2<br />
heartbeat[13822]: 2009/11/07_19:41:27 info: G_main_add_TriggerHandler: Added signal manual handler<br />
heartbeat[13822]: 2009/11/07_19:41:27 info: G_main_add_TriggerHandler: Added signal manual handler<br />
heartbeat[13822]: 2009/11/07_19:41:27 notice: Using watchdog device: /dev/watchdog<br />
heartbeat[13822]: 2009/11/07_19:41:27 info: G_main_add_SignalHandler: Added signal handler for signal 17<br />
heartbeat[13822]: 2009/11/07_19:41:27 info: Local status now set to: &#8216;up&#8217;<br />
heartbeat[13822]: 2009/11/07_19:41:29 info: Link ha2:eth1 up.<br />
heartbeat[13822]: 2009/11/07_19:41:29 info: Status update for node ha2: status up<br />
harc[13828]:    2009/11/07_19:41:29 info: Running /etc/ha.d/rc.d/status status<br />
heartbeat[13822]: 2009/11/07_19:41:30 info: Comm_now_up(): updating status to active<br />
heartbeat[13822]: 2009/11/07_19:41:30 info: Local status now set to: &#8216;active&#8217;<br />
heartbeat[13822]: 2009/11/07_19:41:30 info: Status update for node ha2: status active<br />
harc[13845]:    2009/11/07_19:41:30 info: Running /etc/ha.d/rc.d/status status<br />
heartbeat[13822]: 2009/11/07_19:41:45 info: local resource transition completed.<br />
heartbeat[13822]: 2009/11/07_19:41:45 info: Initial resource acquisition complete (T_RESOURCES(us))<br />
IPaddr[13900]:    2009/11/07_19:41:45 INFO:  Resource is stopped<br />
heartbeat[13864]: 2009/11/07_19:41:45 info: Local Resource acquisition completed.<br />
harc[13939]:    2009/11/07_19:41:45 info: Running /etc/ha.d/rc.d/ip-request-resp ip-request-resp<br />
ip-request-resp[13939]:    2009/11/07_19:41:45 received ip-request-resp 192.168.2.100 OK yes<br />
ResourceManager[13960]:    2009/11/07_19:41:45 info: Acquiring resource group: ha1 192.168.2.100 nginxd<br />
IPaddr[13987]:    2009/11/07_19:41:45 INFO:  Resource is stopped<br />
ResourceManager[13960]:    2009/11/07_19:41:45 info: Running /etc/ha.d/resource.d/IPaddr 192.168.2.100 start<br />
IPaddr[14063]:    2009/11/07_19:41:46 INFO: Using calculated nic for 192.168.2.100: eth0<br />
IPaddr[14063]:    2009/11/07_19:41:46 INFO: Using calculated netmask for 192.168.2.100: 255.255.255.0<br />
IPaddr[14063]:    2009/11/07_19:41:46 INFO: eval ifconfig eth0:0 192.168.2.100 netmask 255.255.255.0 broadcast 192.168.2.255<br />
IPaddr[14046]:    2009/11/07_19:41:46 INFO:  Success<br />
heartbeat[13822]: 2009/11/07_19:41:46 info: remote resource transition completed.</p>
<p>查看网卡配置情况，VIP已配置到HA1上。<br />
eth0:0    Link encap:Ethernet  HWaddr 00:0C:29:35:6F:D0<br />
inet addr:192.168.2.100  Bcast:192.168.2.255  Mask:255.255.255.0<br />
UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1<br />
Interrupt:67 Base address:0&#215;2000<br />
查看nginx已经启动。</p>
<p>如果看到下面日志，可能是同网段中有人在UDP 694端口运行广播的heartbeat，换个端口试试可能能解决问题。</p>
<p>heartbeat[9966]: 2009/11/07_00:18:53 info: Configuration validated. Starting heartbeat 2.1.4<br />
heartbeat[9967]: 2009/11/07_00:18:53 info: heartbeat: version 2.1.4<br />
heartbeat[9967]: 2009/11/07_00:18:53 info: Heartbeat generation: 1257517538<br />
heartbeat[9967]: 2009/11/07_00:18:53 info: glib: UDP Broadcast heartbeat started on port 694 (694) interface eth1<br />
heartbeat[9967]: 2009/11/07_00:18:53 info: glib: UDP Broadcast heartbeat closed on port 694 interface eth1 &#8211; Status: 1<br />
heartbeat[9967]: 2009/11/07_00:18:53 info: G_main_add_TriggerHandler: Added signal manual handler<br />
heartbeat[9967]: 2009/11/07_00:18:53 info: G_main_add_TriggerHandler: Added signal manual handler<br />
heartbeat[9967]: 2009/11/07_00:18:53 info: G_main_add_SignalHandler: Added signal handler for signal 17<br />
heartbeat[9967]: 2009/11/07_00:18:53 info: Local status now set to: &#8216;up&#8217;<br />
heartbeat[9967]: 2009/11/07_00:18:55 ERROR: process_status_message: bad node [master] in message<br />
heartbeat[9967]: 2009/11/07_00:18:55 ERROR: MSG: Dumping message with 12 fields<br />
heartbeat[9967]: 2009/11/07_00:18:55 ERROR: MSG[0] : [t=status]<br />
heartbeat[9967]: 2009/11/07_00:18:55 ERROR: MSG[1] : [st=active]<br />
heartbeat[9967]: 2009/11/07_00:18:55 ERROR: MSG[2] : [dt=7530]<br />
heartbeat[9967]: 2009/11/07_00:18:55 ERROR: MSG[3] : [protocol=1]<br />
heartbeat[9967]: 2009/11/07_00:18:55 ERROR: MSG[4] : [src=master]<br />
heartbeat[9967]: 2009/11/07_00:18:55 ERROR: MSG[5] : [(1)srcuuid=0x9696e70(36 27)]<br />
heartbeat[9967]: 2009/11/07_00:18:55 ERROR: MSG[6] : [seq=1fed7]<br />
heartbeat[9967]: 2009/11/07_00:18:55 ERROR: MSG[7] : [hg=4aee4ce7]<br />
heartbeat[9967]: 2009/11/07_00:18:55 ERROR: MSG[8] : [ts=4af3a3d5]<br />
heartbeat[9967]: 2009/11/07_00:18:55 ERROR: MSG[9] : [ld=0.11 0.03 0.01 1/107 30681]<br />
heartbeat[9967]: 2009/11/07_00:18:55 ERROR: MSG[10] : [ttl=3]<br />
heartbeat[9967]: 2009/11/07_00:18:55 ERROR: MSG[11] : [auth=1 ba81b6cc]<br />
heartbeat[9967]: 2009/11/07_00:18:55 info: Link ha1:eth1 up.<br />
heartbeat[9967]: 2009/11/07_00:18:56 ERROR: process_status_message: bad node [slave] in message<br />
heartbeat[9967]: 2009/11/07_00:18:56 ERROR: MSG: Dumping message with 12 fields<br />
heartbeat[9967]: 2009/11/07_00:18:56 ERROR: MSG[0] : [t=status]<br />
heartbeat[9967]: 2009/11/07_00:18:56 ERROR: MSG[1] : [st=active]<br />
heartbeat[9967]: 2009/11/07_00:18:56 ERROR: MSG[2] : [dt=7530]<br />
heartbeat[9967]: 2009/11/07_00:18:56 ERROR: MSG[3] : [protocol=1]<br />
heartbeat[9967]: 2009/11/07_00:18:56 ERROR: MSG[4] : [src=slave]<br />
heartbeat[9967]: 2009/11/07_00:18:56 ERROR: MSG[5] : [(1)srcuuid=0x9696dc8(36 27)]<br />
heartbeat[9967]: 2009/11/07_00:18:56 ERROR: MSG[6] : [seq=1f94b]<br />
heartbeat[9967]: 2009/11/07_00:18:56 ERROR: MSG[7] : [hg=4aee4cf3]<br />
heartbeat[9967]: 2009/11/07_00:18:56 ERROR: MSG[8] : [ts=4af3a3d6]<br />
heartbeat[9967]: 2009/11/07_00:18:56 ERROR: MSG[9] : [ld=0.00 0.00 0.00 1/105 870]<br />
heartbeat[9967]: 2009/11/07_00:18:56 ERROR: MSG[10] : [ttl=3]<br />
heartbeat[9967]: 2009/11/07_00:18:56 ERROR: MSG[11] : [auth=1 bcd3be0a]</p>
<p>四、测试<br />
1. 手动切换是否正常<br />
在HA1上执行/usr/share/heartbeat/hb_standby看VIP是否能够转移到HA2<br />
查看heartbeat的日志信息<br />
tail -100 /var/log/ha-log<br />
heartbeat[13822]: 2009/11/07_19:44:33 info: ha1 wants to go standby [all]<br />
heartbeat[13822]: 2009/11/07_19:44:33 info: standby: ha2 can take our all resources<br />
heartbeat[14194]: 2009/11/07_19:44:33 info: give up all HA resources (standby).<br />
ResourceManager[14207]:    2009/11/07_19:44:34 info: Releasing resource group: ha1 192.168.2.100 nginxd<br />
ResourceManager[14207]:    2009/11/07_19:44:34 info: Running /etc/ha.d/resource.d/nginxd  stop<br />
ResourceManager[14207]:    2009/11/07_19:44:34 info: Running /etc/ha.d/resource.d/IPaddr 192.168.2.100 stop<br />
IPaddr[14295]:    2009/11/07_19:44:34 INFO: ifconfig eth0:0 down<br />
IPaddr[14278]:    2009/11/07_19:44:34 INFO:  Success<br />
heartbeat[14194]: 2009/11/07_19:44:34 info: all HA resource release completed (standby).<br />
heartbeat[13822]: 2009/11/07_19:44:34 info: Local standby process completed [all].<br />
heartbeat[13822]: 2009/11/07_19:44:36 WARN: 1 lost packet(s) for [ha2] [83:85]<br />
heartbeat[13822]: 2009/11/07_19:44:36 info: remote resource transition completed.<br />
heartbeat[13822]: 2009/11/07_19:44:36 info: No pkts missing from ha2!<br />
heartbeat[13822]: 2009/11/07_19:44:36 info: Other node completed standby takeover of all resources.<br />
查看HA2上VIP已经配置上，nginx也已启动。</p>
<p>2. 切断主节点和备份节点的心跳线看是VIP否能够转移<br />
Down掉HA1的eth1网卡，在HA2上查看heartbeat日志<br />
[root@HA2 ~]# tail -100 /var/log/ha-log<br />
heartbeat[3753]: 2009/11/07_19:59:36 WARN: node ha1: is dead<br />
heartbeat[3753]: 2009/11/07_19:59:36 WARN: No STONITH device configured.<br />
heartbeat[3753]: 2009/11/07_19:59:36 WARN: Shared disks are not protected.<br />
heartbeat[3753]: 2009/11/07_19:59:36 info: Resources being acquired from ha1.<br />
heartbeat[3753]: 2009/11/07_19:59:36 info: Link ha1:eth1 dead.<br />
harc[4255]:    2009/11/07_19:59:36 info: Running /etc/ha.d/rc.d/status status<br />
heartbeat[4256]: 2009/11/07_19:59:36 info: No local resources [/usr/share/heartbeat/ResourceManager listkeys ha2] to acquire.<br />
mach_down[4276]:    2009/11/07_19:59:36 info: Taking over resource group 192.168.2.100<br />
ResourceManager[4310]:    2009/11/07_19:59:36 info: Acquiring resource group: ha1 192.168.2.100 nginxd<br />
IPaddr[4337]:    2009/11/07_19:59:37 INFO:  Resource is stopped<br />
ResourceManager[4310]:    2009/11/07_19:59:37 info: Running /etc/ha.d/resource.d/IPaddr 192.168.2.100 start<br />
IPaddr[4413]:    2009/11/07_19:59:37 INFO: Using calculated nic for 192.168.2.100: eth0<br />
IPaddr[4413]:    2009/11/07_19:59:37 INFO: Using calculated netmask for 192.168.2.100: 255.255.255.0<br />
IPaddr[4413]:    2009/11/07_19:59:37 INFO: eval ifconfig eth0:0 192.168.2.100 netmask 255.255.255.0 broadcast 192.168.2.255<br />
IPaddr[4396]:    2009/11/07_19:59:37 INFO:  Success<br />
ResourceManager[4310]:    2009/11/07_19:59:37 info: Running /etc/ha.d/resource.d/nginxd  start<br />
mach_down[4276]:    2009/11/07_19:59:38 info: /usr/share/heartbeat/mach_down: nice_failback: foreign resources acquired<br />
mach_down[4276]:    2009/11/07_19:59:38 info: mach_down takeover complete for node ha1.<br />
heartbeat[3753]: 2009/11/07_19:59:38 info: mach_down takeover complete.<br />
资源从HA1转移到了HA2。</p>
<p>启动HA1的eth1网卡，可以看到资源从HA2上自动转移到HA1上。</p>
<p>3. 停掉HA1或是停掉HA1上的heartbeat，看VIP是否能够转移到HA2<br />
资源从HA1转移到了HA2。</p>
<p>五、HA管理</p>
<p>启动/停止heartbeat：<br />
<span style="font-family: Calibri;">service heartbeat start/stop<br />
</span><br />
查看heartbeat状态：<br />
[root@HA2 ~]# service heartbeat status<br />
heartbeat OK [pid 4724 et al] is running on ha2 [ha2]&#8230;</p>
<p>手工切换（将本地资源转移到远程主机）：<br />
[root@HA1 ～]# /usr/share/heartbeat/hb_standby<br />
2009/11/07_20:11:03 Going standby [all].</p>
<p>手动接管（将资源接管到本地）：<br />
[root@HA2 ~]# /usr/share/heartbeat/hb_takeover</p>
<p>总结：通过上面的配置可以达到当其中一个节点Down掉后有另一个节点接管资源目的，但是当nginx本身Down掉后并不能自动故障转移，要想达到此目的必须配置heartbeat style 2.x，请参考<a title="《Heartbeat实现Nginx高可用性(style 2.x)》" href="http://www.yoyotown.com/?p=511">《Heartbeat实现Nginx高可用性(style 2.x)》</a></p>
<p>六、参考<br />
1. authkeys配置参考：http://linux-ha.org/authkeys<br />
2. ha.cf配置参考：http://linux-ha.org/ha.cf<br />
3. http://logzgh.itpub.net/post/3185/466910<br />
4. http://linux.chinaunix.net/bbs/archiver/?tid-1051263.html</p>
<h3  class="related_post_title">相关日志</h3><ul class="related_post"><li>2009/12/10 -- <a href="http://www.yoyotown.com/?p=552" title="Heartbeat/corosync+pacemaker+ldirectord 实现Nginx负载均衡">Heartbeat/corosync+pacemaker+ldirectord 实现Nginx负载均衡</a></li><li>2009/12/09 -- <a href="http://www.yoyotown.com/?p=511" title="Heartbeat实现Nginx高可用性(style 2.x)">Heartbeat实现Nginx高可用性(style 2.x)</a></li><li>2009/12/11 -- <a href="http://www.yoyotown.com/?p=558" title="MySQL-Nginx-Pacemaker-corosync(openais)-drbd active/passive cluster">MySQL-Nginx-Pacemaker-corosync(openais)-drbd active/passive cluster</a></li><li>2009/12/10 -- <a href="http://www.yoyotown.com/?p=546" title="用CRM命令行工具配置集群资源">用CRM命令行工具配置集群资源</a></li><li>2009/12/08 -- <a href="http://www.yoyotown.com/?p=504" title="HA体系架构及内部处理流程">HA体系架构及内部处理流程</a></li></ul>]]></content:encoded>
			<wfw:commentRss>http://www.yoyotown.com/?feed=rss2&amp;p=507</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>HA体系架构及内部处理流程</title>
		<link>http://www.yoyotown.com/?p=504</link>
		<comments>http://www.yoyotown.com/?p=504#comments</comments>
		<pubDate>Tue, 08 Dec 2009 12:05:16 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[高可用性]]></category>
		<category><![CDATA[ha]]></category>
		<category><![CDATA[heartbeat]]></category>
		<category><![CDATA[OpenAIS]]></category>
		<category><![CDATA[Pacemake]]></category>

		<guid isPermaLink="false">http://www.yoyotown.com/?p=504</guid>
		<description><![CDATA[1. 体系结构
本部分简要地概述了 High Availability体系结构。它提供了有关体系结构组件的信息,并描述了这些组件是如何协同工作的。
1.1 体系结构层
High Availability具有分层的体系结构。图“体系结构” 说明了不同的层及其相关的组件。
体系结构图：


 
消息交换和基础结构层
主层或第一层是消息交换/基础结构层,也称为 OpenAIS 层。此层包含了发送含有“我在线”信号的消息及其他信息的组件。High Availability的程序就位于此消息交换/基础结构层。
资源分配层
下一层是资源分配层。此层最复杂,它包含以下组件:
群集资源管理器 (CRM)
在资源分配层中执行的每个操作都要经过群集资源管理器。如果资源分配层的其他组件(或更高层中的组件)需要通讯,则它们通过本地 CRM 进行。在每个节点上,CRM 维护群集信息库 (CIB),包含所有群集选项、节点、资源及其关系和当前状态的定义。如果选择群集中的 CRM 为指定协调程序 (DC),则意味着它具有主 CIB。群集中的所有其他 CIB 是此主 CIB 的复本。对 CIB 的常规读写操作通过主 CIB 进行排序。DC 是群集中唯一可以决定需要在整个群集执行更改(例如节点屏障或资源移动)的实体。
群集信息库 (CIB)
群集信息库是整个群集配置和当前状态在内存中的 XML 表示。它包含所有群集选项、节点、资源、约束及其之间的关系的定义。CIB 还将更新同步到所有群集节点。群集中有一个主 CIB,由 DC 维护。所有其他节点包含一个CIB 复本。
策略引擎 (PE)
每当指定协调程序需要进行整个群集的更改(对新 CIB 做出反应),策略引擎就会根据群集的当前状态和配置计算群集的下一个状态。PE 还生成一个转换图,包含用于达到下一个群集状态的(资源)操作和依赖性的列表。PE 在每个节点上都运行以加速 DC 故障转移。
本地资源管理器 (LRM)
LRM 代表 CRM 调用本地资源代理(请参见“资源层”一节 [13])。因此它可以执行启动/停止/监视操作并将结果报告给 CRM。它还隐藏资源代理支持的脚本标准(OCF、LSB、Heartbeat V1)之间的区别。LRM 是其本地节点上所有资源相关信息的权威来源。
资源层
最高层是资源层。资源层包括一个或多个资源代理 (RA)。资源代理是为启动、停止和监视某种服务(资源)而编写的程序,通常是壳层脚本。资源代理仅由LRM 调用。第三方可将他们自己的代理放在文件系统中定义的位置,这样就为各自的软件提供了现成群集集成。
1.2 处理流程
High [...]]]></description>
			<content:encoded><![CDATA[<p><span style="font-size: small;">1. 体系结构<br />
本部分简要地概述了 High Availability体系结构。它提供了有关体系结构组件的信息,并描述了这些组件是如何协同工作的。</span></p>
<p><span style="font-size: small;">1.1 体系结构层</span></p>
<p><span style="font-size: small;">High Availability具有分层的体系结构。图“体系结构” 说明了不同的层及其相关的组件。</span></p>
<p><span style="font-size: small;">体系结构图：<br />
</span></p>
<div id="c:q1" style="text-align: left;"><img style="width: 648px; height: 509.49px;" src="http://docs.google.com/File?id=dmswbz7_276gncdjxf2_b" alt="" /></div>
<p><span style="font-size: small;"> </span></p>
<p><span style="font-size: small;">消息交换和基础结构层<br />
主层或第一层是消息交换/基础结构层,也称为 OpenAIS 层。此层包含了发送含有“我在线”信号的消息及其他信息的组件。High Availability的程序就位于此消息交换/基础结构层。</span></p>
<p><span style="font-size: small;">资源分配层<br />
下一层是资源分配层。此层最复杂,它包含以下组件:<br />
群集资源管理器 (CRM)<br />
在资源分配层中执行的每个操作都要经过群集资源管理器。如果资源分配层的其他组件(或更高层中的组件)需要通讯,则它们通过本地 CRM 进行。在每个节点上,CRM 维护群集信息库 (CIB),包含所有群集选项、节点、资源及其关系和当前状态的定义。如果选择群集中的 CRM 为指定协调程序 (DC),则意味着它具有主 CIB。群集中的所有其他 CIB 是此主 CIB 的复本。对 CIB 的常规读写操作通过主 CIB 进行排序。DC 是群集中唯一可以决定需要在整个群集执行更改(例如节点屏障或资源移动)的实体。</span></p>
<p><span style="font-size: small;">群集信息库 (CIB)<br />
群集信息库是整个群集配置和当前状态在内存中的 XML 表示。它包含所有群集选项、节点、资源、约束及其之间的关系的定义。CIB 还将更新同步到所有群集节点。群集中有一个主 CIB,由 DC 维护。所有其他节点包含一个CIB 复本。</span></p>
<p><span style="font-size: small;">策略引擎 (PE)<br />
每当指定协调程序需要进行整个群集的更改(对新 CIB 做出反应),策略引擎就会根据群集的当前状态和配置计算群集的下一个状态。PE 还生成一个转换图,包含用于达到下一个群集状态的(资源)操作和依赖性的列表。PE 在每个节点上都运行以加速 DC 故障转移。</span></p>
<p><span style="font-size: small;">本地资源管理器 (LRM)<br />
LRM 代表 CRM 调用本地资源代理(请参见“资源层”一节 [13])。因此它可以执行启动/停止/监视操作并将结果报告给 CRM。它还隐藏资源代理支持的脚本标准(OCF、LSB、Heartbeat V1)之间的区别。LRM 是其本地节点上所有资源相关信息的权威来源。</span></p>
<p><span style="font-size: small;">资源层<br />
最高层是资源层。资源层包括一个或多个资源代理 (RA)。资源代理是为启动、停止和监视某种服务(资源)而编写的程序,通常是壳层脚本。资源代理仅由LRM 调用。第三方可将他们自己的代理放在文件系统中定义的位置,这样就为各自的软件提供了现成群集集成。</span></p>
<p><span style="font-size: small;">1.2 处理流程<br />
High Availability使用 Pacemaker 作为 CRM。CRM 作为守护程序执行 (crmd),它在每个群集节点上都有一个实例。Pacemaker通过将某个 crmd 实例选为主实例,从而集中了所有的群集决策制定。如果选定的 crmd 过程(或它所在的节点)出现故障,则将建立一个新的过程。</span></p>
<p><span style="font-size: small;">在每个节点上保留了一个 CIB,它反映了群集的配置和群集中所有资源的当前状态。CIB 的内容会在整个群集的同步过程中自动保留下来。</span></p>
<p><span style="font-size: small;">群集中执行的许多操作都将导致整个群集的更改。这些操作包括添加或删除群集资源、更改资源约束等等。了解执行这样的操作时群集中会发生的状况是很重要的。</span></p>
<p><span style="font-size: small;">例如,假设您要添加一个群集 IP 地址资源。为此,您可以使用一种命令行工具或 GUI 修改 CIB。您不必在 DC 上执行此操作,可以使用群集中任何节点上的任何工具,此操作会被传送到 DC 上。然后 DC 将把此 CIB 更改复制到所有群集节点。</span></p>
<p><span style="font-size: small;">根据 CIB 中的信息,PE 便计算群集的理想状态及如何达到此状态,并将指令列表传递给 DC。DC 通过消息交换/基础结构层发出命令,其他节点上的 crmd 同级将收到此命令。每个 crmd 使用它的 LRM(作为 lrmd 实现)执行资源修改。lrmd 不是群集感知的,它直接与资源代理(脚本)交互。</span></p>
<p><span style="font-size: small;">所有同级节点将操作的结果报告给 DC。一旦 DC 做出所有必需操作已在群集中成功执行的结论,群集将返回至空闲状态并等待进一步事件。如果有操作未按计划执行,则会再次调用 PE,CIB 中将记录新信息。</span></p>
<p><span style="font-size: small;">在某些情况下,可能需要关闭节点以保护共享数据或完成资源恢复。为此,Pacemaker 附带了一个屏障子系统,stonithd。STONITH 是 “Shoot The Other NodeIn The Head(关闭其他节点)”的首字母缩写,通常通过一个远程电源开关实施。在 Pacemaker 中将 STONITH 设备构造成资源(并在 CIB 中配置)以便对它们监视故障;然而,stonithd 负责了解 STONITH 拓扑,这样它的客户端只需请求屏障节点,余下的工作由它来完成。</span></p>
<p><span style="font-size: small;"> </span></p>
<h3  class="related_post_title">相关日志</h3><ul class="related_post"><li>2009/12/10 -- <a href="http://www.yoyotown.com/?p=552" title="Heartbeat/corosync+pacemaker+ldirectord 实现Nginx负载均衡">Heartbeat/corosync+pacemaker+ldirectord 实现Nginx负载均衡</a></li><li>2009/12/10 -- <a href="http://www.yoyotown.com/?p=546" title="用CRM命令行工具配置集群资源">用CRM命令行工具配置集群资源</a></li><li>2009/12/09 -- <a href="http://www.yoyotown.com/?p=511" title="Heartbeat实现Nginx高可用性(style 2.x)">Heartbeat实现Nginx高可用性(style 2.x)</a></li><li>2009/12/08 -- <a href="http://www.yoyotown.com/?p=507" title="Heartbeat实现Nginx高可用性(style 1.x)">Heartbeat实现Nginx高可用性(style 1.x)</a></li><li>2009/12/11 -- <a href="http://www.yoyotown.com/?p=558" title="MySQL-Nginx-Pacemaker-corosync(openais)-drbd active/passive cluster">MySQL-Nginx-Pacemaker-corosync(openais)-drbd active/passive cluster</a></li></ul>]]></content:encoded>
			<wfw:commentRss>http://www.yoyotown.com/?feed=rss2&amp;p=504</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>LVM + MySQL主从复制</title>
		<link>http://www.yoyotown.com/?p=501</link>
		<comments>http://www.yoyotown.com/?p=501#comments</comments>
		<pubDate>Mon, 07 Dec 2009 13:56:28 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[MySQL]]></category>
		<category><![CDATA[lvm]]></category>
		<category><![CDATA[主从复制]]></category>

		<guid isPermaLink="false">http://www.yoyotown.com/?p=501</guid>
		<description><![CDATA[两台虚拟机，系统为CentOS 5.4，分别有三块磁盘来做逻辑卷。
IP分配及磁盘情况：
HA1		eth0：192.168.0.77	eth1：192.168.10.1   /dev/sdc /dev/sdd /dev/sde
HA2		eth0：192.168.0.69	eth1：192.168.10.2   /dev/sdc /dev/sdd /dev/sde
一、配置逻辑磁盘
查看磁盘情况：
[root@HA1 ~]# fdisk -l
Disk /dev/sda: 10.7 GB, 10737418240 bytes
255 heads, 63 sectors/track, 1305 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Device Boot      Start         End      Blocks   Id  System
/dev/sda1   *           1          13      104391   83  Linux
/dev/sda2              14        1305    10377990   8e  Linux LVM
Disk /dev/sdb: 6442 MB, 6442450944 bytes
255 heads, 63 [...]]]></description>
			<content:encoded><![CDATA[<p>两台虚拟机，系统为CentOS 5.4，分别有三块磁盘来做逻辑卷。</p>
<p>IP分配及磁盘情况：<br />
HA1		eth0：192.168.0.77	eth1：192.168.10.1   /dev/sdc /dev/sdd /dev/sde<br />
HA2		eth0：192.168.0.69	eth1：192.168.10.2   /dev/sdc /dev/sdd /dev/sde</p>
<p>一、配置逻辑磁盘<br />
查看磁盘情况：<br />
[root@HA1 ~]# fdisk -l</p>
<p>Disk /dev/sda: 10.7 GB, 10737418240 bytes<br />
255 heads, 63 sectors/track, 1305 cylinders<br />
Units = cylinders of 16065 * 512 = 8225280 bytes</p>
<p>Device Boot      Start         End      Blocks   Id  System<br />
/dev/sda1   *           1          13      104391   83  Linux<br />
/dev/sda2              14        1305    10377990   8e  Linux LVM</p>
<p>Disk /dev/sdb: 6442 MB, 6442450944 bytes<br />
255 heads, 63 sectors/track, 783 cylinders<br />
Units = cylinders of 16065 * 512 = 8225280 bytes</p>
<p>Disk /dev/sdb doesn&#8217;t contain a valid partition table</p>
<p>Disk /dev/sdc: 536 MB, 536870912 bytes<br />
64 heads, 32 sectors/track, 512 cylinders<br />
Units = cylinders of 2048 * 512 = 1048576 bytes</p>
<p>Disk /dev/sdc doesn&#8217;t contain a valid partition table</p>
<p>Disk /dev/sdd: 536 MB, 536870912 bytes<br />
64 heads, 32 sectors/track, 512 cylinders<br />
Units = cylinders of 2048 * 512 = 1048576 bytes</p>
<p>Disk /dev/sdd doesn&#8217;t contain a valid partition table</p>
<p>Disk /dev/sde: 536 MB, 536870912 bytes<br />
64 heads, 32 sectors/track, 512 cylinders<br />
Units = cylinders of 2048 * 512 = 1048576 bytes</p>
<p>Disk /dev/sde doesn&#8217;t contain a valid partition table</p>
<p>为磁盘分区：<br />
[root@HA1 ~]# fdisk /dev/sdc<br />
Device contains neither a valid DOS partition table, nor Sun, SGI or OSF disklabel<br />
Building a new DOS disklabel. Changes will remain in memory only,<br />
until you decide to write them. After that, of course, the previous<br />
content won&#8217;t be recoverable.</p>
<p>Warning: invalid flag 0&#215;0000 of partition table 4 will be corrected by w(rite)</p>
<p>Command (m for help): <span style="color: #ff0000;">m </span> # 获取帮助<br />
Command action<br />
a   toggle a bootable flag<br />
b   edit bsd disklabel<br />
c   toggle the dos compatibility flag<br />
d   delete a partition<br />
l   list known partition types<br />
m   print this menu<br />
n   add a new partition<br />
o   create a new empty DOS partition table<br />
p   print the partition table<br />
q   quit without saving changes<br />
s   create a new empty Sun disklabel<br />
t   change a partition&#8217;s system id<br />
u   change display/entry units<br />
v   verify the partition table<br />
w   write table to disk and exit<br />
x   extra functionality (experts only)</p>
<p>Command (m for help): <span style="color: #ff0000;">n </span> # 新建分区<br />
Command action<br />
e   extended<br />
p   primary partition (1-4)<br />
<span style="color: #ff0000;">p </span> # 新建主分区<br />
Partition number (1-4): <span style="color: #ff0000;">1</span> # 输入分区号<br />
First cylinder (1-512, default 1):     # 回车，默认即可<br />
Using default value 1<br />
Last cylinder or +size or +sizeM or +sizeK (1-512, default 512):     # 回车，使用所有磁盘空间<br />
Using default value 512</p>
<p>Command (m for help):<span style="color: #ff0000;"> t</span> # 设置分区类型<br />
Selected partition 1<br />
Hex code (type L to list codes):<span style="color: #ff0000;"> L</span> # 查看分区类型</p>
<p>0  Empty           1e  Hidden W95 FAT1 80  Old Minix       bf  Solaris<br />
1  FAT12           24  NEC DOS         81  Minix / old Lin c1  DRDOS/sec (FAT-<br />
2  XENIX root      39  Plan 9          82  Linux swap / So c4  DRDOS/sec (FAT-<br />
3  XENIX usr       3c  PartitionMagic  83  Linux           c6  DRDOS/sec (FAT-<br />
4  FAT16 &lt;32M      40  Venix 80286     84  OS/2 hidden C:  c7  Syrinx<br />
5  Extended        41  PPC PReP Boot   85  Linux extended  da  Non-FS data<br />
6  FAT16           42  SFS             86  NTFS volume set db  CP/M / CTOS / .<br />
7  HPFS/NTFS       4d  QNX4.x          87  NTFS volume set de  Dell Utility<br />
8  AIX             4e  QNX4.x 2nd part 88  Linux plaintext df  BootIt<br />
9  AIX bootable    4f  QNX4.x 3rd part 8e  Linux LVM       e1  DOS access<br />
a  OS/2 Boot Manag 50  OnTrack DM      93  Amoeba          e3  DOS R/O<br />
b  W95 FAT32       51  OnTrack DM6 Aux 94  Amoeba BBT      e4  SpeedStor<br />
c  W95 FAT32 (LBA) 52  CP/M            9f  BSD/OS          eb  BeOS fs<br />
e  W95 FAT16 (LBA) 53  OnTrack DM6 Aux a0  IBM Thinkpad hi ee  EFI GPT<br />
f  W95 Ext&#8217;d (LBA) 54  OnTrackDM6      a5  FreeBSD         ef  EFI (FAT-12/16/<br />
10  OPUS            55  EZ-Drive        a6  OpenBSD         f0  Linux/PA-RISC b<br />
11  Hidden FAT12    56  Golden Bow      a7  NeXTSTEP        f1  SpeedStor<br />
12  Compaq diagnost 5c  Priam Edisk     a8  Darwin UFS      f4  SpeedStor<br />
14  Hidden FAT16 &lt;3 61  SpeedStor       a9  NetBSD          f2  DOS secondary<br />
16  Hidden FAT16    63  GNU HURD or Sys ab  Darwin boot     fb  VMware VMFS<br />
17  Hidden HPFS/NTF 64  Novell Netware  b7  BSDI fs         fc  VMware VMKCORE<br />
18  AST SmartSleep  65  Novell Netware  b8  BSDI swap       fd  Linux raid auto<br />
1b  Hidden W95 FAT3 70  DiskSecure Mult bb  Boot Wizard hid fe  LANstep<br />
1c  Hidden W95 FAT3 75  PC/IX           be  Solaris boot    ff  BBT<br />
Hex code (type L to list codes): <span style="color: #ff0000;">8e </span> # 设置分区类型为Linux LVM<br />
Changed system type of partition 1 to 8e (Linux LVM)</p>
<p>Command (m for help): <span style="color: #ff0000;">w</span> # 保存退出<br />
The partition table has been altered!</p>
<p>Calling ioctl() to re-read partition table.<br />
Syncing disks.<br />
[root@HA1 ~]# fdisk /dev/sdd<br />
Device contains neither a valid DOS partition table, nor Sun, SGI or OSF disklabel<br />
Building a new DOS disklabel. Changes will remain in memory only,<br />
until you decide to write them. After that, of course, the previous<br />
content won&#8217;t be recoverable.</p>
<p>Warning: invalid flag 0&#215;0000 of partition table 4 will be corrected by w(rite)</p>
<p>Command (m for help): <span style="color: #ff0000;">n</span><br />
Command action<br />
e   extended<br />
p   primary partition (1-4)<br />
<span style="color: #ff0000;">p</span><br />
Partition number (1-4): <span style="color: #ff0000;">1</span><br />
First cylinder (1-512, default 1):<br />
Using default value 1<br />
Last cylinder or +size or +sizeM or +sizeK (1-512, default 512):<br />
Using default value 512</p>
<p>Command (m for help): <span style="color: #ff0000;">t</span><br />
Selected partition 1<br />
Hex code (type L to list codes): <span style="color: #ff0000;">8e</span><br />
Changed system type of partition 1 to 8e (Linux LVM)</p>
<p>Command (m for help): <span style="color: #ff0000;">w</span><br />
The partition table has been altered!</p>
<p>Calling ioctl() to re-read partition table.<br />
Syncing disks.<br />
[root@HA1 ~]# fdisk /dev/sde<br />
Device contains neither a valid DOS partition table, nor Sun, SGI or OSF disklabel<br />
Building a new DOS disklabel. Changes will remain in memory only,<br />
until you decide to write them. After that, of course, the previous<br />
content won&#8217;t be recoverable.</p>
<p>Warning: invalid flag 0&#215;0000 of partition table 4 will be corrected by w(rite)</p>
<p>Command (m for help): <span style="color: #ff0000;">n</span><br />
Command action<br />
e   extended<br />
p   primary partition (1-4)<br />
<span style="color: #ff0000;">p</span><br />
Partition number (1-4):<span style="color: #ff0000;"> 1</span><br />
First cylinder (1-512, default 1):<br />
Using default value 1<br />
Last cylinder or +size or +sizeM or +sizeK (1-512, default 512):<br />
Using default value 512</p>
<p>Command (m for help): <span style="color: #ff0000;">t</span><br />
Selected partition 1<br />
Hex code (type L to list codes): <span style="color: #ff0000;">8e</span><br />
Changed system type of partition 1 to 8e (Linux LVM)</p>
<p>Command (m for help): <span style="color: #ff0000;">w</span><br />
The partition table has been altered!</p>
<p>Calling ioctl() to re-read partition table.<br />
Syncing disks.</p>
<p>分区完成后查看磁盘情况：<br />
[root@HA1 ~]# fdisk -l</p>
<p>Disk /dev/sda: 10.7 GB, 10737418240 bytes<br />
255 heads, 63 sectors/track, 1305 cylinders<br />
Units = cylinders of 16065 * 512 = 8225280 bytes</p>
<p>Device Boot      Start         End      Blocks   Id  System<br />
/dev/sda1   *           1          13      104391   83  Linux<br />
/dev/sda2              14        1305    10377990   8e  Linux LVM</p>
<p>Disk /dev/sdb: 6442 MB, 6442450944 bytes<br />
255 heads, 63 sectors/track, 783 cylinders<br />
Units = cylinders of 16065 * 512 = 8225280 bytes</p>
<p>Disk /dev/sdb doesn&#8217;t contain a valid partition table</p>
<p>Disk /dev/sdc: 536 MB, 536870912 bytes<br />
64 heads, 32 sectors/track, 512 cylinders<br />
Units = cylinders of 2048 * 512 = 1048576 bytes</p>
<p>Device Boot      Start         End      Blocks   Id  System<br />
/dev/sdc1               1         512      524272   8e  Linux LVM</p>
<p>Disk /dev/sdd: 536 MB, 536870912 bytes<br />
64 heads, 32 sectors/track, 512 cylinders<br />
Units = cylinders of 2048 * 512 = 1048576 bytes</p>
<p>Device Boot      Start         End      Blocks   Id  System<br />
/dev/sdd1               1         512      524272   8e  Linux LVM</p>
<p>Disk /dev/sde: 536 MB, 536870912 bytes<br />
64 heads, 32 sectors/track, 512 cylinders<br />
Units = cylinders of 2048 * 512 = 1048576 bytes</p>
<p>Device Boot      Start         End      Blocks   Id  System<br />
/dev/sde1               1         512      524272   8e  Linux LVM</p>
<p>创建物理卷：<br />
[root@HA1 ~]# pvcreate /dev/sdc1 /dev/sdd1 /dev/sde1<br />
Physical volume &#8220;/dev/sdc1&#8243; successfully created<br />
Physical volume &#8220;/dev/sdd1&#8243; successfully created<br />
Physical volume &#8220;/dev/sde1&#8243; successfully created</p>
<p>查看物理卷：<br />
[root@HA1 ~]# pvdisplay<br />
&#8212; Physical volume &#8212;<br />
PV Name               /dev/sda2<br />
VG Name               VolGroup00<br />
PV Size               9.90 GB / not usable 22.76 MB<br />
Allocatable           yes (but full)<br />
PE Size (KByte)       32768<br />
Total PE              316<br />
Free PE               0<br />
Allocated PE          316<br />
PV UUID               1zBHox-Dla7-0ozU-0IFp-Onl4-V7V2-R10XXW</p>
<p>&#8220;/dev/sdc1&#8243; is a new physical volume of &#8220;511.98 MB&#8221;<br />
&#8212; NEW Physical volume &#8212;<br />
PV Name               /dev/sdc1<br />
VG Name<br />
PV Size               511.98 MB<br />
Allocatable           NO<br />
PE Size (KByte)       0<br />
Total PE              0<br />
Free PE               0<br />
Allocated PE          0<br />
PV UUID               DwoEeZ-NmK5-ZDR6-qCmx-vJsw-7Wet-2qGako</p>
<p>&#8220;/dev/sdd1&#8243; is a new physical volume of &#8220;511.98 MB&#8221;<br />
&#8212; NEW Physical volume &#8212;<br />
PV Name               /dev/sdd1<br />
VG Name<br />
PV Size               511.98 MB<br />
Allocatable           NO<br />
PE Size (KByte)       0<br />
Total PE              0<br />
Free PE               0<br />
Allocated PE          0<br />
PV UUID               YfolqL-6Qlm-bUki-qWTJ-8zIW-zeJI-Ssjxln</p>
<p>&#8220;/dev/sde1&#8243; is a new physical volume of &#8220;511.98 MB&#8221;<br />
&#8212; NEW Physical volume &#8212;<br />
PV Name               /dev/sde1<br />
VG Name<br />
PV Size               511.98 MB<br />
Allocatable           NO<br />
PE Size (KByte)       0<br />
Total PE              0<br />
Free PE               0<br />
Allocated PE          0<br />
PV UUID               Rhdkyp-MBB6-UeTK-dmuP-6Dza-L69O-sW6eNv</p>
<p>创建逻辑卷组：<br />
[root@HA1 ~]# vgcreate dataVg /dev/sdc1 /dev/sdd1 /dev/sde1<br />
Volume group &#8220;dataVg&#8221; successfully created</p>
<p>创建逻辑卷：<br />
[root@HA1 ~]# lvcreate &#8211;name dataLv &#8211;size 1G dataVg<br />
Logical volume &#8220;dataLv&#8221; created</p>
<p>查看逻辑卷：<br />
[root@HA1 ~]# lvdisplay<br />
&#8212; Logical volume &#8212;<br />
LV Name                /dev/dataVg/dataLv<br />
VG Name                dataVg<br />
LV UUID                gXPZmP-c41N-Yeu8-mT8U-0sUx-Mu2X-pR1PyE<br />
LV Write Access        read/write<br />
LV Status              available<br />
# open                 0<br />
LV Size                1.00 GB<br />
Current LE             256<br />
Segments               3<br />
Allocation             inherit<br />
Read ahead sectors     auto<br />
- currently set to     256<br />
Block device           253:2</p>
<p>&#8212; Logical volume &#8212;<br />
LV Name                /dev/VolGroup00/LogVol00<br />
VG Name                VolGroup00<br />
LV UUID                yTby3S-TYzd-x7fP-T8HJ-GOEg-lt7E-i90qZy<br />
LV Write Access        read/write<br />
LV Status              available<br />
# open                 1<br />
LV Size                8.88 GB<br />
Current LE             284<br />
Segments               1<br />
Allocation             inherit<br />
Read ahead sectors     auto<br />
- currently set to     256<br />
Block device           253:0</p>
<p>&#8212; Logical volume &#8212;<br />
LV Name                /dev/VolGroup00/LogVol01<br />
VG Name                VolGroup00<br />
LV UUID                bNfOaD-vcTc-hq4c-7Bd0-3a6S-wD0B-aFZMzM<br />
LV Write Access        read/write<br />
LV Status              available<br />
# open                 1<br />
LV Size                1.00 GB<br />
Current LE             32<br />
Segments               1<br />
Allocation             inherit<br />
Read ahead sectors     auto<br />
- currently set to     256<br />
Block device           253:1</p>
<p>格式化逻辑卷：<br />
[root@HA1 ~]# mkfs.ext3 /dev/dataVg/dataLv<br />
mke2fs 1.39 (29-May-2006)<br />
Filesystem label=<br />
OS type: Linux<br />
Block size=4096 (log=2)<br />
Fragment size=4096 (log=2)<br />
131072 inodes, 262144 blocks<br />
13107 blocks (5.00%) reserved for the super user<br />
First data block=0<br />
Maximum filesystem blocks=268435456<br />
8 block groups<br />
32768 blocks per group, 32768 fragments per group<br />
16384 inodes per group<br />
Superblock backups stored on blocks:<br />
32768, 98304, 163840, 229376</p>
<p>Writing inode tables: done<br />
Creating journal (8192 blocks): done<br />
Writing superblocks and filesystem accounting information: done</p>
<p>This filesystem will be automatically checked every 25 mounts or<br />
180 days, whichever comes first.  Use tune2fs -c or -i to override.</p>
<p>挂载逻辑卷到/data目录：<br />
[root@HA1 ~]# mount /dev/dataVg/dataLv /data/</p>
<p>设置开机自动挂载挂逻辑卷：<br />
[root@HA1 ~]# vi /etc/fstab<br />
/dev/dataVg/dataLv      /data                   ext3    defaults        0 0</p>
<p>在HA2上执行上面步骤。</p>
<p>二、安装MySQL并迁移MySQL数据到HA1 /data下。</p>
<p>三、安装MySQL LVM备份工具：<br />
[root@HA1 ~]# wget http://search.cpan.org/CPAN/authors/id/S/SH/SHLOMIF/Config-IniFiles-2.54.tar.gz</p>
<p>[root@HA1 ~]# tar xzvf Config-IniFiles-2.54.tar.gz</p>
<p>[root@HA1 ~]# cd Config-IniFiles-2.54<br />
[root@HA1 Config-IniFiles-2.54]# perl Makefile.PL<br />
Checking if your kit is complete&#8230;<br />
Looks good<br />
Writing Makefile for Config::IniFiles<br />
[root@HA1 Config-IniFiles-2.54]# make<br />
cp lib/Config/IniFiles.pm blib/lib/Config/IniFiles.pm<br />
Manifying blib/man3/Config::IniFiles.3pm<br />
[root@HA1 Config-IniFiles-2.54]# make install<br />
Installing /usr/lib/perl5/site_perl/5.8.8/Config/IniFiles.pm<br />
Installing /usr/share/man/man3/Config::IniFiles.3pm<br />
Writing /usr/lib/perl5/site_perl/5.8.8/i386-linux-thread-multi/auto/Config/IniFiles/.packlist<br />
Appending installation info to /usr/lib/perl5/5.8.8/i386-linux-thread-multi/perllocal.pod<br />
[root@HA1 Config-IniFiles-2.54]# cd ..</p>
<p>[root@HA1 ~]# wget http://www.lenzg.net/mylvmbackup/mylvmbackup-0.13.tar.gz<br />
[root@HA1 ~]# tar xzvf mylvmbackup-0.13.tar.gz<br />
[root@HA1 ~]# cd mylvmbackup-0.13<br />
[root@HA1 mylvmbackup-0.13]# make install<br />
[root@HA1 mylvmbackup-0.13]# cd ..</p>
<p>配置mylvmbackup：<br />
[root@HA1 ~]# vi /etc/mylvmbackup.conf</p>
<p>[mysql]<br />
user=root<br />
password=<br />
host=localhost<br />
port=3306<br />
socket=<span style="color: #ff0000;">/data/mysql/mysql.sock</span><br />
mycnf=/etc/my.cnf</p>
<p>#<br />
# LVM-specific options<br />
#<br />
[lvm]<br />
vgname=<span style="color: #ff0000;">dataVg</span><br />
lvname=<span style="color: #ff0000;">dataLv</span><br />
backuplv=<span style="color: #ff0000;">backupLv</span><br />
lvsize=<span style="color: #ff0000;">0.45G</span></p>
<p>#<br />
# File system specific options<br />
#<br />
[fs]<br />
xfs=0<br />
mountdir=<span style="color: #ff0000;">/var/tmp/mylvmbackup/mnt/</span><br />
backupdir=<span style="color: #ff0000;">/var/tmp/mylvmbackup/backup/</span><br />
relpath=</p>
<p><span style="color: #0000ff;">注意修改上面标红的配置项。</span></p>
<p>创建下面目录：<br />
[root@HA1 ~]# mkdir -p  /var/tmp/mylvmbackup/backup<br />
[root@HA1 ~]# mkdir -p  /var/tmp/mylvmbackup/mnt</p>
<p>查看数据库情况（employees库使用InnoDB 引擎）：<br />
[root@HA1 ~]# mysql<br />
Welcome to the MySQL monitor.  Commands end with ; or g.<br />
Your MySQL connection id is 8<br />
Server version: 5.0.77 Source distribution</p>
<p>Type &#8216;help;&#8217; or &#8216;h&#8217; for help. Type &#8216;c&#8217; to clear the buffer.</p>
<p>mysql&gt; show databases;<br />
+&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211;+<br />
| Database           |<br />
+&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211;+<br />
| information_schema |<br />
| employees          |<br />
| mysql              |<br />
+&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211;+<br />
3 rows in set (0.01 sec)</p>
<p>mysql&gt; use employees;<br />
Reading table information for completion of table and column names<br />
You can turn off this feature to get a quicker startup with -A</p>
<p>Database changed<br />
mysql&gt; show engines;<br />
+&#8212;&#8212;&#8212;&#8212;+&#8212;&#8212;&#8212;+&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;-+<br />
| Engine     | Support | Comment                                                        |<br />
+&#8212;&#8212;&#8212;&#8212;+&#8212;&#8212;&#8212;+&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;-+<br />
| MyISAM     | DEFAULT | Default engine as of MySQL 3.23 with great performance         |<br />
| MEMORY     | YES     | Hash based, stored in memory, useful for temporary tables      |<br />
| InnoDB     | YES     | Supports transactions, row-level locking, and foreign keys     |<br />
| BerkeleyDB | YES     | Supports transactions and page-level locking                   |<br />
| BLACKHOLE  | NO      | /dev/null storage engine (anything you write to it disappears) |<br />
| EXAMPLE    | NO      | Example storage engine                                         |<br />
| ARCHIVE    | NO      | Archive storage engine                                         |<br />
| CSV        | NO      | CSV storage engine                                             |<br />
| ndbcluster | NO      | Clustered, fault-tolerant, memory-based tables                 |<br />
| FEDERATED  | NO      | Federated MySQL storage engine                                 |<br />
| MRG_MYISAM | YES     | Collection of identical MyISAM tables                          |<br />
| ISAM       | NO      | Obsolete storage engine                                        |<br />
+&#8212;&#8212;&#8212;&#8212;+&#8212;&#8212;&#8212;+&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;-+<br />
12 rows in set (0.00 sec)</p>
<p>mysql&gt; show tables;<br />
+&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;+<br />
| Tables_in_employees |<br />
+&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;+<br />
| departments         |<br />
| dept_emp            |<br />
| dept_manager        |<br />
| employees           |<br />
| salaries            |<br />
| titles              |<br />
+&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;+<br />
6 rows in set (0.00 sec)</p>
<p>mysql&gt; select count(*) from employees;<br />
+&#8212;&#8212;&#8212;-+<br />
| count(*) |<br />
+&#8212;&#8212;&#8212;-+<br />
|   300024 |<br />
+&#8212;&#8212;&#8212;-+<br />
1 row in set (1.94 sec)</p>
<p>mysql&gt; quit<br />
Bye</p>
<p>lvm快照备份数据库：<br />
[root@HA1 ~]# mylvmbackup<br />
20091125 14:50:10 Info: Connecting to database&#8230;<br />
20091125 14:50:10 Info: <span style="color: #ff0000;">Flushing tables with read lock&#8230;   # 锁定库表，准备备份</span><br />
20091125 14:50:10 Info: <span style="color: #9900ff;">Taking position record into /tmp/mylvmbackup-backup-20091125_145009_mysql-odzMgs.pos&#8230;    # 如开启bin-log则记录日志位置信息</span><br />
20091125 14:50:10 Info: Running: lvcreate -s &#8211;size=0.45G &#8211;name=backupLv /dev/dataVg/dataLv<br />
File descriptor 4 (socket:[21544]) leaked on lvcreate invocation. Parent PID 6062: /usr/bin/perl<br />
Rounding up size to full physical extent 464.00 MB<br />
Logical volume &#8220;backupLv&#8221; created<br />
20091125 14:50:13 Info: <span style="color: #0000ff;">DONE: taking LVM snapshot    # 只需3s完成lvm快照备份</span><br />
20091125 14:50:13 Info: <span style="color: #ff0000;">Unlocking tables&#8230;    # 完成备份，解除锁定，至此数据库完全恢复正常访问</span><br />
20091125 14:50:13 Info: Disconnecting from database&#8230;<br />
20091125 14:50:13 Info: Mounting snapshot&#8230;<br />
20091125 14:50:13 Info: Running: mount -o rw /dev/dataVg/backupLv /var/tmp/mylvmbackup/mnt/backup<br />
20091125 14:50:13 Info: DONE: mount snapshot<br />
20091125 14:50:13 Info: Copying /tmp/mylvmbackup-backup-20091125_145009_mysql-odzMgs.pos to /var/tmp/mylvmbackup/mnt/backup-pos/backup-20091125_145009_mysql.pos&#8230;<br />
20091125 14:50:13 Info: Copying /etc/my.cnf to /var/tmp/mylvmbackup/mnt/backup-pos/backup-20091125_145009_mysql_my.cnf&#8230;<br />
20091125 14:50:13 Info: Taking actual backup&#8230;<br />
20091125 14:50:13 Info: Creating tar archive /var/tmp/mylvmbackup/backup/backup-20091125_145009_mysql.tar.gz<br />
20091125 14:50:13 Info: Running: cd &#8216;/var/tmp/mylvmbackup/mnt&#8217; ;&#8217;tar&#8217; cvf &#8211; backup/  backup-pos/backup-20091125_145009_mysql.pos backup-pos/backup-20091125_145009_mysql_my.cnf| gzip &#8211;stdout &#8211;verbose &#8211;best -&gt; /var/tmp/mylvmbackup/backup/backup-20091125_145009_mysql.tar.gz.INCOMPLETE-54lIVbU<br />
backup/<br />
backup/lost+found/<br />
backup/logs/<br />
backup/logs/www.access.log<br />
backup/logs/error.log<br />
backup/backup/<br />
backup/backup/cib.xml<br />
backup/backup/ifcfg-lo:0<br />
backup/mysql/<br />
backup/mysql/ib_logfile0<br />
tar: backup/mysql/mysql.sock: socket ignored<br />
backup/mysql/employees/<br />
backup/mysql/employees/departments.frm<br />
backup/mysql/employees/dept_emp.frm<br />
backup/mysql/employees/salaries.frm<br />
backup/mysql/employees/employees.frm<br />
backup/mysql/employees/db.opt<br />
backup/mysql/employees/dept_manager.frm<br />
backup/mysql/employees/titles.frm<br />
backup/mysql/ib_logfile1<br />
backup/mysql/mysql/<br />
backup/mysql/mysql/help_category.MYD<br />
backup/mysql/mysql/help_topic.MYI<br />
backup/mysql/mysql/help_relation.MYD<br />
backup/mysql/mysql/db.frm<br />
backup/mysql/mysql/time_zone.frm<br />
backup/mysql/mysql/time_zone.MYD<br />
backup/mysql/mysql/time_zone_transition.MYI<br />
backup/mysql/mysql/columns_priv.MYI<br />
backup/mysql/mysql/tables_priv.frm<br />
backup/mysql/mysql/host.MYD<br />
backup/mysql/mysql/procs_priv.MYI<br />
backup/mysql/mysql/proc.frm<br />
backup/mysql/mysql/user.MYD<br />
backup/mysql/mysql/db.MYI<br />
backup/mysql/mysql/time_zone_name.MYI<br />
backup/mysql/mysql/time_zone.MYI<br />
backup/mysql/mysql/func.MYI<br />
backup/mysql/mysql/help_keyword.MYI<br />
backup/mysql/mysql/help_topic.MYD<br />
backup/mysql/mysql/procs_priv.MYD<br />
backup/mysql/mysql/db.MYD<br />
backup/mysql/mysql/time_zone_name.MYD<br />
backup/mysql/mysql/host.MYI<br />
backup/mysql/mysql/time_zone_leap_second.frm<br />
backup/mysql/mysql/time_zone_transition_type.MYD<br />
backup/mysql/mysql/time_zone_transition_type.MYI<br />
backup/mysql/mysql/help_relation.MYI<br />
backup/mysql/mysql/time_zone_leap_second.MYI<br />
backup/mysql/mysql/help_keyword.MYD<br />
backup/mysql/mysql/user.frm<br />
backup/mysql/mysql/func.MYD<br />
backup/mysql/mysql/tables_priv.MYI<br />
backup/mysql/mysql/tables_priv.MYD<br />
backup/mysql/mysql/time_zone_transition.frm<br />
backup/mysql/mysql/user.MYI<br />
backup/mysql/mysql/help_category.frm<br />
backup/mysql/mysql/procs_priv.frm<br />
backup/mysql/mysql/columns_priv.MYD<br />
backup/mysql/mysql/help_category.MYI<br />
backup/mysql/mysql/help_keyword.frm<br />
backup/mysql/mysql/time_zone_leap_second.MYD<br />
backup/mysql/mysql/proc.MYI<br />
backup/mysql/mysql/proc.MYD<br />
backup/mysql/mysql/time_zone_transition_type.frm<br />
backup/mysql/mysql/time_zone_transition.MYD<br />
backup/mysql/mysql/func.frm<br />
backup/mysql/mysql/time_zone_name.frm<br />
backup/mysql/mysql/host.frm<br />
backup/mysql/mysql/help_relation.frm<br />
backup/mysql/mysql/help_topic.frm<br />
backup/mysql/mysql/columns_priv.frm<br />
backup/mysql/ibdata1<br />
backup/html/<br />
backup/html/www.baihe.com/<br />
backup/html/www.baihe.com/test.html<br />
backup/html/www.baihe.com/index.html<br />
backup-pos/backup-20091125_145009_mysql.pos<br />
backup-pos/backup-20091125_145009_mysql_my.cnf<br />
64.0%<br />
20091125 14:56:00 Info: DONE: create tar archive<br />
20091125 14:56:01 Info: Cleaning up&#8230;<br />
20091125 14:56:01 Info: Running: umount /var/tmp/mylvmbackup/mnt/backup<br />
20091125 14:56:02 Info: DONE: Unmounting /var/tmp/mylvmbackup/mnt/backup<br />
20091125 14:56:02 Info: LVM Usage stats:<br />
20091125 14:56:02 Info:   LV       VG     Attr   LSize   Origin Snap%  Move Log Copy%  Convert<br />
20091125 14:56:02 Info:   backupLv dataVg swi-a- 464.00M dataLv   0.09<br />
20091125 14:56:02 Info: Running: lvremove -f /dev/dataVg/backupLv<br />
Logical volume &#8220;backupLv&#8221; successfully removed<br />
20091125 14:56:03 Info: DONE: Removing snapshot</p>
<p>[root@HA1 ~]# cd /var/tmp/mylvmbackup/backup<br />
You have new mail in /var/spool/mail/root<br />
[root@HA1 backup]# ls<br />
backup-20091125_145009_mysql.tar.gz</p>
<p>[root@HA1 backup]# scp backup-20091125_145009_mysql.tar.gz HA2:/root/<br />
root@ha2&#8217;s password:<br />
backup-20091125_145009_mysql.tar.gz                                         100%   80MB 799.2KB/s   01:42</p>
<p>在HA2上进行有效性验证：<br />
[root@HA2 data]# tar xzvf /root/backup-20091125_145009_mysql.tar.gz</p>
<p>[root@HA2 data]# ls<br />
backup  backup-pos  lost+found<br />
You have new mail in /var/spool/mail/root<br />
[root@HA2 data]# cd backup<br />
[root@HA2 backup]# ls<br />
backup  html  logs  lost+found  mysql<br />
[root@HA2 backup]# mv mysql/ ..</p>
<p>[root@HA2 backup]# cd ..</p>
<p>[root@HA2 data]# service mysqld start<br />
Starting MySQL:                                            [  OK  ]<br />
[root@HA2 data]# mysql<br />
Welcome to the MySQL monitor.  Commands end with ; or g.<br />
Your MySQL connection id is 2<br />
Server version: 5.0.77 Source distribution</p>
<p>Type &#8216;help;&#8217; or &#8216;h&#8217; for help. Type &#8216;c&#8217; to clear the buffer.</p>
<p>mysql&gt; show databases;<br />
+&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211;+<br />
| Database           |<br />
+&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211;+<br />
| information_schema |<br />
| employees          |<br />
| mysql              |<br />
+&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211;+<br />
3 rows in set (0.00 sec)</p>
<p>mysql&gt; use employees;<br />
Reading table information for completion of table and column names<br />
You can turn off this feature to get a quicker startup with -A</p>
<p>Database changed<br />
mysql&gt; show tables;<br />
+&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;+<br />
| Tables_in_employees |<br />
+&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;+<br />
| departments         |<br />
| dept_emp            |<br />
| dept_manager        |<br />
| employees           |<br />
| salaries            |<br />
| titles              |<br />
+&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;+<br />
6 rows in set (0.00 sec)</p>
<p>mysql&gt; select count(*) from employees;<br />
+&#8212;&#8212;&#8212;-+<br />
| count(*) |<br />
+&#8212;&#8212;&#8212;-+<br />
|   300024 |<br />
+&#8212;&#8212;&#8212;-+<br />
1 row in set (0.58 sec)</p>
<p>mysql&gt;</p>
<p>四、配置数据库主从复制：</p>
<p>HA1（主）</p>
<p>配置mysql<br />
[root@HA1 ~]# cat /etc/my.cnf<br />
[mysqld]<br />
datadir=/data/mysql<br />
socket=/data/mysql/mysql.sock<br />
user=mysql<br />
# Default to using old password format for compatibility with mysql 3.x<br />
# clients (those using the mysqlclient10 compatibility package).<br />
old_passwords=1</p>
<p>log-bin=/data/mysql/log/mysql-bin.log<br />
server-id=1</p>
<p>[mysqld_safe]<br />
log-error=/data/mysql/log/mysqld.log<br />
pid-file=/var/run/mysqld/mysqld.pid</p>
<p>[mysql]<br />
socket=/data/mysql/mysql.sock</p>
<p>如果对配置文件有改动需要重启MySQL。</p>
<p>lvm快照备份数据库：<br />
[root@HA1 backup]# mylvmbackup</p>
<p>拷贝备份文件到HA2<br />
[root@HA1 backup]# scp backup-20091125_155132_mysql.tar.gz HA2:/root/<br />
root@ha2&#8217;s password:<br />
backup-20091125_155132_mysql.tar.gz                                         100%   80MB   1.2MB/s   01:07</p>
<p>在主库上添加同步账户：<br />
[root@HA1 backup]# mysql<br />
Welcome to the MySQL monitor.  Commands end with ; or g.<br />
Your MySQL connection id is 5<br />
Server version: 5.0.77-log Source distribution</p>
<p>Type &#8216;help;&#8217; or &#8216;h&#8217; for help. Type &#8216;c&#8217; to clear the buffer.</p>
<p>mysql&gt; GRANT REPLICATION SLAVE ON *.* TO &#8216;rep&#8217;@'192.168.10.%&#8217; IDENTIFIED BY &#8217;slavepass&#8217;;</p>
<p>HA2（从）</p>
<p>解压主库备份数据文件到从库数据目录：<br />
[root@HA2 data]# tar xzvf /root/backup-20091125_155132_mysql.tar.gz</p>
<p>拷贝数据文件到mysql数据目录：<br />
[root@HA2 data]# mv backup/mysql/ .</p>
<p>查看备份时mysql日志位置：<br />
[root@HA2 data]# cat backup-pos/backup-20091125_155132_mysql.pos<br />
Master:File=mysql-bin.000001<br />
Master:Position=244<br />
Master:Binlog_Do_DB=<br />
Master:Binlog_Ignore_DB=</p>
<p>修改mysql配置文件：<br />
[root@HA2 data]# cat /etc/my.cnf<br />
[mysqld]<br />
datadir=/data/mysql<br />
socket=/data/mysql/mysql.sock<br />
user=mysql<br />
# Default to using old password format for compatibility with mysql 3.x<br />
# clients (those using the mysqlclient10 compatibility package).<br />
old_passwords=1</p>
<p>server-id=2</p>
<p>[mysqld_safe]<br />
log-error=/data/mysql/log/mysqld.log<br />
pid-file=/var/run/mysqld/mysqld.pid</p>
<p>[mysql]<br />
socket=/data/mysql/mysql.sock</p>
<p>启动MySQL：<br />
[root@HA2 log]# service mysqld start<br />
Starting MySQL:                                            [  OK  ]</p>
<p>配置mysql从库：<br />
[root@HA2 log]# mysql<br />
Welcome to the MySQL monitor.  Commands end with ; or g.<br />
Your MySQL connection id is 4<br />
Server version: 5.0.77 Source distribution</p>
<p>Type &#8216;help;&#8217; or &#8216;h&#8217; for help. Type &#8216;c&#8217; to clear the buffer.</p>
<p>mysql&gt; CHANGE MASTER TO<br />
-&gt; MASTER_HOST=&#8217;192.168.10.1&#8242;,<br />
-&gt; MASTER_USER=&#8217;rep&#8217;,<br />
-&gt; MASTER_PASSWORD=&#8217;slavepass&#8217;,<br />
-&gt; MASTER_LOG_FILE=&#8217;mysql-bin.000001&#8242;,<br />
-&gt; MASTER_LOG_POS=244;<br />
Query OK, 0 rows affected (0.00 sec)</p>
<p>mysql&gt; slave start;<br />
Query OK, 0 rows affected (0.00 sec)</p>
<p>mysql&gt; show slave statusG<br />
*************************** 1. row ***************************<br />
Slave_IO_State: Waiting for master to send event<br />
Master_Host: 192.168.10.1<br />
Master_User: rep<br />
Master_Port: 3306<br />
Connect_Retry: 60<br />
Master_Log_File: mysql-bin.000002<br />
Read_Master_Log_Pos: 500<br />
Relay_Log_File: mysqld-relay-bin.000003<br />
Relay_Log_Pos: 637<br />
Relay_Master_Log_File: mysql-bin.000002<br />
Slave_IO_Running: <span style="color: #ff0000;">Yes</span><br />
Slave_SQL_Running: <span style="color: #ff0000;">Yes</span><br />
Replicate_Do_DB:<br />
Replicate_Ignore_DB:<br />
Replicate_Do_Table:<br />
Replicate_Ignore_Table:<br />
Replicate_Wild_Do_Table:<br />
Replicate_Wild_Ignore_Table:<br />
Last_Errno: 0<br />
Last_Error:<br />
Skip_Counter: 0<br />
Exec_Master_Log_Pos: 500<br />
Relay_Log_Space: 637<br />
Until_Condition: None<br />
Until_Log_File:<br />
Until_Log_Pos: 0<br />
Master_SSL_Allowed: No<br />
Master_SSL_CA_File:<br />
Master_SSL_CA_Path:<br />
Master_SSL_Cert:<br />
Master_SSL_Cipher:<br />
Master_SSL_Key:<br />
Seconds_Behind_Master: 0<br />
1 row in set (0.00 sec)</p>
<p>mysql&gt; quit<br />
Bye</p>
<p>验证同步配置情况：<br />
在HA1上插入一条数据：<br />
[root@HA1 ~]# mysql<br />
Welcome to the MySQL monitor.  Commands end with ; or g.<br />
Your MySQL connection id is 62<br />
Server version: 5.0.77-log Source distribution</p>
<p>Type &#8216;help;&#8217; or &#8216;h&#8217; for help. Type &#8216;c&#8217; to clear the buffer.</p>
<p>mysql&gt; use employees;<br />
Reading table information for completion of table and column names<br />
You can turn off this feature to get a quicker startup with -A</p>
<p>Database changed<br />
mysql&gt; insert into employees values (66666666,&#8217;1982-10-17&#8242;,&#8217;Shi&#8217;,'Dongliang&#8217;,&#8221;M&#8221;,&#8217;2008-06-01&#8242;) ;<br />
Query OK, 1 row affected (0.03 sec)</p>
<p>在HA2上查询，看同步情况：<br />
[root@HA2 data]# mysql<br />
Welcome to the MySQL monitor.  Commands end with ; or g.<br />
Your MySQL connection id is 7<br />
Server version: 5.0.77 Source distribution</p>
<p>Type &#8216;help;&#8217; or &#8216;h&#8217; for help. Type &#8216;c&#8217; to clear the buffer.</p>
<p>mysql&gt; use employees;<br />
Reading table information for completion of table and column names<br />
You can turn off this feature to get a quicker startup with -A</p>
<p>Database changed<br />
mysql&gt; select * from employees where emp_no=66666666;<br />
+&#8212;&#8212;&#8212;-+&#8212;&#8212;&#8212;&#8212;+&#8212;&#8212;&#8212;&#8212;+&#8212;&#8212;&#8212;&#8211;+&#8212;&#8212;&#8211;+&#8212;&#8212;&#8212;&#8212;+<br />
| emp_no   | birth_date | first_name | last_name | gender | hire_date  |<br />
+&#8212;&#8212;&#8212;-+&#8212;&#8212;&#8212;&#8212;+&#8212;&#8212;&#8212;&#8212;+&#8212;&#8212;&#8212;&#8211;+&#8212;&#8212;&#8211;+&#8212;&#8212;&#8212;&#8212;+<br />
| 66666666 | 1982-10-17 | Shi        | Dongliang  | M      | 2008-06-01 |<br />
+&#8212;&#8212;&#8212;-+&#8212;&#8212;&#8212;&#8212;+&#8212;&#8212;&#8212;&#8212;+&#8212;&#8212;&#8212;&#8211;+&#8212;&#8212;&#8211;+&#8212;&#8212;&#8212;&#8212;+<br />
1 row in set (0.04 sec)</p>
<p>不管你使用MyISAM存储引擎还是InnoDB存储引擎，通过LVM快照都很容易得到一个一致的MySQL备份。LVM快照备份MySQL数据时，一但锁定数据库完成只需几秒就可以做一个快照备份，释放表锁，数据库便可完全恢复正常访问，剩下的事情便是压缩数据备份并拷贝到从库进行恢复（根据数据大小，这可能需要很长时间，但基本不会再影响主库了）。</p>
<p>参考：<br />
lvm新手指南：http://www.howtoforge.com/linux_lvm<br />
LVM(逻辑卷管理器)总结：http://www.chinaunix.net/jh/4/258443.html</p>
<h3  class="related_post_title">相关日志</h3><ul class="related_post"><li>2009/03/08 -- <a href="http://www.yoyotown.com/?p=79" title="配置MySQL主从复制(Replication)">配置MySQL主从复制(Replication)</a></li><li>2009/12/11 -- <a href="http://www.yoyotown.com/?p=558" title="MySQL-Nginx-Pacemaker-corosync(openais)-drbd active/passive cluster">MySQL-Nginx-Pacemaker-corosync(openais)-drbd active/passive cluster</a></li><li>2009/12/07 -- <a href="http://www.yoyotown.com/?p=498" title="LVM快照（snapshot）备份">LVM快照（snapshot）备份</a></li><li>2009/03/08 -- <a href="http://www.yoyotown.com/?p=91" title="MySQL 备份和恢复策略（三）">MySQL 备份和恢复策略（三）</a></li><li>2009/03/08 -- <a href="http://www.yoyotown.com/?p=87" title="MySQL 备份和恢复策略（二）">MySQL 备份和恢复策略（二）</a></li></ul>]]></content:encoded>
			<wfw:commentRss>http://www.yoyotown.com/?feed=rss2&amp;p=501</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>


<!-- www.Host1Free.com Counter Code -->
<noscript>
<a href="http://www.host1free.com/" title="Free Hosting">Free Hosting</a>
<a href="http://www.host1free.com/web-hosting" title="Free Web Hosting Service">Free Hosting</a>
</noscript>
<!-- End of www.Host1Free.com Counter Code -->
