LVS

举报
小源博客 发表于 2023/04/11 11:46:39 2023/04/11
【摘要】 sersync实现实时数据同步sersync介绍sersync类似于inotify,同样用于监控,但它克服了inotify的缺点inotify最大的不足是会产生重复事件,或者同一个目录下多个文件的操作会产生多个事件,例如,当监控目录中5个文件时,删除目录时会产生6个监控事件,从而导致重复调用rsync命令。sersync优点sersnc是使用c++编写,而且对Linux系统产生的临时文件和重...

sersync实现实时数据同步

sersync介绍

  • sersync类似于inotify,同样用于监控,但它克服了inotify的缺点

  • inotify最大的不足是会产生重复事件,或者同一个目录下多个文件的操作会产生多个事件,例如,当监控目录中5个文件时,删除目录时会产生6个监控事件,从而导致重复调用rsync命令。

sersync优点

  • sersnc是使用c++编写,而且对Linux系统产生的临时文件和重复文件进行过滤,所以结合rsync同步的时候,节省了运行时耗和网络资源。因此更快。

  • sersync配置很简单,提供静态编译好的二进制文件和xml配置文件,直接使用即可

  • sersync使用多线程进行同步,尤其在同步较大文件时,能够保证多个服务器实时保持同步状态

  • sersync有出错处理机制,通过失败队列对出错的文件重新同步,如果仍然失败,则按设定时长对同步失败的文件重新同步

  • sersync自带crontab功能,只需在xml配置文件中开启,即也可以按要求隔一段时间整体同步一次,不需要额外配置crontab功能

  • sersync可以二次开发

下载安装部署

基于rsync同步

# 解压
​
# 规范目录结构
mkdir /apps/
mv GNU_Linux-x86/ /apps/sersync
​
# 软链接
ln -s /aoos/sersync/sersync2 /usr/bin/
​
# 确认安装rsync客户端工具
rpm -q sync &> /dev/null || dnf -y install rsync
​
# 备份sersync配置文件
cp /apps/sersync/confxml.xml{,.bak}
​
# 配置文件
vim /apps/sersync/confxml.xml
<attrib start="true">   # 修改此行为为 true ,文件属性发生变化同步
<localpath watch="/data/www">    # 修改此行,需要同步的源目录或文件,建议同步目录
    <remote ip="备份服务器IP" name="backup/">   # backup要与rsync配置文件中[backup]要匹配
    <auth start="true" users="rsyncuser" passwordfile="/etc/rsync.pas"/>   # 修改此行为true,指定备份服务器的rsync配置的用户和密码文件
    <userDefinedPort start="false" port="874">   # 指定rsync的非标准端口号
    <ssh start="false"/>    # 默认使用rsync daemon运行rsync命令,true为使用远程shell模式   
​
​
​
# 创建密码文件
echo xier > /etc/rsync.pas   # 密码由于rsync匹配
​
chmod 600 /etc/rsync.pas
​
# 查看帮助
sersync2 -h
​
# 以后台方式执行同步
sersync2 -dro /apps/sersync/confxml.xml
​
========================================备份服务器的配置==================================
# 安装配置
dnf install -y rsync
​
vim /etc/rsyncd.conf
uid = root
gid = root
ignore errors
exclude = lost+found/
log file = /var/log/rsyncd.log
pid file = /var/run/rsyncd.pid
lock file = /var/run/rsyncd.lock
reverse lookup = no
# hosts allow = 10.0.0.0/24
[backup]
path = /data/backup/
comment = backup dir
read only = no
auth users = rsyncuser
secrets file = /etc/rsync.pas
​
cat /etc/rsync.pas
rsyncuser:xier
​
​
# 到备份服务器上实时监控
watch -n0.2 ls -l /data/backup/

基于ssh同步

  • 配置服务

# 停止服务
systemctl stop rsyncd
​
# 配置密钥的免密
​
# 配置文件
vim /apps/sersync/confxml.xml
<sersync>
<localpath watch="/data/www">    # 修改此行,指定源数据目录
   <remote ip="备份服务器IP" name="/data/backup"/>   # 修改此行指定备份服务器地址和备份目标目录
