Linux Virtual Server(LVS负载均衡)

发布时间 2023-07-27 20:22:58作者: 0918

Linux Virtual Server(LVS负载均衡)

本章内容 [Typora.exe - 快捷方式.lnk](Typora.exe - 快捷方式.lnk)

  • 集群概念
  • LVS模型
  • LVS算法
  • LVS相关软件ipvsadm
  • LVS实战案例
  • LVS高可用性

1 集群和分布式

1.1集群

  • LB Load Balancing 负载均衡,多个主机组成,每个主机只承担一部分访问请求

  • HA:High Availiablity,高可用,避免SPOF(single Point Of failure)
    MTBF:Mean Time Between Failure 平均无故障时间,正常时间
    MTTR:Mean Time To Restoration( repair)平均恢复前时间,故障时间
    A = MTBF /(MTBF+MTTR) (0,1):99%,99.5%,99.9%,99.99%,99.999%

    SLA:服务等级协议(简称:SLA,全称:service level agreement)。是指在一定开销下为保障服务的性能和可用性,服务提供商与用户间定义的一种双方认可的协定。通常这个开销是驱动提供服务质量的主要因素。在常规的领域中,总是设定所谓的三个9,四个9,N个9 等来进行表示,当没有达到这种水平的时候,就会有一些列的惩罚措施,而运维最主要的目标就是达成这种服务水平。停机时间又分为两种,一种是计划内停机时间,一种是计外停机时间,而运维则主要关注计划外停机时间。

    1年 = 365天 = 8760小时
    90 = (1-90%)*365=36.5天
    99 = 8760 * 1% = 87.6小时
    99.9 = 8760 * 0.1% = 8760 * 0.001 = 8.76小时
    99.99 = 8760 * 0.0001 = 0.876小时 = 0.876 * 60 = 52.6分钟
    99.999 = 8760 * 0.00001 = 0.0876小时 = 0.0876 * 60 = 5.26分钟
    99.9999= (1-99.9999%)*365*24*60*60=31秒
    
  • HPC:High-performance computing,高性能 http://www.top500.org

1.2 分布式系统

分布式常见应用

  • 分布式应用-服务按照功能拆分,使用微服务
    分布式静态资源--静态资源放在不同的存储集群上
    分布式数据和存储--使用key-value缓存系统
    分布式计算--对特殊业务使用分布式计算,比如Hadoop集群

分布式存储: Ceph,GlusterFS,FastDFS,MogileFS
分布式计算:hadoop,Spark

1.3 集群和分布式

集群:同一个业务系统部署在多台服务器上。集群中每一台服务器实现的功能没有差别,数据和代码都是一样的

分布式:一个业务被拆成多个子业务,或者本身就是不同的业务,部署在多台服务器上。分布式中,每一台服务器实现的功能是有差别的,数据和代码也是不一样的,分布式每台服务器功能加起来,才是完整的业务

分布式是以缩短单个任务的执行时间来提升效率的,而集群则是通过提高单位时间内执行的任务数来提升效率。

对于大型网站,访问用户很多,实现一个群集,在前面部署一个负载均衡服务器,后面几台服务器完成同一业务。如果有用户进行相应业务访问时,负载均衡器根据后端哪台服务器的负载情况,决定由给哪一台去完成响应,并且一台服务器垮了,其它的服务器可以顶上来。分布式的每一个节点,都完成不同的业务,如果一个节点垮了,那这个业务可能就会失败

1.4按现实方式划分

  • 硬件

image-20230725092628833

​ F5 Big-IP https://detail.zol.com.cn/load_leveling/f5/cheap_pic.html?qq-pf-to=pcqq.group

  • 软件

    lvs:Linux Virtual Server,阿里云四层 SLB (Server Load Balance)使用
    nginx:支持七层调度,阿里云七层SLB使用 Tengine
    haproxy:支持七层调度
    ats:Apache Traffic Server,yahoo捐助给apache
    perlbal:Perl 编写
    pound

1.4.1基于工作的协议层次划分

  • 传输层(通用):DNAT 和 DPORT

    LVS:

    nginx:stream

    haproxy:mode tcp

  • 应用层(专用):针对特定协议,常称为 proxy server

    http:nginx, httpd, haproxy(mode http), ...

    fastcgi:nginx, httpd, ...

    mysql:mysql-proxy, mycat...

1.4.2 负载均衡的会话保持

  1. session sticky:同一用户调度固定服务器
    Source IP:LVS sh算法(对某一特定服务而言)
    Cookie
  2. session replication:每台服务器拥有全部session
    session multicast cluster
  3. session server:专门的session服务器
    Redis,Memcached

1.5 HA 高可用集群实现

keepalived:vrrp协议
Ais:应用接口规范

  • heartbeat
  • cman+rgmanager(RHCS)
  • coresync_pacemaker

2 Linux Virtual Server 简介

2.1 LVS 介绍

LVS:Linux Virtual Server,负载调度器,内核集成,章文嵩(花名 正明), 阿里的四层SLB(ServerLoad Balance)是基于LVS+keepalived实现

LVS 是全球最流行的四层负载均衡开源软件,由章文嵩博士(当前阿里云产品技术负责人)在1998年5月创立,可以实现LINUX平台下的负载均衡。

LVS 官网:http://www.linuxvirtualserver.org/

阿里SLB和LVS:

https://yq.aliyun.com/articles/1803
https://github.com/alibaba/LVS

