负载均衡集群

  • 负载均衡集群拓扑图
  • 负载均衡器分类
  • 负载均衡集群原理
    • LVS工作方式
      • 1)NAT模式
        • LVS—NAT模式实验构建:
          • Ⅰ 负载调度器(10.10.10.11、20.20.20.11)
          • Ⅱ 真实服务器(10.10.10.12、10.10.10.13)
      • 2)DR模式(Direct Routing)直接路由模式
        • LVS—DR模式实验构建:
          • Ⅰ 负载调度器配置(10.10.10.100、10.10.10.10)
          • Ⅱ 修改真实服务器(10.10.10.11、10.10.10.12)
      • 3)TUN模式(公网环境下,利用二次封装技术)
      • 负载均衡集群相关调度算法
        • 1)静态调度算法
        • 2)动态调度算法
      • LVS的持久化连接(类似于SH+RR)
        • 持久化连接分类
          • 1)持久化客户端连接(PCC):
          • 2)持久化端口连接(PPC):
          • 3)持久化防火墙标记连接(PFMC):
  • 高可用集群
    • keepalive
      • Keepalived + LVS -DR 高可用实验构建
        • 配置LVS主节点(10.10.10.11)
        • 在主节点上配置keepalived master
        • 从节点配置(10.10.10.14)keepalived slave
        • 接着配置RS(10.10.10.12、10.10.10.13)
        • 实验验证
      • Heartbeat + Nginx 实验搭建
        • Heartbeat简介
        • Heartbeat工作原理
        • HeartBeat + Nginx 构建
          • 基础环境搭建(10.10.10.15、10.10.10.16)
          • 源码包编译HeartBeat 主(10.10.10.15)
          • 源码包编译HeartBeat 从(10.10.10.16)
          • 实验验证
  • 多级负载(四层、七层)
    • 七层实现原理
    • 四层实现原理
    • 多级负载构建原理
      • 实验构建:
        • 在Apache服务器上操作(10.10.10.14、10.10.10.15、10.10.10.16)
        • 上传Nginx源码包,编译Nginx(10.10.10.12、10.10.10.13)
        • 搭建LVS-DR负载调度器(10.10.10.11)
        • 搭建LVS-DR真实服务器(10.10.10.12、10.10.10.13 )
        • 测试

负载均衡集群拓扑图

负载均衡器分类

软件:LVS(传输层)、Nginx(应用层)、Haproxy
硬件:F5(数据链路层)

负载均衡集群原理

四层工作逻辑:

LVS只做了地址更改,数据并未真正修改,源IP始终没变,LVS中间仅修改了目的IP

七层工作逻辑:
所有数据都要经过nginx转发,压力太大

适用场景
LVS:模糊查询
Nginx:精确查询

LVS工作方式

场景术语:
DS:(director server)负载均衡服务器
RS:(real server)真实服务器
DIR: (directorserver IP)地址
VIP: (外部网络访问的IP地址)虚拟IP地址
RIP:(real server IP)真实服务器IP地址
CIP: 客户端IP地址

1)NAT模式

特点:
1、集群节点处于同一个网络环境之中
2、真实服务器必须将网关指向负载调度器
3、RS的IP通常是私有IP,仅用于各个集群节点通信
4、支持端口映射
5、负载调度器必须是Linux操作系统,RS系统随意
6、进出数据报文都要经过负载调度机器,压力较大

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地址

Ⅰ 负载调度器(10.10.10.11、20.20.20.11)

①关闭 NetworkManager 守护进程
负责无线网卡的启用,包括一些不安全的网络策略,它会进行强制关闭,因此对于我们这个实验需要配置多网卡,这个服务就可能会拒绝我们网卡的动作,因此我们需要关闭此服务。

[root@localhost ~]$ systemctl stop NetworkManager    #临时关闭
[root@localhost ~]$ systemctl disable  NetworkManager  #永久关闭
Removed symlink /etc/systemd/system/multi-user.target.wants/NetworkManager.service.
Removed symlink /etc/systemd/system/dbus-org.freedesktop.NetworkManager.service.
Removed symlink /etc/systemd/system/dbus-org.freedesktop.nm-dispatcher.service.
[root@localhost ~]$ systemctl status  NetworkManager

②修改网卡配置文件

[root@localhost ~]$ cd /etc/sysconfig/network-scripts/
[root@localhost ~]$ vim ifcfg-ens33
DEVICE=ens33
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-ens34
DEVICE=ens34
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
ens34      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.0inet6 addr: fe80::20c:29ff:fe0a:562e/64 Scope:LinkUP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1RX packets:987 errors:0 dropped:0 overruns:0 frame:0TX packets:1109 errors:0 dropped:0 overruns:0 carrier:0collisions:0 txqueuelen:1000 RX bytes:84594 (82.6 KiB)  TX bytes:204436 (199.6 KiB)ens33      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.0inet6 addr: fe80::20c:29ff:fe0a:5638/64 Scope:LinkUP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1RX packets:45 errors:0 dropped:0 overruns:0 frame:0TX packets:27 errors:0 dropped:0 overruns:0 carrier:0collisions:0 txqueuelen:1000 RX bytes:3570 (3.4 KiB)  TX bytes:3512 (3.4 KiB)

③安装 ipvsadm 命令行工具

具体本地yum如何配置,可查询下面的DR模式
[root@localhost ~]$ mount -t iso9660 /dev/cdrom /mnt/cdrom #挂载光盘
[root@localhost ~]$ yum -y install ipvsadm
[root@localhost ~]$ vim /etc/sysctl.conf # 开启路由转发功能
net.ipv4.ip_forward = 1
[root@localhost ~]$ sysctl -p  #重新加载sysctl配置文件

④修改防火墙,并写NAT。

