Linux 集群化
文章目录
一、集群概述
1.1 集群是什么?
定义: 集群是一组协同工作的服务器,各有分工,对外表现为一个整体。
集群的意义: 更好的利用现有资源实现服务的高度可用
集群扩展方式
- 垂直扩展:更换服务器硬件
- 水平扩展:添加更多的服务器节点
集群与分布式的区别
分布式: 多台计算机干一件事,服务是分散部署在不同的机器上,多台服务器合起来跑的才是一套完整代码,这就叫分布式。
集群: 多台计算机干同样的事,多台服务器跑的都是一套完整的代码,这就叫集群
- 相同点:分布式和集群都是需要有很多节点服务器通过网络协同工作完成整体的任务目标。
- 不同点:分布式是指将业务系统进行拆分,即分布式的每一个节点都是实现不同的功能。而集群每个节点做的是同一件事情。
常见的集群拓扑

1.2 集群的分类
负载均衡集群 – LBC: 分担服务的总体压力
高可用集群 – HAC: 尽可能的保障服务状态的可用性
高性能运算集群 – HPC: 提供单台服务器提供不了的计算能力
1.2.1 负载均衡集群 – LBC
使用意图: 减轻单台服务器的压力,将用户请求分担给多台主机一起处理
实现方法
- 软件:LVS、 RAC、 Nginx
- 硬件:F5、 BIG-IP
负载均衡集群架构拓扑

调度器分类
- 触发条件不同
- 四层:传输层 IP+PORT
- 七层:应用层 URL
- 实现原理不同
- 四层:TCP 连接只建立一次,客户端和正式服务器
- 七层:TCP 连接建立两次,客户端和负载调度器 负载调度器和真实服务器
- 实现场景不同
- 四层:TCP 应用 如:基于 C/S 机构的 ERP 系统
- 七层:HTTP 应用 如:根据用户访问域名的方式,判断用户语言
- 安全性不同
- 四层:转发 SYN 攻击
- 七层:可以拦截 SYN 攻击

数据链路层(F5),传输层,应用层可以进行负载均衡。
使用范围: 业务并发较大的应用程序
1.2.2 高可用集群 – HAC
使用意图: 最大限度的保证用户的应用持久,不间断的提供服务
最大限度
99% 99 87.6 小时
99.9% 999 8.8 小时
99.99% 9999 53 分钟
99.999% 99999 5 分钟
实现原理: 心跳检测
实现方法
- 软件:
- heartbeat linux-HA
- RHCS
- ROSE
- keepalived
- 硬件:
- F5
特殊情况: 脑分裂
- 可能出现的问题:数据不完整、数据不可访问
- 解决方法:预防:冗余、强制隔离:电源交换机
使用范围: 需要持续提供服务的应用程序
1.2.3 高性能运算集群 – HPC
使用意图: 提供单台计算机所不具备的计算能力
LBC 与 HAC 的原理对比:
- 负载均衡集群通过
提高单位时间内执行的任务数来提升效率 - 高性能运算集群通过
缩短单个任务的执行时间来提高效率
使用范围: 天气计算、火箭弹道演算
二、负载均衡集群
2.1 LVS 相关原理
LVS简介
LVS(Linux Virtual Server)即Linux虚拟服务器,是由章文嵩博士主导的开源负载均衡项目,目前LVS已经被集成到Linux内核模块中。该项目在Linux内核中实现了基于IP的数据请求负载均衡调度方案,LVS在四层传出层
LVS 的组成
- IPVS:运行在内核空间 (ipvs称之为
IP虚拟服务器(IP Virtual Server,简写为IPVS)。是运行在LVS下的提供负载平衡功能的一种技术。)主要用于使用户定义的策略生效 - IPVSADM:运行在用户空间,管理集群服务的命令行工具
LVS 的原理: 根据用户请求的套接字判断,分流至真实服务器的工作模块

LVS只做了简单的地址信息的更改,并没有涉及真实的流量转发
- 当用户向负载均衡调度器(Director Server)发起请求,调度器将请求发往至内核空间
- PREROUTING链首先会接收到用户请求,判断目标IP确定是本机IP,将数据包发往INPUT链
- IPVS是工作在INPUT链上的,当用户请求到达INPUT时,IPVS会将用户请求和自己已定义好的集群服务进行比对,如果用户请求的就是定义的集群服务,那么此时IPVS会强行修改数据包里的目标IP地址及端口,并将新的数据包发往POSTROUTING链
- POSTROUTING链接收数据包后发现目标IP地址刚好是自己的后端服务器,那么此时通过选路,将数据包最终发送给后端的服务器
2.2 LVS 工作方式

首先掌握几个术语,方便下边的理解:
DS:(director server)负载均衡服务器
RS:(real server)真实服务器
DIR: (director server IP)地址
VIP: (外部网络访问的IP地址)虚拟IP地址
RIP:(real server IP)真实服务器IP地址
CIP: 客户端IP地址
2.2.1 LVS – DR(Direct Routing)直接路由模式
DR模式是通过改写请求报文的目标MAC地址,将请求发给真实服务器的,而真实服务器响应后的处理结果直接返回给客户端用户。
工作逻辑图

工作原理:
DR模式将报文直接路由给目标真实服务器。
- 在DR模式中,调度器根据各个真实服务器的负载情况,连接数多少等,动态地选择一台服务器,不修改目标IP地址和目标端口,也不封装IP报文,而是将请求报文的数据帧的目标MAC地址改为真实服务器的MAC地址。
- 然后再将修改的数据帧在服务器组的局域网上发送。因为数据帧的MAC地址是真实服务器的MAC地址,并且又在同一个局域网。那么根据局域网的通讯原理,真实复位是一定能够收到由LB发出的数据包。真实服务器接收到请求数据包的时候,解开IP包头查看到的目标IP是VIP。(此时只有自己的IP符合目标IP才会接收进来,所以我们需要在本地的回环借口上面配置VIP。另:由于网络接口都会进行ARP广播响应,但集群的其他机器都有这个VIP的lo接口,都响应就会冲突。所以我们需要把真实服务器的lo接口的ARP响应关闭掉。)
- 然后真实服务器做成请求响应,之后根据自己的路由信息将这个响应数据包发送回给客户,并且源IP地址还是VIP。
模式特点
- 集群节点,必须在一个网络中
- 真实服务器网关指向路由器
- RIP 既可以是私网地址,又可以是公网地址
- 负载调度器只负责入站请求
- 大大减轻负载调度器压力,支持更多的服务器节点
2.2.2 LVS – NAT(隧道)模式

通过网络地址转换的方法来实现调度的。首先调度器(LB)接收到客户的请求数据包时(请求的目的IP为VIP),根据调度算法决定将请求发送给哪个后端的真实服务器(RS)。然后调度就把客户端发送的请求数据包的目标IP地址及端口改成后端真实服务器的IP地址(RIP),这样真实服务器(RS)就能够接收到客户的请求数据包了。真实服务器响应完请求后,查看默认路由(NAT模式下我们需要把RS的默认路由设置为LB服务器。)把响应后的数据包发送给LB,LB再接收到响应包后,把包的源地址改成虚拟地址(VIP)然后发送回给客户端。
工作原理:
-
客户端请求数据,目标IP为VIP
-
请求数据到达LB服务器,LB根据调度算法将目的地址修改为RIP地址及对应端口(此RIP地址是根据调度算法得出的。)并在连接HASH表中记录下这个连接。
-
数据包从LB服务器到达RS服务器webserver,然后webserver进行响应。Webserver的网关必须是LB,然后将数据返回给LB服务器。
-
收到RS的返回后的数据,根据连接HASH表修改源地址VIP&目标地址CIP,及对应端口80.然后数据就从LB出发到达客户端。
-
客户端收到的就只能看到VIP\DIP信息。
模式特点
- 集群节点,必须在一个网络中
- 真实服务器必须将网关指向负载调度器
- RIP 通常都是私有 IP,仅用于各个集群节点通信
- 负载调度器必须位于客户端和真实服务器之间,充当网关
- 支持端口映射
- 负载调度器操作系统必须是 Linux ,真实服务器可以使用任意系统
- 进出数据报文都要经过负载调度器机器,压力较大
2.2.3 LVS – TUN(网络地址转换)模式

