corosync/openais+pacemaker+drbd+web实现高可用群集

拓扑图:

200219149.png

配置前提:
1.节点的名字必须跟uname -n的名字相同,而且两个主机必须能通过主机名来访问。尽量不通过DNS来访问。时钟时间保持一样。
2.双方的通信要必须通过SSL的无障碍通信机制
3.双节点之间可以通过某个IP来提供连接,但是这只是通信Ip,我们需要VIP来对外提供服务。
4.我采用虚拟机的方式实现配置,操作系统使用rhel5.4,x86平台
5.两个节点主机IP分别为192.168.2.10(node1.a.com),以及192.168.2.20(node2.a.com)
6.集群服务为apache的httpd服务
7.提供Web服务的地址(VIP)为192.168.2.100
8.在两个节点上分别准备一块大小为2G的分区用于实现DRBD的共享。(本文使用新分区/dev/sda4)

node1.a.com 配置
1.准备工作
[root@localhost ~]# vim /etc/sysconfig/network
HOSTNAME=node1.a.com
[root@localhost ~]# hostname node1.a.com
重新登录
[root@localhost ~]# vim /etc/sysconfig/network
HOSTNAME=node2.a.com
[root@localhost ~]# hostname node2.a.com
我们首先要保证两节点之间时间相差不应该超过1秒
[root@node1 ~]# hwclock -s
[root@node2 ~]# hwclock -s
分别在两个节点上设置
# vim /etc/hosts
192.168.2.10 node1.a.com node1
192.168.2.20 node2.a.c node2


生成密钥,确保通信正常
node1节点
[root@node1 ~]# ssh-keygen -t rsa

[root@node1 ~]# cd /root/.ssh
[root@node1 ~]# ssh-copy-id -i ~/.ssh/id_rsa.pub node2
node2节点
[root@node2 ~]# ssh-keygen -t rsa
[root@node2 ~]# ssh-copy-id -i ~/.ssh/id_rsa.pub node1


由于需要用到软件的依赖,这里配置yum,在node1上

[root@node1 ~]# mkdir /mnt/cdrom/

[root@node1 ~]# mount /dev/cdrom /mnt/cdrom/
# vim /etc/yum.repos.d/rhel-debuginfo.repo
200414646.png
[root@node2~]# scp node1:/etc/yum.repos.d/rhel-debuginfo.repo /etc/yum.repos.d/


在node1,node2上安装apache服务,为了测试在node1上创建含’node1.a.com’的index.html文件,在node2上创建’node2.a.com’的index.html确保服务能启动,这里采用yum安装:
# mount /dev/cdrom /mnt/cdrom
# yum install -y httpd
[root@node1 ~]# echo "node1.a.com" >>/var/www/html/index.html //node1上
[root@node2 ~]# echo "node2.a.com" >/var/www/html/index.html //node2上
# service httpd start
# chkconfig httpd on


2.安装所需要的软件包(corosync/openais+pacemaker软件包)

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.1.5-1.1.el5.i386.rpm

pacemaker-cts-1.1.5-1.1.el5.i386.rpm

pacemaker-libs-1.1.5-1.1.el5.i386.rpm

perl-TimeDate-1.16-5.el5.noarch.rpm

resource-agents-1.0.4-1.1.el5.i386.rpm


# yum localinstall -y *.rpm --nogpgcheck
[root@node1 ~]# cd /etc/corosync/
[root@node1 corosync]# cp -p corosync.conf.example corosync.conf
[root@node1 corosync]# vim corosync.conf
10 bindnetaddr: 192.168.145.0 心跳探测
33 service {
34 ver: 0
35 name: pacemaker
36 }
37 aisexec {
38 user: root
39 group: root
40 }

