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

本文涉及的产品
日志服务 SLS,月写入数据量 50GB 1个月
简介:

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

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

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

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

1
2
3
4
5
# vim /etc/hosts
172.16.27.1 node1.tanxw.com
172.16.27.2 node2.tanxw.com
# ssh-keygen -t rsa -P ‘’
# ssh-copy-id -i id_rsa.pub node2.tanxw.com

   

   2、安装corosync,这里我们用ansible来安装,要使用ansible在一台主机上操作多台主机得需要事先安装ansible,那这里我们就先说说安装和配置使用ansible,安装ansible也可以用yum来安装,不过需要解决依赖关系:    

1
2
3
4
5
6
7
# yum -y install python-jinja2   解决依赖关系
# yum -y install ansible
安装好之后再去 /etc/ansible 下配置两个节点的 hostname
# vim /etc/ansible/hosts  把里面的内容全都注释掉,加下面你的节点hostname
[corosync]
node1.tanxw.com
node2.tanxw.com


   保存退出!
   我们这里使用172.16.27.0这台主机安装ansible,操作172.16.27.1和.2这两台主机,测试一下:    

1
2
3
4
5
[root@node0 ~] # ansible corosync -m shell -a 'date'
node2.tanxw.com | success | rc=0 >>
Wed Apr 23 17:24:34 CST 2014
node1.tanxw.com | success | rc=0 >>
Wed Apr 23 17:24:34 CST 2014     --测试成功,成功时显示的颜色为绿色


   3、时间同步,需要事先配置好一台时间服务器,然后在crontab -e中输入:    

1
2
# crontab -e
* /5  * * * *  /usr/sbin/ntpdte  172.16.27.0 &>  /dev/null    表示每隔5分钟同步一次


   好,准备工作做好了之后就可以安装corosync了,使用ansible查看两个节点是否已经安装了corosync:

   

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
[root@node0 ~] # ansible corosync -m shell -a 'rpm -q corosync'
node2.tanxw.com | FAILED | rc=1 >>
package corosync is not installed
node1.tanxw.com | FAILED | rc=1 >>
package corosync is not installed
# ansible corosync -m yum -a "name=corosync state=present"  全部输出显示为绿色说明安装成功
[root@node0 ~] # ansible corosync -m shell -a 'rpm -q corosync'  再查看一下corosync的安装版本
node2.tanxw.com | success | rc=0 >>
corosync-1.4.1-17.el6.x86_64
node1.tanxw.com | success | rc=0 >>
corosync-1.4.1-17.el6.x86_64
# cp /etc/corosync/corosync.conf.example /etc/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.1.1         # 绑定的网络地址
                 mcastaddr: 226.94.1.1     #多播地址,一对多通信
                 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的配置和认证文件复制到另一个节点上去:    

1
2
3
4
5
6
7
8
# mv /dev/random /dev/m
# ln /dev/urandom /dev/random  如果这把这个随机数墒池改了可以会产生随机数不够用,这个就要敲击键盘给这个墒池一些随机数;生成完这个key后把链接删除,再把墒池改回来;不过这样改可以会有点为安全,不过做测试的应该不要紧;
# corosync-keygen
# rm -rf /dev/random
# mv /dev/m /dev/random
对于corosync而言,我们各节点之间通信时必须要能够实现安全认证的,要用到一个密钥文件:
# corosync-keygen    # 生成密钥文件,用于双机通信互信,会生成一authkey的文件
# scp authkey corosync.conf node2.tanxw.com:/etc/corosync/   在配置好的节点上把这两个文件复制给另一个节点上的corosync的配置文件中去


安装pacemaker

   # ansible corosync -m yum -a “name=pacemaker state=present”

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

1
2
3
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了之后就可以启动服务了,两个节点都需要启动:    

1
2
3
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

   wKioL1NXyRmBSNL3AABYjROFGpk958.jpg

   wKioL1NXySOyAA8hAABgi5IYFDw826.jpg


   在这里crm是一个很复杂的命令,可以在命令行直接输入crm进入crm的命令行模式:# crm

   那在这里,我们如何去配置一个资源呢,虽然它跟heartbeat略有区别,但是概念基本上是一样的,下面我们就来配置一个web资源吧!
   由于我们的corosync默认是启用stonith功能的,但是我们这里没有stonith设备,如果我们直接去配置资源的话,由于没有stonith功能,所以资源的切换并不会完成,所以要禁用stonith功能,但禁用stonoith需要我们去配置集群的全局stonith属性,全局属性是对所有的节点都生效;    

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
[root@node1 corosync] # 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 node1.tanxw.com
node node2.tanxw.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 #

   

   查看一下节点的运行状态:

   wKioL1NXyVSxH83_AAFMy2iN2yY039.jpg


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

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

   wKioL1NXybrg9zzjAACOM3dpSaE083.jpgwKiom1NXygLAtObIAACoXZ3v-4g562.jpg  

   再进入crm定义我们所需要的资源吧!  

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
crm(live) # configure
crm(live)configure # primitive webip ocf:heartbeat:IPaddr params ip=172.16.27.88
crm(live)configure # verify
crm(live)configure # commit
crm(live)configure # show
node node1.tanxw.com
node node2.tanxw.com
primitive webip ocf:heartbeat:IPaddr \
     params ip= "172.16.27.88"
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 #

   wKiom1NXyl_jJi7eAAIiaeSV140988.jpg

   wKioL1NXym2zahYQAALzkd6oiDk304.jpg    


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

   wKioL1NXypiRQkNhAAMNOsmOv_M296.jpg
   

   好了,我们在页面上测试一下,现在是运行在node1上,我们看看是不是node1上页面的内容,当然,真实的环境中我们的两个web的页面内容都应该是一样的,这里为了以示区别才设置两个不一样的页面内容的:
   wKiom1NXyt7CMUfgAACf77nHDc8708.jpg
   让node1节点离线:
   wKioL1NXyuDDZnjwAAH10_rL48M476.jpg

   wKioL1NXyxXjDu2yAADmyyGOhf8189.jpg    


   好了,这种功能我们也完成了,如果让node1上线它也不会转回的,因为我们没有定义它的倾向性和故障转回,所以node1回来就回来吧,而服务依然运行在node2上;
   crm(live)node# online node1.tanxw.com   让node1从新上线    


