LVS-DR配置

来自Linux78|wiki

DR(Direct Routing)

1、通过在调度器LB上修改数据包的目的MAC地址实现转发。注意,源IP地址仍然是CIP, 目的IP地址仍然是VIP。

2、请求的报文经过调度器,而RS响应处理后的报文无需经过调度器LB, 因此,并发访问量大时使用效率很高(和NAT模式比)

3、因DR模式是通过MAC地址的改写机制实现的转发,因此,所有RS节点和调度器LB只能在一个局域网LAN中(小缺点)。

4、需要注意RS节点的VIP的绑定(lo:vip/32,lo1:vip/32) 和ARP抑制问题。

5、强调下: RS节点的默认网关不需要是调度器LB的DIP, 而直接是DC机房分配的上级路由器的IP (这是RS带有外网P地址的情况),理论讲:只要RS可以出网即可,不是必须要配置外网IP。

6、由于DR模式的调度器仅进行了目的MAC地址的改写,因此,调度器LB无法改变请求的报文的目的端口(和NAT要区别)

7、当前,调度器LB支持几乎所有的UNIX,LINUX系统,但目前不支持WINDOWS系统。真实服务器RS节点可以是WINDOWS系统。

8、总的来说DR模式效率很高,但是配置也较麻烦,因此,访问量不是特别大的公司可以用haproxy/nginx取代之。这符合运维的原则:简单、易用、高效。日1000-2000W PV或并发请求1万以下都可以考虑用haproxy/nginx (LVS NAT模式)

9、直接对外的访问业务,例如:web服务做RS节点,RS最好用公网IP地址。如果不直接对外的业务,例如: MySQL,存储系统RS节点,最好只用内部IP地址。

DR模式的核心特点就是更改目标MAC地址进行转发

配置DR

安装LVS管理工具ipvsadm

yum install ipvsadm -y
rpm -qa ipvsadm
ln -s /usr/src/kernels/`uname -r`/ /usr/src/linux

检查内核中是否有ip_vs,若是没有需要手动执行ipvsadm或modprobe ip_vs

# lsmod |grep ip_vs
ip_vs                 126705  0
libcrc32c               1246  1 ip_vs
ipv6                  336368  265 ip_vs

手动创建VIP

[root@lb01 ~]# ip addr add 10.0.0.3/24 dev eth0 label eth0:0
[root@lb01 ~]# ifconfig eth0:0
eth0:0    Link encap:Ethernet  HWaddr 00:0C:29:F9:DF:AB
         inet addr:10.0.0.3  Bcast:0.0.0.0  Mask:255.255.255.0
         UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1

ipvsadm常用参数配置

ipvsadm --help
 --clear           -C       清空所有配置表
 --add-service     -A        添加一个虚拟Server,即VIP
 --add-server      -a        添加一个真实Server,即RS
 --gatewaying   -g          配置DR的工作模式,默认为DR。(direct routing) (default)
 --ipip         -i           配置Tunnel模式。ipip encapsulation (tunneling)
 --masquerading -m          配置NAT模式。masquerading (NAT)
 --weight       -w weight    RS的权重capacity of real server
 --tcp-service  -t service-address   设置服务地址及端口
 --scheduler    -s scheduler       指定一个调度算法[rr|wrr|lc|wlc|lblc|lblcr|dh|sh|sed|nq],
 --set tcp tcpfin udp        设置这三个值的连接超时时间
 --list            -L|-l     列出配置表
 --numeric      -n         数字化输出地址和端口信息
 --delete-server   -d        删除RS节点

清空所有配置

[root@lb01 ~]# ipvsadm -C

添加一个虚拟Server即VIP

[root@lb01 ~]# ipvsadm -A -t 10.0.0.3:80 -s wrr

添加web节点

[root@lb01 ~]# ipvsadm -a -t 10.0.0.3:80 -r 10.0.0.7:80 -g -w 1
[root@lb01 ~]# ipvsadm -a -t 10.0.0.3:80 -r 10.0.0.8:80 -g -w 1
[root@lb01 ~]# ipvsadm --set 30 5 60
[root@lb01 ~]# ipvsadm -Ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
 -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
