lvs搭建LB
一、LVS介绍
- 中国人发明的
1、工作模式
1、nat模式
- 网站服务器是私网的
2、DR模式
lvs服务器提供一个调度的功能
客户端发送个lvs服务器,然后将请求分发给后台服务器
然后后台服务器直接回应给客户端,不需要回复给lvs服务器了
如果是nat模式的话,传送的太频繁了
要求网站服务器也是公网ip
3、隧道模式
2、调度算法
二、LVS/nat模式集群搭建LB集群
服务器是内网的
lvs服务器有多个网卡,一个连接着外网,一个连接着服务器
1、规划
vmware上面做的话,都是仅主机模式完成
2台网站服务器,一个lvs服务器2个网卡,一个客户端
192.168.200. 是公网
192.168.100. 是私网
# 客户端ip地址为 192.168.200.62
# lvs公网ip地址为192.168.200.80,私网ip地址为192.168.100.80
# 网站服务器ip地址为 192.168.100.61 192.168.100.63
- 网站服务器内网的数据,想要出去的话,就需也就是配置网关,192.168.100.80
2、网站服务器和客户端网关配置
# 2台机器都需要配置
[root@httpd-63 ~]# route add default gw 192.168.100.80
# 这样的话,2个内网服务器就可以访问到192.168.200.80这个ip了
# 就可以访问到lvs的公网ip了,但是访问不到客户端的公网ip
lvs服务器需要开启路由转发功能,充当路由器的角色
因此的话,客户端需要配置网关,就能访问192.168.100.80了
[root@client network-scripts]# route -n
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
192.168.200.0 0.0.0.0 255.255.255.0 U 100 0 0 ens33
[root@client network-scripts]# route add default gw 192.168.200.80
[root@client network-scripts]# ping 192.168.100.80
PING 192.168.100.80 (192.168.100.80) 56(84) bytes of data.
64 bytes from 192.168.100.80: icmp_seq=1 ttl=64 time=1.05 ms
64 bytes from 192.168.100.80: icmp_seq=2 ttl=64 time=0.222 ms
# 这样客户端就能访问到lvs的内网ip了
[root@client network-scripts]# route -n
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
0.0.0.0 192.168.200.80 0.0.0.0 UG 0 0 0 ens33
192.168.200.0 0.0.0.0 255.255.255.0 U 100 0 0 ens33
客户端,发送不是本网段的数据包的时候,就会将数据包发送给192.168.200.80这个lvs机器
网站服务器也是一样的,不是本网段的数据包的话,就会发送到192.168.100.80这个lvs机器上面
但是了实现了上面的步骤后,还是客户端不能与网站服务器进行通信
因此,lvs服务器需要开启路由转发功能,传输2个不同网段的数据包的,启动内核模块
1、开启路lvs由转发功能
# 查看内核设置
[root@proxy ~]# sysctl -p
kernel.sysrq = 0
net.ipv4.ip_forward = 0 # 路由转发功能
net.ipv4.conf.all.send_redirects = 0
net.ipv4.conf.default.send_redirects = 0
net.ipv4.conf.all.accept_source_route = 0
net.ipv4.conf.default.accept_source_route = 0
net.ipv4.conf.all.accept_redirects = 0
net.ipv4.conf.default.accept_redirects = 0
net.ipv4.conf.all.secure_redirects = 0
net.ipv4.conf.default.secure_redirects = 0
net.ipv4.icmp_echo_ignore_broadcasts = 1
net.ipv4.icmp_ignore_bogus_error_responses = 1
net.ipv4.conf.all.rp_filter = 1
net.ipv4.conf.default.rp_filter = 1
net.ipv4.tcp_syncookies = 1
kernel.dmesg_restrict = 1
net.ipv6.conf.all.accept_redirects = 0
net.ipv6.conf.default.accept_redirects = 0
[root@proxy ~]# vim /etc/sysctl.conf
kernel.sysrq=0
net.ipv4.ip_forward=1 # 改成1即可
[root@proxy ~]# sysctl -p
kernel.sysrq = 0
net.ipv4.ip_forward = 1
net.ipv4.conf.all.send_redirects = 0
2、不同网段实现了通信
- 上面的情况,客户端可以不用配置网关,但是了,这样就不能实现通信了,但是后面配置了lvs配置后,依然可以访问到,因此用的是地址转换
[root@client /]# ping 192.168.100.61
PING 192.168.100.61 (192.168.100.61) 56(84) bytes of data.
64 bytes from 192.168.100.61: icmp_seq=1 ttl=63 time=0.914 ms
64 bytes from 192.168.100.61: icmp_seq=2 ttl=63 time=0.703 ms
[root@httpd-s61 ~]# ping 192.168.200.62
PING 192.168.200.62 (192.168.200.62) 56(84) bytes of data.
64 bytes from 192.168.200.62: icmp_seq=1 ttl=63 time=1.10 ms
64 bytes from 192.168.200.62: icmp_seq=2 ttl=63 time=0.519 ms
- 实验,一个nat模式的机器,2个仅主机模式的机器,然后配置网关,然后实现了仅主机模式上网,开启路由转发功能,dns服务器找nat模式
3、LVS的nat配置LB集群
- 访问192.168.200.80的时候,lvs将请求分发到61和632个机器上面
1、安装lvs软件
# lvs服务器安装ipvsadm软件
[root@proxy yum.repos.d]# yum -y install ipvsadm
# 显示当前的配置,L是列出,n是以数字显示地址和端口号
[root@proxy ~]# ipvsadm -Ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
# 因为是新安装的,什么都没有配置
2、配置lvs
# 添加一个虚拟服务
# -A 是添加一个虚拟服务
# -t是tcp协议
# 地址lvs的访问地址
# -s 是算法为轮询的
[root@proxy ~]# ipvsadm -A -t 192.168.200.80:80 -s rr
[root@proxy ~]# 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.80:80 rr
# 为这个虚拟服务配置网站服务器
# -m是地址伪装,也就是nat
# 这些都是临时写入的,重启电脑的话,这些会消失掉
[root@proxy ~]# ipvsadm -a -t 192.168.200.80:80 -r 192.168.100.61:80 -m
[root@proxy ~]# 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.80:80 rr
-> 192.168.100.61:80 Masq 1 0 0
# 添加真正的网站服务器
[root@proxy ~]# ipvsadm -a -t 192.168.200.80:80 -r 192.168.100.63:80 -m
[root@proxy ~]# 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.80:80 rr
-> 192.168.100.61:80 Masq 1 0 0
-> 192.168.100.63:80 Masq 1 0 0
3、客户端测试
[root@client /]# curl 192.168.200.80
192.168.200.63
[root@client /]# curl 192.168.200.80
61
[root@client /]# curl 192.168.200.80
192.168.200.63
[root@client /]# curl 192.168.200.80
61
# 在这个实验环境下,gw是必须要配置的,保证了几个设备之间能够互相通信
4、永久保存配置
上面的命令是临时保存,因此的话,重启就会消失
保存在/etc/sysconfig/ipvsadm里面
需要注意的是,需要做域名解析,否则的话,下次重启,ip地址就会变成主机名了
[root@ipvs100 ~]# ipvsadm-save
-A -t ipvs100:http -s rr
-a -t ipvs100:http -r 192.168.100.61:http -m -w 1
-a -t ipvs100:http -r 192.168.100.63:http -m -w 1
# 需要做一个域名解析,这样的话,重启系统的时候,就知道ipvs100对应的哪一个ip地址
[root@ipvs100 ~]# cat /etc/hosts
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
192.168.200.80 ipvs100
[root@ipvs100 ~]# ipvsadm-save > /etc/sysconfig/ipvsadm
[root@ipvs100 ~]# cat /etc/sysconfig/ipvsadm
-A -t ipvs100:http -s rr
-a -t ipvs100:http -r 192.168.100.61:http -m -w 1
-a -t ipvs100:http -r 192.168.100.63:http -m -w 1
[root@ipvs100 ~]# systemctl enable ipvsadm
# 重启
reboot
# 查看策略
# 这样就永久保存了
[root@ipvs100 ~]# cat /etc/sysconfig/ipvsadm
-A -t 192.168.200.80:80 -s rr
-a -t 192.168.200.80:80 -r 192.168.100.61:80 -m -w 1
-a -t 192.168.200.80:80 -r 192.168.100.63:80 -m -w 1
# 重启服务的时候就会将这个文件里面的内容加载进去
4、nat模式工作过程
# 首先客户端192.168.200.62(源地址) 请求192.168.200.80(目的地址)
# 然后目的地址通过地址转换为192.168.100.61或者192.168.100.63
# 网站服务器回应一个请求,192.168.100.61为源地址,目标地址为192.168.200.62,lvs调度器将源地址修改为自己的vip,也就是192.168.200.80,从而实现与客户端的通信
# 一定要明确目标ip地址和源ip地址
1、nat模式缺点
lvs调度器有瓶颈,因为客户端和服务器都需要经过lvs调度器
数据包的进入和出去都需要经过这个lvs调度器才行
解决方法是客户端经过lvs调度器,然后服务器直接回复到客户端,不需要金经过lvs调度器了,使用的就是DR模式
2、查看字节数
[root@ipvs100 /]# ipvsadm -Ln --stats
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Conns InPkts OutPkts I
-> RemoteAddress:Port
TCP 192.168.200.80:80 25 123 72
-> 192.168.100.61:80 12 69 44
-> 192.168.100.63:80 13 54 28
[root@ipvs100 /]#
# 进来的字节数是客户端访问lvs产生的
# 出去的字节数是服务器回报lvs产生的
# 因此会收到这个调度器影响
三、lvs集群管理命令
1、修改调度算法
[root@ipvs100 sysconfig]# ipvsadm -E -t 192.168.200.80:80 -s wrr
2、清空所有策略
ipvsadm -C
# 然后保存才行,否则重启还是存在策略
ipvsadm-save > /etc/sysconfig/ipvsadm
3、删除一个虚拟服务
[root@ipvs100 sysconfig]# ipvsadm -D -t 192.168.200.80:80
4、删除一个realserver
# -d是删除realserver
# -t 是tcp协议
# 192.168.200.80:80 是虚拟服务
# -r 是轮询算法
# 192.168.100.61 是realserver
[root@ipvs100 sysconfig]# ipvsadm -d -t 192.168.200.80:80 -r 192.168.100.61\
[root@ipvs100 sysconfig]# 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.80:80 rr
-> 192.168.100.63:80 Masq 1 0 0
6、修改权重值
# -e 修改后端服务器的权重值
[root@ipvs100 sysconfig]# ipvsadm -e -t 192.168.200.80:80 -r 192.168.100.61 -m -w 3
四、lvs的DR模式搭建LB集群
1、lvsDR模式工作原理
服务器回应的给客户端的时候,不需要经过lvs调度器,直接回复到客户端
因此realserver 需要有vip,源ip直接转换为vip,发送到客户端
但是因此会产生一个问题,就是三个机器上面都有vip地址,因此客户端在发送请求时,需要2个网站服务器的vip不接受,只有lvs接收请求即可
lvs只负责分发请求
计算机的通信规则,访问的是100,回报的数据也的是100,如果是其他网段,不接收
需要解决的问题
让realserver 拥有vip地址
让realserver 不响应客户端访问vip地址的arp广播包
都是在同一个网段下的
2、实验前准备
# 2台网站服务器 100.61 100.63
# 一台lvs服务器 100.80 100.88
# 一台server端 100.62
# 都是在同一个网段下面的
# 因此的话lvs上面只需要一张网卡
# vip地址为192.168.100.88
# 防火墙和selinux都需要关掉
3、操作
- 解析
vip的问题
回包的时候需要vip地址
lo接口配置vip的问题
lo接口无法与客户端进行通信,因此的话,需要修改内核参数
# 因为lvs的DR工作模式为服务器直接返回给客户端,不需要通过lvs服务器
# 因此的话,就需要在server上面配置vip,但是配置了vip的话,就有3台机器能接受请求
# 因此vip配置在lo接口上面,就不会接收客户端访问vip的请求了
# 但是配置在lo接口上面,就无法与客户端进行通信了
# 因此开启内核模块 2 ,允许server上面的物理网卡帮lo转换到客户端,实现通信
# 内核 1 也解决了客户端访问vip地址时,需要的是访问的ip地址是本接口的真实ip地址,因此server上面的物理网卡不会帮lo接口接收客户端访问vip请求,因为地址不一样,vip地址与server上面的物理网卡地址不一样
# server上面的物理网卡地址帮lo进行收发流量,但是 内核 1 限制了访问vip的时候,地址需要一样
# 这样就实现了要求,既有server上面有vip地址,但是不会接受到客户端发送给vip的请求,然后server能通过物理网卡帮lo实现转发流量到客户端了
1、绑定vip地址和开启内核
[root@ipvs100 ~]# ifconfig ens36:1 192.168.100.88/32
[root@ipvs100 ~]# ifconfig ens36:1
ens36:1: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 192.168.100.88 netmask 0.0.0.0 broadcast 255.255.255.255
ether 00:0c:29:31:ee:e2 txqueuelen 1000 (Ethernet)
# 临时添加,重启失效
# server绑定vip
[root@httpd-63 /]# ifconfig lo:1 192.168.100.88/32
# 但是配置在lo接口上的话,还是无法与客户端上面的物理网卡进行通信
# 因此server上面可以让ens160帮忙转发lo接口的流量
# 修改内核参数
[root@httpd-61 conf]# pwd
/proc/sys/net/ipv4/conf
# 1就是目标ip在本接口上才能接收
# 2就是ens160帮lo接口收发流量
# 只有1和2协同工作才能实现,访问vip的时候,server上面的物理网卡不会帮lo接口收到流量,只有lvs服务器的物理接口才能收到这个流量
# server直接通过lo接口转发到自己物理网卡发送到客户端上面,实现了通信
# 因此lo接口只能与自己进行通信,不能与其他主机的物理网卡进行通信,但是有了2这个功能,自己的物理网卡能帮忙lo进行接收和转发流量
# 但同时开启了1接口,就保证了客户端访问vip的时候,不会被lo接口接收到
[root@httpd-61 conf]# ls
all default ens33 lo
[root@httpd-61 conf]# echo 1 > lo/arp_ignore
[root@httpd-61 conf]# echo 1 > all/arp_ignore
[root@httpd-61 conf]# echo 2 > lo/arp_announce
[root@httpd-61 conf]# echo 2 > all/arp_announce
2、ipvsadm配置
[root@ipvs100 ~]# ipvsadm -A -t 192.168.100.88:80 -s rr
[root@ipvs100 ~]# 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.100.88:80 rr
# 创建server
# -g是路由模式,默认是nat模式
[root@ipvs100 ~]# ipvsadm -a -t 192.168.100.88:80 -r 192.168.100.61:80 -g
[root@ipvs100 ~]# ipvsadm -a -t 192.168.100.88:80 -r 192.168.100.63:80 -g
[root@ipvs100 ~]# 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.100.88:80 rr
-> 192.168.100.61:80 Route 1 0 0
-> 192.168.100.63:80 Route 1 0 0
# 这样就配置好了
3、永久保存配置一样的操作
3、客户端测试
[root@client ~]# curl 192.168.100.88
192.168.200.63
[root@client ~]# curl 192.168.100.88
61
# 出去的包没有,只有进来的包
# 进来的包客户端请求lvs服务器
# 回来的包直接到客户端,没有到lvs服务器
# 因此的话,lvs只进行了分发
[root@ipvs100 ~]# ipvsadm -Ln --stats
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Conns InPkts OutPkts InBytes OutBytes
-> RemoteAddress:Port
TCP 192.168.100.88:80 14 84 0 5572 0
-> 192.168.100.61:80 7 42 0 2786 0
-> 192.168.100.63:80 7 42 0 2786 0
4、lvs的DR模式总结
一般都是临时配置的vip,不会单独有一个物理网卡来配置vip
客户端发送请求到lvs服务器vip,然后进行调度算法到真实的服务器上面
真实的服务器接收到数据后,通过自己的vip地址直接发送给客户端,而不是通过lvs服务器回复的
这样的话,减少了数据包的传输路径,提高了性能
真实的服务器通过vip地址来回复客户端
客户端地址 192.168.100.81
lvs的vip地址 192.168.100.80 DIP 地址 192.168.100.88
server的地址 192.168.100.61 62
# 客户端发送一个请求到lvs的vip上面,此时源地址为 81 目标地址为 80
# lvs通过调度算法将目标地址mac改为 61或者62,目标ip地址不变(vip)
# 然后通过dip接口出去访问到真实的服务器上面,而不是从vip接口出去(从这里面出去,目标mac就是vip,而不是真实的服务器)
# 到达了真实的服务器后,发现目标ip为自己的本地的vip,因此响应为,源地址为vip,目标地址为客户端地址,客户端的地址一直没有变化
# 变化的只是mac地址
没有健康检查服务,就是停掉一个网站服务的话,分发请求仍然会发送到故障的服务器上面的
lvs搭建LB的更多相关文章
- 用 LVS 搭建一个负载均衡集群(转)
http://blog.jobbole.com/87503/ 第一篇:<如何生成每秒百万级别的 HTTP 请求?> 第二篇:<为最佳性能调优 Nginx> 第三篇:<用 ...
- Keepalived+lvs 搭建高可用负载均衡
本站点停止更新,请访问:blog.coocap.com 不了解负载均衡高可用的童鞋,强烈建议先看keepalived+nginx高可用负载均衡: 传送门(求粉):http://www.cnblogs. ...
- LVS搭建负载均衡(二)DR模型
应用场景:LVS配置负载均衡方式之一:dr 测试环境: 配置步骤: 1. 在主机lvs上安装ipvsadm ~]# yum install ipvsadm -y ~]# ipvsadm //启动:该命 ...
- LVS搭建负载均衡(一)NAT模型
应用场景:LVS配置负载均衡方式之一:nat 测试环境: 测试步骤: 1. 在主机lvs上安装ipvsadm lvs~]# yum install ipvsadm -y lvs~]# ipvsadm ...
- CentOS 7 NAT模式LVS搭建
NAT模式下 , 调度器需要有两个IP , 一个公网IP一个内网IP , web服务器只需要内网IP 调度器LB : 192.168.94.11(内网IP) 192.168.29.11 (仅主机模式 ...
- Linux系统LVS搭建笔记
因为客户是国有企业,且一次性购买了14台服务器(16核),14台中暂且先用8台,其中LVS使用5台,NFS一台主要为了共享WEB系统(多台电脑的1.5T的硬盘容量浪费了).MySQL两台,Memcac ...
- 每秒处理3百万请求的Web集群搭建-用 LVS 搭建一个负载均衡集群
这篇文章是<打造3百万次请求/秒的高性能服务器集群>系列的第3部分,有关于性能测试工具以及优化WEB服务器部分的内容请参看以前的文章. 本文基于你已经优化好服务器以及网络协议栈的基础之上, ...
- 160526、高并发之LVS搭建负载均衡
LVS介绍: LVS的英文全称是Linux Virtual Server,即Linux虚拟服务器.它是我们国家的章文嵩博士的一个开源项目.在linux内核2.6中,它已经成为内核的一部分,在此之前的内 ...
- LVS搭建负载均衡集群(一)——NAT模式
(1).集群技术的分类 集群技术主要分为三大类:负载均衡(Load Balance)集群,简称LB集群:高可用(High Availability)集群,简称 HA 集群:高性能计算(High Per ...
- 高可用Keepalived+LVS搭建流程
本流程搭建1个master,1个backup节点的Keepalived,使用lvs轮询2个节点的服务. 一.使用版本 CentOS 7.7 Keepalived 1.3.5 ipvsadm 1.27( ...
随机推荐
- 【代码审计】Emlog存在SQL注入+XSS漏洞
1.源码简介 EMLOG 是一款轻量级开源博客和CMS建站系统,速度快.省资源.易上手,适合各种规模的站点搭建. 2.漏洞描述 EMLOG $keyword参数存在SQL注入漏洞. EMLOG art ...
- python-docx 设置表格边框
# -*- coding: utf-8 -*- """ Created on Sat Oct 24 17:21:31 2020 pip install -i https: ...
- NOIP集训 P4137 Rmq Problem / mex 题解
前置指使:可持久化线段树 题解:P4137 Rmq Problem / mex 有一个长度为 \(n\) 的数组 \(\{ a_1,a_2,...,a_n \}\) . \(m\) 次询问,每次询问一 ...
- [java与https]第一篇、证书杂谈
一.算法.密钥(对).证书.证书库 令狐冲是个马场老板,这天,他接到店里伙计电话,说有人已经签了租马合同,准备到马场提马,,他二话不说,突突突就去了,到了之后,发现不认识租客. 令狐冲说,你把你租马合 ...
- js技术之“自定义包含方案”
调用 // 用于判断包含 function diaoyong(arr, str){ // 初始化 var sizes = ['L','XL','S','M']; for (var i = 0; i & ...
- ARM终端 KylinOS 容器镜像导入排障
背景信息 电脑:华为擎云L420 CPU:ARM架构,HUAWEI Kirin 9006C OS:Kylin桌面操作系统V10(SP1) Kernel:5.4.96 Docker: 27.5.1 已准 ...
- Grid 布局-子项补充及常用布局
上篇我们介绍了 Grid 布局容器项的内容, 看上去属性很多, 其实并没有, 记住关键的概念和简写就行啦. 因为是二维的, 这个属性的数量就比 flex 要多很多哦, 但其实真正也没有常用那没多啦. ...
- 应用内存管理:Linux的应用与内存管理
应用程序想要使用内存,必须得找操作系统申请,那就有必要先了解下Linux内核怎么管理内存的,然后再去分析应用程序的内存管理细节. 硬件架构 现代计算机体系结构被称为Non-Uniform Memory ...
- ODOO14里面qweb使用案例
在ODOO里面中,通过QWeb来对模板进行渲染后加载到浏览器中,故作笔记以便于查询简介:Qweb被用作OpenERP的Web客户端模板引擎.它是一种基于XML的模板语言,同Genshi, Thymel ...
- WPF与WinForm的对比
WPF与WinForm的对比 本文同时为b站WPF课程的笔记,相关示例代码 创建新项目 在vs2022中,这两者分别叫做WPF应用和Windows窗体应用. 渲染引擎和设计 WPF使用DirectX作 ...