首页 > 代码库 > 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‘

image

这里显示corosync和pacemaker已经安装过了,在这里pacemaker是做为corosync的一个插件来运行的,在rhel7以后的版本中,pacemaker将做为一个独立的守护进程来运行。

配置corosync:

安装完corosync后会在/etc/corosync目录下有个默认的corosync.config.example,改为corosync.config

image

在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

   image

在node1上启动corosync

    image

    在节点1上启动节点2

     image

    启动完成,使用命令 # crm status 查看节点状态

     image

    节点1和节点2 都已经正常启动,并且集群处于正常工作状态。

     执行ps auxf 命令可以查看corosync启动的各相关进程

      image

 

配置集群的工作属性:

   corosync默认启用了stonith,当前这个集群没有相应的stonith设备,于是首先要禁用stonith

image

#crm configure show  显示当前集群的配置信息,可以看到stonith已经禁用了

给集群添加资源:

  corosync支持的资源代理有lsb和ocf等,lsb就是一些服务的启动脚本类的,如/etc/init.d/目录下的一些脚本。查看当前集群系统所支持的类型:

#crm ra classes

image

stonith是专门为配置stonith设备而用

查看某种类型下的所有资源代理的列表,可以用#crm ra list lsb | ocf (heartbeat | pacmemaker) | stonith 来查看。

image

一个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(监控,定义资源如果停止了是否会被发现,而且传递给集群并且是否重新启运它的)

 

image

添加一个IP=10.204.80.88为主资源

image

把httpd24资源做为web服务资源。检测服务 verify,并提交commit

查看资源状态

image

显示有两个节点,两个资源设置,

因为没有把资源定义为组,并且没有定义约束,所以默认两个资源分别运行在两个节点上。

把这两个资源定义到同一个组

在#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>

image

把webip 和webserverf定义到同一个组webgroup里面,然后查看集群状态

image

两个资源都运行在同一个节点node1上面,访问测试

image

把node1关机后,发现资源没有转移到node2节点上,查看集群状态#crm status

image

发现在集群状态已经 是“WITHOUT quorum”已经失去法定票数,已经不是处于集群状态,但我这里只有两个节点,这样是不合理的,可以以下命令忽略quorum不能满足的集群状态检查;

# crm configure property no-quorum-policy=ignore

查看集群状态

image

集群状态已经在节点2上运行了

image

web页面访问正常

把node1节点启动起来

image

node1和node2都在线,但资源并没有转移回到node1节点上,因为这里并没有定义资源粘性

定义资源的约束有三种:

location             位置约束 :定义资源可以、不可以或尽可能在哪些节点上运行

order                  次序约束:约束定义集群资源在节点上的启动顺序

colocation         排列约束:排列约束用以定义集群资源或以或不可以在某个节点上同时运行

我这里定义webgroup默认运行在node1节点上

#crm  configure  prefer_node1  webserver 200:  node1.mylinux.com

这里要注意的是: 后面跟节点的时候必须要有究竟间隔,否则会报错,

查看配置文件

image

顺序约束,要定义强制要求先启动webip 然后再启动http服务,命令如下

#crm configure order  httpd-after-ip  mandatory: webip webserver

image

 

corosync和pacemaker还有其他的功能强大功能,如果说健康状态检查,每隔多久检查一下,等等,这里先说到这

corosync+pacemaker做高可用web集群