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 ‍

相关推荐
垦***耪7 天前
机器人机械臂建模仿真MATLAB轨迹规划 多项式函数插值/抛物线插值轨迹规划/直线/圆弧轨迹规...
lvs
jumu20210 天前
探索EKF算法在机器人轨迹定位中的神奇魅力
lvs
嘉禾望岗50313 天前
lvs+keepalived轮询访问doris集群
linux·服务器·lvs
星环处相逢14 天前
LVS+Keepalived高可用集群深度解析与实战部署
lvs
m0_4887776515 天前
LVS+Keepalived群集
lvs·keepalived
youxiao_9016 天前
LVS负载均衡集群与LVS+Keepalived集群
运维·负载均衡·lvs
LucidX16 天前
LVS DR模式工作原理群集部署
lvs
2501_9399090516 天前
LVS+Keepalived群集
lvs
伞啊伞16 天前
安装与配置 LVS + Keepalived
lvs