目录
集群和分布式
集群和分布式
集群:一个业务系统,部署在多台主机上,数据和代码都是完全一致的
分布式:把一个复杂的请求,按照功能拆分,使用微服务来完成(RS)
结合在一起去使用,性能更优
lvs功能简介
LVS:负载调度器,分为四层(最多到端口,可以更改MAC,IP,端口),也叫四层负载
查看内核有没有lvs
[root@lvs ~]# cd /boot/
[root@lvs ~]# ls
[root@lvs ~]# less config-
#IPVS scheduler
#内核默认支持lvs,内核级别,转发速度快!!
lvs的概念
VS:lvs服务器
RS:后端服务器
CIP:客户IP
VIP:客户访问lvs的IP
DIP:访问RS的IP
RIP:提供服务的主机的IP
访问流程:CIP<--->VIP==DIP<--->RIP
lvs的集群类型
DIP<--->RIP
lvs-nat:修改请求报文的目标,多目标IP的DNAT(常用)
lvs-dr:操作封装新的MAC地址(常用)
lvs-tun:在原请求报文之外新加一个IP首部
lvs:fullnat:修改请求报文的源和目标IP (内核不支持)
ipvsadm常见参数详解
管理集群服务中的增删改
[root@localhost ~]# ipvsadm -A|E -t|u|f service-address [-s scheduler] [-p [timeout]]
-A #添加
-E #修改
-t #tcp服务
-u #udp服务
-s #指定调度算法,默认为WLC
-p #设置持久连接超时,持久连接可以理解为在同一个时间段同一个来源的请求调度到同一Realserver(例如加入购物车的东西刷新不会消失)
-f #firewall mask 火墙标记,是一个数字
练习
[root@localhost ~]# ipvsadm -A -t 172.25.254.200:80 -s rr
[root@localhost ~]# ipvsadm -E -t 172.25.254.200:80 -s wrr
#查看数据
[root@localhost ~]# ipvsadm Ln --rate
CPS 总链接个数
InPPS 出去的所有链接总量
OutPPS 出去的所有链接总量
InBPS 进入的所有数据总量
OutBPS 出去的所有数据总量
#删除指定某条
[root@localhost ~]# ipvsadm -D -t 172.25.254.200:80
#删除全部策略
[root@localhost ~]# ipvsadm -C
管理RealServer
[root@localhost ~]# ipvsadm -A -t 172.25.254.200:80 -s rr
[root@localhost ~]# ipvsadm -E -t 172.25.254.200:80 -s wrr
#查看数据
[root@localhost ~]# ipvsadm Ln --rate
CPS 总链接个数
InPPS 出去的所有链接总量
OutPPS 出去的所有链接总量
InBPS 进入的所有数据总量
OutBPS 出去的所有数据总量
#删除指定某条
[root@localhost ~]# ipvsadm -D -t 172.25.254.200:80
#删除全部策略
[root@localhost ~]# ipvsadm -C
永久保存策略
[root@localhost ~]# ipvsadm > /etc/sysconfig/ipvsadm
[root@localhost ~]#ipvsadm -n > /etc/sysconfig/ipvsadm
#恢复策略
[root@localhost ~]# ipvsadm-restore < /etc/sysconfig/ipvsadm
#ipvsadm服务会记录当前状态,开启的时候文件有没有内容,重启后就有或者没有
[root@localhost ~]# systemctl stop ipvsadm.service
[root@localhost ~]# vim /etc/sysconfig/ipvsadm
[root@localhost ~]# systemctl start ipvsadm.service
NAT模式原理以及部署方法
原理
RS需要设定网关,必须是DIP
1.客户端发送访问请求,请求数据包中含有请求来源(cip),访问目标地址(VIP)访问目标端口
(9000port)
2.VS服务器接收到访问请求做DNAT把请求数据包中的目的地由VIP换成RS的RIP和相应端口
3.RS1相应请求,发送响应数据包,包中的相应保温为数据来源(RIP1)响应目标(CIP)相应端口
(9000port)
4.VS服务器接收到响应数据包,改变包中的数据来源(RIP1-->VIP),响应目标端口(9000-->80)
5.VS服务器把修改过报文的响应数据包回传给客户端
6.lvs的NAT模式接收和返回客户端数据包时都要经过lvs的调度机,所以lvs的调度机容易阻塞
实验
lvs部分
[root@lvs ~]# sysctl -a | grep ip_forward
#lvs中打开内核路由服务
[root@lvs ~]# vim /etc/sysctl.conf
net.ipv4.ip_forward=1
#生效
[root@lvs ~]# sysctl -p
#安装lvs软件
[root@lvs ~]# dnf search lvs
[root@lvs ~]# dnf install ipvsadm -y
#策略文件
[root@localhost ~]# cat /etc/sysconfig/ipvsadm
#增加策略
[root@localhost ~]# ipvsadm -A -t 172.25.254.100:80 -s rr
# -A 增加虚拟server
# -t 协议
# 172.25.254.100:80 客户访问100的时候开始调度
# -s 指定调度算法
# rr 轮询(静态算法) 你一个我一个
#查看策略
[root@localhost ~]# ipvsadm -Ln
#调度主机
[root@localhost ~]# ipvsadm -a -t 172.25.254.100:80 -r 192.168.0.10:80 -m
# -r real server
# -m lvs模式
# -w 权重 (wrr算法)
[root@localhost ~]# ipvsadm -a -t 172.25.254.100:80 -r 192.168.0.20:80 -m
#查看策略
[root@lvs ~]# ipvsadm -Ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 172.25.254.100:80 rr
-> 192.168.0.10:80 Masq 1 0 0
-> 192.168.0.20:80 Masq 1 0 0
#保存策略
[root@lvs ~]# ipvsadm-save > /etc/sysconfig/ipvsadm
webserver1 2 部分
[root@webserver1 ~]# vmset.sh eth0 192.168.0.10 webserver1.example.org
[root@webserver1 ~]# vim /etc/NetworkMangaer/system-connections/eth0.nmconnection
[connection]
id=eth0
type=ethernet
interface-name=eth0
#一定要修改这个地方的网关,因为要和lvs在同一个网段下
[ipv4]
address1=192.168.0.10/24,192.168.0.100
method=manual
#检查网关是否生效
[root@webserver1 ~]# route -n
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
0.0.0.0 192.168.0.100 0.0.0.0 UG 100 0 0 eth0
192.168.0.0 0.0.0.0 255.255.255.0 U 100 0 0 eth0
#安装apache服务
[root@webserver1 ~]# dnf install httpd -y
[root@webserver1 ~]# echo webserver1 - 192.168.0.10 > /var/www/html/index.html
#开机自启httpd服务
[root@webserver1 ~]# systemctl enable --now httpd
测试
[root@localhost ~]# for i in {1..10}; do curl 172.25.254.100; done
webser1 192.168.0.10
webserver2 192.168.0.20
webser1 192.168.0.10
webserver2 192.168.0.20
webser1 192.168.0.10
webserver2 192.168.0.20
webser1 192.168.0.10
webserver2 192.168.0.20
webser1 192.168.0.10
webserver2 192.168.0.20
DR模式原理以及部署方法
nat模式的缺点:
所有流量都要去访问lvs,nat后面最多挂10台主机
如何解决?
引进DR模式:解决lvs压力过大的问题
工作特点:
lvs只进不发
RS直接回到客户端,
特点:lvs与RS相同网段,不能跨vlan,否则lvs不知道RS的mac地址
如果要跨就得用隧道模式
实验
client
[root@client ~]# vmset.sh eth0 172.25.254.200 client.example.com
[root@client ~]# cat /etc/NetworkManager/system-connections/eth0.nmconnection
[connection]
id=eth0
type=ethernet
interface-name=eth0
[ipv4]
address1=172.25.254.200/24,172.25.254.100
method=manual
router
[root@router ~]# vmset.sh eth0 172.25.254.100 router.example.org
[root@router ~]# vmset.sh eth1 192.168.0.100
[root@router ~]# cat /etc/NetworkManager/system-connections/eth1.nmconnection
[connection]
id=eth1
type=ethernet
interface-name=eth1
[ipv4]
address1=192.168.0.100/25
method=manual
[root@router ~]# cat /etc/NetworkManager/system-connections/eth0.nmconnection
[connection]
id=eth0
type=ethernet
interface-name=eth0
[ipv4]
address1=172.25.254.100/24,172.25.254.2
method=manual
#内核路由功能要打开
[root@router ~]# vim /etc/sysctl.conf
net.ipv4.ip_forward = 1
[root@router ~]# sysctl -p
net.ipv4.ip_forward = 1
#检查内核路由功能是否打开
[root@router ~]# sysctl -a | grep ip_forward
net.ipv4.ip_forward = 1
net.ipv4.ip_forward_update_priority = 1
net.ipv4.ip_forward_use_pmtu = 0
lvs
[root@lvs ~]# ip a a 192.168.0.200/32 dev lo
[root@lvs ~]# ipvsadm -A -t 192.168.0.200:80 -s wrr
[root@lvs ~]# ipvsadm -a -t 192.168.0.200:80 -r 192.168.0.10:80 -g -w 1
[root@lvs ~]# ipvsadm -a -t 192.168.0.200:80 -r 192.168.0.20:80 -g -w 2
[root@lvs ~]# 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.0.200:80 wrr
-> 192.168.0.10:80 Route 1 0 0
-> 192.168.0.20:80 Route 2 0 0
webserver1 2
[root@webserver1 ~]# vmset.sh eth0 192.168.0.10 webserver1.example.org
#可以在回环网卡做
#必须先开启禁用lo的功能
[root@webserver1 ~]# echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore
[root@webserver1 ~]# echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce
#才能设定某个网卡
[root@webserver1 ~]# echo 1 > /proc/sys/net/ipv4/conf/lo/arp_ignore
[root@webserver1 ~]# echo 2 > /proc/sys/net/ipv4/conf/lo/arp_announce
#以上操作做了之后,lo只对eth0响应
[root@webserver1 ~]# cat /etc/NetworkManager/system-connections/eth0.nmconnection
[connection]
id=eth0
type=ethernet
interface-name=eth0
[ipv4]
address1=192.168.0.10/24,192.168.0.100
method=manual
dns=114.114.114.114;
[root@webserver1 ~]# systemctl stop firewalld
[root@webserver1 ~]# systemctl enable --now httpd
Created symlink /etc/systemd/system/multi-user.target.wants/httpd.service → /usr/lib/systemd/system/httpd.service.
[root@webserver1 ~]# echo webserver1-192.168.0.10 > /var/www/html/index.html
TUN模式
ip层都可以跨网络
客户端发送了一个CIP+VIP的包到达lvs后
lvs在数据包前面添加DIP+RIP
数据包从DIP出去后达到RIP,RS拆开包发现CIP+VIP
然后直接回到客户机
模式和DR模式类似,但是是增加的IP,不是MAC地址
FULLNET模式
lvs
客户端发送出CIP+VIP的包
lvs将其转换为DIP+RIP
回来的时候又转变为CIP+VIP
类似nat模式的增强版
lvs算法
静态算法
RR
轮询,当RS配置有差别时不推荐
WRR
加权轮询根据RS的配置进行加权调度,性能差的RS被调度的次数少
SH
Source Hashing,实现session sticky,源IP地址hash;将来自于同一个IP地址的请求始终发往 第一次挑中的RS,从而实现会话绑定
弊端:多个用户使用同一个IP
DH
Destination Hashing;目标地址哈希,第一次轮询调度至RS,后续将发往同一个目标地址的请求始终转发至第一次挑中的RS,典型使用场景是正向代理缓存场景中的负载均衡,如:宽带运营商
动态算法
LC
适用于长连接应用Overhead(负载值)=activeconns(活动链接数)x256+inactiveconns(非活动链接数)
缺点:后端服务器性能不一致,可能会调度到性能差的主机
WLC
默认调度方法Overhead=(activeconns x 256+inactiveconns)/weight
缺点:会导致其中一台RS负载过高
SED
初始连接高权重优先Overhead=(activeconns+1+inactiveconns) x 256/weight
缺点:会导致其中一台RS负载过高
NQ
Never Queue,第一轮均匀分配,后续SED
LBLC
Locality-Based LC,动态的DH算法,使用场景:根据负载状态实现正向代理
LCLCR
LBLC with Replication,带复制功能的LBLC,解决LBLC负载不均衡问题,从负载重的复制到负载轻的RS
mark标记解决调度问题
为什么要引进呢?
因为当我们想访问80和443端口时,他还是进行的分开控制,没有轮询
错误示例
#client部分
#这是因为防火墙标签解决轮询调度(错误)问题
# -k 忽略证书
[root@client ~]# curl 192.168.0.200;curl -k https://192.168.0.200
webserver2 - 192.168.0.20
webserver2 - 192.168.0.20
[root@client ~]# curl 192.168.0.200;curl -k https://192.168.0.200
webserver1 - 192.168.0.10
webserver1 - 192.168.0.10
[root@client ~]# curl 192.168.0.200;curl -k https://192.168.0.200
webserver2 - 192.168.0.20
webserver2 - 192.168.0.20
正确示例
#LVS部分
#lvs中为端口做标记
[root@lvs ~]# iptables -t mangle -A PREROUTING -d 192.168.0.200 -p tcp -m multiport --dports 80,443 -j MARK --set-mark 66
[root@lvs ~]# iptables -t mangle -nL
Chain PREROUTING (policy ACCEPT)
target prot opt source destination
MARK tcp -- 0.0.0.0/0 192.168.0.200 multiport dports 80,443 MARK set 0x42
Chain INPUT (policy ACCEPT)
target prot opt source destination
Chain FORWARD (policy ACCEPT)
target prot opt source destination
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
Chain POSTROUTING (policy ACCEPT)
target prot opt source destination
[root@lvs ~]# ipvsadm -C
[root@lvs ~]# ipvsadm -Ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
# 在主机基于标记定义集群服务
[root@lvs ~]# ipvsadm -A -f 66 -s rr
[root@lvs ~]# ipvsadm -a -f 66 -r 192.168.0.10 -g
[root@lvs ~]# ipvsadm -a -f 66 -r 192.168.0.20 -g
[root@lvs ~]# ipvsadm -Ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
FWM 66 rr
-> 192.168.0.10:0 Route 1 0 0
-> 192.168.0.20:0 Route 1 0 0
#webserver1 2部分
#下载加密模块协议,让rs支持https
[root@webserver1 ~]# yum install mod_ssl -y
Complete!
[root@webserver1 ~]# systemctl restart httpd
[root@webserver1 ~]# netstate -antlupe | grep httpd
#LVS解决后,成功实现
[root@client ~]# curl 192.168.0.200;curl -k https://192.168.0.200
webserver2 - 192.168.0.20
webserver1 - 192.168.0.10
[root@client ~]# curl 192.168.0.200;curl -k https://192.168.0.200
webserver2 - 192.168.0.20
webserver1 - 192.168.0.10
[root@client ~]# curl 192.168.0.200;curl -k https://192.168.0.200
webserver2 - 192.168.0.20
webserver1 - 192.168.0.10
lvs的持久连接
#LVS部分
#lvs中为端口做标记
[root@lvs ~]# iptables -t mangle -A PREROUTING -d 192.168.0.200 -p tcp -m multiport --dports 80,443 -j MARK --set-mark 66
[root@lvs ~]# iptables -t mangle -nL
Chain PREROUTING (policy ACCEPT)
target prot opt source destination
MARK tcp -- 0.0.0.0/0 192.168.0.200 multiport dports 80,443 MARK set 0x42
Chain INPUT (policy ACCEPT)
target prot opt source destination
Chain FORWARD (policy ACCEPT)
target prot opt source destination
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
Chain POSTROUTING (policy ACCEPT)
target prot opt source destination
[root@lvs ~]# ipvsadm -C
[root@lvs ~]# ipvsadm -Ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
# 在主机基于标记定义集群服务
[root@lvs ~]# ipvsadm -A -f 66 -s rr
[root@lvs ~]# ipvsadm -a -f 66 -r 192.168.0.10 -g
[root@lvs ~]# ipvsadm -a -f 66 -r 192.168.0.20 -g
[root@lvs ~]# ipvsadm -Ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
FWM 66 rr
-> 192.168.0.10:0 Route 1 0 0
-> 192.168.0.20:0 Route 1 0 0
#webserver1 2部分
#下载加密模块协议,让rs支持https
[root@webserver1 ~]# yum install mod_ssl -y
Complete!
[root@webserver1 ~]# systemctl restart httpd
[root@webserver1 ~]# netstate -antlupe | grep httpd
#LVS解决后,成功实现
[root@client ~]# curl 192.168.0.200;curl -k https://192.168.0.200
webserver2 - 192.168.0.20
webserver1 - 192.168.0.10
[root@client ~]# curl 192.168.0.200;curl -k https://192.168.0.200
webserver2 - 192.168.0.20
webserver1 - 192.168.0.10
[root@client ~]# curl 192.168.0.200;curl -k https://192.168.0.200
webserver2 - 192.168.0.20
webserver1 - 192.168.0.10