最近在学习LVS,记录一下
介绍
LVS
Linux Virtual Server Linux虚拟主机 --> 是一个高可用高扩展的软件(负载均衡的软件)
章文嵩是技术专家,也是LVS(Linux Virtual Server,Linux虚拟服务器)开源软件创始人
2016年5月27日,章文嵩出任滴滴出行高级副总裁、负责CTO线基础平台部兼工程技术委员会主席
linux内核里已经内置了lvs软件
四层负载均衡
http://www.linuxvirtualserver.org/zh/
http://www.linuxvirtualserver.org/
http://www.linuxvirtualserver.org/zh/lvs3.html
https://zh.linuxvirtualserver.org/
http://www.linuxvirtualserver.org/zh/lvs4.html
https://blog.csdn.net/lcl_xiaowugui/article/details/81701949
架构
3种调度模式-架构(体系结构)
NAT
修改目的ip和端口,不修改源ip、端口
TUN
DR
NAT
传统的nat
DNAT
缺点:解决不了real server在不同的网段
调度器和real server都在同一个物理局域网里
可以修改目的ip;可以修改目的端口
lvs NAT模式的实验
环境:
1台调度器 --> 2块网卡
ens33:192.168.0.73 --> wan
ens37:192.168.31.10 --> lan
2台real server
server1:192.168.31.20
server2:192.168.31.30
server3:192.168.31.40
[root@LB ~]# cat /etc/sysconfig/network-scripts/ifcfg-ens33
BOOTPROTO="none"
NAME="ens33"
DEVICE="ens33"
ONBOOT="yes"
IPADDR=192.168.0.73
NETMASK=255.255.255.0
GATEWAY=192.168.0.1
DNS1=114.114.114.114
[root@LB ~]# cat /etc/sysconfig/network-scripts/ifcfg-ens37
BOOTPROTO="none"
NAME="ens37"
DEVICE="ens37"
ONBOOT="yes"
IPADDR=192.168.31.10
NETMASK=255.255.255.0
lvs已经安装到linux内核里了,不需要安装
ipvsadm 是一个给lvs软件传递参数和查看相关信息的工具
在调度器上安装ipvsadm这个工具
[root@LB ~]# yum install ipvsadm -y
[root@LB ~]# mkdir /lvs
[root@LB ~]# cd /lvs/
[root@LB lvs]# vim lvs_nat.sh
#!/bin/bash
# director服务器上开启路由转发功能
echo 1 > /proc/sys/net/ipv4/ip_forward
# 配置SNAT策略,让内网的服务器可以上网
iptables -F
iptables -F -t nat
iptables -X -t nat # 自定义规则链
iptables -t nat -A POSTROUTING -s 192.168.31.0/24 -o ens33 -j SNAT --to-source 192.168.0.73
# 清空规则
/usr/sbin/ipvsadm -C
/usr/sbin/ipvsadm -A -t 192.168.0.73:80 -s wrr
/usr/sbin/ipvsadm -a -t 192.168.0.73:80 -r 192.168.31.20:80 -m -w 1
/usr/sbin/ipvsadm -a -t 192.168.0.73:80 -r 192.168.31.30:80 -m -w 1
/usr/sbin/ipvsadm -a -t 192.168.0.73:80 -r 192.168.31.40:80 -m -w 1
-C 清除规则
-A 添加vip和端口 --> 提供服务的ip地址和端口号
-t tcp服务
-s --scheduler scheduling-method 指定调度的方法
wrr 加权论询 weight round robin
-a 添加后端的上游(真实)服务器 Add a real server to a virtual service
-r --real-server server-address 指定real server
-m --masquerading Use masquerading(network access translation,or NAT)
-w --weight weight 权重值
-g --gatewaying Use gatewaying (direct routing). This is the default.
[root@LB lvs]# bash lvs_nat.sh
[root@LB lvs]# iptables -L -t nat
……
Chain POSTROUTING (policy ACCEPT)
target prot opt source destination
SNAT all -- 192.168.31.0/24 anywhere to:192.168.0.73
[root@LB lvs]# ipvsadm -l
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP LB:http wrr
-> 192.168.31.20:http Masq 1 0 0
-> 192.168.31.30:http Masq 1 0 0
-> 192.168.31.40:http Masq 1 0 0
浏览器访问:192.168.0.73 负载均衡到后端real server
# 后端的real server知道外面访问的机器ip地址
[root@nginx-1 ~]# tail -f /usr/local/nginx/logs/access.log
192.168.0.104 - - [04/Jul/2021:01:34:29 +0800] "GET / HTTP/1.1" 304 0 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36"
lvs做转发的时候,只修改了数据包里的目的ip,源ip没有动
keepalived + lvs --> NAT模式
keepalived可以直接通过配置文件对lvs进行配置了,不需要ipvsadm去手工配置内网的real server的网关需要填lvs负载均衡器
[root@nginx-1 ~]# vim /etc/sysconfig/network-scripts/ifcfg-ens33
BOOTPROTO="none"
NAME="ens33"
DEVICE="ens33"
ONBOOT="yes"
IPADDR=192.168.31.20
NETMASK=255.255.255.0
GATEWAY=192.168.31.10 #注:lvs负载均衡器的内网的ip
DNS1=114.114.114.114
fullNAT
解决了real server可以在不同网络里(不同的vlan),不需要在同一个局域网的问题
DR
DR直接路由
LVS集群中的IP负载均衡技术 http://linuxvirtualserver.org/zh/lvs3.html
LVS之DR模式原理与实践 https://blog.51cto.com/u_13599730/2312603
负载均衡器:调度器、director、LB、load balancer、反向代理服务器
lvs的DR模式:通过直连路由实现虚拟服务器(VS/DR)
DR:direct route 直接路由
NAT:network address transfer
效果的问题:
DR --> NAT --> FULLNAT
# 在dr上需要做的事情
1 .添加vip地址在ens33接口上
[root@LB lvs]# ip add add 192.168.0.88/24 dev ens33
2 .给lvs配置调度策略和real server的配置
[root@LB lvs]# vim lvs_dr.sh
#!/bin/bash
# director服务器上开启路由转发功能
echo 1 > /proc/sys/net/ipv4/ip_forward
# 配置SNAT策略,让内网的服务器可以上网
iptables -F -t nat
iptables -X -t nat
# 清空lvs里的规则
/usr/sbin/ipvsadm -c
# 添加lvs的规则
/usr/sbin/ipvsadm -A -t 192.168.0.88:80 -s wrr
/usr/sbin/ipvsadm -a -t 192.168.0.88:80 -r 192.168.0.20:80 -g -w 1
/usr/sbin/ipvsadm -a -t 192.168.0.88:80 -r 192.168.0.30:80 -g -w 1
/usr/sbin/ipvsadm -a -t 192.168.0.88:80 -r 192.168.0.40:80 -g -w 1
# -g --gatewaying Use gatewaying (direct routing). This is the default. 指定调度策略为DR模式
[root@LB lvs]# bash lvs_dr.sh # 执行脚本
[root@LB lvs]# ipvsadm # 查看lvs的策略
# real server上的配置
1 .配置vip地址
在lo接口上配置
[root@nginx-1 ~]# yum install net-tools -y
[root@nginx-1 ~]# ifconfig lo:0 192.168.0.88 netmask 255.255.255.255 broadcast 192.168.0.88 up
[root@nginx-1 ~]# /sbin/route add -host 192.168.0.88 dev lo:0
#注:就是告诉real server自己有192.168.0.188 vip地址 在lo:0这个接口上,而且告诉你如何到这个ip地址
[root@nginx-1 ~]# ip route
default via 192.168.31.10 dev ens33 proto static metric 100
192.168.0.88 dev lo scope link src 192.168.0.88
2 .禁止real server响应vip的arp广播,同时不向外宣告vip的mac地址 --> arp毒化
announce宣告
[root@nginx-1 ~]# echo "1" > /proc/sys/net/ipv4/conf/all/arp_ignore #注:让ens33不要响应vip的arp广播 装聋
[root@nginx-1 ~]# echo "1" > /proc/sys/net/ipv4/conf/lo/arp_ignore
[root@nginx-1 ~]# echo "2" > /proc/sys/net/ipv4/conf/all/arp_announce #注:装哑 不告诉其他的机器我的ip地址,不向外发arp广播,宣告自己ip地址对应的mac地址
[root@nginx-1 ~]# echo "2" > /proc/sys/net/ipv4/conf/lo/arp_announce
3 .配置网关为路由器的lan口地址
real server上配置网关为路由器的lan口地址
[root@nginx-1 ~]# vim /etc/sysconfig/network-scripts/ifcfg-ens33
BOOTPROTO="none"
NAME="ens33"
DEVICE="ens33"
ONBOOT="yes"
IPADDR=192.168.31.20
GATEWAY=192.168.31.10
Linux内核参数arp_ignore和arp_announce作用说明
arp_ignore - INTEGER
0:默认值,表示可使用本地任意接口上配置的任意地址进行arp应答
1:仅当请求的目标IP配置在本地主机接受到报文的接口上时,才给予响应
2:仅当目的IP配置在收到报文的接口上,且arp请求的源IP和该接口同一网段,才响应arp请求
3:如ARP请求的IP作用域是主机则不响应,如果作用域是全局或者链路则响应ARP
4-7:保留
8:不应答所有本地IP
arp_announce - INTEGER
0:默认值,允许使用本机上所有接口的IP作ARP通告
1:尽量避免使用本地IP向非本网卡直接连接网络进行ARP通告
2:必须避免使用本地IP向非本网卡直接连接网络进行ARP通告
调度算法
8种调度算法
在内核中的连接调度算法上,IPVS已实现了以下八种调度算法:
轮叫调度(Round-Robin Scheduling)
加权轮叫调度(Weighted Round-Robin Scheduling)
最小连接调度(Least-Connection Scheduling)
加权最小连接调度(Weighted Least-Connection Scheduling)
基于局部性的最少链接(Locality-Based Least Connections Scheduling)
带复制的基于局部性最少链接(Locality-Based Least Connections with Replication Scheduling)
目标地址散列调度(Destination Hashing Scheduling)
源地址散列调度(Source Hashing Scheduling)
keepalived + nginx + lvs
方案1:
高可用:keepalived
负载均衡:nginx方案2:
高可用:keepalived
负载均衡:lvs
master和backup上都要开启路由功能
real server需要填写2个默认网关
keepalived的配置文件里写好了给lvs传递的参数,不需要使用ipvsadm命令去传参
[root@LB-1 ~]# 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 LVS_DEVEL
vrrp_skip_check_adv_addr
#vrrp_strict
vrrp_garp_interval 0
vrrp_gna_interval 0
}
vrrp_instance VI_1 {
state MASTER
interface ens33
virtual_router_id 158
priority 180
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.0.188
}
}
virtual_server 192.168.0.188 80 { # 知道vip和对应的端口号
delay_loop 6
lb_algo rr # load balancer algorithm 负载均衡的算法 rr 论询 wrr加权论询
lb_kind NAT # lvs负载均衡的模式是NAT
persistence_timeout 50 # 连接超时的时间
protocol TCP # 支持的协议是tcp
real_server 192.168.30.2 80 { # 后端的real server的ip和端口
weight 1 # 权重
}
real_server 192.168.30.3 80 {
weight 1
}
real_server 192.168.30.4 80 {
weight 1
}
}
[root@LB-2 ~]# 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 LVS_DEVEL
vrrp_skip_check_adv_addr
#vrrp_strict
vrrp_garp_interval 0
vrrp_gna_interval 0
}
vrrp_instance VI_1 {
state BACKUP
interface ens33
virtual_router_id 158
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.0.188
}
}
virtual_server 192.168.0.188 80 { # 知道vip和对应的端口号
delay_loop 6
lb_algo rr # load balancer algorithm 负载均衡的算法 rr 论询 wrr加权论询
lb_kind NAT # lvs负载均衡的模式是NAT
persistence_timeout 50 # 连接超时的时间
protocol TCP # 支持的协议是tcp
real_server 192.168.30.2 80 { # 后端的real server的ip和端口
weight 1 # 权重
}
real_server 192.168.30.3 80 {
weight 1
}
real_server 192.168.30.4 80 {
weight 1
}
}
[root@LB-1 ~]# service keepalived restart
[root@LB-1 ~]# ipvsadm -l
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP LB:http rr persistent 50
-> 192.168.30.2:http Masq 1 0 0
-> 192.168.30.3:http Masq 1 0 0
-> 192.168.30.4:http Masq 1 0 0
Chrome浏览器访问 192.168.0.188 rr论询策略