整个SLB系统由3部分构成:四层负载均衡,七层负载均衡和控制系统

2.2 LVS 工作原理

VS根据请求报文的目标IP和目标协议及端口将其调度转发至某RS,根据调度算法来挑选RS。LVS是内核级功能,工作在INPUT链的位置,将发往INPUT的流量进行“处理”

ubuntu22.04系统

[root@ubuntu chen]#uname -r
5.15.0-76-generic   #查看内核版本


[root@ubuntu boot]#grep -i ext4 ./config-5.15.0-75-generic 
CONFIG_EXT4_FS=y    # 已经集成在内核里 开机自启动  
CONFIG_EXT4_USE_FOR_EXT2=y
CONFIG_EXT4_FS_POSIX_ACL=y
CONFIG_EXT4_FS_SECURITY=y
# CONFIG_EXT4_DEBUG is not set
[root@ubuntu boot]#ll /boot/vmlinuz-5.15.0-75-generic
-rw------- 1 root root 11589544 Jun  7 06:52 /boot/vmlinuz-5.15.0-75-generic   #开机自启动放在这个文件中



[root@ubuntu boot]#grep -i xfs ./config-5.15.0-75-generic 
CONFIG_XFS_FS=m
CONFIG_XFS_SUPPORT_V4=y
CONFIG_XFS_QUOTA=y
CONFIG_XFS_POSIX_ACL=y
CONFIG_XFS_RT=y
# CONFIG_XFS_ONLINE_SCRUB is not set
# CONFIG_XFS_WARN is not set
# CONFIG_XFS_DEBUG is not set
CONFIG_VXFS_FS=m      # 表示模块  需要才会加载 不需要不会加载 
[root@ubuntu boot]#tree /lib/modules/5.15.0-75-generic/   模块放在这个文件中

查看当前正在加载的模块
[root@ubuntu boot]#lsmod



#### 红帽系列跟ubuntu中不一样

2.3 LVS集群体系架构

2.4 LVS 集群类型中的术语

  • VS:Virtual Server,Director Server(DS), Dispatcher(调度器),Load Balancer(负载均衡代理,虚拟的服务器)

  • RS:Real Server(lvs), upstream server(nginx), backend server(haproxy)(真正的服务器)

  • CIP:Client IP客户端的地址

  • VIP:Virtual server IP VS 外网的IP

  • DIP:Director IP VS 内网的IP

  • RIP:Real server IP

  • 访问流程:CIP <--> VIP == DIP <--> RIP(客户端发请求到达vip 再通过DIP到达RIP RIP再原路返回)

3 LVS工作模式

3.1 LVS集群的工作模式

  • lvs-nat:修改请求报文的目标IP,多目标IP的DNAT
  • lvs-dr:操纵封装新的MAC地址
  • lvs-tun:在原请求IP报文之外新加一个IP首部
  • lvs-fullnat:修改请求报文的源和目标IP,默认内核不支持

3.2 LVS的NAT模式

官方链接: http://www.linuxvirtualserver.org/VS-NAT.html

image-20230725115346393

image-20230725120232960

  • 在NAT模式下,负载均衡器通过修改数据包的源地址和目标地址将请求转发给后端服务器。返回的响应包经过负载均衡器进行地址转换再返回给客户端。
  • NAT模式可以隐藏真实服务器的IP地址,提供一定的安全性。
  • 由于地址转换的开销,NAT模式会导致一定的性能损失。

3.3 LVS的DR模式

image-20230725141017140

  • 在DR模式下,负载均衡器通过修改数据包的目标地址将请求转发给后端服务器,但返回的响应包直接发送给客户端,不经过负载均衡器。
  • DR模式不需要进行地址转换,因此性能较高,但需要在前端和后端服务器之间建立一个虚拟IP地址,后端服务器对外的IP地址要配置为负载均衡器的IP地址。

3.4LVS的TUN模式

  • 在TUN模式下,负载均衡器通过修改数据包的目标地址将请求转发给后端服务器,并通过IP隧道将响应包发送给客户端。
  • TUN模式相比NAT和DR模式,可以支持更多的应用层协议,如FTP等。
  • TUN模式需要在前端和后端服务器之间建立一个隧道,增加了网络部署的复杂性。

3.5LVS的FULLNAT模式

  • FULLNAT模式是LVS的扩展模式,它是在NAT模式的基础上进一步改进的。相比NAT模式,FULLNAT模式支持从不同的IP地址池中分配IP地址给后端服务器。
  • FULLNAT模式可以提供更灵活的网络部署方式,可以将多个后端服务器分布在不同子网中。

3.6 总结

NAT工作模式和FULLNAT工作模式类似 但是NAT有可能不会原路返回,从其他路返回,FULLNAT是必须从原路返回。

DR模式和TUN模式类似 两个都是直接从后端机器直接返回客户端,两种模式都需要修改后端的VIP,

两者的差别是:

  • ​ TUN模式下 负载均衡器通过隧道方式将请求转发给后端服务器,并将响应包发送回客户端。
  • ​ DR模式下 负载均衡器配置一个虚拟IP地址并将请求转发给后端服务器,后端服务器的实际IP地址用于与客户端通信

4 LVS十种调度算法

4.1 静态算法和动态算法的区别

