ipvsadm

加载ip_vs 模块

#!/bin/bash
ipvs_mods_dir="/usr/lib/modules/$(uname -r)/kernel/net/netfilter/ipvs"
for i in $(ls $ipvs_mods_dir|grep -o "^[^.]*")
do
/sbin/modinfo -F filename $i &>/dev/null
if [ $? -eq 0 ];then
/sbin/modprobe $i
fi
done

安装ipvsadm

#yum install kernel-devel
#yum install libnl* popt* -y
#rpm -ivh popt-static-1.13-7.el6.x86_64.rpm
ln -s /usr/src/kernels/$(uname -r)/ /usr/src/linux
wget http://www.linuxvirtualserver.org/software/kernel-2.6/ipvsadm-1.26.tar.gz
tar xf ipvsadm-1.26.tar.gz
cd ipvsadm-1.26
make && make install

快速开始

ipvsadm -A -t 192.168.0.20:80 -s rr -p 20 添加虚拟主机
ipvsadm -a -t 192.168.0.20:80 -r 192.168.0.3 -g -w 1 添加web节点
ipvsadm -a -t 192.168.0.20:80 -r 192.168.0.4 -g -w 1 添加web节点
ipvsadm -Ln --stats

ipvsadm

ipvsadm - Linux Virtual Server administration

短命令 长命令 解释 事例
--set tcp tcpfin udp 指定连接超时时间 ipvsadm --set 20 5 60
--start-daemon master
--start-daemon backup
  • 维护虚主机
命令格式:
ipvsadm COMMAND [protocol] service-address [scheduling-method] [persistence options]
ipvsadm -A -t 47.113.100.31 -s rr -p 20

COMMAND

短命令 长命令 解释 事例
-A --add-service 添加virtual server
-E --edit-service 编辑virtual server
-D --delete-service 删除virtual server 及相关的real server ipvsadm -D -t 47.113.100.31:80
-C --clear 清空配置 ipvsadm -C
-R --restore 从标准输入加载
-S --save 保存到标准输出
-Z --zero 清空匹配的包

[protocol]

短命令 长命令 解释
-t --tcp-service tcp协议service
-u --udp-service udp协议service
-f --fwmark-service

[scheduling-method]

短命令 长 命 令
-s --scheduler rr round-robin
wrr weighted-round-robin
lc least-connection
wlc weighted-least-connection
lblc 相同客户端访问相同的服务,如果服务没有超负荷
lblcr
dh - Destination Hashing
sh Source hashing
sed - Shortest Expected Delay 最小延迟
nq Never Queue 1.优先分配到一个闲置的real server 、或最快的real server 2.如果都繁忙使用sed 调度算法

[persistence options]

短命令 长命令 解释
-p --persistent [timeout] 回话保持,timeout 默认300s
  • 维护realserver
命令格式:
ipvsadm command [protocol] service-address server-address [packet-forwarding-method] [weight options]
ipvsadm -a -t 47.113.100.31:80 -r 172.16.100.14:80 -m -w 1

command

短命令 长命令 解释
-a --add-server 添加real server
-e --edit-server 编辑real server
-d --delete-server 删除real server

server-address

短命令 长命令 解释
-r ---real-server -r 172.16.100.14:80

[packet-forwarding-method]

短命令 长命令 解释
-g --gatewaying direct routing
-i --ipip tunneling
-m --masquerading NAT

[weight options]

注:权重用整数来表示,有时候也可以将其设置为atomic_t;其有效表示值范围为24bit整数空间,即(2^24-1);

1、添加服务(通过设定其权重>0);

2、关闭服务(通过设定其权重=0);此应用场景中,已经连接的用户将可以继续使用此服务,直到其退出或超时;新的连接请求将被拒绝;

短命令 长命令 解释
-w --weight 权重
  • 查询指令

    命令格式:ipvsadm -L|l [options]

    [options]

短命令 长命令 解释 事例
-c --connection 当前ipvs的 连接情况
--stats 输出状态信息
--rate 速率信息
--thresholds 输出real server的阈值信息 ipvsadm -Ln --threshods
--persistent-conn 输出会话保持的信息
--sort 排序输出
--nosort 不排序
-n --numeric 不解析域名
--exact 精确的字节信息
  • 保存命令

    ipvsadm-sav > ipvsadm.sav
  • 恢复命令

    ipvsadm-sav < ipvsadm.sav
  • 查询版本 ipvsadm --version

  • 查询ipvs的hash ipvsadm 返回值IP Virtual Server version 1.2.1 (size=4096)

  • 加载多条ipvs

    echo "
    -A -t 207.175.44.110:80 -s rr
    -a -t 207.175.44.110:80 -r 192.168.10.1:80 -m
    -a -t 207.175.44.110:80 -r 192.168.10.2:80 -m
    -a -t 207.175.44.110:80 -r 192.168.10.3:80 -m
    -a -t 207.175.44.110:80 -r 192.168.10.4:80 -m
    -a -t 207.175.44.110:80 -r 192.168.10.5:80 -m
    " | ipvsadm -R

LVS/NAT

实验环境:

角色 ip 网关
外网ip 192.168.0.99 192.168.0.1
内网ip 172.16.100.100
realserver01 172.16.100.101/24 172.16.100.100
realserver02 172.16.100.102/24 172.16.100.100

