均衡负载集群(LBC)-1
均衡负载集群(LBC)
客户–>通过Internet—>负载调度器—>n台真实服务器
负载调度器:
- 软件:LVS;Nginx;Haproxy
- 硬件:F5;
LVS架构:
- 使用到C/S(B/S)架构
Nginx的负载均衡:
- 只能使用在B/S架构上
LVS的工作层级
- 用户:ipvsadm–>命令行管理工具
- 内核:ipvs
1、LVS概述
LVS相关原理
- LVS的组成
- IPVS:运行内核空间
- IPVSADM:运行在用户空间,管理集群服务器的命令工具
- LVS原理:根据用户请求的套接字判断,分流至真实服务器的工作模块
LVS工作方式:
- 工作模式:
- NAT模式
- TUN模式
- DR模式
- GitHub–>正在开发;
实验主机的配置
- 规划:
- 负载调度器:192.168.75.10
- 后端服务器:192.168.75.11/12
- 服务器配置要求:
- 系统:centos6.x都可以
- 网卡:双网卡
- eth0:充当外网:192.168.75.0/24
- eth1:充当内网:172.24.254.0/24
- 备注:这个是是实验的预配置
构建一台主机node0–>然后复制出来5台用于后面的实验
#修改一下主机名-->永久修改
[root@node0 ~]# vim /etc/sysconfig/network
NETWORKING=yes
HOSTNAME=node0
#修改一下主机名
[root@node0 ~]# hostname LVS-SERVER
[root@node0 ~]# su -
#关闭一下NetworkManager-->关闭网卡的守护进程
#关闭一下网卡的守护进程-->Centos6.8需要关闭;我的实验环境是没有的;使用的是Centos6.4
[root@LVS-SERVER ~]# service NetworkManager stop#配置网卡公网ip
[root@LVS-SERVER ~]# vim /etc/sysconfig/network-scripts/ifcfg-eth0
DEVICE=eth0
TYPE=Ethernet
ONBOOT=yes
BOOTPROTO=static
IPADDR=192.168.75.10
NETMASK=255.255.255.0
GATEWAY=192.168.75.2
#配置内网ip
[root@LVS-SERVER ~]# cd /etc/sysconfig/network-scripts/
[root@LVS-SERVER network-scripts]# cp -a ifcfg-eth0 ifcfg-eth1
[root@LVS-SERVER network-scripts]# vim ifcfg-eth1
DEVICE=eth1
TYPE=Ethernet
ONBOOT=yes
BOOTPROTO=static
IPADDR=172.25.254.10
NETMASK=255.255.255.0
#重启网络
[root@LVS-SERVER network-scripts]# service network restart#配置光盘yum源
[root@LVS-SERVER network-scripts]# cd /etc/yum.repos.d/
[root@LVS-SERVER yum.repos.d]# vim local.repo
[local]
name=local_repo
baseurl=file:///mnt/cdrom
enabled=1
gpgcheck=0
#配置自动开机挂载光盘
[root@node0 ~]# vim /etc/fstab
...........#在末行添加以下内容
/dev/cdrom /mnt/cdrom iso9660 defaults 0 0#关闭iptables和selinux
[root@node0 ~]# service iptables stop
[root@node0 ~]# chkconfig iptables off
[root@node0 ~]# getenforce
Disabled#关闭对应的ARP响应以及公告功能--->这个是可选选--->先把它所有的写进内核;#需要的时候打开
[root@node0 ~]# vim /etc/sysctl.conf
..............#在末行添加如下几行
#关闭ARP功能
#net.ipv4.conf.all.arp_ignore = 1
#net.ipv4.conf.all.arp_announce = 2_
#net.ipv4.conf.default.arp_ignore = 1
#net.ipv4.conf.default.arp_announce = 2
#net.ipv4.conf.lo.arp_ignore = 1
#net.ipv4.conf.lo.arp_announce = 2#使用命令重新读取
[root@node0 ~]# sysctl -p
2、LVS-DR模式
工作逻辑图
客户–>与后端、LVS都处于同一个网段当中;
用户–>访问LVS服务器–>找后端服务器
二层MAC地址转发–>同一个IP被后端服务器隐藏了;
模式的特点:
- 集群节点:必须在一个网络当中,集群节点必须处于同一个广播域中
- 真实服务器网关指向路由器
- RIP既可以是私网地址,又可以是公网IP
- 负载调度器只负责入站请求,压力是最小的;
- 大大减轻负载调度器的压力,支持更多的服务器节点
- 不能支持端口映射
ARP的响应级别
- arp-ignore
- 0:只要本机配置有相应的IP地址就有响应
- 1:仅在请求的目标地址配置在请求到达的网络接口上时,才给与响应
ARP的通告行为
- arp-announce
- 0:将本机任何网络接口上的任何地址都向外通告
- 1:尽可能避免像目标网络通告与其网络不匹配的地址信息表
- 2:仅向目标网络通告与其网络相匹配的地址信息
LVS-DR模式实验
- 负载调度器配置如下—>使用是的centos7.x
- 服务器:192.168.75.130
#首先关闭一下网卡的守护进程
[root@node0 ~]# systemctl stop NetworkManager
[root@node0 ~]# systemctl disable NetworkManager#创建一个eth0:0用来充当集群入口接口
[root@node0 ~]# cd /etc/sysconfig/network-scripts/
[root@node0 network-scripts]# cp ifcfg-ens32 ifcfg-ens32:0#配置一个虚拟ip
[root@node0 network-scripts]# vim ifcfg-ens32:0
TYPE="Ethernet"
BOOTPROTO="static"
NAME="ens32:0" #注意修改网卡名
DEVICE="ens32:0"
ONBOOT="yes"
IPADDR="192.168.75.100" #这个就是虚拟ip-->自己随便创建的
PREFIX="24"#然后把子接口拉起来
[root@node0 network-scripts]# ifup ens32:0#关闭网卡重定向功能
[root@node0 network-scripts]# cd
[root@node0 ~]# vim /etc/sysctl.conf
............#在末行添加如下内容够
#关闭网卡重定向功能
net.ipv4.conf.all.send_redirects = 0
net.ipv4.conf.default.send_redirects = 0
net.ipv4.conf.eth0.send_redirects = 0#刷新配置文件
[root@node0 ~]# sysctl -p#重载ipvs模块
[root@node0 ~]# modprobe ip_vs#安装ipvsadmin命令行工具
[root@node0 ~]# yum -y install ipvsadm
- 后端服务器配置—>这里使用两台服务器–>两台服务器的配置完全是一样的
- 192.168.75.131/132
- 两台服务器分别是安装httpd
- 创建一个页面用于实验区分
#关闭一下网卡的守护进程
[root@Node1 ~]# systemctl stop NetworkManager
[root@Node1 ~]# systemctl disable NetworkManager#配置一个环回口
[root@Node1 ~]# cd /etc/sysconfig/network-scripts/
[root@Node1 network-scripts]# cp ifcfg-lo ifcfg-lo:0
[root@Node1 network-scripts]# vim ifcfg-lo:0
DEVICE=lo:0
IPADDR=192.168.75.100 #配置虚拟IP-->这个ip和调度服务器的ip是一样的
NETMASK=255.255.255.255 #广播全部是255
...............
#拉起来网卡lo:0
[root@Node1 ~]# systemctl restart network#调整一下内核参数
[root@Node1 network-scripts]# cd
[root@Node1 ~]# vim /etc/sysctl.conf
..........
#关闭ARP功能
net.ipv4.conf.all.arp_ignore = 1
net.ipv4.conf.all.arp_announce = 2_
net.ipv4.conf.default.arp_ignore = 1
net.ipv4.conf.default.arp_announce = 2
net.ipv4.conf.lo.arp_ignore = 1
net.ipv4.conf.lo.arp_announce = 3#重新读取一下
[root@Node1 ~]# sysctl -p
#添加一个路由-->#如果有人来访问这个ip就把它丢给lo:0网卡
[root@node2 ~]# route add -host 192.168.75.100 dev lo:0#然后配置开机自启
[root@node2 ~]# echo "route add -host 192.168.75.100 dev lo:0" >> /etc/rc.local #安装一下httpd
[root@Node1 ~]# yum -y install httpd#启动httpd
[root@Node1 ~]# systemctl start httpd.service
[root@Node1 ~]# systemctl enable httpd.service #修改默认页面
[root@Node1 ~]# vim /var/www/html/index.html
this is node1-131#测试一下是否能够访问
[root@Node1 ~]# curl localhost
this is node1-131
- 最后回到调度服务器node0配置
- 192.168.75.130
- 开始创建lvs集群
#查看一下当前集群内容--->还没有创建,因此没有任何集群信息
[root@node0 ~]# ipvsadm -v
ipvsadm v1.27 2008/5/15 (compiled with popt and IPVS v1.2.1)#添加一下集群
-->-A是添加一个集群
-->-t是指定一个虚拟ip以及端口
-->-s:指定轮询模式为rr
[root@node0 ~]# ipvsadm -A -t 192.168.75.100:80 -s rr #添加集群子节点
-->-a:添加子节点
-->-r:指定子节点的真实ip以及端口
-->-g:指定了是DR模式
[root@node0 ~]# ipvsadm -a -t 192.168.75.100:80 -r 192.168.75.131:80 -g#查看一下集群的信息
[root@node0 ~]# 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.75.100:80 rr-> 192.168.75.131:80 Route 1 0 0 -> 192.168.75.132:80 Route 1 0 0 [root@node0 ~]# ipvsadm -Ln --stats
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Conns InPkts OutPkts InBytes OutBytes-> RemoteAddress:Port
TCP 192.168.75.100:80 2 33 0 6972 0-> 192.168.75.131:80 1 6 0 360 0-> 192.168.75.132:80 1 27 0 6612 0
测试一下
http://192.168.75.100/
3、LVS-NAT模式
工作逻辑图:
用户—>访问LVS服务器
- 源是自己,目的是LVS
LVS—>访问后端服务器
- LVS–>通过DNAT–>把目的地址修改成后端服务器
- 后端返回–>也是通过SNAT–>给到LVS–>然后再给到用户;
DNAT:目的地址转换
SNAT:源地址转换;
NAT模式的特点:
- 集群节点,必须在一个网络中
- 真实服务器必须将网关指向负载调度器
- RIP 通常都是私有 P,仅用于各个集群节点通信
- 负载调度器必须位于客户端和真实服务器之间,充当网关
- 支持端口映射
- 负载调度器操作系统必须是 Linux,真实服务器可以使用任意系统
- 进出数据报文都要进过负载调度器机器,压力较大
实验架构图:
客户端--->路由器--->后端服务器
实验环境的构建:
-
负载调度器:192.168.75.110
-
后端服务器:192.168.75.130
- 网络类型:仅主机模式:172.25.254.130;
- 虚拟机硬件配置:
- 硬件:2U–>CPU
- 内存:2G
- 网卡两张–>不同网段
- 192.168.75.0/24–>充当公网
- 172.25.254.0/24–>充当私网
- 虚拟机软件配置:
-
后端服务器:192.168.75.131
LVS负载调度器配置
- LVS负载调度服务器:Centos6.x
- 双网卡:192.168.75.110–>充当外网
- 172.25.254.110–>充当内网和两台后端服务器130和131互通
#关闭selinux和防火墙
[root@localhost ~]# getenforce
Disabled[root@localhost ~]# service iptables stop
[root@localhost ~]# chkconfig iptables off#关闭一下网卡的守护进程-->Centos6.8需要关闭;我的实验环境是没有的;使用的是Centos6.4
[root@localhost ~]# service NetworkManager stop#配置光盘yum源
[root@localhost ~]# vim /etc/yum.repos.d/local.repo
[local]
name=local_repo
baseurl=file:///mnt/cdrom
enabled=1
gpgcheck=0
#挂载yum源
[root@localhost ~]# mount /dev/cdrom /mnt/cdrom/#配置网络-->#公网网络-->如下
[root@localhost ~]# cd /etc/sysconfig/network-scripts/
[root@localhost network-scripts]# vim ifcfg-eth0
DEVICE=eth0
TYPE=Ethernet
ONBOOT=yes
BOOTPROTO=static
IPADDR=192.168.75.110
NETMASK=255.255.255.0#私网网络如下-->eth1是使用ip a s 可以看出内核识别的网卡名;直接复制出来修改ip
[root@localhost network-scripts]# cp -a ifcfg-eth0 ifcfg-eth1
[root@localhost network-scripts]# vim ifcfg-eth1
DEVICE=eth0
TYPE=Ethernet
ONBOOT=yes
BOOTPROTO=static
IPADDR=172.25.254.110
NETMASK=255.255.255.0#重启网络
[root@localhost network-scripts]# service network restart#关闭网卡的重定向功能
[root@localhost network-scripts]# vim /etc/sysctl.conf #在文件的末行添加
#关闭网卡重定向
net.ipv4.conf.all.send_redirects = 0
net.ipv4.conf.default.send_redirects = 0
net.ipv4.conf.eth0.send_redirects = 0
net.ipv4.conf.eth1.send_redirects = 0#开启路由转发功能
[root@localhost ~]# vim /etc/sysctl.conf
..........7 net.ipv4.ip_forward = 1
........#查看一下配置是否生效
[root@localhost network-scripts]# sysctl -p#重新挂载ipvs模块
[root@localhost network-scripts]# modprobe ip_vs
#安装ipvsadm命令行工具
[root@localhost network-scripts]# yum -y install ipvsadm#查看当前的ipvs集群内容
[root@localhost network-scripts]# ipvsadm -v#然后开启防火墙
[root@localhost ~]# service iptables start#一定要先清楚一下防火墙规则-->然后在设置防火墙规则
[root@localhost ~]# iptables -F#设置防火墙规则#添加防火墙规则:当源地址是内网网段,并且出口网卡为eth0的时候,进行SNAT转换,转换源地址为外网网卡地址
[root@localhost ~]# iptables -t nat -A POSTROUTING -s 172.25.254.0/24 -o eth0 -j SNAT --to-source 192.168.75.110#查看规则是否生效
[root@localhost ~]# iptables -t nat -L
.........#看到这一行代表成功
Chain POSTROUTING (policy ACCEPT)
target prot opt source destination
SNAT all -- 172.25.254.0/24 anywhere to:192.168.75.110 #添加集群-->添加ipvsadm的TCP集群-->指定规则是轮询
[root@localhost ~]# ipvsadm -A -t 192.168.75.110:80 -s rr#为集群添加节点-->-m指定的是LVS的nat模式
[root@localhost ~]# ipvsadm -a -t 192.168.75.110:80 -r 172.25.254.130:80 -m
[root@localhost ~]# ipvsadm -a -t 192.168.75.110:80 -r 172.25.254.131:80 -m#查看一下集群内容
[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.75.110:80 rr-> 172.25.254.130:80 Masq 1 0 0 -> 172.25.254.131:80 Masq 1 0 0 #把集群保存到配置文件,开启持久化
[root@localhost ~]# service ipvsadm save
ipvsadm: Saving IPVS table to /etc/sysconfig/ipvsadm: [ OK ]#设置开机自启动
[root@localhost ~]# chkconfig ipvsadm on
后端服务器131/132配置
- 安装httpd
- 注意网段是172.25.254.0/24
- 注意添加网关地址:
#查看一下ip
[root@Node1 ~]# ip a
.........
inet 172.25.254.131/24 brd 172.25.254.255 scope global noprefixroute ens32
........#安装httpd
[root@Node1 ~]# yum -y install httpd#修改默认页面
[root@Node1 ~]# vim /var/www/html/index.html
this is 131.index#启动apaceh
[root@Node1 ~]# systemctl start httpd
[root@Node1 ~]# curl localhost
this is 131.index#把网关指定到调度服务器ip
[root@Node1 ~]# route add default gw 172.25.254.110
[root@Node1 ~]# route -n
最后浏览器访问–>到这里位置实验成功
http://192.168.75.110/
4、LVS-TUN模式
工作逻辑图:
客户端、LVS、后端–>大家都是公网地址
客户–>访问LVS—>
数据包的二次封装;
模式的特点
- 集群节点不必位于同一个物理网络但必须都拥有公网 IP (或都可以被路由)
- 真实服务器不能将网管指向负载调度器
- RIP 必须是公网地址
- 负载调度器只负责入站请求
- 不支持端口映射功能
- 发送方和接收方必须支持道功能