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

clip_image002

clip_image004

查看httpd 版本

clip_image006

接下来我们首先要为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 >

clip_image008

启动服务

1
Systemctl start httpd

clip_image010

然后添加默认的防火墙端口8o

1
Firewall-cmd --zone=public --add-port= '80/tcp'  --permanent

clip_image012

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

添加一下格式

1
<port portocal= 'tcp'  port= '80' >

clip_image014

接下来我们在本地访问测试一下

clip_image016

接下来我们也同样按照方法部署第二台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 >

clip_image018

测试访问

clip_image020

接下来开始安装LVS

我们在192.168.7.53上

1
yum  install  ipvsdm

clip_image022

安装完成

clip_image024

clip_image026

我们同样在第二台服务器上也安装IVS

192.168.7.54

1
yum  install  -y ipvsadm

clip_image028

clip_image029

接下来我们继续安装keeplived,我们是Keepalived服务和lvs在同一台服务器上

我们首先在第一台服务器上安装,192.168.7.53

1
yum  install  keepalived

clip_image031

clip_image033

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

clip_image035

接下来清空配置

1
Echo > keepalived keepalived.conf

clip_image037

然后粘贴以下代码,需要注意的是里面interface需要跟当前的系统对应,不然会无法监听端口;

通过ip a sh 查看,比如默认一般是eth0,而我的系统是ens160

clip_image039

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
}
}
}

clip_image041

我们接着在第二台服务器也安装keepalived

clip_image043

我们同样备份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

clip_image044

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
}
}
}

clip_image046

接下来就是测试keepalived的配置了

我们在两台服务器上分别启动keepalived服务

1
systemctl start keepalived

我们在master上查看网络监听状态。

clip_image048

然后在Master主机上查看网络监听状态。

clip_image050

然后我们查看master主机上的ipvsadm

clip_image052

我们通过以上可以得知,虚拟ip此时绑定在192.168.7.53--master上,然后停止192.168.7.53上的keepalived服务,查看查看192.168.7.54--Backup上的虚拟ip状态,已经监听到了Backup主机的网络端口上。

clip_image054

然后主机的状态就没有虚拟ip了

clip_image056

另外我们查看一下ipvsadm的状态。

首先是master主机上的:

clip_image058

然后是backup上的

clip_image060

我们可以查看一下切换的log

我们在第二台服务器上查看log

1
cat  /etc/log/message

clip_image062

以上的配置,keepalived的高可用功能已经实现。

我们也可以查看一下keepalived的状态

1
systemctl status keepalived

clip_image064

代理服务器之间的负载均衡

接下来我们要实现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

clip_image066

我们保存退出后,需要给执行权限

1
chmoe a+x realserver

clip_image068

另外我们将脚本拷贝到第二台web服务器上,然后执行上面同样的操作

1
scp  realserver root@192.168.7.52: /DATA

clip_image070

然后在两台服务器上都需要执行这个脚本

1
. /realserver  start

clip_image072

clip_image074

接着我们可以再查看一下ipvsadm

我们在两台服务器上分别执行

clip_image076

clip_image078

接下来我们就尝试通虚拟IP来尝试访问

192.168.7.50

我们回头看看里面lvs策略

1
2
vim  /etc/keepalived/keepalived .conf
#回话超时50s

clip_image080

clip_image082

clip_image084

最后我们说一下如何将realserver的脚本添加到随系统启动

我们将使用chkconfig --add 来管理服务器的添加、顺序

1
2
3
4
chkconfig --add realserver
cp  realserver  /etc/init .d/ 将脚本拷贝到指定目录
chkconfig --add realserver 添加realserver脚本到自动启动
chkconfig --list 查看自动启动服务

clip_image086

通过以上配置后,我们就可以通过服务进行操作了

1
2
/etc/init .d /realserver  stop
/etc/init .d /realserver  start

clip_image088

1
chkconfig realserver on 设置为自动启动

clip_image090




本文转自 高文龙 51CTO博客,原文链接:http://blog.51cto.com/gaowenlong/1883564,如需转载请自行联系原作者

相关实践学习
部署高可用架构
本场景主要介绍如何使用云服务器ECS、负载均衡SLB、云数据库RDS和数据传输服务产品来部署多可用区高可用架构。
负载均衡入门与产品使用指南
负载均衡(Server Load Balancer)是对多台云服务器进行流量分发的负载均衡服务,可以通过流量分发扩展应用系统对外的服务能力,通过消除单点故障提升应用系统的可用性。 本课程主要介绍负载均衡的相关技术以及阿里云负载均衡产品的使用方法。
相关文章
|
4月前
|
Linux 网络安全 Apache
Centos下操作Apache httpd
Centos下操作Apache httpd
70 0
|
1月前
|
Java Linux
Flume【环境搭建 01】CentOS Linux release 7.5 安装配置 apache-flume-1.9.0 并验证
【2月更文挑战第16天】Flume【环境搭建 01】CentOS Linux release 7.5 安装配置 apache-flume-1.9.0 并验证
34 0
|
16天前
|
Linux Apache
CentOS 7 源码安装LAMP环境源 和apache监听别的端口
CentOS 7 源码安装LAMP环境源 和apache监听别的端口
12 0
|
2月前
|
存储 缓存 运维
解密一致性哈希算法:实现高可用和负载均衡的秘诀
解密一致性哈希算法:实现高可用和负载均衡的秘诀
159 0
|
3月前
|
Kubernetes 负载均衡 监控
Kubernetes高可用集群二进制部署(一)主机准备和负载均衡器安装
Kubernetes高可用集群二进制部署(一)主机准备和负载均衡器安装
|
3月前
|
缓存 负载均衡 应用服务中间件
【分布式技术专题】「分析Web服务器架构」Tomcat服务器的运行架构和LVS负载均衡的运行机制(修订版)
在本章内容中,我们将深入探讨 Tomcat 服务器的运行架构、LVS 负载均衡的运行机制以及 Cache 缓存机制,并提供相应的解决方案和指导。通过理解这些关键概念和机制,您将能够优化您的系统架构,提高性能和可扩展性。
207 4
【分布式技术专题】「分析Web服务器架构」Tomcat服务器的运行架构和LVS负载均衡的运行机制(修订版)
|
4月前
|
tengine Kubernetes Cloud Native
Tengine-Ingress 高性能高可用的云原生网关
Tengine-Ingress 高性能高可用的云原生网关
|
4月前
|
中间件 Linux 网络安全
CentOS 7系统下Apache服务部署
对前篇博客(十七)进行一个修正与补充 基于不同的端口号,实现多虚拟主机部署并访问
42 0
|
5月前
|
负载均衡 算法 网络协议
Keepalived+LVS搭建高可用负载均衡
Keepalived+LVS搭建高可用负载均衡
182 1
|
1月前
|
消息中间件 API Apache
官宣|阿里巴巴捐赠的 Flink CDC 项目正式加入 Apache 基金会
本文整理自阿里云开源大数据平台徐榜江 (雪尽),关于阿里巴巴捐赠的 Flink CDC 项目正式加入 Apache 基金会。
1412 1
官宣|阿里巴巴捐赠的 Flink CDC 项目正式加入 Apache 基金会