设为首页 收藏本站
查看: 4358|回复: 0

[经验分享] Centos7+Lvs+keeplived实现Apache高可用的负载均衡

[复制链接]
累计签到:1 天
连续签到:1 天
发表于 2016-12-19 12:42:08 | 显示全部楼层 |阅读模式
Centos7+Lvs+keeplived实现Apache高可用的负载均衡
近期一直在练习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



wKioL1hUxASQcjOEAAD6ABQ4xxs658.jpg
wKiom1hUxAmD98hwAADXqQ3nw1g017.jpg
查看httpd 版本
wKioL1hUxArBlvUGAAA10cTN6To140.jpg
接下来我们首先要为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>



wKiom1hUxAzDVggMAACUDr-_OWA532.jpg
启动服务
1
Systemctl start httpd



wKiom1hUxA3SsD2nAACPSSzUJ1A894.jpg
然后添加默认的防火墙端口8o
1
Firewall-cmd --zone=public --add-port='80/tcp' --permanent



wKiom1hUxA7DyO54AABBb98bJmY330.jpg
1
或者vim /etc/firewalld/zone/public.xml



添加一下格式
1
<port portocal='tcp' port='80'>



wKioL1hUxBCS9UhvAABaCJky90k800.jpg
接下来我们在本地访问测试一下
wKiom1hUxBGiXkKiAACHjpnlUCY525.jpg
接下来我们也同样按照方法部署第二台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>



wKiom1hUxBKDju5-AABMU7UHGnQ375.jpg
测试访问
wKiom1hUxBTTRoVZAAB-SId0K0w120.jpg
接下来开始安装LVS
我们在192.168.7.53上
1
yum install ipvsdm



wKioL1hUxBeB4TPHAAB5gQb93fY775.jpg
安装完成
wKioL1hUxBiyPCCOAACOANB_VI4320.jpg
wKiom1hUxBmjASgrAABOR2QKl8I290.jpg
我们同样在第二台服务器上也安装IVS
192.168.7.54
1
yum install -y ipvsadm



wKioL1hUxB7h8BbqAACLcHtPIVc189.jpg
wKioL1hUxB_QB3smAABORA354c4437.jpg
接下来我们继续安装keeplived,我们是Keepalived服务和lvs在同一台服务器上
我们首先在第一台服务器上安装,192.168.7.53
1
yum install keepalived



wKiom1hUxCGSapSmAADTedY6uRs690.jpg
wKiom1hUxCOx65tPAACyaEPjTwM120.jpg
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



wKiom1hUxCSxi2cSAAAzJVEAVa8503.jpg
接下来清空配置
1
Echo > keepalived keepalived.conf



wKioL1hUxCXgwHOtAAA1IZjnato279.jpg
然后粘贴以下代码,需要注意的是里面interface需要跟当前的系统对应,不然会无法监听端口;
通过ip a sh 查看,比如默认一般是eth0,而我的系统是ens160
wKiom1hUxCaxLoajAAB4PVQeLNY447.jpg
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
}
}
}



wKiom1hUxC6hp1t6AADRBIdumqA956.jpg
我们接着在第二台服务器也安装keepalived
wKiom1hUxDCD2fDrAADfQHEeiOs387.jpg
我们同样备份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
wKiom1hUxDLS-5FaAAB4JlFojeM450.jpg
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
}
}
}



wKiom1hUxDSDVpntAAC9Ld1xpiU475.jpg
接下来就是测试keepalived的配置了
我们在两台服务器上分别启动keepalived服务
1
systemctl start keepalived



我们在master上查看网络监听状态。
wKiom1hUxDWCkKNJAACQ-bvXkds162.jpg
然后在Master主机上查看网络监听状态。
wKiom1hUxDeC7bbQAADBUI9d-2w615.jpg
然后我们查看master主机上的ipvsadm
wKioL1hUxDjSQa0lAABsL8z20Tk591.jpg
我们通过以上可以得知,虚拟ip此时绑定在192.168.7.53--master上,然后停止192.168.7.53上的keepalived服务,查看查看192.168.7.54--Backup上的虚拟ip状态,已经监听到了Backup主机的网络端口上。
wKioL1hUxDmyLl9zAACoIbuGncg123.jpg
然后主机的状态就没有虚拟ip了
wKiom1hUxDvxxY1EAAC1YZBb4pU384.jpg
另外我们查看一下ipvsadm的状态。
首先是master主机上的:
wKiom1hUxDzgujMiAABGtFvIbnY935.jpg
然后是backup上的
wKiom1hUxD3SejRXAAB25QOK9Pk299.jpg
我们可以查看一下切换的log
我们在第二台服务器上查看log
1
cat /etc/log/message



wKiom1hUxD-A15VIAACIdMggJwg989.jpg
以上的配置,keepalived的高可用功能已经实现。
我们也可以查看一下keepalived的状态
1
systemctl status keepalived



wKioL1hUxEHDhm-rAADYHGcW2qY346.jpg
代理服务器之间的负载均衡
接下来我们要实现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



wKiom1hUxEOSgWBCAACaL0Few3M379.jpg
我们保存退出后,需要给执行权限
1
chmoe a+x realserver



wKiom1hUxETznkaPAAA7aD6cHaM766.jpg
另外我们将脚本拷贝到第二台web服务器上,然后执行上面同样的操作
1
scp realserver root@192.168.7.52:/DATA



wKioL1hUxEWRePQUAAArE_FfHx8945.jpg
然后在两台服务器上都需要执行这个脚本
1
./realserver start



wKioL1hUxEbBS25LAAAwgWpjLw4873.jpg
wKioL1hUxEfA0pZfAAAw47B9vWg080.jpg
接着我们可以再查看一下ipvsadm
我们在两台服务器上分别执行
wKiom1hUxEjgKti-AABpAN41sMs462.jpg
wKioL1hUxErzTDD8AABiqUhS0X4953.jpg
接下来我们就尝试通虚拟IP来尝试访问
192.168.7.50
我们回头看看里面lvs策略
1
2
vim /etc/keepalived/keepalived.conf
#回话超时50s



wKioL1hUxEuzfjoiAACwIDH_VdI733.jpg
wKiom1hUxEyyirCNAAB5exz_skA105.jpg
wKioL1hUxE6CMsumAAB_tkU5hqo304.jpg
最后我们说一下如何将realserver的脚本添加到随系统启动
我们将使用chkconfig --add 来管理服务器的添加、顺序
1
2
3
4
chkconfig --add realserver
cp realserver /etc/init.d/ 将脚本拷贝到指定目录
chkconfig --add realserver 添加realserver脚本到自动启动
chkconfig --list 查看自动启动服务



wKiom1hUxE_i-SCEAADRaXFyUwM712.jpg
通过以上配置后,我们就可以通过服务进行操作了
1
2
/etc/init.d/realserver stop
/etc/init.d/realserver start



wKioL1hUxFCj57FfAAA-SK87KDM919.jpg
1
chkconfig realserver on 设置为自动启动



wKioL1hUxFGDRSDxAABtuE72_84336.jpg


运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-316455-1-1.html 上篇帖子: lvs主主互备 下篇帖子: LVS负载均衡之nat模式的配置
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表