结束:

   到这里我们算是配置和运行起来了服务了,当然,还需要别的功能我们还可以添加,比如说排列约束,倾向性定义,或者添回别的资源进来都是可以的等等都可以一一添加理来,定义我们所需要的高可用集群,后续还会更新有关这方面的知识,希望大神门多多指定,在此先谢谢你的关注了!










本文转自 wei0164 51CTO博客,原文链接:http://blog.51cto.com/tanxw/1401399,如需转载请自行联系原作者
相关实践学习
日志服务之使用Nginx模式采集日志
本文介绍如何通过日志服务控制台创建Nginx模式的Logtail配置快速采集Nginx日志并进行多维度分析。
目录
相关文章
|
1月前
|
Linux 网络安全 Apache
CentOS 7.2配置Apache服务httpd(上)
CentOS 7.2配置Apache服务httpd(上)
208 1
|
22天前
|
关系型数据库 MySQL Linux
在 CentOS 7 中通过编译源码方式安装 MySQL 数据库的详细步骤,包括准备工作、下载源码、编译安装、配置 MySQL 服务、登录设置等。
本文介绍了在 CentOS 7 中通过编译源码方式安装 MySQL 数据库的详细步骤,包括准备工作、下载源码、编译安装、配置 MySQL 服务、登录设置等。同时,文章还对比了编译源码安装与使用 RPM 包安装的优缺点,帮助读者根据需求选择最合适的方法。通过具体案例,展示了编译源码安装的灵活性和定制性。
65 2
|
26天前
|
监控 安全 Linux
CentOS7下安装配置ntp服务的方法教程
通过以上步骤,您不仅能在CentOS 7系统中成功部署NTP服务,还能确保其配置合理、运行稳定,为系统时间的精确性提供保障。欲了解更多高级配置或遇到特定问题,提供了丰富的服务器管理和优化资源,可作为进一步学习和求助的平台。
60 1
|
1月前
|
Linux PHP Apache
CentOS 7.2配置Apache服务httpd(下)
CentOS 7.2配置Apache服务httpd(下)
48 1
|
2月前
|
存储 Linux Docker
CentOS 7.6安装Docker实战案例及存储引擎和服务进程简介
关于如何在CentOS 7.6上安装Docker、介绍Docker存储引擎以及服务进程关系的实战案例。
139 3
CentOS 7.6安装Docker实战案例及存储引擎和服务进程简介
|
2月前
|
Linux
CentOS 7.x时间同步服务chrony配置详解
文章详细介绍了在CentOS 7.x系统中如何安装和配置chrony服务,以及它与ntpd服务的对比,强调了chrony在时间同步方面的高效性和准确性。
191 1
CentOS 7.x时间同步服务chrony配置详解
|
Linux 应用服务中间件 nginx
CentOS7 自定义服务
服务配置 服务配置主目录存放路径 # cd /usr/lib/systemd/system 文件内容格式 [Unit]:服务的说明 Description:描述服务 After:在哪些描述服务类别之后启动 [Service]服务运行参数的设...
815 0
|
11天前
|
SQL 存储 Linux
从配置源到数据库初始化一步步教你在CentOS 7.9上安装SQL Server 2019
【11月更文挑战第8天】本文介绍了在 CentOS 7.9 上安装 SQL Server 2019 的详细步骤,包括系统准备、配置安装源、安装 SQL Server 软件包、运行安装程序、初始化数据库以及配置远程连接。通过这些步骤,您可以顺利地在 CentOS 系统上部署和使用 SQL Server 2019。
|
12天前
|
SQL 存储 Linux
从配置源到数据库初始化一步步教你在CentOS 7.9上安装SQL Server 2019
【11月更文挑战第7天】本文介绍了在 CentOS 7.9 上安装 SQL Server 2019 的详细步骤,包括系统要求检查与准备、配置安装源、安装 SQL Server 2019、配置 SQL Server 以及数据库初始化(可选)。通过这些步骤,你可以成功安装并初步配置 SQL Server 2019,进行简单的数据库操作。
下一篇
无影云桌面