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链的时候,已经修改了数据包的流向,还决定了数据包应该还发送哪个网卡。
问题:
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 本身就是对负载均衡这个场景而设计,它所内置的数据结构在大数据量的情况下,更加高效。