LVS+Keepalived+HAProxy

第一部分: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=1`proc/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](http://192.168.4.5/ "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](http://192.168.4.15/ "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](http://192.168.4.80/ "http://192.168.4.80"),查看Web页面;关闭Web1页面服务器的网卡,客户端再次访问[http://192.168.4.80](http://192.168.4.80/ "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 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 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](http://192.168.4.15/ "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 ‍

相关推荐
Ap04155 天前
LVS介绍以及模式实现
lvs
天蓝不会忘记025 天前
lvs,haproxy,keepalived,nginx,tomcat介绍和实验
nginx·tomcat·lvs
qizhideyu6 天前
LVS(Linux virual server)
linux·运维·lvs
nzxzn6 天前
Keepalived 核心知识点
运维·keepalived
在这habit之下6 天前
Linux Virtual Server(LVS)学习总结
linux·学习·lvs
Yiiz.6 天前
LVS实验
lvs
unfeeling_6 天前
HAProxy实验
linux·haproxy
️️(^~^)6 天前
LVS实验
linux·服务器·lvs
gx23486 天前
1-LVS
linux·服务器·lvs
unfeeling_6 天前
LVS实验
lvs