LVS负载均衡调度器

集群概述

一 . 集群概念 :

集群: 一组协同工作, 但对外表现为一个整体的一群服务器
分布式 : 同一项任务 , 由多个不同的服务器负责不同的步骤的模式叫做分布式
负载均衡 : 同一类任务 , 由多台服务器共同分担访问压力 , 每台服务器仅负责其中一部分任务的模式
高可用 : 为集群中的单节点设备设置{备用服务器}, 待节点故障时, 能够快速取代故障节点并完成后续任务的模式(自己编写脚本或使用keepalived)

典型的负载均衡 :

	DNS轮询解析(淘汰的技术)
	Nginx反向代理
	amoeba
	lvs

存储 :

	初级阶段 : 单磁盘管理{分区 , 格式化 , 挂载} , 磁盘阵列{raid} , 本地逻辑卷管理{LVM}
	中级阶段 : 网络文件系统{NFS , samba:cifs , }
	高级阶段 : 块存储{将底层的存储空间进行共享, 并允许客户端自定义使用方式} 分布式存储{}

监控 : 用专门的监控软件实现服务器的监控, 监控的内容有以下几个方向

	1. 系统运行状态
	2. 系统各资源的使用
	3. 网络流量的占用使用量
	4. 应用服务的运行状态等
	5. 软硬件参数

安全 : 软件防火墙和硬件防火墙

	软件防火墙 : 只能检查数据包的头部信息, 不发识别数据包的内部信息 {Iptables}
	硬件防火墙 : 能过滤数据包的内容(防火墙设备上装的杀毒软件的功能, 进行特征库匹配)
	SELinux  : Linux系统内部安全防护应用软件 , 对用户行为进行约束和限制

一 、集群

1.1 集群基础知识

PV(Page View) :       即页面浏览量或点击量,      是衡量一个网站或网页用户访问量. PV值就是所有访问者在(0-24时)间查看了某个网站多少个页面, 指的是页面的刷新数量
UV(Unique Visitor) :  独立访客,                统计一天内访问某站点的用户数(以cookie为依据);访问网站的一台电脑客户端为一个访客, 可以理解为访问网站的电脑数量
IP :                                          IP可以理解为独立Ip的访问用户, 指1天内使用不同IP地址的用户访问网站的数量, 同一IP无论访问了几个页面, 独立IP数均为1

通常情况下, PV>UV>IP

1.2 集群的基本概念

集群是一组协同工作, 但对外表现为一个整体的服务器. 通过集群技术, 可以在较低成本的情况下获得在性能, 可靠性, 灵活性方面获得较高收益

集群的优点 :

  • 高可扩展性 : 可以通过增加服务器数量达到性能扩展
  • 高可用性 : 集群中的一个节点失效 , 它的任务可以传递给其他节点 . 可以有效防止单点故障
  • 高性能 : 负载均衡允许系统同时接入更多用户
  • 高性价比 : 可以采用廉价的硬件服务器构造高性能的系统

二 、负载均衡

2.1 负载均衡集群 LBC (load balancer Cluster)

概念 : 由两个或两个以上的服务实体协调, 配合完成一系列工作的模式, 对外表现为一个整体
目的 : 提高业务性能, 降低单台服务器压力
特性 : 不同节点之间相互独立, 不共享任何硬件资源, 通过一定算法将客户端的访问请求分配到集群的各个节点上, 充分利用每个节点的资源. 负载均衡扩展了网络设备和服务器带宽, 增加吞吐量, 加强网络数据处理能力.
实现方法 :
硬件 : 单独的硬件设备(独立专门的操作系统) -> F5(BigIP) A10(Thunder系列) redware
软件 : DNS , LVS , Nginx , RAC , Haproxy等
      LVS : 是Linux Virtual Server的缩写, 名为Linux虚拟服务器, 中国最早的纳入Linux内核的应用程序
      RAC: 是real application clusters的缩写, 名为实时应用集群, 是Oracle的负载调用软件