创建目录
#mkdir /var/log/cluster
为了便面其他主机加入该集群,需要认证,生成一个authkey
[root@node1 corosync]# corosync-keygen
Corosync Cluster Engine Authentication key generator.
Gathering 1024 bits for key from /dev/random.
Press keys on your keyboard to generate entropy.
Writing corosync key to /etc/corosync/authkey.
[root@node1 corosync]# ll
总计 28
-rw-r--r-- 1 root root 5384 2010-07-28 amf.conf.example
-r-------- 1 root root 128 10-20 13:02 authkey
-rw-r--r-- 1 root root 540 10-20 12:59 corosync.conf
-rw-r--r-- 1 root root 436 2010-07-28 corosync.conf.example
drwxr-xr-x 2 root root 4096 2010-07-28 service.d
drwxr-xr-x 2 root root 4096 2010-07-28 uidgid.d
拷贝到node2上去 (使用 -p 以保留权限)
[root@node1 corosync]# scp -p authkey corosync.conf node2:/etc/corosync/


在另外的一个节点上创建日志目录
[root@node1 corosync]# ssh node2 'mkdir /var/log/cluster'
在节点上启动服务
[root@node1 corosync]# service corosync start
[root@node1 corosync]# ssh node2 'service corosync start'


验证启动corosync是否正常:
查看corosync引擎是否正常启动
[root@node1 corosync]# grep -i -e "corosync cluster engine" -e "configuration file" /var/log/messages
Oct 30 13:08:39 localhost corosync[32303]: [MAIN ] Corosync Cluster Engine ('1.2.7'): started and ready to provide service.
Oct 30 13:08:39 localhost corosync[32303]:[MAIN] Successfully read main configuration file '/etc/corosync/corosync.conf'.


查看初始化成员节点通知是否发出
[root@node1 corosync]# grep -i totem /var/log/messages
Oct 30 13:08:39 localhost corosync[32303]: [TOTEM ] Initializing transport (UDP/IP).
Oct 30 13:08:39 localhost corosync[32303]:[TOTEM] Initializing transmit/receive security: libtomcrypt SOBER128/SHA1HMAC (mode 0).
Oct 30 13:08:39 localhost corosync[32303]: [TOTEM ] The network interface [192.168.145.100] is now up.
Oct 30 13:08:40 localhost corosync[32303]:[TOTEM] A processor joined or left the membership and a new membership was formed.
Oct 30 13:09:18 localhost corosync[32303]: [TOTEM] A processor joined or left the membership and a new membership was formed.


检查过程中是否有错误产生
[root@node1 corosync]# grep -i error: /var/log/messages |grep -v unpack_resources


查看pacemaker是否正常启动:
[root@node1 corosync]# grep -i pcmk_startup /var/log/messages
Oct 30 13:08:39 localhost corosync[32303]: [pcmk ] info: pcmk_startup: CRM: Initialized
Oct 30 13:08:39 localhost corosync[32303]: [pcmk ] Logging: Initialized pcmk_startup
Oct 30 13:08:39 localhost corosync[32303]: [pcmk ] info: pcmk_startup: Maximum core file size is: 4294967295
Oct 30 13:08:40 localhost corosync[32303]: [pcmk ] info: pcmk_startup: Service: 9
Oct 30 13:08:40 localhost corosync[32303]: [pcmk ] info: pcmk_startup: Local hostname: node1.a.com


将前面的验证步骤在另外一个节点上再次验证一次
在任何一个节点上 查看集群的成员状态
[root@node1 corosync]# crm status
============
Last updated: Sat Oct 30 13:17:52 2013
Stack: openais
Current DC: node1.a.com - partition with quorum
Version: 1.1.5-1.1.el5-01e86afaaa6d4a8c4836f68df80ababd6ca3902f
2 Nodes configured, 2 expected votes
0 Resources configured.
============
Online: [ node1.a.com node2.a.com ]
提供高可用服务
在corosync中,定义服务可以用两种借口
1.图形接口 (使用hb―gui)
2.crm (pacemaker 提供,是一个shell)


[root@node1 corosync]# crm configure show
node node1.a.com
node node2.a.com
property $id="cib-bootstrap-options" \
dc-version="1.1.5-1.1.el5-01e86afaaa6d4a8c4836f68df80ababd6ca3902f" \
cluster-infrastructure="openais" \
expected-quorum-votes="2"

