14.LVS服务
LVS概念
负载均衡
硬件:f5(big-ip),citrix,a10,redware
软件:lvs(传输层,理论上无上限,和服务器性能挂钩)、nginx(应用层)、haproxy(传输层或应用层,支持3w个并发)、perlbal(应用层),httpd(应用层)
LVS负载均衡
Linux Virtual Server,Linux虚拟服务,相当于Linux的四层集群系统,根据源目IP进行目标转发,本身不产生流量,只做请求转发
LVS负载调度
1.负载调度器(director):将用户请求分发到真实服务器进行处理
2.真实服务器池:需要转发流量的服务(web、邮件服务等)在后端部署的一模一样的服务器集群
3.共享存储:当服务器支持写操作时才使用,使得每个用户访问的资源都是一样
keepalived:lvs集群高可用,但是如果其中节点发生故障,其lvs无法感知,keepalived用于监控和检查兼容性问题,如果有一个节点挂了,keepalived就会将此节点从列表里踢出
术语解释
VS:virtual server,虚拟服务器,也叫director,客户来访问的服务器
RS:real server,真实服务器,服务器集群中的节点
CIP:client IP,客户端IP
VIP:virtual IP,director向外提供的服务IP
RIP:real server的IP
DIP:director和RS通信的IP
用户访问的流程
1.用户访问从CIP到VIP
2.负载均衡器DIP到达交换/路由器
3.最后到达真实服务器的RIP
LVS是四层/七层的负载均衡工具
四层负载均衡:IPVS,集成在内核中的框架,真实实现调度的代码,利用用户的空间程序调度或管理器进行管理
七层内容分发负载均衡:KTCPVS
LVS集群支持的模式
LVS-NAT:网络地址转换,硬件(F5等)使用该方法
1.客户发送请求到director
2.director根据负载均衡算法改写目标的地址,改写为后端的RIP,并且进行转发,和NAT一样
3.当后端主机RS处理完后,移送给director
4.director修改源地址为VIP地址后发给客户端
RIP和DIP处在同一个私有网段的,而且RS的网关需要指向DIP,RS可以是任何系统,但VS必须是了Linux系统
优点:NAT配置简单,网络架构灵活
缺点:输入输出流量需要经过LVS,LVS压力大,容易到达瓶颈,如部分请求很小但是响应很大的服务器(图片)
LVS-DR:直接路由
1.客户端发送请求到director
2.director将请求报文重新封装mac地址为RS自己的mac地址(所以DIP和RIP需要在相同的物理网络才能实现ARP通信),源目IP地址不变
3.RS发现目标地址是自己的mac地址,会把RS本地的环回口的地址配置为VIP的地址,响应报文会从环回口伪装成VIP发送给客户的出口网卡(响应报文头部是:CIP--mac|loopbackIP--mac)
优点:可以直接由路由转发,通过修改mac地址进行转发,效率提高,不需要NAT模式进行转换
缺点:LVS调度器必须和服务器在同一个网段
3.LVS-TUN:IP隧道
1.客户端把请求发送给director,请求报文源地址CIP,目标为VIP
2.负载均衡器收到后会再封装一层IP报文,源地址DIP,目标为RIP,然后发送给RS
3.RS收到请求报文后,拆包,发现里面还有一个IP头部,目标为自己环回口的VIP,所以会再次处理请求报文,并且把响应报文通过环回口伪装成VIP发送给客户网卡然后直接发送给客户端(需要设置环回口伪装为VIP,并且不能在公网上)
注意点1:director的IP、VIP、RIP都是公网IP,不能出现内网,并且RS的网关不能指向director的IP,并且请求的报文不经由director,是RS直接回给用户,所以不知道端口映射,而且RS的系统需要支持隧道功能
注意点2:RS不在公网但是直接发送给客户,通过路由宣告的技术实现
优点:将TCP/IP重新请求封装后发送给后端服务器,后端服务器直接通过IP进行转发,服务器可以存在不同的网段
缺点:需要使用很多IP,需要租用很多公网IP,后端服务器越多租用的公网IP越多
4.LVS-FULLNAT:完全NAT
1.客户端对于VIP发起请求
2.director接受请求,发现请求的是后端集群,对请求报文进行FULL NAT,将源IP改成DIP,目标IP转换为任意地址RIP,发送给后端
3.RS收到请求,进行响应,源IP是后端服务器的RIP,目标IP为DIP,直接内部发给director
4.director收到报文之后,进行FULL NAT,源地址改为VIP,目标地址改为CIP
VIP是公网地址,RIP和DIP是私网地址,RS收到请求后的报文地址是DIP,都是依靠director进行后端响应,所有的报文都经过director,支持端口映射的功能
LVS的NAT实验
网络拓扑
服务器配置
director(LVS)
1.安装ipvsadm
yum -y install ipvsadm
2.打开路由转发功能
echo 1 >> /proc/sys/net/ipv4/ip_forward
3.转发配置nat
iptables -t nat F
iptables -t nat -A POSTROUTING -s 172.16.214.0/24 -j MASQUERADE
查看转发配置情况:
iptables -nvL -t nat
4.配置ipvsadm策略
ipvsadm -A -t 192.168.1.153:80 -s wrr # 此IP的80端口访问使用wrr策略
ipvsadm -a -t 192.168.1.153:80 -r 172.16.214.136:80 -m -w 1 # 转发到RS1上,权重为1
ipvsadm -a -t 192.168.1.153:80 -r 172.16.214.137:80 -m -w 1 # 转发到RS2上,权重为1
查看ipvsadm配置:
ipvsadm -ln
RS1
设置网关,将网关地址指向director
route add -net 0.0.0.0 gw 172.16.214.134
查看配置:route -n
RS2
设置网关,将网关地址指向director
route add -net 0.0.0.0 gw 172.16.214.134
效果
通过curl访问会负载均衡到RS1和RS2
keepalived实验
keepalived位置
介绍
keepalived和vrrp协议的关系
keepalived配合LVS实现vrrp协议(虚拟冗余路由协议),可以工作在多个LVS主机,主要负责接收的活动节点为master,其他备用节点backup,如果backup收不到master的心跳包,则根据提前设置的热备份协议,backup替代,keepalived可以监控和转移LVS资源而不需要直接使用ipvsadm的命令,因为他本身就是可以调用的,即现在的模型是LVS+keepalived的模型,或者说keepalived是vrrp协议的实现
master和backup节点的切换
vrrp需要提供VIP(虚拟IP),可以用来设定路由器的活动节点进行故障切换,VIP如果故障会移动到新的设备上,但是内网是通过mac地址进行寻址,所以VMAC(虚拟mac地址)也是vrrp申请的,都可以使用
假设服务器1为master,其他服务器为backup,所有的数据都会从master走,他们通过优先级选出来,master设备会间歇性的发送vrrp报文公布配置信息、优先级和工作状态,如果master设备故障,路由器会优先选择其他权重较高的设备,其他backup会升级为master
vrrp使用md5加密认证
配置keepalived
设备1信息:外网IP:192.168.1.61,内网IP:172.16.214.136
设备2信息:外网IP:192.168.1.248,内网IP:172.16.214.137
关闭SELinux防火墙
setenforce 0
systemctl stop firewalld
开启时间同步服务
systemctl start chronyd
保持iptables中为MULTICAST
安装keepalived
yum -y install keepalived
配置文件位置:/etc/keeplived/keepalived.conf
配置文件参数信息
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服务器
smtp_connect_timeout 30 # smtp的timeout时间
router_id LVS_DEVEL # 路由表示,可以写主机名字
vrrp_skip_check_adv_addr
vrrp_strict
vrrp_garp_interval 0
vrrp_gna_interval 0
}
vrrp_instance VI_1 { # 定义vrrp实例
state MASTER # 初始状态
interface eth0 # 通告接口
virtual_router_id 51 # 设备虚拟id,一般取mac地址后面0-255
priority 100 # 权重,越高越优先
advert_int 1 # 通告频率,1s一次
authentication { # 密码认证
auth_type PASS
auth_pass 1111
}
virtual_ipaddress { # 配置在哪个网卡
192.168.200.16
192.168.200.17
192.168.200.18
}
}
virtual_server 192.168.200.100 443 { # lvs集群
delay_loop 6
lb_algo rr
lb_kind NAT
persistence_timeout 50
protocol TCP
real_server 192.168.201.100 443 {
weight 1
SSL_GET {
url {
path /
digest ff20ad2481f97b1754ef3e12ecd3a9cc
}
url {
path /mrtg/
digest 9b3a0c85a887a256d6939da88aabd8cd
}
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
}
}
}
virtual_server 10.10.10.2 1358 {
delay_loop 6
lb_algo rr
lb_kind NAT
persistence_timeout 50
protocol TCP
sorry_server 192.168.200.200 1358
real_server 192.168.200.2 1358 {
weight 1
HTTP_GET {
url {
path /testurl/test.jsp
digest 640205b7b0fc66c1ea91c463fac6334d
}
url {
path /testurl2/test.jsp
digest 640205b7b0fc66c1ea91c463fac6334d
}
url {
path /testurl3/test.jsp
digest 640205b7b0fc66c1ea91c463fac6334d
}
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
}
}
real_server 192.168.200.3 1358 {
weight 1
HTTP_GET {
url {
path /testurl/test.jsp
digest 640205b7b0fc66c1ea91c463fac6334c
}
url {
path /testurl2/test.jsp
digest 640205b7b0fc66c1ea91c463fac6334c
}
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
}
}
}
virtual_server 10.10.10.3 1358 {
delay_loop 3
lb_algo rr
lb_kind NAT
persistence_timeout 50
protocol TCP
real_server 192.168.200.4 1358 {
weight 1
HTTP_GET {
url {
path /testurl/test.jsp
digest 640205b7b0fc66c1ea91c463fac6334d
}
url {
path /testurl2/test.jsp
digest 640205b7b0fc66c1ea91c463fac6334d
}
url {
path /testurl3/test.jsp
digest 640205b7b0fc66c1ea91c463fac6334d
}
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
}
}
real_server 192.168.200.5 1358 {
weight 1
HTTP_GET {
url {
path /testurl/test.jsp
digest 640205b7b0fc66c1ea91c463fac6334d
}
url {
path /testurl2/test.jsp
digest 640205b7b0fc66c1ea91c463fac6334d
}
url {
path /testurl3/test.jsp
digest 640205b7b0fc66c1ea91c463fac6334d
}
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
}
}
}
修改设备1配置文件参数信息
global_defs {
notification_email {
acassen@firewall.loc
}
notification_email_from Alexandre.Cassen@firewall.loc
smtp_server 127.0.0.1
smtp_connect_timeout 30
router_id ser1
}
vrrp_instance VI_1 {
state MASTER # 第一台设备作为master
interface ens33 # 网卡名字
virtual_router_id 51
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass 1111 # 密码为1111
}
virtual_ipaddress {
192.168.1.111/24 brd 192.168.1.111 dev ens33 label ens33:0
}
preempt delay 60
}
修改设备2配置文件参数信息
global_defs {
notification_email {
acassen@firewall.loc
}
notification_email_from Alexandre.Cassen@firewall.loc
smtp_server 127.0.0.1
smtp_connect_timeout 30
router_id ser2
}
vrrp_instance VI_1 {
state BACKUP # 第二台设备作为backup
interface ens33
virtual_router_id 51
priority 90 # 第一台设备为master,第二台作为backup需要降低权重
advert_int 1
authentication {
auth_type PASS
auth_pass 1111 # 密码为1111
}
virtual_ipaddress {
192.168.1.111/24 brd 192.168.1.111 dev ens33 label ens33:0
}
preempt delay 60
}
设备1和2都开启keepalived服务
systemctl start keepalived
重新ifconfig检查,看到ens33:0出现虚拟IP
查看设备1和2各自状态
systemctl status keepalived
查看节点日志,可以看到ser1进去master状态
cat /var/log/messages
停止设备1(master节点)后,使用ifconfig
查看设备2(backup节点)
systemctl stop keepalived
重启master节点后,master节点恢复ens33:0,backup节点ens33:0消失
本文来自博客园,作者:icui4cu,转载请注明原文链接:https://www.cnblogs.com/icui4cu/p/16612258.html