1. 规划环境:
主机名称 |
服务器名称 |
IP |
用途 |
centosnode1 |
LVS_Master |
192.168.188.223 |
提供负载均衡 |
centosnode2 |
LVS_Backup |
192.168.188.226 |
提供负载均衡 |
LVS-DR-VIP |
192.168.188.100 |
网站的VIP地址 | |
centosnode3 |
Web1服务器 |
192.168.188.227 |
提供Web服务 |
centosnode4 |
Web2服务器 |
192.168.188.228 |
提供Web服务 |
2. 配置LVS_Master的Keepalived实现LVS负载均衡:
[root@centosnode1 ~]# vim /etc/keepalived/keepalived.conf
! 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 MASTER
}
vrrp_instance VI_1 {
state MASTER
interface ens33
virtual_router_id 51
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.188.100 ##设置vip
}
}
virtual_server 192.168.188.100 80 { ##定义虚拟服务,需指定IP地址和端口,空格隔开
delay_loop 6 ##定义RS运行情况监测时间间隔
lb_algo rr ##设置负载均衡算法
lb_kind DR ##设置lvs的工作模式
persistence_timeout 50 ##定义会话保持时间,S为单位
protocol TCP ##指定转发协议
real_server 192.168.188.227 80 { ##定义真实服务器IP地址和端口
weight 1 ##定义RS的权重
TCP_CHECK { ##设置健康检查方式
connect_timeout 8 ##定义超出8s连接超时
nb_get_retry 3 ##定义重试次数
delay_before_retry 3 ##定义重试时间间隔
connect_port 80 ##定义健康检查端口
}
}
}
virtual_server 192.168.188.100 80 { ##定义虚拟服务,需指定IP地址和端口,空格隔开
delay_loop 6 ##定义RS运行情况监测时间间隔
lb_algo rr ##设置负载均衡算法
lb_kind DR ##设置lvs的工作模式
persistence_timeout 50 ##定义会话保持时间,S为单位
protocol TCP ##指定转发协议
real_server 192.168.188.228 80 { ##定义真实服务器IP地址和端口
weight 1 ##定义RS的权重
TCP_CHECK { ##设置健康检查方式
connect_timeout 8 ##定义超出8s连接超时
nb_get_retry 3 ##定义重试次数
delay_before_retry 3 ##定义重试时间间隔
connect_port 80 ##定义健康检查端口
}
}
}
3. 配置LVS_Backup的Keepalived实现LVS负载均衡:
[root@centosnode2 ~]# vim /etc/keepalived/keepalived.conf
! 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 MASTER
}
vrrp_instance VI_1 {
state BACKUP
interface ens33
virtual_router_id 51
priority 80
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.188.100 ##设置vip
}
}
virtual_server 192.168.188.100 80 { ##定义虚拟服务,需指定IP地址和端口,空格隔开
delay_loop 6 ##定义RS运行情况监测时间间隔
lb_algo rr ##设置负载均衡算法
lb_kind DR ##设置lvs的工作模式
persistence_timeout 50 ##定义会话保持时间,S为单位
protocol TCP ##指定转发协议
real_server 192.168.188.227 80 { ##配置后端真实服务器
weight 1
TCP_CHECK { ##设置健康检查方式
connect_timeout 8
nb_get_retry 3
delay_before_retry 3
connect_port 80
}
}
}
virtual_server 192.168.188.100 80 { ##定义虚拟服务,需指定IP地址和端口,空格隔开
delay_loop 6 ##定义RS运行情况监测时间间隔
lb_algo rr ##设置负载均衡算法
lb_kind DR ##设置lvs的工作模式
persistence_timeout 50 ##定义会话保持时间,S为单位
protocol TCP ##指定转发协议
real_server 192.168.188.228 80 { ##配置后端真实服务器
weight 1
TCP_CHECK { ##设置健康检查方式
connect_timeout 8
nb_get_retry 3
delay_before_retry 3
connect_port 80
}
}
}
4. 后端多台服务器做acl限制,这里通过shell脚本来对后端服务器做acl限制
[root@centosnode3 ~]# vim /etc/init.d/lvs_rs
#!/bin/bash
# Startup script handle the initialisation of LVS
# chkconfig: - 28 72
# description: Initialise the Linux Virtual Server for DR
### BEGIN INIT INFO # Provides: ipvsadm
# Required-Start: $local_fs $network $named
# Required-Stop: $local_fs $remote_fs $network
# Short-Description: Initialise the Linux Virtual Server
# Description: The Linux Virtual Server is a highly scalable and highly
# available server built on a cluster of real servers, with the load
# balancer running on Linux.
# description: start LVS of DR-RIP
LOCK=/var/lock/ipvsadm.lock
VIP=192.168.188.100
. /etc/rc.d/init.d/functions
start() {
PID=`ifconfig | grep lo:10 | wc -l`
if [ $PID -ne 0 ];
then
echo "The LVS-DR-RIP Server is already running !"
else
/sbin/ifconfig lo:10 $VIP netmask 255.255.255.255 broadcast $VIP up
/sbin/route add -host $VIP dev lo:10
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/eth0/arp_ignore
echo "2" >/proc/sys/net/ipv4/conf/eth0/arp_announce
echo "1" >/proc/sys/net/ipv4/conf/all/arp_ignore
echo "2" >/proc/sys/net/ipv4/conf/all/arp_announce
/bin/touch $LOCK
echo "starting LVS-DR-RIP server is ok !"
fi
}
stop() {
/sbin/route del -host $VIP dev lo:10
/sbin/ifconfig lo:10 down >/dev/null
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/eth0/arp_ignore
echo "0" >/proc/sys/net/ipv4/conf/eth0/arp_announce
echo "0" >/proc/sys/net/ipv4/conf/all/arp_ignore
echo "0" >/proc/sys/net/ipv4/conf/all/arp_announce
rm -rf $LOCK
echo "stopping LVS-DR-RIP server is ok !"
}
status() {
if [ -e $LOCK ];
then
echo "The LVS-DR-RIP Server is already running !"
else
echo "The LVS-DR-RIP Server is not running !"
fi
}
case "$1" in
start)
start
;;
stop)
stop
;;
restart)
stop
start
;;
status)
status
;;
*)
echo "Usage: $1 {start|stop|restart|status}"
exit 1
esac
exit 0
5. 启动多台后端服务器" /etc/init.d/lvs_rs "脚本:
##赋予脚本执行权限
[root@centosnode3 ~]# chmod +x /etc/init.d/lvs_rs
##启动脚本
[root@centosnode3 ~]# /etc/init.d/lvs_rs start
6. 启动centosnode1和centosnode2的lvs和keepalived服务:
##启动lvs
[root@centosnode1 ~]# systemctl start ipvsadm.service
##启动keepalived
[root@centosnode1 ~]# systemctl start keepalived.service
7. 开启后端两台web服务器,并设置web页面:
##设置web1服务器页面
[root@centosnode3 ~]# echo "this is page ip : 192.168.188.227" > /var/www/html/index.html
##启动web1的httpd服务
[root@centosnode3 ~]# systemctl start httpd
##设置web2服务器页面
[root@centosnode3 ~]# echo "this is page ip : 192.168.188.228" > /var/www/html/index.html
##启动web2的httpd服务
[root@centosnode3 ~]# systemctl start httpd
8. 查看LVS状态:
[root@centosnode1 ~]# ipvsadm -ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 192.168.188.100:80 rr persistent 50
-> 192.168.188.227:80 Route 1 0 0
-> 192.168.188.228:80 Route 1 0 0
9. 测试LVS负载均衡是否正常:
[root@centosnode5 ~]# curl 192.168.188.100
this is page ip : 192.168.188.227
[root@centosnode5 ~]# curl 192.168.188.100
this is page ip : 192.168.188.228
10. 测试LVS健康检查:
##监控lvs状态
[root@centosnode1 ~]# watch ipvsadm -ln
当前两台后端服务器都正常运行,使其中一台后端服务器的httpd服务关闭,模拟服务器故障,观察LVS健康检查是否正常。
[root@centosnode3 ~]# systemctl stop httpd
11. 测试keepalived故障转移是否正常,是否会发生ip飘移:
由此可见当前vip地址在centosnode1主机上,然后模拟服务器故障,停掉keepalived服务。
[root@centosnode1 ~]# systemctl stop keepalived.service
再次查看vip,发现vip飘移到了centosnode2主机上。可以将centosnode1主机的keepalived服务再次开启,会发现vip又会飘移到了centosnode1主机上,因为keepalived默认配置抢占主服务器,优先级高的服务器,将抢占到vip。
补充:1. real_server中健康检查的方式:
1>. TCP_CHECK:工作在第4层,keepalived向后端服务器发起一个tcp连接请求,如果后端服务器没有响应或超时,那么这个后端将从服务器池中移除。
2>. HTTP_GET:工作在第5层,向指定的URL执行http请求,将得到的结果用md5加密并与指定的md5值比较看是否匹配,不匹配则从服务器池中移除;此外还可以指定http返回码来判断检测是否成功。HTTP_GET可以指定多个URL用于检测,这个一台服务器有多个虚拟主机的情况下比较好用。
3>. SSL_GET:跟上面的HTTP_GET相似,不同的只是用SSL连。
4>. MISC_CHECK:用脚本来检测,脚本如果带有参数,需将脚本和参数放入双引号内。脚本的返回值需为:
0) 检测成功。
delay_loop 隔多长时间做一次健康检测,单位为秒
connect_timeout 连接超时时间,单位为秒
nb_get_retry 检测失败后的重试次数,如果达到重试次数仍然失败,将后端从服务器池中移除。
delay_before_retry 失败重试的间隔时间,单位为秒
3. 健康检查的相关配置:
1>. 以上示例就是TCP健康检查。
2>. HTTP_GET|SSL_GET:
HTTP_GET | SSL_GET
{
url {
path / #HTTP/SSL 检查的url 可以是多个
方式一:digest <STRING> #HTTP/SSL 检查后的摘要信息 用工具genhash生成
方式二:status_code 200 #HTTP/SSL 检查返回的状态码
}
connect_port 80 #连接端口
bindto <IPADD>
connect_timeout 3 #连接超时时间
nb_get_retry 3 #重连次数
delay_before_retry 2 #连接间隔时间
}
其中digest的摘要需要通过genhash工具得到:genhash工具使keepalived安装包中自带的。
##查看genhash工具版本
[root@centosnode1 ~]# ./genhash -h
##生成检查后的摘要信息
命令格式:genhash -s要生成摘要的后端服务器地址 -p 要生成摘要的端口 -u 检查的url
[root@centosnode1 ~]# genhash -s192.168.188.227 -p 80 -u /index.html
MD5SUM = ab9d2b22ae01e991a259a08feb1f1629
[root@centosnode1 ~]# genhash -s192.168.188.228 -p 80 -u /index.html
MD5SUM = 639870c3471db8868e37dcf972ea0df3
示例:
virtual_server 192.168.188.100 80 {
delay_loop 6
lb_algo rr
lb_kind DR
persistence_timeout 50
protocol TCP
real_server 192.168.188.227 80 {
weight 1
HTTP_GET {
url {
path /index.html
digest ab9d2b22ae01e991a259a08feb1f1629
}
connect_timeout 8
nb_get_retry 3
delay_before_retry 3
connect_port 80
}
}
}
virtual_server 192.168.188.100 80 {
delay_loop 6
lb_algo rr
lb_kind DR
persistence_timeout 50
protocol TCP
real_server 192.168.188.228 80 {
weight 1
HTTP_GET {
url {
path /index.html
digest 639870c3471db8868e37dcf972ea0df3
}
connect_timeout 8
nb_get_retry 3
delay_before_retry 3
connect_port 80
}
}
}
3>. MISC:
MISC_CHECK {
misc_path <STRING>|<QUOTED-STRING> #外部程序或者脚本绝对路径
misc_timeout <INT> #执行脚本的超时时间
misc_dynamic #如果设置了misc_dynamic,healthchecker程序的退出状态码会用来动态调整服务器的 权重(weight).
#返回0:健康检查OK,权重不被修改
#返回1:健康检查失败,权重设为0
#返回2-255:健康检查OK,权重设置为:退出状态码-2,比如返回255,那么weight=255-2=253 }