通过keepalived实现LVS的高可用,实现WEB的高可用

简介:

通过keepalived实现LVS的高可用,实现WEB的高可用

keepalived简介

        keepalived是一个类似于layer3, 4 & 5交换机制的软件,也就是我们平时说的第3层、第4层和第5层交换。Keepalived的作用是检测web服务器的状态,如果有一台web服务器死机,或工作出现故障,Keepalived将检测到,并将有故障的web服务器从系统中剔除,当web服务器工作正常后Keepalived自动将web服务器加入到服务器群中,这些工作全部自动完成,不需要人工干涉,需要人工做的只是修复故障的web服务器。

keepalived作用

    主要用作RealServer的健康状态检查以及LoadBalance主机和BackUP主机之间failover的实现。

VRRP

   虚拟路由器冗余协议(VRRP)是一种选择协议,它可以把一个虚拟路由器的责任动态分配到局域网上的 VRRP 路由器中的一台。控制虚拟路由器 IP 地址的 VRRP 路由器称为主路由器,它负责转发数据数据包到这些虚拟 IP 地址。一旦主路由器不可用,这种选择过程就提供了动态的故障转移机制,这就允许虚拟路由器的 IP 地址可以作为终端主机的默认第一跳路由器。使用 VRRP 的好处是有更高的默认路径的可用性而无需在每个终端主机上配置动态路由或路由发现协议。

 

简单的来说:keepalived 是为了实现HA的一个底层的工具,同样也为ipvs提供了自动定义生效规则,而且能够基于VRRP协议实现虚拟ip的转移。



实现LVS的高可用

两个HA节点

204037163.png

(基本是相同的设置,做node1的演示)

关掉selinux

1
2
3
4
5
# setenforce 0
或者
# vim /etc/selinux/config
##修改
SELINUX=permissive

配置主机名,保持主机名一致

1
2
3
4
5
# hostname node1.doubao.com
# vim /etc/sysconfig/network
##修改如下:
HOSTNAME=node1.doubao.com  #当然HA2上要改为node2
:wq  #保存退出

主机名称解析:

 

1
2
3
4
# vim /etc/hosts
##添加如下内容
172.16.111.6node1.doubao.com node1
172.16.111.7node2.doubao.com node2

双机互信:

1
2
#ssh-keygen -t rsa -f ~/.ssh/id_rsa -P '' 生成密钥
#ssh-copy-id -i .ssh/id_rsa.pub root@node2 ##将公钥文件发送到HA2上边

时间同步:

1
# hwclock –s #由于笔者的实验环境特殊,暂用此方法,也可以使用ntpdate的方法进行更新

配置好yum

http://407711169.blog.51cto.com/6616996/1179601 ## 此处前边是一个配置yum的例子

安装配置HAkeepalived工具及负载均衡管理工具ipvsadm

下载好 keepalived-1.2.7-5.el5.i386.rpm (附件已经上传)

1
# yum -y --nogpgcheck localinstall keepalived-1.2.7-5.el5.i386.rpm

 

编辑keepalived的配置文件:

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
######这里是个修改过的,我贴出来了,大家可以直接使用
! Configuration File  for  keepalived
global_defs {
notification_email {
linuxedu@foxmail.com
mageedu@126.com
}
notification_email_from kanotify@magedu.com
smtp_connect_timeout 3
smtp_server 127.0.0.1
router_id LVS_DEVEL
}
vrrp_script chk_schedown {
script  "[[ -f /etc/keepalived/down ]] && exit 1 || exit 0"
interval 2
weight -2
}
vrrp_instance VI_1 {
interface eth0
state MASTER
priority 101
virtual_router_id 51
garp_master_delay 1
authentication {
auth_type PASS
auth_pass password
}
track_interface {
eth0
}
virtual_ipaddress {
172.16.111.1 /16  dev eth0 label eth0:0
}
track_script {
chk_schedown
}
}
virtual_server 172.16.111.1 80 {
delay_loop 6
lb_algo rr
lb_kind DR
persistence_timeout 50
protocol TCP
#    sorry_server 127.0.0.1 80
real_server 172.16.111.16 80 {
weight 1
HTTP_GET {
url {
path /
status_code 200
}
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
}
}
real_server 172.16.1111.17 80 {
weight 1
HTTP_GET {
url {
path /
status_code 200
}
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
}
}
}

