如何搭建lvs集群中的负载均衡集群

集群的含义

集群由多台主机构成,但对外表现为一个整体,且只提供一个访问入口,也就是域名或者ip地址

集群发展背景

随着互联网的发展,站点对硬件性能,响应速度,服务稳定性和数据可靠性的要求越来越高,单独一台服务器已经支持不了业务,所以引进了集群的概念,使用多台相对廉价的普通服务器来构建成服务器集群

集群的分类

针对目标差异,可分为三种

  • 负载均衡集群
  • 高可用集群
  • 高性能集群

各个集群的作用

负载均衡集群

  • 提高应用系统的响应能力,来处理更多的访问请求,减少延迟,从而获得高并发,高负载的的整体性能
  • 高负载分配依赖于主节点的分流算法,将客户端的请求分成多份给各个节点,来缓解整个系统的负载

高可用集群

  • 提高应用系统的可靠性,尽可能减少连接中断时间,确保服务的连续性,从而达到高可用的容错
  • 高可用工作方式有双工和主从两种模式,双工是所有节点同时在线;主从是主节点在线,出现故障时,从节点会顶替主节点

高性能运算集群

  • 以提高应用系统的CPU运算速度、扩展硬件资源和分析能力为目标,获得相当于超级计算机的运算能力
  • 高性能依赖分布式运算,并行运算,通过专用软件硬件将多个服务器的cpu,内存等资源整合在一起,实现只有超级计算机才有的计算能力

负载均衡集群的架构

第一层,负载调度器

  • 访问整个群集系统的唯一入口,对外使用所有服务器共有的VIP地址,也就是集群ip地址,通常会使用两台调度器实现热备,当主失效时可以平滑的切换到备

第二层,服务器池

  • 集群提供的应用服务由服务器池承担,其中每个节点都有真实ip,只处理调度器分发过来的客户端请求。当某个节点失效,负载调度器会将其隔离,等待恢复正常后再加入服务器池

第三层,共享存储

  • 为服务器池中的节点提供文件存储服务

负载均衡集群的工作模式

NAT模式,地址转换

  • 负载调度器作为所有服务器节点的网关,既作为客户机的访问入口,又是各个节点的的出口
  • 服务器节点使用私有ip,与负载调度器在同一个物理网络,相对其他两种更为安全

TUN模式,ip隧道

  • 采用开放式的网络结构,负载调度器仅作为客户机的访问入口,各节点通过建立的tunnel通道直接回应客户机,不经过负载调度器

DR模式,直接路由

  • 采用半开放式的网络结构,与调度器位于同一个物理网络
  • 负载调度器与各节点服务器通过私网连接

lvs虚拟服务器

  • lvs相当于基于ip地址的虚拟化应用,为基于IP地址和内容请求分发的负载均衡提出的一种高效的解决方法
  • 现已成为linux内核的一部分,默认编译模块为ip_vs,必要时能够自动调用

lvs负载调度算法

  • 轮询(RR):将收到的访问请求按顺序分配给集群中的各个节点,而不管服务器实际的连接数和系统的负载
  • 加权轮询(WRR):根据调度器设置的权重值来分发请求,权重值高的节点优先获得任务,保证性能强的服务器承担更多的访问流量
  • 最少连接(LC):将收到的访问请求优先分配给连接数最少的节点
  • 加权最小连接:在服务器节点的性能差异较大时,可以为真实服务器自动调整权重,性能较高的节点将承担更大比例的活动连接负载

lvs管理工具ipvsadm

各个参数的作用

  • - A 添加虚拟服务器
  • - D 删除整个虚拟服务器
  • - s 指定负载调度算法 (轮询:rr、加权轮询: wrr、最少连接: lc、加权最少连接: wlc )
  • - a 表示添加真实服务器 (节点服务器)
  • - d 删除真实服务器
  • - t 指定 虚拟ip地址及 TCP端口
  • - r 指定 真实ip地址及 TCP端口
  • - m 表示使用 NAT群集模式.
  • - g 表示使用 DR模式
  • - i 表示使用 TUN模式
  • - w 设置权重 (权重为 0 时表示暂停节点)
  • - p 60 表示保持长连接60秒
  • - l 列表查看 LVS 虚拟服务器 (默认为查看所有)
  • - n 以数字形式显示地址、端口等信息,常与 “-l” 选项组合使用。ipvsadm -ln