LVS(Linux Virtual Server)是一个开源的负载均衡软件,它提供了多种算法来实现负载均衡功能。其中,LVS的算法可以分为静态算法和动态算法,它们在负载均衡过程中的行为和原则上有所不同。

  1. 静态算法:
    • 静态算法是在系统配置时预先定义的负载均衡规则,并在运行时保持不变。通常在负载均衡器启动时,管理员根据后端服务器的配置和性能,手动将请求分配给不同的后端服务器。
    • 静态算法的分配规则可以基于多个参数,如服务器的权重、负载、性能等进行设置。常见的静态算法包括轮询(Round Robin)、加权轮询(Weighted Round Robin)和源地址散列(Source IP Hashing)。
    • 静态算法适用于后端服务器的配置相对稳定,请求分布均匀的情况,但对于负载变化较大的场景可能不够灵活。
  2. 动态算法:
    • 动态算法是根据实时的负载情况和后端服务器的性能指标,动态调整请求的分配策略。它可根据负载情况进行自动负载均衡,以实现最佳的资源利用。
    • 动态算法采集后端服务器的状态信息,如CPU使用率、内存利用率、连接数等,并根据这些指标来决定请求的分配策略。常见的动态算法包括最小连接数(Least Connection)、最小负载(Least Load)和动态加权轮询(Dynamic Weighted Round Robin)等。
    • 动态算法适用于负载波动较大、后端服务器性能差异较大的场景,能够动态调整请求分配,提高系统的性能和稳定性。

总而言之,静态算法在系统配置期间预先定义请求分配规则,适用于后端服务器配置相对稳定且请求分布均匀的场景。而动态算法根据实时的负载情况和后端服务器性能指标进行动态调整,适用于负载波动较大、后端服务器性能差异较大的场景。选择合适的算法应基于具体的业务需求和负载情况进行评估和选择。

4.1静态算法

1 轮询算法 RR

  • 轮询算法是最简单的负载均衡算法之一,它按照固定的顺序依次将请求分配给后端服务器。当有新的请求到达时,负载均衡器将请求发送给下一个服务器。

  • 轮询算法假设所有后端服务器的处理能力相同,不考虑服务器的实际负载情况。

  • 轮询算法适用于后端服务器的配置相对均衡、性能相近的场景,可以较为平均地将负载分配给各个服务器。

    使用场景: 有三台机器分别为A,B,C。
             按着顺序去分配A一个,B一个,C一个,如果再来的话还是A,B,C轮流来。
    

2 加权轮询算法 WRR

  • 加权轮询算法引入了权重的概念,根据后端服务器的权重来分配请求。权重越高的服务器将获得更多的请求。

  • 加权轮询算法可以根据后端服务器的配置、性能和资源状况,设置不同的权重值。较强的服务器可以处理更多的请求,而较弱的服务器则分配相对较少的请求。

  • 加权轮询算法适用于后端服务器的配置、性能和资源状况有差异的情况,可以根据实际情况进行灵活的请求分配。

    使用场景: 
         有三台机器A,B,C。A是20年买的机器性能已经不是特别好了,B是22年买的机器,C是新买的机器性能非常好,此时就可以使用加权轮询算法。        比如此时的访问量是12 可以让A接收3份  B接收4份  C接收5份 
         
         权重越高就优先得到请求
    

总结:

  • 轮询算法将请求按照固定的顺序依次分配给后端服务器,而加权轮询算法根据服务器的权重来分配请求。

  • 加权轮询算法相对于轮询算法更为灵活,可以根据服务器的性能和资源状况进行动态的请求分配,以实现更合理的负载均衡。

3 源地址哈希算法SH

  • 源地址哈希算法根据数据包的源地址进行哈希计算,在一个固定的哈希表中选择一个后端服务器。相同源地址的数据包将被分配给相同的后端服务器。

  • 源地址哈希算法可以实现会话粘滞(Session Affinity),即相同的源地址的请求将被分配给相同的服务器,从而确保与特定客户端的会话持续在同一台服务器上进行处理。

  • 源地址哈希算法适用于需要保持会话状态的应用,如网站登录、购物车等。

    使用场景例如:登录京东账号,刷新页面后不需要重新登录。
    

4 目标地址哈希算法 DH

  • 目标地址哈希算法根据数据包的目标地址进行哈希计算,并选择一个后端服务器。相同目标地址的数据包将被分配给相同的后端服务器。

  • 目标地址哈希算法可以实现负载均衡的分布式缓存、镜像站点等场景,确保来自同一客户端的请求被发送到同一个后端服务器。

  • 目标地址哈希算法适用于需要分布式缓存、镜像站点等需求的应用场景。

    使用场景例如:小区100户人 要下载同一个视频  后端服务器会进行缓存  然后根据目标地址去找缓存
    

总结:

  • 源地址哈希算法根据数据包的源地址选择后端服务器,适用于保持会话状态的应用。

  • 目标地址哈希算法根据数据包的目标地址选择后端服务器,适用于分布式缓存、镜像站点等需求。

4.2 动态算法

1 少连接算法LC

LC(Least Connections):最小连接数算法是一种负载均衡算法,根据后端服务器的连接数来选择最空闲的服务器。每次新的请求都会被分配给连接数最少的服务器,以平衡负载。

活动连接*256+非活动连接  值越大表示负载就越重    

缺点是  如果两台机器A和B,A的性能比较好而B的性能比较差 在第一次连接的时候两个都为0 此时就分辨不出来

2 加权最少连接算法WLC 默认调度方法,较常用