如果要使用TCP_CHECK检测各realserver的健康状态,那么,上面关于realserver部分的定义也可以替换为如下内容:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
virtual_server 172.16.100.1 80 {
delay_loop 6
lb_algo rr
lb_kind DR
persistence_timeout 300
protocol TCP
sorry_server 127.0.0.1 80
real_server 172.16.100.11 80 {
weight 1
TCP_CHECK {
tcp_port 80
connect_timeout 3
}
}
real_server 172.16.100.12 80 {
weight 1
TCP_CHECK {
connect_port 80
connect_timeout 3
}
}
}
1
 

说明:其中的sorry_server是用于定义所有realserver均出现故障时所用的服务器。

后复制到另外个虚拟机中,

1
2
##记得改state改为BACKUP
##将priority 改为100

yumipvsadm

1
2
3
# yum install ipvsadm -y
然后开启服务:
# service ipvsadm start

RS端的设置

(同样两个在两个RS分别执行)

1
2
3
4
5
6
关掉selinux
# setenforce 0
或者
# vim /etc/selinux/config
##修改
SELINUX=permissive

时间同步。

1
# hwclock –s #由于笔者的实验环境特殊,暂用此方法,也可以使用ntpdate的方法进行更新

配置好yum

http://407711169.blog.51cto.com/6616996/1179601 ## 此处前边是一个配置yum的例子

安装httpd服务

 

1
2
3
4
5
# yum install httpd –y
# vim /var/www/html/index.html
###添加如下内容
1111111111111111 #最标示RS1的作用,我们在RS2中添加22222
# service httpd start##开启服务

这个时候可以打开浏览器输入下172.16.111.16 172.16.111.17来测试下界面

204949910.png

204950613.png

 

 


设置负载均衡集群

这里只需要在各个RS节点中运行下如下的脚本,就可以了。(当然如果不怕麻烦的同学可以手动添加,内容和脚本start中的内容一致)

 

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
# vim start.sh
##添加如下内容
#!/bin/bash
#
# Script to start LVS DR real server.
# description: LVS DR real server
#
. /etc/rc .d /init .d /functions
VIP=172.16.111.1
host=` /bin/hostname `
case  "$1"  in
start) ##手动添加只需要进行下边的操作
# Start LVS-DR real server on this machine.
/sbin/ifconfig  lo down
/sbin/ifconfig  lo up
echo  1 >  /proc/sys/net/ipv4/conf/lo/arp_ignore  #定义接收到ARP请求时的响应级别
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
/sbin/ifconfig  lo:0 $VIP broadcast $VIP netmask 255.255.255.255 up定义广播地址为自播模式
/sbin/route  add -host $VIP dev lo:0 ##定义主机为172.16.111.1的地址使用lo:0为源地址##手动添加操作到此
;;
stop)
# Stop LVS-DR real server loopback device(s).
/sbin/ifconfig  lo:0 down
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
;;
status)
# Status of LVS-DR real server.
islothere=` /sbin/ifconfig  lo:0 |  grep  $VIP`
isrothere=` netstat  -rn |  grep  "lo:0"  grep  $VIP`
if  [ !  "$islothere"  -o !  "isrothere"  ]; then
# Either the route or the lo:0 device
# not found.
echo  "LVS-DR real server Stopped."
else
echo  "LVS-DR real server Running."
fi
;;
*)
# Invalid entry.
echo  "$0: Usage: $0 {start|status|stop}"
exit  1
;;
esac
:wq #保存退出
# chmod +x start.sh
# ./start.sh start #执行脚本

通过keepalived实现LVS的高可用

HA的两个节点上分别开启keepalived服务

1
# service keepalived start

等到两个HA服务都开启时

可以使用 ip addr show 查看下其网卡状态

205745834.png

查看ipvsadm规则:

1
2
3
4
5
6
7
[root@node1 keepalived] # ipvsadm -L -n
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:PortForward Weight ActiveConn InActConn
TCP172.16.111.1:80 rr ##轮询调度算法
-> 172.16.111.17:80Masq100
-> 172.16.111.16:80Route101

这个时候打开浏览器,输入172.16.111.1

205902260.png

刷新下浏览器

205919363.png

这样正好对照了rr轮询规则。这个实验到此为止,当然你可以进行一些别的测试,这里我们就不在进行。



实现WEB的高可用

做这个实验。上边用到的两个RS已经没有用处了。这里我们直接在上边实验过程中的两个HA上做修改。

先关掉keepalived服务

1
2
3
4
5
6
7
8
# service keepalived stop
安装httpd 服务
# yum install httpd -y
##添加测试页面
# vim /var/www/html/index.html
<h1>node1< /h1 > # HA2为node2
##开始服务
# service httpd start

打开网页测试下两个页面

210035222.png

210036932.png

 

这个时候我们需要去配置keepalived的配置文件


主从节点的配置

配置keepalived配置文件

 

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
# cd /etc/keepalived/
# vim keepalived.conf
! Configuration File  for  keepalived
global_defs {
notification_email {
linuxedu@foxmail.com
mageedu@126.com
}
notification_email_from kanotify@magedu.com
smtp_connect_timeout 3
smtp_server 127.0.0.1
router_id LVS_DEVEL
}
vrrp_script chk_httpd {
script  "killall -0 httpd"
interval 2
# check every 2 seconds
weight -2
# if failed, decrease 2 of the priority
fall 2
# require 2 failures for failures
rise 1
# require 1 sucesses for ok
}
vrrp_script chk_schedown {
script  "[[ -f /etc/keepalived/down ]] && exit 1 || exit 0"
interval 2
weight -2
}
vrrp_instance VI_1 {
interface eth0
# interface for inside_network, bound by vrrp
state MASTER
# Initial state, MASTER|BACKUP
# As soon as the other machine(s) come up,
# an election will be held and the machine
# with the highest "priority" will become MASTER.
# So the entry here doesn't matter a whole lot.
priority 101
# for electing MASTER, highest priority wins.
# to be MASTER, make 50 more than other machines.
virtual_router_id 51
# arbitary unique number 0..255
# used to differentiate multiple instances of vrrpd
# running on the same NIC (and hence same socket).
garp_master_delay 1
authentication {
auth_typePASS
auth_pass password
}
track_interface {
eth0
}
# optional, monitor these as well.
# go to FAULT state if any of these go down.
virtual_ipaddress {
172.16.111.1 /16  dev eth0 label eth0:0
}
#addresses add|del on change to MASTER, to BACKUP.
#With the same entries on other machines,
#the opposite transition will be occuring.
#<IPADDR>/<MASK> brd <IPADDR> dev <STRING> scope <SCOPE> label <LABEL>
track_script {
chk_httpd
chk_schedown
}
notify_master  "/etc/keepalived/notify.sh master"
notify_backup  "/etc/keepalived/notify.sh backup"
notify_fault  "/etc/keepalived/notify.sh fault"
}

然后将其复制到节点HA2

1
# scp keepalived.conf notify.sh node2:/etc/keepalived/

然后在HA2中对配置文件坐下进一步修改 2处:

1
2
state MASTER ##改为BUCKUP (从节点)
priority 101 ##优先级改为100

分别在两边开启服务开启服务。

1
2
3
# service keepalived start
这时候查看一下网卡信息
# ip addr show

可以看出来网卡172.16.111.1已经在网卡eth0:0上了

210339913.png

打开网页输入172.16.111.1查看

210357347.png

可以发现确实在节点HA1

这个时候我们可以仿照HA1服务故障:(配置文件中可以留意在其文件中创建一个down文件可以模拟其服务故障)

210439899.png

210439294.png

然后打开网页测试下:

210457256.png

显然已经变成了HA2http页面

大家可以继续做测试,删掉dwon文件


双主模型

继续在上边实验的基础上,