<rsync>
   <auth start="false" users="root" passwordfile="/etc/rsync.pas"/>  # 必须修改此行,不启用认证
   '''
   <ssh start="true"/>    # 修改此行为true,使用远程shell方式的rsync连接方式,无需在目标主机上配置启动rsync daemon服务

lvs(重中之中)

内容大纲

  • 集群概念

  • LVS模型

  • LVS调度算法

  • LVS实现

  • ldirectord

1 集群和分布式

系统性能扩展方式:

  • Scale UP:垂直扩展,向上扩展,增强,性能更强的计算机运行同样的服务

  • Scale Out:水平扩展,向外扩展,增加设备,并行地运行多个服务器调度分配问题,Cluster

垂直扩展不再提及:

  • 随着计算机性能的增长,其价格会成倍增长

  • 单台计算机的性能是有上限的,不可能无限制地垂直扩展

  • 多核CPU意味着即使是单台计算机也可以并行的。

1.1 集群 Cluster

Cluster: 集群,为解决某个特定问题将多台计算机组合起来形成的单个系统

Cluster分为三种类型:

  • 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),是在一定开销下为保障服务的性能和可用性,服务提供商与用户间定义的一种双方认可的协议。

  • HPC:High-performance computing,高性能 www.top500.org


1.2 分布式系统

  • 分布式存储:ceph,GlusterFS,FastDFS,MogileFS

  • 分布式计算:Hadoop,Spark

分布式常见应用

  • 分布式应用-服务按照功能拆分,使用微服务

  • 分布式静态资源--静态资源放在不同的存储集群上

  • 分布式数据和存储--使用key-value缓存系统

  • 分布式计算--对特殊业务使用分布式计算,比如Hadoop集群

1.2.1 业务层面

  • 分层:安全层、负载层、静态层、多台层、(缓存层、存储层)持久化与非持久化

  • 分隔:基于功能分割大业务为小服务

  • 分布式:对于特殊场景的业务,使用分布式计算


1.3 负载均衡集群

  • 硬件

    • F5 Big-IP

  • 软件

    • lvs:Linux Virtual Server,阿里四层 SLB(Server Load Balance)使用

    • nginx:支持七层调度

    • haproxy:支持七层调度

    • ats:Apache Traffic Server,yahoo捐助给apache

    • perlbal:Perl编写

2 Linux Virtual Server简介

  • LVS介绍

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

    • lvs官网:http://www.linuxvirtualserver.org/

  • 查看内核支持LVS

grep -i -C 10 ipvs /boot/config-4.18.0-147.el8.x86_64
  • 功能

  • 负载均衡的应用场景为高访问量的业务,提高应用程序的可用性和可靠性

2.1 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 后端IP

  • 访问流程: CIP <--> VIP == DIP <--> RIP

2.2 LVS 工作模式和相关命令

  • LVS集群工作模式

lvs-nat: 修改请求报文的目标IP,多目标IP的DNAT
# 客户端访问要经过lvs服务器,lvs再调度服务器上,服务器访问完再原路返回给lvs服务器再到客户端。这样会增加lvs服务器负载压力,但是lvs是集成在内核中的,号称百万级并发
​
lvs-dr: 操纵封装新的MAC地址(直接路由)
# 客户端访问要经过lvs服务器,lvs再调度服务器上,服务器访问完不按原路返回,直接到客户端。减轻了lvs服务器负载压力。但是有个问题,回去的时候会返回服务器真实地址,怎么解决呢,方法就是直接将vip也绑定到各个服务器上,但是会出现ip地址冲突,区分会出现问题,服务器响应又回应我有这个地址,全程冲突,这时候就要把响应和回应全关闭了(lvs需要利用vip调度,不能关),不告诉交换机我有这个地址,解决了地址冲突,需要修改内核参数。PS:lvs与服务器之间不能加路由器,不然arp广播过不去,只能是交换机
​
lvs-tun: 在原请求IP报文之外新加一个IP首部
# 转发方式:不修改请求报文的IP首部(源IP为CIP,目标IP为VIP),而在原IP报文之外再封装一个IP首部(源IP是DIP,目标IP是RIP),将报文发往挑选出的目标RS;RS直接响应给客户端(源IP是VIP,目标IP是CIP)
​
lvs-fullnat: 修改请求报文的源和目标IP
# 同时修改请求报文的源IP地址和目标IP地址进行转发
#CIP --> DIP
#VIP --> RIP

2NAT模式特点

  • 本质是多目标IP和DNAT,通过请求报文中的目标地址和目标端口修改为某挑出的RS的RIP和PORT实现转发

  • RIP和DIP应在同一个IP网络,且应使用私网地址;RS的网关要指向DIP

  • 请求报文和响应报文都必须经由Director转发,Director易于成为系统瓶颈

  • 支持端口映射,可修改请求报文的目标PORT

  • VS必须是Linux系统,RS可以是任意OS系统


3 DR模式特点

  1. Director和各RS都配置有VIP

  2. 确保前端路由器将目标IP为VIP的请求报文发往Director

  • 在前端网关做静态绑定VIP和Director的MAC地址

  • 在RS上使用arptables工具

arptables -A IN -d $VIP -J DROP
arptables -A OUT -s $VIP -j name --mangle-ip-s $RIP
  • 在RS上修改内核参数以限制arp通告及应答级别

/proc/sys/net/ipv4/conf/all/arp_ignore     # 通告
/proc/sys/net/ipv4/conf/all/arp_announce   # 应答
  • 将vip绑定到 lo(回环)网卡上

  # 配置 /32
  lo:VIP:10.0.0.100/32
  /32 表示我自己一个网段,和其它都不在一个网段里,表示自己是孤立的网段
​
  # 只能绑定在回环网卡上,如果绑定在eth0使用的网卡,通告、响应都没了,自己提供服务的ip也不做通告响应,服务都访问不了了
  1. RS的RIP(服务器网段)可以使用私网地址,也可以是公网地址;RIP与DIP(lvs网段)在同一IP网络;RIP的网关不能指向DIP,以确保响应报文不会经由Director

  2. RS和Director要在同一个物理网络

  3. 请求报文要经由Director,但响应报文不经由Director,而由RS直接发往Client

  4. 不支持端口映射(端口不能修改)

  5. 无需开启ip_forward

  6. RS可使用大多数OS系统

4 TUN模式特点

  1. RIP和DIP可以不处于同一物理网络中,RS的网关一般不能指向DIP,且RIP可以和公网通信。也就是说集群节点可以跨互联网实现。DIP,VIP,RIP可以是公网地址

  2. RealServer的tun接口上需要配置VIP地址,以便接收director转发过来的数据包,以及作为响应的报文源IP

  3. 请求报文要经由Director,但响应不仅由Director,响应由RealServer自己完成

  4. 不支持端口映射

  5. RS的OS需支持隧道功能

5 fullnat模式特点

  1. VIP是公网地址,RIP和DIP是私网地址,且通常不在同一IP网络;因此,RIP的网关一般不会指向DIP

  2. RS收到的请求报文源地址是DIP,因此,只需响应给DIP;但Director还要将其发往Client

  3. 请求和响应报文都经由Director

  4. 相对NAT模式,可以更好实现LVS-RealServer间跨VLAN通讯

  5. 支持端口映射

注意:此类型kernel默认不支持


LVS调度算法

ipvs scheduler:根据其调度时是否考虑各RS当前的负载状态

分为两种:静态方法和动态方法

静态方法

仅根据算法本身进行调度

  • RR

    • roundrobin,轮询,较常用

  • WRR

    • Weighted RR,加权轮询,较常用

  • SH

    • Source Hashing,实现session sticky,源IP地址hash;将来自于同一个IP地址的请求始终发往第一次挑中的RS,从而实现会话绑定

  • DH

    • Destination Hashing; 目标地址哈希,第一次轮询调度至RS,后续将发往同一个目标地址的请求始终转发至第一次挑中的RS,典型使用场景是正向代理缓存场景中的负载均衡,如:web缓存

动态方法

主要根据根据RS当前的负载状态及调度算法进行调度Overhead(负载)=value 较小的RS将被调度

  1. LC: least connections 适用于长连接应用

Overhead=activeconns*256+inactiveconns
负载 = 活动连接*256+非活动连接,算出来的值谁最小调度在谁身上
  1. WLC: Weighted LC,默认调度方法,较常用

Overhead=(activeconns*256+inactiveconns)/weight
  1. SED: Shortest Expection Delay,初始连接权重优先,只检查活动连接,而不考虑非活动连接

Overhead=(activeconns+1)*256/weight
  1. NQ: Never Queue,第一轮均匀分配,后续SED

  2. LBLC: Locality-Based LC,动态的HD算法,使用场景:根据负载状态实现正向代理,实现Web Cache等

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

内核版本4.15版本后新增的调度算法 FO 和 OVF

  • FO(Weighted Fail Over)

    • 会查看所有服务器中的负载,找到未过载(IP_VS_DEST_F_OVERLAD标记)的,且权重最高的服务器,进行调度。

    • 静态算法

  • OVF

    • 基于真实服务器的活动连接数量和权重值实现。不仅考虑权重,还考虑连接数

    • 未过载(IP_VS_DEST_F_OVERLAD标记)

    • 真实服务器当前活动连接小于其权重值

    • 权重不能为零

面试考点:四种工作模式和12种调度算法

四种工作模式

1.nat

2.dr

3.tun

4.fullnat

# 常用的有 dr

12种调度算法

1.RR

2.WRR

3.SH

4.DH

# 以上是静态方法

5.LC

6.WLC (默认,常用)

7.SED

8.NQ

9.LBLC

10.LBLCR

# 以上是动态方法

11.FO

12.OVF

# 内核版本4.15版本后新增的调度算法



LVS相关软件

程序包:ipvsadm

  • 主程序:/usr/sbin/ipvsadm

  • 规则保存工具:/usr/sbin/ipvsadm-save

  • 规则加载(内存中)工具:/usr/sbin/ipvsadm-restore

  • 配置文件: /etc/sysconfig/ipvsadm-config

  • ipvs调度规则文件:/etc/sysconfig/ipvsadm

ipvsadm命令

  • ipvsadm核心功能

  • 集群服务管理:增、删、改

  • 集群服务的RS管理:增、删、改

  • 查看

  • 安装服务

dnf install -y ipvsadm

# 查看ipvsadm的相关文件
rpm -qa ipvsadm


  • ipvsadm工具用法

# 管理集群服务
ipvsadm -A|E -t|u|f service-address [-s scheduler] [-p [timeout]] [-M netmask] [--pe persistence_engine] [-b sched-flags]

ipvsadm -D -t|u|f service-address    # 删除

ipvsadm -C   # 清空

ipvsadm -R   # 重载,相当于ipvsadm-restore

ipvsadm -S [-n]     # 保存,相当于ipvsadm-save

管理集群服务:增、改、删

  • 增、修改:

ipvsadm -A|E -t|u|f service-address [-s scheduler] [-p [timeout]]
A 增
E 修改
  • 说明

service-address:

-t|u|f:
	-t: TCP协议的端口,VIP:TCP_PORT  如:-t 10.0.0.100:80
	-u:UDP协议的端口,VIP:UDP_PORT
	-f:firewalld MARK,标记,一个数字
[-s scheduler]: 指定集群的调度算法,默认为wlc

# 范例
ipvsadm -A -t 10.0.0.100:80 -s wrr

# 删除
ipvsadm -D -t|u|f service-address

管理集群上的RS(提供服务的服务器):增、改、删

  • 增、改:

ipvsadm -a|e -t|u|f service-address -r server-address [-g|i|m] [-w weight]
server-address:
	rip[:port] 如省略port,不作端口映射
选项:
lvs类型:
	-g: gateway,dr类型,默认
	-i: ipip,tun类型
	-m: masquerade,nat类型
-w weight: 权重
ipvsadm -d -t|u|f service-address -r server-address
  • 示例

ipvsadm -a -t 10.0.0.100:80 -r 10.0.0.8:8080 -m -w 3

清空定义的所有内容

ipvsadm -C

清空计数器

  • lvs会统计加一些数据计数

ipvsadm -Z [-t|u|f service-address]

查看

ipvsadm -L|l [options]
--numeric, -n: 以数字形式输出地址和端口号。不进行反向解析
--exact: 扩展信息,精确值
--connection, -c: 当前IPVS连接输出
--stats: 统计信息
--rate: 输出速率
  • 查看集群地址

ipvsadm -Ln

示例

# 添加管理集群lvs并设置调度算法
ipvsadm -A -t 10.0.0.10:80 -s wrr

# 添加管理集群lvs工作模式
ipvsadm -a -t 10.0.0.10:80 -r 10.0.0.11:8080 -m
ipvsadm -a -t 10.0.0.10:80 -r 10.0.0.12:80 -m -w 3

# 然后访问 10.0.0.10:80 即可,会根据设置的调度算法去调度到服务器上,而服务器上会根据lvs设置的工作模式进行工作


LVS实战案例

LVS-NAT模式案例

  • 环境

# 共四台主机
一台:internet client:192.168.10.6/24     GW:无  仅主机

一台:lvs
eth1  仅主机  192.168.10.100/16
eth0  NAT  10.0.0.8/24

# 这里的网关必须指向lvs的ip地址,不然无法客户端通讯
两台RS:
RS1: 10.0.0.7/24    GW: 10.0.0.8 NAT
RS2: 10.0.0.17/24   GW: 10.0.0.8 NAT   
  • 配置过程(lvs节点)

# lvs节点(因为启动的工作模式是 NAT,有端口转发,需要配置)
vim /etc/sysctl.conf
net.ipv4.ip_forward = 1

sysctl -p

dnf install -y ipvsadm

# 利用第二张网卡配置lvs调度算法
ipvsadm -A -t 192.168.10.100:80 -s wrr

# 添加服务器到设置好的调度算法中,并设置工作模式
ipvsadm -a -t 192.168.10.100:80 -r 10.0.0.7 -m
ipvsadm -a -t 192.168.10.100:80 -r 10.0.0.8 -m


# 查看被调度的目前情况
ipvsadm -Lnc

# 查看被调度在内存里的信息
cat /proc/net/ip_vs_conn

# 注意,当机器重启我们设置的规则就全丢了,需要保存当前的规则
/sbin/ipvsadm-save -n > /etc/sysconfig/ipvsadm

systemctl enable ipvsadm

# 如何查看保存命令
cat /lib/systemd/system/ipvsadm.service

LVS-DR模式案例(重点)

  • 五台主机

一台:客户端 eth0:仅主机 192.168.10.6/24 
GW:192.168.10.200

一台:ROUTER
eth0:NAT   10.0.0.200/24
eth1:仅主机  192.168.10.200/24
启动 IP_FORWARD

一台:LVS
eth0:NAT:DIP:10.0.0.8/24   GW:10.0.0.200

两台RS:
RS1: eth0:NAT:10.0.0.7/24  GW: 10.0.0.200
RS2: eth0:NAT:10.0.0.17/24  GW: 10.0.0.200
  • router节点

vim /etc/sysctl.conf
net.ipv4.ip_forward = 1

sysctl -p
  • rs1上的回环网卡添加vip

# 添加vip方式1
ip a a 10.0.0.100/32 dev lo label lo:1

# 添加vip方式2
ifconfig lo:1 10.0.0.100/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 
  • rs2上的回环网卡添加vip

# 添加vip方式1
ip a a 10.0.0.100/32 dev lo label lo:1

# 添加vip方式2
ifconfig lo:1 10.0.0.100/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 
  • lvs节点

ip a a 10.0.0.100/32 dev lo label lo:1

# 安装
yum install -y lvsadm

# 配置lvs调度算法
lvsadm -A -t 10.0.0.100:80 -s wlc

# 查看
ipvsadm -Ln

# 添加RIP(服务器地址)并设置工作模式
ipvsadm -a -t 10.0.0.100:80 -r 10.0.0.7 -g
ipvsadm -a -t 10.0.0.100:80 -r 10.0.0.17 -g

PS: dr模型不支持端口映射,只支持80,加了其它端口也会变成80

# 修改lvs调度算法
ipvsadm -E -t 10.0.0.100:80 -s sh

sh算法特点,一台机器只能调度在一台服务器上,不会再调度到其它服务器

# 修改lvs调度算法
ipvsadm -E -t 10.0.0.100:80 -s rr

rr轮询算法,每台服务器,一台一次


# lvs网关可以随意配置,但不能没有,因为网关是与外网交互的,需要转发到服务上,如果没有网关,客户端的数据报文到lvs服务器,lvs不认为是通外网的,也就不转了,服务器也就收不到报文,就转发不出去,导致服务不能访问

多网段的DR模型

  • router

# 在一张网卡上添加多个网段
nmcli connection modify eth0 +ipv4.addresses 172.16.0.200/24 ifname eth0:1
  • rs1/rs2

vim /root/lvs-dr-rs.sh
#!/bin/bash
# LVS DR默认初始化脚本
LVS_VIP=10.0.0.100/32
DEV=lo:1
# source /etc/rc.d/init.d/functions
case "$1" in
start)
/sbin/ifconfig lo:0 $LVS_VIP netmask 255.255.255.255 # broadcast $LVS_VIP
# /sbin/route add -host $LVS_VIP dev lo:0
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 
sysctl -p > /dev/null 2>&1
echo "RealServer RS Start OK"
;;
stop)
/sbin/ifconfig lo:0 down
# /sbin/route del $LVS_VIP > /dev/null 2>&1
echo 0 > /proc/sys/net/ipv4/conf/all/arp_ignore 
echo 0 > /proc/sys/net/ipv4/conf/lo/arp_ignore 
echo 0 > /proc/sys/net/ipv4/conf/all/arp_announce
echo 0 > /proc/sys/net/ipv4/conf/lo/arp_announce 
sysctl -p > /dev/null 2>&1
echo "RealServer RS Stoped"
;;
*)
echo "Usage: $0 {start|stop}"
exit 1
esac
exit 0

# 启动脚本
bash lvs-dr-rs.sh start
  • lvs设置脚本

vim lvs-dr-vs.sh
#!/bin/bash
vip="172.16.0.100"
iface="lo:1"
mask="255.255.255.255"
port="80"
rs1="10.0.0.7"
rs2="10.0.0.17"
scheduler="wrr"
type="-g"
rpm -q ipvsadm &> /dev/null || yum install -y ipvsadm &> /dev/null

case $1 in
start)
   ifconfig $iface $vip netmask $mask
   iptables -F
   ipvsadm -C
   ipvsadm -A -t ${vip}:${port} -s ${scheduler}
   ipvsadm -a -t ${vip}:${port} -r ${rs1} ${type} -w 1
   ipvsadm -a -t ${vip}:${port} -r ${rs2} ${type} -w 1
   echo "The VS Server is Ready!"
   ;;
stop)
   ipvsadm -C
   ifconfig $iface down
   echo "The VS Server is Canceled!"
   ;;
*)
   echo "Usage; ${basename $0} start|stop"
   exit 1
   ;;
esac


# 启动脚本
bash lvs_dr_vs.sh start

# 查看规则
ipvsadm -Ln

# 测试可用性
curl 172.16.0.100

LVS-TUNNEL隧道模式案例

  • lvs服务器配置

一张网卡,网段为:10.0.0.8/24

# 开启tunnel网卡并配置VIP
ifconfig tunl0 10.0.0.100 netmask 255.255.255.255 up

# 或下面方法,注意设备名必须为tunl0
ip addr add 10.0.0.100/32 dev tunl0
ip link set up tunl0

# 自动加载ipip模块
lsmod | grep ipip
  • rs1/rs2

sh lvs-dr-rs.sh stop
  • lvs

ip addr add 10.0.0.100/32 dev tunl0

# 查看模块是否已加载进来,有则已成功
lsmod | grep ipip

# 启动 tunl0 网卡
ip link set tunl0 up

# 安装服务
dnf install -y ipvsadm

# 设置调度算法
ipvsadm -A -t 10.0.0.100:80 -s rr
ipvsadm -a -t 10.0.0.100:80 -r 10.0.0.7 -i
ipvsadm -a -t 10.0.0.100:80 -r 10.0.0.17 -i

# 查看
ipvsadm -Ln
  • rs1/rs2添加隧道网络

ifconfig tunl0 10.0.0.100 netmask 255.255.255.255 up

# 查看隧道模块是否已加载
lsmod | grep ipip

# 禁止地址广播响应回应,解决地址冲突
echo "1" > /proc/sys/net/ipv4/conf/tunl0/arp_ignore
echo "2" > /proc/sys/net/ipv4/conf/tunl0/arp_announce
echo "1" > /proc/sys/net/ipv4/conf/all/arp_ignore
echo "2" > /proc/sys/net/ipv4/conf/all/arp_announce

# 因为 tun 模式下,客户端发送过来的报文需要检查完整性,再回去校验是否可用,但是lvs是直接走服务器端的,不回去,不要原路检查,反而导致出现问题,而且服务器端也不走lvs通向客户端,直接走路由器,所以得关闭
echo "0" > /proc/sys/net/ipv4/conf/tunl0/rp_filter
echo "0" > /proc/sys/net/ipv4/conf/all/rp_filter
  • 到客户端测试

curl 10.0.0.100

解决https的lvs调度问题

防火墙标签

  • 恢复到DR模型

  • rs1/rs2

dnf install -y mod_ssl

systemctl restart httpd
  • lvs

ipvsadmm -A -t 10.0.0.100:443 -s rr
ipvsadm -a -t 10.0.0.100:443 -r 10.0.0.7
ipvsadm -a -t 10.0.0.100:443 -r 10.0.0.17

# 查看可看到有两个lvs集群
ipvsadm -Ln
  • 客户端访问测试

curl 10.0.0.100; curl -k https://10.0.0.100/

# 会发现两个lvs明明是同一个服务,确实各走各的,导致都调度到了一台RS上。需要利用lvs的标签将两个集群绑定解决问题,将两个集群作为整体调度
  • lvs贴防火墙标签

# 根据标签来进行调度,不用端口协议来进行调度

# 清空lvs以前的规则,以下配置标签定义
ipvsadm -C

# 查看mangle表 
iptables -t mangle -L

# 在mangle表中的PREROUTING链中打上标签
iptables -t mangle -A PREROUTING -d 10.0.0.100 -p tcp -m multiport --dports 80,443 -j MARK --set-mark 10
--set-mark 是打标签

# lvs根据标签进行调度
ipvsadm -A -f 10 -s rr
ipvsadm -a -f 10 -r 10.0.0.7    # 默认是dr模型
ipvsadm -a -f 10 -r 10.0.0.17

# 查看
ipvsadm -Ln

LVS持久连接

  • 现在就有个问题,当服务器调度到不同集群上时,session信息不会被保存,导致用户刚登录上可能就跳到另外台机器上了,导致又要重新登录

  • 持久连接实现方式

  • 端口持久(PPC)

  • 防火墙标记持久(PFWMC)

  • 客户端持久(PCC)

  • 解决方法:将调度到的服务器设置一个时间,在这个时间段内只能被调度到这台机器

ipvsadm -E -f 10 -s rr -p
# p 设置持久连接时间,默认是 360 秒,也就是五分钟

LVS高可用待续

  • lvs自身没有健康检查,也就没有高可用性。

  • 利用 keepalived解决

  • 到keepalived文档中寻找高可用方法

【版权声明】本文为华为云社区用户原创内容,未经允许不得转载,如需转载请自行联系原作者进行授权。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。