【Linux集群系列教程】LVS负载均衡集群

一、关于集群

1.集群的类型

  • 负载均衡集群 全称:Load Balance 简称:LB
  • 高可用集群 全称:High Avalibility 简称:HA
  • 高性能计算集群 全称:High Performace Compute 简称:HPC

A.负载均衡集群

作用:提高业务的并发能力

lvs01

B.高可用集群

作用:解决单点故障提高可用性

可用性:运行时间/(运行时间+故障修复时间)

lvs02

C.高性能计算集群

作用:提高数据的处理能力

lvs03

二、关于LVS(Linux Virtual Service)

lvs被集成在linux内核,速度快

ipvsadm管理工具

1.调度算法scheduler

  1. rr 全称:round robin 轮询

  2. wrr基于权重的轮询weight

    会话保持方案:

    a. 会话共享存储

    b. 换调度算法

  3. lc 全称:least connection 最少连接

  4. wlc 基于权重的最少连接 默认

  5. sh source hash 源hash

    根据客户端IP计算hash值,相同hash值的请求转发到同一个后端服务器

    一定程度可以解决会话保持问题

2.LVS工作模式

NAT模式

lvs04

DR模式

lvs05

3.NAT模式的核心要素

  • 请求、响应都要经过调度器转发
  • DIPVIP要分属不同的网络
  • 调度器开启路由转发功能
  • 所有real server网关要指向DIP

4.NAT模式的工作原理

lvs06

lvs07

三、基于NAT模式的LVS集群

1.实验规划

lvs08

2.所有服务器关闭防火墙和SElinux、设置时间同步

过程省略,时间一定要同步!否则会出现脑裂现象!

3.划分子网

lvs09

提前规划好子网

4.在调度器上安装ipvsadm

[root@master ~]# yum install -y ipvsadm

5.在2台web服务器安装httpd用于测试

[root@node1 ~]# yum install -y httpd
[root@node2 ~]# yum install -y httpd

6.配置静态IP

A.调度器上配置网卡

lvs12

B.配置调度器静态IP

[root@master ~]# vim /etc/sysconfig/network-scripts/ifcfg-ens33
TYPE="Ethernet"
BROWSER_ONLY="no"
BOOTPROTO="none"
DEFROUTE="yes"
NAME="ens33"
UUID="7ec71d4c-13c5-413c-b03b-05b1c9705b0b"
DEVICE="ens33"
ONBOOT="yes"
ETHTOOL_OPTS="autoneg on"
IPADDR=192.168.146.100
NETMASK=255.255.255.0
[root@master ~]# vim /etc/sysconfig/network-scripts/ifcfg-ens36
TYPE="Ethernet"
BROWSER_ONLY="no"
BOOTPROTO="none"
DEFROUTE="yes"
NAME="ens36"
DEVICE="ens36"
ONBOOT="yes"
ETHTOOL_OPTS="autoneg on"
IPADDR=192.168.177.254
NETMASK=255.255.255.0

C.开启调度器的路由转发功能

[root@master ~]# vim /etc/sysctl.conf
net.ipv4.ip_forward = 1
[root@master ~]# sysctl -p
net.ipv4.ip_forward = 1

D.两台web服务器,更改网卡为VMnet2

lvs13

lvs13

E.为2台web服务器配置静态IP

[root@node1 ~]# vim /etc/sysconfig/network-scripts/ifcfg-ens33
TYPE="Ethernet"
BROWSER_ONLY="no"
BOOTPROTO="none"
DEFROUTE="yes"
NAME="ens33"
DEVICE="ens33"
ONBOOT="yes"
ETHTOOL_OPTS="autoneg on"
IPADDR=192.168.177.10
NETMASK=255.255.255.0
GATEWAY=192.168.177.254
[root@node2 ~]# vim /etc/sysconfig/network-scripts/ifcfg-ens33
TYPE="Ethernet"
BROWSER_ONLY="no"
BOOTPROTO="none"
DEFROUTE="yes"
NAME="ens33"
DEVICE="ens33"
ONBOOT="yes"
ETHTOOL_OPTS="autoneg on"
IPADDR=192.168.177.20
NETMASK=255.255.255.0
GATEWAY=192.168.177.254

F.重启网卡服务

[root@node1 ~]# systemctl restart network
[root@node2 ~]# systemctl restart network

7.在2台web服务器创建测试页面