实验步骤:

  1. 在调度器上设置双网卡,外网网卡192.168.0.99/24 。内网地址 172.16.100.100/24

  2. 在调度器上开启路由内核转发

    echo "net.ipv4.ip_forward = 1" >>/etc/sysctl.conf
    echo "1" > /proc/sys/net/ipv4/ip_forward
    sysctl -p
  3. 在调度器上配置

    ipvsadm -A -t 192.168.0.99:80 -s rr
    ipvsadm -a -t 192.168.0.99:80 -r 172.16.100.101:8000 -m -w 1
    ipvsadm -a -t 192.168.0.99:80 -r 172.16.100.102:8000 -m -w 1
  4. 在所有的realserver上配置内网地址 172.16.100.0/24 gateway 172.16.100.100。开启一个http服务等待测试

    python2 -m SimpleHTTPServer 8000
  • 脚本

    #!/bin/bash
    VIP=(
    192.168.0.101
    )
    Virtul_Port="80"
    RIP=(
    172.16.100.101:8000
    172.16.100.102:8000
    )
    Usage(){
    echo "$0 start|stop."
    }
    Start(){
    ip addr add ${VIP}/24 dev eth0
    ipvsadm -A -t ${VIP}:${Virtul_Port} -s rr
    for ip in ${RIP[@]};do
    ipvsadm -a -t ${VIP}:${Virtul_Port} -r ${RIP} -m -w 1
    done
    }
    Stop(){
    ip addr del ${VIP}/24 dev eth0
    ipvsadm -D -t ${VIP}:${Virtul_Port} -s rr
    for ip in ${RIP};do
    ipvsadm -d -t ${VIP}:${Virtul_Port} -r ${RIP} -m -w 1
    done
    }
    declare -A main
    main["start"]=Start
    main["stop"]=Stop
    if [ -n "$1" ] && ([ "$1" == "start" ] || [ "$1" == "stop" ]);then
    ${main["$1"]}
    else
    Usage
    fi

LVS/DR

  • 实验环境:
角色 ip
vip 192.168.0.101
DIP 192.168.0.99
realserver01 192.168.0.113
realserver02 192.168.0.112

实验步骤:

  1. 在调度器上配置vip

    net.ipv4.ip_forward = 1 在nat 中必须开启,在DR 中不开测试正常

    ip addr add 192.168.0.101/24 dev eth0
    ip route add 192.168.0.101 dev eth0
    #ifconfig eth0:0 192.168.0.20/24 up
    #route add -host 192.168.0.20 dev eth0
    ipvsadm -A -t 192.168.0.101:80 -s rr
    ipvsadm -a -t 192.168.0.101:80 -r 192.168.0.112:80 -g -w 1
    ipvsadm -a -t 192.168.0.101:80 -r 192.168.0.113:80 -g -w 1
  2. 在realserver 上配置

    ip addr add 192.168.0.101/32 dev lo
    ip route add 192.168.0.101 dev lo
    #ifconfig lo:0 192.168.0.20/32 up
    #route add -host 192.168.0.20 dev lo
    echo "1" >/proc/sys/net/ipv4/conf/lo/arp_ignore
    echo "2" >/proc/sys/net/ipv4/conf/lo/arp_announce
    echo "1" >/proc/sys/net/ipv4/conf/all/arp_ignore
    echo "2" >/proc/sys/net/ipv4/conf/all/arp_announce

DR 模式脚本
realserver健康检查和自动剔除加载 脚本

#!/bin/bash
#introduction:
#creat by wangendao(1209233066@qq.com) at 2019/03/01
# bash -n $0 验证脚本语法
# bash -x $0 显示执行过程
#basename $0
#basedir $0
rs=(
10.4.7.11
10.4.7.12
)
rs_port=80
vip=10.4.7.100
vip_port=80
# source common function
[ -f /etc/init.d/function ] && . /etc/init.d/function
add(){
ipvsadm -a -t ${vip}:${vip_port} -r ${i}:${rs_port} -g -w 1 &>/dev/null
}
remove(){
ipvsadm -d -t ${vip}:${vip_port} -r ${i}:${rs_port} -g -w 1 &>/dev/null
}
check(){
for i in "${rs[@]}"
do
http_code=`curl -o /dev/null -s -w "%{http_code}" ${i}`
count=`ipvsadm -Ln|grep ${i}`
count=${count:=2}
if [ "${http_code}" == "200" ]&&[ "${count}" -eq 2 ];then
add
action ${i} add to ${vip}:${vip_port}'s server
fi
if [ "${http_code}" != "200" ]&&[ "${count}" -eq 1 ];then
remove
action ${i} remove to ${vip}:${vip_port}'s server
fi
done
}
while 1
do
check
sleep 1
done

实现vip的漂移

#!/bin/bash
dip=10.4.7.20
vip=10.4.7.100
vip_port=80
source /etc/init.d/functions
add(){
ifconfig eth0:0 ${vip}/24 up
route add -host ${vip} dev eth0
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
}
remove(){
ifconfig eth0:0 down
route del -host ${vip}
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
}
check(){
result_dip=`nmap -sn ${dip}|awk -F '[ |(]' '{if (NR==5){print $7}}'`
result_vip=`nmap -sn ${dip}|awk -F '[ |(]' '{if (NR==5){print $7}}'`
if [ "${result_dip}" -ne 0 ] && [ "${result_vip}" -ne 0 ];then
add && return 100
fi
}
while 1
do
check
if [ "$?" -eq 100 ];then
action "current LVS's dip is `hostname -i`"
fi
done

在工作以上两个脚本都不会使用,因为已经有成熟的工具管理ipvs

piranha web界面管理
keepalived 管理 http://www.linuxvirtualserver.org/docs/ha/keepalived.html

突破lvs 的瓶颈https://my.oschina.net/lxcong/blog/143904

posted @   mingtian是吧  阅读(98)  评论(0编辑  收藏  举报
编辑推荐:
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· 葡萄城 AI 搜索升级:DeepSeek 加持,客户体验更智能
· 什么是nginx的强缓存和协商缓存
· 一文读懂知识蒸馏
点击右上角即可分享
微信分享提示