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

Centos7+Lvs+keeplived实现Apache高可用的负载均衡

Centos7+Lvs+keeplived实现Apache高可用的负载均衡

查看httpd 版本

Centos7+Lvs+keeplived实现Apache高可用的负载均衡

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

Centos7+Lvs+keeplived实现Apache高可用的负载均衡

启动服务

1
Systemctl start httpd

Centos7+Lvs+keeplived实现Apache高可用的负载均衡

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

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

Centos7+Lvs+keeplived实现Apache高可用的负载均衡

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

添加一下格式

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

Centos7+Lvs+keeplived实现Apache高可用的负载均衡

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

Centos7+Lvs+keeplived实现Apache高可用的负载均衡

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

Centos7+Lvs+keeplived实现Apache高可用的负载均衡

测试访问

Centos7+Lvs+keeplived实现Apache高可用的负载均衡

接下来开始安装LVS

我们在192.168.7.53上

1
yum install ipvsdm

Centos7+Lvs+keeplived实现Apache高可用的负载均衡

安装完成

Centos7+Lvs+keeplived实现Apache高可用的负载均衡

Centos7+Lvs+keeplived实现Apache高可用的负载均衡

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

192.168.7.54

1
yum install -y ipvsadm

Centos7+Lvs+keeplived实现Apache高可用的负载均衡

Centos7+Lvs+keeplived实现Apache高可用的负载均衡

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

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

1
yum install keepalived

Centos7+Lvs+keeplived实现Apache高可用的负载均衡

Centos7+Lvs+keeplived实现Apache高可用的负载均衡

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

Centos7+Lvs+keeplived实现Apache高可用的负载均衡

接下来清空配置

1
Echo > keepalived keepalived.conf

Centos7+Lvs+keeplived实现Apache高可用的负载均衡

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

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

Centos7+Lvs+keeplived实现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
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
}
}
}

Centos7+Lvs+keeplived实现Apache高可用的负载均衡

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

Centos7+Lvs+keeplived实现Apache高可用的负载均衡

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

Centos7+Lvs+keeplived实现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
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
}
}
}

Centos7+Lvs+keeplived实现Apache高可用的负载均衡

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

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

1
systemctl start keepalived

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

Centos7+Lvs+keeplived实现Apache高可用的负载均衡

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

Centos7+Lvs+keeplived实现Apache高可用的负载均衡

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

Centos7+Lvs+keeplived实现Apache高可用的负载均衡

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

Centos7+Lvs+keeplived实现Apache高可用的负载均衡

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

Centos7+Lvs+keeplived实现Apache高可用的负载均衡

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

首先是master主机上的:

Centos7+Lvs+keeplived实现Apache高可用的负载均衡

然后是backup上的

Centos7+Lvs+keeplived实现Apache高可用的负载均衡

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

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

1
cat /etc/log/message

Centos7+Lvs+keeplived实现Apache高可用的负载均衡

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

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

1
systemctl status keepalived

Centos7+Lvs+keeplived实现Apache高可用的负载均衡

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

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

Centos7+Lvs+keeplived实现Apache高可用的负载均衡

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

1
chmoe a+x realserver

Centos7+Lvs+keeplived实现Apache高可用的负载均衡

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

1
scp realserver root@192.168.7.52:/DATA

Centos7+Lvs+keeplived实现Apache高可用的负载均衡

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

1
./realserver start

Centos7+Lvs+keeplived实现Apache高可用的负载均衡

Centos7+Lvs+keeplived实现Apache高可用的负载均衡

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

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

Centos7+Lvs+keeplived实现Apache高可用的负载均衡

Centos7+Lvs+keeplived实现Apache高可用的负载均衡

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

192.168.7.50

我们回头看看里面lvs策略

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

Centos7+Lvs+keeplived实现Apache高可用的负载均衡

Centos7+Lvs+keeplived实现Apache高可用的负载均衡

Centos7+Lvs+keeplived实现Apache高可用的负载均衡

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

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

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

Centos7+Lvs+keeplived实现Apache高可用的负载均衡

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

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

Centos7+Lvs+keeplived实现Apache高可用的负载均衡

1
chkconfig realserver on 设置为自动启动

Centos7+Lvs+keeplived实现Apache高可用的负载均衡




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

上一篇:0013-如何在Kerberos与非Kerberos的CDH集群BDR不可用时复制数据


下一篇:Electron安装/打包错误的问题总结