二:项目案例-如图

LVS/DR+Keepalived 实现lvs高可用,并提供web服务负载均衡

案例环境:版本及相及IP地址的分配


名称(Name)

Ip_address

LVS-DR-DIP:eth0

LVS-DR-DIP:eth0

172.16.88.88/16

172.16.88.66/16

LVS-DR-VIP:eth0:0

172.16.88.100/16

WEB1-Real-Server:eth0

172.16.88.10/16

WEB2-Real-Server:eth0

172.16.88.20/16

软件及版本:Vmware  Station-RHEL 5.8(2.6.18

实验拓扑图如下:
133002225.png

配置过程如下:

Realserver1:172.16.88.10/16配置

第一步:设置主机名、IP地址、hosts文件IP地址和主机名对应关系,及关闭selinux

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
[root@localhost ~]# sed -i 's@\(HOSTNAME=\).*@\1Real1.example.com@g' /etc/sysconfig/network
[root@localhost ~]# hostname Real1.example..com
[root@localhost ~]# vim /etc/hosts
172.16 . 88.10 Real1.example.com   Real1
172.16 . 88.20 Real2.example.com   Real2
[root@Real1 ~]# vim /etc/sysconfig/network-scripts/ifcfg-eth0
# Advanced Micro Devices [AMD] 79c970 [PCnet32 LANCE]
# Real Service Ip_address Information
DEVICE=eth0
BOOTPROTO= static
IPADDR= 172.16 . 88.10
NETMASK= 255.255 . 0.0
GATEWAY= 172.16 . 0.1
ONBOOT=yes
HWADDR= 00 :0c: 29 :4b: 88 :1f
[root@Real1 ~]# service network restart

第二步:建立Realserver之间建立SSH互信及时间同步:

1
2
3
4
5
[root@Real1 ~]# ssh-keygen -t rsa -f ~/.ssh/id_rsa -P ''
[root@Real1 ~]# ssh-copy-id -i .ssh/id_rsa.pub root@ 172.16 . 88.20
[root@Real1 ~]# service ntpd stop && chkconfig ntpd off && ntpdate 172.16 . 0.1
[root@Real1 ~]# crontab -e
*/ 3 * * * * /sbin/ntpdate 172.16 . 0.1 &> /dev/ null


第三步:创建Shell_Scripts,在这里,我们的RealServer提供的是web服务器,所以在这里我们采用脚本的方式来对Realserver进行配置,脚本内容如下:

[root@Real1 ~]# vim /scripts/realserver.sh              ##创建脚本实现vip地址以和默认路由的设置以及对外网ARP请求的相关设置

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
#!/bin/bash
#
# Script to start LVS DR real server.
# chkconfig: - 90 10
# description: LVS DR real server
#
.  /etc/rc.d/init.d/functions
VIP= 172.16 . 88.100
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
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
;;
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


第四步:给此脚本执行权限并安装httpd二进制软件包,提供web服务

1
2
3
4
5
6
7
8
[root@Real1 ~]#  chmod +x /scripts/realserver.sh
[root@Real1 ~]# .realserver.sh start      ##运行此脚本,传递一个参数为start,即可设置vip地址、默认路由、对与外网arp请求参数
[root@Real1 ~]# service ntpd stop && ntpdate 172.16 . 0.1 ##这里实现时间同步,使用的ntpdate+crontab来实现,也可以通过system-config-date来做相关设置即可。
[root@Real1 ~]# crontab -e
*/ 3 *   *   *   *   /sbin/ntpdate 172.16 . 0.1 &>/dev/ null
[root@Real1 ~]# yum install httpd -y
[root@Real1 ~]# echo "Real1 Server-1" > / var /www/html/index.txt      ##提供网页内容,用于测试
[root@Real1 ~]# service httpd restart

[root@Real1 ~]# netstat -ntupl | grep 80   &&   curl httpd://172.16.88.10

210706998.png

这样Realserver1的基本设置就完成了,Realserver2的设置和Realserver1完全相同,所以笔者在这里就不再演示。

[root@Real2 ~]# curl http://172.16.88.20

211812909.png


Director1 Server Configure

Keepalived在这里主要用作RealServer的健康状态检查以及LoadBalance主机(172.16.88.88/16)和Backup主机(172.16.88.66/16)之间failover的实现

下面为二台lvs调度服务器,安装lvs+keepalived软件包。安装lvs软件包,因为keepalived是运行在lvs之上的,因此lvs及keepalived必须装在一个系统里面。

第一步:设置主机名和/etc/hosts对照关系及两台Director调度器之间建立SSH互信:

Director Router1操作步骤

1
2
3
4
5
6
7
8
9
[root@localhost ~]# setup    ##设置IP地址为 172.16 . 88.88 / 16
[root@localhost ~]# sed -i 's@\(HOSTNAME=\).*@\1Director1.example.com@g' /etc/sysconfig/network    ##修改主机名
[root@localhost ~]# hostname Director1.example.com
[root@localhost ~]# logout     ##可以选择注销和重启来使配置文件生效
[root@Director1 ~]# vim /etc/hosts    ##添加IP地址和主机名的映射关系
172.16 . 88.88 Director1.example.com        Director1
172.16 . 88.66 Director2.example.com        Director2
[root@Director1 ~]# ssh-keygen -t rsa -f ~/.ssl/id_rsa -P '' ##建立两台调度服务器之间的SSH互信,用于Director服务之间复制文件,也可以使用跳板级来实现部署。
[root@Director1 ~]# ssh-copy-id -i ./.ssl/id_rsa.pub Director2

第二步:IP地址信息及开路由转发功能:

191512348.png

192231335.png

[root@Director ~]# sysctl -p     ##重新加载/etc/sysctl.conf配置文件


Director Router2操作步骤:

第一步:配置IP、主机名、hosts 、SSH互信

1
2
3
4
5
6
7
8
9
[root@localhost ~]# setup   ##设置IP地址为 172.16 . 88.66 / 16
[root@localhost ~]# sed -i 's@\(HOSTNAME=\).*@\1Director2.example.com@g' /etc/sysconfig/network
[root@localhost ~]# hostname Director2.example.com
[root@localhost ~]# logout    ##重新登录,读取配置文件(/etc/sysconfig/network)
[root@Director2 ~]# vim /etc/hosts   ##添加如下两行,完成IP地址和主机名对应关系,然后保存退出即可。
172.16 . 88 .88Director1.example.comDirector1
172.16 . 88 .66Director2.example.comDirector2
[root@Director2 ~]# ssh-keygen -t rsa -f ~/.ssl/id_rsa -P ''
[root@Director2 ~]# ssh-copy-id -i ./.ssl/id_rsa.pub Director2 ##以上的操作步骤,就完成了两台调度器之间建立SSH互信工作

第二步:安装ipvsadm和keepalived软件包

1
2
[root@Director1 ~]# yum install ipvsadm -y
[root@Director1 ~]# yum --nogpgcheck localinstall keepalived- 1.2 . 7 - 5 .el5.i386.rpm -y

第三步:keepalived主配置文件格式及对每一个参数做详细的解释:

keepalived分为三个部分:

                                      全局配置、VRRP定义配置、虚拟服务器定义

全局配置格式:

1
2
3
4
5
6
7
8
9
global_defs {
notification_email {
root@localhost  ##接收邮件的用户
}
notification_email_from keepalived@localhost   ##发件用户为keepalived
smtp_server 127.0 . 0.1 ##邮件服务器
smtp_connect_timeout 30 ##连接请求超时时常
router_id LVS_DEVEL     ##路由ID
}


VRRP定义配置格式:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
vrrp_instance VI_1 {    ##定义虚拟路由
state MASTER        ##两种状态分别是{MASTER|BACKUP}
interface eth0      ##对外提供服务及通告所使用的接口
virtual_router_id 51 ##虚拟路由标识ID
priority 101 ##{MASTER|BACKUP}的优先级,MASTER的优先级比BACKUP的优先级大
advert_int 1 ##同步通知间隔,MASTER与BACKUP负载均衡器之间同步检查的时间间隔,单位为秒
authentication {          ##验证类型和验证密码,目前类型主要有PASS、AH两种,通常使用的类型为PASS。
auth_type PASS
auth_pass keepalived
}
virtual_ipaddress {    ##虚拟ip(VIP)地址,可以有多个地址,每个地址占一行,不需要指定子网掩码。
172.16 . 88.100 / 16 dev eth0 label eth0: 0
}
}

虚拟服务器配置格式:

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
virtual_server 172.16 . 88.1 80 {  ##虚拟服务器(virtual_server)所使用的VIP地址及端口,实现负责均衡。
delay_loop 6 ##健康状态检查时间间隔,单位是秒。
lb_algo rr    ##负载均衡调度算法,LVS总共有八种调度算法,互联网应用常使用wlc或rr作为调度算法。
lb_kind DR   ##负载均衡模型,LVS包括三种模型,分别为DR、NAT、TUN。
nat_mask 255.255 . 0.0
persistence_timeout 50 ##会话保持时间(持久连接),默认为 50 秒。
protocol TCP     ##转发所使用的协议(protocol),{TCP|UPD}
real_server 172.16 . 88.10 80 {    ##后端应用服务器(real_server),用于提供用户的请求,有时也称为应用服务器群组。
weight 1 ##设定权值,对rr没有意义,一般应用服务器性能好的,可以将其权值设置大写,这样此应用服务器就能分担分担更多的用户请求资源并响应。
HTTP_GET {      ##健康状态检测{HTTP_GET|SSL_GET(https)|TCP_CHECK|SMTP_CHECK|MISC_CHECK            权值小的,根据不同的调度算法分担的请求量会少些。
url {
path /
status_code 200 ##页面返回代码值
}
connect_timeout 3 ##连接超时时常
nb_get_retry 3 ##连接重试的次数
delay_before_retry 3 ##延迟所使用的时间
}
}
real_server 172.16 . 88.10 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 . 88.20 80 {
weight 1
HTTP_GET {
url {
path /
status_code 200
}
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
}
}
}

第四步:将此Director1上的keepalived主配置文件复制到Director2上,并将其状态以及优先级修改为BACKUP和100,然后保存并退出即可。

1
2
3
4
[root@Director2 ~]#
[root@Director2 ~]# yum install ipvsadm -y
[root@Director2 ~]# yum --nogpgcheck localinstall keepalived- 1.2 . 7 - 5 .el5.i386.rpm -y
[root@Director1 ~]# scp /etc/keepalived/keepalived.conf Direcotr2:/etc/keepalived/keepalived.conf

第五步启动keepalived服务器并查看vip配置在哪台Director上。

1
2
3
[root@Director1 ~]# service keepalived restart     ##两台lvs同时启动keepalived服务
[root@Director2 ~]# service keepalived restart
[root@Director1 ~]# ifconfig    ##查看VIP地址是否配置在Director1调度服务器上


193746243.png

查看ipvsadm的虚拟服务器真实存在的Realserver主机记录

1
[root@Director1 ~]# ipvsadm -L -n

194431212.png

第六步:如何在维护模式下,模拟LVS服务器发生故障

只需在keepalived配置文件中,添加如下内容(vrrp实例之外添加如下内容):

1
2
3
4
5
6
7
vrrp_script chk_schedown {
script "[ -e /etc/keepalived/down ] && exit1 || exit 0 "
inerval 1
weight - 5
fall 2
rise 1
}

当vrrps事务发生改变时,运行此脚本:只需要在vrrp实例内添加如下内容即可

1
2
3
track_script {
chk_schedown
}

在两台调度服务器上,重启keepalived进程,加载主配置文件

195516535.png

当手动在/etc/keepalived目录中创建down文件时,主服务就会变成backup服务器,则从backup模式转换为master模式

1
2
手动创建down文件,查看主从是否切换
[root@Director1 ~]# touch /etc/keepalived/down

1、查看日志信息

201131932.png

日志分析:

1
2
3
通过日志信息,不难发现两台调度服务器重新选举主服务来提供服务,因为在Director1相关目录上手动创建了down文件,触发了chk_schedown脚本,
所以Director1的优先级从 101 变为了 96 ,所以从主服务器变为了从服务器(BACKUP)移除vip地址,因此Director2变为主(MASTER)服务器,添加vip地址,
以及自主发起arp请求及响应arp请求,来更新记录。

2、查看vip地址相关信息

201215491.png

第七步:如果提供的两台应用服务里(web),由于其他原因出现故障,该如何解决呢:

1
2
3
4
5
只需要在/etc/keepalived/keepalived.conf,在virtual_server中添加如下内容:
[root@Director1 ~]# vim /etc/keepalived/keepalived.conf
sorry_service 127.0 . 0.1 : 80
然后分别重启keepalived服务进程
注:前提两台调度服务器都提供httpd服务,并且提供web错误页面信息


第八步:模拟两台应用程序服务出现故障

1
2
3
4
[root@Real1 ~]# /etc/init.d/httpd stop
Stopping httpd:                                            [  OK  ]
[root@Real1 ~]# ssh Real2 'service httpd stop'
Stopping httpd: [  OK  ]

第九步:到调度服务器上利用ipvsadm工具查看ipvs规则

202933366.png

测试一:利用windows客户端访问172.16.88.100看是否发生变化:

203306699.png

测试二:到其中一台应用程序服务器从新启动httpd进程,并查看ipvsadm规则

1
2
[root@Real1 ~]# service httpd restart
[root@Director2 ~]# ipvsadm -L -n

203855448.png

再次通过windows客户端访问网页,看是否提供正常web服务

204525761.png