算法 :
      RR (RoundR-Robin) : 轮询
      WRR (wight-Rount-Robin) : 权重 (加权轮询)
结构 :
      agent :  负载调度器
      业务层 :   服务器池
      存储 :   共享存储
层级
      硬件 : 二层 , 四层 , 七层
      软件 : 四层负载调度器{LVS , RAC} , 七层负载调度器{LVS , mysql proxy , RAC , nginx , haproxy}
负载均衡的层级 : 负载均衡一般在二层, 四层 , 七层进行

2.2 LVS工作原理

在这里插入图片描述
INPUT :入站规则 , 只处理以本机作为目标的数据包
OURPUT : 出向规则 , 本机产生的数据包发出时匹配的规则
FORWARD : 转发规则 , 数据包通过自己转发的数据包的入向规则

PREROUTING : 路由转发前的数据规则 , 数据包通过本机转发, 进入本机前匹配的规则
POSTROUTING : 数据包进入本机, 进行转发后, 数据包出本机匹配的规则

2.3 LVS工作原理 : ipvs/ipvsadm

        IPVS : 钩子函数, 内核机制, (用于在请求没有到达目的地址前, 捕获并取得优先控制权的函数)
        IPVSADM : 工作在用户空间, 负责为ipvs内核框架编写规则, 定义谁是集群服务, 谁是后端真是的服务器

ipvsadm 是内核空间ipvs和我们沟通的一个媒介 , 本身并不是ipvsadm发挥功能
iptables 只是防火墙内核和我们沟通的一个媒介 , 本身并不是iptables发挥防火墙的功能

名词 :
        CIP : 客户端IP
        DIP : 负载调度器IP
        VIP : 集群IP
        RIP : 真实服务器IP
 

查看IPVS是否开启 : m代表开启

[root@localhost ~]# grep -i "ipvs" /boot/config-3.10.0-1160.el7.x86_64 
CONFIG_NETFILTER_XT_MATCH_IPVS=m
# IPVS transport protocol load balancing support
# IPVS scheduler
# IPVS SH scheduler
# IPVS application helper

2.4 使用ipvsadm创建集群, 并添加真实服务器

2.4.1安装 ipvsadm

yum install ipvsadm

ipvsadm -ln       # -l:以数字形式输出IP地址和端口

# -A # 创建一体个新的集群
# -t # 指定TCP协议
# -s # 指定负载调度器的调度算法(rr:轮询 , wrr:加权轮询)
# -r # 用来指定应用服务器的IP地址和端口
# -m, g # LVS集群的工作模式 {m: NAT ; g:DR}
# -l # list
# -n # 显示ip和port端口时数据化
# -D # 删除集群服务器
# -d # 删除应用服务器
# -w [num] 在添加集群真实设备时且在加权模式下 使用-w分配权重

`创建集群`
ipvsadm -A -t 192.168.10.20:80 -s rr
`向已创建的集群内添加应用服务器`
ipvsadm -a -t 192.168.10.20:80 -r 192.168.11.30:80 -m
ipvsadm -a -t 192.168.10.20:80 -r 192.168.11.40:80 -m

`查看集群`
ipvsadm -ln

`删除集群`
ipvsadm -D -t 182.168.10.20:80
`删除指定集群内的指定服务器`
ipvsadm -d -t 192.168.10.20:80 -r 192.168.11.30:80
`修改服务器的算法`
ipvsadm -E -t 192.168.10.20:80 -s wrr
`修改集群服务器的工作模式为指定模式`
ipvsadm -e -t 192.168.10.20:80 -r 192.168.11.30:80 -g

2.4.2 LVS负载均衡软件支持的模式

        NAT模式 : 转发IP地址的方式实现
        DR模式 : 路由模式, 转发MAC地址实现
        TUN模式 : 隧道模式, 高级版的DR模式, 可以实现跨地域的服务器隧道链接模式