centos7由于不再是iptable了而是firewalld,所以此时我们需要下载一个iptables-services
[root@localhost ~]$ yum install iptables-services
[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
# 添加防火墙记录,当源地址是 内网网段 并且出口网卡为 ens33 的时候进行 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
[root@localhost ~]$ service iptables save

⑤添加ipvs规则

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 -S   #保存规则
-A -t 20.20.20.11:http -s rr
-a -t 20.20.20.11:http -r 10.10.10.12:http -m -w 1
-a -t 20.20.20.11:http -r 10.10.10.13:webcache -m -w 1
注意:[root@localhost ~]$ ipvsadm -D -t 20.20.20.11:80  #即可删除这一个集群
[root@localhost ~]$ ipvsadm -C #表示删除所有集群
[root@localhost ~]$ chkconfig ipvsadm on  #开机自启
Ⅱ 真实服务器(10.10.10.12、10.10.10.13)

①关闭 NetworkManager 守护进程

[root@localhost ~]$ systemctl stop NetworkManager    #临时关闭
[root@localhost ~]$ systemctl disable  NetworkManager  #永久关闭
Removed symlink /etc/systemd/system/multi-user.target.wants/NetworkManager.service.
Removed symlink /etc/systemd/system/dbus-org.freedesktop.NetworkManager.service.
Removed symlink /etc/systemd/system/dbus-org.freedesktop.nm-dispatcher.service.

②添加网关指向负载调度器(10.10.10.11)

[root@localhost ~]$ echo "GATEWAY=10.10.10.11" >> /etc/sysconfig/network-scripts/ifcfg-ens33
[root@localhost network-scripts]# systemctl restart network
[root@localhost network-scripts]# route -n
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
0.0.0.0         10.10.10.11     0.0.0.0         UG    100    0        0 ens33
#去任何地址都交给10.10.10.11
10.10.10.0      0.0.0.0         255.255.255.0   U     100    0        0 ens33
192.168.122.0   0.0.0.0         255.255.255.0   U     0      0        0 virbr0

③开启apache

[root@localhost network-scripts]$ systemctl start httpd && systemctl enable httpd
[root@localhost network-scripts]$ echo "111111" >> /var/www/html/index.html
# echo "222222" >> /var/www/html/index.html 10.13服务的是222222

测试:
通过访问负载调度器的ens34(20.20.20.11)

[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  20.20.20.11:80                      6       32       20     6428     3010-> 10.10.10.12:80                      3       29       17     6272     2890-> 10.10.10.13:8080                    3        3        3      156      120

ok,结果测试成功!可以观察到NAT模式与DR模式的本质区别就是入站、出站的数据包。
NAT模式负载调度器上既有入站也有出站,而DR模式负载调度器上仅有入站。

2)DR模式(Direct Routing)直接路由模式

DR模式是通过改写请求报文的目标MAC地址,将请求发给真实服务器的,而真实服务器响应后的处理结果直接返回给客户端用户。(此时就需要将Dip为192.168.1.100隐藏)
生产环境一般都是用DR模式,这避免了真实服务器暴露在公网之下防止攻击,又不必将数据从负载调度器原路返回,大大增加了LVS的抗并发能力,LBC模式其实和NGINX的七层代理本质一样的



总结:负载调度器通过交换机连接均衡服务器池(属于同一个广播域),接收用户请求并调度;均衡服务器池(伪装为调度器的公网IP地址后)通过交换机直接应答结果给路由器,进一步到用户;

特点:
1、集群节点,必须在一个网络中
2、真实服务器网关指向路由器
3、真实服务器既可以是私网地址,又可以是公网地址
4、负载调度器只负责入站请求,压力较小
5、大大减轻负载调度器压力,支持更多的服务器节点
6、不支持端口映射
7、负载调度器必须是Linux操作系统,其他真实服务器最好是Linux操作系统

LVS—DR模式实验构建:

实验环境:
此次试验需要配置三台服务器
10.10.10.11
10.10.10.12
10.10.10.13
本机地址:10.10.10.240

大致流程
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 配置路由规则拿到数据报文,回信给客户端

Ⅰ 负载调度器配置(10.10.10.100、10.10.10.10)

①网卡配置

[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=1f1f381c-aea2-4625-b07d-728c1a35040f
DEVICE=ens33
ONBOOT=yes  #开机自启IPADDR=10.10.10.11
NETMASK=255.255.255.0
[root@localhost ~]$ systemctl restart network

再利用xshell进行连接

ok,连接成功!!

②本地yum源配置

[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 yum.repos.d]$ mkdir bak
[root@localhost yum.repos.d]$ cp -a bak/CentOS-Media.repo  ./
[root@localhost ~]$ vim CentOS-Media.repo
[c7-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-7[root@localhost yum.repos.d]$ yum clean all
已加载插件:fastestmirror, langpacks
正在清理软件源: c7-media
Cleaning up everything
Maybe you want: rm -rf /var/cache/yum, to also free up space taken by orphaned data from disabled or removed repos
[root@localhost yum.repos.d]$ yum update
已加载插件:fastestmirror, langpacks
Determining fastest mirrors
c7-media                                                 | 3.6 kB     00:00
(1/2): c7-media/group_gz                                   | 166 kB   00:00
(2/2): c7-media/primary_db                                 | 3.1 MB   00:00
No packages marked for update
[root@localhost yum.repos.d]$ yum -y install gcc* lrzsz

③关闭网卡守护进程(NetworkManager)
负责无线网卡的启用,包括一些不安全的网络策略,它会进行强制关闭,因此对于我们这个实验需要使用子接口,这个服务就可能会拒绝我们子接口的动作,因此我们需要关闭此服务。

[root@localhost ~]$ systemctl stop NetworkManager    #临时关闭
[root@localhost ~]$ systemctl disable  NetworkManager  #永久关闭
Removed symlink /etc/systemd/system/multi-user.target.wants/NetworkManager.service.
Removed symlink /etc/systemd/system/dbus-org.freedesktop.NetworkManager.service.
Removed symlink /etc/systemd/system/dbus-org.freedesktop.nm-dispatcher.service.
[root@localhost ~]$ systemctl status  NetworkManager
● NetworkManager.service - Network ManagerLoaded: loaded (/usr/lib/systemd/system/NetworkManager.service; disabled; vendor preset: enabled)Active: inactive (dead) since 四 2022-11-10 18:51:14 +06; 18s agoDocs: man:NetworkManager(8)Main PID: 687 (code=exited, status=0/SUCCESS)11月 10 18:37:44 localhost.localdomain NetworkManager[687]: <info>  [1668083864.7576] manager: NetworkManager state is now CONNECTED_LOCAL
11月 10 18:37:44 localhost.localdomain NetworkManager[687]: <info>  [1668083864.7647] manager: NetworkManager state is now CONNECTED_SITE
11月 10 18:37:44 localhost.localdomain NetworkManager[687]: <info>  [1668083864.7648] policy: set 'ens34' (ens34) as default for IP...d DNS
11月 10 18:37:44 localhost.localdomain NetworkManager[687]: <info>  [1668083864.7674] device (ens34): Activation: successful, devic...ated.
11月 10 18:37:44 localhost.localdomain NetworkManager[687]: <info>  [1668083864.7769] manager: NetworkManager state is now CONNECTED_GLOBAL
11月 10 18:51:14 localhost.localdomain NetworkManager[687]: <info>  [1668084674.4425] caught SIGTERM, shutting down normally.
11月 10 18:51:14 localhost.localdomain systemd[1]: Stopping Network Manager...
11月 10 18:51:14 localhost.localdomain NetworkManager[687]: <info>  [1668084674.4512] device (virbr0-nic): released from master dev...irbr0
11月 10 18:51:14 localhost.localdomain NetworkManager[687]: <info>  [1668084674.4570] exiting (success)
11月 10 18:51:14 localhost.localdomain systemd[1]: Stopped Network Manager.
Hint: Some lines were ellipsized, use -l to show in full.

④开启子接口

[root@localhost ~]$ cd /etc/sysconfig/network-scripts/
[root@localhost network-scripts]$ cp -a ifcfg-ens33 ifcfg-ens33:0
[root@localhost network-scripts]$ vim ifcfg-ens33:0
BOOTPROTO=static
DEVICE=ens33:0
ONBOOT=yes
IPADDR=10.10.10.100
NETMASK=255.255.255.0  #仅修改这里的ip即可
[root@localhost network-scripts]$ systemctl restart network   #重启网卡
[root@localhost network-scripts]$ ifconfig   #查看网卡配置
ens33: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500inet 10.10.10.10  netmask 255.255.255.0  broadcast 10.10.10.255inet6 fe80::20c:29ff:fe96:810a  prefixlen 64  scopeid 0x20<link>ether 00:0c:29:96:81:0a  txqueuelen 1000  (Ethernet)RX packets 1030  bytes 109107 (106.5 KiB)RX errors 0  dropped 0  overruns 0  frame 0TX packets 737  bytes 96438 (94.1 KiB)TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0ens33:0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500inet 10.10.10.100  netmask 255.255.255.0  broadcast 10.10.10.255ether 00:0c:29:96:81:0a  txqueuelen 1000  (Ethernet)

5)修改内核配置文件
ICMP重定向问题

[root@localhost ~]$ vim /etc/sysctl.conf # 关闭网卡重定向功能
#最后一行添加
net.ipv4.conf.all.send_redirects = 0   #关闭所有网卡ICMP重定向功能
net.ipv4.conf.default.send_redirects = 0   #关闭默认网卡ICMP重定向功能
net.ipv4.conf.ens33.send_redirects = 0   #关闭ens33网卡ICMP重定向功能
[root@localhost ~]$ sysctl -p #重新加载配置文件

6)安装ipvsadm
ipvsadm命令大全

[root@localhost ~]$ yum  -y install ipvsadm   #报错的话重新挂载镜像
[root@localhost ~]$ modprobe ip_vs   #将ip_vs加载到内核中
[root@localhost ~]$ ipvsadm -Ln   #查询当前负载情况
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags-> RemoteAddress:Port           Forward Weight ActiveConn InActConn

7)添加ipvs规则

