1、HA集群介绍

HA即(high available)高可用,又被叫做双机热备,用于关键性业务。可以这样理解,有两台机器A和B,正常情况下,A提供服务,B待命闲置,当A宕机或服务宕掉,会切换至B机继续提供该服务。常用实现高可用的开源软件有heartbeat和keepalived,其中keepalived有负载均衡的功能。

高可用(HA)集群_HA

如图所示为一个HA架构,一个交换机下面有两台机器Web1和Web2,其中Web1为主节点,正常使它提供服务,而Web2备用节点是闲置的。Web1和Web2中间有一根心跳线,检查对方的存活状态。流动IP,也叫vip是对外提供服务的ip,正常情况下配置在Web1上,当Web1宕机后,Web2会自动配置该vip,对外提供服务。


2、前期准备

准备两台机器,一个使用了centos6.5,另一个centos6.3,系统版本不同不影响实验

网卡eth0 ip如下

master 192.168.1.165

slave 192.168.1.163

下面操作在两个机器上都要操作:

(1)设置hostname,分别为主master和从slave

主上设置:

# hostname  master

# vim /etc/sysconfig/network

HOSTNAME=localhost.localdomain

修改为

HOSTNAME=master

从上设置

# hostname  slave

# vim /etc/sysconfig/network

HOSTNAME=localhost.localdomain

修改为

HOSTNAME=slave

(2)关闭防火墙,主从都操作

# iptables -F

# service iptables save

# getenforce 0

# vim /etc/selinux/config

SELINUX=enforcing

修改为

SELINUX=disabled

(3)配置host,主从操作一样

# vim  /etc/host

192.168.1.165 master

192.168.1.163 slave


3、heartbeat安装

主机和从机都需要安装heartbeat,同时需要libnet,主机从机执行同样的命令

# yum install -y heartbeat

# yum install -y libnet

如果没有包,则需要安装一个扩展yum源,heartbeat在epel源中。

# yum install -y epel-release


4、主节点配置

需要先将3个相关的配置文件放置在heartbeat的配置目录下

# cd /usr/share/doc/heartbeat-3.0.4/

# cp authkeys ha.cf haresources /etc/ha.d/

之后便可以开始修改配置文件了,先修改验证文件

# cd /etc/ha.d/

# vim authkeys # 用来验证,主从通过通信验证对方是否存活,需要加密

auth 3 # 此处打开,数字表示选择哪种加密方式

#1 crc # 最简单

#2 sha1 HI! # 最复杂

3 md5 Hello! # 处于中间等级的加密方式

# chmod 600 /etc/ha.d/authkeys

# 如果不修改权限,heartbeat启动不了

第二个配置haresources文件,只需要编辑一行。因为当前在ha.d目录下,直接vim。如果不是,用绝对路径或者cd

# vim haresources

#node1  10.0.0.170  Filesystem::/dev/sda1::/data1::ext2

#找到上面一行,改成下面,需要去掉#

master  192.168.1.186/24/eth0:0 nginx

# master是主的主机名;192.168.1.186是vip,/24指定网段,网卡eth0:0(这里采用了虚拟网卡);nginx提供服务,如果主宕掉,从启动。

最后一个配置ha.cf,里边基本全是注释,这里选择删掉重新写入,当前依旧在/etc/ha.d目录下

# > ha.cf

# vim ha.cf

debugfile /var/log/ha-debug

logfile /var/log/ha-log

logfacility     local0

keepalive 2

deadtime 30

warntime 10

initdead 60

udpport 694

ucast eth0 192.168.1.163

auto_failback on

node    master

node    slave

ping 192.168.1.1

respawn hacluster /usr/lib/heartbeat/ipfail

配置说明:

debugfile /var/log/ha-debug:该文件保存heartbeat的调试信息

logfile /var/log/ha-log:heartbeat的日志文件

logfacility     local0 :日志级别

keepalive 2:心跳的时间间隔,默认单位秒

deadtime 30:超出该时间未收到对方节点的心跳,则认为对方死亡

warntime 10:超出该时间未收到对方节点的心跳,则发出警告并记录到日志

initdead 60:在某些系统上,系统启动或重启之后需要经过一段时间网络才能正常工作,该选项用于解决这种情况产生的时间间隔。最少为deadtime的两倍

udpport 694:设置广播通信使用的端口,694为默认端口号

ucast eth0 192.168.1.163:ucast指定对方ip,bcast形式寻找;eth0心跳检测自己的网卡,ip对方的ip

auto_failback on:heartbeat的两台主机分别为主节点和从节点。主节点正常情况下占用资源运行所有服务,遇到故障把资源交给从节点由从节点运行服务。选项为on情况下,一旦主节点恢复运行,则自动获取资源并取代从节点运行服务。

node    master:指定主

node    slave:指定从

ping 192.168.1.1

respawn hacluster /usr/lib/heartbeat/ipfail:指定与heartbeat一同启动和关闭的进程,该进程被自动监视,遇到故障则重新启动。最常用的进程是ipfail,该进程用于检测和处理网络故障,需要配合ping语句指定的pingnode来检测网络连接。如果系统是64位,将地址中的lib改为lib64

然后安装一个nginx,用于后边测试

# yum install -y nginx


5、从节点配置

把主上的三个配置拷贝到从上,使用scp命令;并且只需要在从上修改ha.cf文件一个地方即可

# scp authkeys ha.cf haresources slave:/etc/ha.d/

# vim /etc/ha.d/ha.cf

ucast eth0 192.168.1.163改为ucast eth0 192.168.1.165

也安装一个nginx,用于后边测试

# yum install -y nginx


6、heartbeat测试

启动heartbeat,顺序很重要,先主后从

# service heartbeat start

检查测试(主),第一次会需要等待一段时间,耐心

# ifconfig

看是否有eth0:0

# ps aux | grep nginx

看是否有nginx进程

测试(1)

因为主从指间的心跳实质是通过ping来连通,so主故意禁掉ping,死掉

# iptables -D INPUT -p icmp -j DROP

如果失败,查看日志发现卡在这里不动

Dec 08 18:56:53 master heartbeat: [9590]: WARN: node 192.168.1.1: is dead

Dec 08 18:56:53 master heartbeat: [9590]: info: Link 192.168.1.1:192.168.1.1 dead.

Dec 08 18:56:53 master ipfail: [9619]: info: Status update: Node 192.168.1.1 now has status dead

harc(default)[10097]: 2016/12/08_18:56:53 info: Running /etc/ha.d//rc.d/status status

Dec 08 18:56:54 master ipfail: [9619]: info: NS: We are dead. :<

Dec 08 18:56:54 master ipfail: [9619]: info: Link Status update: Link 192.168.1.1/192.168.1.1 now has status dead

Dec 08 18:56:55 master ipfail: [9619]: info: We are dead. :<

Dec 08 18:56:55 master ipfail: [9619]: info: Asking other side for ping node count.

尝试解决方法

将从上的ha.cf配置文件中的ucast修改如下

bcast  eth0

然后重新测试