WLC(Weighted Least Connections):加权最小连接数算法是一种根据服务器权重和连接数选择最空闲服务器的负载均衡算法。不同于LC算法,WLC算法会考虑服务器的权重,更重要的服务器将处理更多连接数。

(活动连接*256+非活动连接)/权重  性能好的机器权重调高一点 性能差的调低一点
 缺点:初始两台机器,A和B A的性能较好  B的性能较差   在第一次连接的时候两个都为0 有可能会转到性能较差的机器上面

3 最短期望延迟算法SED

SED(Shortest Expected Delay):最短预期延迟算法是一种负载均衡算法,它基于后端服务器的延迟选择最短预期延迟的服务器。这种算法是根据服务器的响应时间来决定请求的分配,以提供最低的延迟。

(活动链接+1)*256/权重   就算活动连接为0 +1之后再除权重就可以分辨出性能较好的机器
缺点:两台机器A和B   A的权重高有可能会一直给A分配 从而导致B一直空闲

4 最少队列算法NQ

NQ(Number of Queries):查询数算法是一种负载均衡算法,根据服务器已处理的请求数量来选择最空闲的服务器。每次新的请求都会被分配给请求数最少的服务器。

先一个分配一个之后再用第三种方法计算 就可以分辨出哪个权重高哪个权重低

5基于局部的最少连接算法LBLC

LBLC(Load-Based Least Connections):基于负载的最小连接数算法是一种综合考虑服务器负载和连接数的负载均衡算法。它基于服务器负载和连接数的权重来选择最空闲的服务器,同时平衡负载和连接数。

动态的DH算法,使用场景:根据负载状态实现正向代理,实现Web Cache等

6 带复制的基于局部的最少连接算法LBLCR

LBLCR(Load-Based Least Connections with Replication):带有复制的基于负载的最小连接数算法是一种负载均衡算法,它结合了LBLC算法和服务器复制的概念。它通过复制同一份内容到多个服务器上,并根据负载和连接数选择最合适的服务器来处理请求,以提高系统的可用性和性能。

带复制功能的LBLC,解决LBLC负载不均衡问题,从负载重的复制到负载轻的RS,,实现Web Cache等

总结:

  • LC根据连接数选择服务器
  • WLC考虑服务器权重和连接数
  • SED基于延迟选择服务器
  • NQ根据请求数选择服务器
  • LBLC综合考虑负载和连接数
  • LBLCR在LBLC基础上引入复制概念

5 LVS相关软件

5.1程序包:ipvsadm

[root@ubuntu ~]#dpkg -L ipvsadm
/.
/etc
/etc/default
/etc/default/ipvsadm
/etc/init.d
/etc/init.d/ipvsadm   # 启动脚本
/etc/ipvsadm.rules
/sbin
/sbin/ipvsadm
/sbin/ipvsadm-restore    #  恢复
/sbin/ipvsadm-save       #  保存
/usr
/usr/share
/usr/share/doc
/usr/share/doc/ipvsadm
/usr/share/doc/ipvsadm/NEWS.Debian.gz
/usr/share/doc/ipvsadm/README
/usr/share/doc/ipvsadm/SCHEDULERS
/usr/share/doc/ipvsadm/changelog.Debian.gz
/usr/share/doc/ipvsadm/copyright
/usr/share/lintian
/usr/share/lintian/overrides
/usr/share/lintian/overrides/ipvsadm
/usr/share/man
/usr/share/man/man8
/usr/share/man/man8/ipvsadm-restore.8.gz
/usr/share/man/man8/ipvsadm-save.8.gz
/usr/share/man/man8/ipvsadm.8.gz
Unit File: ipvsadm.service
主程序:/usr/sbin/ipvsadm
规则保存工具:/usr/sbin/ipvsadm-save
规则重载工具:/usr/sbin/ipvsadm-restore
配置文件:/etc/sysconfig/ipvsadm-config
ipvs调度规则文件:/etc/sysconfig/ipvsadm

5.2 ipvsadm命令

创建集群
#   ipvsadm -A -t vip:80   (-t是TCP协议  -u是UDP协议)

#   在集群中添加RS
   ipvsadm -a -t vip:80 -r rip1:80 -s -m 
   ipvsadm -a -t vip:80 -r rip2:80 -s -m 
# vip:80后端机器和端口 -s后面跟算法,不写默认是wlc算法  -m后面跟模式,默认是DR模式


--scheduler    -s scheduler         one of rr|wrr|lc|wlc|lblc|lblcr|dh|sh|sed|nq|fo|ovf|mh,
                                             # -s 算法rr|wrr|lc|wlc|lblc|lblcr|dh|sh|sed|nq|fo|ovf|mh

  --gatewaying   -g                   gatewaying (direct routing) (default) # (-g是DR模式)
  --ipip         -i                   ipip encapsulation (tunneling)  #(-i是TUN模式)
  --masquerading -m                   masquerading (NAT)  #(-m是NAT模式)

# 查看策略
 ipvsadm -Ln

6 实现NET模式

