第一部分: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 wrr2、为集群添加若干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 03、修改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 04、修改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.html2)启动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 wrr3)添加真实服务器
[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 -m4)查看规则列表并保持规则
[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 wrr3)添加真实服务器(-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 14)查看规则列表,并保存规则
[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 httpd2)设置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 httpd3)配置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 keepalived4)配置防火墙和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 eth02)客户端使用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 02)设置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 03)配置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.54)配置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.html2)启动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 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 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 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@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 s2)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.100Web1关闭多余的网卡与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.200proxy关闭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