CentOS 6.5使用Corosync + pacemaker实现httpd服务的高可用

时间:2021-09-04 03:20:20
Corosync:它属于OpenAIS(开放式应用接口规范)中的一个项目corosync一版本中本身不具备投票功能,到了corosync 2.0之后引入了votequorum子系统也具备了投票功能了,如果我们用的是1版本的,又需要用到票数做决策时那该如何是好呢;当然,在红帽上把cman + corosync结合起来用,但是早期cman跟pacemaker没法结合起来,如果想用pacemaker又想用投票功能的话,那就把cman当成corosync的插件来用,把cman当成corodync的投票功能,当然,这里结合了两个了Messaging Lader;Corosync目前有两个主流的版本:一个是2系列的,另一个是1系列的稳定版;2版本和1版本差别很大,1版本不具有投票功能,2版本之后引入了votequorum后支持投票功能了;


   OpenAIS自从诞生之后,红帽就基于这个规范研发了一个高可用集群的解决方案叫cman,并为cman提供了rgmanager作为资源管理器,并且容合conga全生命周期的管理接口形成了RHCS;
   Conrosync是从OpenAIS这个大项目中分支出来的一个项目,而Pacemaker是heartbeat v3版本中分裂出来专门用于提供高可用集群CRM的组件,功能十分强大, Coreosync在传递信息的时候可以通过一个简单的配置文件来定义信息传递的方式和协议等,Corosync可以提供一个完整的HA功能,Corosync是未来的发展方向,在以后的新项目里,一般采用Corosync,而heartbeat_gui可以提供很好的HA管理功能,可以实现图形化的管理。


  Pacemaker是一个集群管理器。它利用首选集群基础设施(OpenAIS 或heartbeat)提供的消息和成员能力,由辅助节点和系统进行故障检测和回收,实现性群集服务(亦称资源)的高可用性。


corosync+pacemaker:在配置corosync时最好具有三个以上的节点,并且节点个数为奇数个,如果使用偶数个节点的话也没关系,只是要关闭不具有法定票数的决策策略功能;

拓扑

CentOS 6.5使用Corosync + pacemaker实现httpd服务的高可用


实现过程:

1、双机互信需要设置好,hosts文件需要解析好,时间要同步

8.39、8.42、8.40
#vim /etc/hosts

# hostname node2.chinasoft.com
vim /etc/hosts
192.168.8.39 node2.chinasoft.com node2
192.168.8.42 node2.chinasoft.com node4

在ansible服务器8.40上配置ssh免密码访问node2和node4
# ssh-keygen -t rsa -P ''

# ssh-copy-id -i .ssh/id_rsa.pub root@node2.chinasoft.com
# ssh-copy-id -i .ssh/id_rsa.pub root@node4.chinasoft.com
测试是否成功
# ssh node2.chinasoft.com 'date';date
# ssh node4.chinasoft.com 'date';date

2、安装时间服务器客户端(时间服务器192.168.8.102)

# yum install -y ntp
# vim /etc/ntp.conf
加入
server 192.168.8.102
启动ntp客户端并手动同步一次时间,后续自动平滑同步
# service ntpd start
# ntpdate -u 192.168.102


3、安装corosync,这里我们用ansible来安装,要使用ansible在一台主机上操作多台主机得需要事先安装ansible,那这里我们就先说说安装和配置使用ansible,安装ansible也可以用yum来安装:



# yum install -y epel-relase
# yum install -y ansible1.9


# vim /etc/ansible/hosts  把里面的内容全都注释掉,加下面你的节点hostname
[corosync]
node2.chinasoft.com
node4.chinasoft.com


我们这里使用192.168.8.40这台主机安装ansible,操作192.168.8.39和192.168.8.42这两台主机,测试一下:    
# ansible corosync -m shell -a 'date'
node2.chinasoft.com | success | rc=0 >>
Tue Apr 19 20:48:07 CST 2016


node1.chinasoft.com | success | rc=0 >>
Tue Apr 19 20:48:07 CST 2016     --测试成功,成功时显示的颜色为绿色

4、安装corosync

好,准备工作做好了之后就可以安装corosync了,使用ansible查看两个节点是否已经安装了corosync(最好使用centos6.5光盘当做yum源来安装,测试如果不是centos6.5光盘自带依赖包安装,报错无法进行试验):
此处我们将8.20配置成了http方式的Yum源(这个yum源的软件包都来自centos6.5光盘)
过程:
# cd /etc/yum.repos.d
将默认的yum源备份即关闭
# mv CentOS-Base.repo CentOS-Base.repo.bak
加入我们自己的yum源
# vim localyum.repo
[base]
name=localyum
baseurl=http://192.168.8.20
gpgcheck=0
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-6