[root@localhost ~]$ ipvsadm -v   #查看当前 ipvs 集群内容
[root@localhost ~]$ ipvsadm -A -t 10.10.10.100:80 -s rr
#ipvsadm -A -t 虚拟IP:80 -s rr
#添加 ipvs TCP 集群,-A添加一个集群,-t TCP协议,-s 指定算法,rr轮询
[root@localhost yum.repos.d]$  ipvsadm -a -t 10.10.10.100:80 -r 10.10.10.11:80 -g
[root@localhost yum.repos.d]$  ipvsadm -a -t 10.10.10.100:80 -r 10.10.10.12:80 -g
#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 yum.repos.d]$  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 yum.repos.d]$ ipvsadm -S   #保存 ipvs 集群内容至文件,进行持久化存储
-A -t localhost.localdomain:http -s rr
-a -t localhost.localdomain:http -r 10.10.10.11:http -g -w 1
-a -t localhost.localdomain:http -r 10.10.10.12:http -g -w 1
[root@localhost yum.repos.d]$ systemctl enable ipvsadm.service    # 设置为开机自启
Created symlink from /etc/systemd/system/multi-user.target.wants/ipvsadm.service to /usr/lib/systemd/system/ipvsadm.service.
[root@localhost yum.repos.d]$ 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                     0        0        0        0        0-> 10.10.10.11:80                      0        0        0        0        0-> 10.10.10.12:80                      0        0        0        0        0

如果需要重启ipvsadm请看这里

Ⅱ 修改真实服务器(10.10.10.11、10.10.10.12)

①安装apache,设置开机自启,并启动。

[root@localhost ~]$ yum -y install httpd
[root@localhost ~]$ systemctl start httpd && systemctl enable httpd && systemctl status httpd
#启动,开机自启,查看状态
Created symlink from /etc/systemd/system/multi-user.target.wants/httpd.service to /usr/lib/systemd/system/httpd.service.
● httpd.service - The Apache HTTP ServerLoaded: loaded (/usr/lib/systemd/system/httpd.service; enabled; vendor preset: disabled)Active: active (running) since 五 2022-11-11 09:01:49 +06; 99ms agoDocs: man:httpd(8)man:apachectl(8)Main PID: 61312 (httpd)Status: "Processing requests..."CGroup: /system.slice/httpd.service├─61312 /usr/sbin/httpd -DFOREGROUND├─61313 /usr/sbin/httpd -DFOREGROUND├─61314 /usr/sbin/httpd -DFOREGROUND├─61315 /usr/sbin/httpd -DFOREGROUND├─61316 /usr/sbin/httpd -DFOREGROUND└─61317 /usr/sbin/httpd -DFOREGROUND11月 11 09:01:49 localhost.localdomain systemd[1]: Starting The Apache HTTP Server...
11月 11 09:01:49 localhost.localdomain httpd[61312]: AH00558: httpd: Could not reliably determine the server's fully qualified domain name, using localhost.localdomain. Set ...his message
11月 11 09:01:49 localhost.localdomain systemd[1]: Started The Apache HTTP Server.
Hint: Some lines were ellipsized, use -l to show in full.

②设置网页画面(index.html)
向/var/www/html/index.html追加内容

[root@localhost yum.repos.d]$ echo "this is server 1" >> /var/www/html/index.html  #这是10.10.10.11的
[root@localhost yum.repos.d]$ echo "this is server 2" >> /var/www/html/index.html  #这是10.10.10.12的
[root@localhost network-scripts]$ systemctl restart httpd   #重启阿帕奇

③修改网卡配置,添加环回口接口的子接口(10.10.10.100)

[root@localhost ~]$ cd /etc/sysconfig/network-scripts/
[root@localhost network-scripts]$ cp -a ifcfg-lo ifcfg-lo:0
[root@localhost network-scripts]$ vim ifcfg-lo:0
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

④修改内核配置文件(关闭对应 ARP 响应及公告功能)1,2
ARP配置修改

ARP响应级别   arp-ignore

0只要本机配置有相应IP地址就响应   
1仅在请求的目标地址配置在请求到达的网络接口上时,才给予响应

ARP通告行为   arp-announce
  
0将本机任何网络接口上的任何地址都向外通告   
1尽可能避免像目标网络通告与其网络不匹配的地址信息表
2仅向目标网络通告与其网络相匹配的地址信息

[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 ~]$ systemctl restart network   #重启网卡
或者
[root@localhost ~]$ ifup ifcfg-lo:0   #重启环回口
[root@localhost ~]$ ifconfig
..
lo:0: flags=73<UP,LOOPBACK,RUNNING>  mtu 65536inet 10.10.10.100  netmask 255.255.255.255loop  txqueuelen 1000  (Local Loopback)
[root@localhost etc]$  route add -host 10.10.10.100 dev lo:0
[root@localhost network-scripts]$ route -n
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
10.10.10.0      0.0.0.0         255.255.255.0   U     0      0        0 ens33
169.254.0.0     0.0.0.0         255.255.0.0     U     1002   0        0 ens33
192.168.122.0   0.0.0.0         255.255.255.0   U     0      0        0 virbr0
[root@localhost etc]$ echo "route add -host 10.10.10.100 dev lo:0" >> /etc/rc.local
#添加路由(RS接收到10.10.10.100的路由后,直接传给lo)并设置开机脚本中
#[root@localhost yum.repos.d]# route del -host 10.10.10.100 dev lo

⑤测试:

[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                 25              359              0         82706               0-> 10.10.10.11:80                  13              151              0         32574               0-> 10.10.10.12:80                  12              208              0         50132               0

3)TUN模式(公网环境下,利用二次封装技术)


特点:
1、集群子节点必须直接或间接拥有公网IP
2、真实服务器必须将网关指向真实网关处
3、不支持端口映射
4、负载调度器和真实服务器必须开启隧道功能(二次封装)
5、入站由DS完成,出站由RS完成
6、负载调度器必须是Linux操作系统,其他真实服务器随意
7、压力较大(虽然入站由DS完成,出站由RS完成,但DS需要做数据的二次封装和解封装的过程)

TUN的实验需要在公有网络,因此无法实验

负载均衡集群相关调度算法

1)静态调度算法

特点:只根据算法本身去调度服务器,不考虑服务器的性能和压力

①RR(轮询,Round robin):每次将用户的请求分配给后端的服务器,从第一台服务器开始到第 N 台结束,依次分配,然后循环。
②WRR(加权轮询,Weight Round robin):按照权重的比例实现在多台主机之间进行调度
③SH(源地址散列,Source hash):将同一个 IP 的用户请求,发送给同一个服务器
这里的SH就类似于http/https的无状态连接,cookie与session的访问方式
cookie:用户端持久化
session:服务器端持久化

④DH(目的地址散列,Destination hash):将同一个目标地址的用户请求发送给同一个真实服务器(常见在缓存服务器squid使用,提高缓存的命中率)

2)动态调度算法

特点:不光考虑算法本身,还需考虑服务器状态

①LC(最少连接,least-connection):通过服务器当前活跃的连接数来估计服务器的情况。调度器需要记录各个服务器已建立连接的数目,当一个请求被调度到某台服务器,其连接数加1;当连接中断或者超时,其连接数减1。将新的连接请求分配给连接数最少的服务器。活动连接X256+非活动连接
②WLC(加权最少连接,Weight least-connection):服务器的缺省权值为1,系统管理员可以动态地设置服务器的权值。加权最小连接调度在调度新连接时尽可能使服务器的已建立连接数和其权值成比例。调度器可以自动问询真实服务器的负载情况,并动态地调整其权值。是特殊的最少连接算法,权重越大承担的请求数越多,因此连接数最少。(活动连接X256+非活动连接)/权重