[root@node1 ~]# systemctl enable --now httpd	#设置开机自启动
[root@node2 ~]# systemctl enable --now httpd
[root@node1 ~]# vim /var/www/html/index.html
<h1>This is 192.168.177.10!</h1>
[root@node2 ~]# vim /var/www/html/index.html
<h1>This is 192.168.177.20!</h1>
[root@node1 ~]# systemctl restart httpd		#重启Apache服务器
[root@node1 ~]# systemctl restart httpd

8.测试2台web服务器正常工作

如果无法访问,请尝试修改控制面板-网络和Internet-网络共享中心-更改适配器设置-VMnet2-修改网关地址为192.168.177.254

lvs14

lvs15

9.回到调度器上,配置虚拟服务

[root@master ~]# ipvsadm -A -t 192.168.146.100:80 -s rr

-s指定调度算法
-A添加虚拟服务
-t指定地址和虚拟端口

[root@master ~]# ipvsadm -L -n
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
TCP  192.168.146.100:80 rr

-L显示内核中虚拟服务规则
-n以数字形式显示IP和端口

10.添加real server

[root@master ~]# ipvsadm -a -t 192.168.146.100:80 -r 192.168.177.10:80 -m 
[root@master ~]# ipvsadm -a -t 192.168.146.100:80 -r 192.168.177.20:80 -m

-a在虚拟服务中添加真实服务器
-t基于TCP的服务
-m设置工作模式为NAT

11.查看负载均衡表

[root@master ~]# ipvsadm -L -n
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
TCP  192.168.146.100:80 rr
  -> 192.168.177.10:80            Masq    1      0          0         
  -> 192.168.177.20:80            Masq    1      0          0

12.测试访问

lvs16

lvs17

[root@master ~]# ipvsadm -L -n -c
IPVS connection entries
pro expire state       source             virtual            destination
TCP 01:48  TIME_WAIT   192.168.146.1:11417 192.168.146.100:80 192.168.177.10:80
TCP 00:55  TIME_WAIT   192.168.146.1:11398 192.168.146.100:80 192.168.177.20:80
TCP 00:30  TIME_WAIT   192.168.146.1:11365 192.168.146.100:80 192.168.177.10:80

-c查询当前ipvs中存在的连接

13.保存或恢复规则(默认不是永久存储)

[root@master ~]# ipvsadm -S > /opt/web_rule
[root@master ~]# ipvsadm -R < /opt/web_rule

四、基于DR模式的LVS集群环境

1.实验规划

lvs18

2.所有服务器关闭防火墙和SElinux、设置时间同步

过程省略,时间一定要同步!否则会出现脑裂现象!

3.虚拟机划分子网

lvs19

4.配置静态IP

三台虚拟机修改网卡模式为NAT模式,此模式下默认使用VMnet8网卡

lvs20

A.修改调度器的IP

[root@master ~]# vim /etc/sysconfig/network-scripts/ifcfg-ens33
TYPE="Ethernet"
BROWSER_ONLY="no"
BOOTPROTO="none"
DEFROUTE="yes"
NAME="ens33"
UUID="7ec71d4c-13c5-413c-b03b-05b1c9705b0b"
DEVICE="ens33"
ONBOOT="yes"
ETHTOOL_OPTS="autoneg on"
IPADDR=192.168.140.10
NETMASK=255.255.255.0
GATEWAY=192.168.140.2
DNS1=114.114.114.114
DNS2=8.8.8.8

B.为调度器配置虚拟网卡的IP(VIP)

这只是临时的

[root@master ~]# ip addr add dev lo 192.168.140.100/32

可以把这个命令加到/etc/rc.d/rc.local里实现永久生效

[root@master ~]# vim /etc/rc.d/rc.local
ip addr add dev lo 192.168.140.100/32
[root@master ~]# chmod a+x /etc/rc.d/rc.local

C.为2台real server配置IP

[root@node1 ~]# vim /etc/sysconfig/network-scripts/ifcfg-ens33
TYPE="Ethernet"
BOOTPROTO="none"
DEFROUTE="yes"
NAME="ens33"
UUID="0682810a-3437-4af7-bf07-227ec3d502c8"
DEVICE="ens33"
ONBOOT="yes"
ETHTOOL_OPTS="autoneg on"
IPADDR=192.168.140.20
NETMASK=255.255.255.0
GATEWAY=192.168.140.2
DNS1=114.114.114.114
DNS2=8.8.8.8
[root@node2 ~]# vim /etc/sysconfig/network-scripts/ifcfg-ens33
TYPE="Ethernet"
BOOTPROTO="none"
DEFROUTE="yes"
NAME="ens33"
UUID="b3a870e2-3754-4205-9947-c94fb7716913"
DEVICE="ens33"
ONBOOT="yes"
ETHTOOL_OPTS="autoneg on"
IPADDR=192.168.140.30
NETMASK=255.255.255.0
GATEWAY=192.168.140.2
DNS1=114.114.114.114
DNS2=8.8.8.8

