ipvsadm是什么

LVS由两部分由ipvs与ipvsadm组成,ipvs是LVS的核心实现需要借助管理工具ipvsadm定义LVS集群规则,ipvs根据定义好的规则进行工作。

ipvsadm的相关文件

服务名:         ipvsadm.service
主程序:        /usr/sbin/ipvsadm
规则保存工具:  /usr/sbin/ipvsadm-save
规则重载工具:  /usr/sbin/ipvsadm-restore
配置文件:      /etc/sysconfig/ipvsadm-config

ipvsadm语法

管理集群服务

ipvsadm -A|E -t|u|f service-address:port [-s scheduler] [-p [timeout]]
-A  创建一个LVS集群
-E  修改一个LVS集群
-C  清空LVS规则
-R  重载LVS规则,重载规则时需要利用重定向<
-S  保存
-Z  清空计数器
-L  查看LVS规则
    -n:        以数字形式输出地址和端口号
    --exact:   扩展信息,精确值
    -c:        当前IPVS连接输出
    --stats:   统计信息
    --rate :   输出速率信息

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

service-address:
    -t|u|f:创建LVS集群服务为tcp/udp/firewall mark服务
    -t: TCP协议的端口,VIP:TCP端口
    -u: UDP协议的端口,VIP:UDP端口
    -f:firewall MARK,标记,一个数字
    
[-s scheduler]:指定集群的调度算法,默认为wlc(加权最少链路)


管理集群服务上的RealServer

ipvsadm -a|e -t|u|f service-address -r server-address [-g|i|m] [-w weight]

server-address:
格式:rip[:port] 如省略port,不作端口映射

-a  添加一个RealServer到集群中。
-d  删除一个RealServer服务器
-r  指定将要添加的Realserver的IP地址。
-m  表示LVS集群的工作模式为LVS-NAT模式
-g  表示LVS集群的工作模式为LVS-DR模式,默认
-i  表示LVS集群的工作模式为LVS-TUN模式
-w  权重

实例

拓扑图 image

LVS-NAT集群

1.开启调度器VS主机的包转发功能

# echo "net.ipv4.ip_forward = 1" >> /etc/sysctl.conf && sysctl -p

2.创建一个LVS-NAT集群

在LVS主机上:
# ipvsadm -A -t 172.18.44.220:80 -s rr

3.添加RealServer

# ipvsadm -a -t 172.18.44.220:80 -m -r 192.168.7.201:80
# ipvsadm -a -t 172.18.44.220:80 -m -r 192.168.7.203:8080

4.检验

# ipvsadm -Ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
TCP  172.18.44.220:80 rr
  -> 192.168.7.201:80             Masq    1      0          0         
  -> 192.168.7.203:8080           Masq    1      0          0 

5.保存ipvs

# ipvsadm-save -n > /etc/sysconfig/ipvsadm

6.测试

在外网的客户机
# for ((i=1;i<=10;i++));do curl 172.18.44.220;done
nginx on RS1
nginx on RS2
nginx on RS1
nginx on RS2
nginx on RS1
nginx on RS2
nginx on RS1
nginx on RS2
nginx on RS1
nginx on RS2

7.调整下调度算法和RealServer权重

# ipvsadm -E -t 172.18.44.220:80 -s wrr
# ipvsadm -e -t 172.18.44.220:80 -m -r 192.168.7.201:80 -w 2
# ipvsadm -e -t 172.18.44.220:80 -m -r 192.168.7.203:8080 -w 1
# ipvsadm -ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
TCP  172.18.44.220:80 wrr
  -> 192.168.7.201:80             Masq    2      0          0         
  -> 192.168.7.203:8080           Masq    1      0          0

8.测试

# for ((i=1;i<=10;i++));do curl 172.18.44.220;done
nginx on RS1
nginx on RS1
nginx on RS2
nginx on RS1
nginx on RS1
nginx on RS2
nginx on RS1
nginx on RS1
nginx on RS2
nginx on RS1

注意:LVS规则修改后会立即生效。

LVS-DR集群

拓扑图 image LVS配置

#!/bin/bash
vip='192.168.7.250'
iface='eth0:1'
mask='255.255.255.255'
port='80'
rs1='192.168.7.201'
rs2='192.168.7.203'
scheduler='rr'
type='-g'

case $1 in
start)
    ifconfig $iface $vip netmask $mask
    iptables -F
 
    ipvsadm -A -t ${vip}:${port} -s $scheduler
    ipvsadm -a -t ${vip}:${port} -r ${rs1} $type
    ipvsadm -a -t ${vip}:${port} -r ${rs2} $type
    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

RS配置(2台)

#!/bin/bash
vip=192.168.7.250
mask='255.255.255.255'
dev=lo:1

case $1 in
start)
    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
    ifconfig $dev $vip netmask $mask
    #route add -host $vip dev $dev
    echo "The RS Server is Ready!"
    ;;
stop)
    ifconfig $dev down
    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
    echo "The RS Server is Canceled!"
    ;;
*)
    echo "Usage: $(basename $0) start|stop"
    exit 1
    ;;
esac

客户机

# for ((i=1;i<=10;i++));do curl 192.168.7.250;done
RS2
RS1
RS2
RS1
RS2
RS1
RS2
RS1
RS2
RS1