diff --git a/负载均衡简介.md b/负载均衡简介.md new file mode 100644 index 0000000..c1cd0c6 --- /dev/null +++ b/负载均衡简介.md @@ -0,0 +1,401 @@ +
+
+直接路由(Direct routing)模式:
+
+ 原理:负载均衡器和RS都使用同一个IP对外服务。但只有DR对ARP请求进行响应,所有RS对本身这个IP的ARP请求保持静默。也就是说,网关会把对这个服务IP的请求全部定向给DR,而DR收到数据包后根据调度算法,找出对应的RS,把目的MAC地址改为RS的MAC(因为IP一致)并将请求分发给这台RS。这时RS收到这个数据包,处理完成之后,由于IP一致,可以直接将数据返给客户,则等于直接从客户端收到这个数据包无异,处理后直接返回给客户端。
+
+ 优点:和TUN(隧道模式)一样,负载均衡器也只是分发请求,应答包通过单独的路由方法返回给客户端。与VS-TUN相比,VS-DR这种实现方式不需要隧道结构,因此可以使用大多数操作系统做为物理服务器。
+
+ 缺点:(不能说缺点,只能说是不足)要求负载均衡器的网卡必须与物理网卡在一个物理段上。
+
+
+
+IP隧道(Tunnel)模式:
+
+ 原理:互联网上的大多Internet服务的请求包很短小,而应答包通常很大。那么隧道模式就是,把客户端发来的数据包,封装一个新的IP头标记(仅目的IP)发给RS,RS收到后,先把数据包的头解开,还原数据包,处理后,直接返回给客户端,不需要再经过负载均衡器。注意,由于RS需要对负载均衡器发过来的数据包进行还原,所以说必须支持IPTUNNEL协议。所以,在RS的内核中,必须编译支持IPTUNNEL这个选项
+
+ 优点:负载均衡器只负责将请求包分发给后端节点服务器,而RS将应答包直接发给用户。所以,减少了负载均衡器的大量数据流动,负载均衡器不再是系统的瓶颈,就能处理很巨大的请求量,这种方式,一台负载均衡器能够为很多RS进行分发。而且跑在公网上就能进行不同地域的分发。
+
+ 缺点:隧道模式的RS节点需要合法IP,这种方式需要所有的服务器支持”IP Tunneling”(IP Encapsulation)协议,服务器可能只局限在部分Linux系统上。
+
+
+
+FULL-NAT模式:
+
+ 原理:客户端对VIP发起请求,Director接过请求发现是请求后端服务。Direcrot对请求报文做full-nat,把源ip改为Dip,把目标ip转换为任意后端RS的rip,然后发往后端,rs接到请求后,进行响应,相应源ip为Rip目标ip还是DIP,由内部路由路由到Director,Director接到响应报文,进行full-nat。将源地址为VIP,目标地址改为CIP;请求使用DNAT,响应使用SNAT
+
+#### 3.四者区别
+
+lvs-nat与lvs-fullnat:请求和响应报文都经由Director
+
+ lvs-nat:RIP的网关要指向DIP
+
+ lvs-fullnat:RIP和DIP未必在同一IP网络,但要能通信
+
+lvs-dr与lvs-tun:请求报文要经由Director,但响应报文由RS直接发往Client
+
+ lvs-dr:通过封装新的MAC首部实现,通过MAC网络转发
+
+ lvs-tun:通过在原IP报文外封装新IP头实现转发,支持远距离通信
+
+## 四:LVS集群部署
+
+#### 1.环境准备
+
+```shell
+192.168.182.100/24 (DR) VIP:192.168.182.10/32
+192.168.182.110/24 (RS-1) VIP:192.168.182.10/32
+192.168.182.120/24 (RS-2) VIP:192.168.182.10/32
+```
+
+#### 2.LVS安装
+
+```shell
+[root@lvs-server ~]# yum -y install ipvsadm
+```
+
+注意:
+
+```shell
+规则保存工具:/usr/sbin/ipvsadm --save > /path/to/file
+配置文件:/etc/sysconfig/ipvsadm-config
+```
+
+#### 3.配置LVS
+
+```shell
+[root@lvs-server ~]# ip addr add dev ens33 192.168.182.10/32 #设置VIP
+[root@lvs-server ~]# ipvsadm --save > /etc/sysconfig/ipvsadm
+[root@lvs-server ~]# systemctl start ipvsadm #启动
+注意:启动如果报错: /bin/bash: /etc/sysconfig/ipvsadm: 没有那个文件或目录
+需要手动生成文件
+[root@lvs-server ~]# ipvsadm --save > /etc/sysconfig/ipvsadm
+```
+
+#### 4.定义策略
+
+```shell
+[root@lvs-server ~]# ipvsadm -C #清除内核虚拟服务器表中的所有记录。
+[root@lvs-server ~]# ipvsadm -A -t 192.168.182.10:80 -s rr
+[root@lvs-server ~]# ipvsadm -a -t 192.168.182.10:80 -r 192.168.182.110 -g
+[root@lvs-server ~]# ipvsadm -a -t 192.168.182.10:80 -r 192.168.182.120 -g
+[root@lvs-server ~]# ipvsadm -S > /etc/sysconfig/ipvsadm #保存,保存到一个文件中
+```
+
+#### 5.查看规则
+
+```shell
+[root@lvs-server ~]# 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.182.10:80 rr
+ -> 192.168.182.110:80 Route 1 0 0
+ -> 192.168.182.120:80 Route 1 0 0
+[root@lvs-server ~]# ipvsadm -L -n
+[root@lvs-server ~]# ipvsadm -L -n --stats #显示统计信息
+1. Conns (connections scheduled) 已经转发过的连接数
+2. InPkts (incoming packets) 入包个数
+3. OutPkts (outgoing packets) 出包个数
+4. InBytes (incoming bytes) 入流量(字节)
+5. OutBytes (outgoing bytes) 出流量(字节)
+[root@lvs-server ~]# ipvsadm -L -n --rate #看速率
+1. CPS (current connection rate) 每秒连接数
+2. InPPS (current in packet rate) 每秒的入包个数
+3. OutPPS (current out packet rate) 每秒的出包个数
+4. InBPS (current in byte rate) 每秒入流量(字节)
+5. OutBPS (current out byte rate) 每秒出流量(字节)
+```
+
+#### 6.配置RS(ALL)
+
+配置好网站服务器,测试所有RS
+
+```shell
+[root@real-server1 ~]# yum install -y nginx
+[root@real-server1 ~]# echo "real-server1" >> /usr/share/nginx/html/index.html
+```
+
+在lo接口上绑定VIP
+
+```shell
+[root@real-server1 ~]# ip addr add dev lo 192.168.182.10/32
+```
+
+忽略arp广播,开启路由转发
+
+```shell
+[root@real-server1 ~]# echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore
+[root@real-server1 ~]# echo 1 > /proc/sys/net/ipv4/ip_forward
+或者
+[root@real-server1 ~]#cat /etc/sysctl.conf
+net.ipv4.ip_forward =1
+net.ipv4.conf.all.arp_ignore=1
+```
+
+匹配精确ip地址回包
+
+```shell
+[root@real-server1 ~]# echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce
+```
+
+启动Nginx
+
+```
+[root@real-server1 ~]# systemctl start nginx
+[root@real-server1 ~]# systemctl enable nginx
+```
+
+注意:
+
+```shell
+因为:realServer的vip有了,接着就是同一个网段中拥有两个vip, 客户端在网关发送arp广播需找vip时需要让realServer不接受响应.
+解决:
+echo 1 >/proc/sys/net/ipv4/conf/eth0/arp_ignore
+意味着当别人的arp请求过来的时候,如果接收的设备没有这个ip,就不做出响应(这个ip在lo上,lo不是接收设备的进口)
+echo 2 >/proc/sys/net/ipv4/conf/eth0/arp_announce
+使用最好的ip来回应,什么是最好的ip?同一个网段内子网掩码最长的
+```
+
+#### 7.测试访问vip
+
+```shell
+[root@client ~]# elinks -dump http://192.168.182.10
+```
+
+## 五:ipvsadm
+
+```shell
+1、LVS-server安装lvs管理软件
+yum -y install ipvsadm
+程序包:ipvsadm(LVS管理工具)
+主程序:/usr/sbin/ipvsadm
+规则保存工具:/usr/sbin/ipvsadm --save > /etc/sysconfig/ipvsadm
+配置文件:/etc/sysconfig/ipvsadm-config
+
+2、命令选项
+-A --add-service #在服务器列表中新添加一条新的虚拟服务器记录
+-t #表示为tcp服务
+-u #表示为udp服务
+-s --scheduler #使用的调度算法, rr | wrr | lc | wlc 默认调度算法是 wlc
+例:ipvsadm -A -t 192.168.1.2:80 -s wrr
+
+-a --add-server #在服务器表中添加一条新的真实主机记录
+-t --tcp-service #说明虚拟服务器提供tcp服务
+-u --udp-service #说明虚拟服务器提供udp服务
+-r --real-server #真实服务器地址
+-m --masquerading #指定LVS工作模式为NAT模式
+-w --weight #真实服务器的权值
+-g --gatewaying #指定LVS工作模式为直接路由器模式(也是LVS默认的模式)
+-i --ip #指定LVS的工作模式为隧道模式
+-p #会话保持时间,定义流量呗转到同一个realserver的会话存留时间
+例:ipvsadm -a -t 192.168.1.2:80 -r 192.168.2.10:80 -m -w 1
+
+-E -edit-service #编辑内核虚拟服务器表中的一条虚拟服务器记录。
+-D -delete-service #删除内核虚拟服务器表中的一条虚拟服务器记录。
+-C -clear #清除内核虚拟服务器表中的所有记录。
+-R -restore #恢复虚拟服务器规则
+-S -save #保存虚拟服务器规则到标准输出,输出为-R 选项可读的格式
+-d -delete-server #删除一条虚拟服务器记录中的某条真实服务器记录
+-L|-l –list #显示内核虚拟服务器表
+
+--numeric, -n:#以数字形式输出地址和端口号
+
+--stats: #统计信息
+--rate : #输出速率信息
+
+-Z –zero #虚拟服务表计数器清零(清空当前的连接数量等)
+```
+
+## 六:LVS算法
+
+#### 1.静态算法
+
+只根据算法进行调度 而不考虑后端服务器的实际连接情况和负载情况
+
+RR:轮叫调度(Round Robin)
+
+ 调度器通过”轮叫”调度算法将外部请求按顺序轮流分配到集群中的真实服务器上,它均等地对待每一台服务器,而不管服务器上实际的连接数和系统负载。
+
+```shell
+ipvsadm -A -t 192.168.122.10:80 -s rr
+ipvsadm -a -t 192.168.122.10 -r 192.168.122.100 -g
+```
+
+WRR:加权轮叫(Weight RR)
+
+ 调度器通过“加权轮叫”调度算法根据真实服务器的不同处理能力来调度访问请求。这样可以保证处理能力强的服务器处理更多的访问流量。调度器可以自动问询真实服务器的负载情况,并动态地调整其权值。
+
+```shell
+ipvsadm -A -t 192.168.122.10:80 -s wrr
+ipvsadm -a -t 192.168.122.10 -r 192.168.122.100 -g -w 2
+```
+
+#### 2.动态算法
+
+前端的调度器会根据后端真实服务器的实际连接情况来分配请求
+
+LC:最少链接(Least Connections)
+
+ 调度器通过”最少连接”调度算法动态地将网络请求调度到已建立的链接数最少的服务器上。如果集群系统的真实服务器具有相近的系统性能,采用”最小连接”调度算法可以较好地均衡负载。
+
+```shell
+ipvsadm -A -t 192.168.122.10:80 -s lc
+```
+
+WLC:加权最少连接(默认采用的就是这种)(Weighted Least Connections)
+
+ 在集群系统中的服务器性能差异较大的情况下,调度器采用“加权最少链接”调度算法优化负载均衡性能,具有较高权值的服务器将承受较大比例的活动连接负载。调度器可以自动问询真实服务器的负载情况,并动态地调整其权值。
+
+```shell
+ipvsadm -A -t 192.168.122.10:80 -s wlc
+```
+
+NQ:永不排队/最少队列调度(Never Queue Scheduling NQ)
+
+ 无需队列。如果有台 realserver的连接数=0就直接分配过去,不需要再进行sed运算,保证不会有一个主机很空闲。
+
+```shell
+ipvsadm -A -t 192.168.122.10:80 -s nq
+```
+
+## 七:思考题
+
+ lvs默认情况下没有健康检测,当有real-server服务挂掉后,lvs不能及时判断,就可能导致用户访问失败,那么如何通过脚本的方式进行健康检测呢?