理论部分
隐藏VIP的方法
要想做到VIP对外隐藏,对内可见,需要两步:
- 修改内核参数
当主机网卡被激活时,会告诉交换机,我来了。数据包中mac地址为全F,交换机出发广播。既然要对外隐藏,那么就要修改接收ARP、向外通告的级别。 需要修改arp_ignore的值为1,修改arp_announce的值为2。
内核参数位置:/proc/sys/net/ipv4/conf/*IF*/
参数或取值 | 描述 |
---|---|
arp_ignore | 定义接收到ARP请求时的响应级别 |
0 | 只要本地配置的有相应地址,就给予响应 |
1 | 仅在请求目标(MAC)地址配置请求到达的接口上的时候,才给予响应。 |
arp_announce | 定义将自己地址向外通告时的通告级别 |
0 | 将本地任何接口上的任何地址向外通告 |
1 | 试图仅向目标网络通告与其网络匹配的地址 |
2 | 仅向与本地接口上地址匹配的网络进行通告 |
- VIP配置在LO环卫接口上
ifconfig命令执行后,可以看到有两块网卡:ens33网卡、lo网卡。其中ens33网卡为物理网卡,lo网卡为虚拟网卡,是系统内核中虚拟出来的。lo网卡是不能和外界联通,且可以配置子接口。
VIP配置到lo网卡上,就可以做到对外隐藏,对内可见。
负载均衡算法
- 静态调度
参数 | 描述 | 说明 |
---|---|---|
rr | 轮询调度(Round-Robin,RR) | 最简单的调度算法,LB按照顺序将请求依次转发给后端的RS,并没有考量后端RS的状态(处理速度以及响应时间)。大部分情况下,RS的性能状态都是各不一致的,这种算法显然无法满足合理利用资源的要求。 |
wrr | 带权重的轮询调度(Weighted Round-Robin,WRR) | 在轮询算法的基础上加上权重设置,权重越高的RS被分配到的请求越多。适用于按照服务器性能高低,配置不同的权重,以达到合理的资源利用。 |
dh | 目标地址散列调度(Destination Hashing, DH) | 也是针对请求报文目标IP地址的负载均衡调度,但它是一种静态映射算法,通过一个散列(hash)函数将一个目标IP地址映射到一台服务器。DH算法先根据请求的目标IP地址,作为散列键(hash key)从静态分配的散列表找出对应的服务器,若该服务器是可用的且为超载,将请求发送到该服务器,否则返回空。 |
sh | 源地址散列调度(Source Hashing, SH) | 该算法正好与DH调度算法相反,它根据请求的源IP地址,作为散列键从静态分配的散列表找出对应的服务器,若该服务器是可用的且未超载,将请求发送到该服务器,否则返回空。算法流程与目标地址散列调度算法基本相似,只不过将请求的目标IP地址换成请求的源IP地址。 |
- 动态调度
参数 | 描述 | 说明 |
---|---|---|
lc | 最小连接调度(Least-Connection, LC) | 把新的请求分配给连接数最少的RS。连接数少说明服务器空闲。 |
wlc | 带权重的最小连接调度(Weight Least-Connection, WLC) | 在最小连接算法的基础上加上权重设置,这样可以人为地控制请求分配。 |
sed | 最短期望延迟 | |
nq | never queue | |
LBLC | 基于本地最少连接 | |
DH | ||
LBLCR | 基于本地的带复制功能的最少连接 |
ipvs内核模块
管理集群服务中心的RS
实验手册(DR模式)
实操部分
按照实验手册进行安装、配置、测试。我们用3台服务器:node01、node02、node03。其中:
node01(192.168.174.11):负载均衡服务器,将请求负载到node02、node03。VIP(192.168.174.100)是要接收公网请求的,要在物理网卡ens33上配置子接口。
node02(192.168.174.12):真实服务器(real server),安装httpd,提供网页服务。VIP(192.168.174.100)是要对外隐藏,对内可见的,需要修改内核参数、在环卫接口lo上配置子接口。
node03(192.168.174.13):真实服务器(real server),安装httpd,提供网页服务。VIP(192.168.174.100)是要对外隐藏,对内可见的,需要修改内核参数、在环卫接口lo上配置子接口。
配置真实服务器node02、node03
修改内核参数
这两个参数是不能用vi来修改的,要用echo来修改。修改后是即时生效的。如果服务器重启,这两个参数是会被还原的。
# 查看网卡接口
ifconfig
# 进入目录
cd /proc/sys/net/ipv4/conf/ens33
# 查看目录
ls
# 查看内核参数
cat arp_ignore
cat arp_announce
# 定义接收到 ARP请求时的响应级别
echo 1 > arp_ignore
# 定义将自己地址向外通告时的通告级别
echo 2 > arp_announce
# 再次查看内核参数
cat arp_ignore
cat arp_announce
# 修改所有接口
cd /proc/sys/net/ipv4/conf/all
echo 1 > arp_ignore
echo 2 > arp_announce
node02:
node03:
配置隐藏的VIP
掩码要配置成255.255.255.255,目标ip和掩码做与运算,如果是4个255,那么,网络号就是192.168.174.100;如果配置成255.255.255.0,那么目标ip和掩码做与运算,网络号就是192.168.174.0。这样环卫接口和物理网卡的接口,就通了,隐藏不住了。所以,必须要配置成4个255才行。
# 配置隐藏的VIP
ifconfig lo:2 192.168.174.100 netmask 255.255.255.255
# 查看网卡接口
ifconfig
node02:
node03:
提供网页服务
# 安装 httpd
yum install httpd -y
# 进入网页发布目录
cd /var/www/html
# 创建首页
vim index.html
# 编辑页面内容
# from 192.168.174.12 # 这是node02的index.html的内容
# from 192.168.174.13 # 这是node03的index.html的内容
# 保存编辑的内容
:wq
# 查看网页内容
cat index.html # 这是node02查看index.html的内容
cat index.html # 这是node03查看index.html的内容
# 启动服务
service httpd start
# 开放 80端口
firewall-cmd --zone=public --query-port=80/tcp # 检查端口是否开放
firewall-cmd --zone=public --add-port=80/tcp --permanent # 开放指定端口
firewall-cmd --reload # 重启防火墙,使设置生效
# 浏览器访问
# http://192.168.174.12 # 这是node02提供的网页服务
# http://192.168.174.13 # 这是node03提供的网页服务
# http://192.168.174.100 # 这是node01的VIP,还没配置,我们先访问一下看看
node02:
node03:
访问 http://192.168.174.12
访问 http://192.168.174.13
访问 http://192.168.174.100
配置负载均衡服务器node01
配置VIP
VIP(192.168.174.100)是要接收公网请求的,要在物理网卡ens33上配置子接口。
# 查看网卡接口
ifconfig
# 在ens33物理网卡接口上,配置子接口ens33:3
ifconfig ens33:3 192.168.174.100/24
# 和上面的命令是一样的效果,netmask 255.255.255.0的简写是/24
# ifconfig ens33:3 192.168.174.100 netmask 255.255.255.0
# 再次查看网卡接口
ifconfig
提供负载均衡服务
LVS是系统自带的(现在的主机都会把LVS模块集成进来的),是系统内核中的服务。我们要想使用LVS服务,可以安装ipvsadm,它相当于对内核服务调用封装了一套api,直接可以给用户使用的。
# 安装ipvsadm
yum install ipvsadm -y
# 配置管理入口
ipvsadm -A -t 192.168.174.100:80 -s rr # ens33物理网卡上配置的子接口ens33:3,VIP
# 配置管理出口
ipvsadm -a -t 192.168.174.100:80 -r 192.168.174.12 -g -w 1 # real server node02
ipvsadm -a -t 192.168.174.100:80 -r 192.168.174.13 -g -w 1 # real server node03
# 查询负载均衡列表
ipvsadm -ln
# 查询负载均衡偷窥列表
ipvsadm -lnc
# 开放 80端口
firewall-cmd --zone=public --query-port=80/tcp # 检查端口是否开放
firewall-cmd --zone=public --add-port=80/tcp --permanent # 开放指定端口
firewall-cmd --reload # 重启防火墙,使设置生效
# 浏览器访问
# http://192.168.174.100
访问 http://192.168.174.100,F5刷新几次
查看偷窥列表
偷窥表state说明
ESTABLISHED 已连接
我们把node02的物理网卡ens33停掉,过一会发现Xshell断开连接了。
# 停掉物理网卡ens33
ifconfig ens33 down
我们直接在虚拟机中看一下,发现ens33网卡已经不存在了
刷新页面http://192.168.174.100,查看偷窥列表
192.168.174.12的状态变成了SYN_RECV。这个状态说明,lvs没事,一定是后边的网络层出问题了。
我们启动node02的物理网卡ens33
# 启动物理网卡ens33
ifconfig ens33 up
Xshell连接node02
访问http://192.168.174.12
访问http://192.168.174.100,F5多刷新几次,观察偷窥列表,发现node02又变成ESTABLISHED已连接的状态了
至此,LVS的DR模型试验搭建完成。
接下来考虑一个问题:如果LVS出了问题怎么办呢?
如果LVS挂了,那么流量就进不来了,对于企业来说,就是服务下线了。企业是不允许这种情况出现的。但是,程序没有办法保证一定不出问题。那么LVS出了问题该怎么处理呢?
可以人为处理,修复好了再把LVS启动起来。但是人处理会很慢,而且还很容易出错,也不够及时。如果可以让计算机自己处理就好了,比如:当发现LVS出现问题了,这台LVS服务器马上下线,同时切换到另一台备用的LVS服务器,等工程师将LVS服务器处理好了,再自动切换回这台LVS服务器。对于用户来讲,这个过程是透明的,用户是完全不知道有这回事。这样的用户体验就很好了吧!
那么要怎样实现呢?咱们下一篇文章接着说!
上一篇《02 高并发负载均衡:LVS的DR,TUN,NAT模型推导》
下一篇《04 高并发负载均衡:基于keepalived的LVS高可用搭建》