[updates]
name=localyum
baseurl=http://192.168.8.20
gpgcheck=0
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-6



清理下缓存,即可
# yum clean all
# yum makecache


# ansible corosync -a "rpm -q corosync"
node2.chinasoft.com | FAILED | rc=1 >>
package corosync is not installed

node1.chinasoft.com | FAILED | rc=1 >>
package corosync is not installed

# ansible corosync -m yum -a "name=corosync state=present"  全部输出显示为绿色说明安装成功

# ansible corosync -a "rpm -q corosync" 再查看一下corosync的安装版本
node2.chinasoft.com | success | rc=0 >>
corosync-1.4.7-2.el6.x86_64

node4.chinasoft.com | success | rc=0 >>
corosync-1.4.7-2.el6.x86_64

在其中的一个节点如node2.chinasoft.com(8.39)配置:
# cp /etc/corosync/corosync.conf.example /etc/corosync/corosync.conf  复制一份corosync的样本配置文件
# vim /etc/corosync/corosync.conf   编辑配置文件修改如下内容
compatibility: whitetank    #这个表示是否兼容0.8之前的版本
totem { #图腾,这是用来定义集群中各节点中是怎么通信的以及参数
version: 2 #图腾的协议版本,它是种协议,协议是有版本的,它是用于各节点互相通信的协议,这是定义版本的
secauth: on #表示安全认证功能是否启用的
threads: 0 #实现认证时的并行线程数,0表示默认配置
interface { # 指定在哪个接口上发心跳信息的,它是个子模块
ringnumber: 0 #环号码,集群中有多个节点,每个节点上有多个网卡,别的节点可以接收,同时我们本机的别一块网卡也可以接收,为了避免这些信息在这样的环状发送,因此要为这个网卡定义一个唯一的环号码,以避免心跳信息环发送。
bindnetaddr: 192.168.8.0 # 绑定的网络地址
mcastaddr: 226.95.1.188 #多播地址,一对多通信
mcastport: 5405 # 多播端口
ttl: 1 # 表示只向外播一次
}
}
logging { # 跟日志相关
fileline: off
to_stderr: no # 表示是否需要发送到错误输出
to_logfile: yes #是不是送给日志文件
to_syslog: no #是不是送给系统日志
logfile: /var/log/cluster/corosync.log #日志文件路径
debug: off #是否启动调试
timestamp: on #日志是否需要记录时间戳
logger_subsys { #日志的子系统
subsys: AMF
debug: off
}
}
amf { # 跟编程接口相关的
mode: disabled
}
service { #定义一个服务来启动pacemaker
ver: 0 #定义版本
name: pacemaker #这个表示启动corosync时会自动启动pacemaker
}
aisexec { #表示启动ais的功能时以哪个用户的身份去运行的
user: root
group: root #其实这个块定义不定义都可以,corosync默认就是以root身份去运行的
}



这里我们改一个随机数池,再把配置好的corosync的配置和认证文件复制到另一个节点上去:



对于corosync而言,我们各节点之间通信时必须要能够实现安全认证的,要用到一个密钥文件:
# corosync-keygen    # 生成密钥文件,用于双机通信互信,会生成一authkey的文件
另外开启一个窗口安装lftp命令,并且通过ftp获取一个较大文件
# yum install -y lftp
# lftp 192.168.8.53 -uadmin,pass
> get bigdata.zip


# corosync-keygen 
Corosync Cluster Engine Authentication key generator.
Gathering 1024 bits for key from /dev/random.
Press keys on your keyboard to generate entropy.
Press keys on your keyboard to generate entropy (bits = 848).
Press keys on your keyboard to generate entropy (bits = 912).
Press keys on your keyboard to generate entropy (bits = 976).
Writing corosync key to /etc/corosync/authkey.

# scp authkey corosync.conf node4.chinasoft.com:/etc/corosync  在配置好的节点上把这两个文件复制给另一个节点上的corosync的配置文件中去

# scp -p authkey corosync.conf node4.chinasoft.com:/etc/corosync
-bash: scp: command not found
# yum install openssh-clients -y

注意:
corosync-keygen命令生成密钥时会用到 /dev/random 
/dev/random是 Linux系统下的随机数生成器,它会从当前系统的内存中一个叫熵池的地址空间中根据系统中断来生成随机数,加密程序或密钥生成程序会用到大量的随机数,就会出现随机数不够用的情况,random 的特性就是一旦熵池中的随机数被取空,会阻塞当前系统进程等待产生中断会继续生成随机数;
由于此处会用到1024位长度的密钥,可能会存在熵池中的随机数不够用的情况,就会一直阻塞在生成密钥的阶段,两种解决办法:
1、手动在键盘上输入大量字符,产生系统中断(产生中断较慢,不建议使用)        