角色 IP vip
internet 192.168.10.123
LVS 192.168.10.200
web1 10.0.0.201
web2 10.0.0.201
" 第一步修改intrenet主机网卡配置文件,
[root@internet /]# vim /etc/sysconfig/network-scripts/ifcfg-eth0
DEVICE=eth0:   指定设备名称为eth0,表示配置的是eth0网卡。
NAME=eth0:     指定网络接口的名称为eth0。
BOOTPROTO=static:        指定使用静态IP地址的方式进行网络配置。
IPADDR=192.168.10.123:   指定静态IP地址为192.168.10.123。
PREFIX=24:               指定子网掩码为24位,相当于255.255.255.0。
DNS1=192.168.10.200:     指定主DNS服务器的IP地址为192.168.10.200。
ONBOOT=yes:              指定在系统启动时自动启用eth0网卡。

[root@internet ~]# nmcli connection reload   重新加载NetworkManager的配置文件并重新加载网络连接
[root@internet ~]# nmcli connection up eth0   启用网卡eth0

# 安装host 
yum provides host  查询包在哪个

yum -y install bind-utils



' 第二步配置LVS主机
" 先安装DNS服务
rz  install_dns.sh  #先拷一份脚本到本机
[root@ubuntu ~]#bash install_dns.sh    跑一下脚本

[root@ubuntu /]#cd /etc/netplan/
[root@ubuntu netplan]#ls
00-installer-config.yaml
[root@ubuntu netplan]#vim 00-installer-config.yaml 
# This is the network config written by 'subiquity'
network:       # 指定网络配置的顶层对象
  version: 2   # 指定网络配置文件的版本号为2
  renderer: networkd   # 指定使用systemd-networkd网络管理器作为渲染器。systemd-networkd是一个系统守护进程,用于管理网络连接
  ethernets:           # 指定以太网接口的配置对象
    eth0:
      addresses:       # 指定接口的IP地址和子网掩码
      - 10.0.0.200/24
      gateway4: 10.0.0.2    # 指定接口的IP地址和子网掩码
      nameservers:          # 指定接口的DNS服务器地址
        addresses: [127.0.0.1]
    eth1:
      addresses:
      - 192.168.10.200/24

[root@ubuntu netplan]#netplan apply   “ 读取并应用修改后的网络配置文件

** (generate:1465): WARNING **: 19:15:10.285: `gateway4` has been deprecated, use default routes instead.
See the 'Default routes' section of the documentation for more details.

** (process:1463): WARNING **: 19:15:10.559: `gateway4` has been deprecated, use default routes instead.
See the 'Default routes' section of the documentation for more details.

** (process:1463): WARNING **: 19:15:10.568: `gateway4` has been deprecated, use default routes instead.
See the 'Default routes' section of the documentation for more details.

** (process:1463): WARNING **: 19:15:10.711: `gateway4` has been deprecated, use default routes instead.
See the 'Default routes' section of the documentation for more details.

** (process:1463): WARNING **: 19:15:10.711: `gateway4` has been deprecated, use default routes instead.
See the 'Default routes' section of the documentation for more details.

  " 打开ipforward
  [root@lvs ~]#vim /etc/sysctl.conf 
  # Uncomment the next line to enable packet forwarding for IPv4
net.ipv4.ip_forward=1   


 
 "配置第一台后端服务器
# 修改主机名  
[root@ubuntu2204 ~]#hostnamectl set-hostname web01.wang.org# 修改主机名  

# 修改后端服务器
安装nginx和mysql-server
root@web01:~# apt install nginx mysql-server

# 修改网卡配置文件
root@web01:~# vim /etc/netplan/00-installer-config.yaml
network:
  version: 2
  renderer: networkd
  ethernets:
    eth0:
      addresses:
      - 10.0.0.201/24
      gateway4: 10.0.0.200   # 网关
      nameservers:
        addresses: [10.0.0.200]  DNS
        
        # netplan apply  重启配置文件
        
root@web01:~# echo www.wang.org `hostname -I` > /var/www/html/index.html
root@web01:~# curl 127.0.0.1
www.wang.org 10.0.0.201


"配置第二台主机
# 修改主机名  
[root@ubuntu2204 ~]#hostnamectl set-hostname web02.wang.org# 修改主机名

# 修改后端服务器
安装nginx和mysql-server
root@web01:~# apt install nginx mysql-server

# 修改网卡配置文件
root@web01:~# vim /etc/netplan/00-installer-config.yaml
network:
  version: 2
  renderer: networkd
  ethernets:
    eth0:
      addresses:
      - 10.0.0.202/24
      gateway4: 10.0.0.200   # 网关
      nameservers:
        addresses: [10.0.0.200]  DNS

[root@web02 ~]#echo www.wang.org `hostname -I` > /var/www/html/index.html

[root@web02 ~]#cat /var/www/html/index.html
www.wang.org 10.0.0.202

[root@web02 ~]#curl 127.0.0.1
www.wang.org 10.0.0.202


# 最后用internet去访问 www.wang.org已经可以通过了

#[root@internet ~]# curl www.wang.org
www.wang.org 10.0.0.201
[root@internet ~]# curl www.wang.org
www.wang.org 10.0.0.202

6.1 创建集群 创建规则

6.1.1访问后端主机web

# 创建集群 算法为rr
[root@ubuntu netplan]#ipvsadm -A -t 192.168.10.200:80 -s rr   
[root@ubuntu netplan]#ipvsadm -Ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
TCP  192.168.10.200:80 rr

# 创建规则 指定NAT模式
[root@ubuntu netplan]#ipvsadm -a -t 192.168.10.200:80 -r 10.0.0.201:80 -m
[root@ubuntu netplan]#ipvsadm -a -t 192.168.10.200:80 -r 10.0.0.202:80 -m
[root@ubuntu netplan]#ipvsadm -Ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
TCP  192.168.10.200:80 rr
  -> 10.0.0.201:80                Masq    1      0          0         
  -> 10.0.0.202:80                Masq    1      0          0         
  

