HA 即 (high available)高可用,又被叫做双机热备,用于关键性业务。 简单理解就是,有两台机器A和B,正常是A提供服务,B待命闲置,当A宕机或服务宕掉,会切换至B机器继续提供服务。常用实现高可用的开源软件有heartbeat和keepalived,其中keepalived有负载均衡的功能。
下面我们使用heartbeat来做HA集群,并且把nginx服务作为HA对应的服务。
试验准备工作:
两台机器,都是centos6.6,各增加一块网卡eth1,使用主机模式连接vmnet1,并设定为192.168.11.0网段;eth0为NAT模式,网段为192.168.20.0网段;
<a href="http://s3.51cto.com/wyfs02/M02/6D/FD/wKiom1VwDyWQlN76AAJC6vGAx1I551.jpg" target="_blank"></a>
开机启动后,拷贝ifcfg-eth0 到 ifcfg-eth1,修改DEVICE为eth1,ip地址设为:192.168.11.20
1
2
3
4
5
6
7
8
9
<code># cd /etc/sysconfig/network-scripts/</code>
<code># cp ifcfg-eth0 ifcfg-eth1</code>
<code># cat ifcfg-eth1</code>
<code>DEVICE=eth1</code>
<code>TYPE=Ethernet</code>
<code>ONBOOT=</code><code>yes</code>
<code>NM_CONTROLLED=</code><code>yes</code>
<code>BOOTPROTO=static</code>
<code>IPADDR=192.168.11.20</code>
设置完成后,重启网卡,ifconfig查看eth0、eth1的ip地址;
<code># /etc/init.d/network restart</code>
<code>#ifconfig</code>
主机的配置:
hostname hello
eth0:192.168.20.20
eth1:192.168.11.20
从机的配置:
hostname web
eth0:192.168.20.30
eth1:192.168.11.30
1、设置hostname,分别为hello和 web;
2、主从都需要关闭防火墙;关闭selinux;
<code># iptables -F</code>
<code># setenforce 0</code>
<code>setenforce: SELinux is disabled</code>
3、 vi /etc/hosts //主从都需要增加内容如下:
<code>192.168.20.20 hello </code>
<code>192.168.20.30 web</code>
4、安装epel扩展源
<code># yum install -y epel-release</code>
5、两个机器都安装heartbeat、libnet
<code>#yum install -y heartbeat* libnet nginx</code>
nginx做代理服务;
6、主上(hello)配置
Heartbeat软件的安装目录为/etc/ha.d目录;
拷贝配置文件的模板到/etc/ha.d目录;
<code>cd</code> <code>/usr/share/doc/heartbeat-3</code><code>.0.4/</code>
<code>cp</code> <code>authkeys ha.cf haresources </code><code>/etc/ha</code><code>.d/</code>
<code>cd</code> <code>/etc/ha</code><code>.d</code>
vi authkeys //去掉前面的#号,或加入下面的内容:
<code>auth 3</code>
<code>3 md5 Hello!</code>
更改权限为600
<code>chmod</code> <code>600 authkeys</code>
vi haresources //加入
<code>hello 192.168.11.100</code><code>/24/eth1</code><code>:0 nginx</code>
192.168.11.100 ip地址是流动ip,虚拟ip;用来绑定服务的;子网掩码为24位;使用eth1:0绑定虚拟ip,并运行nginx进行测试;
注意:两台主机的haresources文件设置必须完全一致。
vi ha.cf //更改为如下内容:
10
11
12
13
14
<code>debugfile </code><code>/var/log/ha-debug</code>
<code>logfile </code><code>/var/log/ha-log</code>
<code>logfacility local0</code>
<code>keepalive 2</code>
<code>deadtime 30</code>
<code>warntime 10</code>
<code>initdead 60</code>
<code>udpport 694</code>
<code>ucast eth1 192.168.11.30</code>
<code>auto_failback on</code>
<code>node hello</code>
<code>node web</code>
<code>ping</code> <code>192.168.11.1</code>
<code>respawn hacluster </code><code>/usr/lib/heartbeat/ipfail</code>
7、把主上的三个配置拷贝到从上:
<code>#cd /etc/ha.d/</code>
<code>#scp authkeys ha.cf haresources web:/etc/ha.d/</code>
8、从上(web) 只需要编辑ha.cf
vi /etc/ha.d/ha.cf //只需要更改一个地方
ucast eth1 192.168.11.30 改为 ucast eth1 192.168.11.20
9、启动heartbeat
先主,后从
<code>#service heartbeat start</code>
10、检查测试
ifconfig 查看是否有 eth1:0 出现则说明主已经开始工作;
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
<code>[root@yong ~]</code><code># ifconfig </code>
<code>eth0 Link encap:Ethernet HWaddr 00:0C:29:43:3D:32 </code>
<code> </code><code>inet addr:192.168.20.20 Bcast:192.168.20.255 Mask:255.255.255.0</code>
<code> </code><code>inet6 addr: fe80::20c:29ff:fe43:3d32</code><code>/64</code> <code>Scope:Link</code>
<code> </code><code>UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1</code>
<code> </code><code>RX packets:433 errors:0 dropped:0 overruns:0 frame:0</code>
<code> </code><code>TX packets:429 errors:0 dropped:0 overruns:0 carrier:0</code>
<code> </code><code>collisions:0 txqueuelen:1000 </code>
<code> </code><code>RX bytes:37095 (36.2 KiB) TX bytes:75381 (73.6 KiB)</code>
<code> </code><code>Interrupt:18 Base address:0x2000 </code>
<code>eth1 Link encap:Ethernet HWaddr 00:0C:29:43:3D:3C </code>
<code> </code><code>inet addr:192.168.11.20 Bcast:192.168.11.255 Mask:255.255.255.0</code>
<code> </code><code>inet6 addr: fe80::20c:29ff:fe43:3d3c</code><code>/64</code> <code>Scope:Link</code>
<code> </code><code>RX packets:396 errors:0 dropped:0 overruns:0 frame:0</code>
<code> </code><code>TX packets:399 errors:0 dropped:0 overruns:0 carrier:0</code>
<code> </code><code>RX bytes:83641 (81.6 KiB) TX bytes:89725 (87.6 KiB)</code>
<code> </code><code>Interrupt:18 Base address:0x2080 </code>
<code> </code>
<code>eth1:0 Link encap:Ethernet HWaddr 00:0C:29:43:3D:3C </code>
<code> </code><code>inet addr:192.168.11.100 Bcast:192.168.11.255 Mask:255.255.255.0</code>
<code>lo Link encap:Local Loopback </code>
<code> </code><code>inet addr:127.0.0.1 Mask:255.0.0.0</code>
<code> </code><code>inet6 addr: ::1</code><code>/128</code> <code>Scope:Host</code>
<code> </code><code>UP LOOPBACK RUNNING MTU:65536 Metric:1</code>
<code> </code><code>RX packets:0 errors:0 dropped:0 overruns:0 frame:0</code>
<code> </code><code>TX packets:0 errors:0 dropped:0 overruns:0 carrier:0</code>
<code> </code><code>collisions:0 txqueuelen:0 </code>
<code> </code><code>RX bytes:0 (0.0 b) TX bytes:0 (0.0 b)</code>
查看是否有nginx进程、heartbeat进程;
<code>[root@yong ha.d]</code><code># ps aux |grep nginx</code>
<code>root 3731 0.0 0.1 5000 632 ? Ss 10:52 0:00 nginx: master process </code><code>/usr/local/nginx/sbin/nginx</code> <code>-c </code><code>/usr/local/nginx/conf/nginx</code><code>.conf</code>
<code>nobody 3732 0.0 0.1 5200 984 ? S 10:52 0:00 nginx: worker process</code>
<code>[root@yong ha.d]</code><code># ps aux |grep heartbeat</code>
<code>root 2765 0.3 1.3 6684 6676 ? SLs 10:44 0:01 heartbeat: master control process</code>
<code>root 2770 0.0 1.2 6488 6480 ? SL 10:44 0:00 heartbeat: FIFO reader </code>
<code>root 2771 0.0 1.2 6484 6476 ? SL 10:44 0:00 heartbeat: write: ucast eth1</code>
<code>root 2772 0.0 1.2 6484 6476 ? SL 10:44 0:00 heartbeat: </code><code>read</code><code>: ucast eth1 </code>
<code>root 2773 0.0 1.2 6484 6476 ? SL 10:44 0:00 heartbeat: write: </code><code>ping</code> <code>192.168.11.1</code>
<code>root 2774 0.0 1.2 6484 6476 ? SL 10:44 0:00 heartbeat: </code><code>read</code><code>: </code><code>ping</code> <code>192.168.11.1</code>
<code>498 2787 0.0 0.2 5380 1488 ? S 10:45 0:00 </code><code>/usr/lib/heartbeat/ipfail</code>
11、测试1:主上故意禁ping
<code>#iptables -I INPUT -p icmp -j DROP</code>
windows客户端一直ping 192.168.11.100 ,一直通,禁止ping之后中间会中断一会,之后一直通;
<a href="http://s3.51cto.com/wyfs02/M00/6D/F9/wKioL1VwFDfAufNjAAF54o941FY163.jpg" target="_blank"></a>
在从上ifconfig查看出现eth1:0,查看nginx进程也有,说明转换到从机器上运行;
<code>[root@web ~]</code><code># ifconfig </code>
<code>eth0 Link encap:Ethernet HWaddr 00:0C:29:97:C3:EC </code>
<code> </code><code>inet addr:192.168.20.30 Bcast:192.168.20.255 Mask:255.255.255.0</code>
<code> </code><code>inet6 addr: fe80::20c:29ff:fe97:c3ec</code><code>/64</code> <code>Scope:Link</code>
<code> </code><code>RX packets:460 errors:0 dropped:0 overruns:0 frame:0</code>
<code> </code><code>TX packets:469 errors:0 dropped:0 overruns:0 carrier:0</code>
<code> </code><code>RX bytes:37104 (36.2 KiB) TX bytes:101866 (99.4 KiB)</code>
<code> </code><code>Interrupt:19 Base address:0x2000 </code>
<code>eth1 Link encap:Ethernet HWaddr 00:0C:29:97:C3:F6 </code>
<code> </code><code>inet addr:192.168.11.30 Bcast:192.168.11.255 Mask:255.255.255.0</code>
<code> </code><code>inet6 addr: fe80::20c:29ff:fe97:c3f6</code><code>/64</code> <code>Scope:Link</code>
<code> </code><code>RX packets:1022 errors:0 dropped:0 overruns:0 frame:0</code>
<code> </code><code>TX packets:1035 errors:0 dropped:0 overruns:0 carrier:0</code>
<code> </code><code>RX bytes:191275 (186.7 KiB) TX bytes:182393 (178.1 KiB)</code>
<code>eth1:0 Link encap:Ethernet HWaddr 00:0C:29:97:C3:F6 </code>
<code> </code><code>Interrupt:18 Base address:0x2080</code>
12、测试2:主上停止heartbeat服务
<code>#service heartbeat stop</code>
windows客户端一直ping 192.168.11.100 ,一直通,停止心跳服务后中间会中断一会,之后一直通;
13、测试3:测试脑裂,主和从都停掉eth1网卡;
eth1网卡禁用,ifdown eth1 心跳线断了之后,会发生脑裂;主从之间连接断了,从在死亡时间没收到主的心跳,则认为主死亡。
主死了,从机器接管服务,从机器使用虚拟ip地址,主和从都在运行服务;
主机器没有eth1网卡,一直运行nginx;
<code>[root@yong ha.d]</code><code># ifconfig </code>
<code> </code><code>RX packets:11442 errors:0 dropped:0 overruns:0 frame:0</code>
<code> </code><code>TX packets:15376 errors:0 dropped:0 overruns:0 carrier:0</code>
<code> </code><code>RX bytes:842833 (823.0 KiB) TX bytes:10226838 (9.7 MiB)</code>
<code> </code><code>RX packets:1163 errors:0 dropped:0 overruns:0 frame:0</code>
<code> </code><code>TX packets:1163 errors:0 dropped:0 overruns:0 carrier:0</code>
<code> </code><code>RX bytes:150095 (146.5 KiB) TX bytes:150095 (146.5 KiB)</code>
<code>root 11686 0.0 0.1 5000 636 ? Ss 14:27 0:00 nginx: master process </code><code>/usr/local/nginx/sbin/nginx</code> <code>-c </code><code>/usr/local/nginx/conf/nginx</code><code>.conf</code>
<code>nobody 11687 0.0 0.1 5200 988 ? S 14:27 0:00 nginx: worker process</code>
从机器查看地址,eth1:0出现
<code>[root@localhost ha.d]</code><code># ifconfig </code>
<code> </code><code>RX packets:7901 errors:0 dropped:0 overruns:0 frame:0</code>
<code> </code><code>TX packets:5891 errors:0 dropped:0 overruns:0 carrier:0</code>
<code> </code><code>RX bytes:603592 (589.4 KiB) TX bytes:2094606 (1.9 MiB)</code>
<code> </code><code>RX packets:20774 errors:0 dropped:0 overruns:0 frame:0</code>
<code> </code><code>TX packets:59144 errors:0 dropped:0 overruns:0 carrier:0</code>
<code> </code><code>RX bytes:3513861 (3.3 MiB) TX bytes:12998603 (12.3 MiB)</code>
<code> </code><code>inet addr:192.168.11.100 Bcast:0.0.0.0 Mask:255.255.255.0</code>
<code>[root@localhost ha.d]</code><code># ps aux |grep nginx</code>
<code>root 8938 0.0 0.0 3684 584 ? Ss 14:37 0:00 nginx: master process </code><code>/usr/local/nginx/sbin/nginx</code> <code>-c </code><code>/usr/local/nginx/conf/nginx</code><code>.conf</code>
<code>nobody 8940 0.0 0.1 4936 2008 ? S 14:37 0:00 nginx: worker process </code>
<code>nobody 8941 0.0 0.2 4936 2064 ? S 14:37 0:00 nginx: worker process</code>
14、测试4:设置auto_failback off
主从都需要配置,启动heartbeat,主上禁止ping之后,跳转到从机器,主恢复ping之后,也不会跳转到主,一直是从机器提供服务;
HA高可用搭建完毕;
本文转自 模范生 51CTO博客,原文链接:http://blog.51cto.com/mofansheng/1658552,如需转载请自行联系原作者