2.4.2.1 LVS-NAT
1
2
3
4
5
6
7
客户端
互联网
DNS
负载均衡服务器+路由器
交换机
应用服务器1-httpd
应用服务器2-httpd

其中4为客户端访问整个集群的入口, 通常是一个公网地址, 也称为VIP集群IP
其中5为负载调度IP(通常是一个私网地址), 通过调度规则在此端口将任务发放给不同服务器

规划如下

主机IP地址1网关
客户端192.168.10.10192.168.10.20
负载调度器+路由器192.168.10.20 ; 192.168.11.20
应用服务器1-httpd192.168.11.30192.168.11.20
应用服务器2-httpd192.168.11.40192.168.11.20

192.168.10.0/24 网段我们使用 VMnet10
192.168.11.0/24 网段我们使用 VMnet11
负载调度器开启ipv4转发

`添加第11行`
[root@averserver /]# vim /etc/sysctl.conf 
  1 # sysctl settings are defined through files in
  2 # /usr/lib/sysctl.d/, /run/sysctl.d/, and /etc/sysctl.d/.
  3 #
  4 # Vendors settings live in /usr/lib/sysctl.d/.
  5 # To override a whole file, create a new file with the same in
  6 # /etc/sysctl.d/ and put new settings there. To override
  7 # only specific settings, add a file with a lexically later
  8 # name in /etc/sysctl.d/ and put new settings there.
  9 #
 10 # For more information, see sysctl.conf(5) and sysctl.d(5).
 11 net.ipv4.ip_forward=1


[root@averserver /]# sysctl -p
net.ipv4.ip_forward = 1
[root@averserver /]#

两台服务器安装 httpd 服务

[root@httpd_server1 ~]# yum -y install httpd

[root@httpd_server2 ~]# yum -y install httpd

修改两台服务器的 /var/www/html/index.html 的内容区别显示两台服务器

# --------------------------server1 ->  vim /var/www/html/index.html -------------------------
<h1>Hello World I'am HTTP_SERVER-1</h1>


# --------------------------server2 ->  vim /var/www/html/index.html -------------------------
<h1>Hello World I'am HTTP_SERVER-2</h1>

测试页面的工具
        curl    : 仅仅是下载对应目标文件的源码, 命令加载访问页面的源码
        elinks : 字符界面版本的浏览器 : 加载页面的格式, 仅显示内容

ipvsadm管理命令

`创建集群`
ipvsadm -A -t 192.168.10.20:80 -s rr
`向已创建的集群内添加应用服务器`
ipvsadm -a -t 192.168.10.20:80 -r 192.168.11.30:80 -m
ipvsadm -a -t 192.168.10.20:80 -r 192.168.11.40:80 -m

`查看集群`
ipvsadm -ln

测试服务器进行测试

[root@testcustorm ~]# curl 192.168.10.20
<h1>Hello World I'am HTTP_SERVER-2"</h1>
[root@testcustorm ~]# curl 192.168.10.20
<h1>Hello World I'am HTTP_SERVER-1</h1>
[root@testcustorm ~]# curl 192.168.10.20
<h1>Hello World I'am HTTP_SERVER-2"</h1>
[root@testcustorm ~]# curl 192.168.10.20
<h1>Hello World I'am HTTP_SERVER-1</h1>
[root@testcustorm ~]# curl 192.168.10.20
<h1>Hello World I'am HTTP_SERVER-2"</h1>
2.4.2.2 LVS-DR
1
2
3
4
5
6
7
8
9
客户端
互联网
DNS
路由器
交换机
负载均衡调度器
应用服务器1-httpd
应用服务器2-httpd

