拓扑图:
配置前提:
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
[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
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
crm(live)configure# commit
crm(live)configure# en
crm(live)# status
发现httpd已经启动了,但是在node2节点上(高级群集服务资源越来越多,会分布在不同的节点上,以尽量负载均衡)需要约束在同一个节点上,定义成一个组
可以实用 crm(live)configure# help group 查看配置组的帮助 信息
crm(live)configure# help group
定义组
crm(live)configure# group web webip webserver
crm(live)configure# show
因为这里只有两个节点,需要对这两个节点的票数进行关闭
可选的参数有如下 ignore (忽略)
freeze (冻结,表示已经启用的资源继续实用,没有启用的资源不能启用)
stop(默认)
suicide (所有的资源杀掉)
crm(live)configure# property no-quorum-policy=ignore
(现在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
DRBD
添加分区
[root@node1 ~]# fdisk /dev/sda
[root@node1~]# partprobe /dev/sda
[root@node1 ~]# cat /proc/partitions
在节点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配置是一样的
在node1 与node2上初始化资源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