TCP  10.0.0.3:80 wrr
 -> 10.0.0.7:80                  Route   1      0          0
 -> 10.0.0.8:80                  Route   1      0          0  

web01和web02节点配置VIP

[root@web01 ~]# ip addr add 10.0.0.3/32 dev lo label lo:0
[root@web01 ~]# ifconfig lo:0
lo:0      Link encap:Local Loopback
         inet addr:10.0.0.3  Mask:255.255.255.255
         UP LOOPBACK RUNNING  MTU:65536  Metric:1

添加路由,可不操作

[root@web01 ~]# route add -host 10.0.0.3 dev lo

抑制ARP

[root@web01 ~]# echo "1" >/proc/sys/net/ipv4/conf/lo/arp_ignore
[root@web01 ~]# echo "2" >/proc/sys/net/ipv4/conf/lo/arp_announce
[root@web01 ~]# echo "1" >/proc/sys/net/ipv4/conf/all/arp_ignore
[root@web01 ~]# echo "2" >/proc/sys/net/ipv4/conf/all/arp_announce

[root@lb01 ~]# ipvsadm -Ln --sort
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
TCP  10.0.0.3:80 wrr
  -> 10.0.0.7:80                  Route   1      0          0
  -> 10.0.0.8:80                  Route   1      0          0
[root@lb01 ~]# ipvsadm -Ln --stats
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port               Conns   InPkts  OutPkts  InBytes OutBytes
  -> RemoteAddress:Port
TCP  10.0.0.3:80                         3       42        0     6560        0
  -> 10.0.0.7:80                         1       10        0      624        0
  -> 10.0.0.8:80                         2       32        0     5936        0

LVS没有健康检查的功能,ipvsadm删除节点

[root@lb01 ~]# ipvsadm -Ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
TCP  10.0.0.3:80 wrr
  -> 10.0.0.7:80                  Route   1      1          0
  -> 10.0.0.8:80                  Route   1      1          0
[root@lb01 ~]# ipvsadm -d -t 10.0.0.3:80 -r 10.0.0.8:80
[root@lb01 ~]# ipvsadm -Ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
TCP  10.0.0.3:80 wrr
  -> 10.0.0.7:80                  Route   1      0          0

抑制ARP参数

arp_ignore - INTEGER

定义对目标地址为本地IP的ARP询问不同的应答模式

  • 0 - (默认值):回应任何网络接口,上对任何本地IP地址的arp查询请求。
  • 1 - 只回答目标IP地址是来访网络接口本地地址的ARP查询请求。
  • 2 - 只回答目标IP地址是来访网络接口本地地址的ARP查询请求,且来访IP必须在该网络接口的子网段内。
  • 3 - 不回应该网络界面的arp请求,而只对设置的唯一和连接地址做出回应。
  • 4 - 7 保留未使用。
  • 8 - 不回应所有(本地地址)的arp查询。

arp_announce - INTEGER

对网络接口上, 本地IP地址的发出的, ARP回应,作出相应级别的限制:确定不同程度的限制,宣布对来自本地源IP地址发出Arp请求的接口

  • 0 - (默认)在任意网络接口(eth0,eth1, lo). 上的任何本地地址
  • 1 - 尽量避免不在该网络接口子网段的本地地址做出arp回应.当发起ARP请求的源IP地址是被设置应该经由路由达到此网络接口的时候很有用.此时会检查来访IP是否为所有接口上的子网段内ip之一。如果该来访IP不属于各个网络接口上的子网段内,那么将采用级别2的方式来进行处理.
  • 2 -对查询目标使用最适当的本地地址,在此模式下将忽略这个IP数据包的源地址并尝试选择能与该地址通信的本地地址,首要是选择所有的网络接口的子网中外出访问子网中包含该目标IP地址的本地地址。如果没有合适的地址被发现将选择当前的发送网络接口或其他的有可能接受到该ARP回应的网络接口来进行发送限制了使用本地的vip地址作为优先的网络接口