1-4 客户端解析DNS后访问路由器公网IP地址
5-6 路由器进行NAT地址转换后(一般为公网转私网), 将目的地址指定为负载均衡调度器IP地址
7 负载均衡调度器将接收到的请求包的目的MAC修改为应用服务器1-2的目的MAC以实现负载均衡
8-9 应用服务器要创建一个loopback端口, 因为如果接收目的IP没有路由表或不是本机IP的数据包会将其丢弃掉
10 应用服务器将相应数据直接返回给默认网关, 路由器私网IP地址
注意:负载均衡调度器LVS要求设备必须就有两个IP, 因此我们要创建出一个子接口, 而应用服务器为保证能接收数据包则必须配置Loopback端口

规划如下

主机IP地址1网关
客户端192.168.10.4192.168.10.10
路由器192.168.10.10 ; 192.168.11.10
负载调度器ens33:192.168.11.20 ; ens33-0:192.168.11.100192.168.11.10
应用服务器1-httpd192.168.11.30 ; Loopback0: 192.168.11.100192.168.11.10
应用服务器2-httpd192.168.11.40 ; Loopback0: 192.168.11.100192.168.11.10

192.168.10.0/24 网段我们使用 VMnet10
192.168.11.0/24 网段我们使用 VMnet11

路由器开启IPv4地址转发功能

#----   vi /etc/sysctl.conf  --> 在最后一行添加如下信息
net.ipv4.ip_forward=1

修改ARP通告级别 应用服务器 LoopBack关闭响应ARP报文(提前做)

忽略此条会导致192.168.11.100地址同时被3台设备响应, 甚至会出现IP地址冲突, 配不上IP的状况

负载均衡调度器发送请求给 应用服务器时 , 应用服务器识别到MAC是自己物理网卡的MAC, 而IP地址是环回口的IP地址, 默认丢弃, 因此我们要修改服务器ARP通告级别
修改ARP的通告级别, 允许接收mac和ip非绑定状态下的请求
#---------- vim /etc/sysctl.conf     修改如下参数中的2条即可
net.ipv4.conf.all.arp_ignore = 1
net.ipv4.conf.all.arp_announce = 2

net.ipv4.conf.default.arp_ignore = 1
net.ipv4.conf.default.arp_announce = 2

net.ipv4.conf.lo.arp_ignore = 1
net.ipv4.conf.lo.arp_announce = 2

#刷新配置
sysctl -p

在这里插入图片描述

安装ipvsadm软件

yum -y install ipvsadm

创建集群及添加应用服务器

# 添加集群
ipvsadm -A -t 192.168.11.100:80 -s rr
# 在集群中添加应用服务器
ipvsadm -a -t 192.168.11.100:80 -r 192.168.11.30:80 -g
ipvsadm -a -t 192.168.11.100:80 -r 192.168.11.40:80 -g

路由器开启NAT地址转换

#将任何访问192.168.10.10:80的数据目的地址转换成192.168.11.100:80
iptables -t nat -A PREROUTING -i ens33 -d 192.168.10.10 -p tcp --dport 80 -j DNAT --to-destination 192.168.11.100:80
iptables -t nat -A POSTROUTING -o ens33 -s 192.168.11.10/24 -p tcp --sport 80 -j SNAT --to-source 192.168.10.10

负载均衡调度器关闭路由重定向功能

#------------ vim /etc/sysctl.conf        最后一行添加如下任意一条
net.ipv4.conf.all.send_redirects = 0
net.ipv4.conf.default.send_redirects = 0
net.ipv4.conf.eth0.send_redirects = 0

#刷新配置
sysctl -p

添加应用服务器的物理网卡和环回网卡的通讯路由记录(我的CentOS7不加也能通信)

chmod +x /etc/rc.local
chmod +x rc.d/rc.local

#先执行一遍, 立即生效 
route add -host 192.168.11.100 dev lo:0


#--------- vim /etc/rc.local 		添加如下内容, 设置开机自启
route add -host 192.168.11.100 dev lo:0

使用ab进行压力测试

# 192.168.10.240 : 如下命令
ab -c 100 -n 1000 http://192.168.10.10/index.html