③SED 最短期望延迟(特殊的WLC算法):利用了数学思维。(活动连接+1)*256/权重

④NQ 永不排队: 特殊的 SED 算法,无需等待,如果有真实服务器的连接数等于 0 那就直接 分配不需要运算。
⑤LBLC 特殊的 DH 算法: 即能提高缓存命中率,又要考虑服务器性能。

⑥LBLCR LBLC+缓存:尽可能提高负载均衡和缓存命中率的折中方案。

LVS的持久化连接(类似于SH+RR)

应用场景:普遍应用于https集群中,当LVS面对https的场景,可以使用 持久化连接 和
通用算法,持久化连接优先级最高(类似SH算法),当定时器为0后,此连接请求消失,客户端再刷新时,此时LVS就使用通用算法了。

定义: 将来自于同一个客户端的所有请求统统定向至此前选定的 RS ;也就是只要 IP
相同,分配的服务器始终相同。且LVS上存在一个定时器,当时间不为0时,这个客户端可以正常访问,每次网页刷新不需要重复握手等操作,当时间减为0后,此客户端的请求自动消失,需要重新进行握手等操作。

持久化连接分类

1)持久化客户端连接(PCC):

将来自于同一个客户端的所有请求统统定向至此前选定的 RS ;也就是只要 IP 相同,分配的服务器始终相同

[root@localhost ~]$ ipvsadm -A -t 172.16.0.8:0 -s wlc -p 120
# 添加一个 tcp 负载集群,集群地址为 172.16.0.8 , 算法为 wlc,持久化时间为 120s
2)持久化端口连接(PPC):

将来自于同一个客户端对同一个服务(端口)的请求,始终定向至此前选定的 RS。

[root@localhost ~]$ ipvsadm -A -t 172.16.0.8:80 -s rr -p 120
# 添加一个 tcp 负载集群,集群地址为 172.16.0.8:80 , 算法为 wlc,持久化时间为 120s
3)持久化防火墙标记连接(PFMC):

将来自于同一客户端对指定服务(端口)的请求,始终定向至此选定的 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
[root@localhost ~]$ service iptables save
# 保存防火墙规则持久化生效
[root@localhost ~]$ ipvsadm -A -f 10 -s wlc -p 120
# 添加一个负载调度器,当 mark 值为 10 时进行负载均衡使用 wlc 算法,持久化生效时间为 120s

高可用集群

定义:高可用集群是指以减少服务中断时间为目的的服务器集群技术。它通过保护用户的业务程序对外不间断提供的服务,把因软件/硬件/人为造成的故障对业务的影响降低到最小程度。

keepalive

keepalive官网

Keepalived + LVS -DR 高可用实验构建


实验环境:
四台服务器:
2LVS:10.10.10.11、10.10.10.14
2RS: 10.10.10.12、10.10.10.13
一台客户端:10.10.10.140

实验准备:四台服务器全部关闭 NetworkManager

[root@localhost ~]$ systemctl stop NetworkManager && systemctl disable NetworkManager

配置LVS主节点(10.10.10.11)

安装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.12:80 -g
[root@localhost ~]$ ipvsadm -a -t 10.10.10.100:80 -r 10.10.10.13: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.12:80               Route   1      0          0         -> 10.10.10.13:80               Route   1      0          0

在主节点上配置keepalived master

编写健康检测脚本(用于实时检测LVS下的RS是否正常,如果异常,则自动将异常的服务器从ipvsadm表中删除,当异常服务器恢复正常后,又将其添加回ipvsadm表中)

[root@localhost ~]$ vim check_lvs_real.sh
#!/bin/bash
#检测lvs集群节点是否正常,不正常则踢出集群VIP=10.10.10.100 #集群虚拟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=1while [ $I -le $CHKLOOP ]; doif curl --connect-timeout 1 http://$1 &> /dev/null; thenreturn 0filet I++donereturn 1
}#初始化RS在线状态,如果在线,设置节点初始化状态为1,否则为0
initstatus() {local Ilocal COUNT=0;for I in ${RS[*]}; doif ipvsadm -L -n | grep "$I:$RPORT" && > /dev/null ; thenRSSTATUS[$COUNT]=1elseRSSTATUS[$COUNT]=0filet COUNT++done
}#进行初始化
initstatus#监测rs是否加入到ipvs中。如果未添加并且在线则添加;如果已添加并且不在线,则删除
while :; dolet COUNT=0for I in ${RS[*]}; doif checkrs $I; thenif [ ${RSSTATUS[$COUNT]} -eq 0 ]; thenaddrs $I ${RW[$COUNT]}[ $? -eq 0 ] && RSSTATUS[$COUNT]=1 && echo "`date +'%F %H:%M:%S'`, $I is back." >> $LOGfielseif [ ${RSSTATUS[$COUNT]} -eq 1 ]; thendelrs $I[ $? -eq 0 ] && RSSTATUS[$COUNT]=0 && echo "`date +'%F %H:%M:%S'`, $I is gone." >> $LOGfifilet COUNT++donesleep 5
done

上传 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 软件配置

# 多余删除 dG 删除光标之后的所有内容
[root@localhost ~]$ vim /etc/keepalived/keepalived.conf # 修改 配置global_defs {notification_email {admin@tarena.com.cn                   //设置报警收件人邮箱}notification_email_from ka@localhost    //设置发件人smtp_server 127.0.0.1                   //定义邮件服务器smtp_connect_timeout 30router_id  lvs1                         //设置路由ID号(实验需要修改)}vrrp_instance VI_1 {state MASTER                            //主服务器为MASTERinterface ens33                          //定义网络接口virtual_router_id 51                    //主辅VRID号必须一致priority 100                            //服务器优先级advert_int 1authentication {auth_type passauth_pass 1111                        //主辅服务器密码必须一致}virtual_ipaddress {                     //配置VIP(实验需要修改)10.10.10.100}   }virtual_server 10.10.10.100 80 {           //设置ipvsadm的VIP规则(实验需要修改)delay_loop 6lb_algo rr                               //设置LVS调度算法为RRlb_kind DR                               //设置LVS的模式为DR(实验需要修改)#persistence_timeout 50                  //(实验需要注释)#注意这样的作用是保持连接,开启后,客户端在一定时间内始终访问相同服务器protocol TCPreal_server 10.10.10.12 80 {           //设置后端web服务器真实IP(实验需要修改)weight 1                               //设置权重为1TCP_CHECK {                            //对后台real_server做健康检查(实验需要修改)connect_timeout 3nb_get_retry 3delay_before_retry 3}}real_server 10.10.10.13 80 {            //设置后端web服务器真实IP(实验需要修改)weight 1                               //设置权重为1TCP_CHECK {                            //对后台real_server做健康检查(实验需要修改)connect_timeout 3nb_get_retry 3delay_before_retry 3}}}
[root@localhost ~]$ service keepalived start 启动keealived
或者
[root@localhost ~]$ systemctl start keepalived
[root@localhost ~]$ cat /var/log/messages
Nov 14 16:00:08 localhost keepalived: Starting keepalived: [  确定  ]
Nov 14 16:00:08 localhost Keepalived: Starting VRRP child process, pid=23763
Nov 14 16:00:08 localhost systemd: Started SYSV: Start and stop Keepalived.
Nov 14 16:00:08 localhost Keepalived_vrrp: Registering Kernel netlink reflector
Nov 14 16:00:08 localhost Keepalived_vrrp: Registering Kernel netlink command channel
Nov 14 16:00:08 localhost Keepalived_vrrp: Registering gratutious ARP shared channel
Nov 14 16:00:08 localhost Keepalived_vrrp: Opening file '/etc/keepalived/keepalived.conf'.
Nov 14 16:00:08 localhost Keepalived_vrrp: Configuration is using : 64018 Bytes
Nov 14 16:00:08 localhost Keepalived_vrrp: Using LinkWatch kernel netlink reflector...
Nov 14 16:00:08 localhost Keepalived_vrrp: VRRP sockpool: [ifindex(2), proto(112), fd(10,11)]
Nov 14 16:00:09 localhost Keepalived_vrrp: VRRP_Instance(VI_1) Transition to MASTER STATE
Nov 14 16:00:10 localhost Keepalived_vrrp: VRRP_Instance(VI_1) Entering MASTER STATE
Nov 14 16:00:10 localhost Keepalived_vrrp: VRRP_Instance(VI_1) setting protocol VIPs.
Nov 14 16:00:10 localhost Keepalived_vrrp: VRRP_Instance(VI_1) Sending gratuitous ARPs on ens33 for 10.10.10.100
Nov 14 16:00:10 localhost avahi-daemon[683]: Registering new address record for 10.10.10.100 on ens33.IPv4.
Nov 14 16:00:15 localhost Keepalived_vrrp: VRRP_Instance(VI_1) Sending gratuitous ARPs on ens33 for 10.10.10.100

