一、 简介
1. 负载均衡的类型
- 负载均衡可以采用硬件设备(例如常常听见的 F5),也可以采用软件负载
- 商用硬件负载设备成本通常较高(一台几十万甚至上百万),所以一般 情况下会采用软件负载
- 软件负载解决的两个核心问题是:选谁、转发,其中最著名的是 lvs
2. lvs 负载均衡机制
lvs 是四层负载均衡,也就是说建立在 OSI 模型的第四层——传输层之 上
传输层上有 TCP/UDP,lvs 支持 TCP/UDP 的负载均衡
因为 LVS 是四层负载均衡,因此它相对于其它高层负载均衡的解决办法, 比如 DNS 域名轮流解析、应用层负载的调度、客户端的调度等,它的效 率是非常高的
lvs 的转发可以通过修改 IP 地址实现(NAT 模式)
lvs 的转发还可以通过修改直接路由实现(DR 模式)
3、 lvs+keepAlived 的应用场景?
- 大型网站负载均衡
Keepavlied双机热备
HA(高可用)
Keepalived起初是为LVS设计的,专门用来监控集群系统中各个服务节点的状态,它根据TCP/IP参考模型的第三、第四层、第五层交换机制检测每个服务节点的状态,如果某个服务器节点出现异常,或者工作出现故障,Keepalived将检测到,并将出现的故障的服务器节点从集群系统中剔除,这些工作全部是自动完成的,不需要人工干涉,需要人工完成的只是修复出现故障的服务节点
==================================================================================================
一.lvs搭建
1、环境
名称 IP
LVS-DR-Master 192.168.200.111
LVS-DR-BACKUP 192.168.200.112
LVS-DR-VIP 192.168.200.254
WEB1 192.168.200.113
WEB2 192.168.200.114
二. LVS-DR-Master/LVS-DR-BACKUP 安装 LVS和 Keepalvied软件包
1. LVS-DR-Master 配置
设置网卡IP地址
[root@master ~]# cat /etc/sysconfig/network-scripts/ifcfg-ens33
BOOTPROTO=none
2、配置Keepalived
[root@master ~]# cd /etc/keepalived/
[root@masterkeepalived]# cp keepalived.conf keepalived.conf.bak
keepalived配置文件详情
! Configuration File for keepalived global_defs { notification_email { crushlinux@163.com #设置报警邮件地址,可以设置多个,每行一个。注意,如果要开启邮件报警,需要开启本机的sendmail服务 } notification_email_from root@example.com #设置邮件的发送地址 smtp_server 127.0.0.1 #设置smtp服务器地址 smtp_connect_timeout 30 #设置连接 smtp 服务器超时时间 router_id LVS_MASTER #运行 Keepalived服务器的一个标识。发邮件时显示在邮件标题中的信息 } vrrp_instance VI_1 { #vrrp实例定义部分 state MASTER #指定 Keepalived 的角色,MASTER表示此主机是主用服务器,BACKUP表示是备用服务器。备份服务器上将 MASTER 改为 BACKUP。 interface eth0 #指定 HA监测网络的接口 virtual_router_id 51 虚拟路由标识,这个标识是一个数字,并且同一个 vrrp 实例使用唯一的标识,即同一个 vrrp_instance下,MASTER 和 BACKUP必须是一致的。(0-255) priority 100 #定义优先级,数字越大,优先级越高,在一个 vrrp_instance下,MASTER的优先级必须大于 BACKUP 的优先级。备份服务上将 100 改为 50 advert_int 1 #设定MASTER 与 BACKUP负载均衡器之间同步检查的时间间隔,单位是秒 authentication { #设定验证类型和密码 auth_type PASS #设置验证类型,主要有 PASS和 AH 两种 auth_pass 1111 #设置验证密码,在一个 vrrp_instance下,MASTER 与 BACKUP必须使用相同的密码才能正常通信。 } virtual_ipaddress { #设置虚拟 IP地址,可以设置多个虚拟IP地址,每行一个 192.168.200.254 } } #虚拟服务器定义部分 virtual_server 192.168.200.254 80 { #设置虚拟服务器,需要指定虚拟 ip 地址和服务端口,ip 与 端口之间用空格隔开。 delay_loop 6 #设置健康检查时间,单位是秒 lb_algo rr #设置负载调度算法,这里设置为 rr,即轮询算法,rr|wrr|lc|wlc|lblc|sh|dh lb_kind DR #设置 LVS实现负载均衡的机制,可以有 NAT、TUN 和 DR三个模式可选。 protocol TCP #指定转发协议类型,有 tcp和 udp 两种 real_server 192.168.200.113 80 { #配置服务节点 1,需要指定 real server 的真实IP地址和端口,ip 与端口之间用空格隔开。 weight 1 #配置服务节点的权值,权值大小用数字表示,数字越大,权值越高,设置权值的大小可以为不同性能的服务器分配不同的负载,可以对性能高的服务器设置较高的 权值,而对性能较低的服务器设置相对较低的权值,这样就合理的利用和分配了系统资源 TCP_CHECK { #realserve 的状态检测设置部分,单位是秒 connect_timeout 10 #10秒无响应超时 nb_get_retry 3 #重试次数 delay_before_retry 3 #重试间隔 connect_port 80 #测试连接的端口 } } real_server 192.168.200.114 80 { weight 1 TCP_CHECK { connect_timeout 10 nb_get_retry 3 delay_before_retry 3 connect_port 80 } } }
Master配置
[root@master keepalived]# cat keepalived.conf
! Configuration File for keepalived
global_defs {
notification_email {
crushlinux@163.com
}
notification_email_from root@example.com
smtp_server 127.0.0.1
smtp_connect_timeout 30
router_id LVS_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.200.254
}
}
virtual_server 192.168.200.254 80 {
delay_loop 6
lb_algo wrr
lb_kind DR
protocol TCP
real_server 192.168.200.113 80 {
weight 1
TCP_CHECK {
connect_timeout 10
nb_get_retry 3
delay_before_retry 3
connect_port 80
}
}
real_server 192.168.200.114 80 {
weight 1
TCP_CHECK {
connect_timeout 10
nb_get_retry 3
delay_before_retry 3
connect_port 80
}
}
}
[root@localhost keepalived]# systemctl restart keepalived
[root@localhost keepalived]# chkconfig keepalived on
SALVE备配置
1. LVS-DR-salve 配置
设置网卡IP地址
[root@salve ~]# cat /etc/sysconfig/network-scripts/ifcfg-ens33
BOOTPROTO=none
2、配置Keepalived
[root@salve ~]# cd /etc/keepalived/
[root@salve keepalived]# cp keepalived.conf keepalived.conf.bak
[root@salve keepalived]# vim keepalived.conf
[root@salve keepalived]# cat keepalived.conf
! Configuration File for keepalived global_defs { notification_email { crushlinux@163.com } notification_email_from root@example.com smtp_server 127.0.0.1 smtp_connect_timeout 30 router_id LVS_BACKUP } vrrp_instance VI_1 { state BACKUP interface ens33 virtual_router_id 51 priority 50 advert_int 1 authentication { auth_type PASS auth_pass 1111 } virtual_ipaddress { 192.168.200.254 } } virtual_server 192.168.200.254 80 { delay_loop 6 lb_algo wrr lb_kind DR protocol TCP real_server 192.168.200.113 80 { weight 1 TCP_CHECK { connect_timeout 10 nb_get_retry 3 delay_before_retry 3 connect_port 80 } } real_server 192.168.200.114 80 { weight 1 TCP_CHECK { connect_timeout 10 nb_get_retry 3 delay_before_retry 3 connect_port 80 } } }
[root@localhost keepalived]# systemctl restart keepalived
[root@localhost keepalived]# chkconfig keepalived on
四. 配置WEB1和WEB2操作一致
[root@web1 ~]# cat realserver.sh
#!/bin/bash SNS_VIP=192.168.200.254 . /etc/rc.d/init.d/functions case "$1" in start) ifconfig lo:0 $SNS_VIP netmask 255.255.255.255 broadcast $SNS_VIP /sbin/route add -host $SNS_VIP dev lo:0 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 sysctl -p >/dev/null 2>&1 echo "RealServer Start OK" ;; stop) ifconfig lo:0 down route del $SNS_VIP >/dev/null 2>&1 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 "RealServer Stoped" ;; *) echo "Usage: $0 {start|stop}" exit 1 esac exit 0
[root@web1 ~]# chmod +x realserver.sh
[root@web1 ~]# ./realserver.sh start
RealServer Start OK
[root@web1 ~]# yum install httpd -y
[root@web1 ~]# systemctl restart httpd
[root@web1 ~]# systemctl stop firewalld
[root@web1 ~]# iptables -F
[root@web1 ~]# setenforce 0
五、配置两台WEB中的index.html测试页面用于区分
[root@web1 ~]# cd /var/www/html/
[root@web1 html]# echo '192.168.200.113' > index.html
[root@web2 ~]# cd /var/www/html/
[root@web2 html]# echo '192.168.200.114' > index.html
六、测试LVS
[root@master ~]# ip a | grep ens33
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
inet 192.168.200.111/24 brd 192.168.200.255 scope global noprefixroute ens33
inet 192.168.200.254/32 scope global ens33
[root@salve ~]# ip a | grep ens33
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
inet 192.168.200.112/24 brd 192.168.200.255 scope global noprefixroute ens33
多刷新几次页面
[root@master ~]# 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.200.254:80 wrr
-> 192.168.200.113:80 Route 1 1 2
-> 192.168.200.114:80 Route 1 1 2