#192.168.11.20 : 查看匹配条数
[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.11.100:80 rr
  -> 192.168.11.30:80             Route   1      0          500
  -> 192.168.11.40:80             Route   1      0          500

三. 负载均衡+Keepalived

keepalived 设计的初衷就是为了保存LVS的配置文件信息的

在这里插入图片描述

3.1 在负载均衡DR实验基础上扩展服务器

主机IP地址1网关
客户端192.168.10.240192.168.10.10
路由器192.168.10.10 ; 192.168.11.10
负载调度器ens33:192.168.11.20 ; ens33-0:192.168.11.100192.168.11.10
应用服务器1-httpd192.168.11.30 ; Loopback0: 192.168.11.100192.168.11.10
应用服务器2-httpd192.168.11.40 ; Loopback0: 192.168.11.100192.168.11.10
负载均衡调度器_bakens33:192.168.11.21 ; ens33-0:192.168.11.100192.168.11.10

负载均衡调度器_bak 安装ipvsadm

两台负载均衡调度器关闭IP地址冲突检测

#-------------- vim /etc/sysconfig/network-scripts/ifup-eth
`搜索arping后, 注释掉如下几行`


#                    if [ $? = 1 ]; then
#                        ARPINGMAC=$(echo $ARPING |  sed -ne 's/.*\[\(.*\)\].*/\1/p')
#                        net_log $"Error, some other host ($ARPINGMAC) already uses address ${ipaddr[$idx]}."
#                        exit 1
#                    fi

负载均衡调度器安装keepalived, 并配置和主调度器相同的配置

yum -y install keepalived

yum -y install ipvsadm

ipvsadm -A -t 192.168.11.100:80 -s rr
ipvsadm -a -t 192.168.11.100:80 -r 192.168.11.30:80 -g
ipvsadm -a -t 192.168.11.100:80 -r 192.168.11.40:80 -g

修改两台负载均衡调度器keepalived的配置文件

#--------------- vim /etc/keepalived/keepalived.conf , 关注如下内容
  1 ! Configuration File for keepalived
  2 
  3 global_defs {
#  4    notification_email {
#  5      acassen@firewall.loc
#  6      failover@firewall.loc
#  7      sysadmin@firewall.loc
#  8    }
#  9    notification_email_from Alexandre.Cassen@firewall.loc
# 10    smtp_server 192.168.200.1
# 11    smtp_connect_timeout 30
 12    router_id LVS_Master																		# Keepalived 本机角色(昵称)
# 13    vrrp_skip_check_adv_addr
# 14    vrrp_strict
# 15    vrrp_garp_interval 0
# 16    vrrp_gna_interval 0
 17 }
 18 
 19 vrrp_instance VI_1 {
 20     state MASTER																			#本机角色(主服务器:MASTER)
 21     interface ens33																			#绑定哪个网卡
 22     virtual_router_id 51																	#虚拟路由ID, 类似于频道, 主备服务器要使用同一个ID
 23     priority 100																			#本机vrrp优先级, 优先级越大则会抢夺资源作为主服务器
 24     advert_int 1
 25     authentication {
 26         auth_type PASS																		#认证密码, 一般不设置, 会增加复杂度
 27         auth_pass 1111
 28     }
 29     virtual_ipaddress {
 30         192.168.200.16
 31         192.168.200.17
 32         192.168.200.18
 33     }
 34 }
 35 
 36 virtual_server 192.168.11.100 80 {															#VRRP虚拟IP, 即负载调度器IP
 37     delay_loop 6
 38     lb_algo rr																				#负载均衡调度模式
 39     lb_kind NAT																				#负载均衡实现模式 {NAT模式/DR路由模式}
 40     persistence_timeout 0																	#此处设置为0
 41     protocol TCP
 42 
 43     real_server 192.168.11.30 80 {															#真实服务器1
 44         weight 1
# 45         SSL_GET {																			#SSL : https使用的内容, http可以忽略掉
# 46             url {
# 47               path /
# 48               digest ff20ad2481f97b1754ef3e12ecd3a9cc
# 49             }
# 50             url {
# 51               path /mrtg/
# 52               digest 9b3a0c85a887a256d6939da88aabd8cd
# 53             }
 54             connect_timeout 3
 55             nb_get_retry 3
 56             delay_before_retry 3
# 57         }
 58     }
 
 43     real_server 192.168.11.40 80 {															#真实服务器1
 44         weight 1
# 45         SSL_GET {																			#SSL : https使用的内容, http可以忽略掉
# 46             url {
# 47               path /
# 48               digest ff20ad2481f97b1754ef3e12ecd3a9cc
# 49             }
# 50             url {
# 51               path /mrtg/
# 52               digest 9b3a0c85a887a256d6939da88aabd8cd
# 53             }
 54             connect_timeout 3
 55             nb_get_retry 3
 56             delay_before_retry 3
# 57         }
 58     }
 59 }
 60 
 61 virtual_server 10.10.10.2 1358 {
 62     delay_loop 6
 63     lb_algo rr
 64     lb_kind NAT
 65     persistence_timeout 50
 66     protocol TCP
 67 
 68     sorry_server 192.168.200.200 1358
 69 
 70     real_server 192.168.200.2 1358 {
 71         weight 1
 72         HTTP_GET {
 73             url {
 74               path /testurl/test.jsp
 75               digest 640205b7b0fc66c1ea91c463fac6334d
 76             }
 77             url {
 78               path /testurl2/test.jsp
 79               digest 640205b7b0fc66c1ea91c463fac6334d
 80             }
 81             url {
 82               path /testurl3/test.jsp
 83               digest 640205b7b0fc66c1ea91c463fac6334d
 84             }
 85             connect_timeout 3
 86             nb_get_retry 3
 87             delay_before_retry 3
 88         }
 89     }
 90 
 91     real_server 192.168.200.3 1358 {
 92         weight 1
 93         HTTP_GET {
 94             url {
 95               path /testurl/test.jsp
 96               digest 640205b7b0fc66c1ea91c463fac6334c
 97             }
 98             url {
 99               path /testurl2/test.jsp
100               digest 640205b7b0fc66c1ea91c463fac6334c
101             }
102             connect_timeout 3
103             nb_get_retry 3
104             delay_before_retry 3
105         }
106     }
107 }
108 
109 virtual_server 10.10.10.3 1358 {
110     delay_loop 3
111     lb_algo rr
112     lb_kind NAT
113     persistence_timeout 50
114     protocol TCP
115 
116     real_server 192.168.200.4 1358 {
117         weight 1
118         HTTP_GET {
119             url {
120               path /testurl/test.jsp
121               digest 640205b7b0fc66c1ea91c463fac6334d
122             }
123             url {
124               path /testurl2/test.jsp
125               digest 640205b7b0fc66c1ea91c463fac6334d
126             }
127             url {
128               path /testurl3/test.jsp
129               digest 640205b7b0fc66c1ea91c463fac6334d
130             }
131             connect_timeout 3
132             nb_get_retry 3
133             delay_before_retry 3
134         }
135     }
136 
137     real_server 192.168.200.5 1358 {
138         weight 1
139         HTTP_GET {
140             url {
141               path /testurl/test.jsp
142               digest 640205b7b0fc66c1ea91c463fac6334d
143             }
144             url {
145               path /testurl2/test.jsp
146               digest 640205b7b0fc66c1ea91c463fac6334d
147             }
148             url {
149               path /testurl3/test.jsp
150               digest 640205b7b0fc66c1ea91c463fac6334d
151             }
152             connect_timeout 3
153             nb_get_retry 3
154             delay_before_retry 3
155         }
156     }
157 }

三. ab命令

ab -c 100 -n 1000 http://192.168.10.10

-c 并发数量 
-n 访问数量
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值