lvs负载均衡集群的NAT模式部署

  • 实验环境
    LVS负载调度器:ens33:12.0.0.8/8 ens37:192.168.1.100/24(vmnet1)
    Web 节点服务器1:192.168.1.2/24
    Web 节点服务器2:192.168.1.3/24
    NFS服务器:192.168.1.5/24
    客户端(win10):12.0.0.15/8 (Vmnet1)

先部署nfs共享存储服务器

  • 安装nfs和rpc
[root@nfs ~]# yum install -y nfs-utils rpcbind
  • 然后设置开机自启
systemctl start nfs.service 
systemctl start rpcbind.service
systemctl enable nfs.service 
systemctl enable rpcbind.service
  • 然后创建两个共享的目录并赋权
[root@nfs ~]# mkdir /opt/jd
[root@nfs ~]# mkdir /opt/taobao
[root@nfs ~]# chmod 777 /opt/jd/ /opt/taobao/

  • 然后写挂载配置
vim /etc/exports
/opt/jd 12.0.0.0/8(rw,sync,no_root_squash)
/opt/taobao 12.0.0.0/8(rw,sync,no_root_squash)

  • 然后发布共享
[root@nfs ~]# exportfs -rv
exporting 12.0.0.0/8:/opt/taobao
exporting 12.0.0.0/8:/opt/jd

  • 在web端查看共享的目录
[root@node1 ~]# showmount -e 12.0.0.10
Export list for 12.0.0.10:
/opt/taobao 12.0.0.0/8
/opt/jd     12.0.0.0/8
[root@node2 ~]# showmount -e 12.0.0.10
Export list for 12.0.0.10:
/opt/taobao 12.0.0.0/8
/opt/jd     12.0.0.0/8

配置web端

  • 先安装httpd服务
yum install -y httpd
  • 再安装nfs和rpc共享
yum install -y nfs-utils rpcbind
  • 查看共享并写一个主页
[root@node1 ~]# showmount -e 192.168.1.5
Export list for 192.168.1.5:
/opt/taobao 192.168.1.0/24
/opt/jd     192.168.1.0/24
[root@node1 ~]# mount -t nfs 192.168.1.5:/opt/jd /var/www/html/
[root@node1 ~]# echo  'this is jd' > /var/www/html/index.html
[root@node2 ~]# showmount -e 192.168.1.5
Export list for 192.168.1.5:
/opt/taobao 192.168.1.0/24
/opt/jd     192.168.1.0/24
[root@node2 ~]# mount.nfs 192.168.1.5:/opt/taobao /var/www/html/
[root@node2 ~]# echo 'this is taobao' > /var/www/html/index.html


配置负载均衡调度器

  • 配置SNAT转发规则
vim /etc/sysctl.conf
net.ipv4.ip_forward=1	//启用路由转发
[root@lvs ~]# sysctl -p	//加载参数
net.ipv4.ip_forward = 1

  • 先清除所有的防火墙规则
[root@lvs ~]# iptables -t nat -F		//-F清除nat表
[root@lvs ~]# iptables -t nat -L		//-L查看nat表
Chain PREROUTING (policy ACCEPT)
target     prot opt source               destination         

