一. 必备知识
局域网基础和计算机网络7层模型 http://blog.csdn.net/liaomin416100569/article/details/72976270
必须掌握NAT 路由器 网关这些概念
tcp协议相关知识 http://blog.csdn.net/liaomin416100569/article/details/73088297
虚拟机配置三种虚拟网络的知识 自行百度
LVS快速搭建可以使用centos的piranha软件 具体安装自行百度 这里不研究
二概念解析
lvs官网 http://www.linuxvirtualserver.org/
lvs(linux virtual server)提供了三种集群方式
分别是:
- The LVS/NAT working principle and configuration instructions.
- The LVS/TUN working principle and configuration instructions.
- The LVS/DR working principle and configuration instructions.
NAT模式简介
类似于nginx集群 DServer 表示转发服务器 用于控制负载均衡 复杂均衡的存在几种转发算法 dserver必须拥有两个网卡 一个用于公网用户访问Dserver
一个网卡用于连接局域网中其他的Rserver (Real Server) 客户端浏览器访问的公网ip 192.168.88.20 数据包 可能就是 源ip 客户端ip 目标ip Vip 88.20
转发服务器需要定义个路由规则 将发送的数据包 转换为 源ip 客户端ip 目标ip是 后端的Rserver的Rip 才能正常的被后端机器收 后端Rserver返回结果后
DServer需要将源ip修改为公网ip vip 客户端才能接受响应
三 配置过程
1.dserver配置
1.1》配置双网卡 双ip
1.1.1》安装vmware虚拟机 虚拟机安装cenos7 明白三种虚拟网络的方式
。桥接:和window机器的物理网卡进行桥接 桥接后 由物理网卡将当前ip和虚拟机设置的ip 的arp数据分发出去 可以达到让局域网其他主机
访问虚拟机ip的能力
。 NAT 利用WMnet8虚拟网卡作为虚拟路由 虚拟机自动获取ip 会设置网关地址为wmnet8的ip 当虚拟机网络网络时 数据包发送到网关 网关wmnet8
修改数据包的源ip地址 利用window机器上网后返回数据 给虚拟机
。仅主机模式 和NAT一样 虚拟机只能访问主机资源不能联网
1.1.2》安装nat虚拟网卡
虚拟机右键 设置 - 网络适配器 修改为NAT模式
在虚拟机上 可以 ifconfig 查看 发现设备名称eno16777736 自动生成了ip 192.168.58.134
如果没有获取ip 可以通过修改 /etc/sysconfig/network-scripts/ifcfg-eno16777736文件 ONBOOT=yes 表示启动自动获取ip
重启网络服务 service network restart
[root@bogon proc]# ifconfig
eno16777736: flags=4163 mtu 1500
inet 192.168.58.134 netmask 255.255.255.0 broadcast 192.168.58.255
inet6 fe80::20c:29ff:fe49:296c prefixlen 64 scopeid 0x20
ether 00:0c:29:49:29:6c txqueuelen 1000 (Ethernet)
RX packets 1890 bytes 703660 (687.1 KiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 1479 bytes 276286 (269.8 KiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
1.1.3》安装桥接虚拟网卡
虚拟机右键设置 弹出窗口后 添加 选择网络适配器 创建网络适配器2 设置为桥接模式
将桥接虚拟网卡绑定到window机器物理网卡上
虚拟机 菜单 编辑 -虚拟网络编辑器
window物理网卡的ip配置是如下的
当添加好网卡后 在linux上 通过ifconfig 可以看到多了一个网卡
[root@bogon proc]# ifconfig
eno16777736: flags=4163 mtu 1500
inet 192.168.58.134 netmask 255.255.255.0 broadcast 192.168.58.255
inet6 fe80::20c:29ff:fe49:296c prefixlen 64 scopeid 0x20
ether 00:0c:29:49:29:6c txqueuelen 1000 (Ethernet)
RX packets 1977 bytes 712212 (695.5 KiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 1536 bytes 286518 (279.8 KiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
eno33554984: flags=4163 mtu 1500
inet 192.168.16.21 netmask 255.255.255.0 broadcast 192.168.16.255
inet6 fe80::20c:29ff:fe49:2976 prefixlen 64 scopeid 0x20
ether 00:0c:29:49:29:76 txqueuelen 1000 (Ethernet)
RX packets 2157795 bytes 229287748 (218.6 MiB)
RX errors 0 dropped 5331 overruns 0 frame 0
TX packets 537 bytes 1032636 (1008.4 KiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
lo: flags=73 mtu 65536
inet 127.0.0.1 netmask 255.0.0.0
inet6 ::1 prefixlen 128 scopeid 0x10
loop txqueuelen 0 (Local Loopback)
RX packets 33 bytes 3074 (3.0 KiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 33 bytes 3074 (3.0 KiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
可以看到新生成了一个设备eno33554984 ip不是我们想要的 因为上图中 window的ip是192.168.88.20 我这里如果需要这台机器被外部访问 必须
设置为 88段的ip
需要为该网卡配置 静态地址
拷贝一个其他网卡的文件 修改为当前网卡名称
cd /etc/sysconfig/network-scripts
cp ifcfg-eno16777736 ifcfg-eno33554984
cp ifcfg-eno16777736 ifcfg-eno33554984
修改
ifcfg-eno33554984
将BOOTPROTO从dbcp修改为static表示静态ip
NAME=eno33554984 改成当前网卡名
UUID=1c2310e2-e82e-4ce7-a1aa-60d05aa47f2e 随便修改一个字母 唯一的物理地址
DEVICE=eno33554984 改为当前网卡名
UUID=1c2310e2-e82e-4ce7-a1aa-60d05aa47f2e 随便修改一个字母 唯一的物理地址
DEVICE=eno33554984 改为当前网卡名
IPADDR=192.168.88.21 设置静态ip
NETMASK=255.255.255.0 设置子网掩码
GATEWAY=192.168.88.1 设置网关
DNS1=8.8.8.8 设置dns
NETMASK=255.255.255.0 设置子网掩码
GATEWAY=192.168.88.1 设置网关
DNS1=8.8.8.8 设置dns
其中子网掩码和网关和dns都和window机器一样
以下是正确的配置
TYPE=Ethernet
BOOTPROTO=static
NAME=eno33554984
UUID=1c2310e2-e82e-4ce7-a1aa-60d05aa47f2e
DEVICE=eno33554984
ONBOOT=yes
IPADDR=192.168.88.21
NETMASK=255.255.255.0
GATEWAY=192.168.88.1
DNS1=8.8.8.8
重启网络 service network restart
[root@bogon network-scripts]# ifconfig
eno16777736: flags=4163 mtu 1500
inet 192.168.58.134 netmask 255.255.255.0 broadcast 192.168.58.255
inet6 fe80::20c:29ff:fe49:296c prefixlen 64 scopeid 0x20
ether 00:0c:29:49:29:6c txqueuelen 1000 (Ethernet)
RX packets 2233 bytes 737958 (720.6 KiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 1743 bytes 320982 (313.4 KiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
eno33554984: flags=4163 mtu 1500
inet 192.168.88.21 netmask 255.255.255.0 broadcast 192.168.88.255
inet6 fe80::20c:29ff:fe49:2976 prefixlen 64 scopeid 0x20
ether 00:0c:29:49:29:76 txqueuelen 1000 (Ethernet)
RX packets 2316913 bytes 247471207 (236.0 MiB)
RX errors 0 dropped 5815 overruns 0 frame 0
TX packets 537 bytes 1032636 (1008.4 KiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
lo: flags=73 mtu 65536
inet 127.0.0.1 netmask 255.0.0.0
inet6 ::1 prefixlen 128 scopeid 0x10
loop txqueuelen 0 (Local Loopback)
RX packets 33 bytes 3074 (3.0 KiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 33 bytes 3074 (3.0 KiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
此时 88.21ip配置成功 随便找一台window机器 ping以下 88.21 成功
1.1.4配置路由规则
查看 more /etc/sysctl.conf
net.ipv4.ip_forward = 1 该参数表示开启路由转发功能 访问88.21数据后 将数据转换后转发给局域网网卡58.134
sysctl -p 参数生效
如果不存在或者为0 修改为1 表示可以在不同网卡间进行路由转发
ipvs和参数foward功能图解
ipvsadm实际上就是对数据包的过滤 当客户端发送数据请求到 88.20网卡时 ipvs拦截 通过负载均衡调度算法获取到一台Rserver后
将数据包 修改为 目标ip为 计算后的RServerip 因为开启了
net.ipv4.ip_forward = 1 所以知道目标地址为58 段 自动将数据包forward到
58.134的网卡 因为Rserver的ip和该网卡处于同一网段所以 通过Dip发送数据包到Rip
在同时使用ip 192.168.88.21和192.168.58.134的Dserver上 配置lvs 安装ipvs软件
yum -y install ipvsadm
#清空所有的路由规则
ipvsadm -C
#添加一个集群
192.168.88.21:80 必须是外网ip 也就是vip 因为别人才可以访问 rr表示轮询
ipvsadm -A -t 192.168.88.21:80 -s rr
ipvsadm -A -t 192.168.88.21:80 -s rr
#给集群添加一个主机 Rserver
192.168.58.135:80和192.168.58.136:80 这两台机各自部署一个tomcat
ipvsadm -a -t 192.168.88.21:80 -r 192.168.58.135:80 -m
ipvsadm -a -t 192.168.88.21:80 -r 192.168.58.136:80 -m
ipvsadm -a -t 192.168.88.21:80 -r 192.168.58.135:80 -m
ipvsadm -a -t 192.168.88.21:80 -r 192.168.58.136:80 -m
常用的ipvsadm命令
集群命令
添加 ipvsadm -A -t 192.168.88.21:80 -s rr
修改 ipvsadm -E -t 192.168.88.21:80 -s wrr
删除 ipvsadm -D -t 192.168.88.21:80
后台主机管理命令
添加 ipvsadm -a -t 192.168.88.21:80 -r 192.168.58.135:80 -m (-m表示是nat集群 -g是dr -w int 设置权重)
修改 ipvsadm -e -t 192.168.88.21:80 -r 192.168.58.135:80 –m -w 3
删除 ipvsadm -d -t 192.168.88.21:80 -r 192.168.58.135:80
查看集群
ipvadm -L -n
将路由规则保存到文件中
service ipvsadm save
8种调度算法
1. 轮叫调度 rr
这种算法是最简单的,就是按依次循环的方式将请求调度到不同的服务器上,该算法最大的特点就是简单。轮询算法假设所有的服务器处理请求的能力都是一样的,调度器会将所有的请求平均分配给每个真实服务器,不管后端 RS 配置和处理能力,非常均衡地分发下去。
2. 加权轮叫 wrr
这种算法比 rr 的算法多了一个权重的概念,可以给 RS 设置权重,权重越高,那么分发的请求数越多,权重的取值范围 0 – 100。主要是对rr算法的一种优化和补充, LVS 会考虑每台服务器的性能,并给每台服务器添加要给权值,如果服务器A的权值为1,服务器B的权值为2,则调度到服务器B的请求会是服务器A的2倍。权值越高的服务器,处理的请求越多。
3. 最少链接 lc
这个算法会根据后端 RS 的连接数来决定把请求分发给谁,比如 RS1 连接数比 RS2 连接数少,那么请求就优先发给 RS1
4. 加权最少链接 wlc
这个算法比 lc 多了一个权重的概念。
5. 基于局部性的最少连接调度算法 lblc
这个算法是请求数据包的目标 IP 地址的一种调度算法,该算法先根据请求的目标 IP 地址寻找最近的该目标 IP 地址所有使用的服务器,如果这台服务器依然可用,并且有能力处理该请求,调度器会尽量选择相同的服务器,否则会继续选择其它可行的服务器
6. 复杂的基于局部性最少的连接算法 lblcr
记录的不是要给目标 IP 与一台服务器之间的连接记录,它会维护一个目标 IP 到一组服务器之间的映射关系,防止单点服务器负载过高。
7. 目标地址散列调度算法 dh
该算法是根据目标 IP 地址通过散列函数将目标 IP 与服务器建立映射关系,出现服务器不可用或负载过高的情况下,发往该目标 IP 的请求会固定发给该服务器。
8. 源地址散列调度算法 sh
与目标地址散列调度算法类似,但它是根据源地址散列算法进行静态分配固定的服务器资源
2.rserver配置
》配置tomcat
两台ip为 192.168.58.135和 192.168.58.136安装tomcat配置端口为80 启动
》配置ip 设置网关为DIP
将135和136的ip都设置为静态ip 并且将网关设置为 转发服务器的dip 也就是 58.134
58.135和58,.136设置为 对应的ip
在任意88段网络任意网络 http://192.168.88.21/ 正常访问
TYPE=Ethernet
BOOTPROTO=static
NAME=eno16777736
UUID=1c2310e2-e82e-4ce7-a1aa-60d05aa47f1e
DEVICE=eno16777736
ONBOOT=yes
IPADDR=192.168.58.135
NETMASK=255.255.255.0
GATEWAY=192.168.58.134
~
~