Table of Contents
LVS
LVS简介
LVS:Linux Virtual Server,即Linux虚拟服务器。它是一个虚拟的服务器集群系统,可以实现负载均衡集群功能【UNIX/LINUX平台】
lvs基本工作原理:lvs ——> kernel space ——> IP ——> INPUT(ipvs) ——> change ——> POSTROUTING ——> rs
- LVS集群负载均衡器【LB】接受服务的所有客户端请求,并根据调度算法决定哪个集群节点应该处理回复请求
- 一组服务器通过高速的局域网或广域网相互连接,在他们前端有一个负载调度器【LB】。负载调度器能无缝地将网络请求调度到真实服务器上,从而使得服务器集群的结构对客户无感知,客户访问集群系统提供的网络服务就像访问一台高性能、高可用的服务器一样。客户程序不受服务器集群的影响,不需要做任何修改。通过检测节点或服务进程故障和正确地重置系统达到高可用性
命名约定表
名称 | 简写 | 说明 |
虚拟IP | VIP | LB用于向客户端计算机提供服务的IP地址 |
真实IP | RIP | 在集群下面节点上使用的IP地址,真实提供服务的IP地址 |
Dirctor的IP | DIP | 连接内外网络的IP地址,负载均衡器上的IP |
客户端IP | CIP | 客户端请求集群服务器的IP地址,源IP |
LVS集群的工作模式
- NAT(Network Address Translation)
- TUN(Tunneling)
- DR(Direct Routing)
- FULLNAT(Full Network Address Translation)
NAT网络地址转换
- 在接受客户端请求而调度时,通过DNAT(目的地址转换)将目的地址IP改为RIP
- 在后端服务器处理请求返回数据包时,通过SNAT(源地址转换)将源IP改为VIP(因为与客户端TCP/IP握手时需要使用VIP才能成功)
TUN隧道模式
- 在外面增加了一层IP头部,可以跨网段找到真实服务器节点,通过IP隧道通信
- 负载均衡器把请求的报文通过IP隧道的方式转发到给RS,而RS将处理后的数据直接返回给客户端
DR直接路由模式
DR模式是通过改写请求报文的目标MAC地址,将请求发给真实服务器,而真实服务器将响应后的处理结果直接返回给客户端用户。而且,DR模式没有IP隧道的开销,对集群RS节点也没有IP隧道协议的要求,但是要求调度器LB与正式服务器RS节点都有一块网卡连在同一物理网段上,也就是说必须在同一个局域网环境
注意:只修改目标MAC地址,通过MAC找到RS节点(通过二层MAC传输,无法跨网段找到RS节点)
流程:
client ——> DS ——> kernel space ——> PREROUTING ——> CIP:VIP ——> INPUT ——> ipvs ——> DMAC:RMAC ——> PREROUTING ——> DS RS ——> er ceng ——> rs ——> lo ——> eth0(VIP:CIP) ——> client
安装ipvsadm
yum install -y ipvsadm.x86_64 # ipvsadm.x86_64:策略编写工具
通过 ipvsadm -l 查看。可以看到,当前还没有任何策略
- 查看配置文件
rpm -qc ipvsadm-1.27-7.el7.x86_64
- 编辑配置文件
vim /etc/sysconfig/ipvsadm-config
这里要自己创建一个 /etc/sysconfig/ipvsadm 文件
实验1:DR模式
IP | 角色 | 说明 |
192.168.1. | 客户端 | |
192.168.1.11 | LB调度器 | 对外提供虚拟IP:VIP 192.168.1.100 |
192.168.1.12 | RS1 | |
192.168.1.13 | RS2 |
- LB调度器主机临时添加VIP,作为入口
ip addr add 192.168.1.100/24 dev eth0
- 配置lvs,并添加两台RS节点
首先保证策略中为空,避免影响实验结果
ipvsadm -A -t 192.168.1.100:80 -s rr
ipvsadm -a -t 192.168.1.100:80 -r 192.168.1.12:80 -g
ipvsadm -a -t 192.168.1.100:80 -r 192.168.1.13:80 -g
# -A : 添加一个虚拟路由主机(LB)
# -t : 指定虚拟路由主机的VIP地址和监听端口
# -s : 指定负载均衡算法
# -p : 指定会话保持时间
# -a : 添加RS节点
# -r : 指定RS节点的RIP地址和监听端口
# -g : 指定DR模式
# rr : 这这里我使用的是rr轮循算法,所以没有使用-w参数,可以通过-w参数指定权值
- 重启服务,策略添加到文件中
- 客户端 dsd 测试
是因为没有访问到吗,我们在LB主机查看
InActConn变成了1,那这就说明访问调度器无误,调度器调度也正常。 无法正常的返回数据,这是因为DR模式是RS直接返回数据给客户端,而客户端访问的是VIP,无法完成握手阶段
流程:client ——> vs ——> rs ——> client
- 在RS节点添加 192.168.1.100 公网IP
- 客户端测试结果
注意:DR模式下,RS节点和LVS同处一个局域网网段内,当网关通过ARP广播试图获取VIP的MAC地址的时候LVS和RS节点都会接收到ARP广播并且LVS和RS节点都绑定了VIP,所以都会去响应广播,导致冲突现象的发生
解决方法:
- 在RS节点安装并启动arptables服务
yum install -y arptables.x86_64
systemctl start arptables.service
image widget
- 添加并保存规则
RS1:
arptables -A INPUT -d 192.168.1.100 -j DROP
arptables -A OUTPUT -s 192.168.1.100 -j mangle --mangle-ip-s 192.168.1.12
RS2:
arptables -A INPUT -d 192.168.1.100 -j DROP
arptables -A OUTPUT -s 192.168.1.100 -j mangle --mangle-ip-s 192.168.1.13
## 接收时目的地址为192.168.1.100的全部丢弃
## 响应时192.168.1.12/13 源地址伪装成192.168.1.100
arptables-save > etc/sysconfig/arptables
两台RS主机做同样设置
实验2:TUN隧道模式
- 清空ipvsadm
- 启用隧道模式需要的模块
modprobe ipip # 添加ipip模块
- 开启
ifconfig tunl0 up # 开启,必须在添加ip之前开启,否则会导致系统卡死
- 配置LVS,添加RS节点
ipvsadm -A -t 192.168.1.100:80 -s rr
ipvsadm -a -t 192.168.1.100:80 -r 192.168.1.12:80 -i
ipvsadm -a -t 192.168.1.100:80 -r 192.168.1.13:80 -i # -i表示隧道模式
ipvsadm -ln # 其中Tunnel表示为隧道模式
- 重启ipvsadm,保存规则
- 开启隧道并绑定VIP(RS和LB都需要)
ip addr del 192.168.1.100/24 dev eth0 # 删除eth0网卡上的VIP
ip addr add 192.168.1.100/24 dev tunl0 # 添加tunl0网卡上的VIP
这里我只贴出LB上的操作,RS节点操作和其相同
- 查看并关闭反向过滤规则
所有的RS节点都必须要关闭反向过滤,避免由于不符合反向过滤规则会被丢弃
查看:
sysctl -a | grep rp_filter
关闭:
再次查看,确认已经全部关闭:image widget
上述只贴出node2的关闭过程,node3与其相同,就不再重复赘余
LVS+KeepAlived实现高可用负载均衡
KeepAlived定义
KeepAlived是用C语言编写的路由软件,它的作用是为Linux系统和基于Linux的基础结构提供负载均衡和高可用性的简单而强大的功能。负载平衡框架依赖于提供第4层负载平衡的著名且广泛使用的Linux虚拟服务器【IPVS】内核模块。‘
- KeepAlived实现了一组检查器,以根据其运行状况动态,自适应地维护和管理负载平衡的服务器池。
- VRRP【虚拟路由冗余协议】实现了高可用性 协议。VRRP是路由器故障转移的基础砖。
- Keepalived还实现了一组VRRP有限状态机的挂钩,从而提供了低级和高速协议交互。
- 为了提供最快的网络故障检测,Keepalived实施BFD协议【用于检测两个转发点之间故障的网络协议】。
- VRRP状态转换可以考虑BFD提示来驱动快速状态转换。Keepalived框架可以独立使用,也可以一起使用以提供弹性基础架构。
下载安装KeepAlived
回顾一下源码编译三个步骤:./configure —> make —> make install
- 解压并编译安装
tar zxf keepalived-2.0.20.tar.gz # 解压缩
cd keepalived-2.0.20/
./configure --prefix=/usr/local/keepalived --with-init=systemd
# .configure 编译
# --prefix 目录
# 企业7 是systemd,在这里指定一下--with-init
会发现,在我们的编译过程中,出现了报错,查看原因,是由于我们缺失了SSL模块
yum install -y openssl-devel
# 在编译过程中出现报错,是因为缺少对应模块的库文件,直接安装对应的模块的开发包即可
安装完成,我们再次进行编译,编译成功!
查看Use IPVS Framework【IPVS架构】是否为yes
- make 和 make install
过程正常,没有error!
访问刚才我们设置的目录,可以看到keepalived已经安装完成
配置keepalived
在这里要注意,之前实验我们添加了VIP,查看一下自己是否已经删除,保证环境的纯净。因为keepalived会自己生成VIP,无需我们手动设置
- 通过软链接,直接在/etc/下操作
ln -s /usr/local/keepalived/etc/keepalived/ /etc/
cd /etc/keepalived/
- 编写配置文件
vim keepalived.conf
###
notification_email # 通知邮件,若节点宕机,发邮件给它
notification_email_from # 谁发的邮件
smtp_server # 发件服务器
#vrrp_strict # 注释掉,否则会做检查,阻挡我们的操作
interface eth0 # 检查是否是你当前主机配置VIP的网卡,若不是则进行修改
virtual_router_id # 虚拟路由id,在同一网络内,id不能相同,否则会发生冲突
priority # 优先级
virtual_ipaddress # VIP
virtual_server 192.168.1.100 80 # 虚拟服务器,此处默认是443,为SSL默认端口,但此处我们使用的是http,没有加密,因此直接使用80端口即可
delay_loop # 当RS报错时,会尝试多少次之后,才会发送邮件
###
- node4主机编译安装keepalived
tar zxf keepalived-2.0.20.tar.gz
cd keepalived-2.0.20/
yum install -y gcc openssl-devel
./configure --prefix=/usr/local/keepalived --with-init=systemd
make && make install
- 在node4中做软链接
ln -s /usr/local/keepalived/etc/keepalived/ /etc/
- 将配置文件从node1传到node4
scp -r /etc/keepalived/keepalived.conf node4:/etc/keepalived/
- 修改node4中的配置文件
vim /etc/keepalived.conf
###
state BACKUP # 不再是master,换为备用节点
priority 50 # 降低优先级
###
- 检测后端两台服务器
curl localhost
- 启动node1和node4中的keepalived并查看VIP
systemctl start keepalived.service
ip a
很明显,node1的优先级高,VIP设置成功,node4进入备用状态,VIP自动删除
RS节点配置与单独配置LVS时相同
node4日志
测试
- 当server2和server3都正常时,两个主机轮循访问
- 当server2关闭httpd,可以看到,server2 down时,只会访问server3
- 当关闭server1的keepalived,node4接手,不影响客户感知
查看node4日志
查看邮件