高可用集群--Corosync/Openais 的配置

下面以一实例来说明基于Corosync/Openais的高可用集群服务的配置。
环境
2台服务器提供LNMP服务,1NFS服务器为mysql数据库提供共享存储。
集群节点:1、主机名:aydon1IP172.16.13.1,2、主机名:aydon2IP172.16.13.8
NFS服务器:IP172.16.13.6
提供web服务的地址:172.16.13.2
提供mysql服务的地址:172.16.13.3
以上服务器的操作系统均为RHEL5.4 

一、配置NFS服务器

这里将/mydata作为mysql数据的存放目录,因此创建目录/mydata.
#mkdir /mydata
添加用户和组
Mysql服务是以mysql用户的身份运行的,所以/mydata目录的属主、属主应该为mysql
#groupadd -r -g 110 mysql
#useradd -r  -u 110  -g mysql mysql
#chown mysql.mysql /mydata
(注:NFS是以用户id来识别用户的,所以得保证三台服务器上的mysql用户的uid是相同的)
#vim /etc/exports  添加如下内容:
/mydata  172.16.13.1(rw,no_root_squash)  172.16.13.6(rw,no_root_squash)
#service nfs start   --开启NFS服务
NFS服务配置完成,可以挂载进行测试。

二、配置HA节点

1) /etc/hosts文件中添加如下内容
172.16.13.1   aydon1
172.16.13.6   aydon2
(注:必须保证所有节点的主机名称和对应的IP地址解析服务可以正常工作,且每个节点的主机名称需要跟"uname -n“命令的结果保持一致)
2) 设定两个节点可以基于密钥进行ssh通信
Node1:
# ssh-keygen -t rsa
# ssh-copy-id -i ~/.ssh/id_rsa.pub root@aydon2
Node2:
# ssh-keygen -t rsa
# ssh-copy-id -i ~/.ssh/id_rsa.pub root@aydon1
3) 安装Corosync及相关软件包
需要下载如下软件包cluster-gluecluster-glue-libsheartbeatopenaislibresource-agentscorosyncheartbeat-libspacemakercorosyncliblibesmtppacemaker-libs。下载地址:http://clusterlabs.org/rpm/
这里将所需的软件包都下载至/root/rpm目录中。
使用如下命令安装:
#cd /root/rpm
#yum -y --nogpgcheck localinstall *.rpm
4) aydon1上配置corosync(以下配置均在aydon1上进行)
#cd /etc/corosync
#cp corosync.conf.example  corosync.conf
编辑corosync.conf ,修改为如下内容:
compatibility: whitetank

totem {

version: 2

secauth: off            --开启或关闭安全认证

threads: 0

interface {

ringnumber: 0

bindnetaddr: 172.16.0.0        --网卡所在网络的网络地址

mcastaddr: 229.88.1.8        --指定多播地址

mcastport: 5405

}

}

logging {

fileline: off

to_stderr: no     --是否向屏幕上输出错误信息

to_logfile: yes     --是否将日志保存在文件中

to_syslog: no     --是否将日志信息记录到系统日志中

logfile: /var/log/cluster/corosync.log         --保存日志的文件

debug: off

timestamp: off

logger_subsys {

subsys: AMF

debug: off

}

}

amf {

mode: disabled

}

service {

     ver: 0

name: pacemaker

use_mgmtd: yes

}

