一、准备工作。
1. 首先建立好两台虚拟机, 一台为 ip192.168.0.77 node1.a.org 另一台为 ip192.168.0.79 node2.a.org 按照ip地址配置主机名。在node1上
vim /etc/hosts 192.168.0.77 node1.a.org node1 192.168.0.79 node2.a.org node2vim /etc/sysconfig/network
HOSTNAME=node1.a.org#hostname node1.a.org
在node2上也做同样的配置
vim /etc/hosts 192.168.0.77 node1.a.org node1 192.168.0.79 node2.a.org node2vim /etc/sysconfig/network
HOSTNAME=node2.a.org#hostname node2.a.org
当修改完之后使用uname -n查看结果是不是一样
2.
建立一个分区来存放数据。 此时我在node1和node2的两个虚拟机上各建立一个分区。 建立好之后暂时不要格式化和挂载。只使用下面的命令重读一下就好了。 #partprobe /dev/sda3.
设定两个节点可以基于密钥进行ssh通信 在node1上 # ssh-keygen -t rsa # ssh-copy-id -i ~/.ssh/id_rsa.pub 在node2上 # ssh-keygen -t rsa # ssh-copy-id -i ~/.ssh/id_rsa.pub 4. 下载软件包,这里为了方便起见我们使用rpm包的形式安装 cluster-glue-1.0.6-1.6.el5.i386.rpm cluster-glue-libs-1.0.6-1.6.el5.i386.rpm corosync-1.2.7-1.1.el5.i386.rpm corosynclib-1.2.7-1.1.el5.i386.rpm heartbeat-3.0.3-2.3.el5.i386.rpm heartbeat-libs-3.0.3-2.3.el5.i386.rpm libesmtp-1.0.4-5.el5.i386.rpm openais-1.1.3-1.6.el5.i386.rpm openaislib-1.1.3-1.6.el5.i386.rpm pacemaker-1.0.11-1.2.el5.i386.rpm pacemaker-libs-1.0.11-1.2.el5.i386.rpm perl-TimeDate-1.16-5.el5.noarch.rpm resource-agents-1.0.4-1.1.el5.i386.rpmdrbd83-8.3.8-1.el5.centos.i386.rpm
kmod-drbd83-8.3.8-1.el5.centos.i686.rpm5.
在每一台机器上安装web服务 yum install httpd -y 并在node1上设置网页 echo "<h1>Node1.a.org</h1>" > /var/www/html/index.html在node2上安装web服务和设置网页
yum -y install httpd echo "<h1>Node2.a.org</h1>" > /var/www/html/index.html 6. 为了避免出现很诡异的错误,最好关闭selinux setenforce 0 二、 corosync软件的安装,与配置。 以下操作如不特殊说明,表示在两台机器上执行同样操作。 1. 安装软件, yum -y --nogpgcheck localinstall *.rpm2.配置corosync
cd /etc/corosync cp corosync.conf.example corosync.confvim corosync.conf
bindnetaddr: 192.168.0.0 //由于我的是192.168.0.66等,所以这里
网段要设置成192.168.0.0 并添加如下内容。 service { ver: 0 name: pacemaker }aisexec {
user: root group: root } 此时两个节点间如果传输数据的时候都是明文的,此时可以设置通信时加密传输
此时只在node1上设置
cd /etc/corosync corosync-keygen 为了避免错误,可以把node1上生成的拷贝到node2上,避免人为的输入错误。 scp -p corosync.conf authkey node2:/etc/corosync/拷贝过后就不用再在node2上手动加密了。
为俩个节点创建日志生成目录。
mkdir /var/log/cluster ssh node2 'mkdir /var/log/cluster' 此时只在node1上尝试启动corosync # /etc/init.d/corosync start查看corosync引擎是否正常启动:
# grep -e "Corosync Cluster Engine" -e "configuration file" /var/log/messages查看初始化成员节点通知是否正常发出:
# grep TOTEM /var/log/messages检查启动过程中是否有错误产生:
# grep ERROR: /var/log/messages | grep -v unpack_resources 这里没有信息就是最好的信息。 查看pacemaker是否正常启动: # grep pcmk_startup /var/log/messages 如果上面命令执行均没有问题,接着可以执行如下命令启动node2上的corosync # ssh node2 -- /etc/init.d/corosync start这里启动node2一定要在node1上启动,否则会出问题。
使用如下命令查看集群节点的启动状态:
crm statusOnline: [ node1.a.org node2.a.org ]
如果看到这一行说明,两者都在线了,安装顺利进行。 配置集群的工作属性,禁用stonith corosync默认启用了stonith,而当前集群并没有相应的stonith设备,因此此默认配置目前尚不可用 crm_verify -L 使用此命令查看你会看到很多错误信息。此时我们可以使用下面的命令来禁用stonith crm configure property stonith-enabled=false查看配置信息
crm configure show如果出现下面的信息说明禁用成功了。
stonith-enabled="false"为集群添加集群资源
可以通过如下命令查看当前集群系统所支持的类型: # crm ra classes heartbeat lsb ocf / heartbeat pacemaker stonith我们这里可以为接下来要创建的web集群创建一个IP地址资源,以在通过集群提供web服务时使用;这可以通过如下方式实现:
crm configure primitive WebIP ocf:heartbeat:IPaddr params ip=192.168.0.66
通过如下的命令执行结果可以看出此资源已经在node1.a.org上启动:
# crm statusOnline: [ node1.a.org node2.a.org ]
WebIP (ocf::heartbeat:IPaddr): Started node1.a.org
此时你可以使用ifconfig来查看你设定的web ip192.168.0.66已经在node1上了。 而后我们到node2上通过如下命令停止node1上的corosync服务: ssh node1 -- /etc/init.d/corosync stop查看集群工作状态:
crm status此时会看到node1已经离线了。
Online: [ node2.a.org ] OFFLINE: [ node1.a.org ] 上面的信息显示node1.a.org已经离线,但资源WebIP却没能在node2.a.org上启动。这是因为此时的集群状态为"WITHOUT quorum",即已经失去了quorum,此时集群服务本身已经不满足正常运行的条件,这对于只有两节点的集群来讲是不合理的。因此,我们可以通过如下的命令来修改忽略quorum不能满足的集群状态检查:crm configure property no-quorum-policy=ignore
此时你再使用
crm status查看是否webip已经在node2上了呢? Online: [ node2.a.org ] OFFLINE: [ node1.a.org ]WebIP (ocf::heartbeat:IPaddr): Started node2.a.org
启动node1.a.org后,集群资源WebIP很可能会重新从node2.a.org转移回node1.a.org。资源的这种在节点间每一次的来回流动都会造成那段时间内其无法正常被访问,所以,我们有时候需要在资源因为节点故障转移到其它节点后,即便原来的节点恢复正常也禁止资源再次流转回来。这可以通过定义资源的黏性(stickiness)来实现。在创建资源时或在创建资源后,都可以指定指定资源黏性。
我们这里可以通过以下方式为资源指定默认黏性值: crm configure rsc_defaults resource-stickiness=100 定义粘性值为100,越大表示资源越不愿意离开。下面结合web来实现一个active/passive模型的web(httpd)服务集群
在各个节点手动启动web服务器,并访问刚才建立的网页看是否正常使用
在node1上,node2上同样操作不再演示。 service httpd start elinks --dump此时如果node1的,和node2的都正常访问的话使用如下命令关闭web服务,并确保开机不会自动启动。
两边同样的操作。 # /etc/init.d/httpd stop # chkconfig httpd off接下来我们将此httpd服务添加为集群资源。将httpd添加为集群资源有两处资源代理可用:lsb和ocf:heartbeat,为了简单起见,我们这里使用lsb类型:
首先可以使用如下命令查看lsb类型的httpd资源的语法格式:
# crm ra info lsb:httpd lsb:httpdApache is a World Wide Web server. It is used to serve \
HTML files and CGI.Operations' defaults (advisory minimum):
start timeout=15
stop timeout=15 status timeout=15 restart timeout=15 force-reload timeout=15 monitor interval=15 timeout=15 start-delay=15 接下来新建资源WebSite: crm configure primitive WebSite lsb:httpd查看资源的启用状态:
# crm status Online: [ node1.a.org node2.a.org ]WebIP (ocf::heartbeat:IPaddr): Started node1.a.org
WebSite (lsb:httpd): Started node2.a.org上面的信息中可以看出WebIP和WebSite有可能会分别运行于两个节点上,这对于通过此IP提供Web服务的应用来说是不成立的,即此两者资源必须同时运行在某节点上。
可以通过以下命令来解决:
# crm configure colocation website-with-ip INFINITY: WebSite WebIP我们还得确保WebSite在某节点启动之前得先启动WebIP,这可以使用如下命令实现:
# crm configure order httpd-after-ip mandatory: WebIP WebSite 三、 此时建立drbd 建立一个分区来存放数据。 此时我在node1和node2的两个虚拟机上各建立一个分区。 建立好之后暂时不要格式化和挂载。只使用下面的命令重读一下就好了。 #partprobe /dev/sda由于我们在一开始已经安装过drbd的软件包了,所以这里直接配置。
1.复制样例配置文件为即将使用的配置文件:
# cp /usr/share/doc/drbd83-8.3.8/drbd.conf /etc2.修改配置文件
vim /etc/drbd.d/global-common.confcommon {
protocol C;handlers {
pri-on-incon-degr "/usr/lib/drbd/notify-pri-on-incon-degr.sh; /usr/lib/drbd/notify-emergency-reboot.sh; echo b > /proc/sysrq-trigger ; reboot -f"; pri-lost-after-sb "/usr/lib/drbd/notify-pri-lost-after-sb.sh; /usr/lib/drbd/notify-emergency-reboot.sh; echo b > /proc/sysrq-trigger ; reboot -f"; local-io-error "/usr/lib/drbd/notify-io-error.sh; /usr/lib/drbd/notify-emergency-shutdown.sh; echo o > /proc/sysrq-trigger ; halt -f"; fence-peer "/usr/lib/drbd/crm-fence-peer.sh"; split-brain "/usr/lib/drbd/notify-split-brain.sh root"; out-of-sync "/usr/lib/drbd/notify-out-of-sync.sh root"; before-resync-target "/usr/lib/drbd/snapshot-resync-target-lvm.sh -p 15 -- -c 16k"; after-resync-target /usr/lib/drbd/unsnapshot-resync-target-lvm.sh; }startup {
wfc-timeout 120; 定义超时时间 degr-wfc-timeout 120; }disk {
on-io-error detach; 一旦出现错误,直接拆卸 fencing resource-only; }net {
cram-hmac-alg "sha1"; 使用sha1的算法进行加密传输数据 shared-secret "redhat"; 密码为引号里面的内容。可以自己写 }syncer {
rate 100M; 两机器之间同步时传输速率为100M } 3.定义资源,内容如下。web为资源名,必须要以.res结尾。 vim /etc/drbd.d/web.res resource web { on node1.a.org { device /dev/drbd0; 在本地表示为哪个设备 disk /dev/sda5; 使用你建立的那个分区。 address 192.168.0.77:7789; 默认监听在7789端口,地址为192.168.0.77。 meta-disk internal; 表示在本地分区里面存储他的源数据。 } on node2.a.org { device /dev/drbd0; disk /dev/sda5; address 192.168.0.79:7789; meta-disk internal; } }4.初始化资源,在Node1和Node2上分别执行:
# drbdadm create-md webWriting meta data...
initializing activity log NOT initialized bitmap New drbd meta data block successfully created. 只有两边都出现successfully才说明成功。如果出现如下错误,可能是你在建立分区后没有重读磁盘可以使用partprobe /dev/sda来重读一下
drbd.d/web.res:1: Parse error: 'global | common | resource | skip | include'****ource 5.启动服务,在Node1和Node2上分别执行: /etc/init.d/drbd start6.使用如下命令查看结果
# cat /proc/drbd version: 8.3.8 (api:88/proto:86-94) GIT-hash: d78846e52224fd00562f7c225bcc25b2d422321d build by , 2010-06-04 08:04:16 0: cs:Connected ro:Secondary/Secondary ds:Inconsistent/Inconsistent C r---- ns:0 nr:0 dw:0 dr:0 al:0 bm:0 lo:0 pe:0 ua:0 ap:0 ep:1 wo:b oos:1959800此时看到两者都是Secondary/Secondary
7.此时我们把node1设置为Primary状态。下面的命令必须在node1上执行。
# drbdsetup /dev/drbd0 primary –o
或者使用下面的这个命令,二者功效相同。 # drbdadm -- --overwrite-data-of-peer primary web可以使用如下命令查看同步过程。此时会出现二者的同步过程。
watch -n1 'cat /proc/drbd'此时再次# cat /proc/drbd查看结果
就会看到Secondary/Secondary变为Primary/Secondary其中在node1上查看primary在前表示node1为主节点。如果primary在后表示 node2为主节点。 version: 8.3.8 (api:88/proto:86-94) GIT-hash: d78846e52224fd00562f7c225bcc25b2d422321d build by , 2010-06-04 08:04:16 0: cs:Connected ro:Primary/Secondary ds:UpToDate/UpToDate C r---- ns:1959800 nr:0 dw:0 dr:1959800 al:0 bm:120 lo:0 pe:0 ua:0 ap:0 ep:1 wo:b oos:08.创建文件系统。此时只能在主节点上执行如下操作,在从节点上他会自动同步,所以不比执行相同步骤。
对建立的drbd进行格式化和挂载 # mke2fs -j -L DRBD /dev/drbd0 # mkdir /mnt/drbd # mount /dev/drbd0 /mnt/drbd 9.此时假设如果主节点故障,此时切换Primary/Secondary对主Primary/Secondary模型的drbd服务来讲,在某个时刻只能有一个节点为Primary,因此,要切换两个节点的角色,
只能在先将原有的Primary节点设置为Secondary后,才能原来的Secondary节点设置为Primary:在node1上
cp -r /etc/drbd.* /mnt/drbd umount /mnt/drbd drbdadm secondary web查看状态:
drbd-overview 0:web Connected Secondary/Secondary UpToDate/UpToDate C r----在node2上
drbdadm primary web drbd-overview 0:web Connected Primary/Secondary UpToDate/UpToDate C r---- mkdir /mnt/drbd mount /dev/drbd0 /mnt/drbd使用下面的命令查看在此前在主节点上复制至此设备的文件是否存在1mnt/drbd
四、 使corosync和drbd结合、 关闭node1和node2的drbd在两边都执行。 /etc/init.d/drbd stop chkconfig drbd off查看
drbd-overview 配置drbd为集群资源drbd需要同时运行在两个节点上,但只能有一个节点(primary/secondary模型)是Master,而另一个节点为Slave;因此,
它是一种比较特殊的集群资源,其资源类型为多状态(Multi-state)clone类型,即主机节点有Master和Slave之分, 且要求服务刚启动时两个节点都处于slave状态。crm
configure primitive webdrbd ocf:heartbeat:drbd params drbd_resource=web op monitor role=Master interval=50s timeout=30s op monitor role=Slave interval=60s timeout=30smaster MS_Webdrbd webdrbd meta master-max="1" master-node-max="1" clone-max="2" clone-node-max="1" notify="true"
verify
commit 提交可以模拟集群中一台出现故障
crm node standby
crm status
查看当前集群运行状态:
crm status 会看到如下结果 Online: [ node2.a.org node1.a.org ]Master/Slave Set: MS_Webdrbd
Masters: [ node2.a.org ] Slaves: [ node1.a.org ]由上面的信息可以看出此时的drbd服务的Primary节点为node2.a.org,Secondary节点为node1.a.org。当然,也可以在node2上使用
如下命令验正当前主机是否已经成为web资源的Primary节点:
drbdadm role web为Primary节点上的web资源创建自动挂载的集群服务
crm
configure primitive WebFS ocf:heartbeat:Filesystem params device="/dev/drbd0" directory="/www" fstype="ext3"colocation WebFS_on_MS_webdrbd inf: WebFS MS_Webdrbd:Master
order WebFS_after_MS_Webdrbd inf: MS_Webdrbd:promote WebFS:start
verify
commit此时再次查看一下定义的资源
crm status Online: [ node2.a.org node1.a.org ]Master/Slave Set: MS_Webdrbd
Masters: [ node2.a.org ] Slaves: [ node1.a.org ] WebFS (ocf::heartbeat:Filesystem): Started node2.a.org
参考博客