Chain INPUT (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         

  • 添加一条防火墙规则
iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -o ens33 -j SNAT --to-source 12.0.0.8
POSTROUTING: 在进行路由判断之"后"所要进行的规则(SNAT/MASQUERADE)
PREROUTING: 在进行路由判断之"前"所要进行的规则(DNAT/REDIRECT)
-A: 在规则链的末尾加入新规则
-s:匹配来源地址IP/MASK.
-o 网卡名称匹配从这块网卡流出的数据
-i 网卡名称匹配从这块网卡流入的数据
-j 控制类型
  • 加载内核模块
[root@lvs ~]# modprobe ip_vs		//手动加载内核模块
[root@lvs ~]# cat /proc/net/ip_vs	//查看ip_vs版本信息
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
  -> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP  0C000008:0050 rr  
  -> C0A80103:0050      Masq    1      0          0         
  -> C0A80102:0050      Masq    1      0          0         

  • 安装ipvsadm管理工具
yum install -y ipvsadm
  • 启动管理工具
ipvsadm-save > /etc/sysconfig/ipvsadm	//启动服务前必须保存负载分配策略,否则报错
systemctl start ipvsadm.service
  • 配置负载分担策略
[root@lvs ~]# vim we.sh 
ipvsadm -C
ipvsadm -A -t 12.0.0.8:80 -s rr
ipvsadm -a -t 12.0.0.8:80 -r 192.168.1.2:80 -m -w 1
ipvsadm -a -t 12.0.0.8:80 -r 192.168.1.3:80 -m -w 1
//-A	添加虚拟服务器
//-s	指定负载调度算法 (轮询:rr、加权轮询: wrr、最少连接: lc、加权最少连接: wlc )
//-a	表示添加真实服务器 (后端节点服务器)
//-t	指定 VIP地址及 TCP端口
//-m	表示使用 NAT群集模式.
//-w	设置权重 (权重为 0 时表示暂停节点)
  • 然后启动策略
[root@lvs ~]# ./we.sh 
[root@lvs ~]# ipvsadm -ln			//查看节点状态,Masq代表NAT模式
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
TCP  12.0.0.8:80 rr
  -> 192.168.1.2:80               Masq    1      0          0         
  -> 192.168.1.3:80               Masq    1      0          0    [root@lvs ~]# ipvsadm-save > /etc/sysconfig/ipvsadm   	//保存策略
  • 删除集群中某一节点服务器
[root@lvs ~]# ipvsadm -d -t 12.0.0.8:80 -r 192.168.1.2:80
[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  12.0.0.8:80 rr
  -> 192.168.1.3:80               Masq    1      0          0      
  • 删除整个虚拟服务器
[root@lvs ~]# ipvsadm -D -t 12.0.0.8:80
[root@lvs ~]# ipvsadm -ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn

  • 恢复lvs策略
[root@lvs ~]# systemctl stop ipvsadm
[root@lvs ~]# systemctl start ipvsadm.service 
[root@lvs ~]# ipvsadm-restore > /etc/sysconfig/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
TCP  12.0.0.8:80 rr
  -> 192.168.1.2:80               Masq    1      0          0         
  -> 192.168.1.3:80               Masq    1      0          0       
  • 测试用win10访问网页
    在这里插入图片描述
    在这里插入图片描述

lvs负载均衡集群中的DR模式及keepalived

lvs-DR的数据包流量分析

  • 客户端向目标的虚拟地址(vip)发送请求,负载均衡器接收
  • 负载均衡器根据负载均衡算法来选择只是服务器(realserver),不修改和解封装报文,但修改mac地址,将数据帧的MAC地址改为后端真实服务器的MAC地址,然后在局域网内发送
  • 真实服务器收到后,解封装发现目标vip与本机匹配,就接收这个报文
  • 然后重新封装报文,将报文通过lo口传到物理网卡接口然后向外发出,回到客户端,如果跨网段就通过路由器返回给用户

lvs-DR中的arp存在的问题

  • 在lvs-DR的负载均衡集群中,负载均衡器和节点服务器都要配置相同的vip
  • 当ARP广播发送到LVS-DR集群时,因为两者处于同一个网络中,它们都会接收到ARP广播,要做到节点服务器不响应arp请求,只有负载均衡器响应
  • 节点服务器使用lo口,承载VIP地址设置内核参数 arp_ignore=1,系统只响应目的IP为本地 IP 的ARP请求,不响应外来的arp
  • 真实服务器返回报文经过路由器转发,需要先获得路由器的mac地址
  • 发送ARP请求时,Linux默认使用IP包的源IP地址作为ARP请求包中的源IP地址,而不使用物理接口的ip地址
  • 路由器收到ARP请求后,将更新ARP表项
  • 会将原有的arp记录更新掉,导致直接略过负载均衡器
  • 解决方法:对节点服务器进行处理,设置内核参数arp_announce=2:系统不使用IP包的源地址来设置ARP请求的源地址,而选择发送接口的IP地址

keepalived

  • 支持故障自动切换
  • 支持节点健康状态检查
  • 判断LVS负载调度器、节点服务器的可用性,当主出现故障时可以平滑的切到备上保证业务不中断,当主恢复后可以重新加入集群变为主
  • keepalive采用vrrp热备协议实现linux的多机热备
  • 每个热备组内同时只有一台主路由器提供服务,其他路由器处于冗余状态
  • 当主挂掉之后。其他路由器会根据优先级来自动接替主的位置

lvs-DR-keepalived部署

  • 实验环境
    主负载调度器(Director1) ens33:12.0.0.8/8 ipvsadm、keepalived(热备)
    备负载调度器(Director2) ens33:12.0.0.10/8 ipvsadm、keepalived
    web服务器1 ens33 12.0.0.7
    lo:0 (VIP): 12.0.0.101 httpd
    web服务器2 ens33 12.0.0.13
    lo:0 (VIP): 12.0.0.101 httpd

  • 在lvs负载均衡器上配置

yum -y install ipvsadm keepalived
modprobe ip_vs     #加载ip_vs模块
cat /proc/net/ip_vs  #查看ip_vs版本信息
[root@lvs1 network-scripts]# cat /proc/net/ip_vs
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
  -> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP  0C000065:0050 rr  
  -> 0C00000D:0050      Route   1      0          0         
  -> 0C000007:0050      Route   1      0          0  
  • 然后写虚拟ip,并开启
[root@lvs1 network-scripts]# pwd
/etc/sysconfig/network-scripts
[root@lvs1 network-scripts]# vim ifcfg-ens33:0
[root@lvs1 network-scripts]# pwd
/etc/sysconfig/network-scripts
[root@lvs1 network-scripts]# vim ifcfg-ens33:0
ifup ens33:0
ifconfig ens33:0
[root@lvs1 network-scripts]# ifconfig ens33:0
ens33:0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 12.0.0.101  netmask 255.255.255.255  broadcast 12.0.0.101
        ether 00:0c:29:e5:4b:ad  txqueuelen 1000  (Ethernet)

  • 由于LVS负载均衡器和各节点需要共用vip地址,应该关闭linux内核的重定向响应参数,不充当路由器
vim /etc/sysctl.conf
net.ipv4.ip_forward = 0
net.ipv4.conf.all.send_redirects = 0
net.ipv4.conf.default.send_redirects = 0
net.ipv4.conf.ens33.send_redirects = 0
[root@lvs1 network-scripts]# sysctl -p		//加载模块
net.ipv4.ip_forward = 0
net.ipv4.conf.all.send_redirects = 0
net.ipv4.conf.default.send_redirects = 0
net.ipv4.conf.ens33.send_redirects = 0

  • 开启ipvsadm
modprobe ip_vs
[root@lvs1 network-scripts]# cat /proc/net/ip_vs
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
  -> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP  0C000065:0050 rr  
  -> 0C00000D:0050      Route   1      0          0         
  -> 0C000007:0050      Route   1      0          0    
  • 开启ipvsadm并保存策略
[root@lvs1 network-scripts]# ipvsadm-save > /etc/sysconfig/ipvsadm
[root@lvs1 network-scripts]# systemctl start ipvsadm

  • 然后写一个ipvsadm脚本,并执行策略
[root@lvs1 network-scripts]# vim we.sh
#!/bin/bash
ipvsadm -C
ipvsadm -A -t 12.0.0.101:80 -s rr
ipvsadm -a -t 12.0.0.101:80 -r 12.0.0.7:80 -g
ipvsadm -a -t 12.0.0.101:80 -r 12.0.0.13:80 -g

web服务器上配置

  • 配置虚拟ip,并启用
root@web2 network-scripts]# vim ifcfg-lo:0
DEVICE=lo:0
ONBOOT=yes
IPADDR=12.0.0.101
NETMASK=255.255.255.255
ifup lo:0
ifconfig lo:0
[root@web2 network-scripts]# ifup lo:0
[root@web2 network-scripts]# ifconfig lo:0
lo:0: flags=73<UP,LOOPBACK,RUNNING>  mtu 65536
        inet 12.0.0.101  netmask 255.255.255.255
        loop  txqueuelen 1000  (Local Loopback)

  • 写一条路由禁锢
[root@web2 network-scripts]# route add -host 12.0.0.101 dev lo:0
[root@web2 network-scripts]# route -n
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
0.0.0.0         12.0.0.2        0.0.0.0         UG    100    0        0 ens33
12.0.0.0        0.0.0.0         255.0.0.0       U     100    0        0 ens33
12.0.0.101      0.0.0.0         255.255.255.255 UH    0      0        0 lo
192.168.122.0   0.0.0.0         255.255.255.0   U     0      0        0 virbr0

  • 设置永久生效
[root@web2 network-scripts]# vim /etc/rc.local
/sbin/route add -host 12.0.0.101 dev lo:0

  • 安装httpd协议
yum -y install httpd
  • 调整内核的ARP响应参数以阻止更新VIP的MAC地址,避免冲突,并加载
vim /etc/sysctl.conf

net.ipv4.conf.lo.arp_ignore = 1  
net.ipv4.conf.lo.arp_announce = 2
net.ipv4.conf.all.arp_ignore = 1
net.ipv4.conf.all.arp_announce = 2
[root@web2 network-scripts]# sysctl -p
net.ipv4.conf.lo.arp_ignore = 1
net.ipv4.conf.lo.arp_announce = 2
net.ipv4.conf.all.arp_ignore = 1
net.ipv4.conf.all.arp_announce = 2

  • 设置页面
vim /var/www/html/index.html
<html>
<body>
<meta http-equiv="Content-Type" content="text/html;charset=utf-8">
<h1>this is taobao web</h1>
</body>
</html>
vim /var/www/html/index.html
<html>
<body>
<meta http-equiv="Content-Type" content="text/html;charset=utf-8">
<h1>this is jd web</h1>
</body>
</html>
  • 在两个lvs上部署keepalived
cd /etc/keepalived/
cp keepalived.conf keepalived.conf.bak
vim keepalived.conf
global_defs {             #定义全局参数
      router_id lvs01		#热备组内的设备名称不能一致
}
vrrp_instance vi_1 {       #定义VRRP热备实例参数
      state MASTER         #指定热备状态,主为master,备为backup
      interface ens33      #指定承载vip地址的物理接口
      virtual_router_id 51 #指定虚拟路由器的ID号,每个热备组保持一致
      priority 110		   #指定优先级,数值越大越优先
      advert_int 1
      authentication {
           auth_type PASS
           auth_pass 6666
 }
virtual_ipaddress {        #指定集群VIP地址
      12.0.0.101
}
}
#指定虚拟服务器地址vip,端口,定义虚拟服务器和web服务器池参数
virtual_server 12.0.0.101 80 { 
      lb_algo rr                #指定调度算法,轮询(rr)
      lb_kind DR				#指定集群工作模式,直接路由DR
      persistence_timeout 6		#健康检查的间隔时间
      protocol TCP				#应用服务采用的是TCP协议
#指定第一个web节点的地址,端口
real_server 12.0.0.7 80 {
      weight 1					#节点权重
      TCP_CHECK {
          connect_port 80		#添加检查的目标端口
          connect_timeout 3		#添加连接超时
          nb_get_retry 3		#添加重试次数
          delay_before_retry 3	#添加重试间隔
   }
}
#指定第二个web节点的地址,端口
real_server 12.0.0.13 80 {
      weight 1
      TCP_CHECK {
          connect_port 80
          connect_timeout 3
          nb_get_retry 3
          delay_before_retry 3
   }
}
}
  • 然后访问页面
    在这里插入图片描述
  • 当关闭主lvs时,查看备的ip
[root@lvs1 network-scripts]# systemctl stop keepalived.service 
[root@lvs2 keepalived]# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    link/ether 00:0c:29:50:4b:be brd ff:ff:ff:ff:ff:ff
    inet 12.0.0.10/8 brd 12.255.255.255 scope global noprefixroute ens33
       valid_lft forever preferred_lft forever
    inet 12.0.0.101/32 scope global ens33
       valid_lft forever preferred_lft forever
    inet6 fe80::20c:29ff:fe50:4bbe/64 scope link 
       valid_lft forever preferred_lft forever

  • 发现vip漂移到备上
  • 开启主之后又会漂移回主

小结

负载均衡集群三种模式对比
工作模式区别					NAT模式			TUN模式			DR模式(与nat相比较为复杂)	
server number 节点数量		low10-20		high 100		high 100
真实网关(real servers)		负载调度器		自由路由器		自由路由器
IP地址						公网+私网		公网				私网
优点							安全性高			安全、速度快		性能最好
缺点					  		效率低、压力大	需要隧道支持		不能跨越vlan
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值