aisexec {

user: root

group: root

}
5) 生成节点间通信时用到的认证密钥文件
#corosync-keygen
corosync.confauthkey复制至aydon2
#scp -p corosync.conf authkey aydon2:/etc/corosync
6) 在两节点上创建corosync日志所在目录
#mkdir /var/log/cluster
#ssh aydon2 'mkdir /var/log/cluster'
7) 启动corosync
#service corosync start
8) 查看corosync引擎是否正常启动
# grep -e "Corosync Cluster Engine" -e "configuration file" /var/log/cluster/corosync.log
Jun 14 19:02:08 node1 corosync[5103]:   [MAIN  ] Corosync Cluster Engine ('1.2.7'): started and ready to provide service.
Jun 14 19:02:08 node1 corosync[5103]:   [MAIN  ] Successfully read main configuration file '/etc/corosync/corosync.conf'.
Jun 14 19:02:08 node1 corosync[5103]:   [MAIN  ] Corosync Cluster Engine exiting with status 8 at main.c:1397.
Jun 14 19:03:49 node1 corosync[5120]:   [MAIN  ] Corosync Cluster Engine ('1.2.7'): started and ready to provide service.
Jun 14 19:03:49 node1 corosync[5120]:   [MAIN  ] Successfully read main configuration file '/etc/corosync/corosync.conf'.
9) 查看初始化成员节点通知是否正常发出
# grep  TOTEM  /var/log/cluster/corosync.log
Jun 14 19:03:49 node1 corosync[5120]:   [TOTEM ] Initializing transport (UDP/IP).
Jun 14 19:03:49 node1 corosync[5120]:   [TOTEM ] Initializing transmit/receive security: libtomcrypt SOBER128/SHA1HMAC (mode 0).
Jun 14 19:03:50 node1 corosync[5120]:   [TOTEM ] The network interface [192.168.0.5] is now up.
Jun 14 19:03:50 node1 corosync[5120]:   [TOTEM ] A processor joined or left the membership and a new membership was formed.
10) 检查启动过程中是否有错误产生:
# grep ERROR: /var/log/cluster/corosync.log | grep -v unpack_resources
11) 查看pacemaker是否正常启动
# grep pcmk_startup /var/log/cluster/corosync.log
Jun 14 19:03:50 node1 corosync[5120]:   [pcmk  ] info: pcmk_startup: CRM: Initialized
Jun 14 19:03:50 node1 corosync[5120]:   [pcmk  ] Logging: Initialized pcmk_startup
Jun 14 19:03:50 node1 corosync[5120]:   [pcmk  ] info: pcmk_startup: Maximum core file size is: 4294967295
Jun 14 19:03:50 node1 corosync[5120]:   [pcmk  ] info: pcmk_startup: Service: 9
Jun 14 19:03:50 node1 corosync[5120]:   [pcmk  ] info: pcmk_startup: Local hostname: node1.a.org
如果上面命令执行均没有问题,接着可以执行如下命令启动node2上的corosync
# ssh node2 -- /etc/init.d/corosync start
注意:启动node2需要在node1上使用如上命令进行,不要在node2节点上直接启动。
#crm status  --查看集群节点的启动状态。
12) 配置集群工作属性
① 禁用stonith设备
corosync默认启用了stonith,而当前集群并没有stonith设备,所以禁用stonith设备。
#crm configure property stonith-enabled=false   
② 定义默认资源粘性
因为每一次资源的流动都可能造成服务在短时间内不可用,所以应避免资源的流动。
#crm configure rsc_defaults resource-stickiness=100
③ 定义no-quorum-policy策略
对于两节点的集群,当有一台服务下线时,剩余的quorum是绝对不可能多余quorum总数的1/2的,而no-quorum-policy默认是stop-停止集群服务,这样一来两节点的高可用集群是没有意义的,因此将设定no-quorum-policy=ignore
#crm configure property no-quorum-policy=ignore
④ 定义资源
对于当前集群服务来讲,资源有:提供web服务的ipnginx服务,提供mysql服务的ipmysql服务,共享存储/mydata
#crm configure primitive webip ocf:heartbeat:IPaddr ip=172.16.13.2 nic=eth0 cidr_netmask=16
#crm configure primitive nginx lsb:nginx
#crm configure primitive myip ocf:heartbeat:IPaddr ip=172.16.13.3 nic=eth0 cidr_natmask=16
#crm configure primitive mysqld lsb:mysqld
#crm configure primitive mynfs ocf:heartbeat:Filesystem params device="172.16.13.6:/mydata" directory="/mydata" fstype="nfs" op start timeout=60 op stop timeout=60 
⑤ 定义colocation约束
资源的排列约束:web服务:webip一定得和nginx存在于同一服务器上;mysql服务:myipmysqldmynfs一定得存在于同一台服务器上。因此做如下定义:
#crm configure colocation inf: web webip nginx
#crm configure colocation mysql inf: myip mysqld mynfs
⑥ 定义order约束
资源的应用次序:对于web服务,应该webip先生效,然后是nginx;对于mysql服务,mynfs先应用,其次是myip,最后是mysqld,因此做以下定义:
#crm configure order nginx-after-webip mandatory: webip nginx
#crm configure order mysqd-after-mynfs mandatory: mynfs myip mysqld
到此,集群服务配置完毕。接下来可以使用如下命令来查看各节点的工作状态:
#crm status
注:将某项服务定义为集群服务,那么该服务就不应该开机启动。