集群、高可用、热备双机等等名词,任谁听到,估计第一感觉都会认为这是很有逼格的东西!花郎之前也没接触过这些,一时兴起便折腾起Heartbeat,翻查理论、分析文档、虚拟实验、各种排错,现已成功实现nginx高可用,随手记录下操作过程分享给大家吧!
实验最终目的
实现Nginx服务的高可用集群,即A机在运行一个网站,B机待命,A机意外断电后,B机自动接管A机的业务,当A机加电后,B机把业务交还给A机。
实验环境说明
花郎是使用VMware虚拟机做实验,一台是主机A(host-A),另一台是备机B(host-B),每台主机都有 两张网卡,且各主机上的eth0均用于网络通信,eth1均用于检测心跳!特别说明,建议两台主机的eth1都使用桥接模式,千万不要使用NAT模 式!当然,如果是第一次用虚拟机做HA实验想怎么搞都行,遇到问题再思考,这样折腾才有意思,详细信息如下:
1. VMware:12.5.0
2. Linux:CentOS6.5-x86
3. Heartbeat:3.0.4
4. Nginx:1.6.2
5. 主机A(eth0):192.168.172.128
6. 备机B(eth0):192.168.172.129
7. 主机A心跳线(eth1):192.168.1.100
8. 备机B心跳线(eth1):192.168.1.101
9. 虚拟IP(eth0:0):192.168.172.200
10. 裁判IP(Ping):192.168.1.1
第一步 配置基础环境
配置主机A、备机B,以下操作需要在两台主机上都进行配置。
安装Nginx,并搭建一个简易的网站,直接Yum在线安装即可。
1. yum -y install nginx
喜欢折腾的朋友也可以使用纯手工编译安装:纯手工搭建LNMP环境
禁用系统防火墙、Selinux。
1. service iptables stop
2. ]# setenforce 0
编辑hosts,格式为:“IP 主机名”,IP和主机名之间有一个空格。
1. vim /etc/hosts
主机名如果不知道,输入hostname查看即可。
1. 192.168.172.128 host-A
2. 192.168.172.129 host-B
安装epel扩展源,再安装heartbeat软件包,openssh-clients其实可装可不装,只是为了接下来要使用scp命令。
1. yum -y install epel-release
2. yum -y install heartbeat*
3. yum -y install openssh-clients
至此,基本的实验环境就准备好了,为方便演示,主机A的网站主页我使用的是网站(中文版),备机B使用的是网站(英文版)
第二步 配置主机A
先拷贝三份heartbeat配置文件模版到指定路径。
1. cd /usr/share/doc/heartbeat-3.0.4/
2. heartbeat-3.0.4]# cp -rf authkeys ha.cf haresources /etc/ha.d/
配置authkeys加密文件,按Shift+G到文件末尾,按需修改加密方式,花郎是使用MD5的加密,修改完毕后,再设置文件权限为600。注意,如果主机A是使用MD5加密,那么备机B也必须保持一致!
1. [root@ heartbeat-3.0.4]# cd /etc/ha.d
2. [root@ ha.d]# chmod 600 authkeys
3. [root@ ha.d]# vim authkeys
内容如下:
1. auth 3
2. #1 crc
3. #2 sha1 HI!
4. 3 md5 Hello!
接下来要设置一个虚拟IP,设置为192.168.172.200,端口为eth0:0,对应启动的服务为Nginx。
1. [root@host-A ha.d]# vi haresources
主机A的主机名、虚拟IP、网口、监控的服务,不要写错!
1. host-A 192.168.172.200/24/eth0:0 nginx
重头戏来了,开始配置主机A的heartbeat主配置文件。
1. [root@host-A ha.d]# vi ha.cf
以下内容并非是凑在一起的,得自己逐行慢慢找!每一行选项参数的意义,可以稍后自己谷歌搜索了解,不懂也可以在文章评论,建议先参考笔记把实验做成功,再慢慢剖析知识点,也是不错的学习方法。
1. debugfile /var/log/ha-debug
2. logfile /var/log/ha-log
3. logfacility local0
4. keepalive 2
5. deadtime 30
6. warntime 10
7. initdead 60
8. udpport 694
9. ucast eth1 192.168.1.101
10. auto_failback on
11. node host-A
12. node host-B
13. ping 192.168.1.1
14. respawn hacluster /usr/lib/heartbeat/ipfail
因为主机A和备机B的三份heartbeat配置文件在内容上是差不多的,所以配置备机B的时候,可以直接把主机A的三份配置文件直接拷贝到备机B上,一会再稍作修改即可!注意,要使用scp命令,主机A、备机B必须安装openssh-clients。
1. [root@host-A ha.d]# scp authkeys ha.cf haresources root@host-B:/etc/ha.d/
第三步 配置备机B
刚才已经从主机A拷贝了三份配置文件过来,需要对ha.cf文件进行修改,另外两个则不需要。
1. [root@host-B ~]# cd /etc/ha.d/
2. [root@host-B ha.d]# vim ha.cf
唯一需要修改的参数就是ucast,修改侦听的心跳线接口和对应的对端接口的IP地址,所以在配置备机B时,ucast必须填写主机A的心跳线IP地址,即192.168.1.100。
1. debugfile /var/log/ha-debug
2. logfile /var/log/ha-log
3. logfacility local0
4. keepalive 2
5. deadtime 30
6. warntime 10
7. initdead 60
8. udpport 694
9. ucast eth1 192.168.1.100
10. auto_failback off
11. node host-A
12. node host-B
13. ping 192.168.1.1
14. respawn hacluster /usr/lib/heartbeat/ipfail
第四步 启动测试
两台主机可以同时启动Nginx,然后先打开浏览器访问两个网站,确保Nginx服务是正常的。
1. [root@host-A ~]# service nginx start
2. [root@host-B ~]# service nginx start
主机A,即网站(中文版):http://192.168.172.128
备机B,即网站(英文版):http://192.168.172.129
能正常访问网页后,再停用两台主机的Nginx。
1. [root@host-A ~]# service nginx stop
2. [root@host-B ~]# service nginx stop
先启动主机A上的Heartbeat。
1. [root@host-A ~]# service heartbeat start
大约一分钟后,再看eth0:0虚拟IP是否启动。
1. [root@host-A ~]# ip a
如上图,虚拟IP已经成功启动,浏览器访问192.168.172.128或192.168.172.200,都会显示同一个网站
再启动备机B上的Heartbeat,备机B就会自动进入待命模式,即主机A一旦故障,备机B就会接手。
1. [root@host-B ~]# service heartbeat start
扩展阅读
启动备机B之后,要特别注意观察,当主机A运行正常时,不论等多久,备机B上是不会启动虚拟IP的,一旦启用,就表示两台机子都在互抢资源,都误判对方机子故障,自己将成为主导,俗称脑裂(split-brain)!详情可以查看日志,进行故障分析。
1. [root@host-A ~]# cat /var/log/ha-debug
2. [root@host-A ~]# cat /var/log/ha-log
接下来,直接把主机A断电关机,玩的就是简单,要的就是粗暴!彻底断电后,立即清空浏览器所有缓存,再次访问192.168.172.128或 192.168.172.200时,应该就无法打开网站,即主机A已彻底故障,等待备机B接手!等大约一分钟,再用浏览器访问 192.168.172.200,如果出现的是网站(英文版),说明备机B已接手,并正常提供服务。
B机毕竟是作为备机而存在的,当主机A修理好之后,便会自动接管回来!开始做最终测试,依旧先清空浏览器所有缓存,虚拟机打开主机A的电源,并启动 Heartbeat,等一分钟左右,再次访问192.168.172.200,如果出现的是网站,说明主机A已自动做回主导,实验 成功!