用于查看cib的相关信息
如何验证该文件的语法错误
[root@node1 corosync]# crm_verify -L
crm_verify[32397]: 2013/11/1_13:24:12 ERROR: unpack_resources: Resource start-up disabled since no STONITH resources have been defined
crm_verify[32397]: 2013/11/1_13:24:12 ERROR: unpack_resources: Either configure some or disable STONITH with the stonith-enabled option
crm_verify[32397]: 2013/11/1_13:24:12 ERROR: unpack_resources: NOTE: Clusters with shared data need STONITH to ensure data integrity


Errors found during check: config not valid
-V may provide more details
可以看到有stonith错误,在高可用的环境里面,会禁止实用任何支援
可以禁用stonith
[root@node1 corosync]# crm
crm(live)# configure
crm(live)configure# property stonith-enabled=false
crm(live)configure# commit
crm(live)configure# show
node node1.a.com
node node2.a.com
property $id="cib-bootstrap-options" \
dc-version="1.1.5-1.1.el5-01e86afaaa6d4a8c4836f68df80ababd6ca3902f" \
cluster-infrastructure="openais" \
expected-quorum-votes="2" \
stonith-enabled="false"
再次进行检查
[root@node1 corosync]# crm_verify -L
没有错误了

系统上有专门的stonith命令
stonith -L 显示stonith所指示的类型
crm可以使用交互式模式
可以执行help
保存在cib里面,以xml的格式
集群的资源类型有4种
primitive 本地主资源 (只能运行在一个节点上)
group 把多个资源轨道一个组里面,便于管理
clone 需要在多个节点上同时启用的 (如ocfs2 ,stonith ,没有主次之分)
master 有主次之分,如drbd
ip地址 http服务 共享存储
用资源代理进行配置
ocf lsb的
使用list可以查看
crm(live)# ra
crm(live)ra# classes
heartbeat
lsb
ocf / heartbeat pacemaker
stonith
可以实用list lsb 查看资源代理的脚本
crm(live)ra# list lsb
NetworkManager acpid anacron apmd
atd auditd autofs avahi-daemon
avahi-dnsconfd bluetooth capi conman
corosync cpuspeed crond cups
cups-config-daemon dnsmasq dund firstboot
functions gpm haldaemon halt
heartbeat hidd hplip ip6tables
ipmi iptables irda irqbalance
isdn kdump killall krb524
kudzu lm_sensors logd lvm2-monitor
mcstrans mdmonitor mdmpd messagebus
microcode_ctl multipathd netconsole netfs
netplugd network nfs nfslock
nscd ntpd openais openibd
pacemaker pand pcscd portmap
psacct rawdevices rdisc readahead_early
readahead_later restorecond rhnsd rpcgssd
rpcidmapd rpcsvcgssd saslauthd sendmail
setroubleshoot single smartd sshd
syslog vncserver wdaemon winbind
wpa_supplicant xfs xinetd ypbind
(是/etc/init.d目录下的)
查看ocf的heartbeat
crm(live)ra# list ocf heartbeat
实用info或者meta 用于显示一个资源的详细信息
meta ocf:heartbeat:IPaddr 各个子项用:分开


配置一个资源,可以在configure下面进行配置
1.先资源名字
crm(live)configure# primitive webip ocf:heartbeat:IPaddr params ip=192.168.2.100
2.查看
crm(live)configure# show
node node1.a.com

node node2.a.com

primitive webip ocf:heartbeat:IPaddr \

params ip="192.168.2.100"

property $id="cib-bootstrap-options" \

dc-version="1.1.5-1.1.el5-01e86afaaa6d4a8c4836f68df80ababd6ca3902f" \

cluster-infrastructure="openais" \

expected-quorum-votes="2" \

stonith-enabled="false"

