LVS(Linux virtual server)

它是一个负载均衡、高可用性集群,主要针对大业务量的网络应用(比如新闻。电子商务、网上银行…)

LVS是建立在一个主控服务器(双机)及若干个真实服务器组成。真实服务器负责提供服务,主控服务器会根据指定的调度算法对真实的服务器进行控制。LVS集群结构对用户来说是透明的,客户端只与单个IP(虚拟IP)进行通信。客户端向lvs发出服务请求,主控服务器会通过特定的算法来指定某个真实服务器来应答,而客户端只与负载均衡的IP进行通信

lvs keepalived 安装 lvs 配置_lvs keepalived 安装

                           lvs结构图

lvs keepalived 安装 lvs 配置_lvs keepalived 安装_02

LVS 常见算法:

轮询调度RR:

  将外部请求按照顺序轮流分配到真实的服务器上

加权轮询WRR:

  根据真实服务器的不同处理能力来调度访问请求

最少链接数LC:

  调度器通过最少连接调度算法动态的将网络请求调度到以建立的连接数最少的服务器上

(两台服务器配置差不多时使用)

加权最少连接WLC:

  优化负载的性能,较高权重的服务器将承受较大比例的活动连接负载

  (两台服务器 有一台比较弱时 可以使用)

基于局部性的最少连接 LBLC:

  针对目标的IP地址的负载均衡,应用于cache集群上。会根据请求的目标IP地址找出该目标IP地址最近使用的服务器,如果该服务器是可用的没有超载,则将请求发送到服务器上,若服务器不存在,或服务器处于一半的工作负载,则用最少连接数选出一个服务器

带复制的基于局部性的最少连接(locality-Based Least Connections with Replication)

也是针对目标IP地址的负载均衡,用于cache集群。它与LBLC算法不同之处是它要维护的是从一个目标IP地址到一组服务器的映射,而LBLC算法维护的是从一个目标IP地址到一台服务器的映射。

目标地址散列(Destination IP Hashing)
    目标地址散列调度算法根据请求的目标IP地址,作为散列键(Hash KEY)从静态分配的散列表中找出对应的服务器,若服务器是可用的且未超载,则请求发送到该服务器,否则返回空。

源地址散列

  根据请求的源IP地址,作为散列键从静态分配的散列表中找出对应的服务器,若服务器是可用的且未超载,则请求发送到该服务器,否则返回空。

源IP端口散列  

   通过hash函数将来自用一个源IP地址和源端口号的请求映射到后端同一台服务器上。

   (适合按服务的类型分类)

随机

  随机地将请求分发到不同的服务器上

  典型的负载均衡集群中,包括三层次的组件,前端至少一个负载均衡调度器(LB)负责相应并发来自客户端的访问请求;后端有大量真实服务器构成服务池(server pool)提供实际的应用服务

透明性 一致性和伸缩性

第一层:

负载调度器,这是访问整个集群系统唯一入口,对外使用所有服务器共有VIP,也称为集群IP,通常会配置主备两台调度器实现热备份。

第二层:

   服务器池,集群符提供的应用服务,由服务器池承担。每个节点具有独立的真实IP,只处理调度器分发过来的客户机请求。当某个节点失效时,负载调度器的容错机制会将它隔离,等排出错误后,在从新纳入服务器池

第三层:

  共享存储,为服务池中的所有节点提供稳定的,一致的文件存取服务,保证整个集群的统一性

工作模式: 调度技术可以基于IP、端口、内容进行分发。基于IP的效率最高。常见的有三种,地址转换、IP隧道和直接路由。

  地址转换:

简称NAT模式,类似于防火墙的私有网络结构,负载调度器作为所有服务器节点的网关,及作为客户机的访问入口,也是各个节点回应客户机的访问出口。服务器节点使用的是私有IP地址

lvs keepalived 安装 lvs 配置_IP_03

                             nat模式

lvs keepalived 安装 lvs 配置_lvs keepalived 安装_04

IP隧道:

简称TUN模式,采用开放式的网络结构,负载调度器仅作为客户机的访问入口,各节点通过各自的Internet连接直接回应客户机,而不再经过负载调度器。服务器节点分散在不同的位置,具有独立的公网IP地址,通过专用IP隧道与负载调度器相互通信。

lvs keepalived 安装 lvs 配置_运维_05

                              ip隧道模式

直接路由:

简称DR模式,采用半开放式网络结构,与TUN模式的结构类似,但是节点并不是分散的,而是与调度器位于同一物理网络。通过本地网络连接,不需要建立专用IP隧道。

lvs keepalived 安装 lvs 配置_lvs keepalived 安装_06

                             dr模式

lvs keepalived 安装 lvs 配置_运维_07

LVS集群的管理工作主要包括创建虚拟服务器、添加服务器节点、查看集群节点状态、删除服务器节点和保存负载分配策略

lvs:
NAT:    特点:相当于client和server的网关
client: 192.168.10.10     gw 192.168.10.1
lvs(两张网卡):ip1  192.168.10.1  =client gw   
 ip2  192.168.2.1=web的网关   网关     只有两个ip