# 修改权重

[root@lvs ~]#ipvsadm -e -t 192.168.10.200:80 -r 10.0.0.201:80 -w 3     修改201的权重为3

[root@lvs ~]#ipvsadm -Ln    #再次查看已经修改成功
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
TCP  192.168.10.200:80 rr
  -> 10.0.0.201:80                Route   3      0          0         
  -> 10.0.0.202:80                Masq    1      0          0  
  
  # 修改为wrr算法
  [root@lvs ~]#ipvsadm -E -t 192.168.10.200:80 -s wrr
[root@lvs ~]#ipvsadm -Ln   
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
TCP  192.168.10.200:80 wrr   #修改为wrr
  -> 10.0.0.201:80                Masq    3      0          0         
  -> 10.0.0.202:80                Masq    1      0          0 
 
 #再次查看已经变为3比1 
  [root@internet ~]# curl 192.168.10.200
www.wang.org 10.0.0.201
[root@internet ~]# curl 192.168.10.200
www.wang.org 10.0.0.201
[root@internet ~]# curl 192.168.10.200
www.wang.org 10.0.0.201
[root@internet ~]# curl 192.168.10.200
www.wang.org 10.0.0.202

6.1.2访问后端主机数据库

  # 数据库
root@web01:/etc/mysql# vim /etc/mysql/mysql.conf.d/mysqld.cnf
# Instead of skip-networking the default is now to listen only on
# localhost which is more compatible and is not less secure.
#bind-address           = 127.0.0.1  # 注释加上
#mysqlx-bind-address    = 127.0.0.1  # 注释加上

#在201和202中分别创建mysql账号
mysql> create user test@'192.168.10.%' identified by '123456';
mysql> create user test2@'10.0.0.%' identified by '123456';

# 在LVS主机中创建mysql3306端口的集群
[root@lvs ~]#ipvsadm -A -t 192.168.10.200:3306 -s rr
[root@lvs ~]#ipvsadm -Ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
TCP  192.168.10.200:80 sh
  -> 10.0.0.201:80                Masq    3      0          0         
  -> 10.0.0.202:80                Masq    1      0          0         
TCP  192.168.10.200:3306 rr  #已经创建成功

#创建成员
[root@lvs ~]#ipvsadm -a -t 192.168.10.200:3306 -r 10.0.0.201:3306 -m             -m是nat模式
[root@lvs ~]#ipvsadm -a -t 192.168.10.200:3306 -r 10.0.0.202:3306 -m
[root@lvs ~]#ipvsadm -Ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
TCP  192.168.10.200:80 sh
  -> 10.0.0.201:80                Masq    3      0          0         
  -> 10.0.0.202:80                Masq    1      0          0         
TCP  192.168.10.200:3306 rr
  -> 10.0.0.201:3306              Masq    1      0          0    # 已经创建成功    
  -> 10.0.0.202:3306              Masq    1      0          0    # 创建成功


[root@internet ~]# mysql -utest -p123456 -h192.168.10.200 -e 'select @@HOSTNAME';
mysql: [Warning] Using a password on the command line interface can be insecure.
+----------------+
| @@HOSTNAME     |
+----------------+
| web01.wang.org |   ########
+----------------+
[root@internet ~]# mysql -utest -p123456 -h192.168.10.200 -e 'select @@HOSTNAME';
mysql: [Warning] Using a password on the command line interface can be insecure.
+----------------+
| @@HOSTNAME     |
+----------------+
| web02.wang.org |   ########
+----------------+
[root@internet ~]# mysql -utest -p123456 -h192.168.10.200 -e 'select @@HOSTNAME';
mysql: [Warning] Using a password on the command line interface can be insecure.
+----------------+
| @@HOSTNAME     |
+----------------+
| web01.wang.org |   ########
+----------------+
[root@internet ~]# mysql -utest -p123456 -h192.168.10.200 -e 'select @@HOSTNAME';
mysql: [Warning] Using a password on the command line interface can be insecure.
+----------------+
| @@HOSTNAME     |
+----------------+
| web02.wang.org |   ########
+----------------+

7 实现DR模式

7.1 单网段实现

角色 IP vip
internet 192.168.10.123
路由器 仅主机:192.168.10.100 NAT: 10.0.0.100
LVS 10.0.0.10 10.0.0.200
web1 10.0.0.201 10.0.0.200
web2 10.0.0.202 10.0.0.200
# 修改internet配置文件

[root@internet ~]# vim /etc/sysconfig/network-scripts/ifcfg-eth0
DEVICE=eth0
NAME=eth0
BOOTPROTO=static
IPADDR=192.168.10.123
PREFIX=24
DNS1=192.168.10.200
GATEWAY=192.168.10.100
ONBOOT=yes
# Centos7系列

# 配置router(路由)修改配置文件
[root@router ~]# vim /etc/sysconfig/network-scripts/ifcfg-ens33
DEVICE=ens33
NAME=ens33
BOOTPROTO=static
IPADDR=10.0.0.100
PREFIX=24
ONBOOT=yes
[root@router ~]# nmcli con reload         重新加载网络连接配置
[root@router ~]# nmcli con up ens33        启用网卡
Connection successfully activated (D-Bus active path: /org/freedesktop/NetworkManager/ActiveConnection/3)   