2、通过互联网或FTP服务器下载较大的文件(产生中断较快,建议使用)


安装pacemaker
   # ansible corosync -m yum -a "name=pacemaker state=present"
   我们要想使用pacemaker配置的话需要安装一个pacemaker的接口,它的这个程序的接口叫crmshell,它在新版本的pacemaker已经被独立出来了,不再是pacemaker的组成部分了,早期装上pacemaker就会自带有crmshell,因此要想用crmshell的话得去安装crmshell,而安装crmshell又依赖于pssh的相关包,因此得安装这两个组件,(这里的这两个包是自己制件的),哪个节点配置就安装在哪个节点上就可以了,也无需两个节点都安装这两个包:  

crmsh-1.2.6-4.el6.x86_64.rpm
pssh-2.3.1-2.el6.x86_64.rpm
# yum -y install crmsh-1.2.6-4.el6.x86_64.rpm pssh-2.3.1-2.el6.x86_64.rpm


一切都OK了之后就可以启动服务了,两个节点都需要启动:
# service corosync start
# grep TOTEM /var/log/cluster/corosync.log 
Apr 21 20:35:52 corosync [TOTEM ] Initializing transport (UDP/IP Multicast).
Apr 21 20:35:52 corosync [TOTEM ] Initializing transmit/receive security: libtomcrypt SOBER128/SHA1HMAC (mode 0).
Apr 21 20:35:52 corosync [TOTEM ] The network interface [192.168.8.39] is now up.
Apr 21 20:35:52 corosync [TOTEM ] A processor joined or left the membership and a new membership was formed.
Apr 21 20:35:52 corosync [TOTEM ] A processor joined or left the membership and a new membership was formed.
Apr 21 20:36:00 corosync [TOTEM ] A processor joined or left the membership and a new membership was formed.
Apr 21 20:36:00 corosync [TOTEM ] A processor joined or left the membership and a new membership was formed.


# crm status
Last updated: Thu Apr 21 20:38:16 2016
Last change: Thu Apr 21 20:35:31 2016 via crmd on node4.chinasoft.com
Stack: classic openais (with plugin)
Current DC: node2.chinasoft.com - partition with quorum
Version: 1.1.10-14.el6-368c726
2 Nodes configured, 2 expected votes
0 Resources configured

Online: [ node2.chinasoft.com node4.chinasoft.com ]

CentOS 6.5使用Corosync + pacemaker实现httpd服务的高可用
在这里crm是一个很复杂的命令,可以在命令行直接输入crm进入crm的命令行模式:# crm
   那在这里,我们如何去配置一个资源呢,虽然它跟heartbeat略有区别,但是概念基本上是一样的,下面我们就来配置一个web资源吧!
   由于我们的corosync默认是启用stonith功能的,但是我们这里没有stonith设备,如果我们直接去配置资源的话,由于没有stonith功能,所以资源的切换并不会完成,所以要禁用stonith功能,但禁用stonoith需要我们去配置集群的全局stonith属性,全局属性是对所有的节点都生效;

# crm configure    #进入crm命令行模式配置资源等
crm(live)configure# property #切换到property目录下,可以用两次tab键进行补全和查看
usage: property [$id=<set_id>] <option>=<value> # property的用法和格式
crm(live)configure# property stonith-enabled=false #禁用stonith-enabled
crm(live)configure# verify #检查设置的属性是否正确
crm(live)configure# commit #检查没问题就可以提交了
crm(live)configure# show #查看当前集群的所有配置信息
node node2.chinasoft.com
node node4.chinasoft.com #两个节点
property $id="cib-bootstrap-options" \
dc-version="1.1.10-14.el6-368c726" \ #DC的版本号
cluster-infrastructure="classic openais (with plugin)" \ #集群的基础架构,使用的是OpenAIS,插件式的
expected-quorum-votes="2" \ #期望节点的票数
stonith-enabled="false" #禁用stonith功能
crm(live)configure#



要注意:如果一个节点挂了,就不拥有法定票数了,那资源是不会切换的
   集群的策略有几种:
   stopped    :停止服务    
   ignore    :忽略,继续运行    
   freeze    :冻结,已经连接的请求继续响应,新的请求不再响应    
   suicide    :自杀,将服务kill掉    

