欢迎您访问 最编程 本站为您分享编程语言代码,编程技术文章!
您现在的位置是: 首页

理解Linux中的ipvs与ipvsadm工具

最编程 2024-08-10 21:38:56
...

ipvs 是什么?

ipvs (Ip virtual Server),是内置在Linux内核的,工作在第四层协议的负载均衡器。

ipvs的功能有哪些?
  • 1:负载均衡
    ......

ipvs 之中的相关概念
  • DS: Director Server。指的是前端负载均衡器节点。
  • RS: Real Server。后端真实的工作服务器。
  • VIP: 向外部直接面向用户请求,作为用户请求的目标的IP地址。
  • DIP: Director Server IP,主要用于和内部主机通讯的IP地址。
  • RIP: Real Server IP,后端服务器的IP地址。
  • CIP: Client IP,访问客户端的IP地址。

ipvs NAT模式实现的背后原理

ipvs的实现,还是基于 netfilter 之中的hook。ipvs 会拉取 符合规则的 ,流向INPUT链的数据包,然后将数据包投向POSTROUTING链,在数据包流入POSTROUTING链之前,进行NAT转换。

自己觉得,在数据包被从 INPUT链 拉向 POSTROUTING链的时候,已经修改了数据包的流向,还决定了数据包应该还发送哪个网卡。

ipvs生效原理-网上截图.png

问题:

1: 应用ipvs之后,当流向INPUT链的数据包符合ipvs规则,被拉向 POSTROUTING链之后,是否还会被iptables INPUT链之中的规则所应用?
不会的。 验证方式,设置ipvs规则后,自己手动在iptables 的 INPUT链增加LOG规则,然后curl 发送请求,查看内核之中是否会有输出信息。

2: 使用ipvs之后,为什么 conntrack 无法跟踪连接的请求?
ipvs 会截取从HOOK点 流经的数据包,导致数据包 不会流经 内核的CT(连接跟踪)模块,所以自然连接跟踪表之中是不会有连接跟踪的记录的。

ipvs 模式

如何理解 ipvs 模式?

负载均衡这个方案具有不同技术方案来实现,类似于到达终点有不同的路径。

ipvs的模式有哪些?

  • 1: NAT 模式
  • 2: 直接路由模式,DR
  • 3: IP隧道模式

问题:

1: 使用 ipvs NAT 模式,iptables 表之中是否会多出新的规则?
不会的。

ipvs 负载均衡算法
  • 1:轮循调度rr,Round Robin
  • 2:加权轮循wrr,Weighted Round Robin
  • 3:目标地址散列DH, Destination Hashing
  • 4: 源地址散列SH, Source Hashing
  • 5:最少链接LC, Least Connections
  • 6:加权最少链接WLC, Weighted Least Connections
  • 7:最短的期望延迟SED, Shortest Expected Delay Scheduling

ipvsadm (ipvs 客户端):Linux 上用以设置 ipvs 规则的命令

ipvsadm之中的相关概念:

  • 1: 虚拟服务
  • 2: 虚拟服务规则
    注意: 虚拟服务规则是虚拟服务之中的规则,两者是一对多的关系。

参数

虚拟服务参数:

  • -A: 添加一条新的虚拟服务
  • -L:显示内核中的虚拟服务规则
  • -E:编辑一个虚拟服务
  • -D:删除一个虚拟服务
  • -t:TCP协议的虚拟服务,指定虚拟服务的网络协议类型。 后面需要跟着ip:端口
  • -p: 后面跟时间,默认是360秒。实现无论使用任何算法,在一段时间内,能够实现将来自同一个地址的请求始终发向同一个RS

虚拟服务规则参数:

  • -r:真实的服务器,后面跟着真实的服务器地址
  • -s:指定使用的调度算法,有这样几个选项rr|wrr|lc|wlc|lblc|lblcr|dh|sh|sed|nq
  • -a:在一个虚拟服务之中添加一个真实的服务器
  • -d:在一个虚拟服务之中删除一个真实的服务器

工作模式参数:

  • -m:指定LVS的工作模式为NAT模式
  • -g:指定LVS的工作模式为直接路由 模式
  • -i:指定LVS的工作模式为 隧道模式

其他参数:

  • -w:使用的时候,后面加数字,表示权重
  • -n: 输出信息以数字形式显示。

ipvsadm 使用小例子

1: 使用docker容器模拟 服务器,使用ipvs 进行负载均衡实验。

目的:熟悉ipvsadm 的使用
步骤:
1: 创建两个docker容器,用以模拟不同的服务器。容器的功能,访问容器的8000端口,会返回容器的hostname。

   docker run -d -p 8000:8000 --name first -t jwilder/whoami
   docker run -d -p 8001:8000 --name second -t jwilder/whoami

2: 创建一个虚拟服务,对指定地址的访问请求 指定所使用负载均衡算法

 ipvsadm -A -t 本机IP地址:端口 -s rr

3: 为虚拟服务之中增加虚拟服务规则,使用nat模式进行负载均衡,将请求转发到具体的服务器上。
注意:一个虚拟服务的唯一标志是 ip地址:端口

  ipvsadm -a -t 本机IP地址:端口 -r 真实ip地址1:端口1 -m 
  ipvsadm -a -t 本机IP地址:端口 -r 真实ip地址2:端口2 -m 

4: 访问本机地址,查看返回的结果,验证负载均衡的功能
curl 本机IP地址:端口
curl 本机IP地址:端口
实验结果发现: 两次返回的内容不一致。

2: 创建一个虚拟服务

    ipvsadm -A -t 虚拟IP:端口 -s 负载均衡算法

3: 查看虚拟服务列表

    ipvsadm -Ln

4: 显示虚拟服务详情

     ipvsadm -Ln -t 虚拟ip:端口

5: 向一个虚拟服务之中添加规则

    ipvsadm -a -t 虚拟ip:端口 -r 真实ip:真实端口 -m 

6: 在虚拟服务之中删除规则

    ipvsadm -d -t 虚拟ip:端口 -r 真实ip:真实端口

7: 删除虚拟服务

     ipvsadm -D -t 虚拟ip:端口

8: 修改一个虚拟服务

     ipvsadm -E -t 虚拟ip:端口

问题:

1: 使用ipvs 实现 负载均衡 和 使用iptables 实现负载均衡的优势?

自己目前的认知: ipvs 本身就是对负载均衡这个场景而设计,它所内置的数据结构在大数据量的情况下,更加高效。

推荐阅读