采用NAT模式时,由于请求和响应的报文必须通过调度器地址重写,当客户请求越来越多时,调度器处理能力将成为瓶颈。为了解决这个问题,调度器把请求的报文通过IP隧道转发到真实的服务器。真实的服务器将响应处理后的数据直接返回给客户端。这样调度器就只处理请求入站报文,由于一般网络服务应答数据比请求报文大很多,采用VS/TUN模式后,集群系统的最大吞吐量可以提高10倍。
工作原理:
-
客户请求数据包,目标地址VIP发送到LB上。
-
LB接收到客户请求包,进行IP Tunnel封装。即在原有的包头加上IP Tunnel的包头。然后发送出去。
-
RS节点服务器根据IP Tunnel包头信息(此时就又一种逻辑上的隐形隧道,只有LB和RS之间懂)收到请求包,然后解开IP Tunnel包头信息,得到客户的请求包并进行响应处理。
-
响应处理完毕之后,RS服务器使用自己的出公网的线路,将这个响应数据包发送给客户端。源IP地址还是VIP地址。
模式特点
- 集群节点不必位于同一个物理网络但必须都拥有公网 IP(或都可以被路由)
- 真实服务器不能将网管指向负载调度器
- RIP 必须是公网地址
- 负载调度器只负责入站请求
- 不支持端口映射功能
- 发送方和接收方必须支持隧道功能
2.3 LVS 实验构建
环境构建
ip地址网段 10.10.10.0/24 255.255.255.0
10.10.10.11 12 依次排列 共6台
VMware
网络类型: 仅主机
【编辑】----【虚拟网络编辑器】----【添加网络】添加一块仅主机的网卡。关闭DHCP服务,子网改成10.10.10.0,然后将虚拟机选择此网卡,添加两块网卡,双网卡仅主机类型,安装图形界面


操作系统
centos6.8
ip地址修改
[root@localhost ~]$ echo "root" | passwd --stdin root #修改密码为root
[root@localhost ~]$ vim /etc/sysconfig/network-scripts/ifcfg-eth0
DEVICE=eth0
HWADDR=00:0C:29:5F:75:3B
TYPE=Ethernet
UUID=8ad7de61-0b7c-433c-b7c0-03dd42eec9ea
ONBOOT=yes #开机自启,改为yes
NM_CONTROLLED=yes
BOOTPROTO=static #修改此处,改为static
IPADDR=10.10.10.11 #ip地址,12,13,14依次排列
NETMASK=255.255.255.0 #子网掩码
调成字符页面,ctrl+alt+f3,有的还需要加个fn
默认启动字符界面
[root@localhost ~]$ vim /etc/inittab
...
# Default runlevel. The runlevels used are:
# 0 - halt (Do NOT set initdefault to this)
# 1 - Single user mode
# 2 - Multiuser, without NFS (The same as 3, if you do not have networking)
# 3 - Full multiuser mode
# 4 - unused
# 5 - X11
# 6 - reboot (Do NOT set initdefault to this)
#
id:3:initdefault: #5改为3
关闭防火墙
[root@localhost ~]$ iptables -F && service iptables save && chkconfig iptables off
[root@localhost ~]$ iptables -L
关闭selinux
[root@localhost ~]$ setenforce 0 && sed -i 's/^SELINUX=.*/SELINUX=disabled/' /etc/selinux/config
[root@localhost ~]$ getenforce
配置yum源
设置yum源可以参考之前的文章
https://blog.csdn.net/w918589859/article/details/109191537
右击虚拟机——进入“虚拟机设置”——点击“CD/DVD(IDE)”——点击“浏览”——选中安装时的镜像——勾选上“已连接”——确定
[root@localhost ~]$ mkdir /mnt/cdrom
[root@localhost ~]$ mount -t iso9660 /dev/cdrom /mnt/cdrom
mount: block device /dev/sr0 is write-protected, mounting read-only
#出现这个表示成功
[root@localhost ~]$ cd /etc/yum.repos.d/
[root@localhost ~]$ mkdir back && mv * back
[root@localhost ~]$ cp -a back/CentOS-Media.repo .
[root@localhost ~]$ vim CentOS-Media.repo
[c6-media]
name=CentOS-$releasever - Media
baseurl=file:///mnt/cdrom
#只保留一个即可,多余的可以删除
gpgcheck=0
enabled=1
#把enabled=0改为enabled=1,让这个yum源配置文件生效
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-6
[root@localhost ~]$ yum clean all
[root@localhost ~]$ yum update
[root@localhost ~]$ yum -y install gcc* lrzsz
如果复制的虚拟机启动网卡报错 no device found for connection 'System eth0'
解决办法
[root@localhost ~]$ vim /etc/sysconfig/network-scripts/ifcfg-eth0
DEVICE=eth0
#HWADDR=00:0C:29:5F:75:3B 删除mac地址
TYPE=Ethernet
UUID=8ad7de61-0b7c-433c-b7c0-03dd42eec9ea
ONBOOT=yes #开机自启,改为yes
NM_CONTROLLED=yes
BOOTPROTO=static #修改此处,改为static
IPADDR=10.10.10.12 #ip地址,12,13,14依次排列
NETMASK=255.255.255.0 #子网掩码
[root@localhost ~]$ rm -f /etc/udev/rules.d/70-persistent-net.rules
#删除这个文件,重启即可
三台机器在虚拟机都保存一个快照
2.3.1 LVS – DR 模式集群构建
实验架构图