web1    192.168.2.60     gw 192.168.2.1
web2    192.168.2.70    gw  192.168.2.1
web1
[root@localhost ~]# yum -y install httpd
[root@localhost ~]# echo 1111 > /var/www/html/index.html
[root@localhost ~]# systemctl restart httpd
[root@localhost ~]# curl 192.168.2.60
1111
web2
[root@localhost ~]# yum -y install httpd
[root@localhost ~]# echo 2222 > /var/www/html/index.html
[root@localhost ~]# systemctl restart httpd
[root@localhost ~]# curl 192.168.2.70
2222
lvs
[root@localhost ~]# vim /etc/sysctl.conf
net.ipv4.ip_forward = 1
[root@localhost ~]# sysctl -p
net.ipv4.ip_forward = 1
[root@localhost ~]# modprobe ip_vs  #加载lvs的模块
[root@localhost ~]# yum -y install ipvsadm   #lvs的管理工具
[root@localhost ~]# ipvsadm -A -t 192.168.10.1:80 -s rr   
-A   添加一个新的集群
 -t 192.168.10.1:80    使用tcp协议  后面加指定的ip   ip使用的是和客户端同网段的ip
-s rr   调度算法    rr轮询7
[root@localhost ~]# ipvsadm -a -t 192.168.10.1:80 -r 192.168.2.60 -m -w 1
-a  添加真实的节点    -t 192.168.10.1:80   给集群中添加
-r   真实节点的ip    192.168.2.60  web主机的ip
-m    使用nat模式    -g  使用dr模式   -i  ip隧道模式    -w 权重
[root@localhost ~]# ipvsadm -a -t 192.168.10.1:80 -r 192.168.2.70 -m -w 1
[root@localhost ~]# ipvsadm -S
[root@localhost ~]# 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.10.1:80 rr
  -> 192.168.2.60:80              Masq    1      0          0         
  -> 192.168.2.70:80              Masq    1      0   
client:
访问lvs
[root@localhost ~]# curl 192.168.10.1
2222
[root@localhost ~]# curl 192.168.10.1
1111
删除:
删除真实节点
[root@localhost ~]# ipvsadm -d -t 192.168.10.1:80 -r 192.168.2.60
删除集群      
[root@localhost ~]# ipvsadm -D -t 192.168.10.1:80
DR模式  特点:需要让lvs后端真实节点处于同一个物理网络内
客户端   
client      192.168.2.10
lvs          192.168.2.20     2.1--2.20 虚拟ip   192.168.2.100
web1     192.168.2.60                     虚拟ip   192.168.2.100
web2     192.168.2.70                     虚拟ip   192.168.2.100
lvs配置虚拟ip
[root@localhost ~]# cd /etc/sysconfig/network-scripts/
[root@localhost network-scripts]# cp ifcfg-ens37 ifcfg-ens37:0
[root@localhost network-scripts]# vim ifcfg-ens37:0
NAME=ens37:0
DEVICE=ens37:0
ONBOOT=yes
IPADDR=192.168.2.100
PREFIX=24
GATEWAY=192.168.2.1
[root@localhost network-scripts]# systemctl restart network
[root@localhost network-scripts]#  ip  a
192.168.2.20/24
192.168.2.100/24
web1和web2:
[root@localhost ~]# cd /etc/sysconfig/network-scripts/
[root@localhost network-scripts]# ls
ifcfg-ens33    ifdown-Team      ifup-post
ifcfg-lo
[root@localhost network-scripts]# cp ifcfg-lo ifcfg-lo:0
[root@localhost network-scripts]# vim ifcfg-lo:0
DEVICE=lo:0
IPADDR=192.168.2.100
NETMASK=255.255.255.255
[root@localhost network-scripts]# ip a
 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
    inet 192.168.2.100/32
web1
[root@localhost ~]# vim /etc/sysctl.conf
net.ipv4.conf.lo.arp_ignore = 1   #不接受任何用户的请求
net.ipv4.conf.all.arp_ignore =1
net.ipv4.conf.default.arp_ignore = 1
net.ipv4.conf.lo.arp_announce = 2   #不响应任何用户
net.ipv4.conf.all.arp_announce = 2
net.ipv4.conf.default.arp_announce = 2
[root@localhost ~]# sysctl -p
远程拷贝
[root@localhost ~]# scp /etc/sysctl.conf root@192.168.2.70:/etc/sysctl.conf
yes   拷贝主机的密码
web2
[root@localhost network-scripts]# sysctl -p
两台主机:
添加路由  让web可以接受来自192.168.2.100的请求和使用192.168.2.100发送响应
[root@localhost ~]# route add -host 192.168.2.100 dev lo:0
lvs   DR模式
先删除nat模式
[root@localhost ~]# ipvsadm -D -t 192.168.10.1:80
[root@localhost ~]# ipvsadm -A -t 192.168.2.100:80 -s rr
[root@localhost ~]# ipvsadm -a -t 192.168.2.100:80 -r 192.168.2.60:80 -g -w 1
[root@localhost ~]# ipvsadm -a -t 192.168.2.100:80 -r 192.168.2.70:80 -g -w 1
[root@localhost ~]# ipvsadm -S
[root@localhost ~]# ipvsadm -ln
client:
[root@localhost ~]# curl 192.168.2.100
2222
[root@localhost ~]# curl 192.168.2.100
1111