首页 > 代码库 > corosync+pacemaker做高可用web集群
corosync+pacemaker做高可用web集群
实验环境:
两台主机: centos6.5+httpd2.4+php5.5组成web的基本环境,并且web页面访问正常,并且确保httpd24服务不会开机启动。
node1.mylinux.com 10.204.80.79
node2.mylinux.com 10.204.80.80
我这里启用ansible来方便对两个节点的管理,启用一台主机做为管理节点,IP:10.204.80.71,在三台主机的hosts里同都添加对应的名称解析,管理节点对node1,node2两个节点启用ssh互信机制,在ansible的配置文件中把node1和node2加入webservers组。
安装软件:
在两台主机上安装corosync和pacemaker,在管理主机上使用ansible命令的yum模块安装,安装过程会要有一段时间。
# ansible webservers -m yum -a ‘name=corosync,pacemaker state=installed‘
这里显示corosync和pacemaker已经安装过了,在这里pacemaker是做为corosync的一个插件来运行的,在rhel7以后的版本中,pacemaker将做为一个独立的守护进程来运行。
配置corosync:
安装完corosync后会在/etc/corosync目录下有个默认的corosync.config.example,改为corosync.config
在corosync.config配置文件加添回pacemaker做为corosync的插件。添加如下内容
service {
ver: 0
name: pacemaker
# use_mgmtd: yes
}
aisexec {
user: root
group: root
}
并设定此配置文件中bindnetaddr后面的ip地址为我主机所在的网络地址,节点的网段在10.204.80网段,设为10.204.80.0网段 bindnetaddr:10.204.80.0,配置文件如下
# Please read the corosync.conf.5 manual page compatibility: whitetank totem { version: 2 secauth: on threads: 0 interface { ringnumber: 0 bindnetaddr: 10.204.80.0 mcastaddr: 226.94.13.10 mcastport: 5405 ttl: 1 } } logging { fileline: off to_stderr: no to_logfile: yes to_syslog: yes logfile: /var/log/cluster/corosync.log debug: off timestamp: on logger_subsys { subsys: AMF debug: off } } amf { mode: disabled } service { ver: 0 name: pacemaker # use_mgmtd:yes } aisexec { user: root group: root }
这里要注意的是bindnetaddr的地址只设本地网络的网段,否则有可能会报错 corosync [TOTEM ] The network interface is down,以至节点心跳传递不过来。参考官方文档,说得很明白。
bindnetaddr
This specifies the network address the corosync executive should bind to. For example, if the local interface is 192.168.5.92 with netmask
255.255.255.0, set bindnetaddr to 192.168.5.0. If the local interface is 192.168.5.92 with netmask 255.255.255.192, set bindnetaddr to
192.168.5.64, and so forth.
生成节点间通信时的认证密钥文件:
#corosync-kegen 按几个回车,就会生成authkey的密钥文件
把corosync.conf和authkey拷到node2结点的/etc/corosync/目录下
配置接口:
在rhel6.3以前常用的版本是crmsh, 是一个资源管理器的配置接口,在rhel6.4以后用的是pcs,这里可以两种都用,对比一下。因此crmsh在centos6.5的yum库中没有,所以要去下载安装crmsh或自己编译安装crmsh。
下载地址:http://download.opensuse.org/repositories/network:/ha-clustering:/Stable/CentOS_CentOS-6/x86_64/
需要下载的有三个文件crmsh-2.1-1.6.x86_64.rpm , pssh-2.3.1-4.1.x86_64.rpm ,python-pssh-2.3.1-4.1.x86_64.rpm;因为crmsh需要依赖pssh,所以也需要下载
安装配置接口:安装crmssh除了下载的几个文件外,还有其他的python的依赖关系,所以用yum localinstall来安装解决依赖关系。把这三个文件放在/root目录下,然后安装
# yum --nogpgcheck localinstall crmsh-2.1-1.6.x86_64.rpm pssh-2.3.1-4.1.x86_64.rpm python-pssh-2.3.1-4.1.x86_64.rpm
安装完成,输入crm 进入crm shell
在node1上启动corosync
在节点1上启动节点2
启动完成,使用命令 # crm status 查看节点状态
节点1和节点2 都已经正常启动,并且集群处于正常工作状态。
执行ps auxf 命令可以查看corosync启动的各相关进程
配置集群的工作属性:
corosync默认启用了stonith,当前这个集群没有相应的stonith设备,于是首先要禁用stonith
#crm configure show 显示当前集群的配置信息,可以看到stonith已经禁用了
给集群添加资源:
corosync支持的资源代理有lsb和ocf等,lsb就是一些服务的启动脚本类的,如/etc/init.d/目录下的一些脚本。查看当前集群系统所支持的类型:
#crm ra classes
stonith是专门为配置stonith设备而用
查看某种类型下的所有资源代理的列表,可以用#crm ra list lsb | ocf (heartbeat | pacmemaker) | stonith 来查看。
一个web集群所需要的资源有 vip,web服务,
我这两个节点的vip为:10.204.80.88 web服务为 http24
crm的配置命令的语法:
primitive <rsc> [<class>:[<provider>:]]<type>
[params attr_list]
[operations id_spec]
[op op_type [<attribute>=<value>...] ...]
op_type :: start | stop | monitor
primitive 主资源
格式 primitive ID (资源名称) 资源代理
参数 params
meta 元属性信息
utilization 使用信息
operations 操作信息 操作类型 start |stop | monitor(监控,定义资源如果停止了是否会被发现,而且传递给集群并且是否重新启运它的)
添加一个IP=10.204.80.88为主资源
把httpd24资源做为web服务资源。检测服务 verify,并提交commit
查看资源状态
显示有两个节点,两个资源设置,
因为没有把资源定义为组,并且没有定义约束,所以默认两个资源分别运行在两个节点上。
把这两个资源定义到同一个组
在#crm 然后 输入configure 进入配置模式,然后输入 help group
可以查看帮助文档,有group命令的详细说明和示例
group语法
group <name> <rsc> [<rsc>...]
[description=<description>]
[meta attr_list]
[params attr_list]
attr_list :: [$id=<id>] <attr>=<val> [<attr>=<val>...] | $id-ref=<id>
把webip 和webserverf定义到同一个组webgroup里面,然后查看集群状态
两个资源都运行在同一个节点node1上面,访问测试
把node1关机后,发现资源没有转移到node2节点上,查看集群状态#crm status
发现在集群状态已经 是“WITHOUT quorum”已经失去法定票数,已经不是处于集群状态,但我这里只有两个节点,这样是不合理的,可以以下命令忽略quorum不能满足的集群状态检查;
# crm configure property no-quorum-policy=ignore
查看集群状态
集群状态已经在节点2上运行了
web页面访问正常
把node1节点启动起来
node1和node2都在线,但资源并没有转移回到node1节点上,因为这里并没有定义资源粘性
定义资源的约束有三种:
location 位置约束 :定义资源可以、不可以或尽可能在哪些节点上运行
order 次序约束:约束定义集群资源在节点上的启动顺序
colocation 排列约束:排列约束用以定义集群资源或以或不可以在某个节点上同时运行
我这里定义webgroup默认运行在node1节点上
#crm configure prefer_node1 webserver 200: node1.mylinux.com
这里要注意的是: 后面跟节点的时候必须要有究竟间隔,否则会报错,
查看配置文件
顺序约束,要定义强制要求先启动webip 然后再启动http服务,命令如下
#crm configure order httpd-after-ip mandatory: webip webserver
corosync和pacemaker还有其他的功能强大功能,如果说健康状态检查,每隔多久检查一下,等等,这里先说到这
corosync+pacemaker做高可用web集群