一.LVS是什么
LVS是Linux Virtual Server的简写,意即Linux虚拟服务器,是一个虚拟的服务器集群系统。本项目在1998年5月由章文嵩博士成立,是中国国内最早出现的自由软件项目之一。在linux内存2.6中,它已经成为内核的一部分,在此之前的内核版本则需要重新编译内核。
二.LVS的作用
LVS主要用于多服务器的负载均衡。它工作在网络层,可以实现高性能,高可用的服务器集群技术。
它廉价,可把许多低性能的服务器组合在一起形成一个超级服务器。
它易用,配置非常简单,且有多种负载均衡的方法。它稳定可靠,即使在集群的服务器中某台服务器无法正常工作,也不影响整体效果。
另外可扩展性也非常好。
因为lvs工作在网络层,所以相对于其他的负载均衡的解决办法(DNS域名轮流解析、应用层负载的调度、客户端的调度等,它的效率是非常高的)
LVS的通过控制IP来实现负载均衡。IPVS是其具体的实现模块。
三.LVS常见的负载调度算法
轮询调度RR:
将外部请求按照顺序轮流分配到真实的服务器上
加权轮询WRR:
根据真实服务器的不同处理能力来调度访问请求
最少链接数LC:
调度器通过最少连接调度算法动态的将网络请求调度到以建立的连接数最少的服务器上
(两台服务器配置差不多时使用)
加权最少连接WLC:
优化负载的性能,较高权重的服务器将承受较大比例的活动连接负载
(两台服务器 有一台比较弱时 可以使用)
基于局部性的最少连接 LBLC:
针对目标的IP地址的负载均衡,应用于cache集群上。会根据请求的目标IP地址找出该目标IP地址最近使用的服务器,如果该服务器是可用的没有超载,则将请求发送到服务器上,若服务器不存在,或服务器处于一半的工作负载,则用最少连接数选出一个服务器
带复制的基于局部性的最少连接(locality-Based Least Connections with Replication)
也是针对目标IP地址的负载均衡,用于cache集群。它与LBLC算法不同之处是它要维护的是从一个目标IP地址到一组服务器的映射,而LBLC算法维护的是从一个目标IP地址到一台服务器的映射。
目标地址散列(Destination IP Hashing)
目标地址散列调度算法根据请求的目标IP地址,作为散列键(Hash KEY)从静态分配的散列表中找出对应的服务器,若服务器是可用的且未超载,则请求发送到该服务器,否则返回空。
源地址散列
根据请求的源IP地址,作为散列键从静态分配的散列表中找出对应的服务器,若服务器是可用的且未超载,则请求发送到该服务器,否则返回空。
源IP端口散列
通过hash函数将来自用一个源IP地址和源端口号的请求映射到后端同一台服务器上。
(适合按服务的类型分类)
随机
随机地将请求分发到不同的服务器上
典型的负载均衡集群中,包括三层次的组件,前端至少一个负载均衡调度器(LB)负责相应并发来自客户端的访问请求;后端有大量真实服务器构成服务池(server pool)提供实际的应用服务
透明性 一致性和伸缩性
第一层:
负载调度器,这是访问整个集群系统唯一入口,对外使用所有服务器共有VIP,也称为集群IP,通常会配置主备两台调度器实现热备份。
第二层:
服务器池,集群符提供的应用服务,由服务器池承担。每个节点具有独立的真实IP,只处理调度器分发过来的客户机请求。当某个节点失效时,负载调度器的容错机制会将它隔离,等排出错误后,在从新纳入服务器池
第三层:
共享存储,为服务池中的所有节点提供稳定的,一致的文件存取服务,保证整个集群的统一性
工作模式: 调度技术可以基于IP、端口、内容进行分发。基于IP的效率最高。常见的有三种,地址转换、IP隧道和直接路由。
四.ipvsadm工具
五.LVS-NAT实验
NFS服务器192.168.100.10
关闭防火墙并下载NFS服务
[root@localhost ~]# systemctl stop firewalld.service
[root@localhost ~]# setenforce 0
cd /opt/
mkdir nfs
cd nfs
mkdir aa bb 创建新目录
ls
aa bb
echo "this is aa" >aa/index.html 创建站点文件
echo "this is bb" >bb/index.html
给文件权限
设置共享策略
vim /etc/exports
/opt/nfs/aa 192.168.100.0/24(rw,sync,no_root_squash)
/opt/nfs/bb 192.168.100.0/24(rw,sync,no_root_squash)
开启服务发布共享
systemctl start rpcbind
systemctl start nfs
showmount -e
web1服务器192.168.100.20
关闭防火墙
systemctl stop firewalld.service
setenforce 0
查询刚才设置的NFS服务器192.168.100.10
showmount -e 192.168.100.10
安装Apache服务
yum install httpd -y
mount 192.168.100.10:/opt/nfs/aa /var/www/html/ 挂载
[root@localhost ~]# cd /var/www/html/
[root@localhost html]# ls
index.html
[root@localhost html]# cat index.html
this is aa
重启Apache并查看ip地址
[root@localhost html]# systemctl restart httpd.service
网关配置
[root@localhost html]# vim /etc/sysconfig/network-scripts/ifcfg-ens33
IPADDR=192.168.100.20
NETMASK=255.255.255.0
GATEWAY=192.168.100.40
[root@localhost html]# systemctl restart network
关闭防火墙
systemctl stop firewalld.service
setenforce 0
[root@localhost ~]# showmount -e 192.168.100.10
Export list for 192.168.100.10:
/opt/nfs/bb 192.168.100.0/24
/opt/nfs/aa 192.168.100.0/24
和web1一样安装Apache
yum install httpd -y
[root@localhost ~]# mount 192.168.100.10:/opt/nfs/bb /var/www/html/
[root@localhost ~]# df -h
文件系统 容量 已用 可用 已用% 挂载点
/dev/mapper/centos-root 20G 3.6G 17G 18% /
devtmpfs 897M 0 897M 0% /dev
tmpfs 912M 0 912M 0% /dev/shm
tmpfs 912M 9.1M 903M 1% /run
tmpfs 912M 0 912M 0% /sys/fs/cgroup
/dev/sda1 5.0G 179M 4.9G 4% /boot
tmpfs 183M 8.0K 183M 1% /run/user/42
tmpfs 183M 24K 183M 1% /run/user/0
/dev/sr0 4.3G 4.3G 0 100% /mnt/cdrom
192.168.100.10:/opt/nfs/bb 20G 14G 6.8G 67% /var/www/html
[root@localhost ~]# cd /var/www/html/
[root@localhost html]# ls
index.html
[root@localhost html]# cat index.html
this is bb
重启Apache并查看ip地址
[root@localhost html]# systemctl restart httpd.service
网关配置
vim /etc/sysconfig/network-scripts/ifcfg-ens33
IPADDR=192.168.100.30
NETMASK=255.255.255.0
GATEWAY=192.168.100.40
systemctl restart network
调度服务器192.168.100.40
关闭防火墙
[root@localhost ~]# systemctl stop firewalld.service
[root@localhost ~]# setenforce 0
下载ipvsadm
yum install ipvsadm.x86_64 -y
添加网卡为NAT模式
修改网络配置
[root@localhost ~]# vim /etc/sysconfig/network-scripts/ifcfg-ens33
TYPE=Ethernet
PROXY_METHOD=none
BROWSER_ONLY=no
BOOTPROTO=static
DEFROUTE=yes
IPV4_FAILURE_FATAL=no
IPV6INIT=yes
IPV6_AUTOCONF=yes
IPV6_DEFROUTE=yes
IPV6_FAILURE_FATAL=no
IPV6_ADDR_GEN_MODE=stable-privacy
NAME=ens33
UUID=85cbd491-2694-4d8e-85ed-17d330c9c5fa
DEVICE=ens33
ONBOOT=yes
IPADDR=192.168.100.40
#NETMASK=255.255.255.0 网关和DNF删掉或注释掉
[root@localhost ~]# vim /etc/sysconfig/network-scripts/ifcfg-ens36
TYPE=Ethernet
PROXY_METHOD=none
BROWSER_ONLY=no
BOOTPROTO=static
DEFROUTE=yes
IPV4_FAILURE_FATAL=no
IPV6INIT=yes
IPV6_AUTOCONF=yes
IPV6_DEFROUTE=yes
IPV6_FAILURE_FATAL=no
IPV6_ADDR_GEN_MODE=stable-privacy
NAME=ens36
#UUID=85cbd491-2694-4d8e-85ed-17d330c9c5fa 这里注释掉UUID
DEVICE=ens36
ONBOOT=yes
IPADDR=12.0.0.1
#NETMASK=255.255.255.0
#GATEWAY=12.0.0.2 同样网关和DNS也注释掉
重启一下网卡 查看网卡信息
[root@localhost ~]# systemctl restart network
[root@localhost ~]# ifconfig
ens33: flags=4163 mtu 1500
inet 192.168.100.40 netmask 255.255.255.0 broadcast 192.168.100.255
inet6 fe80::e89:2652:a28a:1391 prefixlen 64 scopeid 0x20
ether 00:0c:29:da:12:c1 txqueuelen 1000 (Ethernet)
RX packets 915 bytes 130373 (127.3 KiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 123 bytes 18646 (18.2 KiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
ens36: flags=4163 mtu 1500
inet 12.0.0.1 netmask 255.0.0.0 broadcast 12.255.255.255
inet6 fe80::1364:2076:640:37ab prefixlen 64 scopeid 0x20
ether 00:0c:29:da:12:cb txqueuelen 1000 (Ethernet)
RX packets 124 bytes 14032 (13.7 KiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 113 bytes 14645 (14.3 KiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
开启路由转发
[root@localhost ~]# vim /etc/sysctl.conf
net.ipv4.ip_forward = 1 #添加
防火墙策略
[root@localhost ~]# iptables -nL #查看规则
Chain INPUT (policy ACCEPT)
target prot opt source destination
Chain FORWARD (policy ACCEPT)
target prot opt source destination
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
[root@localhost ~]# iptables -F #清空规则
[root@localhost ~]# iptables -nL -t nat #查看规则
Chain PREROUTING (policy ACCEPT)
target prot opt source destination
Chain INPUT (policy ACCEPT)
target prot opt source destination
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
Chain POSTROUTING (policy ACCEPT)
target prot opt source destination
[root@localhost ~]# iptables -t nat -A POSTROUTING -s 192.168.100.0/24 -o ens36 -j SNAT --to 12.0.0.1 #添加ens36出站网卡和12.0.0.1外网网卡
[root@localhost ~]# iptables -nL -t nat
Chain PREROUTING (policy ACCEPT)
target prot opt source destination
Chain INPUT (policy ACCEPT)
target prot opt source destination
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
Chain POSTROUTING (policy ACCEPT)
target prot opt source destination
SNAT all -- 192.168.100.0/24 0.0.0.0/0 to:12.0.0.1
加载ip_vs模块,安装ipvsadm工具
[root@localhost network-scripts]# modprobe ip_vs
[root@localhost network-scripts]# cat /proc/net/ip_vs
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActCon
开启ipvsadm服务
使用客户机测试
客户机网关设置为网关服务器的外网网卡,使用浏览器搜索