CentOS_6.7高可用服务Heartbeat_v3.0.4安装以及配置
集群系统主要就2种:
高可用(High Availability)HA集群: 使用Heartbeat/keepalived等软硬件实现;也会称为”双机热备”, “双机互备”, “双机”。
负载均衡群集(Load Balance Cluster):使用LinuxVirtual Server(LVS)/haproxy/nginx等软硬件实现;
Heartbeat项目是 Linux-HA 工程的一个组成部分,它实现了一个高可用集群系统。心跳服务和集群通信是高可用集群的两个关键组件,在 Heartbeat 项目里,由 heartbeat 模块实现了这两个功能。
高可用集群是指一组通过硬件和软件连接起来的独立计算机,它们在用户面前表现为一个单一系统,在这样的一组计算机系统内部的一个或者多个节点停止工作,服务会从故障节点切换到正常工作的节点上运行,不会引起服务中断。从这个定义可以看出,集群必须检测节点和服务何时失效,何时恢复为可用。这个任务通常由一组被称为“心 跳”的代码完成。在Linux-HA里这个功能由一个叫做heartbeat的程序完成。
heartbeat (Linux-HA)的工作原理:heartbeat最核心的包括两个部分,心跳监测部分和资源接管部分,心跳监测可以通过网络链路和串口进行,而且支持冗余链路,它们之间相互发送报文来告诉对方自己当前的状态,如果在指定的时间内未受到对方发送的报文,那么就认为对方失效,这时需启动资源接管模块来接管运行在对方主机上的资源或者服务。
消息通信模型
Heartbeat包括以下几个组件:
heartbeat – 节点间通信校验模块
CRM - 集群资源管理模块
CCM - 维护集群成员的一致性
LRM - 本地资源管理模块
StonithDaemon - 提供节点重启服务
logd - 非阻塞的日志记录
apphbd - 提供应用程序级的看门狗计时器
Recovery Manager - 应用故障恢复
CTS – 集群测试系统,集群压力测试
这里主要分析的是Heartbeat的集群通信机制,所以这里主要关注的是heartbeat模块
heartbeat模块由以下几个进程构成:
master进程(masterprocess)
FIFO子进程(fifochild)
read子进程(readchild)
write子进程(writechild)
在heartbeat里,master进程把自己的数据或者是客户端发送来的数据,通过IPC发送到write子进程,write子进程把数据发送到网络;同时read子进程从网络读取数据,通过IPC发送到master进程,由master进程处理或者由master进程转发给其客户端处理。
Heartbeat启动的时候,由master进程来启动FIFO子进程、write子进程和read子进程,最后再启动client进程。
系统:CentOS 6.7 x86_64(两台虚拟机)
安全:SElinux disabled
Iptables disabled
Heartbeat版本:v3.0.4
Cluster Gule版本:v1.0.5
Resource Agents版本:v3.9.5
软件包安装方式:yum安装
Heartbeat3.0以后是由 gule、heartbeat、agents 三部分组成。因此,需要分别安装。
一、准备工作
1. 配置hosts文件(vim /etc/hosts):
10.0.0.50 db1
192.168.0.205 db1
10.0.0.52 db2
192.168.0.201 db2
注:
1)hostname带后缀的域名(HA25pxdschool.org)会出报错。
2. 安装依赖:
# yum installgcc gcc-c++ autoconfautomake libtool glib2-devel libxml2-devel bzip2-devel e2fsprogs-devellibxslt-devel libtool-ltdl-devel make wget docbook-dtds docbook-style-xsl #源码安装时必须安装的依赖
3. 添加运行 heartbeat的用户和组 (源码安装,在主备服务器上同时操作)
# groupadd -r haclient
# useradd -r -g haclient -M -s /sbin/nologin hacluster
4. 换yum源
# mv /etc/yum.repos.d/CentOS-Base.repo/etc/yum.repos.d/CentOS-Base.repo.backup
# wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-6.repo
5. 调整时区并对时
# ntpdate 10.0.0.254 #db1与db2上分别对时
7 May 22:33:02 ntpdate[2729]: adjust timeserver 10.0.0.254 offset -0.001976 sec
二、安装
# yum -y installheartbeat* httpd #最小化安装的系统大约有26个左右的包要安装
三、配置并启动Heartbeat
1. 主上(db1)的配置:
cd /usr/share/doc/heartbeat-3.0.4/
cp authkeys ha.cf haresources /etc/ha.d/
cd /etc/ha.d
vi authkeys #打开下面两项:一共有三种认证方式供选择,第一种是CRC循环冗余校验,第二种是SHA1哈希算法,第三种是MD3哈希算法,其中他们的密码可以任意设置,但是两边密码必须保持一致。
auth 3
3 md5 Hello!
chmod 600 authkeys #给认证文件授权为600
vi haresources #编辑资源文件,加入如下语句
db1 10.0.0.210/24/eth0 httpd #设定虚拟IP和对应的接口,并且指定启动虚拟IP时启动httpd服务,这里的httpd服务必须是能够直接在/etc/init.d/目录下启动的服务。
注意:主节点和备节点中资源文件haresources要完全一样。
# ha.cf文件主要参数注释:
debugfile /var/log/ha-debug #设定debug文件目录
logfile /var/log/ha-log #设定日志文件目录
logfacility local0 #利用系统日志打印日志
keepalive 1 #设定检查时间间隔为1s
deadtime 10 #设定在10s内没有心跳信号,则立即切换服务
warntime 5 #设定告警时间为5s(5s内没有收到对方的回应就报警)
initdead 60 #设定初始化时间为60s
udpport 694 #设定集群节点间的通信协议及端口为udp694监听端口(该端口可以修改)
ucast eth1 192.168.0.201 #设定心跳方式使用单播方式,并且是在eth1接口上进行单播,ip地址为对方心跳端口的IP
auto_failback on/off #当主节点恢复后,是否自动切回,一般都设为off
node db1 #指定两个节点
node db2
ping 192.168.0.1 #指定一个第三方的仲裁节点
respawn hacluster /usr/lib64/heartbeat/ipfail #使用这个脚本去侦听对方是否还活着(使用的是ICMP报文检测)
# egrep -v "^#|^$"ha.cf //此次试验的配置文件
debugfile /var/log/ha-debug
logfile /var/log/ha-log
logfacility local0
keepalive 2
deadtime 30
warntime 10
initdead 120
udpport 694
ucast eth1 192.168.0.201
auto_failback off
node db1
node db2
ping 192.168.0.1
respawn hacluster /usr/lib64/heartbeat/ipfail
2. 把主上的三个配置拷贝到从(db2)上:
cd /etc/ha.d/
scp –P52668 -p authkeys ha.cf haresources [email protected]:/etc/ha.d/
3. 到从上(db2) 编辑ha.cf
vi /etc/ha.d/ha.cf #只需要更改一个地方, IP修改为对端主机的IP地址(192.168.0.205)
ucast eth1 192.168.0.201 改为 ucast eth1 192.168.0.205
4. 启动heartbeat
先主,后从
service heartbeat start
5. 测试高可用
db1:
[[email protected] ha.d]# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu65536 qdisc noqueue state UNKNOWN
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP>mtu 1500 qdisc pfifo_fast state UP qlen 1000
link/ether 00:0c:29:db:31:f7 brd ff:ff:ff:ff:ff:ff
inet 10.0.0.50/24 brd 10.0.0.255 scope global eth0
inet 10.0.0.210/24 brd 10.0.0.255 scopeglobal secondary eth0
inet6 fe80::20c:29ff:fedb:31f7/64 scope link
valid_lft forever preferred_lft forever
3: eth1:<BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UNKNOWNqlen 1000
link/ether 00:0c:29:db:31:01 brd ff:ff:ff:ff:ff:ff
inet 191.168.0.205/24 brd 191.168.0.255 scope global eth1
inet6 fe80::20c:29ff:fedb:3101/64 scope link
valid_lft forever preferred_lft forever
db2:
[[email protected] ~]# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu65536 qdisc noqueue state UNKNOWN
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: eth0:<BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen1000
link/ether 00:0c:29:db:31:f7 brd ff:ff:ff:ff:ff:ff
inet 10.0.0.52/24 brd 10.0.0.255 scope global eth0
inet6 fe80::20c:29ff:fedb:31f7/64 scope link
valid_lft forever preferred_lft forever
3: eth1:<BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UNKNOWNqlen 1000
link/ether 00:0c:29:db:31:01 brd ff:ff:ff:ff:ff:ff
inet 191.168.0.201/24 brd 191.168.0.255 scope global eth1
inet6 fe80::20c:29ff:fedb:3101/64 scope link
valid_lft forever preferred_lft forever
[[email protected] ~]# curl 10.0.0.210
web1 page
# 停掉db1上的网卡服务或关机后,再次在db2上查看VIP和服务是否切换成功
[[email protected] ~]# service heartbeat stop
Stopping High-Availability services: Done.
db2:
[[email protected] ~]# curl 10.0.0.210
web2 page