集群内并发LVS
负载均衡和nginx反向代理
Nginx是一个七层的负载均衡器,所以效率势必比四层的LVS低很多,但是可操作性比LVS高
负载均衡(hold住流量)
nginx(七层)则hold住握手
正向代理:局域网中的电脑用户想要直接访问服务器是不可行的,服务器可能Hold不住,只能通过代理服务器来访问,这种代理服务就被称为正向代理,特点是客户端知道自己访问的是代理服务器。
反向代理:客户端无法感知代理,因为客户端访问网络不需要配置,只要把请求发送到反向代理服务器,由反向代理服务器去选择目标服务器获取数据,然后再返回到客户端。
此时反向代理服务器和目标服务器对外就是一个服务器,暴露的是代理服务器地址,隐藏了真实服务器 IP 地址
CIP(客户端IP)->VIP(虚拟IP)->DIP(分发ip)->RIP(真实服务器IP)
NAT
NAT(Network Address Translation),是指网络地址转换
家庭网络(内网地址)通过路由器访问公网(公网地址),然后访问到百度。
如果两个属于同一局域网的人同时访问百度,源地址通过默认网关会被替换成一个公网地址,如下图192.168.1.8:12121被替换为 6.6.6.6:12121【路由器对应公网的地址】,然后这个数据包就可以通过下一跳,陆续跳到百度对应的服务器上面了,然后再将返回的数据扔回路由器,然后路由器再将对应公网地址对应的端口根据路由表找到对应的发生源主机。
如果两个人同时请求百度的话,为了解决百度返回包一样找不到对应是谁发的包的情况时,路由器有一张表,路由器申请一个随机端口号,将来的端口号替换成一个随机的端口号,那么访问返回的包就可以通过端口号找到对应的主机了。
然后如下图当返回包信息的时候则通过对应的端口在路由器的表里面去找到该端口对应的主机则就可以
将消息返回过来了:
由于发送数据包每次修改的是源地址,又称为S-NAT
同理目标地址转换又叫D-NAT
由此我们引出:
客户端到LVS负载均衡再到服务器:
从CIP->VIP再由CIP->RIP的转换过程称为目标地址转换,
由CIP->RIP,我们的返回数据包则将RIP->CIP的数据包发送给负载均衡服务器,
然后再由负载均衡服务器做一个源地址转换,将RIP转换为VIP。最后通过VIP->CIP
将数据包发送回去
DNAT缺点:
1、非对称:发送请求的数据包大小和返回数据包的大小不对称【请求小,但是响应的数据很大】
,带宽成为瓶颈.
2、由于要做IP转换消耗算力
3、并且要求RS的GW指向负载均衡服务器
DR模式(直接路由)
如果要最大效率利用带宽的话,那么则要让real server(真实服务器)的数据包直接返回到client,如下图
请求从CIP发送到负载均衡服务器,然后负载均衡服务器要找到RS,那么它会在数据链路层做一个封装,
给这个请求根据负载来增加一个RS的MAC地址
其中红色的VIP是暴露出去的,绿色的VIP是每个服务端存的,对外隐藏,对内可见。CIP来了找到暴露的
红色的VIP,然后再把数据包分配给绿色的某个VIP的服务,然后访问真实服务器,真实服务器根据VIP->CIP返回
这种模式是基于2层的MAC地址欺骗,优点是速度快成本低,但是由于是改了MAC地址,MAC地址是点对点的所以要求负载和RealServer要在同一局域网。
TUN模式(IP的数据包背着IP的数据包发送的一个过程)
可以解决我们物理位置限制的问题,首先是CIP->VIP,然后通过一个分发IP(DIP)->RIP去套上CIP到VIP即可,再通过DIP找到RIP,然后【撕开最外层包裹的DIP->RIP】再通过套上的CIP->VIP回调回到VIP->CIP
隐藏VIP
隐藏VIP目录映射的是程序内存里面的变量,所以修改只能通过echo重定向覆盖,因为vi像office,会产生一个隐藏临时文件,如果这个路劲代表的是内核里面的某一个内存地址空间,如果用vi打开产生了一个临时文件,约等于我要在程序的地址空间里面产生一个变量,我们只能改变量,并不能创建变量。
ipvs:linux将lvs代码封装到ipvs内核模块。
ipvsadm可以和ipvs交互。
-s scheduler (调度算法)
arp_ignore说明:
如下图有两个网卡,其中一个网卡代表我的手机号,另一个网卡代表我爱人的手机号
当为0的时候朋友请求我爱人的手机号时,我直接告诉她
当为1的时候:
男生请求我爱人的手机号时,直接告诉他没有
女生请求我爱人的手机号时,直接告诉她我没有爱人
(堆外刻意隐藏,对内可见)
LO网卡(虚拟网卡):Local Loopack 对应l带localhost的访问请求
实验手册
首先VMWARE提供了一个虚拟网络,这个虚拟网络有网络号有网关,并且是一个NAT模式,同时还给我们提供了几个虚拟主机,同时每个虚拟主机有它对应的网卡,虚拟网卡都是连接在虚拟网络上面的,同时有个虚拟网卡,192.168.150.1,还有个windows后台服务:VMware-NAT,虚拟机的数据包发送给VMware-NAT,再发送给以太网本地连接(将地址转换 192.168.150.11->192.168.1.33),127.0.0.1为一个虚拟网卡。
node01有一个暴露出去的VIP,这个VIP也充当了DIP,node02和node03都是RealServer配置的VIP要在它的环回接口上
首先浏览器请求会请求VIP 192.168.150.100:80,首先会走虚拟网卡(vmnet-8)将数据包发送出去,然后通过虚拟网卡,将数据包扔给虚拟网络(交换机),然后进入到第一台(node01),然后判定LVS,然后通过192.168.150.11这个网卡将数据发送给192.168.150.12,然后将数据发给应用层,然后返回的话则用虚拟网卡的192.168.150.1作为源地址,然后通过自己的网卡,将目标地址作为192.168.150.1发送出去,然后再通过192.168.150.1发送数据返回到192.168.150.100
图上LVS搭建
node01:
ifconfig eth0:8 192.168.150.100/24
node02~node03:
1)修改内核:
echo 1 > /proc/sys/net/ipv4/conf/eth0/arp_ignore
echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore
echo 2 > /proc/sys/net/ipv4/conf/eth0/arp_announce
echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce
2)设置隐藏的vip:
ifconfig lo:3 192.168.150.100 netmask 255.255.255.255 //配置成4个255的意思是为了防止从环回接口也可以抵达192.168.150这个网络
LVS服务配置
node01:
yum install ipvsadm
ipvsadm -A -t 192.168.150.100:80 -s rr
ipvsadm -a -t 192.168.150.100:80 -r 192.168.150.12 -g -w 1
ipvsadm -a -t 192.168.150.100:80 -r 192.168.150.13 -g -w 1
ipvsadm -ln
验证:
浏览器访问 192.168.150.100 看到负载 疯狂F5
node01:
netstat -natp 结论看不到socket连接
node02~node03:
netstat -natp 结论看到很多的socket连接
node01:
ipvsadm -lnc 查看偷窥记录本
TCP 00:57 FIN_WAIT 192.168.150.1:51587 192.168.150.100:80 192.168.150.12:80
FIN_WAIT: 连接过,偷窥了所有的包
SYN_RECV: 基本上lvs都记录了,证明lvs没事,一定是后边网络层出问题
LVS挂掉了怎么办?
属于业务下线单点故障
解决方式:
它是一个,一个有问题,那么我们使用一堆:一变多。
2个思路:
多点形式:(1)主备【主备机,属于常用方式】 (2)主主【所有的LVS都是主机,借用动态DNS实现】
主备实现讨论:
从两个维度出发
方向性:1、备机去主动观察主机是否挂掉(会影响主机性能) 2、主机每隔一段时间发送一个广播包(推荐)
效率性:对于多个备机加一个权重去选择某个备机
主从:有主有从各自协调处理不同的业务
主备:是主机挂了才会让备机替换主机
RS挂掉:一部分用户会请求异常
LVS还会存有这个负载记录。
思考:
RS挂了怎么确定?你如何确定baidu挂了?
访问一下,底层:验证的是应用层的http协议-》发请求,判断返回 200 ok,
keepalive
如何做?
1、LVS:内核中有模块:ipvs<-增加代码
2、第三方实现:用程序(keepalived)替代监控服务的状态,解决单点故障,实现高可用
1)监控自己服务
2)Master(主机)通告自己还活着,Backup(备机)监听Master状态,Master挂了,一堆Backup推举出一个新的Master。
3)配置:VIP,添加ipvs,keepalived是有配置文件的
4)对后端server做健康检查
keepalived是一个通用的工具,主要作为高可用实现。
nginx:可以作为公司的负载均衡使用,nginx成为了单点故障,也可以用keepalived来解决
keepalived 实验
两个LVS里面的VIP同时只能有一个起作用,
keepalived实验:
主机: node01~node04
node01:
ipvsadm -ln
ipvsadm -C
ifconfig eth0:8 down
----------------------------
node01,node04:
yum install keepalived ipvsadm -y
配置:
cd /etc/keepalived/
cp keepalived.conf keepalived.conf.bak
vi keepalived.conf
node01:
vrrp:虚拟路由冗余协议!
vrrp_instance VI_1 {
state MASTER // node04 BACKUP(主备机)
interface eth0 //发送数据包到不同网络 eth0组建一个网络,eth1组建另一个网络,,,
virtual_router_id 51
priority 100 // node04 50(权重值)
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
//VIP
virtual_ipaddress {
192.168.150.100/24 dev eth0 label eth0:3
}
}
//虚拟服务
virtual_server 192.168.150.100 80 {
delay_loop 6
lb_algo rr
lb_kind DR
nat_mask 255.255.255.0
persistence_timeout 0 //持久化超时时间(单位秒)缓存客户端到服务端的连接,一段时间内再来则直接将数据发送到缓存的服务端做连接。避免了另一台服务器的开销
protocol TCP
real_server 192.168.150.12 80 {
weight 1
HTTP_GET {
url {
path /
status_code 200
}
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
}
}
real_server 192.168.150.13 80 {
weight 1
//健康检查配置
HTTP_GET {
url {
path /
status_code 200
}
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
}
}
scp ./keepalived.conf
root@node04:`pwd` //远程拷贝
service keepalived start
ifconfig eth0 down
ifconfig eth0 up
程序优缺点
查询keepalived进程会发现有如上图所示的父子关系,上图有三个keepalived进程,一个主进程(我还活着),另外两个连的都是RealServer去做健康检查。
如果kill -9 杀掉全部keepalived进程
然后再ifconfig
发现忘记收回VIP了,
ipvsadm -ln
发现配置也没有收回
此方式会造成备机网卡也会出现VIP
这样会造成数据包紊乱,这样只能通过zookeeper高可用集群来解决这个问题。