近期一直在练习Linux相关的服务部署,前面文章也介绍了一部分Linux的相关日常服务,今天我们就介绍Centos7+Lvs+keeplived实现Apache高可用的负载均衡,其实该功能对于一个企业运维人员来说是必须要掌握的技能,而且要熟悉相关负载均衡及高可用的相关参数,这样才可以部署出一个属于特殊环境的配置应用,我们都知道lvs、nginx、haproxy可以实现应用的负载均衡,但是不能实现单点故障,所以我们还需要借助一个应用就是keepalived,当然我们见的最多的就是lvs+keepalived配置应用了。所以我们今天主要介绍的是Centos7+Lvs+keeplived实现Apache高可用的负载均衡, keepalived--master和keepalived--backup 两者之间通过vrrp协议利用组播进行通信,master主机对外接受请求并将请求转发至后方的realserver,backup主机只接受请求而不转发请求。某时刻当backup主机没有接受到master主机发送的信息时,于是发送vrrp通告信息并广播arp信息,宣城自己是master,如果收到其他主机发送的通告信息的优先级比自己的高,那么自己将继续转为backup,优先级别高的机器,此时就是新master主机,并接替原master主机的工作。
每个keepalived机器都对后方的realserver进行监控,只不过master负责将外部请求转发至后方的realserver,backup则不作该处理。而LVS呢,LVS将其控制程序ipvs嵌套至传输层数据流的Input钩子函数上,ipvs将发送至本控制器主机(director)上的数据流在input链上进行截流,通过对数据报文的分析根据自身的算法将数据流转发至后台真正提供服务的主机(Real Server)上,达到根据后端服务器负载能力均衡分配处理任务的效果。对于LVS的更多参数介绍,我们将在下一篇文章中介绍:
环境介绍:
VIP:192.168.7.50
Hostname:AA-S
IP:192.168.7.51
Role:Apache
Hostname:BB-S
IP:192.168.7.52
Role:Apache
Hostname:CC-S
IP:192.168.7.53
Role:LVS+Keepalived
Hostname:DD-S
IP:192.168.7.54
Role:LVS+Keepalived
我们同样使用Apache作为web服务器
首先是准备Apache服务
1
|
Yum install httpd
|
查看httpd 版本
接下来我们首先要为apache定义一个 默认的页面,方便区分
1
|
Vim /var/www/httml/index .html
|
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
|
< /html >
<!DOCTYPE html> <html> < head >
<title>Welcome to Apache< /title >
<style> body { 35em; margin: 0 auto; font-family: Tahoma, Verdana, Arial, sans-serif; } < /style >
<style type = "text/css" >
h1{color:red} h2{color:blue} h3{color:green} h4{color:yellow} } < /style >
< /head ><body bgcolor= '#46A3FF' >
<h1>Welcome to AA-S Apache< /h1 >
<h2>HostName:AA-S< /h2 >
<h3>IP:192.168.7.51< /h3 >
<h4>Service:Apache< /h4 >
<input type =button value= "Refresh" onclick= "window.location.href('http://192.168.7.51')" >
< /body >
< /html >
|
启动服务
1
|
Systemctl start httpd |
然后添加默认的防火墙端口8o
1
|
Firewall-cmd --zone=public --add-port= '80/tcp' --permanent
|
1
|
或者vim /etc/firewalld/zone/public .xml
|
添加一下格式
1
|
<port portocal= 'tcp' port= '80' >
|
接下来我们在本地访问测试一下
接下来我们也同样按照方法部署第二台apache服务,方法跟上面完全一样
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
|
< /html >
<!DOCTYPE html> <html> < head >
<title>Welcome to Apache< /title >
<style> body { 35em; margin: 0 auto; font-family: Tahoma, Verdana, Arial, sans-serif; } < /style >
<style type = "text/css" >
h1{color:red} h2{color:blue} h3{color:green} h4{color:yellow} } < /style >
< /head ><body bgcolor= '#FF7F50' >
<h1>Welcome to BB-S Apache< /h1 >
<h2>HostName:BB-S< /h2 >
<h3>IP:192.168.7.52< /h3 >
<h4>Service:Apache< /h4 >
<input type =button value= "Refresh" onclick= "window.location.href('http://192.168.7.52')" >
< /body >
< /html >
|
测试访问
接下来开始安装LVS
我们在192.168.7.53上
1
|
yum install ipvsdm
|
安装完成
我们同样在第二台服务器上也安装IVS
192.168.7.54
1
|
yum install -y ipvsadm
|
接下来我们继续安装keeplived,我们是Keepalived服务和lvs在同一台服务器上
我们首先在第一台服务器上安装,192.168.7.53
1
|
yum install keepalived
|
1
|
vim /etc/keepalived/keepalived .conf
|
我们查看默认配置
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
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
|
! Configuration File for keepalived
global_defs { notification_email { acassen@firewall.loc failover@firewall.loc sysadmin@firewall.loc } notification_email_from Alexandre.Cassen@firewall.loc smtp_server 192.168.200.1 smtp_connect_timeout 30 router_id LVS_DEVEL } vrrp_instance VI_1 { state MASTER interface eth0 virtual_router_id 51 priority 100 advert_int 1 authentication { auth_type PASS auth_pass 1111 } virtual_ipaddress { 192.168.200.16 192.168.200.17 192.168.200.18 } } virtual_server 192.168.200.100 443 { delay_loop 6 lb_algo rr lb_kind NAT nat_mask 255.255.255.0 persistence_timeout 50 protocol TCP real_server 192.168.201.100 443 { weight 1 SSL_GET { url { path / digest ff20ad2481f97b1754ef3e12ecd3a9cc } url { path /mrtg/
digest 9b3a0c85a887a256d6939da88aabd8cd } connect_timeout 3 nb_get_retry 3 delay_before_retry 3 } } } virtual_server 10.10.10.2 1358 { delay_loop 6 lb_algo rr lb_kind NAT persistence_timeout 50 protocol TCP sorry_server 192.168.200.200 1358 real_server 192.168.200.2 1358 { weight 1 HTTP_GET { url { path /testurl/test .jsp
digest 640205b7b0fc66c1ea91c463fac6334d } url { path /testurl2/test .jsp
digest 640205b7b0fc66c1ea91c463fac6334d } url { path /testurl3/test .jsp
digest 640205b7b0fc66c1ea91c463fac6334d } connect_timeout 3 nb_get_retry 3 delay_before_retry 3 } } real_server 192.168.200.3 1358 { weight 1 HTTP_GET { url { path /testurl/test .jsp
digest 640205b7b0fc66c1ea91c463fac6334c } url { path /testurl2/test .jsp
digest 640205b7b0fc66c1ea91c463fac6334c } connect_timeout 3 nb_get_retry 3 delay_before_retry 3 } } } virtual_server 10.10.10.3 1358 { delay_loop 3 lb_algo rr lb_kind NAT nat_mask 255.255.255.0 persistence_timeout 50 protocol TCP real_server 192.168.200.4 1358 { weight 1 HTTP_GET { url { path /testurl/test .jsp
digest 640205b7b0fc66c1ea91c463fac6334d } url { path /testurl2/test .jsp
digest 640205b7b0fc66c1ea91c463fac6334d } url { path /testurl3/test .jsp
digest 640205b7b0fc66c1ea91c463fac6334d } connect_timeout 3 nb_get_retry 3 delay_before_retry 3 } } real_server 192.168.200.5 1358 { weight 1 HTTP_GET { url { path /testurl/test .jsp
digest 640205b7b0fc66c1ea91c463fac6334d } url { path /testurl2/test .jsp
digest 640205b7b0fc66c1ea91c463fac6334d } url { path /testurl3/test .jsp
digest 640205b7b0fc66c1ea91c463fac6334d } connect_timeout 3 nb_get_retry 3 delay_before_retry 3 } } } |
我们为了保证服务的正确修改,我们在修改前,先对keepalived.conf进行备份一份
1
|
cp /etc/keepalived/keepalived .conf /etc/keepalived/keepalived .conf.bak
|
接下来清空配置
1
|
Echo > keepalived keepalived.conf |
然后粘贴以下代码,需要注意的是里面interface需要跟当前的系统对应,不然会无法监听端口;
通过ip a sh 查看,比如默认一般是eth0,而我的系统是ens160
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
|
! Configuration File for keepalived
global_defs { notification_email { acassen@firewall.loc failover@firewall.loc sysadmin@firewall.loc } notification_email_from Alexandre.Cassen@firewall.loc smtp_server 192.168.200.1 smtp_connect_timeout 30 router_id LVS_DEVEL } vrrp_instance VI_1 { #定义一个vrrp组,组名唯一
state MASTER #定义改主机为keepalived的master主机
interface ens160 #监控eth0号端口
virtual_router_id 58 #虚拟路由id号为58,id号唯一,这个id决定了多播的MAC地址
priority 150 #设置本节点的优先级,master的优先级 要比backup的优先级别高,数值要大
advert_int 1 #检查间隔,默认为1秒
authentication { auth_type PASS #认证方式,密码认证
auth_pass 1111 #认证的密码,这个密码必须和backup上的一致
} virtual_ipaddress { #设置虚拟的ip, 这个ip是以后对外提供服务的ip。
192.168.7.50 } } virtual_server 192.168.7.50 80 { #虚拟主机设置,ip同上。
delay_loop 2 #服务器轮询的时间间隔
lb_algo rr #lvs的调度算法
lb_kind DR #lvs的集群模式
nat_mask 255.255.255.0 persistence_timeout 50 #会话超时50s
protocol TCP #健康检查是用tcp还是udp
real_server 192.168.7.51 80 { #后端真实主机1
weight 100 #每台机器的权重,0表示不给该机器转发请求,知道它恢复正常。
TCP_CHECK { #健康检查项目,以下
connect_timeout 3 nb_get_retry 3 delay_before_retry 3 connect_port 80 } } real_server 192.168.7.52 80 { #后端真实主机2
weight 100 #每台机器的权重,0表示不给该机器转发请求,知道它恢复正常。
TCP_CHECK { #健康检查项目,以下
connect_timeout 3 nb_get_retry 3 delay_before_retry 3 connect_port 80 } } } |
我们接着在第二台服务器也安装keepalived
我们同样备份keepalived.conf文件
1
|
cp /etc/keepalived/keepalived .conf /etc/keepalived/keepalived .conf.bak
|
1
|
echo > /etc/keepalived/keepalived .conf
|
接下来我们需要配置backup的keepalived服务,
其实差别跟master的稍微有点差别:
state MASTER >> > state BACKUP #定义改主机为keepalived的backup主机,监控主master
priority 150 >>> priority 100 #设置本节点的优先级,数值要比master主机上的小
1
|
vim /etc/keepalived/keepalived .conf
|
然后粘贴以下代码,需要注意的是里面interface需要跟当前的系统对应,不然会无法监听端口;
通过ip a sh 查看,比如默认一般是eth0,而我的系统是ens160
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
|
! Configuration File for keepalived
global_defs { notification_email { acassen@firewall.loc failover@firewall.loc sysadmin@firewall.loc } notification_email_from Alexandre.Cassen@firewall.loc smtp_server 192.168.200.1 smtp_connect_timeout 30 router_id LVS_DEVEL } vrrp_instance VI_1 { #定义一个vrrp组,组名唯一
state BACKUP #定义改主机为keepalived的master主机
interface ens160 #监控eth0号端口
virtual_router_id 58 #虚拟路由id号为58,id号唯一,这个id决定了多播的MAC地址
priority 100 #设置本节点的优先级,master的优先级 要比backup的优先级别高,数值要大
advert_int 1 #检查间隔,默认为1秒
authentication { auth_type PASS #认证方式,密码认证
auth_pass 1111 #认证的密码,这个密码必须和backup上的一致
} virtual_ipaddress { #设置虚拟的ip, 这个ip是以后对外提供服务的ip。
192.168.7.50 } } virtual_server 192.168.7.50 80 { #虚拟主机设置,ip同上。
delay_loop 2 #服务器轮询的时间间隔
lb_algo rr #lvs的调度算法
lb_kind DR #lvs的集群模式
nat_mask 255.255.255.0 persistence_timeout 50 #会话超时50s
protocol TCP #健康检查是用tcp还是udp
real_server 192.168.7.51 80 { #后端真实主机1
weight 100 #每台机器的权重,0表示不给该机器转发请求,知道它恢复正常。
TCP_CHECK { #健康检查项目,以下
connect_timeout 3 nb_get_retry 3 delay_before_retry 3 connect_port 80 } } real_server 192.168.7.52 80 { #后端真实主机2
weight 100 #每台机器的权重,0表示不给该机器转发请求,知道它恢复正常。
TCP_CHECK { #健康检查项目,以下
connect_timeout 3 nb_get_retry 3 delay_before_retry 3 connect_port 80 } } } |
接下来就是测试keepalived的配置了
我们在两台服务器上分别启动keepalived服务
1
|
systemctl start keepalived |
我们在master上查看网络监听状态。
然后在Master主机上查看网络监听状态。
然后我们查看master主机上的ipvsadm
我们通过以上可以得知,虚拟ip此时绑定在192.168.7.53--master上,然后停止192.168.7.53上的keepalived服务,查看查看192.168.7.54--Backup上的虚拟ip状态,已经监听到了Backup主机的网络端口上。
然后主机的状态就没有虚拟ip了
另外我们查看一下ipvsadm的状态。
首先是master主机上的:
然后是backup上的
我们可以查看一下切换的log
我们在第二台服务器上查看log
1
|
cat /etc/log/message
|
以上的配置,keepalived的高可用功能已经实现。
我们也可以查看一下keepalived的状态
1
|
systemctl status keepalived |
代理服务器之间的负载均衡
接下来我们要实现realserver服务器配置
我们需要在两台web(http)192.168.7.51,192.168.7.52,需要在这两台服务器上配置虚拟VIP,所以在服务器上执行以下脚本
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
|
#!/bin/bash # chkconfig: 2345 85 35 # Description: Start real server with host boot VIP=192.168.7.50 function start() {
ifconfig lo:0 $VIP netmask 255.255.255.255 broadcast $VIP
echo 1 > /proc/sys/net/ipv4/conf/lo/arp_ignore
echo 2 > /proc/sys/net/ipv4/conf/lo/arp_announce
echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore
echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce
echo “Real Server $( uname -n) started”
} function stop() {
ifconfig lo:0 down
ifconfig lo:0 $VIP netmask 255.255.255.255 broadcast $VIP
echo 0 > /proc/sys/net/ipv4/conf/lo/arp_ignore
echo 0 > /proc/sys/net/ipv4/conf/lo/arp_announce
echo 0 > /proc/sys/net/ipv4/conf/all/arp_ignore
echo 0 > /proc/sys/net/ipv4/conf/all/arp_announce
echo “Real Server $( uname -n) stopped”
} case $1 in
start) start ;; stop) stop ;; *) echo “Usage: $0 {start|stop}”
exit 1
esac |
我们保存退出后,需要给执行权限
1
|
chmoe a+x realserver |
另外我们将脚本拷贝到第二台web服务器上,然后执行上面同样的操作
1
|
scp realserver root@192.168.7.52: /DATA
|
然后在两台服务器上都需要执行这个脚本
1
|
. /realserver start
|
接着我们可以再查看一下ipvsadm
我们在两台服务器上分别执行
接下来我们就尝试通虚拟IP来尝试访问
192.168.7.50
我们回头看看里面lvs策略
1
2
|
vim /etc/keepalived/keepalived .conf
#回话超时50s |
最后我们说一下如何将realserver的脚本添加到随系统启动
我们将使用chkconfig --add 来管理服务器的添加、顺序
1
2
3
4
|
chkconfig --add realserver cp realserver /etc/init .d/ 将脚本拷贝到指定目录
chkconfig --add realserver 添加realserver脚本到自动启动 chkconfig --list 查看自动启动服务 |
通过以上配置后,我们就可以通过服务进行操作了
1
2
|
/etc/init .d /realserver stop
/etc/init .d /realserver start
|
1
|
chkconfig realserver on 设置为自动启动 |
本文转自 高文龙 51CTO博客,原文链接:http://blog.51cto.com/gaowenlong/1883564,如需转载请自行联系原作者