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=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 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,查看访问的页面是否会轮询到不同的后端真实服务器。

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

注意建立集群的两种方式frontendlisten 推荐使用listen 配置简单方便。

3)启动服务并设置开机启动

复制代码
[root@haproxy ~]# systemctl start haproxy.service 
[root@haproxy ~]# systemctl enable haproxy.service

相关推荐
念何架构之路9 天前
接入层LVS
lvs
念何架构之路9 天前
接入LVS+Nginx和服务发现
nginx·服务发现·lvs
风曦Kisaki13 天前
Nginx代理与LVS(NAT/DR)全方位对比
运维·nginx·lvs
风曦Kisaki15 天前
# Linux运维Day05:Keepalived热备基础,Keepalived+LVS实现负载均衡
linux·运维·lvs
牛奶咖啡1315 天前
k8s容器编排技术实践——OpenEuler的k8s高可用集群构建实战
云原生·kubernetes·信创·openeuler·keepalived·haproxy·k8s高可用集群部署
bigbearxyz16 天前
Caused by: java.net.SocketException: Connection reset问题排查
java·keepalived·proxysql
雨的旋律209917 天前
keepalived + LVS NAT模式
服务器·网络·lvs
源远流长jerry18 天前
LVS 与 Nginx 负载均衡:从原理到生产实战
运维·网络·网络协议·tcp/ip·nginx·负载均衡·lvs
风曦Kisaki18 天前
# Linux运维Day04:集群与 LVS 负载均衡(LVS-NAT 集群,LVS-DR 集群)
linux·运维·lvs
Donk_6718 天前
LVS 实验搭建
lvs