3.提交 crm(live)configure# commit
4.crm(live)# status
============
Last updated: Mon May 7 19:39:37 2012
Stack: openai
Current DC: node1.a.com - partition with quorum
Version: 1.1.5-1.1.el5-01e86afaaa6d4a8c4836f68df80ababd6ca3902f
2 Nodes configured, 2 expected votes
1 Resources configured.
============
Online: [ node1.a.com node2.a.com ]
webIP (ocf::heartbeat:IPaddr): Started node1.a.com
可以看出该资源在node1上启动
5.实用ifconfig 在节点1上进行查看
[root@node1 corosync]# ifconfig

201308175.png

6.定义web服务资源
在两个节点上都要进行安装
安装完毕后,可以查看httpd的lsb脚本
[root@node2 corosync]# crm ra list lsb
或者
crm(live)ra# list lsb
查看httpd的参数
crm(live)ra# meta lsb:httpd
lsb:httpd
Apache 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
定义httpd的资源
crm(live)configure# primitive webserver lsb:httpd
crm(live)configure# show
201343511.png
crm(live)configure# commit

crm(live)configure# en

crm(live)# status

201435142.png

发现httpd已经启动了,但是在node2节点上(高级群集服务资源越来越多,会分布在不同的节点上,以尽量负载均衡)需要约束在同一个节点上,定义成一个组

可以实用 crm(live)configure# help group 查看配置组的帮助 信息
crm(live)configure# help group

201557571.png

定义组
crm(live)configure# group web webip webserver
crm(live)configure# show
201626647.png

因为这里只有两个节点,需要对这两个节点的票数进行关闭

可选的参数有如下 ignore (忽略)
freeze (冻结,表示已经启用的资源继续实用,没有启用的资源不能启用)
stop(默认)
suicide (所有的资源杀掉)

crm(live)configure# property no-quorum-policy=ignore

201825343.png

在次查看群集的状态
crm(live)# status
202247151.png

(现在ip地址和 httpd都已经在node1上了)


lsb之类的服务,一定不能自动启动 chkconfig httpd off
1 .测试,在两个节点上做网页
在节点1 和节点2 上分别创建网页
使用http://群集ip 发现在第一个节点上
2.将节点1 的corosync 服务停止
[root@node1 corosync]# service corosync stop
3. 在节点2上进行观察
[root@node2 corosync]# crm status

202348700.png

202414740.png


DRBD
添加分区
[root@node1 ~]# fdisk /dev/sda
202439354.png
[root@node1~]# partprobe /dev/sda
[root@node1 ~]# cat /proc/partitions
202451584.png
在节点2上做同样配置

安装drbd,用来构建分布式存储。
这里要选用适合自己系统的版本进行安装,我用到的是


软件:

kmod-drbd83-8.3.8-1.el5.centos.i686.rpm

drbd83-8.3.8-1.el5.centos.i386.rp

1.安装DRBD软件

[root@drbd1 ~]# rpm -ivh drbd83-8.3.8-1.el5.centos.i386.rpm //主文件安装

[root@drbd1 ~]# rpm -ivh kmod-drbd83-8.3.8-1.el5.centos.i686.rpm //内核文件安装

2.加载内核

[root@drbd1 ~]# modprobe drbd

3.配置主文件

root@drbd1 ~]# vim /etc/drbd.conf 在末行模式下输入如下命令

:r /usr/share/doc/drbd83-8.3.8/drbd.conf

# You can find an example in /usr/share/doc/drbd.../drbd.conf.example

include "drbd.d/global_common.conf";

include "drbd.d/*.res";

# please have a a look at the example configuration file in

# /usr/share/doc/drbd83/drbd.conf

#

4.配置全局文件

[root@drbd1 ~]# cd /etc/drbd.d

[root@drbd1 drbd.d]# cp global_common.conf global_common.conf.bak //备份文件

[root@drbd1 drbd.d]# vim global_common.conf 修改如下

global {

usage-count no; //取消DRBD使用者统计

# minor-count dialog-refresh disable-ip-verification

}