# 添加网卡   仅主机模式
[root@router ~]# vim /etc/sysconfig/network-scripts/ifcfg-ens36
DEVICE=ens36
NAME=ens36
BOOTPROTO=static
IPADDR=192.168.10.100
PREFIX=24
ONBOOT=yes 
[root@router ~]# nmcli con up ens36     启用网卡
Connection successfully activated (D-Bus active path: /org/freedesktop/NetworkManager/ActiveConnection/4


#用客户端ping一下路由的192.168.10.100看看额能不能通
[root@internet ~]# ping 192.168.10.100
PING 192.168.10.100 (192.168.10.100) 56(84) bytes of data.
64 bytes from 192.168.10.100: icmp_seq=1 ttl=64 time=0.278 ms
64 bytes from 192.168.10.100: icmp_seq=2 ttl=64 time=0.383 ms
64 bytes from 192.168.10.100: icmp_seq=3 ttl=64 time=0.339 ms
64 bytes from 192.168.10.100: icmp_seq=4 ttl=64 time=0.377 ms
64 bytes from 192.168.10.100: icmp_seq=5 ttl=64 time=0.338 ms
64 bytes from 192.168.10.100: icmp_seq=6 ttl=64 time=0.326 ms
# 打开 ip_forword 链   (因为Centos7中没有这一项 直接写进配置文件就可以了)
[root@router ~]# vim /etc/sysctl.conf

# sysctl settings are defined through files in
# /usr/lib/sysctl.d/, /run/sysctl.d/, and /etc/sysctl.d/.
#
# Vendors settings live in /usr/lib/sysctl.d/.
# To override a whole file, create a new file with the same in
# /etc/sysctl.d/ and put new settings there. To override
# only specific settings, add a file with a lexically later
# name in /etc/sysctl.d/ and put new settings there.
#
# For more information, see sysctl.conf(5) and sysctl.d(5).

net.ipv4.ip_forward = 1   # 添加这一行

[root@router ~]# sysctl -p   
net.ipv4.ip_forward = 1   # 配置文件生效


# 红帽系列需要关闭防火墙和selinux

# 关闭selinux 写配置文件
[root@router ~]# vi /etc/selinux/config
# This file controls the state of SELinux on the system.
# SELINUX= can take one of these three values:
#     enforcing - SELinux security policy is enforced.
#     permissive - SELinux prints warnings instead of enforcing.
#     disabled - No SELinux policy is loaded.
SELINUX=enforcing     #####把enforcing改为disabled
# SELINUXTYPE= can take one of three values:
#     targeted - Targeted processes are protected,
#     minimum - Modification of targeted policy. Only selected processes are protected.
#     mls - Multi Level Security protection.
SELINUXTYPE=targeted

iptables -F 清除防火墙规则


##################### 完成以上步骤后,SELinux 将被永久禁用。请注意,这需要重启系统才能生效。
# 修改LVS网卡配置

[root@lvs ~]#vim /etc/netplan/00-installer-config.yaml

# This is the network config written by 'subiquity'
network:
  version: 2
  renderer: networkd
  ethernets:
    eth0:
      addresses:
      - 10.0.0.10/24 
      gateway4: 10.0.0.100   # 网关指向10.0.0.100
      nameservers:
        addresses: [127.0.0.1]
[root@lvs ~]#netplan apply

# 配置回环网卡
ip a a 10.0.0.200/32 dev lo label lo:1
# 配置后端机器 201  202


########### 10.0.0.201
root@web01:~# vim /etc/netplan/00-installer-config.yaml 

# This is the network config written by 'subiquity'
network:
  version: 2
  renderer: networkd
  ethernets:
    eth0:
      addresses:
      - 10.0.0.201/24
      gateway4: 10.0.0.100     # 修改网关指向10.0.0.100
      nameservers:
        addresses: [10.0.0.10]   # DNS

root@web01:~# netplan apply 



############# 10.0.0.202
[root@web02 ~]#vim /etc/netplan/00-installer-config.yaml

# This is the network config written by 'subiquity'
network:
  version: 2
  renderer: networkd
  ethernets:
    ens33:
      addresses:
      - 10.0.0.202/24
      gateway4: 10.0.0.100    # 网关
      nameservers:
        addresses: [10.0.0.10]   #DNS
  [root@web02 ~]#netplan apply




###########配置201  202 的回环网卡
ip a a 10.0.0.200/32 dev lo label lo:1   # (此处必须是32位)

echo 1 >   /proc/sys/net/ipv4/conf/all/arp_ignore
echo 1 >   /proc/sys/net/ipv4/conf/lo/arp_ignore
echo 2 >   /proc/sys/net/ipv4/conf/all/arp_announce 
echo 2 >   /proc/sys/net/ipv4/conf/lo/arp_announce


###  测试已经可以通过
[root@internet ~]# curl 10.0.0.200 
www.wang.org 10.0.0.202
[root@internet ~]# curl 10.0.0.200 
www.wang.org 10.0.0.201
[root@internet ~]# curl 10.0.0.200 
www.wang.org 10.0.0.202



###########如果通不了查看路由器的防火墙是否关闭



##### 删除LVS网关  
[root@lvs ~]#ip route del default via 10.0.0.100 dev eth0
[root@internet ~]# curl 10.0.0.200

删除网关之后发现通不了


####  再次添加网关  
[root@lvs ~]#ip route add default via 10.0.0.111 dev eth0
[root@internet ~]# curl 10.0.0.200
www.wang.org 10.0.0.201
[root@internet ~]# curl 10.0.0.200
www.wang.org 10.0.0.202

##  添加随便添加一个同网段的网关都可以通
原理是:客户端向后端主机发送请求是LVS网关会跟路由器进行一个反向检测,检测是否可以跟路由器进行通讯(但是不会真正进行通讯)如果有LVS会进行下一步处理,如果没有路由器会直接抛弃数据包。

# 解决网LVS反向检测问题
#默认值
[root@ubuntu2204 ~]#cat /proc/sys/net/ipv4/conf/all/rp_filter
2
[root@centos8 ~]#cat /proc/sys/net/ipv4/conf/all/rp_filter
1
#Ubuntu22.04修改内核参数为0
[root@ubuntu2204 ~]#echo "0" > /proc/sys/net/ipv4/conf/all/rp_filter
[root@ubuntu2204 ~]#echo "0" > /proc/sys/net/ipv4/conf/eth0/rp_filter
#Rocky8修改内核参数为0
[root@lvs ~]#echo "0" > /proc/sys/net/ipv4/conf/all/rp_filter
#说明:参数rp_filter用来控制系统是否开启对数据包源地址的校验。
#0标示不开启地址校验
#1表开启严格的反向路径校验。对每一个收到的数据包,校验其反向路径是否是最佳路径。如果反向路径不是最佳路径,则直接丢弃该数据包;
#2表示开启松散的反向路径校验,对每个收到的数据包,校验其源地址是否可以到达,即反向路径是否可以ping通,如反向路径不通,则直接丢弃该数据包。


######### 修改以上内容可以解决 LVS反向检测问题 但是还是建议添加网关

7.2 ######### 实现多网段

########## 实现多网段
   后端服务器和VIP是同一个网段 有一定的安全风险
   
##   实现一个网卡多个地址
[root@router ~]# vim /etc/sysconfig/network-scripts/ifcfg-eth0
DEVICE=eth0
NAME=eth0
BOOTPROTO=static
IPADDR=10.0.0.100
PREFIX=24
IPADDR1=172.16.0.100
PREFIX1=24
ONBOOT=yes
##   网卡生效(centos7系统网卡生效命令)
[root@router ~]# service network restart
Restarting network (via systemctl):                        [  OK  ]
###   centos8系列命令
nmcli con reload
nmcli con up eth0

####  再次查看网卡IP已经生效
[root@router ~]# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    link/ether 00:0c:29:9b:95:97 brd ff:ff:ff:ff:ff:ff
    inet 10.0.0.100/24 brd 10.0.0.255 scope global noprefixroute eth0
       valid_lft forever preferred_lft forever
    inet 172.16.0.100/24 brd 172.16.0.255 scope global noprefixroute eth0
       valid_lft forever preferred_lft forever
    inet6 fe80::20c:29ff:fe9b:9597/64 scope link 
       valid_lft forever preferred_lft forever
3: eth1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    link/ether 00:0c:29:9b:95:a1 brd ff:ff:ff:ff:ff:ff
    inet 192.168.10.100/24 brd 192.168.10.255 scope global noprefixroute eth1
       valid_lft forever preferred_lft forever
    inet6 fe80::20c:29ff:fe9b:95a1/64 scope link 
       valid_lft forever preferred_lft forever



####################################################################################
 更改后端两台主机的VIP也就是lo回环网卡的地址
 更改LVS的vip和添加新的规则
 再次测试就可以了
 
 #####  LVS脚本 后缀vs
[root@lvs ~]#bash lvs_dr_vs.sh 
Usage: lvs_dr_vs.sh start|stop
[root@lvs ~]#bash lvs_dr_vs.sh start
The VS Server is Ready!

[root@lvs ~]#ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet 172.16.0.200/32 scope global lo:1
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
    link/ether 00:0c:29:dd:f6:a4 brd ff:ff:ff:ff:ff:ff
    altname enp2s1
    altname ens33
    inet 10.0.0.10/24 brd 10.0.0.255 scope global eth0
       valid_lft forever preferred_lft forever
    inet6 fe80::20c:29ff:fedd:f6a4/64 scope link 
       valid_lft forever preferred_lft forever
[root@lvs ~]#ipvsadm -Ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
TCP  172.16.0.200:80 wrr
  -> 10.0.0.201:80                Route   1      0          0         
  -> 10.0.0.202:80                Route   1      0          0 
  
  
  脚本运行之后看到 ipvsadm 规则已经建立  vip也变为 172.16.0.200:80  

 #####  后端服务器脚本 
 root@web01:~# rz -E
rz waiting to receive.
root@web01:~# bash lvs_dr_rs.sh start
The RS Server is Ready!

 
####### 已经可以实现多网段
 [root@internet ~]# curl 172.16.0.200
www.wang.org 10.0.0.202
[root@internet ~]# curl 172.16.0.200
www.wang.org 10.0.0.201
[root@internet ~]# curl 172.16.0.200
www.wang.org 10.0.0.202
[root@internet ~]# curl 172.16.0.200
www.wang.org 10.0.0.201
[root@internet ~]# curl 172.16.0.200
www.wang.org 10.0.0.202
[root@internet ~]# curl 172.16.0.200
www.wang.org 10.0.0.201