从节点配置(10.10.10.14)keepalived slave

编写健康检测脚本(用于实时检测LVS下的RS是否正常,如果异常,则自动将异常的服务器从ipvsadm表中删除,当异常服务器恢复正常后,又将其添加回ipvsadm表中)

[root@localhost ~]$ vim check_lvs_real.sh
#!/bin/bash
#检测lvs集群节点是否正常,不正常则踢出集群VIP=10.10.10.100 #集群虚拟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=1while [ $I -le $CHKLOOP ]; doif curl --connect-timeout 1 http://$1 &> /dev/null; thenreturn 0filet I++donereturn 1
}#初始化RS在线状态,如果在线,设置节点初始化状态为1,否则为0
initstatus() {local Ilocal COUNT=0;for I in ${RS[*]}; doif ipvsadm -L -n | grep "$I:$RPORT" && > /dev/null ; thenRSSTATUS[$COUNT]=1elseRSSTATUS[$COUNT]=0filet COUNT++done
}#进行初始化
initstatus#监测rs是否加入到ipvs中。如果未添加并且在线则添加;如果已添加并且不在线,则删除
while :; dolet COUNT=0for I in ${RS[*]}; doif checkrs $I; thenif [ ${RSSTATUS[$COUNT]} -eq 0 ]; thenaddrs $I ${RW[$COUNT]}[ $? -eq 0 ] && RSSTATUS[$COUNT]=1 && echo "`date +'%F %H:%M:%S'`, $I is back." >> $LOGfielseif [ ${RSSTATUS[$COUNT]} -eq 1 ]; thendelrs $I[ $? -eq 0 ] && RSSTATUS[$COUNT]=0 && echo "`date +'%F %H:%M:%S'`, $I is gone." >> $LOGfifilet COUNT++donesleep 5
done

首先下载ipvsadm

[root@localhost ~]$ mount -t iso9660 /dev/cdrom /mnt/cdrom #挂载光盘
[root@localhost ~]$ yum -y install ipvsadm #安装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.12:80 -g
[root@localhost ~]$ ipvsadm -a -t 10.10.10.100:80 -r 10.10.10.13: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.12:80               Route   1      0          0         -> 10.10.10.13:80               Route   1      0          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

配置 Keepalived配置文件

#把远程服务器的keepalived.conf 下载到本地/etc/keepalived目录下
[root@localhost ~]$ scp root@10.10.10.11:/etc/keepalived/keepalived.conf /etc/keepalived/
再去keepalived.conf的配置文件修改
[root@localhost ~]$ vim /etc/keepalived/keepalived.conf
#修改 1:router_id R1 修改为  router_id lvs1
#修改 2:state MASTER 修改至 state SLAVE
#修改 3:priority 100 修改至 priority 50 一般建议与主服务器差值为 50global_defs {notification_email {admin@tarena.com.cn                   //设置报警收件人邮箱}notification_email_from ka@localhost    //设置发件人smtp_server 127.0.0.1                   //定义邮件服务器smtp_connect_timeout 30router_id  lvs1                         //设置路由ID号(实验需要修改)}vrrp_instance VI_1 {state SLAVE                           //主服务器为MASTERinterface ens33                          //定义网络接口virtual_router_id 51                    //主辅VRID号必须一致priority 50                            //服务器优先级advert_int 1authentication {auth_type passauth_pass 1111                        //主辅服务器密码必须一致}virtual_ipaddress {                     //配置VIP(实验需要修改)10.10.10.100}   }virtual_server 10.10.10.100 80 {           //设置ipvsadm的VIP规则(实验需要修改)delay_loop 6lb_algo rr                               //设置LVS调度算法为RRlb_kind DR                               //设置LVS的模式为DR(实验需要修改)#persistence_timeout 50                  //(实验需要注释)#注意这样的作用是保持连接,开启后,客户端在一定时间内始终访问相同服务器protocol TCPreal_server 10.10.10.12 80 {           //设置后端web服务器真实IP(实验需要修改)weight 1                               //设置权重为1TCP_CHECK {                            //对后台real_server做健康检查(实验需要修改)connect_timeout 3nb_get_retry 3delay_before_retry 3}}real_server 10.10.10.13 80 {            //设置后端web服务器真实IP(实验需要修改)weight 2                               //设置权重为1TCP_CHECK {                            //对后台real_server做健康检查(实验需要修改)connect_timeout 3nb_get_retry 3delay_before_retry 3}}}
[root@localhost ~]$ service keepalived start 启动keealived
或者
[root@localhost ~]$ systemctl start keepalived
[root@localhost ~]$ cat /var/log/messages
Nov 14 18:10:06 localhost keepalived: Starting keepalived: [  确定  ]
Nov 14 18:10:06 localhost Keepalived: Starting VRRP child process, pid=9884
Nov 14 18:10:06 localhost systemd: Started SYSV: Start and stop Keepalived.
Nov 14 18:10:06 localhost Keepalived_vrrp: Registering Kernel netlink reflector
Nov 14 18:10:06 localhost Keepalived_vrrp: Registering Kernel netlink command channel
Nov 14 18:10:06 localhost Keepalived_vrrp: Registering gratutious ARP shared channel
Nov 14 18:10:06 localhost Keepalived_vrrp: Opening file '/etc/keepalived/keepalived.conf'.
Nov 14 18:10:06 localhost Keepalived_vrrp: Configuration is using : 64014 Bytes
Nov 14 18:10:06 localhost Keepalived_vrrp: Using LinkWatch kernel netlink reflector...
Nov 14 18:10:06 localhost Keepalived_vrrp: VRRP_Instance(VI_1) Entering BACKUP STATE
Nov 14 18:10:06 localhost Keepalived_vrrp: VRRP sockpool: [ifindex(2), proto(112), fd(10,11)]

接着配置RS(10.10.10.12、10.10.10.13)

[root@localhost ~]$ systemctl start httpd && systemctl enable httpd  #启动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
#生产环境两台服务器的网页内容是一样的

新增环回口子接口(用于接收来自LVS的数据)