common {

protocol C; //使用协议C

startup {

wfc-timeout 120; //启动延迟

degr-wfc-timeout 120;

}

disk { //fence防脑裂

on-io-error detach;

fencing resource-only;

}

net {

cram-hmac-alg "sha1"; //主备节点使用的通信算法

shared-secret "mydrbdlab";

}

syncer {

rate 100M; //主备节点同步速率

}

}

5.定义资源

[root@drbd1 ~]# vim web.res

resource web { (资源名称)

on node1.a.com { (节点名)

device /dev/drbd0; (虚拟设备名称)

disk /dev/sda4; (真实设备名)

address 192.168.2.10:7789; (监听自身的IP的地址端口)

meta-disk internal;

}

on node2.a.com {

device /dev/drbd0;

disk /dev/sda4;

address 192.168.2.20:7789;

meta-disk internal;

}

}

6.node2也需要进行同样的配置,配置与node1配置是一样的

node1node2上初始化资源web

[root@drbd1 ~]# drbdadm create-md web

Writing meta data...

initializing activity log

NOT initialized bitmap

New drbd meta data block successfully created.

[root@drbd2 ~]# drbdadm create-md web

Writing meta data...

initializing activity log

NOT initialized bitmap

New drbd meta data block successfully created.

7.启动drbd服务

注意两个节点要一起启动,否则在启动时会处于一直等待状态

[root@drbd1 ~]# service drbd start

[root@drbd2 ~]# service drbd start

8.查看节点状态

在节点一上查看

[root@drbd1 ~]# drbd-overview

0:web Connected Secondary/Secondary Inconsistent/Inconsistent C r----

在节点二上查看

[root@drbd2 ~]# drbd-overview

0:web Connected Secondary/Secondary Inconsistent/Inconsistent C r----

web:资源名

Secondary/Secondary:自身状态/另外节点状态

由上面的两个节点的状态可看到,两个节点都是备用节点,我们需要手动调整

9.drbd1.a.com调整为主节点

[root@drbd1 ~]# drbdadm -- --overwrite-data-of-peer primary web

10.再次查看状态

节点一

[root@drbd1 ~]# drbd-overview

0:web Connected Primary/Secondary UpToDate/UpToDate C r----

节点二

[root@drbd2 ~]# drbd-overview

0:web Connected Secondary/Primary UpToDate/UpToDate C r----

可以看出drbd1.a.com已经成为主节点了

11.在主节点上创建文件系统

[root@drbd1 ~]# mkfs.ext3 -L drbdweb /dev/drbd0 L:卷名

12.测试

1> 在主节点上创建挂载点,挂载后,写入一个文件

[root@drbd1 ~]# mkdir /mnt/drbd

[root@drbd1 ~]# mount /dev/drbd0 /mnt/drbd

[root@drbd1 ~]# cd /mnt/drbd

[root@drbd1 drbd]# touch index.html

[root@drbd1 drbd]# ll

total 16

-rw-r--r-- 1 root root 0 Jan 20 18:09 index.html

drwx------ 2 root root 16384 Jan 20 18:07 lost+found

2> drbd1.a.com配置成从节点,将drbd2.a.com配置成主节点

节点一

[root@drbd1 drbd]# cd

[root@drbd1 ~]# umount /mnt/drbd

[root@drbd1 ~]# drbdadm secondary web

[root@drbd1 ~]# drbdadm role web

Secondary/Primary

[root@drbd1 ~]#

节点二

[root@drbd2 ~]# drbdadm primary web

[root@drbd2 ~]# drbd-overview

0:web Connected Primary/Secondary UpToDate/UpToDate C r----

3> 在节点二挂载,查看是否有内容

[root@drbd2 ~]# mkdir /mnt/drbd

[root@drbd2 ~]# mount /dev/drbd0 /mnt/drbd

[root@drbd2 ~]# ll /mnt/drbd/

total 16

-rw-r--r-- 1 root root 0 Jan 20 18:09 index.html //可以看到已经写入成功

drwx------ 2 root root 16384 Jan 20 18:07


你可能感兴趣的:(drbd,pacemaker,web实现高可用群集)