【Linux集群系列教程】LVS负载均衡集群
一、关于集群
1.集群的类型
- 负载均衡集群 全称:
Load Balance简称:LB - 高可用集群 全称:
High Avalibility简称:HA - 高性能计算集群 全称:
High Performace Compute简称:HPC
A.负载均衡集群
作用:提高业务的
并发能力

B.高可用集群
作用:解决
单点故障、提高可用性可用性:运行时间/(运行时间+故障修复时间)

C.高性能计算集群
作用:提高数据的
处理能力

二、关于LVS(Linux Virtual Service)
lvs被集成在linux内核,速度快
ipvsadm管理工具
1.调度算法scheduler
-
rr全称:round robin轮询 -
wrr基于权重的轮询weight会话保持方案:
a. 会话共享存储
b. 换调度算法
-
lc全称:least connection最少连接 -
wlc基于权重的最少连接 默认 -
shsource hash 源hash根据客户端
IP计算hash值,相同hash值的请求转发到同一个后端服务器一定程度可以解决会话保持问题
2.LVS工作模式
NAT模式

DR模式

3.NAT模式的核心要素
- 请求、响应都要经过
调度器转发 DIP、VIP要分属不同的网络- 调度器开启
路由转发功能 - 所有
real server网关要指向DIP
4.NAT模式的工作原理


三、基于NAT模式的LVS集群
1.实验规划

2.所有服务器关闭防火墙和SElinux、设置时间同步
过程省略,时间一定要同步!否则会出现
脑裂现象!
3.划分子网

提前规划好子网
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.调度器上配置网卡

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


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


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.测试访问


[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.实验规划

2.所有服务器关闭防火墙和SElinux、设置时间同步
过程省略,时间一定要同步!否则会出现
脑裂现象!
3.虚拟机划分子网

4.配置静态IP
三台虚拟机修改网卡模式为
NAT模式,此模式下默认使用VMnet8网卡

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.浏览器访问测试


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.浏览器测试访问


五、持久性连接
作用:
在指定时间范围内,同一个客户端的请求会被转发到同一个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
评论