第一部分:LVS
一、概念
- Director Server: 调度服务器
-- 将负载分发到Real Server的服务器
- Real Server: 后端真实服务器
-- 真正提供应用服务的服务器
- VIP: 虚拟IP地址
--公布给用户访问的虚拟IP地址
- RIP:真实IP地址
--集群节点上使用的IP地址
- DIP:调度器连接节点服务器的IP地址
-- 假如后端服务器DS地址为2.100,调度器需要一个IP连接Real Server,这个IP就是DIP
Director Server【调度服务器】
VIP(192.168.4.5) 为用户提供访问
DIP(192.168.2.5)
Real Server【真实服务器】web
RIP(192.168.2.100, 192.168.2.200)
二、LVS工作模式
1.NAT模式:
用户访问Internet上的LVS服务器,LVS将公网地址转换为私有IP转web1,2,3
2.DR模式:
用户访问调度器,调度器转web1,2,3
web1,2,3直接返回数据给用户
3.TUN模式(用的不多)
LVS和web1,2,3不在一个区域
三、LVS调度算法
- 轮询 rr
- 加权轮询 wrr
- 最少连接 lc
- 加权最少连接 wlc
- 源地址散列 sh
- 目标地址散列 dh
四、ipvsadm命令选项
|-------------------------------------------------------------------------|---------------------------------------|
| 命令选项 | 含义 |
| ipvsadm -A | 添加虚拟服务器 |
| ipvsadm -E | 修改虚拟服务器 |
| ipvsadm -D | 删除虚拟服务器 |
| ipvsadm -C | 清空所有 |
| ipvsadm -a | 添加真实服务器 |
| ipvsadm -e | 修改真实服务器 |
| ipvsadm -d | 删除真实服务器 |
| ipvsadm -L | 查看lvs规则 |
| -s rr\|wrr\|lc\|wlc\|sh | 指定集群算法 |
| ipvsadm -A -t|u 192.168.4.5:80 -s 算法 | 添加虚拟服务器,协议为tcp(-t)或者udp(-u) |
| ipvsadm -E -t|u 192.168.4.5:80 -s 算法 | 修改虚拟服务器,协议为tcp(-t)或者udp(-u) |
| ipvsadm -D -t|u 192.168.4.5:80 -s 算法 | 删除虚拟服务器,协议为tcp(-t)或者udp(-u) |
| ipvsadm -C | 清空所有 |
| ipvsadm -a -t|u 192.168.4.5:80 -r 192.168.2.100 -g\|i\|m -w 权重 | 添加真实服务器 -g(DR模式), -i(隧道模式), -m(NAT模式) |
| ipvsadm -e -t|u 192.168.4.5:80 -r 192.168.2.100 -g\|i\|m -w 权重 | 修改真实服务器 |
| ipvsadm -d -t|u 192.168.4.5:80 -r 192.168.2.100 | 删除真实服务器 |
| ipvsadm -Ln | 查看lvs规则列表 |
五、LVS常用命令
1、创建LVS虚拟服务器集群(算法为加群轮询:wrr)
[root@localhost ~]# ipvsadm -A -t 192.168.4.5:80 -s wrr
[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.4.5:80 wrr
2、为集群添加若干real server
[root@localhost ~]# ipvsadm -a -t 192.168.4.5:80 -r 192.168.2.200 -w 1
[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.4.5:80 wrr
-> 192.168.2.200:80 Route 1 0 0
再添加一台real server web 服务器
[root@localhost ~]# ipvsadm -a -t 192.168.4.5:80 -r 192.168.2.100 -w 1
[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.4.5:80 wrr
-> 192.168.2.100:80 Route 1 0 0
-> 192.168.2.200:80 Route 1 0 0
3、修改LVS的工作模式(默认为-g DR模式)
-
-g为DR模式
-
-m为NAT模式 Masq
-
-i 为Tunnel模式 Tunnel
[root@localhost ~]# ipvsadm -a -t 192.168.4.5:80 -r 192.168.2.201 -w 2 -m
[root@localhost ~]# ipvsadm -a -t 192.168.4.5:80 -r 192.168.2.202 -w 2 -m
[root@localhost ~]# ipvsadm -a -t 192.168.4.5:80 -r 192.168.2.203 -w 2 -i
[root@localhost ~]# ipvsadm -a -t 192.168.4.5:80 -r 192.168.2.204 -w 5 -i
[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.4.5:80 wrr
-> 192.168.2.100:80 Route 1 0 0
-> 192.168.2.200:80 Route 1 0 0
-> 192.168.2.201:80 Masq 2 0 0
-> 192.168.2.202:80 Masq 2 0 0
-> 192.168.2.203:80 Tunnel 2 0 0
-> 192.168.2.204:80 Tunnel 5 0 0
4、修改LVS的工作模式和调度算法,权重以及删除虚拟服务器和真实服务器的基本操作
[root@localhost ~]# ipvsadm -E -t 192.168.4.5:80 -s lc
[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.4.5:80 lc
-> 192.168.2.100:80 Route 1 0 0
-> 192.168.2.200:80 Route 1 0 0
-> 192.168.2.201:80 Masq 2 0 0
-> 192.168.2.202:80 Masq 2 0 0
-> 192.168.2.203:80 Tunnel 2 0 0
-> 192.168.2.204:80 Tunnel 5 0 0
[root@localhost ~]# ipvsadm -e -t 192.168.4.5:80 -r 192.168.2.100 -m -w 2
[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.4.5:80 lc
-> 192.168.2.100:80 Masq 2 0 0
-> 192.168.2.200:80 Route 1 0 0
-> 192.168.2.201:80 Masq 2 0 0
-> 192.168.2.202:80 Masq 2 0 0
-> 192.168.2.203:80 Tunnel 2 0 0
-> 192.168.2.204:80 Tunnel 5 0 0
[root@localhost ~]# ipvsadm -d -t 192.168.4.5:80 -r 192.168.2.100
[root@localhost ~]# ipvsadm -d -t 192.168.4.5:80 -r 192.168.2.200
[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.4.5:80 lc
-> 192.168.2.201:80 Masq 2 0 0
-> 192.168.2.202:80 Masq 2 0 0
-> 192.168.2.203:80 Tunnel 2 0 0
-> 192.168.2.204:80 Tunnel 5 0 0
[root@localhost ~]# ipvsadm -D
You need to supply the 'service-address' option for the 'delete-service' command
[root@localhost ~]# ipvsadm -D -t 192.168.4.5:80
[root@localhost ~]# ipvsadm -Ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
注意:如果你的算法是轮询rr,即使你给服务器加权重也是无效的,你想用权重你的算法必须是wrr或wlc否则你加了权重也是无效的
5、永久保存所有规则
root@localhost \~# ipvsadm-save -n > /etc/sysconfig/ipvsadm-config
6、清空所有规则
root@localhost \~# ipvsadm -C
六、案例1:部署LVS-NAT集群
1、问题
使用LVS实现NAT模式的集群调度服务器,为用户提供Web服务:
- 集群对外公网ip地址为192.168.4.5
- 调度器内网ip地址为192.168.2.5
- 真实web服务器地址分别为192.168.2.100,192.168.2.200
- 使用加权轮询调度算法,真实服务器权重分别为1和2
2、方案
实验拓扑主机配置细节如下表所示
|---------|-----------------------------------------|
| 主机名 | IP地址 |
| client | eht0:192.168.4.10/24 |
| proxy | eht0:192.168.4.5/24 eht1:192.168.2.5/24 |
| web1 | eht0:192.168.2.100/24 网关:192.168.2.5 |
| web2 | eht0:192.168.2.200/24 网关:192.168.2.5 |
使用4台虚拟机,1台作为Director调度器,2台作为Real Server,1台客户端,拓扑结构如下图所示,注意:web1和web2必须配置网关地址,lvs服务器ip_forwad必须打开ip_forward=1proc/sys/net/ipv4/ip_forward
3.步骤
实现此案例需要按照如下步骤进行。
步骤一:配置基础环境
1)设置web服务器(已web1为例)
[root@web1~]# yum install httpd
[root@web1~]# echo "192.168.2.100" > /var/www/html/index.html
2)启动web服务器软件
root@web1\~# systemctl restart httpd
3)关闭防火墙和SELinux
[root@web1~]# systemctl stop firewalled
[root@web1~]# setenforce 0
步骤二:部署LVS-NAT模式调度器
1)确认调度器的路由转发功能(如果开启,可以忽略)
[root@proxy ~]# echo 1 > /proc/sys/net/ipv4/ip_forward
#此文件无法使用vim修改只能使用重定向修改,临时生效
[root@proxy ~]# cat /proc/sys/net/ipv4/ip_forward
1
[root@proxy ~]# echo "net.ipv4.ip_forward=1" >> /etc/sysctl.conf
#修改配置文件,设置永久生效
2)创建集群服务器
[root@proxy ~]# yum install -y ipvsadm
[root@proxy ~]# ipvsadm -A -t192.168.4.5:80 -s wrr
3)添加真实服务器
[root@proxy ~]# ipvsadm -a -t 192.168.4.5:80 -r 192.168.2.100 -w 1 -m
[root@proxy ~]# ipvsadm -a -t 192.168.4.5:80 -r 192.168.2.200 -w 1 -m
4)查看规则列表并保持规则
[root@proxy ~]# 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.4.5:80 wrr
-> 192.168.2.100:80 Masq 1 0 0
-> 192.168.2.200:80 Masq 1 0 0
[root@proxy ~]# ipvsadm-save -n > /etc/sysconfig/ipvsadm-config
[root@proxy ~]# cat /etc/sysconfig/ipvsadm-config
-A -t 192.168.4.5:80 -s wrr
-a -t 192.168.4.5:80 -r 192.168.2.100:80 -m -w 1
-a -t 192.168.4.5:80 -r 192.168.2.200:80 -m -w 1
步骤三:客户端测试
客户端使用curl命令反复连接http://192.168.4.5,查看访问的页面是否会轮询到不同的后端真实服务器
七、案例2:部署LVS-DR集群
1.问题
使用LVS实现DR模式的集群调度器,为用户提供WEB服务:
- 客户端IP地址为192.168.4.10
- LVS调度器VIP地址为192.168.4.15
- LVS调度器DIP地址设置为192.168.4.5
- 真实WEB服务器地址分别为192.168.4.100、192.168.4.200
- 使用加权轮询调度算法,WEB1的权重为1,WEB2的权重为2
说明:
CIP是客户端的IP地址;
VIP是为客户端提供服务的IP地址;
RIP是后端服务器的真实IP地址;
DIP是调度器与后端真实服务器通信的IP地址(VIP必须配置在虚拟接口)。
2.方案
使用4台虚拟机,1台作为客户端、1台作为调度器、2台作为Real server,拓扑结构如下图所示。实验拓扑结构主机细节如下表所示。
|---------|---------------------------------------------------------|
| 主机名 | 网络配置 |
| client | eth0(192.168.4.10/24) |
| proxy | eht0(192.168.4.5/24) eth0:0(192.168.4.15/24) |
| WEB1 | eth0(192.168.4.100/24) lo:0(192.168.4.15/32)注意子网掩码必须是32 |
| WEB1 | eth0(192.168.4.200/24) lo:0(192.168.4.15/32)注意子网掩码必须是32 |
3.步骤
实现此案例需要按照如下步骤进行。
说明:
CIP是客户端的IP地址;
VIP是为客户端提供服务的IP地址;
RIP是后端服务器的真实IP地址;
DIP是调度器与后端真实服务器通信的IP地址(VIP必须配置在虚拟接口)。
步骤一:配置实验网络环境
1)设置proxy代理服务器的VIP和DIP
注意:为了防止冲突,VIP必须要配置在网卡的虚拟接口!!!
[root@proxy ~]# cd /etc/sysconfig/network-scripts/
[root@proxy network-scripts]# cp ifcfg-eth0{,:0}
[root@proxy network-scripts]# vim ifcfg-eth0
TYPE=Ethernet
BOOTPROTO=none
NAME=eth0
DEVICE=eth0
ONBOOT=yes
IPADDR=192.168.4.5
PREFIX=24
[root@proxy network-scripts]# vim ifcfg-eth0:0
TYPE=Ethernet
BOOTPROTO=none
NAME=eth0:0
DEVICE=eth0:0
ONBOOT=yes
IPADDR=192.168.4.15
PREFIX=24
[root@proxy network-scripts]# systemctl restart network
2)设置WEB1服务器网络参数修改IP地址为192.168.4.100
[root@proxy network-scripts]# vim ifcfg-eth0:0
TYPE=Ethernet
BOOTPROTO=none
NAME=eth0
DEVICE=eth0
ONBOOT=yes
IPADDR=192.168.4.100
PREFIX=24
接下来给WEB1配置VIP地址。
注意:这里的子网掩码必须是32(也就是全255),网络地址与IP地址一样,广播地址与IP地址也一样。
[root@web1 ~]# cd /etc/sysconfig/network-scripts/
[root@web1 network-scripts]# cp ifcfg-lo{,:0}
[root@web1 network-scripts]# vim ifcfg-lo:0
TYPE=lo:0
IPADDR=192.168.4.15
NETMASK=255.255.255.255
NETWORK=192.168.4.15
BROADCAST=192.168.4.15
ONBOOT=yes
NAME=lo:0
防止地址冲突问题:
这里因为WEB1也配置与代理一样的VIP地址,默认肯定会出现地址冲突;
sysctl.conf文件写入这下面四行的主要目的就是访问192.168.4.15的数据包,只有调度器会响应,其他主机都不做任何响应,这里防止地址冲突问题。
[root@web1 ~]# vim /etc/sysctl.conf
#手动写入如下4行内容
[root@web1 ~]# net.ipv4.conf.all.arp_ignore = 1
[root@web1 ~]# net.ipv4.conf.lo.arp_ignore = 1
[root@web1 ~]# net.ipv4.conf.lo.arp_announce = 2
[root@web1 ~]# net.ipv4.conf.all.arp_announce = 2
#当有arp广播问谁是192.168.4.15时,本机忽略该广播,不回应
#本机不要向外宣告自己的lo回环地址是192.168.4.15
[root@web1 ~]# sysctl -p
重启网络服务,设置防火墙与SELinux
[root@web1 ~]# systemctl restart network
[root@web1 ~]# ifconfig
[root@web1 ~]# systemctl stop firewalld
[root@web1 ~]# setenforce 0
3)设置WEB2服务器网络参数
[root@proxy network-scripts]# vim ifcfg-eth0:0
TYPE=Ethernet
BOOTPROTO=none
NAME=eth0
DEVICE=eth0
ONBOOT=yes
IPADDR=192.168.4.200
PREFIX=24
接下来给WEB2配置VIP地址。
注意:这里的子网掩码必须是32(也就是全255),网络地址与IP地址一样,广播地址与IP地址也一样。
[root@web2 ~]# cd /etc/sysconfig/network-scripts/
[root@web2 network-scripts]# cp ifcfg-lo{,:0}
[root@web2 network-scripts]# vim ifcfg-lo:0
TYPE=lo:0
IPADDR=192.168.4.15
NETMASK=255.255.255.255
NETWORK=192.168.4.15
BROADCAST=192.168.4.15
ONBOOT=yes
NAME=lo:0
防止地址冲突问题:
这里因为WEB2也配置与代理一样的VIP地址,默认肯定会出现地址冲突;
sysctl.conf文件写入这下面四行的主要目的就是访问192.168.4.15的数据包,只有调度器会响应,其他主机都不做任何响应,这里防止地址冲突问题。
[root@web2 ~]# vim /etc/sysctl.conf
#手动写入如下4行内容
[root@web2 ~]# net.ipv4.conf.all.arp_ignore = 1
[root@web2 ~]# net.ipv4.conf.lo.arp_ignore = 1
[root@web2 ~]# net.ipv4.conf.lo.arp_announce = 2
[root@web2 ~]# net.ipv4.conf.all.arp_announce = 2
#当有arp广播问谁是192.168.4.15时,本机忽略该广播,不回应
#本机不要向外宣告自己的lo回环地址是192.168.4.15
[root@web2 ~]# sysctl -p
重启网络服务,设置防火墙与SELinux
[root@web2 ~]# systemctl restart network
[root@web2 ~]# ifconfig
[root@web2 ~]# systemctl stop firewalld
[root@web2 ~]# setenforce 0
步骤二:proxy调度器安装软件并部署LVS-DR模式调度器
1)安装软件(如果已经安装,此步骤可以忽略)
root@proxy \~# yum -y install ipvsadm
2)清理之前实验的规则,创建新的集群服务器规则
[root@proxy ~]# ipvsadm -C #清空所有规则
[root@proxy ~]# ipvsadm -A -t 192.168.4.15:80 -s wrr
3)添加真实服务器(-g参数设置LVS工作模式为DR模式,-w设置权重)
[root@proxy ~]# ipvsadm -a -t 192.168.4.15:80 -r 192.168.4.100 -g -w 1
[root@proxy ~]# ipvsadm -a -t 192.168.4.15:80 -r 192.168.4.200 -g -w 1
4)查看规则列表,并保存规则
[root@proxy ~]# 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.4.15:80 wrr
-> 192.168.4.100:80 Route 1 0 0
-> 192.168.4.200:80 Route 1 0 0
[root@proxy ~]# ipvsadm-save /etc/sysconfig/ipvsadm-config
步骤三:客户端测试
客户端使用curl命令反复连接http://192.168.4.15,查看访问的页面是否会轮询到不同的后端真实服务器。
扩展知识:默认LVS不带监控检查功能,需要自己手动编写动态经检测脚本,实现该功能:(参考脚本如下,仅供参考)
[root@proxy ~]# vim check.sh
#!/bin/bash
VIP=192.168.4.15:80
RIP1=192.168.4.100
RIP2=192.168.4.200
while:
do
for IP in $RIP1 $RIP2
do
curl -s http://$IP &> /dev/vnull
if [ $? -eq 0 ];then
ipvsadm -Ln | grep -q $IP || ipvsadm -a -t $VIP -r $IP
else
ipvsadm -Ln | grep -q $IP && ipvsadm -d -t $VIP -r $IP
fi
done
sleep 1
done
第二部分:Keepalived和HAProxy
Keepalived主要功能:
- 自动配置LVS规则
- 健康检查
- VRRP
1.案例1:Keepalived高可用服务器
1.1问题
准备三台Linux服务器,两台作为web服务器,部署Keepalived高可用软件,一台作为客户端主机,实现如下功能:
- 使用Keepalived实现Web服务器的高可用
- Web服务器IP地址分别为192.168.4.100、192.168.4.200
- Web服务器的浮动VIP地址为192.168.4.80
- 客户端通过访问VIP地址访问Web页面
1.2方案
使用3台虚拟机,2台作为web服务器,并部署Keepalived,1台作为客户端,拓扑结构如下图所示,主机配置如下表所示。
|-----------------|------------------------------------------------------|
| 主机名 | 网络配置 |
| proxy(扮演客户端的角色) | eth0:192.168.4.5 |
| web1 | eth0:192.168.4.100 VIP:192.168.4.80(Keepalived会自动配置) |
| web2 | eth0:192.168.4.200 VIP:192.168.4.80(Keepalived会自动配置) |
1.3步骤
实现此案例需要按照如下步骤进行。
步骤一:配置网络环境(如果在前的案例已经完成改配置,可以忽略)
1)设置Web1服务器网络参数,配置web服务
[root@web1 ~]# vim /etc/sysconfig/network-script/ifcfg-eth0
TYPE=Ethernet
BOOTPROTO=none
NAME=eth0
DEVICE=eth0
ONBOOT=yes
IPADDR=192.168.4.100
PREFIX=24
[root@web1 ~]# yum -y install httpd
[root@web1 ~]# echo "192.168.4.100" > /var/www/html/index.html
[root@web1 ~]# systemctl restart httpd
2)设置Web2服务器网络参数,配置web服务
[root@web2 ~]# vim /etc/sysconfig/network-script/ifcfg-eth0
TYPE=Ethernet
BOOTPROTO=none
NAME=eth0
DEVICE=eth0
ONBOOT=yes
IPADDR=192.168.4.200
PREFIX=24
[root@web2 ~]# yum -y install httpd
[root@web2 ~]# echo "192.168.4.200" > /var/www/html/index.html
[root@web2 ~]# systemctl restart httpd
3)配置proxy主机的网络参数(如果已经设置,可以忽略此步骤)
[root@proxy ~]# vim /etc/sysconfig/network-script/ifcfg-eth0
TYPE=Ethernet
BOOTPROTO=none
NAME=eth0
DEVICE=eth0
ONBOOT=yes
IPADDR=192.168.4.5
步骤二:安装Keepalived软件
注意:两台web服务器做相同的操作
[root@web1 ~]# yum install -y keepalived
[root@web2 ~]# yum install -y keepalived
步骤三:部署Keepalived服务
1)修改web1服务器Keepalived配置文件
[root@web1 ~]# vim /etc/keepalived/keepalived.conf
! Configuration File for keepalived
global_defs {
notification_email { //设置收件人邮箱
acassen@firewall.loc
failover@firewall.loc
sysadmin@firewall.loc
}
notification_email_from Alexandre.Cassen@firewall.loc //设置发件人
smtp_server 127.0.0.1 //定义邮件服务器
smtp_connect_timeout 30
router_id web1 //设置路由ID号(实验需要修改)
}
vrrp_instance VI_1 {
state MASTER //主服务器为MASTER(备服务器需要修改为BACKUP)
interface eth0 //定义网络接口
virtual_router_id 51 //主备服务器VRIP号必须一致
priority 100 //服务器优先级,优先级高优先获取VIP
advert_int 1
authentication {
auth_type PASS
auth_pass 1111 //主备服务器密码必须一致
}
virtual_ipaddress { //谁是主服务器谁配置VIP(使用需要修改)
192.168.4.80
}
}
2)修改web2服务器Keepalived配置文件
[root@web2 ~]# vim /etc/keepalived/keepalived.conf
! Configuration File for keepalived
global_defs {
notification_email { //设置收件人邮箱
acassen@firewall.loc
failover@firewall.loc
sysadmin@firewall.loc
}
notification_email_from Alexandre.Cassen@firewall.loc //设置发件人
smtp_server 127.0.0.1 //定义邮件服务器
smtp_connect_timeout 30
router_id web2 //设置路由ID号(实验需要修改)
}
vrrp_instance VI_1 {
state BACKUP //主服务器为BACKUP(实验需要修改)
interface eth0 //定义网络接口
virtual_router_id 51 //主备服务器VRIP号必须一致
priority 50 //服务器优先级,优先级高优先获取VIP(实验需要修改)
advert_int 1
authentication {
auth_type PASS
auth_pass 1111 //主备服务器密码必须一致
}
virtual_ipaddress { //谁是主服务器谁配置VIP(使用需要修改)
192.168.4.80
}
}
3)启动服务
#注意每次启动Keepalived都会重新生成防火墙规则,所以需要再第四步先清空防火墙规则
[root@web1 ~]# systemctl start keepalived
[root@web2 ~]# systemctl start keepalived
4)配置防火墙和SELinux
[root@web1 ~]# iptables -F
[root@web1 ~]# setenforce 0
[root@web2 ~]# iptables -F
[root@web2 ~]# setenforce 0
步骤4:测试
1)登录两台Web服务器查看VIP信息
[root@web1 ~]# ip addr show eth0
[root@web2 ~]# ip addr show eth0
2)客户端使用curl命令连接http://192.168.4.80,查看Web页面;关闭Web1页面服务器的网卡,客户端再次访问http://192.168.4.80,验证是否可以正常访问服务。
2.案例2:Keepalived+LVS服务器(DR模式)
2.1 问题
使用Keepalived为LVS调度器提供高可用功能,防止调度器单点故障,为用户提供Web服务:
- LVS1调度器真实IP地址为192.168.4.5
- LVS2调度器真实IP地址为192.168.4.6
- 服务器VIP地址设置为192.168.4.15
- 真实Web服务器地址分别为192.168.4.100、192.168.4.200
- 使用加权轮询调度算法,真实Web服务器权重不同
2.2方案
使用5台虚拟机,1台作为客户端主机,2台作为LVS调度器,2台作为Real Server,实验拓扑环境结构如下图所示,基础环境配置如下表所示。
|---------|----------------------|
| 主机名 | 网络配置 |
| client | eth0:192168.4.10/24 |
| proxy1 | eth0:192168.4.5/24 |
| proxy2 | eth0:192168.4.6/24 |
| web1 | eth0:192168.4.100/24 |
| web2 | eth0:192168.4.200/24 |
注意:所有主机都需要配置IP地址与有效的YUM源。
2.3 步骤
实现此案例需要按照如下步骤进行。
步骤一:配置网络环境
1)设置Web1服务器的网络参数
[root@web1 ~]# vim /etc/sysconfig/network-script/ifcfg-eth0
TYPE=Ethernet
BOOTPROTO=none
NAME=eth0
DEVICE=eth0
ONBOOT=yes
IPADDR=192.168.4.100
接下来给Web1配置VIP地址
注意:这里的子网掩码必须是32(也就是全255),网络地址与IP地址一样,广播地址与IP地址也一样。
[root@web1 ~]# cd /etc/sysconfig/network-scripts/
[root@web1 network-scripts]# cp ifcfg-lo{,:0}
[root@web1 network-scripts]# vim ifcfg-lo:0
TYPE=lo:0
IPADDR=192.168.4.15
NETMASK=255.255.255.255
NETWORK=192.168.4.15
BROADCAST=192.168.4.15
ONBOOT=yes
NAME=lo:0
防止地址冲突问题:
注意:这里因为Web1也配置与调度器一样的VIP地址,默认肯定会出现地址冲突;
sysctl.conf文件写入这下面四行的主要目的就是访问192.168.4.15的数据包,只有调度器会响应,其他主机都不做任何响应,这里防止地址冲突问题。
[root@web1 ~]# vim /etc/sysctl.conf
#手动写入如下4行内容
[root@web1 ~]# net.ipv4.conf.all.arp_ignore = 1
[root@web1 ~]# net.ipv4.conf.lo.arp_ignore = 1
[root@web1 ~]# net.ipv4.conf.lo.arp_announce = 2
[root@web1 ~]# net.ipv4.conf.all.arp_announce = 2
#当有arp广播问谁是192.168.4.15时,本机忽略该广播,不做任何回应
#本机不要向外宣告自己的lo回环地址是192.168.4.15
[root@web1 ~]# sysctl -p
重启网络服务,设置防火墙与SELinux
[root@web1 ~]# systemctl stop NetworkManager #非必须
[root@web1 ~]# systemctl disable NetworkManager #非必须
[root@web1 ~]# systemctl restart network
[root@web1 ~]# ifconfig
[root@web1 ~]# systemctl stop firewalld
[root@web1 ~]# setenforce 0
2)设置Web2服务器的网络参数
[root@web2 ~]# vim /etc/sysconfig/network-script/ifcfg-eth0
TYPE=Ethernet
BOOTPROTO=none
NAME=eth0
DEVICE=eth0
ONBOOT=yes
IPADDR=192.168.4.200
接下来给Web2配置VIP地址
注意:这里的子网掩码必须是32(也就是全255),网络地址与IP地址一样,广播地址与IP地址也一样。
[root@web2 ~]# cd /etc/sysconfig/network-scripts/
[root@web2 network-scripts]# cp ifcfg-lo{,:0}
[root@web2 network-scripts]# vim ifcfg-lo:0
TYPE=lo:0
IPADDR=192.168.4.15
NETMASK=255.255.255.255
NETWORK=192.168.4.15
BROADCAST=192.168.4.15
ONBOOT=yes
NAME=lo:0
防止地址冲突问题:
注意:这里因为Web2也配置与调度器一样的VIP地址,默认肯定会出现地址冲突;
sysctl.conf文件写入这下面四行的主要目的就是访问192.168.4.15的数据包,只有调度器会响应,其他主机都不做任何响应,这里防止地址冲突问题。
[root@web2 ~]# vim /etc/sysctl.conf
#手动写入如下4行内容
[root@web2 ~]# net.ipv4.conf.all.arp_ignore = 1
[root@web2 ~]# net.ipv4.conf.lo.arp_ignore = 1
[root@web2 ~]# net.ipv4.conf.lo.arp_announce = 2
[root@web2 ~]# net.ipv4.conf.all.arp_announce = 2
#当有arp广播问谁是192.168.4.15时,本机忽略该广播,不做任何回应
#本机不要向外宣告自己的lo回环地址是192.168.4.15
[root@web2 ~]# sysctl -p
重启网络服务,设置防火墙与SELinux
[root@web1 ~]# systemctl stop NetworkManager #非必须
[root@web1 ~]# systemctl disable NetworkManager #非必须
[root@web1 ~]# systemctl restart network
[root@web1 ~]# ifconfig
[root@web1 ~]# systemctl stop firewalld
[root@web1 ~]# setenforce 0
3)配置proxy1主机的网路参数(不配置VIP,由Keepalived自动配置)
[root@proxy1 ~]# vim /etc/sysconfig/network-script/ifcfg-eth0
TYPE=Ethernet
BOOTPROTO=none
NAME=eth0
DEVICE=eth0
ONBOOT=yes
IPADDR=192.168.4.5
4)配置proxy2主机的网路参数(不配置VIP,由Keepalived自动配置)
注意:按照前面的课程,默认没有改虚拟机,需要重新创建一台虚拟机proxy2。
[root@proxy2 ~]# vim /etc/sysconfig/network-script/ifcfg-eth0
TYPE=Ethernet
BOOTPROTO=none
NAME=eth0
DEVICE=eth0
ONBOOT=yes
IPADDR=192.168.4.6
步骤二:配置后端web服务
1)安装软件,自定义Web页面(web1和web2主机)
[root@web1 ~]# yum -y install httpd
[root@web1 ~]# echo "192.168.4.100" > /var/www/html/index.html
[root@web2 ~]# yum -y install httpd
[root@web2 ~]# echo "192.168.4.200" > /var/www/html/index.html
2)启动web服务器软件(web1和web2)
[root@web1 ~]# systemctl start httpd
[root@web1 ~]# systemctl enable httpd
[root@web2 ~]# systemctl start httpd
[root@web2 ~]# systemctl enable httpd
步骤三:调度器安装Keepalived和ipvsadm软件
注意:两台LVS调度器zhixingji相同的操作(如果已经安装软件,可以忽略此步骤)。
安装软件
[root@proxy1 ~]# yum install -y keepalived
[root@proxy1 ~]# systmctl enable keepalived
[root@proxy1 ~]# yum install -y ipvsadm
[root@proxy1 ~]# ipvsadm -C
[root@proxy2 ~]# yum install -y keepalived
[root@proxy2 ~]# systmctl enable keepalived
[root@proxy2 ~]# yum install -y ipvsadm
[root@proxy2 ~]# ipvsadm -C
步骤四:部署Keepalived实现LVS-DR模式调度器的高可用
1)LVS1调度器设置Keepalived,并启动服务
注意Keepalived健康检查的三种方式
-
TCP_CHECK #检查tcp端口是否存在
-
HTTP_GET #检查http的md5值
-
SSL_GET #检查ssl加密的md5值
[root@proxy1 ~]# vim /etc/keepalived/keepalived.conf
! Configuration File for keepalivedglobal_defs {
notification_email { //设置收件人邮箱
acassen@firewall.loc
failover@firewall.loc
sysadmin@firewall.loc
}
notification_email_from Alexandre.Cassen@firewall.loc //设置发件人
smtp_server 127.0.0.1 //定义邮件服务器
smtp_connect_timeout 30
router_id lvs1 //设置路由ID号(实验需要修改)
}vrrp_instance VI_1 {
state MASTER //主服务器为MASTER(备服务器需要修改为BACKUP)
interface eth0 //定义网络接口
virtual_router_id 51 //主备服务器VRIP号必须一致
priority 100 //服务器优先级,优先级高优先获取VIP
advert_int 1
authentication {
auth_type PASS
auth_pass 1111 //主备服务器密码必须一致
}
virtual_ipaddress { //谁是主服务器谁配置VIP(使用需要修改)
192.168.4.15
}
}virtual_server 192.168.4.15 80 { //设置ipvsadm的规则(实验需要修改)
delay_loop 6
lb_algo wrr //设置LVS调度算法为WRR
lb_kind DR //设置LVS的模式为DR
#persistence_timeout 50
#注意这样的作用是保持连接,开启后,客户端在一定时间内始终访问相同的服务器
protocol TCPreal_server 192.168.4.100 80 { //设置后端web服务器真实IP(实验需要修改) weight 1 //设置权重为1 TCP_CHECK { //对后台real_server的健康检查 connect_timeout 3 //超时3s也认为机器坏了 retry 3 //尝试3次 delay_before_retry 3 //每隔3s做一次健康检查 } } real_server 192.168.4.200 80 { //设置后端web服务器真实IP(实验需要修改) weight 2 //设置权重为2 TCP_CHECK { //对后台real_server的健康检查 connect_timeout 3 //超时3s也认为机器坏了 retry 3 //尝试3次 delay_before_retry 3 //每隔3s做一次健康检查 } }}
[root@proxy1 ~]# systemctl start keepalived
[root@proxy1 ~]# ipvsadm -Ln #查看LVS规则
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 192.168.4.15:80 wrr
-> 192.168.4.100:80 Route 1 0 0
-> 192.168.4.200:80 Route 1 0 0
[root@proxy1 ~]# ip addr show #查看VIP配置 ip a s
2)LVS2调度器设置Keepalived
[root@proxy2 ~]# vim /etc/keepalived/keepalived.conf
! Configuration File for keepalived
global_defs {
notification_email { //设置收件人邮箱
acassen@firewall.loc
failover@firewall.loc
sysadmin@firewall.loc
}
notification_email_from Alexandre.Cassen@firewall.loc //设置发件人
smtp_server 127.0.0.1 //定义邮件服务器
smtp_connect_timeout 30
router_id lvs2 //设置路由ID号(实验需要修改)
}
vrrp_instance VI_1 {
state BACKUP //主服务器为MASTER(备服务器需要修改为BACKUP)
interface eth0 //定义网络接口
virtual_router_id 51 //主备服务器VRIP号必须一致
priority 80 //服务器优先级,优先级高优先获取VIP
advert_int 1
authentication {
auth_type PASS
auth_pass 1111 //主备服务器密码必须一致
}
virtual_ipaddress { //谁是主服务器谁配置VIP(使用需要修改)
192.168.4.15
}
}
virtual_server 192.168.4.15 80 { //设置ipvsadm的规则(实验需要修改)
delay_loop 6
lb_algo wrr //设置LVS调度算法为WRR
lb_kind DR //设置LVS的模式为DR
#persistence_timeout 50
#注意这样的作用是保持连接,开启后,客户端在一定时间内始终访问相同的服务器
protocol TCP
real_server 192.168.4.100 80 { //设置后端web服务器真实IP(实验需要修改)
weight 1 //设置权重为1
TCP_CHECK { //对后台real_server的健康检查
connect_timeout 3 //超时3s也认为机器坏了
retry 3 //尝试3次
delay_before_retry 3 //每隔3s做一次健康检查
}
}
real_server 192.168.4.200 80 { //设置后端web服务器真实IP(实验需要修改)
weight 2 //设置权重为2
TCP_CHECK { //对后台real_server的健康检查
connect_timeout 3 //超时3s也认为机器坏了
retry 3 //尝试3次
delay_before_retry 3 //每隔3s做一次健康检查
}
}
}
[root@proxy2 ~]# systemctl start keepalived
[root@proxy2 ~]# ipvsadm -Ln #查看LVS规则
[root@proxy2 ~]# ip addr show #查看VIP配置 ip a s
步骤五:客户端测试
客户端使用curl命令反复连接http://192.168.4.15,查看访问的页面是否会轮询到不同的后端真实服务器。
3.案例3:配置HAProxy负载平衡集群
前言:调度软件对比
Nginx分析:
优点
- 工作在7层,可以这对http做分流策略
- 1.9版本开支支持4层代理
- 正则表达式必HAProxy强大
- 安装、配置、测试简单,通过日志可以解决多数问题
- 并发量可以达到几万次
- Nginx还可以做Web服务器使用
缺点:
- 仅支持http、https、mail协议,应用面小
- 健康检查仅通过端口,无法使用url检查
LVS分析
优点:
- 负责能力强,工作在4层,对内存、CPU消耗低
- 配置性低,没有太多可配置性,减少人为错误
- 应用面广,几乎可以为所有应用提供负载均衡
缺点:
- 不支持正则表达式,不能实现动静分离
- 如果网站架构庞大,LVS-DR配置比较繁琐
HAProxy分析:
优点:
- 仅支持session、cookie功能
- 可以通过url进行健康检查
- 效率、负载均衡速度,高于Nginx,低于LVS
- HAProxy支持TCP,可以对MySQL进行负载均衡
- 调度算法丰富
缺点:
- 正则弱于Nginx
- 日志依赖于syslogd
3.1问题
准备4台Linux服务器,两台Web服务器,1台HAProxy,1台客户端,实现如下功能:
- 客户端访问HAProxy,HAProxy分发请求到后端Real Server
- 开启HAProxy监控页面,及时查看调度器状态
- 设置HAProxy为开机启动
3.2方案
使用4台虚拟机,1台作为HAProxy调度器,2台作为Real Server,1台作为客户端,拓扑如下图所示,具体配置如下表所示。
|---------|---------------------------------------|
| 主机名 | 网络配置 |
| client | eth0:192168.4.10/24 |
| proxy1 | eth0:192168.4.5/24 eth0:192168.2.5/24 |
| web1 | eth0:192168.2.100/24 |
| web2 | eth0:192168.2.200/24 |
3.3步骤
实现此案例需要按照如下步骤进行。
注意事项:
将前面实验VIP、LVS等实验的内容清理干净!!!!
删除所有设备的VIP,清空所有LVS设置,关闭Keepalived!!!
Web1关闭多余的网卡与VIP,配置本地真实IP地址。
[root@web1 ~]# vim /etc/sysconfig/network-script/ifcfg-eth0
TYPE=Ethernet
BOOTPROTO=none
NAME=eth0
DEVICE=eth0
ONBOOT=yes
IPADDR=192.168.2.100
Web1关闭多余的网卡与VIP,配置本地真实IP地址。
[root@web2 ~]# vim /etc/sysconfig/network-script/ifcfg-eth0
TYPE=Ethernet
BOOTPROTO=none
NAME=eth0
DEVICE=eth0
ONBOOT=yes
IPADDR=192.168.2.200
proxy关闭Keepalived服务,清理LVS规则。
[root@proxy ~]# systmctl stop keepalived
[root@proxy ~]# systmctl disable keepalived
[root@proxy ~]# ipvsadm -C
[root@proxy ~]# vim /etc/sysconfig/network-script/ifcfg-eth0
TYPE=Ethernet
BOOTPROTO=none
NAME=eth0
DEVICE=eth0
ONBOOT=yes
IPADDR=192.168.4.5
[root@proxy ~]# vim /etc/sysconfig/network-script/ifcfg-eth1
TYPE=Ethernet
BOOTPROTO=none
NAME=eth1
DEVICE=eth1
ONBOOT=yes
IPADDR=192.168.2.5
步骤一:配置后端web服务
设置两台后端web服务(如果已经配置完成,可以忽略此步骤)
[root@web1 ~]# yum -y install httpd
[root@web1 ~]# systemctl start httpd
[root@web1 ~]# echo "192.168.2.100" > /var/www/html/index.html
[root@web2 ~]# yum -y install httpd
[root@web2 ~]# systemctl start httpd
[root@web2 ~]# echo "192.168.2.200" > /var/www/html/index.html
步骤二:部署HAProxy服务器
1)配置网络,安装软件
root@haproxy \~# yum -y install haproxy
2)修改配置文件
关于maxconn
- global(全局设置)
-- maxconn 4000 //整个软件(集群)最大并发连接数,总值不能超过4000
- default(默认设置)
-- maxconn 3000 //集群默认最大并发连接数,如果集群没写的话,一个listen就是一个集群
- 集群设置
listen:80
-- maxconn 500 //如果集群写了maxconn表示当前集群最大并发连接数不能超过500
-- server web1
-- server web2
listen:3306
-- server mysql1
-- server mysql2
[root@haproxy ~]# vim /etc/haproxy/haproxy.cfg
global
log 127.0.0.1 local2 #日志写在本机【err warning info debug】
chroot /var/lib/haproxy #工作目录
pidfile /var/run/haproxy.pid #程序pid号
maxconn 4000 #整个集群最大并发连接数量
user haproxy #使用haproxy用户起服务
group haproxy #使用haproxy组起服务
daemon #创建一个进程进入daemon运行(后台)
defaults
mode http # 默认的模式mode {tcp|http|health} 分别为4层调度,7层调度,和不做调度只有健康检查
log global
option httplog #日志类别http日志格式
option dontlognull #健康检查的时候不记录日志
option http-server-close #每次请求完毕后主动关闭http通道
option forwardfor except 127.0.0.0/8 #后端服务器可以用http header中获得客户端ip,转发给后台
option redispatch #servid服务器挂掉后前置定向到其他健康服务器
retries 3 #3次连接失败就认为服务不可用,
timeout http-request 10s
timeout queue 1m
timeout connect 10s #如果backend没有指定,默认10s
timeout client 1m #客户端连接超时
timeout server 1m #服务器连接超时
timeout http-keep-alive 10s
timeout check 10s
maxconn 3000 #集群默认最大并发连接数,如果集群没写的话,一个listen就是一个集群
#---------------------------------------------------------------------
# main frontend which proxys to the backends
#---------------------------------------------------------------------
# 第一种建立集群的方式
frontend main
bind *:5000
acl url_static path_beg -i /static /images /javascript /stylesheets
acl url_static path_end -i .jpg .gif .png .css .js
use_backend static if url_static
default_backend app
#---------------------------------------------------------------------
# static backend for serving up images, stylesheets and such
#---------------------------------------------------------------------
backend static
balance roundrobin
server static 127.0.0.1:4331 check
#---------------------------------------------------------------------
# round robin balancing between the various backends
#---------------------------------------------------------------------
backend app
balance roundrobin
server app1 127.0.0.1:5001 check
server app2 127.0.0.1:5002 check
server app3 127.0.0.1:5003 check
server app4 127.0.0.1:5004 check
# HAProxy管理网页
listen stats *:1080 #监听端口
stats refresh 30s #统计页面自动刷新时间
stats uri /stats #统计页面url
stats realm Haproxy Manager #进入页面管理页面查看状态信息
stats auth admin:admin #统计页面用户名和密码设置
#stats hide-version #隐藏统计页面上HAProxy的版本信息
# 第二种建立集群的方式
listen websrv-rewrite *:80
balance roundrobin
server web1 192.168.2.100:80 check inter 2000 rise 2 fall 5 #每隔2000ms做一次健康检查,失败5次fall算失败,成功2次rise算成功
server web2 192.168.2.120:80 check inter 2000 rise 2 fall 5
注意建立集群的两种方式frontend和listen 推荐使用listen 配置简单方便。
3)启动服务并设置开机启动
[root@haproxy ~]# systemctl start haproxy.service
[root@haproxy ~]# systemctl enable haproxy.service