最近折腾的LVS的问题,做个记录!正常是三台以上服务器可以,一台做负载,另外两台做真是服务器,但我手上的环境实际上只有两台,那就意味着其中一台纪要做负载又要做真实服务器。
首先要检查Linux内核是否支持LVS:
modprobe -l | grep ipvs
如果输出类似于如下内容,那么就是OK的:
kernel/net/netfilter/ipvs/ip_vs.ko
kernel/net/netfilter/ipvs/ip_vs_rr.ko
kernel/net/netfilter/ipvs/ip_vs_wrr.ko
kernel/net/netfilter/ipvs/ip_vs_lc.ko
kernel/net/netfilter/ipvs/ip_vs_wlc.ko
kernel/net/netfilter/ipvs/ip_vs_lblc.ko
kernel/net/netfilter/ipvs/ip_vs_lblcr.ko
kernel/net/netfilter/ipvs/ip_vs_dh.ko
接下来安装ipvsadm管理工具:
sudo apt-get install ipvsadm
安装成功后执行 ipvsadm 命令,如果看到以下字样就说明安装成功:
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
接下来也别一步一不做了,直接copy我这现成的脚本,改里面的IP,直接用就OK了,简单粗暴!
操作步骤及脚本
在LVS服务器上创建一个新的脚本文件 lv-dr.sh,把下面的内容扔进去:
#!/bin/bash
######################
# data 20150727 #
# website Gongzi.org #
######################
vip=10.46.239.56
rs1=10.46.239.50
rs2=10.46.239.51
#set vip address and add route
/sbin/ifconfig bond0:0 $vip broadcast $vip netmask 255.255.255.255 up
/sbin/route add -host $vip dev bond0:0
route -n
# update /etc/sysctl.conf
echo "1" >/proc/sys/net/ipv4/ip_forward
echo "1" >/proc/sys/net/ipv4/conf/all/send_redirects
echo "1" >/proc/sys/net/ipv4/conf/default/send_redirects
echo "1" >/proc/sys/net/ipv4/conf/eth0/send_redirects
echo "1" >/proc/sys/net/ipv4/conf/bond0/send_redirects
sysctl -p
#clear ipvs tables
ipvsadm -C
#set ipvs
ipvsadm -A -t $vip:8080 -s wrr -p $((3600 * 48))
ipvsadm -a -t $vip:8080 -r $rs1:8080 -g -w 1
ipvsadm -a -t $vip:8080 -r $rs2:8080 -g -w 1
#run lvs
/sbin/ipvsadm
然后修改里面的信息:
Tips!
VIP:你的虚拟IP
rs12:你的真是服务器IP
以及后面的8080 都是你要负载的端口
另外,WEB项目需要设置会话保持,不然会出问题,上面代码中的:-p $((3600 * 48))便是。
然后到真是服务器中创建一个lvs-rs.sh 的脚本,扔进去以下内容:
#!/bin/bash
######################
# data 20150727 #
# website Gongzi.org #
######################
vip=10.46.239.56
ifconfig lo:0 $vip netmask 255.255.255.255 broadcast $vip up
route add -host $vip dev lo:0
#echo "0" >/proc/sys/net/ipv4/ip_forward #这一步是关闭真实服务器的转发功能
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
sysctl -p
注意:此脚本中的网关要和虚ip一样,掩码不能同于主网卡的(即eth0或1的)
接下来就可以测试了。
一些备注说明及常用参数
以下是ipvs的一些常用命令及参数说明,网上找的,我摘录了几条常用的,供参考:
-A --add-service 在内核的虚拟服务器表中添加一条新的虚拟服务器记录。也就是增加一台新的虚拟服务器。
-E --edit-service 编辑内核虚拟服务器表中的一条虚拟服务器记录。
-D --delete-service 删除内核虚拟服务器表中的一条虚拟服务器记录。
-C --clear 清除内核虚拟服务器表中的所有记录。
-R --restore 恢复虚拟服务器规则
-S --save 保存虚拟服务器规则,输出为-R 选项可读的格式
-a --add-server 在内核虚拟服务器表的一条记录里添加一条新的真实服务器记录。也就是在一个虚拟服务器中增加一台新的真实服务器
-e --edit-server 编辑一条虚拟服务器记录中的某条真实服务器记录
-d --delete-server 删除一条虚拟服务器记录中的某条真实服务器记录
-L|-l --list 显示内核虚拟服务器表
-Z --zero 虚拟服务表计数器清零(清空当前的连接数量等)
-t --tcp-service service-address 说明虚拟服务器提供的是tcp 的服务[vip:port] or [real-server-ip:port]
-u --udp-service service-address 说明虚拟服务器提供的是udp 的服务[vip:port] or [real-server-ip:port]
-r --real-server server-address 真实的服务器[Real-Server:port]
-g --gatewaying 指定LVS 的工作模式为直接路由模式(也是LVS 默认的模式)
-i --ipip 指定LVS 的工作模式为隧道模式
-m --masquerading 指定LVS 的工作模式为NAT 模式
-w --weight weight 真实服务器的权值
还有其他几种模式,NAT之类的,这里直说DR的,也是性能最好的一种。