【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
基于权重的最少连接 默认 -
sh
source 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