一、Keepalived简介
Keepalived的作用是检测web服务器的状态,如果有一台web服务器死机,或工作出现故障,Keepalived将检测到,并将有故障的web服务器从系统中剔除,当web服务器工作正常后Keepalived自动将web服务器加入到服务器群中,这些工作全部自动完成,不需要人工干涉,需要人工做的只是修复故障的web服务器。
Layer3,4&7工作在IP/TCP协议栈的IP层,TCP层,及应用层,原理分别如下:
Layer4:如果您理解了Layer3的方式,Layer4就容易了。Layer4主要以TCP端口的状态来决定服务器工作正常与否。如web server的服务端口一般是80,如果Keepalived检测到80端口没有启动,则Keepalived将把这台服务器从服务器群中剔除。
Layer7:Layer7就是工作在具体的应用层了,比Layer3,Layer4要复杂一点,在网络上占用的带宽也要大一些。Keepalived将根据用户的设定检查服务器程序的运行是否正常,如果与用户的设定不相符,则Keepalived将把服务器从服务器群中剔除。
二、安装配置
1.拓扑图
<a href="http://s3.51cto.com/wyfs02/M00/25/90/wKioL1Nkn6eyMZ4OAAChbkfDbog261.jpg" target="_blank"></a>
说明:1.两个代理服务器通过VIP向外提供数据
2.两个代理服务器都可以代理后端的服务器
3.为测试方便,后端服务器至提供静态页面
2.ip规划
功用
ip地址
安装软件
VIP
192.168.1.99
反向代理1
192.168.1.201
keepalived、haproxy
反向代理2
192.168.1.204
web服务器1
192.168.1.202
httpd
web服务器2
192.168.1.203
3.安装配置haproxy
关于haproxy的详细配置,请参照http://wangfeng7399.blog.51cto.com/3518031/1405758
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
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
<code>[root@node1 ~]# cat /etc/haproxy/haproxy.cfg</code>
<code>#---------------------------------------------------------------------</code>
<code># Example configuration </code><code>for</code> <code>a possible web application. See the</code>
<code># full configuration options online.</code>
<code>#</code>
<code># http:</code><code>//haproxy.1wt.eu/download/1.4/doc/configuration.txt</code>
<code># Global settings</code>
<code>global</code>
<code> </code><code># to have these messages end up </code><code>in</code> <code>/</code><code>var</code><code>/log/haproxy.log you will</code>
<code> </code><code># need to:</code>
<code> </code><code>#</code>
<code> </code><code># </code><code>1</code><code>) configure syslog to accept network log events. This </code><code>is</code> <code>done</code>
<code> </code><code># by adding the </code><code>'-r'</code> <code>option to the SYSLOGD_OPTIONS </code><code>in</code>
<code> </code><code># /etc/sysconfig/syslog</code>
<code> </code><code># </code><code>2</code><code>) configure local2 events to go to the /</code><code>var</code><code>/log/haproxy.log</code>
<code> </code><code># file. A line like the following can be added to</code>
<code> </code><code># /etc/sysconfig/syslog</code>
<code> </code><code># local2.* /</code><code>var</code><code>/log/haproxy.log</code>
<code> </code><code>log </code><code>127.0</code><code>.</code><code>0.1</code> <code>local2</code>
<code> </code><code>chroot /</code><code>var</code><code>/lib/haproxy</code>
<code> </code><code>pidfile /</code><code>var</code><code>/run/haproxy.pid</code>
<code> </code><code>maxconn </code><code>4000</code>
<code> </code><code>user haproxy</code>
<code> </code><code>group haproxy</code>
<code> </code><code>daemon</code>
<code> </code><code># turn on stats unix socket</code>
<code> </code><code>stats socket /</code><code>var</code><code>/lib/haproxy/stats</code>
<code># common defaults that all the </code><code>'listen'</code> <code>and </code><code>'backend'</code> <code>sections will</code>
<code># </code><code>use</code> <code>if</code> <code>not designated </code><code>in</code> <code>their block</code>
<code>defaults</code>
<code> </code><code>mode http</code>
<code> </code><code>log global</code>
<code> </code><code>option httplog</code>
<code> </code><code>option dontlognull</code>
<code> </code><code>option http-server-close</code>
<code> </code><code>option forwardfor except </code><code>127.0</code><code>.</code><code>0.0</code><code>/</code><code>8</code>
<code> </code><code>option redispatch</code>
<code> </code><code>retries </code><code>3</code>
<code> </code><code>timeout http-request 10s</code>
<code> </code><code>timeout queue 1m</code>
<code> </code><code>timeout connect 10s</code>
<code> </code><code>timeout client 1m</code>
<code> </code><code>timeout server 1m</code>
<code> </code><code>timeout http-keep-alive 10s</code>
<code> </code><code>timeout check 10s</code>
<code> </code><code>maxconn </code><code>3000</code>
<code># main frontend which proxys to the backends</code>
<code>frontend main *:</code><code>80</code>
<code> </code><code>default_backend </code><code>static</code>
<code># </code><code>static</code> <code>backend </code><code>for</code> <code>serving up images, stylesheets and such</code>
<code>backend </code><code>static</code>
<code> </code><code>balance roundrobin</code>
<code> </code><code>server node2 </code><code>192.168</code><code>.</code><code>1.202</code><code>:</code><code>80</code> <code>check maxconn </code><code>2000</code>
<code> </code><code>server node3 </code><code>192.168</code><code>.</code><code>1.203</code><code>:</code><code>80</code> <code>check maxconn </code><code>2000</code>
<code># round robin balancing between the </code><code>var</code><code>ious backends</code>
说明:两个节点的HAproxy的配置文件应该保持一样
4.测试haproxy的配置
<a href="http://s3.51cto.com/wyfs02/M01/25/90/wKiom1NkqEjjye6UAAB5vROjfcc126.jpg" target="_blank"></a>
<a href="http://s3.51cto.com/wyfs02/M00/25/90/wKioL1NkqB7yeQdHAAByUqYSatI357.jpg" target="_blank"></a>
5.安装配置keepalived
①、安装keepalived
keepalived的安装可以通过yum源来安装,也可以通过编译源码来安装,本处通过yum源赖安装
②、配置keepalived主节点
<code>[root@node1 ~]# cat /etc/keepalived/keepalived.conf</code>
<code>! Configuration File </code><code>for</code> <code>keepalived</code>
<code>global_defs { </code><code>//全局参数</code>
<code> </code><code>notification_email { </code><code>//邮件</code>
<code> </code><code>[email protected] </code><code>//收件人地址</code>
<code> </code><code>}</code>
<code> </code><code>notification_email_from [email protected] </code><code>//发件人地址</code>
<code> </code><code>smtp_server </code><code>127.0</code><code>.</code><code>0.1</code> <code>//邮件服务器的地址</code>
<code> </code><code>smtp_connect_timeout </code><code>30</code> <code>//间隔时间</code>
<code> </code><code>router_id LVS_DEVEL </code><code>//邮件服务器的组的id</code>
<code>}</code>
<code>vrrp_script chk_haproxy {</code>
<code> </code><code>script </code><code>"killall -0 haproxy"</code> <code>//检查haproxy是否在线</code>
<code> </code><code>interval </code><code>1</code> <code>//检查间隔时间</code>
<code> </code><code>weight -</code><code>5</code> <code>//如果检查失败,则权重-5</code>
<code>vrrp_instance VI_1 { </code><code>//定义第一个集群</code>
<code> </code><code>state MASTER </code><code>//初始状态为主节点,从节点应该为BACKUP</code>
<code> </code><code>interface</code> <code>eth0 </code><code>//配置ip的端口</code>
<code> </code><code>virtual_router_id </code><code>51</code> <code>//本组集群的id号,主从节点必须一样</code>
<code> </code><code>priority </code><code>100</code> <code>//主节点的优先级,备用节点的优先级必须低于主节点</code>
<code> </code><code>advert_int </code><code>1</code> <code>//心跳检查间隔时间</code>
<code> </code><code>authentication {</code>
<code> </code><code>auth_type PASS </code><code>//通信为明文密码通信</code>
<code> </code><code>auth_pass </code><code>1111</code> <code>//通信的密码,主从节点必须一样</code>
<code> </code><code>}</code>
<code> </code><code>virtual_ipaddress {</code>
<code> </code><code>192.168</code><code>.</code><code>1.99</code> <code>//定义一个VIP</code>
<code>track_script { </code><code>//调用上面的命令</code>
<code> </code><code>chk_haproxy</code>
③、配置keepalived从节点
<code>[root@node4 ~]# cat /etc/keepalived/keepalived.conf</code>
<code>global_defs {</code>
<code> </code><code>notification_email {</code>
<code> </code><code>[email protected]</code>
<code> </code><code>notification_email_from [email protected]</code>
<code> </code><code>smtp_server </code><code>127.0</code><code>.</code><code>0.1</code>
<code> </code><code>smtp_connect_timeout </code><code>30</code>
<code> </code><code>router_id LVS_DEVEL</code>
<code> </code><code>script </code><code>"killall -0 haproxy"</code>
<code> </code><code>interval </code><code>1</code>
<code> </code><code>weight -</code><code>5</code>
<code>vrrp_instance VI_1 {</code>
<code> </code><code>state BACKUP</code>
<code> </code><code>interface</code> <code>eth0</code>
<code> </code><code>virtual_router_id </code><code>51</code>
<code> </code><code>priority </code><code>99</code>
<code> </code><code>advert_int </code><code>1</code>
<code> </code><code>auth_type PASS</code>
<code> </code><code>auth_pass </code><code>1111</code>
<code> </code><code>192.168</code><code>.</code><code>1.99</code>
<code>track_script {</code>
6.测试
<code>2</code><code>: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu </code><code>1500</code> <code>qdisc pfifo_fast state UP qlen </code><code>1000</code>
<code> </code><code>link/ether </code><code>00</code><code>:0c:</code><code>29</code><code>:</code><code>56</code><code>:</code><code>78</code><code>:cd brd ff:ff:ff:ff:ff:ff</code>
<code> </code><code>inet </code><code>192.168</code><code>.</code><code>1.204</code><code>/</code><code>24</code> <code>brd </code><code>192.168</code><code>.</code><code>1.255</code> <code>scope global eth0</code>
<code> </code><code>inet </code><code>192.168</code><code>.</code><code>1.99</code><code>/</code><code>32</code> <code>scope global eth0</code>
<code> </code><code>inet6 fe80::20c:29ff:fe56:78cd/</code><code>64</code> <code>scope link tentative dadfailed</code>
<code> </code><code>valid_lft forever preferred_lft forever</code>
可以看到ip地址已经配置上去了
<a href="http://s3.51cto.com/wyfs02/M02/25/91/wKioL1Nkr17zGRQ-AACGBxHygoA656.jpg" target="_blank"></a>
我们可以看到网页访问正常
下面,我们模拟服务器损坏,将node1上的haproxy关掉,看看ip地址是否会转移到node4上
<code>[root@node4 ~]# ip add</code>
<code>1</code><code>: lo: <LOOPBACK,UP,LOWER_UP> mtu </code><code>16436</code> <code>qdisc noqueue state UNKNOWN</code>
<code> </code><code>link/loopback </code><code>00</code><code>:</code><code>00</code><code>:</code><code>00</code><code>:</code><code>00</code><code>:</code><code>00</code><code>:</code><code>00</code> <code>brd </code><code>00</code><code>:</code><code>00</code><code>:</code><code>00</code><code>:</code><code>00</code><code>:</code><code>00</code><code>:</code><code>00</code>
<code> </code><code>inet </code><code>127.0</code><code>.</code><code>0.1</code><code>/</code><code>8</code> <code>scope host lo</code>
<code> </code><code>inet6 ::</code><code>1</code><code>/</code><code>128</code> <code>scope host</code>
OK!!可以看到我们的页面访问正常,这就可以实现当前段的一个反向代理服务器宕机或者后端的一个web服务宕机,服务都可以正常对外提供
7.扩展
我们还可以自定义通知机制
<code>#!/bin/bash</code>
<code># Author: wangfeng7399<wangfeng17399@</code><code>163</code><code>.com></code>
<code># description: An example of notify script</code>
<code>vip=</code><code>192.168</code><code>.</code><code>1.99</code>
<code>contact=</code><code>'root@localhost'</code>
<code>notify() {</code>
<code> </code><code>mailsubject=</code><code>"`hostname` to be $1: $vip floating"</code>
<code> </code><code>mailbody=</code><code>"`date '+%F %H:%M:%S'`: vrrp transition, `hostname` changed to be $1"</code>
<code> </code><code>echo $mailbody | mail -s </code><code>"$mailsubject"</code> <code>$contact</code>
<code>case</code> <code>"$1"</code> <code>in</code>
<code> </code><code>master)</code>
<code> </code><code>notify master</code>
<code> </code><code>exit </code><code>0</code>
<code> </code><code>;;</code>
<code> </code><code>backup)</code>
<code> </code><code>notify backup</code>
<code> </code><code>fault)</code>
<code> </code><code>notify fault</code>
<code> </code><code>*)</code>
<code> </code><code>echo </code><code>'Usage: `basename $0` {master|backup|fault}'</code>
<code> </code><code>exit </code><code>1</code>
<code>esac</code>
在keepalived的配置文件中通过notify来调用,如下所示
<code>notify_master </code><code>"/etc/keepalived/notify.sh master"</code>
<code>notify_backup </code><code>"/etc/keepalived/notify.sh backup"</code>
<code>notify_fault </code><code>"/etc/keepalived/notify.sh fault"</code>
大功告成,由于本人水平有限,可能有逻辑上的错误,请各位大神匹配指正
本文转自wangfeng7399 51CTO博客,原文链接:http://blog.51cto.com/wangfeng7399/1405785,如需转载请自行联系原作者