一.负载均衡LVS基本介绍
LB 集群的架构和原理很简单,就是当用户的请求过来时,会直接分发到Director Server上(调度器),然后它把用户的请求根据设置好的调度算法,智能均衡地分发到后端真正服务器(real server)上。为了避免不同机器上用户请求得到的数据不一样,需要用到了共享存储,这样保证所有用户请求的数据是一样的。
LVS 由2部分程序组成,包括 ipvs 和 ipvsadm。
1.ipvs(ip virtual server):一段代码工作在内核空间,叫ipvs,是真正生效实现调度的代码。
2. ipvsadm:另外一段是工作在用户空间,叫ipvsadm,负责为ipvs内核框架编写规则,定义谁是集群服务,而谁是后端真实的服务器(Real Server)
LVS访问过程:
client(源ip为CIP,目的ip为VIP)--PREROUTING(目的地址转换,要把别人的公网IP换成你们内部的IP,才让访问到你们内部受防火墙保护的机器。请确认ip)--input--ipvs(将源MAC地址转换成目的MAC地址)--POSTROUTING--RS(判断访问的是否是是RS的MAC地址)--eth0(虚拟的)--client(源ip为VIP,目的ip为CIP)
LVS的10种调度算法:
(1)静态调度
①rr(Round Robin):轮询调度,轮叫调度
②wrr:weight,加权(以权重之间的比例实现在各主机之间进行调度)
③sh:source hashing,源地址散列。主要实现会话绑定,能够将此前建立的session信息保留了
④Dh:Destination hashing:目标地址散列。把同一个IP地址的请求,发送给同一个server。
(2)动态调度
①lc(Least-Connection):最少连接
②wlc(Weighted Least-Connection Scheduling):加权最少连接。
③sed(Shortest Expected Delay):最短期望延迟
④nq(never queue):永不排队(改进的sed)
⑤LBLC(Locality-Based Least Connection):基于局部性的最少连接
⑥LBLCR(Locality-Based Least Connections withReplication):带复制的基于局部性最少链接
二.LVS搭建
LVS和Real-server必须在相同的网段:(相同的广播域内)
工作过程:
当一个client发送一个WEB请求到VIP(虚拟地址),LVS服务器根据VIP选择对应的real-server的Pool,根据算法,在Pool中选择一台Real-server,LVS在hash表中记录该次连接,然后将client的请求包发给选择的Real-server,最后选择的Real-server把应答包直接传给client;当client继续发包过来时,LVS根据更才记录的hash表的信息,将属于此次连接的请求直接发到刚才选择的Real-server上;当连接中止或者超时,hash表中的记录将被删除。
环境:kvm1,作为VS
kvm2 kvm3 作为rs
1.DR模式
将请求报文的目标MAC地址设定为挑选出的RS的MAC地址
1.VS下载LVS管理工具:ipvsadm
下载之前需要配置yum元
2.配置ipvsadm策略
(1)查看策略
[root@server1 yum.repos.d]# ipvsadm -l ##没有策略
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
[root@server1 yum.repos.d]#
(2)配置策略 (采用轮询算法rr)
-A -t 添加策略
[root@server1 ~]# ipvsadm -A -t 172.25.18.100:80 -s rr
[root@server1 ~]# ipvsadm -l
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 172.25.18.100:http rr
3.添加访问rs
[root@server1 ~]# ipvsadm -a -t 172.25.18.100:80 -r 172.25.18.2:80 -g ##-g(DR模式)
[root@server1 ~]# ipvsadm -a -t 172.25.18.100:80 -r 172.25.18.3:80 -g
[root@server1 ~]# ipvsadm -l
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 172.25.18.100:http rr
-> server2:http Route 1 0 0
-> server3:http Route 1 0 0
[root@server1 ~]# /etc/init.d/ipvsadm save
ipvsadm: Saving IPVS table to /etc/sysconfig/ipvsadm: [ OK ]
4.添加虚拟ip:172.25.18.100/24
[root@server1 ~]# ip addr add 172.25.18.100/24 dev eth0
[root@server1 ~]# ip addr show
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 16436 qdisc noqueue state UNKNOWN
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
link/ether 52:54:00:a8:55:e5 brd ff:ff:ff:ff:ff:ff
inet 172.25.18.1/24 brd 172.25.18.255 scope global eth0
inet 172.25.18.100/24 scope global secondary eth0
inet6 fe80::5054:ff:fea8:55e5/64 scope link
valid_lft forever preferred_lft forever
[root@server1 ~]#
5.给rs添加内部虚拟访问ip
[root@server2 ~]# ip addr add 172.25.18.100/32 dev eth0
[root@server2 ~]# ip addr show
1: lo: <LOOPBACK,UP,