[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.255UP 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正常访问,也可以正常轮询


②且在keepalived master的ipvsadm后台下正常增加

③先测试keepalive是否正常使用,将模拟master down掉,将master的网卡down掉。再去访问10.10.10.100,验证是否能正常访问。且在后台ipvsadm表中正常轮询。


④现测试健康检测脚本是否生效
将10.10.10.11网卡恢复,并分别在主从LVS上运行脚本

为验证健康检测脚本的作用,将RS服务器的apache服务down掉,
再去LVS主上查看ipvsadm表中查看,此时已经没有了。

再将RS的apache服务开启,再去查看主上的ipvsadm表,此时又有了。

Heartbeat + Nginx 实验搭建

Heartbeat简介

Heartbeat 是一款开源提供高可用(Highly-Available)服务的软件,通过 heartbeat 可以将资源(IP及程序服务等资源)从一台已经故障的计算机快速转移到另一台正常运转的机器上继续提供服务,一般称之为高可用服务。
Heartbeat是Linux-HA项目中的一个组件,也是当前开源HA项目中最成功的一个例子,它提供了所有HA软件所需要的基本功能,如心跳检测和资源接管、监测群集中的系统服务、在群集中的节点间转移共享IP地址的所有者等。heartbeat最核心的功能包括两个部分,心跳监测和资源接管。心跳监测可以通过网络链路和串口进行,而且支持冗 余链路,它们之间相互发送报文来告诉对方自己当前的状态,如果在指定的时间内未收到对方发送的报文,那么就认为对方失效,这时需启动资源接管模块来接管运行在对方主机上的资源或者服务。

Heartbeat工作原理

通过修改配置文件,指定哪一台Heartbeat服务器作为主服务器,则另一台将自动成为备份服务器。然后在指定备份服务器上配置Heartbeat守护进程来监听来自主服务器的心跳。如果备份服务器在指定时间内未监听到来自主服务器的心跳,就会启动故障转移程序,并取得主服务器上的相关资源服务所有权,接替主服务器继续不间断的提供服务,从而达到资源服务高可用性的目的。

以上描述的是Heartbeat主备的模式,Heartbeat还支持主主模式,即两台服务器互为主备,这时它们之间会相互发送报文来告诉对方自己当前的状态,如果在指定的时间内为收到对方发送的心跳报文,那么久认为对方失效或者宕机了,这时就会启动自身的资源接管模块来接管运行在对方主机上的资源或者服务,继续对用户提供服务。正常情况下,可以较好的实现主机故障后,业务仍不间断的持续运行。

keepalived主要控制IP飘移,配置应用简单,而且分层,layer3,4,5,各自配置极为简单。heartbeat不但可以控制IP飘移,更擅长对资源服务的控制,配置,应用比较复杂。lvs的高可用建议用keepavlived;业务的高可用用heartbeat。

HeartBeat + Nginx 构建

实验环境:两台服务器+一台客户端
10.10.10.15
10.10.10.16
环境准备:
    配置时间同步服务
    配置主机名解析

基础环境搭建(10.10.10.15、10.10.10.16)

源码包编译nginx

[root@localhost ~]# tar -zxf nginx-1.20.2.tar.gz
[root@localhost ~]# cd nginx-1.20.2/
[root@localhost nginx-1.20.2]# useradd -s /sbin/nologin -M nginx  #不允许远程登陆,-M 不创建家目录
[root@localhost nginx-1.20.2]$ yum -y install pcre pcre-devel zlib zlib-devel  #安装依赖
[root@localhost nginx-1.20.2]$ ./configure --prefix=/usr/local/nginx --user=nginx --group=nginx
[root@localhost nginx-1.20.2]$ make && make install #编译安装
#生产环境网页内容是一致的
[root@localhost ~]$ echo "aaaaaaaa" > /usr/local/nginx/html/index.html #10.10.10.15服务器
[root@localhost ~]$ echo "bbbbbbbb" > /usr/local/nginx/html/index.html #10.10.10.16服务器
[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重启ntpd配置文件并设置开机自启
[root@localhost ~]$ service ntpd start && chkconfig ntpd on
或者
[root@localhost ~]$ systemctl restart ntpd && systemctl enable ntpd接着在10.10.10.16执行同步时间
[root@localhost ~]$ ntpdate -u 10.10.10.15
23 Dec 23:01:18 ntpdate[29025]: adjust time server 10.10.10.15 offset -0.059989 sec

配置主机名解析

[root@localhost ~]$ vim /etc/sysconfig/network
NETWORKING=yes
HOSTNAME=www.centos1.com
#另台的HOSTNAME=www.centos1.com为了简单,直接在两台服务器上的hosts文件做域名映射,也可以直接搭建一个DNS服务。
[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.15 www.centos1.com
10.10.10.16 www.centos2.com

配置虚拟网卡:

源码包编译HeartBeat 主(10.10.10.15)

Hearbeat官网
下载这三个安装包

大概解压出来就这三个文件

1、Reusable-Cluster-Components-glue–0a7add1d9996
2、resource-agents-3.9.6
3、Heartbeat-3-0-958e11be8686
接着开始按顺序安装:

编译Reusable-Cluster-Components-glue–0a7add1d9996

[root@localhost ~]# yum install gcc gcc-c++ autoconf automake libtool glib2-devel libxml2-devel bzip2 bzip2-devel e2fsprogs-devel libxslt-devel libtool-ltdl-devel asciidoc  //先安装基础环境,不然后面编译安装肯定报错
[root@localhost ~]# groupadd haclient
[root@localhost ~]# useradd -g haclient hacluster //创建组及运行用户
[root@localhost ~]# cd Reusable-Cluster-Components-glue--0a7add1d9996
[root@localhost Reusable-Cluster-Components-glue--0a7add1d9996]#  ./autogen.sh
[root@localhost Reusable-Cluster-Components-glue--0a7add1d9996]#  ./configure --prefix=/usr/local/heartbeat --with-daemon-user=hacluster --with-daemon-group=haclient --enable-fatal-warnings=no LIBS='/lib64/libuuid.so.1'
[root@localhost Reusable-Cluster-Components-glue--0a7add1d9996]# make && make install

编译resource-agents-3.9.6

[root@localhost ~]# cd resource-agents-3.9.6
[root@localhost resource-agents-3.9.6]# ./autogen.sh
[root@localhost resource-agents-3.9.6]# ./configure --prefix=/usr/local/heartbeat --with-daemon-user=hacluster --with-daemon-group=haclient --enable-fatal-warnings=no LIBS='/lib64/libuuid.so.1'
[root@localhost resource-agents-3.9.6]# make && make install

编译Heartbeat-3-0-958e11be8686

[root@localhost ~]# cd Heartbeat-3-0-958e11be8686/
[root@localhost Heartbeat-3-0-958e11be8686]# ./bootstrap
[root@localhost Heartbeat-3-0-958e11be8686]# export CFLAGS="$CFLAGS -I/usr/local/heartbeat/include -L/usr/local/heartbeat/lib"  添加环境变量
[root@localhost Heartbeat-3-0-958e11be8686]# ./configure --prefix=/usr/local/heartbeat --with-daemon-user=hacluster --with-daemon-group=haclient --enable-fatal-warnings=no LIBS='/lib64/libuuid.so.1'
[root@localhost Heartbeat-3-0-958e11be8686]# make && make install
[root@localhost Heartbeat-3-0-958e11be8686]# cp doc/{ha.cf,haresources,authkeys} /usr/local/heartbeat/etc/ha.d/
[root@localhost ~]# chkconfig --add heartbeat
[root@localhost ~]# chkconfig heartbeat on
[root@localhost ~]# cd /usr/local/heartbeat/etc/ha.d/
[root@localhost ha.d]#  dd if=/dev/random bs=512 count=1 | openssl md5 #生成密钥随机数
[root@localhost ~]$ vim authkeys
auth 3
1 crc
2 sha1 HI!
3 md5 96aa34dbaa57f0fd856d3aac15da009c
[root@localhost ha.d]# chmod 600 authkeys

heartbeat 主配置文件,修改/usr/local/heartbeat/etc/ha.d, 在主上(10.10.10.15)修改

[root@localhost ~]$ vim /usr/local/heartbeat/etc/ha.d
//意思就是配置那块网卡进行心跳检测
bcast   ens33            # Linux
#bcast  eth1 eth2       # Linux
#bcast  le0             # Solaris
#bcast  le1 le2         # Solaris
接着搜索node,  esc  /node,找到下面
#       Tell what machines are in the cluster
#       node    nodename ...    -- must match uname -n
node   www.centos1.com
node   www.centos2.com

配置 haresources 文件,在主上修改

[root@localhost ~]$ vim /usr/local/heartbeat/etc/ha.d/haresources
dG直接到最后一行,找到下面:
#node1  10.0.0.170 Filesystem::/dev/sda1::/data1::ext2节点   主的IP地址   配置命令  #最后一行添加
www.centos1.com IPaddr::10.10.10.100/24/ens33:0
#IPaddr这个脚本等同于ifconfig ens33:0 10.10.10.100 netmask 255.255.255.0

在/usr/local/heartbeat/etc/ha.d/resource.d目录下,存放在许多官方已经写好的切换脚本

源码包编译HeartBeat 从(10.10.10.16)

跟主 10.10.10.15相同的步骤

编译Reusable-Cluster-Components-glue--0a7add1d9996
```bash
[root@localhost ~]# yum install gcc gcc-c++ autoconf automake libtool glib2-devel libxml2-devel bzip2 bzip2-devel e2fsprogs-devel libxslt-devel libtool-ltdl-devel asciidoc  //先安装基础环境,不然后面编译安装肯定报错
[root@localhost ~]# groupadd haclient
[root@localhost ~]# useradd -g haclient hacluster //创建组及运行用户
[root@localhost ~]# cd Reusable-Cluster-Components-glue--0a7add1d9996
[root@localhost Reusable-Cluster-Components-glue--0a7add1d9996]#  ./autogen.sh
[root@localhost Reusable-Cluster-Components-glue--0a7add1d9996]#  ./configure --prefix=/usr/local/heartbeat --with-daemon-user=hacluster --with-daemon-group=haclient --enable-fatal-warnings=no LIBS='/lib64/libuuid.so.1'
[root@localhost Reusable-Cluster-Components-glue--0a7add1d9996]# make && make install

编译resource-agents-3.9.6

[root@localhost ~]# cd resource-agents-3.9.6
[root@localhost resource-agents-3.9.6]# ./autogen.sh
[root@localhost resource-agents-3.9.6]# ./configure --prefix=/usr/local/heartbeat --with-daemon-user=hacluster --with-daemon-group=haclient --enable-fatal-warnings=no LIBS='/lib64/libuuid.so.1'
[root@localhost resource-agents-3.9.6]# make && make install

编译Heartbeat-3-0-958e11be8686

[root@localhost ~]# cd Heartbeat-3-0-958e11be8686/
[root@localhost Heartbeat-3-0-958e11be8686]# ./bootstrap
[root@localhost Heartbeat-3-0-958e11be8686]# export CFLAGS="$CFLAGS -I/usr/local/heartbeat/include -L/usr/local/heartbeat/lib"  添加环境变量
[root@localhost Heartbeat-3-0-958e11be8686]# ./configure --prefix=/usr/local/heartbeat --with-daemon-user=hacluster --with-daemon-group=haclient --enable-fatal-warnings=no LIBS='/lib64/libuuid.so.1'
[root@localhost Heartbeat-3-0-958e11be8686]# make && make install
[root@localhost Heartbeat-3-0-958e11be8686]# cp doc/{ha.cf,haresources,authkeys} /usr/local/heartbeat/etc/ha.d/
[root@localhost ~]# chkconfig --add heartbeat
[root@localhost ~]# chkconfig heartbeat on这里偷个懒,直接将主的ha.cf、haresources、authkeys这三个已经配置好的文件传到从这边来。
#将主三个配置文件拷贝到从上
[root@localhost ~]$ scp root@10.10.10.15:/usr/local/heartbeat/etc/ha.d/authkeys /usr/local/heartbeat/etc/ha.d/  #下载到本地
[root@localhost ~]$ scp root@10.10.10.15:/usr/local/heartbeat/etc/ha.d/ha.cf /usr/local/heartbeat/etc/ha.d/  #下载到本地
[root@localhost ~]$ scp root@10.10.10.15:/usr/local/heartbeat/etc/ha.d/haresources /usr/local/heartbeat/etc/ha.d/  #下载到本地
实验验证

在主和从上都开启nginx服务,并开启heartbeat服务。

[root@localhost ~]$ /usr/local/nginx/sbin/nginx # 主
[root@localhost ~]$ service heartbeat start # 主
[root@localhost ~]$ /usr/local/nginx/sbin/nginx #备
[root@localhost ~]$ service heartbeat start #备

接着就可以利用浏览器进行访问10.10.10.100了,如果访问不了,有可能是防火墙没有停止。

[root@localhost ~]$ systemctl stop firewalld && systemctl disable firewalld
[root@localhost ~]$ vim /etc/selinux/config
SELINUX=disabled  #修改为disable

此时访问浏览器应该就可以成功了!!!

现在我们开始验证heartbeat是否能实现主从切换。
首先打开客户机Windows的doc窗口。常ping10.10.10.100

此时先将主服务器的网卡down掉,右机这里,将其网卡断开。

主服务器网卡断开后,从服务器代替主服务器进行工作。中间会产生中断的情况,当从服务器代替主服务器后,又能正常ping通,现在再去访问10.10.10.100的网页。

此时网页内容由10.10.10.15的aaaaa,成功切换到10.10.10.16的bbbb上,ok实验结果很成功!!!!

此时再将10.10.10.15的网卡连接上,会发现网页内容又变成了aaaaa,因此10.10.10.15又抢回了主。

再去验证域名,也同样成功,但验证前,需要将windows的hosts文件修改下。

结果同样是可以成功的!!!

多级负载(四层、七层)

七层实现原理

四层实现原理

多级负载构建原理

实验构建:


六台服务器+一台客户机
10.10.10.11—LVS-DR
10.10.10.12—Nginx1
10.10.10.13—Nginx2
10.10.10.14—Apache1
10.10.10.15—Apache2
10.10.10.16—Apache3
10.10.10.140—客户机

实验准备:
全部关闭 firewalld 和 selinux 防火墙,配置yum源(既可本地,也可网络)

[root@localhost ~]$ systemctl stop firewalld && systemctl disable firewalld[root@localhost ~]$ mkdir /mnt/cdrom
[root@localhost ~]$ cd /etc/yum.repo/
[root@localhost yum.repos.d]$ mkdir bak
[root@localhost yum.repos.d]$ mv CentOS-*  bak
[root@localhost yum.repos.d]$ cp -a bak/CentOS-Media.repo .
[root@localhost yum.repos.d]$ vim CentOS-Media.repo
baseurl=file:///mnt/cdrom
gpgcheck=0
enabled=1
[root@localhost yum.repos.d]$ yum clean all
[root@localhost yum.repos.d]$ yum makecache

在Apache服务器上操作(10.10.10.14、10.10.10.15、10.10.10.16)

下载Apache服务(httpd)

[root@localhost yum.repos.d]$ yum -y install httpd
[root@localhost yum.repos.d]$ echo “this is server 4”  >>  /var/www/html/index.html
#将this is server 5输入到index.html 做网页文件,apache2、apache3也如此
[root@localhost yum.repos.d]$ echo “this is server 5”  >>  /var/www/html/index.html
[root@localhost yum.repos.d]$ echo “this is server 6”  >>  /var/www/html/index.html

上传Nginx源码包,编译Nginx(10.10.10.12、10.10.10.13)

[root@localhost ~]$ useradd -s /sbin/nologin -M nginx
#不允许远程登陆,-M 不创建家目录
[root@localhost ~]$ yum -y install pcre pcre-devel zlib zlib-devel gcc* #安装依赖
[root@localhost ~]$ tar -zxf nginx-1.20.2.tar.gz
[root@localhost ~]$ cd nginx-1.20.2/
[root@localhost nginx-1.20.2]$ ./configure --prefix=/usr/local/nginx --user=nginx --group=nginx
[root@localhost nginx-1.20.2]$ make && make install #编译安装
#修改配置nginx主配置文件,配置负载均衡+反向代理
#10.10.10.13不用执行此步骤,修改完直接复制即可(scp)
[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.12的nginx配置文件复制到10.10.10.13

[root@localhost ~]$ scp /usr/local/nginx/conf/nginx.conf root@10.10.10.13:/usr/local/nginx/conf/nginx.conf

打开C:\Windows\System32\drivers\etc,修改hosts文件,生产环境搭建dns服务
#添加如下内容,测试Nginx反向代理和负载均衡是否部署成功

#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服务器的内容,且是轮询的状态

搭建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-ens33:0
# 拷贝 ens33:0 网卡子接口充当集群入口接口
[root@localhost ~]$ vim ifcfg-ens33:0  #vim !$ 上一个命令最后一条参数
#修改成下面一样
DEVICE=ens33: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 ens33...

修改内核配置文件

[root@localhost ~]$ vim /etc/sysctl.conf # 关闭网卡重定向功能
#最后一行添加
net.ipv4.conf.all.send_redirects = 0
net.ipv4.conf.default.send_redirects = 0
net.ipv4.conf.ens33.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 ~]$ ipvsadm-save # 保存 ipvs 集群内容至文件,进行持久化存储
[root@localhost ~]$ chkconfig ipvsadm on # 设置为开机自启
[root@localhost ~]$ ipvsadm -Ln --stats #查看状态

搭建LVS-DR真实服务器(10.10.10.12、10.10.10.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.255UP 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 ens33
169.254.0.0     0.0.0.0         255.255.0.0     U     1002   0        0 ens33
#添加到开机自启,防止失效
[root@localhost ~]$ echo "route add -host 10.10.10.100 dev lo:0" >> /etc/rc.local

测试

打开C:\Windows\System32\drivers\etc,修改hosts文件,生产环境搭建dns服务

#添加如下内容
10.10.10.100 www.test.com
10.10.10.100 www.test.cn

用浏览器访问 www.test.com ,发现只会在4、5轮询


再访问www.test.cn,发现只访问server6

ok,实验成功。既在Nginx之间实现了轮询,减缓了流量压力,又在Apache之间实现了域名负载,使访问.com的用户只会传到.com的服务器,访问.cn的用户也只会传到.cn的服务器。

【负载均衡集群——保姆式教学】相关推荐

  1. Nginx负载均衡集群介绍

    第1章 集群介绍 1.1 集群简介 1.1.1 什么是集群 简单说,集群就是一组(若干个)相互独立的计算机,利用高速通信网络组成的一个较大的计算机服务系统,每个集群节点(即集群中的每台计算机)都是运行 ...

  2. LB负载均衡集群 - NAT

    前提: 客户机 : eth0   192.168.0.200       eth1  192.168.205.129 dir主机: eth0   192.168.0.166       eth1  1 ...

  3. docker初体验:docker部署nginx负载均衡集群

    Docker 是一个用于开发,交付和运行应用程序的开放平台.Docker 使您能够将应用程序与基础架构分开,从而可以快速交付软件.今天来为大家演示一下docker部署nginx负载均衡集群 环境 ce ...

  4. 负载均衡集群介绍、LVS介绍、LVS调度算法、 LVS NAT模式搭建

    负载均衡集群介绍 LVS介绍 lvs的NAT模式介绍 这种模式借助iptables的nat表来实现,用户的请求到分发器后,通过预设的iptables规则,把请求的数据包转发到后端的服务器上去,这些服务 ...

  5. 【LVS】负载均衡集群

    LVS (Linux Virtual Server)是一种集群(Cluster)技术,采用IP负载均衡技术和基于内容请求分发技术.LVS可以实现LINUX平台下的简单负载均衡. 其中LVS/NAT是一 ...

  6. 运维工程师必备之负载 均衡集群及LVS详解

    原文地址:运维工程师必备之负载 均衡集群及LVS详解作者:蚁巡运维平台 来源: chrinux 的BLOG 时间: 2013-07-01 14:00 此博文主要介绍集群和负载均衡的基本理论和类别,内容 ...

  7. Nginx+Tomcat 负载均衡集群方案

    2019独角兽企业重金招聘Python工程师标准>>> Nginx+Tomcat 负载均衡集群方案 该方案是我之前做过的一个项目生产应用的,目前运行良好,如何您生产使用,请先做好测试 ...

  8. IPVS-DR+keepalived实现高可用负载均衡集群

    IPVS-DR+keepalived高可用负载均衡集群方案前端的负载调度器采用双机热备方式,Keepalived主要用来监测RealServer的健康状态以及主负载均衡器和备份负载均衡器之间的故障转移 ...

  9. windows配置nginx实现负载均衡集群

    windows配置nginx实现负载均衡集群 2014-08-20 09:44:40   来源:www.abcde.cn   评论:0 点击:617 网上大部分关于nginx负载均衡集群的教程都是li ...

最新文章

  1. JDK8对并发的新支持
  2. d3 svg path添加文本_10 倍高清不花!大麦端选座 SVG 渲染
  3. java 类锁如何获得_Java Synchronized获得类的锁和获得对象的锁有什么区别呢?
  4. python入门100例题-这 100 道 Python 题,拿去刷!!!
  5. 数学建模竞赛常考三大模型及十大算法【预测模型、优化模型、评价模型】
  6. 最强数据库工具——IDEA
  7. 弘辽科技:加速布局机器人赛道,字节跳动有哪些“大心思”?
  8. R语言环境下载及RStudio安装教程
  9. 一个杭州人的美国求医经历
  10. 【Adobe Illustrator 教程】3. 认识钢笔工具
  11. 论文阅读笔记:A CRITIQUE OF SELF-EXPRESSIVE DEEP SUBSPACE CLUSTERING,自表达深度子空间聚类批判
  12. 如何将土豆优酷视频插入到自己网站里
  13. 用于excel(或wps)中进行ip处理转换的vbs模块
  14. 浅谈ajax使用方法
  15. 使用KaTeX渲染数学公式
  16. 我不看好中移动充当4G急先锋
  17. CSU2104: Extra Judicial Operation-Tarjan边双联通分量缩点两种方法-难受的bug
  18. Catch That Cow
  19. vb.net图书管理系统VS开发sqlserver数据库web结构vb编程源码网页
  20. EDC|太美eCollect会是EDC系统的明日之星吗?

热门文章

  1. “类平板天线”设计 newifi新路由2体验评测
  2. 这个要怎么写呢。。。
  3. AutoCompleteTextView实现联想输入
  4. 全国大学生数学建模比赛2011B题交巡警服务平台的设置与调度论文与代码
  5. 6款jQuery图表插件
  6. 第一篇博客,写在迷茫无措时
  7. 在线去除 kindle 书籍 azw格式 DRM保护
  8. 抖音虚拟主播进行直播无人值守直播(1:项目展望与演示)
  9. 版权监控中心怎么关闭_“这样子怎么见客户?”长沙一美容院员工撞上写字楼玻璃门,鼻子被缝4针,物业需要担责吗?...
  10. S3C2440设置时钟