这里我们定义一个web资源,那如何去定义一个资源,在定义web资源之前我们先启动测试我们的web服务是否正常,并以它们提供两个不同的页面以示区别:

# ansible corosync -a "service httpd start"
# ansible corosync -a "chkconfig httpd off"

不要让apache随机启动,让pacemaker去管理
# ansible corosync -a "chkconfig --list httpd"
node4.chinasoft.com | success | rc=0 >>
httpd           0:off1:off2:off3:off4:off5:off6:off


node2.chinasoft.com | success | rc=0 >>
httpd           0:off1:off2:off3:off4:off5:off6:off

再进入crm定义我们所需要的资源:
[root@node2 corosync]# crm configure
crm(live)configure# primitive webip ocf:heartbeat:IPaddr params ip=192.168.8.77
crm(live)configure# verify
crm(live)configure# commit
crm(live)configure# show
node node2.chinasoft.com
node node4.chinasoft.com
primitive webip ocf:heartbeat:IPaddr \
params ip="192.168.8.77"
property $id="cib-bootstrap-options" \
dc-version="1.1.10-14.el6-368c726" \
cluster-infrastructure="classic openais (with plugin)" \
expected-quorum-votes="2" \
stonith-enabled="false"
crm(live)configure#



CentOS 6.5使用Corosync + pacemaker实现httpd服务的高可用

CentOS 6.5使用Corosync + pacemaker实现httpd服务的高可用

定义一个组,把之后定义的资源加到这个组里面去:
   # group weservice webip webserver


crm(live)# configure
crm(live)configure# group webservice webip webserver
crm(live)configure# verify
crm(live)configure# commit
crm(live)configure# show
node node2.chinasoft.com
node node4.chinasoft.com
primitive webip ocf:heartbeat:IPaddr \
params ip="192.168.8.77"
primitive webserver lsb:httpd
group webservice webip webserver
property $id="cib-bootstrap-options" \
dc-version="1.1.10-14.el6-368c726" \
cluster-infrastructure="classic openais (with plugin)" \
expected-quorum-votes="2" \
stonith-enabled="false"
crm(live)configure# cd
crm(live)# status
Last updated: Thu Apr 21 20:57:15 2016
Last change: Thu Apr 21 20:56:58 2016 via cibadmin on node2.chinasoft.com
Stack: classic openais (with plugin)
Current DC: node4.chinasoft.com - partition with quorum
Version: 1.1.10-14.el6-368c726
2 Nodes configured, 2 expected votes
2 Resources configured


Online: [ node2.chinasoft.com node4.chinasoft.com ]


Resource Group: webservice
webip (ocf::heartbeat:IPaddr):Started node2.chinasoft.com
webserver (lsb:httpd):Started node2.chinasoft.com



CentOS 6.5使用Corosync + pacemaker实现httpd服务的高可用

好了,我们在页面上测试一下,现在是运行在node2上,我们看看是不是node2上页面的内容,当然,真实的环境中我们的两个web的页面内容都应该是一样的,这里为了以示区别才设置两个不一样的页面内容的:
CentOS 6.5使用Corosync + pacemaker实现httpd服务的高可用

让node2节点离线:

CentOS 6.5使用Corosync + pacemaker实现httpd服务的高可用

CentOS 6.5使用Corosync + pacemaker实现httpd服务的高可用

 如果让node2上线它也不会转回的,因为我们没有定义它的倾向性和故障转回,所以node2回来就回来吧,而服务依然运行在node4上;
   crm(live)# node
crm(live)node# online node2.chinasoft.com  让node2重新上线    

结束:
   到这里我们算是配置和运行起来了服务了,当然,还需要别的功能我们还可以添加,比如说排列约束,倾向性定义,或者添回别的资源进来都是可以的等等都可以一一添加理来,定义我们所需要的高可用集群



配置的时候需要注意的问题:
1.做corosync实验的两台节点主机最好系统版本一致,最好使用centos6.5,并且使用光盘做yum源


2.通过crm status命令发现每次只能看到自己的节点,没有报错但 # serevice pacemaker start 识别,这个问题是因为开启了防火墙和selinux,关闭防火墙和selinux即可
# setenfroce 0
# service iptables stop 

# crm status
Last updated: Thu Apr 21 20:23:13 2016
Last change: Thu Apr 21 20:14:48 2016 via cibadmin on node4.chinasoft.com
Stack: classic openais (with plugin)
Current DC: NONE
1 Nodes configured, 2 expected votes
0 Resources configured

OFFLINE: [ node4.chinasoft.com ]

CentOS 6.5使用Corosync + pacemaker实现httpd服务的高可用