LVS是Linux Virtual Server的简写, 意即Linux虚拟服务器, 是一个虚拟的服务器集群系统。本项目在1998年5月由章文嵩博士成立, 是中国国内最早出现的自由软件项目之一。在linux内存2.6中, 它已经成为内核的一部分, 在此之前的内核版本则需要重新编译内核。
LVS主要用于多服务器的负载均衡。它工作在网络层, 可以实现高性能, 高可用的服务器集群技术。
- 它廉价, 可把许多低性能的服务器组合在一起形成一个超级服务器。
- 它易用, 配置非常简单, 且有多种负载均衡的方法。它稳定可靠, 即使在集群的服务器中某台服务器无法正常工作, 也不影响整体效果。
- 另外可扩展性也非常好。
因为lvs工作在网络层, 所以相对于其他的负载均衡的解决办法(DNS域名轮流解析、应用层负载的调度、客户端的调度等, 它的效率是非常高的)
LVS的通过控制IP来实现负载均衡。IPVS是其具体的实现模块。
1. 环境检查
cat /etc/redhat-release
uname -r
getenforce
systemctl status firewalld.service
hostname -I
2. 安装ipvsadm管理工具
lsmod |grep ip_vs #检测是否安装
#下载RPM软件包 http://www.linuxvirtualserver.org/
yum -y install ipvsadm #安装ipvsadm
ipvsadm #检查并激活lvs
注:
- 只有执行 ipvsadm 以后, 才会在内核加载 ip_vs 模块
- LVS 是 Linux Virtual Server 的缩写, 意思是 Linux 虚拟服务器。目前有三种 IP 负 载均衡技术( VS/NAT 、 VS/TUN 和 VS/DR );
- 八种调度算法(rr,wrr,lc,wlc,lblc,lblcr,dh,sh )。
3. 安装keepalived并设置节点
官方网站: http://www.keepalived.org/
准备:
- 节点A: IP 192.168.137.3 Linux 主机
- 节点B: IP 192.168.137.4 Linux 主机
- 虚拟IP 192.168.137.220
- 修改配置文件: /etc/keepalived/keepalived.conf
Keepalived 配置可以分为三类:
3.1 全局配置(Global Configuration)
以 global_defs 作为标识:
标识 | 说明 |
---|---|
notification_email | 报警邮件地址 |
notification_email_from | 邮件的发送地址 |
smtp_server | SMTP 服务器地址 |
smtp_connect_timeout | |
router_id |
3.2 VRRPD 配置
VRRPD 配置又可以分为 VRRP同步组配置和 VRRP 实例配置
3.2.1 VRRP同步组: vrrp_sync_group GXXX {}
标识 | 说明 |
---|---|
group | |
notify_backup | |
notify_master | 指定当Keepalived进入Master状态是要执行的脚本 |
notify_fault | |
notify_stop |
3.2.2 VRRP 实例配置: vrrp_instance VXXXX {}
主要用来配置节点角色(主或从), 实例绑定的网络接口, 节点验证机制, 集群服务IP等。
state | MASTER / BACKUP |
---|---|
interface | 网络接口 |
virtual_router_id | 虚拟路由标识, 数字, MASTER 和 BACKUP 必须一致 |
priority | MASTER 必须大于 BACKUP |
advert_int | 同步检查的时间间隔, 秒 |
mcast_src_ip | 发送多播包的地址 |
garp_master_delay | |
track_interface | 额外的网络监控接口 |
authentication | 通讯验证类型和密码 |
virtual_ipaddress | VIP, 即漂移IP 地址 |
virtual_routes | |
nopreempt | 不抢占功能, 只能在BACKUP上设置 |
preemtp_delay |
3.3 LVS 配置
以 virtual_server
标识 | 说明 |
---|---|
delay_loop | 健康检查的时间间隔, 秒 |
lb_algo | 负载调度算法, 有: rr, wrr, lc, wlc, lblc, sh, dh 等 |
lb_kind | 负载均衡机制, 有NAT, TUN 和 DR 三个模式 |
persistence_timeout | 会话保持时间 |
persistence_granularity | |
protocol | TCP / UDP |
ha_suspend | 节点切换时, 暂不启用 real server 节点的健康检查 |
virtualhost | |
sorry_server | 备用节点 |
real_server |
weight: 权重 inhibit_on_failure: 失效时, 设weight 为 0 notify_up notify_down 健康检测方式: HTTP_GET, SSL_GET, TCP_CHECK, SMPT_CHECK, MISC_CHECK |
! Configuration File for keepalived
global_defs {
notification_email {
root@localhost
}
notification_email_from root@localhost
smtp_server localhost
smtp_connect_timeout 30
router_id NodeA
}
vrrp_instance VI_1 {
state MASTER
interface eno16777736
virtual_router_id 51
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.1.220
}
}
virtual_server 192.168.1.220 8080 {
delay_loop 6
lb_algo rr
lb_kind DR
nat_mask 255.255.255.0
persistence_timeout 0
protocol TCP
real_server 192.168.137.3 80 {
weight 1
HTTP_GET {
url {
path /index.php
digest d654f21f87b7e6900b887f07c19e73fe
}
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
}
}
real_server 192.168.137.4 80 {
weight 11
HTTP_GET {
url {
path /index.php
digest 625eddd79c61cf84c71c0c17448f8093
}
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
}
}
}
按同样的方法配置节点B并修改配置文件, 可将A节点的配置文件复制到B节点, 并修改以下几项:
router_id NodeB
state BACKUP
priority 99
其它项不必修改。
其中计算digest : genhash -s 192.168.137.4 -p 80 -u /index.php
然后启动: keepalived -D
将keepalived做成启动服务, 方便管理:
cp /usr/local/etc/rc.d/init.d/keepalived /etc/init.d/
cp /usr/local/etc/sysconfig/keepalived /etc/sysconfig/
service keepalived restart
4. 开启路由转发
vi /etc/sysctl.conf
net.ipv4.ip_forward = 1
net.ipv4.conf.lo.arp_ignore = 0
net.ipv4.conf.lo.arp_announce = 0
net.ipv4.conf.all.arp_ignore = 0
net.ipv4.conf.all.arp_announce = 0
刷新系统变量,使系统文件变更马上生效
sysctl –p
echo 1> /proc/sys/net/ipv4/ip_forward
5. 配置LVS负载均衡
ip addr add 192.168.137.220/24 dev eth0 #在eth0网卡绑定VIP地址
ipvsadm -C #清除当前所有LVS规则
ipvsadm --set 30 5 60 #设置tcp、tcpfin、udp链接超时时间
ipvsadm -A -t 192.168.137.220:8080 -s rr -p 20 #添加虚拟服务(-A)
ipvsadm -a -t 192.168.137.220:8080 -r 192.168.137.3:80 -g -w 1 #将虚拟服务关联到真实服务上(-a)
ipvsadm -a -t 192.168.137.220:8080 -r 192.168.137.4:80 -g -w 1 #将虚拟服务关联到真实服务上(-a)
ipvsadm -ln #查看配置结果
-C 清空整个表
-A 添加一个虚拟服务
-t 指定一个地址, 一定是ip+端口
-s 调度算法
-a 添加一个real server
-m NAT模式
-g DR模式, 默认
-d 删除一个real server
-p 会话保持功能
-w 权重
-i tunnel模式
6. 配置真实服务器
说明: 一般真实互联网应用都配置为lb_kind = dr 模式, 因为这种模式效率是最高的, 缺点就是配置稍微复杂一点, 需要配置客户端。
DR模式原理请参考: http://atong.blog.51cto.com/2393905/1348602
简单说一下: 假设A为前端负载均衡服务器, B,C为后端真实服务器。 A接收到数据包以后, 会把数据包的MAC地址改成B的(根据调度算法, 假设发给B服务器), 然后把数据包重新发出去, 交换机收到数据包根据MAC地址找到B, 把数据包交给B。 这时B会收到数据包, 同时验证请求IP地址, 由于数据包里的IP地址是给A的, 所以正常情况下B会丢弃数据包, 为了防止这种情况, 需要在B机器的回环网卡上配置A的IP地址。并设置ARP压制。
在真实服务器上运行脚本文件, 为lo:0绑定VIP地址、抑制ARP广播:
#!/bin/bash
#description : start real server
VIP=192.168.137.220
/etc/rc.d/init.d/functions
case "$1" in
start)
echo " start LVS of REAL Server"
/sbin/ifconfig lo:0 $VIP broadcast $VIP netmask 255.255.255.255 up
# /sbin/route add -host $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
;;
stop)
/sbin/ifconfig lo:0 down
echo "close LVS Directorserver"
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 "Usage: $0 {start|stop}"
exit 1
esac
需要对脚本授权: chmod +x lvs_real.sh
运行脚本: ./lvs_real.sh
输入ifconfig查看虚拟IP是否已经绑定到回环网卡(测试的时候最好先关闭防火墙)
如果想知道当前测试机的访问请求被转发到那个服务器去了, 可以在 ipvsadm 命令后带一个选项, 其完整形式为:
ipvsadm –lcn | grep 159.226.240.63 #你的IP
7. 其它健康检查方式
7.1 TCP方式检查
virtual_server 192.168.137.220 8080 {
delay_loop 6
lb_algo rr
lb_kind DR
nat_mask 255.255.255.0
persistence_timeout 0
protocol TCP
real_server 192.168.137.3 80 {
weight 1
TCP_CHECK {
connect_port 80
connect_timeout 5
}
}
real_server 192.168.137.4 80 {
weight 1
TCP_CHECK {
connect_port 80
connect_timeout 5
}
}
}
7.2 其它方式请参考keepalived提供的配置文件
参考:
http://www.linuxvirtualserver.org/
http://www.keepalived.org/