大致流程
c发送一个数据包,源地址是10.10.10.240,目标地址是10.10.10.100,在当前广播域中,数据包会被发送到负载调度器,负载调度器会根据算法进行修改DMAC(目的MAC),修改完之后会被扔回广播域,回到RS1,为了使RS1能够接受数据,开启一个lo:0 10.10.10.100的接口(相当于起了个小名),这样的话,当前广播域中会存在多个相同的ip地址,会引起ip地址冲突,为了解决这个问题,可以修改ARP(地址解析协议,根据IP地址获取物理地址的一个TCP/IP协议)的通信行为,然后 lo 配置路由规则拿到数据报文,回信给客户端
ARP修改
ARP响应级别
arp-ignore
0只要本机配置有相应IP地址就响应
1仅在请求的目标地址配置在请求到达的网络接口上时,才给予响应
ARP通告行为
arp-announce
0将本机任何网络接口上的任何地址都向外通告
1尽可能避免像目标网络通告与其网络不匹配的地址信息表2仅向目标网络通告与其网络相匹配的地址信息
此次试验需要配置三台服务器
10.10.10.11
10.10.10.12
10.10.10.13
本机地址
10.10.10.240
2.3.1.1 负载调度器 (10.10.10.11)
#这两条命令三台服务器都执行,最小化安装没有此服务
[root@localhost ~]$ service NetworkManager stop # 关闭网卡守护进程
[root@localhost ~]$ chkconfig NetworkManager off
开启子接口
[root@localhost ~]$ cd /etc/sysconfig/network-scripts/
[root@localhost ~]$ cp -a ifcfg-eth0 ifcfg-eth0:0
# 拷贝 eth0 网卡子接口充当集群入口接口
[root@localhost ~]$ vim ifcfg-eth0:0 #vim !$ 上一个命令最后一条参数
#修改成下面一样
DEVICE=eth0:0
ONBOOT=yes
BOOTPROTO=static
IPADDR=10.10.10.100
NETMASK=255.255.255.0
#当做集群的ip,VIP,提供给web用户访问的接口
[root@localhost ~]$ service network restart
正在关闭接口 eth0: [确定]
关闭环回接口: [确定]
弹出环回接口: [确定]
弹出界面 eth0: Determining if ip address 10.10.10.11 is already in use for device eth0...
Determining if ip address 10.10.10.100 is already in use for device eth0...
[确定]
修改内核配置文件
[root@localhost ~]$ 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@localhost ~]$ sysctl -p #重新加载配置文件
安装ipvsadm
[root@localhost ~]$ yum -y install ipvsadm #报错的话重新挂载镜像
[root@localhost ~]$ ipvsadm -Ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
添加ipvs规则
[root@localhost ~]$ ipvsadm -v # 查看当前 ipvs 集群内容
#ipvsadm -A -t 虚拟 IP:80 -s rr
#添加 ipvs TCP 集群,-A添加一个集群,-t TCP协议,-s 指定算法,rr轮询
[root@localhost ~]$ ipvsadm -A -t 10.10.10.100:80 -s rr
#ipvsadm -a -t 虚拟 IP:80 -r 网站1:80 -g
#添加 ipvsadm 集群子节点 ,-a 集群子节点,-r 真实服务器,-g DR模式
#ipvsadm -a -t 虚拟 IP:80 -r 网站2:80 -g
[root@localhost ~]$ ipvsadm -a -t 10.10.10.100:80 -r 10.10.10.12:80 -g
[root@localhost ~]$ ipvsadm -a -t 10.10.10.100:80 -r 10.10.10.13:80 -g
[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 10.10.10.100:80 rr
-> 10.10.10.12:80 Route 1 0 0
-> 10.10.10.13:80 Route 1 0 0
[root@localhost ~]$ service ipvsadm save # 保存 ipvs 集群内容至文件,进行持久化存储
[root@localhost ~]$ chkconfig ipvsadm on # 设置为开机自启
[root@localhost ~]$ ipvsadm -Ln --stats #查看状态
2.3.1.2 真实服务器(10.10.10.12、13 )
两台服务器做相同的步骤,另一台的网页内容不一样,其余全部一样
[root@localhost ~]$ service httpd start #启动apache服务器
[root@localhost ~]$ echo "this is server 1" >> /var/www/html/index.html
#另一台服务是this is server 2
[root@localhost ~]$ curl localhost
this is server 1
#生产环境两台服务器的网页内容是一样的
开启回环网卡接口
# 关闭网卡守护进程
[root@localhost ~]$ service NetworkManager stop && chkconfig NetworkManager off
[root@localhost ~]$ cd /etc/sysconfig/network-scripts/
[root@localhost ~]$ cp -a ifcfg-lo ifcfg-lo:0
# 拷贝回环网卡子接口
[root@localhost ~]$ vim ifcfg-lo:0 #vim !$ 上一个命令最后一条参数
#修改成下面一样
DEVICE=lo:0 #修改这里
IPADDR=10.10.10.100 #修改这里
NETMASK=255.255.255.255 #修改这里
NETWORK=127.0.0.0
# If you're having problems with gated making 127.0.0.0/8 a martian,
# you can change this to something else (255.255.255.255, for example)
BROADCAST=127.255.255.255
ONBOOT=yes
NAME=loopback
修改内核配置文件
[root@localhost ~]$ vim /etc/sysctl.conf #关闭对应 ARP 响应及公告功能
#最后一行添加
# LVS - 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@localhost ~]$ sysctl -p #重新加载配置文件
[root@localhost ~]$ ifup lo:0 #启动回环网卡
[root@localhost ~]$ ifconfig
...
lo:0 Link encap:Local Loopback
inet addr:10.10.10.100 Mask:255.255.255.255
UP LOOPBACK RUNNING MTU:65536 Metric:1
添加路由记录,当访问 VIP 交给 lo:0 网卡接受
[root@localhost ~]$ route add -host 10.10.10.100 dev lo:0
[root@localhost ~]$ route -n
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
10.10.10.100 0.0.0.0 255.255.255.255 UH 0 0 0 lo
10.10.10.0 0.0.0.0 255.255.255.0 U 0 0 0 eth0
169.254.0.0 0.0.0.0 255.255.0.0 U 1002 0 0 eth0
#添加到开机自启,防止失效
[root@localhost ~]$ echo "route add -host 10.10.10.100 dev lo:0" >> /etc/rc.local
浏览器输入10.10.10.100访问


2.3.2 LVS – NAT 模式集群构建
实验架构图
c发送一个数据包,源地址是20.20.20.22,目标地址是20.20.20.11,负载调度器LVS组件会根据DNAT转换把ip地址修改为服务器的地址,RS1收到数据包后,回信给网关负载调度器10.10.10.11,为了保证源地址一致性,采用了SNAT转换
修改客户端的ip
【网络适配器】—找到VMnet1的网卡【属性】–【IPv4协议】—【高级】—添加一个20.20.20.22的ip地址
三台虚拟机都恢复快照
2.3.2.1 负载调度器(10.10.10.11)
[root@localhost ~]$ service NetworkManager stop && chkconfig NetworkManager off# 关闭网卡守护进程
[root@localhost ~]$ cd /etc/sysconfig/network-scripts/
[root@localhost ~]$ vim ifcfg-eth1
DEVICE=eth1
HWADDR=00:0C:29:0A:56:38
TYPE=Ethernet
UUID=ea68e93b-9aff-4379-b5a8-abac819dcd3b
ONBOOT=yes
NM_CONTROLLED=yes
BOOTPROTO=static
IPADDR=10.10.10.11
NETMASK=255.255.255.0
[root@localhost ~]$ vim ifcfg-eth0
DEVICE=eth0
HWADDR=00:0C:29:0A:56:2E
TYPE=Ethernet
UUID=b1f0c82e-6315-4827-91f7-8a5f8fa0b929
ONBOOT=yes
NM_CONTROLLED=yes
BOOTPROTO=static
IPADDR=20.20.20.11
NETMASK=255.255.255.0
[root@localhost ~]$ service network restart
[root@localhost ~]$ ifconfig
eth0 Link encap:Ethernet HWaddr 00:0C:29:0A:56:2E
inet addr:20.20.20.11 Bcast:20.20.20.255 Mask:255.255.255.0
inet6 addr: fe80::20c:29ff:fe0a:562e/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:987 errors:0 dropped:0 overruns:0 frame:0
TX packets:1109 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:84594 (82.6 KiB) TX bytes:204436 (199.6 KiB)
eth1 Link encap:Ethernet HWaddr 00:0C:29:0A:56:38
inet addr:10.10.10.11 Bcast:10.10.10.255 Mask:255.255.255.0
inet6 addr: fe80::20c:29ff:fe0a:5638/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:45 errors:0 dropped:0 overruns:0 frame:0
TX packets:27 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:3570 (3.4 KiB) TX bytes:3512 (3.4 KiB)
lo Link encap:Local Loopback
inet addr:127.0.0.1 Mask:255.0.0.0
inet6 addr: ::1/128 Scope:Host
UP LOOPBACK RUNNING MTU:65536 Metric:1
RX packets:12 errors:0 dropped:0 overruns:0 frame:0
TX packets:12 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:1000 (1000.0 b) TX bytes:1000 (1000.0 b)
安装 ipvsadm 命令行工具
[root@localhost ~]$ mount -t iso9660 /dev/cdrom /mnt/cdrom #挂载光盘
[root@localhost ~]$ yum -y install ipvsadm
[root@localhost ~]$ vim /etc/sysctl.conf # 开启路由转发功能
# Controls IP packet forwarding
#修改此处
net.ipv4.ip_forward = 1
[root@localhost ~]$ sysctl -p
修改防火墙
[root@localhost ~]$ service iptables start && chkconfig iptables on
[root@localhost ~]$ iptables -F #清空规则
[root@localhost ~]$ iptables -t nat -A POSTROUTING -s 10.10.10.0/24 -o eth0 -j SNAT --to-source 20.20.20.11
# 添加防火墙记录,当源地址是 内网网段 并且出口网卡为 eth0 的时候进行 SNAT 转换, 转换源地址为外网卡地址
[root@localhost ~]$ iptables -t nat -L # 查看记录是否保存成功
Chain PREROUTING (policy ACCEPT)
target prot opt source destination
Chain POSTROUTING (policy ACCEPT)
target prot opt source destination
SNAT all -- 10.10.10.0/24 anywhere to:20.20.20.11
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
[root@localhost ~]$ service iptables save
[root@localhost ~]$ iptables -t nat -D POSTROUTING 1 #删除规则
添加ipvs规则
[root@localhost ~]$ ipvsadm -A -t 20.20.20.11:80 -s rr
# 添加 ipvsadm TCP 集群
[root@localhost ~]$ ipvsadm -a -t 20.20.20.11:80 -r 10.10.10.12:80 -m
[root@localhost ~]$ ipvsadm -a -t 20.20.20.11:80 -r 10.10.10.13:8080 -m
# 添加 ipvsadm 节点,-m nat模式
[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 20.20.20.11:80 rr
-> 10.10.10.12:80 Masq 1 0 0
-> 10.10.10.13:8080 Masq 1 0 0
[root@localhost ~]$ service ipvsadm save # 保存 ipvs 集群设置到文件进行持久化
[root@localhost ~]$ service ipvsadm start && chkconfig ipvsadm on
2.3.2.2 真实服务器(10.10.10.12、13)
两台真实服务器都需要操作
[root@localhost ~]$ service NetworkManager stop && chkconfig NetworkManager off
[root@localhost ~]$ echo "GATEWAY=10.10.10.11" >> /etc/sysconfig/network-scripts/ifcfg-eth0
#添加网关指向负载调度器
[root@localhost ~]$ service network restart
[root@localhost ~]$ route -n
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use
0.0.0.0 10.10.10.11 0.0.0.0 UG 0 0 0 eth0
#去任何地址都交给10.10.10.11
[root@localhost ~]$ service httpd start && chkconfig httpd on # 开启 Apache 服务器
[root@localhost ~]$ echo "111111" >> /var/www/html/index.html
# echo "222222" >> /var/www/html/index.html 10.13服务的是222222
修改10.10.10.13服务器的httpd.conf文件
[root@localhost ~]$ vim /etc/httpd/conf/httpd.conf
#Listen 12.34.56.78:80
Listen 8080 #修改成8080
[root@localhost ~]$ service httpd restart
浏览器输入20.20.20.11访问或者使用curl 20.20.20.11

TUN 模式不常用,这里就不做实验了,构建可自行百度
2.4 负载均衡集群相关调度算法
2.4.1 静态调度算法
特点: 只根据算法本身去调度,不考虑服务器本身(服务器压力,性能)
算法说明
- RR 轮询: 将每次用户的请求分配给后端的服务器,从第一台服务器开始到第 N 台结束, 然后循环
- WRR 加权轮询: 按照权重的比例实现在多台主机之间进行调度 ,当前连接数除以权重,权重相当于分母
- SH(source hash)源地址散列: 将同一个 IP 的用户请求,发送给同一个服务器
- DH(destination hash)目标地址散列: 将同一个目标地址的用户请求发送给同一个真实服务 器(常见在缓存服务器使用,提高缓存的命中率)
2.4.2 动态调度算法
http 连接
活动连接
正在传输数据
非活动连接
刚建立握手还没有传输数据
传输数据完毕,还没有来的及断开
特点: 除了考虑算法本身,还要考虑服务器状态
算法说明
- LC(lest-connection)最少连接: 将新的连接请求,分配给连接数最少的服务器
活动连接 × 256 + 非活动连接 - WLC 加权最少连接: 特殊的最少连接算法,权重越大承担的请求数越多
(活 动连接 × 256 + 非活动连接 ) / 权重 - SED 最短期望延迟: 特殊的 WLC 算法
(活动连接 + 1) * 256 / 权重 - NQ 永不排队: 特殊的 SED 算法,无需等待,如果有真实服务器的连接数等于 0 那就直接 分配不需要运算
- LBLC 特殊的 DH 算法: 即能提高缓存命中率,又要考虑服务器性能
- LBLCR LBLC+缓存: 尽可能提高负载均衡和缓存命中率的折中方案
2.5 LVS 持久连接
2.5.1 持久客户端连接
定义: 每客户端持久;将来自于同一个客户端的所有请求统统定向至此前选定的 RS;也就是只要 IP 相同,分配的服务器始终相同
[root@localhost ~]$ ipvsadm -A -t 172.16.0.8:0 -s wlc -p 120
# 添加一个 tcp 负载集群,集群地址为 172.16.0.8 , 算法为 wlc,持久化时间为 120s
2.5.2 持久端口连接
定义: 每端口持久;将来自于同一个客户端对同一个服务(端口)的请求,始终定向至此前选定的 RS
[root@localhost ~]$ ipvsadm -A -t 172.16.0.8:80 -s rr -p 120
# 添加一个 tcp 负载集群,集群地址为 172.16.0.8:80 , 算法为 wlc,持久化时间为 120s
2.5.3 持久防火墙标记连接
定义: 将来自于同一客户端对指定服务(端口)的请求,始终定向至此选定的 RS;不过它可以将两个毫 不相干的端口定义为一个集群服务
[root@localhost ~]$ iptables -t mangle -A PREROUTING -d 172.16.0.8 -p tcp --dport 80 -j MARK --set-mark 10
# 添加 一个防火墙规则,当目标地址为 172.16.0.8 并且 目标端口为 80 时给数据包打一个标记,设置 mark 值为 10
[root@localhost ~]$ iptables -t mangle -A PREROUTING -d 172.16.0.8 -p tcp --dport 443 -j MARK --set-mark 10
# 添加 一个防火墙规则,当目标地址为 172.16.0.8 并且 目标端口为 443 时给数据包打一个标记,设置 mark 值为 10 service iptables save # 保存防火墙规则持久化生效
[root@localhost ~]$ ipvsadm -A -f 10 -s wlc -p 120
# 添加一个负载调度器,当 mark 值为 10 时进行负载均衡使用 wlc 算法,持久化生效时间为 120s
三、高可用集群
高可用集群是指以减少服务中断时间为目的的服务器集群技术。它通过保护用户的业务程序对外不间断提供的服务,把因软件/硬件/人为造成的故障对业务的影响降低到最小程度。高可用集群的应用系统有多样化发展趋势,用途也越来越多样化,同时带来了配置及可操作性方面的复杂性,因此选择好的高可用软件至关重要。
3.1 Keepalived 相关说明
官方网站:https://www.keepalived.org/
3.1.1 Keepalived 相关介绍
Keepalived 简介
Keepalived起初是为LVS设计的,专门用来监控集群系统中各个服务节点的状态,它根据TCP/IP参考模型的第三、第四层、第五层交换机制检测每个服务节点的状态,如果某个服务器节点出现异常,或者工作出现故障,Keepalived 将检测到,并将出现的故障的服务器节点从集群系统中剔除,这些工作全部是自动完成的,不需要人工干涉,需要人工完成的只是修复出现故障的服务节点。
后来 Keepalived 又加入了VRRP的功能,VRRP(VritrualRouterRedundancyProtocol,虚拟路由冗余协议)出现的目的是解决静态路由出现的单点故障问题,通过VRRP可以实现网络不间断稳定运行,因此 Keepalvied 一方面具有服务器状态检测和故障隔离功能,另外一方面也有 HAcluster 功能。
Keepalived 软件主要是通过VRRP协议实现高可用功能的,VRRP是Virtual Router Redundancy Protocol(虚拟路由器冗余协议)的缩写.VRRP出现的目的就是为了解决静态路由单点故障问题的
VRRP 简介
虚拟路由器冗余协议(VRRP)是一种选择协议,它可以把一个虚拟路由器的责任动态分配到局域网上的 VRRP 路由器中的一台。控制虚拟路由器 IP 地址的 VRRP 路由器称为主路由器,它负责转发数据包到这些虚拟 IP 地址。一旦主路由器不可用,这种选择过程就提供了动态的故障转移机制,这就允许虚拟路由器的 IP 地址可以作为终端主机的默认第一跳路由器。使用 VRRP 的好处是有更高的默认路径的可用性而无需在每个终端主机上配置动态路由或路由发现协议。 VRRP 包封装在 IP 包中发送。
keepalived主要功能
对RealServer进行健康状态检查,支持3层、4层、7层协议进行健康检查;并支持VRRP冗余协议,所以keepalived两个功能是监控检查,VRRP冗余协议;
keepalived的作用
检查web服务器的状态,如果有一台web服务器/mysql服务器宕机或故障,keepalived将故障节点从系统中剔除,当故障恢复的时候自动加入服务器集群中,非常智能化,只需要手动修复坏的节点即可。
keepalived的layer3、4、7层分别是IP层、传输层、应用层的实现原理如下:
-
layer3: keepalived定期向集群中服务器发送ICMP的包,如果发现哪台ping不通,便报告这台服务器失效,并将其剔除集群;(判断标准为IP是否有效)
-
layer4: 主要以TCP端口(也可以是udp)状态来决定服务器工作是否正常,如web服务器的80端口如果没有工作,则将其剔除集群(判断标准为端口)
-
layer7: 应用层,keepalived将根据用户的设定,检查服务器程序的运行是否正常,如果不是设定值,则将其剔除集群(判断标准为程序是否正常)
3.1.1 Keepalived 实现原理
一主 + 多备,共用同一个 IP 地址,但优先级不同

漂移地址: 主机地址会发生切换
keepalived VRRP原理
(1) 虚拟路由器中的路由器根据优先级选举出 Master。 Master 路由器通过发送免费 ARP 报文,将自己的虚拟 MAC 地址通知给与它连接的设备或者主机,从而承担报文转发任务;
(2) Master 路由器周期性发送 VRRP 报文,以公布其配置信息(优先级等)和工作状况;
(3) 如果 Master 路由器出现故障,虚拟路由器中的 Backup 路由器将根据优先级重新选举新的 Master;
(4) 虚拟路由器状态切换时, Master 路由器由一台设备切换为另外一台设备,新的 Master 路由器只是简单地发送一个携带虚拟路由器的 MAC 地址和虚拟 IP地址信息的ARP 报文,这样就可以更新与它连接的主机或设备中的ARP 相关信息。网络中的主机感知不到 Master 路由器已经切换为另外一台设备。
(5) Backup 路由器的优先级高于 Master 路由器时,由 Backup 路由器的工作方式(抢占方式和非抢占方式)决定是否重新选举 Master。
VRRP优先级的取值范围为0到255(数值越大表明优先级越高)
keepalived的三个核心模块
core核心模块 chech健康监测 vrrp虚拟路由冗余协议
lvs健康检测shell脚本
[root@localhost ~]$ vim check_lvs_real.sh
#!/bin/bash
#检测lvs集群节点是否正常,不正常则踢出集群
VIP=20.20.20.11 #集群虚拟IP
CPORT=80 #定义集群端口
FAIL_BACK=127.0.0.1 #本机回环地址
RS=("10.10.10.12" "10.10.10.13") #编写集群地址
declare -a RSSTATUS #变量RSSTATUS定义为数组态
RW=("2" "1")
RPORT=80 #定义集群端口
TYPE=g #制定LVS工作模式:g=DR m=NAT
CHKLOOP=3
LOG=/var/log/ipvsmonitor.log
#添加RS,添加成功返回0,否则返回1
addrs() {
ipvsadm -a -t $VIP:$CPORT -r $1:$RPORT -$TYPE -w $2
[ $? -eq 0 ] && return 0 || return 1
}
#删除RS,删除成功返回0,否则返回1
delrs() {
ipvsadm -d -t $VIP:$CPORT -r $1:$RPORT
[ $? -eq 0 ] && return 0 || return 1
}
#检测RS服务是否在线,注意一下这里面指的RS的服务,如果连续三次都监测不通,则返回1,否则返回0
checkrs() {
local I=1
while [ $I -le $CHKLOOP ]; do
if curl --connect-timeout 1 http://$1 &> /dev/null; then
return 0
fi
let I++
done
return 1
}
#初始化RS在线状态,如果在线,设置节点初始化状态为1,否则为0
initstatus() {
local I
local COUNT=0;
for I in ${RS[*]}; do
if ipvsadm -L -n | grep "$I:$RPORT" && > /dev/null ; then
RSSTATUS[$COUNT]=1
else
RSSTATUS[$COUNT]=0
fi
let COUNT++
done
}
#进行初始化
initstatus
#监测rs是否加入到ipvs中。如果未添加并且在线则添加;如果已添加并且不在线,则删除
while :; do
let COUNT=0
for I in ${RS[*]}; do
if checkrs $I; then
if [ ${RSSTATUS[$COUNT]} -eq 0 ]; then
addrs $I ${RW[$COUNT]}
[ $? -eq 0 ] && RSSTATUS[$COUNT]=1 && echo "`date +'%F %H:%M:%S'`, $I is back." >> $LOG
fi
else
if [ ${RSSTATUS[$COUNT]} -eq 1 ]; then
delrs $I
[ $? -eq 0 ] && RSSTATUS[$COUNT]=0 && echo "`date +'%F %H:%M:%S'`, $I is gone." >> $LOG
fi
fi
let COUNT++
done
sleep 5
done
3.2 Keepalived + LVS -DR 高可用实验构建
四台服务器
10.10.10.11(lvs-m)
10.10.10.12(lvs-s)
10.10.10.13(rs1)
10.10.10.14(rs2)
先搭建 LVS-DR 模式负载均衡集群,然后在搭建 LVS 从节点

四台节点全部关闭 NetworkManager
[root@localhost ~]$ service NetworkManager stop && chkconfig NetworkManager off
3.2.1 LVS主节点(10.10.10.11)
#添加一个网卡,当做vip(虚拟服务器ip)使用
[root@localhost ~]$ cd /etc/sysconfig/network-scripts/
[root@localhost ~]$ cp -a ifcfg-eth0 ifcfg-eth0:0
[root@localhost ~]$ vim ifcfg-eth0:0
DEVICE=eth0:0
ONBOOT=yes
BOOTPROTO=static
IPADDR=10.10.10.100
NETMASK=255.255.255.0
[root@localhost ~]$ service network restart
安装ipvsadm
[root@localhost ~]$ mount -t iso9660 /dev/cdrom /mnt/cdrom #挂载光盘
[root@localhost ~]$ yum -y install ipvsadm
关闭网卡重定向功能
[root@localhost ~]$ 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@localhost ~]$ sysctl -p #重新加载配置文件
添加ipvs规则
[root@localhost ~]$ ipvsadm -v # 查看当前 ipvs 集群内容
#ipvsadm -A -t 虚拟 IP:80 -s rr
#添加 ipvs TCP 集群,-A添加一个集群,-t TCP协议,-s 指定算法,rr轮询
[root@localhost ~]$ ipvsadm -A -t 10.10.10.100:80 -s rr
#ipvsadm -a -t 虚拟 IP:80 -r 网站1:80 -g
#添加 ipvsadm 集群子节点 ,-a 集群子节点,-r 真实服务器,-g DR模式
#ipvsadm -a -t 虚拟 IP:80 -r 网站2:80 -g
[root@localhost ~]$ ipvsadm -a -t 10.10.10.100:80 -r 10.10.10.13:80 -g
[root@localhost ~]$ ipvsadm -a -t 10.10.10.100:80 -r 10.10.10.14:80 -g
[root@localhost ~]$ service ipvsadm save
[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 10.10.10.100:80 rr
-> 10.10.10.13:80 Route 1 0 0
-> 10.10.10.14:80 Route 1 0 0
3.2.2 真实服务器(10.10.10.13、14 )
两台服务器做相同的步骤,另一台的网页内容不一样,其余全部一样
[root@localhost ~]$ service httpd start && chkconfig httpd on #启动apache服务器
[root@localhost ~]$ echo "this is server 1" >> /var/www/html/index.html
#另一台服务是this is server 2
[root@localhost ~]$ curl localhost
this is server 1
#生产环境两台服务器的网页内容是一样的
开启回环网卡接口
# 关闭网卡守护进程
[root@localhost ~]$ service NetworkManager stop && chkconfig NetworkManager off
[root@localhost ~]$ cd /etc/sysconfig/network-scripts/
[root@localhost ~]$ cp -a ifcfg-lo ifcfg-lo:0
# 拷贝回环网卡子接口
[root@localhost ~]$ vim ifcfg-lo:0 #vim !$ 上一个命令最后一条参数
#修改成下面一样
DEVICE=lo:0 #修改这里
IPADDR=10.10.10.100 #修改这里
NETMASK=255.255.255.255 #修改这里
NETWORK=127.0.0.0
# If you're having problems with gated making 127.0.0.0/8 a martian,
# you can change this to something else (255.255.255.255, for example)
BROADCAST=127.255.255.255
ONBOOT=yes
NAME=loopback
修改内核配置文件
[root@localhost ~]$ vim /etc/sysctl.conf #关闭对应 ARP 响应及公告功能
#最后一行添加
# LVS - 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@localhost ~]$ sysctl -p #重新加载配置文件
[root@localhost ~]$ ifup lo:0 #启动回环网卡
[root@localhost ~]$ ifconfig
...
lo:0 Link encap:Local Loopback
inet addr:10.10.10.100 Mask:255.255.255.255
UP LOOPBACK RUNNING MTU:65536 Metric:1
添加路由记录,当访问 VIP 交给 lo:0 网卡接受
[root@localhost ~]$ route add -host 10.10.10.100 dev lo:0
[root@localhost ~]$ route -n
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
10.10.10.100 0.0.0.0 255.255.255.255 UH 0 0 0 lo
10.10.10.0 0.0.0.0 255.255.255.0 U 0 0 0 eth0
169.254.0.0 0.0.0.0 255.255.0.0 U 1002 0 0 eth0
#添加到开机自启,防止失效
[root@localhost ~]$ echo "route add -host 10.10.10.100 dev lo:0" >> /etc/rc.local
浏览器输入10.10.10.100访问


3.2.3 搭建 Keepalived的 MASTER(10.10.10.11)
所需软件百度网盘
链接:https://pan.baidu.com/s/1wfgE3ISFsBddoO2JuMdRiA
提取码:ton9
上传Keepalived,然后挂载
[root@localhost ~]$ yum -y install lrzsz #方便把软件直接拖到xshell里面
#上传Keepalived.iso 镜像文件到家目录
#由于 keepalived是一个镜像文件,所以创建一个目录,方便挂载
[root@localhost ~]$ mkdir /mnt/iso1
[root@localhost ~]$ mount -o loop Keepalived.iso /mnt/iso1 #挂载
[root@localhost ~]$ cp -a /mnt/iso1/* .
安装 Keepalived
[root@localhost ~]$ yum -y install kernel-devel openssl-devel popt-devel gcc* # 安装相关 keepalived 依赖
[root@localhost ~]$ tar -zxvf keepalived-1.2.2.tar.gz && cd keepalived-1.2.2
[root@localhost ~]$ ./configure --prefix=/ --with-kernel-dir=/usr/src/kernels/2.6.32-642.el6.x86_64/
[root@localhost ~]$ make && make install #编译安装
[root@localhost ~]$ chkconfig --add keepalived # 设置 Keepalived 开机自启
[root@localhost ~]$ chkconfig keepalived on
修改 Keepalived 软件配置
[root@localhost ~]$ vim /etc/keepalived/keepalived.conf # 修改 配置
global_defs {
router_id R1 #命名主机名,同一个组名称不能一致
}
#VRRP相关设置
vrrp_instance VI_1 {
state MASTER # 设置服务类型主/从(MASTER/SLAVE)
interface eth0 # 指定那块网卡用来监听
virtual_router_id 66 # 设置组号, 如果是一组就是相同的 ID 号, 一个主里面只能有一个主 服务器和多个从服务器
priority 80 # 服务器优先级, 主服务器优先级高 ,主从差距最好是50
advert_int 1 # 心跳时间, 检测对方存活
authenticetion { # 存活验证密码
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
10.10.10.100 #设置集群地址,vip(虚拟ip地址)
}
}
#虚拟服务
virtual_server 10.10.10.100 80 {# 设置集群地址 以及端口号
delay_loop 6 # 健康检查间隔
lb_algorr # 使用轮询调度算法
lb_kind DR # DR 模式的群集
#net_mask 255.255.255.0 #子网掩码
#persisitence_timeout 50 #持久化
protocol TCP # 使用的协议
#真实服务器健康状态监测,几个真实服务器就写几个real_server
real_server 10.10.10.13 80 { # 管理的网站节点以及使用端口
weight 1 # 权重, 优先级 在原文件基础上删除修改
TCP_CHECK { # 状态检查方式
connect_port 80 # 检查的目标端口
connect_timeout 3 # 连接超时(秒)
nb_get_retry 3 # 重试次数
delay_before_retry 4 # 重试间隔(秒)
}
}
#真实服务器健康状态监测
real_server 10.10.10.14 80 { # 管理的第二个网站节点以及使用端口
weight 1 # 权重, 优先级 在原文件基础上删除修改
TCP_CHECK { # 状态检查方式
connect_port 80 # 检查的目标端口
connect_timeout 3 # 连接超时(秒)
nb_get_retry 3 # 重试次数
delay_before_retry 4 # 重试间隔(秒)
}
}
}
# 多余删除 dG 删除光标之后的所有内容
[root@localhost ~]$ service keepalived start
[root@localhost ~]$ cat /var/log/messages
Dec 22 11:42:18 localhost Keepalived_healthcheckers: IPVS: Service already exists
Dec 22 11:42:18 localhost Keepalived_healthcheckers: Using LinkWatch kernel netlink reflector...
Dec 22 11:42:18 localhost Keepalived_healthcheckers: Activating healtchecker for service [10.10.10.13]:80
Dec 22 11:42:18 localhost Keepalived_healthcheckers: Activating healtchecker for service [10.10.10.14]:80
Dec 22 11:42:19 localhost Keepalived_vrrp: VRRP_Instance(VI_1) Transition to MASTER STATE
Dec 22 11:42:20 localhost Keepalived_vrrp: VRRP_Instance(VI_1) Entering MASTER STATE
Dec 22 11:42:20 localhost Keepalived_vrrp: VRRP_Instance(VI_1) setting protocol VIPs.
Dec 22 11:42:20 localhost Keepalived_vrrp: VRRP_Instance(VI_1) Sending gratuitous ARPs on eth0 for 10.10.10.100
Dec 22 11:42:20 localhost Keepalived_healthcheckers: Netlink reflector reports IP 10.10.10.100 added
Dec 22 11:42:25 localhost Keepalived_vrrp: VRRP_Instance(VI_1) Sending gratuitous ARPs on eth0 for 10.10.10.100
3.2.4 搭建 Keepalived的 SLAVE(10.10.10.12)
关闭网卡启动脚本的拒绝,就能启动这个网卡,局域网两个相同的ip,请求会平均分发,keepalived会绑定vrrp权限,如果主或者,从的不会使用,主挂了,才会使用从
#添加一个网卡,当做vip(虚拟服务器ip)使用
[root@localhost ~]$ cd /etc/sysconfig/network-scripts/
[root@localhost ~]$ cp -a ifcfg-eth0 ifcfg-eth0:0
[root@localhost ~]$ vim ifcfg-eth0:0
DEVICE=eth0:0
ONBOOT=yes
BOOTPROTO=static
IPADDR=10.10.10.100
NETMASK=255.255.255.0
[root@localhost ~]$ ifup eth0:0
Determining if ip address 10.10.10.100 is already in use for device eth0...
Error, some other host (00:0C:29:0A:56:2E) already uses address 10.10.10.100.
# 如果 报错修改文件 247行左右
[root@localhost ~]$ vim /etc/sysconfig/network-scripts/ifup-eth
#注释这几行
#if ! ARPING=$(/sbin/arping -c 2 -w ${ARPING_WAIT:-3} -D -I ${REALDEVICE} ${ipaddr[$idx]}) ; then
# ARPINGMAC=$(echo $ARPING | sed -ne 's/.*\[\(.*\)\].*/\1/p')
# net_log $"Error, some other host ($ARPINGMAC) already uses address ${ipaddr[$idx]}."
# exit 1
#fi
[root@localhost ~]$ ifup eth0:0 #然后重新启动即可
上传Keepalived,然后挂载
[root@localhost ~]$ mount -t iso9660 /dev/cdrom /mnt/cdrom #挂载yum光盘
[root@localhost ~]$ yum -y install lrzsz #方便把软件直接拖到xshell里面
#上传Keepalived.iso 镜像文件到家目录
#由于 keepalived是一个镜像文件,所以创建一个目录,方便挂载
[root@localhost ~]$ mkdir /mnt/iso1
[root@localhost ~]$ mount -o loop Keepalived.iso /mnt/iso1 #挂载
[root@localhost ~]$ cp -a /mnt/iso1/* .
安装 Keepalived
[root@localhost ~]$ yum -y install kernel-devel openssl-devel popt-devel gcc* # 安装相关 keepalived 依赖
[root@localhost ~]$ tar -zxvf keepalived-1.2.2.tar.gz && cd keepalived-1.2.2
[root@localhost ~]$ ./configure --prefix=/ --with-kernel-dir=/usr/src/kernels/2.6.32-642.el6.x86_64/
[root@localhost ~]$ make && make install #编译安装
[root@localhost ~]$ chkconfig --add keepalived # 设置 Keepalived 开机自启
[root@localhost ~]$ chkconfig keepalived on
关闭网卡重定向功能
[root@localhost ~]$ 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@localhost ~]$ sysctl -p #重新加载配置文件
修改 Keepalived 软件配置
#把远程服务器的keepalived.conf 下载到本地/etc/keepalived目录下
[root@localhost ~]$ scp root@10.10.10.11:/etc/keepalived/keepalived.conf /etc/keepalived/
[root@localhost ~]$ vim /etc/keepalived/keepalived.conf
#修改 1:router_id R1 修改为 router_id R2
#修改 2:state MASTER 修改至 state SLAVE
#修改 3:priority 100 修改至 priority 47 一般建议与主服务器差值为 50
global_defs {
router_id R2 #命名主机名,同一个组名称不能一致
}
#VRRP相关设置
vrrp_instance VI_1 {
state SLAVE # 设置服务类型主/从(MASTER/SLAVE)
interface eth0 # 指定那块网卡用来监听
virtual_router_id 66 # 设置组号, 如果是一组就是相同的 ID 号, 一个主里面只能有一个主 服务器和多个从服务器
priority 20 # 服务器优先级, 主服务器优先级高 ,主从差距最好是50
advert_int 1 # 心跳时间, 检测对方存活
authenticetion { # 存活验证密码
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
10.10.10.100 #设置集群地址,vip(虚拟ip地址)
}
}
#虚拟服务
virtual_server 10.10.10.100 80 {# 设置集群地址 以及端口号
delay_loop 6 # 健康检查间隔
lb_algorr # 使用轮询调度算法
lb_kind DR # DR 模式的群集
#net_mask 255.255.255.0 #子网掩码
#persisitence_timeout 50 #持久化
protocol TCP # 使用的协议
#真实服务器健康状态监测,几个真实服务器就写几个real_server
real_server 10.10.10.13 80 { # 管理的网站节点以及使用端口
weight 1 # 权重, 优先级 在原文件基础上删除修改
TCP_CHECK { # 状态检查方式
connect_port 80 # 检查的目标端口
connect_timeout 3 # 连接超时(秒)
nb_get_retry 3 # 重试次数
delay_before_retry 4 # 重试间隔(秒)
}
}
#真实服务器健康状态监测
real_server 10.10.10.14 80 { # 管理的第二个网站节点以及使用端口
weight 1 # 权重, 优先级 在原文件基础上删除修改
TCP_CHECK { # 状态检查方式
connect_port 80 # 检查的目标端口
connect_timeout 3 # 连接超时(秒)
nb_get_retry 3 # 重试次数
delay_before_retry 4 # 重试间隔(秒)
}
}
}
[root@localhost ~]$ yum -y install ipvsadm #安装ipvsadm
[root@localhost ~]$ service ipvsadm start && chkconfig ipvsadm on
[root@localhost ~]$ service keepalived start #启动keepalived
[root@localhost ~]$ ipvsadm -Ln --stats
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Conns InPkts OutPkts InBytes OutBytes
-> RemoteAddress:Port
TCP 10.10.10.100:80 17 85 0 11833 0
-> 10.10.10.13:80 8 40 0 6072 0
-> 10.10.10.14:80 9 45 0 5761 0
至此 Keepalived + lvs 高可用集群搭建完毕
测试
把10.10.10.11的服务器关机,浏览器输入10.10.10.100依然可以访问
[root@localhost ~]$ ipvsadm -Ln --stats
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Conns InPkts OutPkts InBytes OutBytes
-> RemoteAddress:Port
TCP 10.10.10.100:80 17 85 0 11833 0
-> 10.10.10.13:80 8 40 0 6072 0
-> 10.10.10.14:80 9 45 0 5761 0
把10.10.10.13的httpd停了
[root@localhost ~]$ service httpd stop
会发现把10.10.10.13服务给踢出去了
[root@localhost ~]$ ipvsadm -Ln --stats
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Conns InPkts OutPkts InBytes OutBytes
-> RemoteAddress:Port
TCP 10.10.10.100:80 17 85 0 11833 0
-> 10.10.10.14:80 9 45 0 5761 0
3.3 HeartBeat + Nginx 实验构建
3.3.1 HeartBeat 简介
Heartbeat 是一款开源提供高可用(Highly-Available)服务的软件,通过 heartbeat 可以将资源(IP及程序服务等资源)从一台已经故障的计算机快速转移到另一台正常运转的机器上继续提供服务,一般称之为高可用服务。
Heartbeat是Linux-HA项目中的一个组件,也是当前开源HA项目中最成功的一个例子,它提供了所有HA软件所需要的基本功能,如心跳检测和资源接管、监测群集中的系统服务、在群集中的节点间转移共享IP地址的所有者等。heartbeat最核心的功能包括两个部分,心跳监测和资源接管。心跳监测可以通过网络链路和串口进行,而且支持冗 余链路,它们之间相互发送报文来告诉对方自己当前的状态,如果在指定的时间内未收到对方发送的报文,那么就认为对方失效,这时需启动资源接管模块来接管运行在对方主机上的资源或者服务。
3.3.2 Heartbeat工作原理
通过修改配置文件,指定哪一台Heartbeat服务器作为主服务器,则另一台将自动成为备份服务器。然后在指定备份服务器上配置Heartbeat守护进程来监听来自主服务器的心跳。如果备份服务器在指定时间内未监听到来自主服务器的心跳,就会启动故障转移程序,并取得主服务器上的相关资源服务所有权,接替主服务器继续不间断的提供服务,从而达到资源服务高可用性的目的。
以上描述的是Heartbeat主备的模式,Heartbeat还支持主主模式,即两台服务器互为主备,这时它们之间会相互发送报文来告诉对方自己当前的状态,如果在指定的时间内为收到对方发送的心跳报文,那么久认为对方失效或者宕机了,这时就会启动自身的资源接管模块来接管运行在对方主机上的资源或者服务,继续对用户提供服务。正常情况下,可以较好的实现主机故障后,业务仍不间断的持续运行。
keepalived主要控制IP飘移,配置应用简单,而且分层,layer3,4,5,各自配置极为简单。heartbeat不但可以控制IP飘移,更擅长对资源服务的控制,配置,应用比较复杂。lvs的高可用建议用keepavlived;业务的高可用用heartbeat。
3.3.3 HeartBeat + Nginx 构建
软件包:软件包版本为 Centos6 系列,如果使用其它版本可以配置 eperl 源下载安装
环境准备
配置时间同步服务
配置主机名解析
两台nginx服务器
10.10.10.11
10.10.10.12
实验拓扑结构

3.3.3.1 基础环境搭建(10.10.10.11、10.10.10.12)
所需软件百度网盘
链接:https://pan.baidu.com/s/1wfgE3ISFsBddoO2JuMdRiA
提取码:ton9
两台服务器都要安装
上传nginx源码包
[root@localhost ~]$ mount -t iso9660 /dev/cdrom /mnt/cdrom #挂载yum光盘
[root@localhost ~]$ yum -y install lrzsz #方便把软件直接拖到xshell里面
[root@localhost ~]$ tar -zxvf nginx-1.2.6.tar.gz && cd nginx-1.2.6
[root@localhost ~]$ yum -y install pcre pcre-devel zlib zlib-devel #安装依赖
安装nginx
[root@localhost ~]$ useradd -s /sbin/nologin -M nginx
#不允许远程登陆,-M 不创建家目录
[root@localhost ~]$ ./configure --prefix=/usr/local/nginx --user=nginx --group=nginx
[root@localhost ~]$ make && make install #编译安装
#生产环境网页内容是一致的
[root@localhost ~]$ echo "aaaaaaaa" > /usr/local/nginx/html/index.html #10.10.10.11服务器
[root@localhost ~]$ echo "bbbbbbbb" > /usr/local/nginx/html/index.html #10.10.10.12服务器
[root@localhost ~]$ /usr/local/nginx/sbin/nginx #启动nginx
配置时间同步服务
[root@localhost ~]$ yum -y install ntp
[root@localhost ~]$ vim /etc/ntp.conf
...
#当前网段
restrict 10.10.10.0 mask 255.255.255.0 nomodify notrap
...
#server全部注释,不采用官方
#server 0.centos.pool.ntp.org iburst
#server 1.centos.pool.ntp.org iburst
#server 2.centos.pool.ntp.org iburst
#server 3.centos.pool.ntp.org iburst
server 127.127.1.0
fudge 127.127.1.0
...
[root@localhost ~]$ service ntpd start && chkconfig ntpd on
#10.10.10.12执行同步时间
[root@localhost ~]$ ntpdate -u 10.10.10.11
23 Dec 23:01:18 ntpdate[29025]: adjust time server 10.10.10.11 offset -0.059989 sec
配置主机名解析
[root@localhost ~]$ vim /etc/sysconfig/network
NETWORKING=yes
HOSTNAME=www.centos1.com
#另台的HOSTNAME=www.centos1.com
[root@localhost ~]$ vim /etc/hosts #两台hosts一样
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
10.10.10.11 www.centos1.com
10.10.10.12 www.centos2.com
3.3.3.2 安装HeartBeat 主(10.10.10.11)
- 上传heartbeat源码包,centos7构建需要安装eperl 源
[root@localhost ~]$ tar -zxvf heartbeat.tar.gz && cd heartbeat
[root@localhost ~]$ yum -y install * #安装
[root@localhost ~]$ cd /usr/share/doc/heartbeat-3.0.4/
[root@localhost ~]$ cp -a ha.cf authkeys haresources /etc/ha.d/ #配置文件需拷贝到默认目录下
- 认证服务,节点之间的认证配置,修改 /etc/ha.d/authkeys ,在主上(10.10.10.11)修改
[root@localhost ~]$ cd /etc/ha.d/
[root@localhost ~]$ dd if=/dev/random bs=512 count=1 | openssl md5 #生成密钥随机数
[root@localhost ~]$ vim authkeys
auth 3
1 crc
2 sha1 HI!
3 md5 a4d20b0dd3d5e35e0f87ce4266d1dd64
[root@localhost ~]$ chmod 600 authkeys
- heartbeat 主配置文件,修改 /etc/ha.d/ ha.cf , 在主上(10.10.10.11)修改
[root@localhost ~]$ vim ha.cf
bcast eth0 # Linux
#bcast eth1 eth2 # Linux
#bcast le0 # Solaris
#bcast le1 le2 # Solaris
#一主一备节点,需注意能后被两台主机之间解析
node www.centos1.com
node www.centos2.com
- 配置 haresources 文件,在主上修改
[root@localhost ~]$ vim haresources
#最后一行添加
www.centos1.com IPaddr::10.10.10.100/24/eth0:0
#切换ip地址
#传到10.10.10.12服务器
[root@localhost ~]$ cd /root
[root@localhost ~]$ scp heartbeat.tar.gz root@www.centos2.com:/root/
3.3.3.3 安装HeartBeat 从(10.10.10.12)
[root@localhost ~]$ tar -zxvf heartbeat.tar.gz && cd heartbeat
[root@localhost ~]$ yum -y install * #安装
#将主三个配置文件拷贝到从上
[root@localhost ~]$ cd /usr/share/doc/heartbeat-3.0.4/
[root@localhost ~]$ scp root@10.10.10.11:/etc/ha.d/authkeys /etc/ha.d #下载到本地
[root@localhost ~]$ scp root@10.10.10.11:/etc/ha.d/ha.cf /etc/ha.d #下载到本地
[root@localhost ~]$ scp root@10.10.10.11:/etc/ha.d/haresources /etc/ha.d #下载到本地
- 启动服务进行验证
[root@localhost ~]$ /usr/local/nginx/sbin/nginx # 主
[root@localhost ~]$ service heartbeat start # 主
[root@localhost ~]$ /usr/local/nginx/sbin/nginx #备
[root@localhost ~]$ service heartbeat start #备
关闭其中一个服务器,就可以自动切换,HeartBeat 检测的是网络通信,而不是服务器是否存活
10.10.10.11
[root@localhost ~]$ mkdir /usr/local/script
[root@localhost ~]$ vim 80.sh
#!/bin/bash
PWD=/usr/local/script/
URL="http://10.10.10.11/index.html"
HTTP_CODE=`curl -o /dev/null -s -w "%{http_code}" "${URL}"`
if [ $HTTP_CODE != 200 ]
then
service heartbeat stop
fi
#添加定时检测
[root@localhost ~]$ crontab -e
*/1 * * * * bash /usr/local/script/80.sh
四、多级负载(四层+七层)
4.1 实现原理
4.1.1 七层负载实现原理

首先,客户端会发起tcp的连接到nginx,nginx会把连接翻译成它想要获取的数据,然后nginx想后端apache服务器简历完整的tcp连接访问,获取完数据后,然后把数据传送给客户端,以反向代理方式实现负载均衡
4.1.2 四层负载实现原理

四层采用了lvs-dr模式实现的,客户端发送数据报文到LVS,LVS去判断端口和访问的VIP(虚拟服务ip),只要这两个匹配,就会按照自己的调度规则,把请求的数据包转移后台的真实服务器上,对应服务器接收请求后,反应数据给用户。四层负载只看端口和vip,不看域名
4.1.3 多级负载(四、七层)原理

公司有两个不同域名的门户网站,业务高峰期访问量较大,经测试nginx未能满足并发压力,两个门户网站公网地址一致,这个时候就要用到多级负载
两个网站,不同的域名,相同的IP,所以采用以上的方法;Nginx作为反向代理服务器,LVS对nginx采用DR负载均衡
客户端发送数据报文到LVS,LVS根据算法匹配到第一个nginx或者第二个nginx,nginx里面去设置虚拟主机级别的负载均衡,判断访问的主机名是谁,如果是 .com 的话,会在服务器1和2之间负载均衡,如果是 .cn 的话,会直接去第三层。
4.2 多级负载构建
实验拓扑结构

六台服务器
10.10.10.11—LVS-DR
10.10.10.12—Nginx
10.10.10.13—Nginx
10.10.10.14—Apache1
10.10.10.15—Apache2
10.10.10.16—Apache3
全部关闭防火墙和selinux,配置本地yum源
4.2.2 搭建apache服务(10.10.10.14、15、16)
除了网页内容不一样,其余全部一样,三台服务都执行一遍
# 关闭网卡守护进程
[root@localhost ~]$ service NetworkManager stop && chkconfig NetworkManager off
[root@localhost ~]$ mount -t iso9660 /dev/cdrom /mnt/cdrom #挂载yum光盘
[root@localhost ~]$ service httpd start && chkconfig httpd on
[root@localhost ~]$ echo "www.test.com-1" >> /var/www/html/index.html #14服务器
#echo "www.test.com-2" >> /var/www/html/index.html #15服务器
#echo "www.test.cn" >> /var/www/html/index.html #16服务器
4.2.2 搭建nginx服务(10.10.10.12、13)
所需软件百度网盘
链接:https://pan.baidu.com/s/1wfgE3ISFsBddoO2JuMdRiA
提取码:ton9
两台服务器(10.10.10.12、13)都要执行一遍
上传nginx源码包
[root@localhost ~]$ service NetworkManager stop && chkconfig NetworkManager off
# 关闭网卡守护进程
[root@localhost ~]$ mount -t iso9660 /dev/cdrom /mnt/cdrom #挂载yum光盘
[root@localhost ~]$ yum -y install lrzsz #方便把软件直接拖到xshell里面
[root@localhost ~]$ yum -y install pcre pcre-devel zlib zlib-devel gcc* #安装依赖
[root@localhost ~]$ tar -zxvf nginx-1.2.6.tar.gz && cd nginx-1.2.6
安装nginx
[root@localhost ~]$ useradd -s /sbin/nologin -M nginx
#不允许远程登陆,-M 不创建家目录
[root@localhost ~]$ ./configure --prefix=/usr/local/nginx --user=nginx --group=nginx
[root@localhost ~]$ make && make install #编译安装
#修改配置nginx文件,配置负载均衡
#10.10.10.12不用执行此步骤,修改完直接复制即可
[root@localhost ~]$ vim /usr/local/nginx/conf/nginx.conf
....
#配置.com负载均衡
upstream test.com {
server 10.10.10.14:80;
server 10.10.10.15:80;
}
#配置.cn负载均衡
upstream test.cn {
server 10.10.10.16:80;
}
#一个server就是一个网站
server {
listen 80;
server_name www.test.com;
location / { #反向代理服务器
proxy_pass http://test.com;
}
}
server {
listen 80;
server_name www.test.cn;
location / { #反向代理服务器
proxy_pass http://test.cn;
}
}
[root@localhost ~]$ /usr/local/nginx/sbin/nginx -t #检查配置文件
nginx: the configuration file /usr/local/nginx/conf/nginx.conf syntax is ok
nginx: configuration file /usr/local/nginx/conf/nginx.conf test is successful
[root@localhost ~]$ /usr/local/nginx/sbin/nginx #启动ngin
把10.10.10.13的nginx配置文件复制到10.10.10.12
#10.10.10.13服务器执行这个命令
[root@localhost ~]$ scp /usr/local/nginx/conf/nginx.conf root@10.10.10.12:/usr/local/nginx/conf/nginx.conf
打开C:\Windows\System32\drivers\etc,修改hosts文件,生产环境搭建dns服务
#添加如下内容
#10.10.10.13 www.test.com
#10.10.10.13 www.test.cn
10.10.10.12 www.test.com
10.10.10.12 www.test.cn
浏览器输入www.test.com会出现apache服务器的内容
4.2.3 搭建LVS-DR负载调度器(10.10.10.11)
开启子接口
[root@localhost ~]$ service NetworkManager stop && chkconfig NetworkManager off
# 关闭网卡守护进程
[root@localhost ~]$ cd /etc/sysconfig/network-scripts/
[root@localhost ~]$ cp -a ifcfg-eth0 ifcfg-eth0:0
# 拷贝 eth0 网卡子接口充当集群入口接口
[root@localhost ~]$ vim ifcfg-eth0:0 #vim !$ 上一个命令最后一条参数
#修改成下面一样
DEVICE=eth0:0
ONBOOT=yes
BOOTPROTO=static
IPADDR=10.10.10.100
NETMASK=255.255.255.0
#当做集群的ip,VIP,提供给web用户访问的接口
[root@localhost ~]$ ifup eth0:0 #启动网卡子接口
Determining if ip address 10.10.10.100 is already in use for device eth0...
修改内核配置文件
[root@localhost ~]$ 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@localhost ~]$ sysctl -p #重新加载配置文件
安装ipvsadm命令行管理工具
[root@localhost ~]$ yum -y install ipvsadm
[root@localhost ~]$ ipvsadm -Ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
添加ipvs规则
[root@localhost ~]$ ipvsadm -v # 查看当前 ipvs 集群内容
#ipvsadm -A -t 虚拟 IP:80 -s rr
#添加 ipvs TCP 集群,-A添加一个集群,-t TCP协议,-s 指定算法,rr轮询
[root@localhost ~]$ ipvsadm -A -t 10.10.10.100:80 -s rr
#ipvsadm -a -t 虚拟 IP:80 -r 网站1:80 -g
#添加 ipvsadm 集群子节点 ,-a 集群子节点,-r 真实服务器,-g DR模式
#ipvsadm -a -t 虚拟 IP:80 -r 网站2:80 -g
[root@localhost ~]$ ipvsadm -a -t 10.10.10.100:80 -r 10.10.10.12:80 -g
[root@localhost ~]$ ipvsadm -a -t 10.10.10.100:80 -r 10.10.10.13:80 -g
[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 10.10.10.100:80 rr
-> 10.10.10.12:80 Route 1 0 0
-> 10.10.10.13:80 Route 1 0 0
[root@localhost ~]$ service ipvsadm save # 保存 ipvs 集群内容至文件,进行持久化存储
[root@localhost ~]$ chkconfig ipvsadm on # 设置为开机自启
[root@localhost ~]$ ipvsadm -Ln --stats #查看状态
4.2.4 搭建LVS-DR真实服务器(10.10.10.12、13 )
两台服务器做相同的步骤
开启回环网卡接口
# 关闭网卡守护进程
[root@localhost ~]$ cd /etc/sysconfig/network-scripts/
[root@localhost ~]$ cp -a ifcfg-lo ifcfg-lo:0
# 拷贝回环网卡子接口
[root@localhost ~]$ vim ifcfg-lo:0 #vim !$ 上一个命令最后一条参数
#修改成下面一样
DEVICE=lo:0 #修改这里
IPADDR=10.10.10.100 #修改这里
NETMASK=255.255.255.255 #修改这里
NETWORK=127.0.0.0
# If you're having problems with gated making 127.0.0.0/8 a martian,
# you can change this to something else (255.255.255.255, for example)
BROADCAST=127.255.255.255
ONBOOT=yes
NAME=loopback
修改内核配置文件
[root@localhost ~]$ vim /etc/sysctl.conf #关闭对应 ARP 响应及公告功能
#最后一行添加
# LVS - 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@localhost ~]$ sysctl -p #重新加载配置文件
[root@localhost ~]$ ifup lo:0 #启动回环网卡
[root@localhost ~]$ ifconfig
...
lo:0 Link encap:Local Loopback
inet addr:10.10.10.100 Mask:255.255.255.255
UP LOOPBACK RUNNING MTU:65536 Metric:1
添加路由记录,当访问 VIP 交给 lo:0 网卡接受
[root@localhost ~]$ route add -host 10.10.10.100 dev lo:0
[root@localhost ~]$ route -n
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
10.10.10.100 0.0.0.0 255.255.255.255 UH 0 0 0 lo
10.10.10.0 0.0.0.0 255.255.255.0 U 0 0 0 eth0
169.254.0.0 0.0.0.0 255.255.0.0 U 1002 0 0 eth0
#添加到开机自启,防止失效
[root@localhost ~]$ echo "route add -host 10.10.10.100 dev lo:0" >> /etc/rc.local
至此多级负载搭建完毕!
4.2.5 测试
打开C:\Windows\System32\drivers\etc,修改hosts文件,生产环境搭建dns服务
#添加如下内容
10.10.10.100 www.test.com
10.10.10.100 www.test.cn
这样既能识别不同的域名,又能进行负载量的增加