D.为2台real server配置虚拟网卡的IP(VIP)

这只是临时的

[root@node1 ~]# ip addr add dev lo 192.168.140.100/32

[root@node2 ~]# ip addr add dev lo 192.168.140.100/32

可以把这个命令加到/etc/rc.d/rc.local里实现永久生效

[root@node1 ~]# vim /etc/rc.d/rc.local
ip addr add dev lo 192.168.140.100/32

[root@node2 ~]# vim /etc/rc.d/rc.local
ip addr add dev lo 192.168.140.100/32
[root@node1 ~]# chmod a+x /etc/rc.d/rc.local

[root@node2 ~]# chmod a+x /etc/rc.d/rc.local

5.修改所有real server内核参数

当net.ipv4.conf.all.arp_ignore等于0的时候,响应任意网卡上接收到的对本机IP地址的arp请求包括环回网卡上的地址,而不管该目的IP是否在接收网卡上。
当net.ipv4.conf.all.arp_ignore等于1的时候,只响应目的IP地址为接收网卡上的本地地址arp请求。
当net.ipv4.conf.all.arp_announce等于0的时候,本机所有IP地址都向任何一个接口通告ARP报文。
当net.ipv4.conf.all.arp_announce等于1的时候,尽量仅向该网卡回应与该网段匹配的ARP报文。
当net.ipv4.conf.all.arp_announce等于2的时候,该网卡回应与该网段匹配的ARP报文。

[root@node1 ~]# vim /etc/sysctl.conf
net.ipv4.conf.all.arp_ignore = 1
net.ipv4.conf.all.arp_announce = 2

[root@node1 ~]# sysctl -p
net.ipv4.conf.all.arp_ignore = 1
net.ipv4.conf.all.arp_announce = 2
[root@node2 ~]# vim /etc/sysctl.conf
net.ipv4.conf.all.arp_ignore = 1
net.ipv4.conf.all.arp_announce = 2

[root@node2 ~]# sysctl -p
net.ipv4.conf.all.arp_ignore = 1
net.ipv4.conf.all.arp_announce = 2

6.在所有real server安装httpd

[root@node1 ~]# yum install -y httpd
[root@node2 ~]# yum install -y httpd

A.创建测试页面

[root@node1 ~]# vim /var/www/html/index.html
<h1>This is 192.168.140.20!</h1>

[root@node2 ~]# vim /var/www/html/index.html
<h1>This is 192.168.140.30!</h1>

B.设置开机自启动

[root@node1 ~]# systemctl enable --now httpd
[root@node2 ~]# systemctl enable --now httpd

C.浏览器访问测试

lvs21

lvs22

7.回到调度器配置虚拟服务

A.安装ipvsadm

[root@master ~]# yum install -y ipvsadm

B.创建虚拟服务

[root@master ~]# ipvsadm -A -t 192.168.140.100:80 -s rr

-s指定调度算法
-A添加虚拟服务
-t指定地址和虚拟端口

[root@master ~]# ipvsadm -L -n
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
TCP  192.168.140.100:80 rr

-L显示内核中虚拟服务规则
-n以数字形式显示IP和端口

C.添加real server

[root@master ~]# ipvsadm -a -t 192.168.140.100:80 -r 192.168.140.20:80 -g
[root@master ~]# ipvsadm -a -t 192.168.140.100:80 -r 192.168.140.30:80 -g

-a在虚拟服务中添加真实服务器
-t基于TCP的服务
-g设置工作模式为DR

D.查看虚拟服务工作状态

[root@master ~]# ipvsadm -L -n
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
TCP  192.168.140.100:80 rr
  -> 192.168.140.20:80            Route   1      0          0         
  -> 192.168.140.30:80            Route   1      0          0

E.浏览器测试访问

lvs23

lvs24

五、持久性连接

作用:
指定时间范围内, 同一个客户端的请求会被转发到同一个real server
保持会话持久

[root@master ~]# ipvsadm -E -t 192.168.140.100:80 -s rr -p 10

-E修改之前已经创建过的虚拟服务
-p配置持久化时间,如题我配置了10秒,也就是10秒内,客户端访问的时候都是同一个服务器

[root@master ~]# ipvsadm -L -n
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
TCP  192.168.140.100:80 rr persistent 10	#可以看到这里新增了规则
  -> 192.168.140.20:80            Route   1      0          0         
  -> 192.168.140.30:80            Route   1      0          0