lvs(linux virtual serverlinux虚拟机)可以帮助集群实现负载均衡。lvs由ipvsadm与ipvs两部分组成,ipvsadm是命令行管理工具,ipvs是内核模块,目前已经是netfilter的一部分。
当用户通过VIP和端口访问集群时,用户的请求报文会发往调度器。请求报文会先经过PREROUTING链,然后进行路由判断。由于此刻报文的目标IP为VIP,而VIP对于调度器来说就是本身的ip,所以报文会经过INPUT链,如果ipvs发现报文访问的VIP和端口与我们定义的LVS集群规则相符,ipvs则会根据定义好的规则与算法将报文直接发往POSTROUTING链,最后到达后端的RealServer中。
一、IP负载均衡技术
1.1 网络地址转换
网络地址转换实现虚拟服务器的VS/NAT技术(Virtural Server Via Network Address Translation)
注:
- 请求经过direct server会进行dst ip更改,但是不更改cip
- rip无法路由到磁盘,所以响应经过direct server(gateway),direct server会进行src ip更改
1.2 直接路由
直接路由的VS/DR技术(Virtual Server Via Direct Routing)
注:
- 请求经过direct server不需要更改dst ip
- 响应不需要经过direct server直接返给客户端,direct server只维护一个半连接
1.3 IP隧道
IP隧道实现虚拟服务器的VS/TUN技术(Virtual Server Via IP Tunneling)
注:
- 请求经过direct server会在原来请求的基础上进行ip封装
- 响应不经过direct server,也不需要更改ip,直接返给客户端
二、三种负载技术对比
三种IP负载均衡技术的优缺点如下表:
VS/NAT | VS/DR | VS/TUN | |
server | any | non-arp device | tunneling |
server network | private | LAN | LAN/WAN |
server number | low(10~20) | high(100) | high(100) |
server gateway | load balancer | own router | own router |
- VS/NAT
- 优点:可运行在所有支持tcp/ip的系统,只需要一个IP(公网)配置在调度器,服务器可以使用私有地址。
- 缺点:伸缩能力有限,节点数超过20,调度器本身就成为系统的瓶颈
- VS/DR
- 优点:调度器可处理大量请求,调度器只处理客户的请求,响应数据可以直接从独立的网络路由返回给客户
- 缺点:调度器和实际服务器都有一块网卡连在统一物理网段上,服务器不作ARP响应
- VS/TUN
- 优点:与VS/DR优点的基础上,实际服务器不需要在同一个物理网段上面(经过IP封装可以到达任务服务器)
- 缺点:所有服务器必须支持“IP Tunneling”或者“IP Encapsulation”协议
三、命令
# 创建集群
ipvsadm -A -t VIP:port -s rr #-A创建集群 -t表示tcp服务 -s采用Round-Robin算法
ipvsadm -a -t VIP:port -r RIP1:port -m #-a添加一个realsever -r表示realserver地址 -m表示NAT模式,默认是dr模式
ipvsadm -a -t VIP:port -r RIP2:port -m
service ipvsadm save #centos6中保存规则,默认保存到/etc/sysconfig/ipvsadm
ipvsadm -S > /etc/sysconfig/ipvsadm #保存规则
ipvsadm -R < /etc/sysconfig/ipvsadm #载入规则
# 配置转发
echo 1 > /proc/sys/net/ipv4/ip_forward #调度机上要配置转发开关(临时方法)
sysctl -w net.ipv4.ip_forward=1 #调度机上要配置转发开关(临时方法)
vi /etc/sysctl.conf #调度机上要配置转发开关(永久方法)
net.ipv4.ip_forward = 1
sysctl -p #修改配置立刻生效
注:NAT模式修改IP地址,所以创建集群的时候可以 VIP:port和RIP1:port可以不一致;但是DR模式下DS只修改MAC地址不修改IP,所以 VIP:port和RIP1:port必须一致。
四、实例
4.1 nat实例
通过vmare创建四台虚拟机,宿主机作为客户端,调度器配置双网卡(一个是nat模式,具有外网的功能;一个是仅主机模式,作为局域网),129~131三台机器作为realserver,网卡配置为仅主机,Gateway是调度器的ip(192.168.16.128)。nat模式下内部只修改目标IP,realserver响应时无法找到cip,所以把请求发给gateway,调度器才会返给客户端。
客户端请求192.168.108.240:80,在240上获取tcp报文。报文里面没有体现调度器的地址(240),ipvs直接修改地址而不是重新创建tcp连接。
这个realserver的地址,可以发现cip一直没有修改
从客户端看host,一直都是192.168.108.240,说明调度器修改了源地址。
4.2 dr实例
注:vip除了通过keepalived方式产生,单机需要通过添加网卡的方式
# ds上配置
ifconfig ens33:0 192.168.108.243 #添加vip
# 创建集群,命令参考前文
# rs上配置
echo "1" > /proc/sys/net/ipv4/conf/lo/arp_ignore
echo "1" > /proc/sys/net/ipv4/conf/all/arp_ignore #忽略VIP的arp广播请求
echo "2" > /proc/sys/net/ipv4/conf/lo/arp_announce
echo "2" > /proc/sys/net/ipv4/conf/all/arp_announce
ifconfig lo:0 192.168.108.243 broadcast 192.168.108.243 netmask 255.255.255.255 # 添加IP地址为VIP的虚拟网卡lo:0
route add -host 192.168.108.243 dev lo:0
ds上的截图。
rs上的截图,可以发现没有体现rip,响应直接返给客户端。
五、小技巧
vmware新添加的网卡,在network-scripts下面无法找到配置文件。可以在虚拟机启动之前先添加网卡,进入系统后通过命令创建网卡
nmcli con add con-name ens38 type ethernet ifname ens38 #创建网卡(network manager client)
nmcli con show #查看网卡
vi ifcfg-ens38 #配置网卡信息
IPADDR=192.168.16.130
GATEWAY=192.168.16.128
ifconfig ens33 down/up #关闭/开启指定网卡
systemctl network restart #重启网络服务