分别在两个配置文件后边加上如下内容

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
#######HA1
vrrp_instance VI_2 {
interface eth0
state BACKUP # BACKUP for slave routers ##这个地方HA1做从
priority 100 # 100 for BACKUP## 优先级低于HA2的此处
virtual_router_id 52
garp_master_delay 1
authentication {
auth_typePASS
auth_pass password
}
track_interface {
eth0
}
virtual_ipaddress {
172.16.111.2 /16  dev eth0 label eth0:1 #172.16.111.2
}
track_script {
chk_httpd
chk_schedown
}
notify_master  "/etc/keepalived/notify.sh master eth0:1"
notify_backup  "/etc/keepalived/notify.sh backup eth0:1"
notify_fault  "/etc/keepalived/notify.sh fault eth0:1"
}

然后重启服务做测试:

 

210601463.png

210602509.png

然后打开网页做测试

 

210624432.png

210625450.png

这个时候我们继续来仿照做下HA1的故障测试:

 

210706319.png

210707539.png

这个时候可以刷新下两个web页面,可以看出来页面都是node2的页面,这里就不在做测试,大家可以自行测试










本文转自 陈延宗 51CTO博客,原文链接:http://blog.51cto.com/407711169/1201228,如需转载请自行联系原作者
相关实践学习
部署高可用架构
本场景主要介绍如何使用云服务器ECS、负载均衡SLB、云数据库RDS和数据传输服务产品来部署多可用区高可用架构。
负载均衡入门与产品使用指南
负载均衡(Server Load Balancer)是对多台云服务器进行流量分发的负载均衡服务,可以通过流量分发扩展应用系统对外的服务能力,通过消除单点故障提升应用系统的可用性。 本课程主要介绍负载均衡的相关技术以及阿里云负载均衡产品的使用方法。
目录
相关文章
|
5月前
|
负载均衡 应用服务中间件 Linux
Nginx系列教程(14) - LVS+KeepAlived+Nginx实现高性能负载均衡集群
Nginx系列教程(14) - LVS+KeepAlived+Nginx实现高性能负载均衡集群
175 0
|
3月前
|
缓存 负载均衡 应用服务中间件
【分布式技术专题】「分析Web服务器架构」Tomcat服务器的运行架构和LVS负载均衡的运行机制(修订版)
在本章内容中,我们将深入探讨 Tomcat 服务器的运行架构、LVS 负载均衡的运行机制以及 Cache 缓存机制,并提供相应的解决方案和指导。通过理解这些关键概念和机制,您将能够优化您的系统架构,提高性能和可扩展性。
205 4
【分布式技术专题】「分析Web服务器架构」Tomcat服务器的运行架构和LVS负载均衡的运行机制(修订版)
|
4月前
|
负载均衡 监控 调度
Keepalived+Lvs(dr)调度器主备配置小实验
Keepalived和LVS(Linux Virtual Server)是两个常用的开源软件,通常结合使用以提供高可用性和负载均衡的解决方案。 Keepalived是一种用于实现高可用性的软件,它可以监控服务器的健康状态,并在主服务器出现故障时自动切换到备份服务器。
95 2
|
4月前
|
负载均衡 网络协议 Linux
小白带你学习linux的keepalived+lvs和keepalived双机热备(三十七)
小白带你学习linux的keepalived+lvs和keepalived双机热备(三十七)
75 0
|
5月前
|
负载均衡 算法 网络协议
Keepalived+LVS搭建高可用负载均衡
Keepalived+LVS搭建高可用负载均衡
180 1
|
6月前
|
负载均衡 应用服务中间件 nginx
71分布式电商项目 - nginx高可用以及lvs+nginx负载均衡(资料)
71分布式电商项目 - nginx高可用以及lvs+nginx负载均衡(资料)
40 0
|
7月前
|
负载均衡 监控 Linux
LVS + keepalived
LVS + keepalived
65 1
|
7月前
|
负载均衡 测试技术
LVS+KeepAlived构建高可用集群
LVS+KeepAlived构建高可用集群
54 0
|
7月前
|
缓存 负载均衡 网络协议
LVS+KeepAlived快速入门2
LVS+KeepAlived快速入门2
91 0
|
7月前
|
负载均衡 算法 网络协议
LVS+KeepAlived快速入门1
LVS+KeepAlived快速入门2
70 0