LVS负载均衡项目,是Linux开源项目中专门用于负载均衡的,主要应用在client访问server时,通过LVS来分配对应的server来响应client的请求。client访问时,都是访问的LVS的VIP虚拟地址,LVS有三种工作模式:

  1. NAT模式,client访问LVS时,LVS会将client的数据包,对源地址进行NAT转换,同时对目标地址,根据一定的负载均衡算法,改成内网的一个server地址,然后从内网转发出去,内网server收到数据包之后,会进行响应,源地址是本机的地址,目标地址是LVS负载均衡设备转换到内网的地址,然后将数据包返回给LVS负载均衡器,负载均衡器在收到数据包之后,再进行对应的NAT转换,将数据包返回给client。在NAT模式中,数据包的来和回,都必须经过LVS负载均衡器,LVS会成为访问链路上的性能瓶颈;优点是只需要配置LVS负载均衡器就好了,在RS上不需要进行相关配置
  2. Tunnel模式,LVS负载均衡器和RS real server之间会建立专门的数据tunnel,client访问LVS,LVS会将数据包通过tunnel传递到某一个RS上,RS响应之后,会通过tunnel返回给LVS,然后返回给client,在这种模式中,由于数据链路上存在tunnel,需要一定的数据开销,同时,需要在RS和LVS负载均衡器上都进行配置。
  3. DR模式,direct route,直接路由模式,LVS的内网口和RS的业务口在同一个二层网络中,client访问LVS,LVS将数据包的目标MAC地址修改为某一个RS的MAC地址,然后通过二层网络,转发给RS,RS处理完之后,通过自身的路由表,转发,返回给client,这种情况下,需要在RS和LVS上同时配置相同的VIP,同时抑制RS上的VIP,使得RS能够处理client请求的数据包,同时,RS要有和LVS相同的外网环境,因为在数据包返回时,是RS直接将数据包返回给client,不会经过LVS负载均衡器,同时,LVS的内网口必须和RS业务口在同一个二层网络中。DR模式是通过修改数据包的目标MAC,来实现转发的。

  LVS负载均衡器,有多种负载均衡算法,不同的场景使用不同的算法:

  1. RR:round robin,轮询算法,所有的RS平均分配
  2. WRR,weight RR,基于权重的RR,不同的RS,分配不同的请求
  3. DH:destination hash,基于目标地址的静态hash,这个我是没有懂。不理解是啥意思
  4. SH:source hash,基于源地址的hash
  5. WLC:weight least connection,加权最小链接数,取weight/connection最小的RS,进行分配
  6. LC:least connection,最小链接数,RS的服务连接最小,越优先分配
  7. SED:shortest expected delay,最小期望延时

  我们重点来了解一下DR模式。

  1. client访问LVS,将数据包发送给LVS,源IP为client的IP,目标IP为LVS的VIP
  2. LVS收到数据请求后,根据特定的负载均衡算法,将数据包的目标MAC地址修改为某一个RS的MAC地址,然后通过内网转发出去,源IP还是client的IP,目标IP还是VIP,但是目标MAC地址是内网RS的MAC地址
  3. 由于LVS和RS在同一个二层网络中,直接通过二层MAC寻址转发,到对应的RS上
  4. RS收到数据包之后,解封装,MAC是自己的,VIP需要在本地的环回口loopback接口上配置,使得RS能有这个VIP地址,能够处理这个数据包,RS处理了数据包之后,将数据包返回给client。
  5. client收到的数据包,源地址是VIP,目标地址是自己的地址。这个可以通过抓包来证实。

  下面来做一个关于nginx的LVS,首先说一下我们的环境,两台RS,192.168.245.101和192.168.245.102,LB地址为192.168.245.100,VIP为192.168.245.200,两台RS上部署了最简单的nginx,在index页面上做了一段内容。

echo `ifconfig eth0|grep "inet addr"|awk '{print $1,$2}'` >> index.html

  分别访问一下101和102,看看结果

  首先保证两台RS是可以正常提供服务的,在这里,最好是将nginx 的配置文件中的listen,不要指定地址,或者指定两个地址,RS和vip,写两条listen ,如果有多个地址,就写多个listen,同一个站点,对应多个IP地址和端口。

  下面就开始安装部署ipvsadm了,首先要查看系统的内核版本,uname -r,然后对应下载ipvsadm的安装包,下载地址为:http://www.linuxvirtualserver.org/software/ipvs.html

  在内核版本上,创建一个软连接,ln -s /usr/src/kernels/2.6.32-696.el6.x86_64 /usr/src/linux

  在源码编译安装之前,需要先解决依赖安装问题:yum install popt* libnl* -y,不安装这些依赖包,在安装ipvsadm时会报错。

  解压,编译安装,tar,make && make install,通过查看readme,可以看到安装之后的软件布局。

  将ipvs加载进内核中,通过lsmod|grep ip_vs,查看是否加载进内核,如果没有,通过modprobe ip_vs,加载进内核中。

  

  这个时候,就开始配置VS和RS了,具体代码如下:

ipvsadm -A -t 192.168.245.200: -s wrr -p
ipvsadm -a -t 192.168.245.200: -r 192.168.245.101: -g -w
ipvsadm -a -t 192.168.245.200: -r 192.168.245.102: -g -w

  -A是添加VS,-s是指定调度算法,schedule调度,wrr是一种算法,-p是保持会话,-t表示TCP端口,如果是-u则是udp端口

  -a是添加RS,添加RS是要在某一个VS上添加,-g表示direct route模式,-w是在wrr算法中的权重值

  可以通过-help查看命令帮助信息

  添加完成之后,通过ipvsadmi -L -n查看,--stats查看整个的状态。

  

  添加完成之后,需要在每个RS上创建lo0接口,配置上 VIP地址。在RS上增加lo接口,配置VIP,做ARP抑制,这个时候访问VIP是无法访问的,配置的是子接口,但是抑制arp是在主接口上,默认值都是0。

  

ifconfig lo: 192.168.245.200 netmask 255.255.255.255 up
echo "" > /proc/sys/net/ipv4/conf/lo/arp_ignore
echo "" > /proc/sys/net/ipv4/conf/all/arp_ignore
echo "" > /proc/sys/net/ipv4/conf/lo/arp_announce
echo "" > /proc/sys/net/ipv4/conf/all/arp_announce route add -host 192.168.245.200 dev lo:

  这个写都配置完成之后,就可以通过VIP来访问了。

  

  

  由于LVS是一种应用,是需要自己配置的,所以重启之后,服务就会消失,需要重新配置加载,下面我们要考虑的是,做一个脚本,能够开机自启动,并且能够监测RS的状态,当RS服务不可用时,需要将该节点从LVS中移除,当节点可用时,再添加回来。

  首先我们先做一个自动的LVS配置脚本,具体脚本如下:

[ -f /etc/init.d/functions  ] && . /etc/init.d/functions

VIP=192.168.245.200
PORT=
NETMASK=255.255.255.0
IFCONFIG=/sbin/ifconfig
IPVSADM=/sbin/ipvsadm
ROUTE=/sbin/route
RIP=(
192.168.245.101
192.168.245.102
)
#define the VIP dev
secondary_dev=eth0:`echo $VIP|cut -d. -f4`
#panduan dev is exist,if exists ,down the dev [ `$IFCONFIG|grep $secondary_dev|wc -l` -eq ] && $IFCONFIG $secondary_dev down
$IFCONFIG $secondary_dev $VIP netmask $NETMASK up #clear the ipvs
$IPVSADM -C
#add virtual server
$IPVSADM -A -t $VIP:$PORT -s wrr -p
#add real server
for ((i=;i<`echo ${#RIP[*]}`;i++))
do
$IPVSADM -a -t $VIP:$PORT -r ${RIP[$i]}:$PORT -g -w
done

  这是一个自动添加的脚本,如果做的好的话,应该还包含删除等操作,所以我们再优化一下:

 

 [ -f /etc/init.d/functions  ] && . /etc/init.d/functions

 VIP=192.168.245.200
PORT=
NETMASK=255.255.255.0
IFCONFIG=/sbin/ifconfig
IPVSADM=/sbin/ipvsadm
ROUTE=/sbin/route
RIP=(
192.168.245.101
192.168.245.102
)
#define the VIP dev
secondary_dev=eth0:`echo $VIP|cut -d. -f4`
#panduan dev is exist,if exists ,down the dev ipvs_start(){ [ `$IFCONFIG|grep $secondary_dev|wc -l` -eq ] && $IFCONFIG $secondary_dev down
$IFCONFIG $secondary_dev $VIP netmask $NETMASK up #clear the ipvs
$IPVSADM -C
#add virtual server
$IPVSADM -A -t $VIP:$PORT -s wrr -p
#add real server
for ((i=;i<`echo ${#RIP[*]}`;i++))
do
$IPVSADM -a -t $VIP:$PORT -r ${RIP[$i]}:$PORT -g -w
done
[ $? -eq ] && action " starting ipvs..." /bin/true || action " starting ipvs..." /bin/false
} ipvs_stop(){
$IPVSADM -C
$IFCONFIG $secondary_dev down
[ $? -eq ] && action " stopping ipvs..." /bin/true || action " starting ipvs..." /bin/false
}
usage(){
echo "$0 usage: {start|stop|restart}"
} main(){
if [ $# -ne ];then
usage
else case "$1" in
start|START)
ipvs_start
;;
stop|STOP)
ipvs_stop
;;
restart|RESTART)
ipvs_stop
ipvs_start
;;
*)
usage
esac
fi
}
main $*

  在这个脚本中,我们用到了函数定义和函数的调用,在shell函数定义时要(),在调用的时候不需要(),另外,main函数的调用直接main $*就可以。

  在VIP数组中,可以通过${#VIP[*]}来计算属组的长度,然后通过${#VIP[i]}来取值。

  以上的代码是在LVS上面的配置,而在RS上面的配置就比较简单了,只需要添加lo0接口地址,然后抑制arp就可以了。简单写一下。

  

 [ -f /etc/init.d/functions  ] && . /etc/init.d/functions
VIP=192.168.245.200
PORT=
NETMASK=255.255.255.255
IFCONFIG=/sbin/ifconfig
secondary_dev=lo:`echo $VIP|cut -d. -f4` ipvs_start(){ [ `$IFCONFIG|grep $secondary_dev|wc -l` -eq ] && route del -host $VIP && $IFCONFIG $secondary_dev down
$IFCONFIG $secondary_dev $VIP netmask $NETMASK up
echo "" > /proc/sys/net/ipv4/conf/lo/arp_ignore
echo "" > /proc/sys/net/ipv4/conf/all/arp_ignore
echo "" > /proc/sys/net/ipv4/conf/lo/arp_announce
echo "" > /proc/sys/net/ipv4/conf/all/arp_announce
route add -host $VIP dev $secondary_dev
[ $? -eq ] && action " starting ipvs..." /bin/true || action " starting ipvs..." /bin/false } ipvs_stop(){
[ `$IFCONFIG|grep $secondary_dev|wc -l` -eq ] && route del -host $VIP && $IFCONFIG $secondary_dev down
echo "" > /proc/sys/net/ipv4/conf/lo/arp_ignore
echo "" > /proc/sys/net/ipv4/conf/all/arp_ignore
echo "" > /proc/sys/net/ipv4/conf/lo/arp_announce
echo "" > /proc/sys/net/ipv4/conf/all/arp_announce [ $? -eq ] && action " stopping ipvs..." /bin/true || action " starting ipvs..." /bin/false
} usage(){
echo "$0 usage: {start|stop|restart}"
} main(){
if [ $# -ne ];then
usage
else case "$1" in
start|START)
ipvs_start
;;
stop|STOP)
ipvs_stop
;;
restart|RESTART)
ipvs_stop
ipvs_start
;;
*)
usage
esac
fi
} main $*

  

Linux之LVS 20180708的更多相关文章

  1. linux keepalived+LVS 实现mysql 从库负载均衡

    前情提要: 参考链接: http://www.osyunwei.com/archives/7464.html ps:以上为本次操作的主要参考资料,非常感谢此文作者的贡献,我的随笔的主要目的是 说明在使 ...

  2. linux之LVS简介(转自南非的蚂蚁)

    一. LVS简介LVS是Linux Virtual Server的简称,也就是Linux虚拟服务器, 是一个由章文嵩博士发起的自由软件项目,它的官方站点是www.linuxvirtualserver. ...

  3. Linux keepalived+lvs实现高可用负载均衡

    LVS的具有强大的负载均衡功能,但是它缺少对负载层节点(DS)的健康状态检测功能,也不能对后端服务(RS)进行健康状态检测:keepalived是专门用来监控高可用集群架构的中各服务的节点状态,如果某 ...

  4. Linux系统LVS搭建笔记

    因为客户是国有企业,且一次性购买了14台服务器(16核),14台中暂且先用8台,其中LVS使用5台,NFS一台主要为了共享WEB系统(多台电脑的1.5T的硬盘容量浪费了).MySQL两台,Memcac ...

  5. Linux学习-LVS跨网段DR模型和FWM多服务绑定

    一.实验环境 系统:CentOS7.6 主机:5台 (虚拟机) 客户端1台:172.16.236.134/24 (NAT网卡),网关指向 172.16.236.185/24(路由服务器) 路由服务器1 ...

  6. Linux ospf+lvs

    待更新... https://my.oschina.net/lxcong/blog/143904?p=2&temp=1469345328746

  7. Linux就这个范儿 第15章 七种武器 linux 同步IO: sync、fsync与fdatasync Linux中的内存大页面huge page/large page David Cutler Linux读写内存数据的三种方式

    Linux就这个范儿 第15章 七种武器  linux 同步IO: sync.fsync与fdatasync   Linux中的内存大页面huge page/large page  David Cut ...

  8. mysql高可用架构方案之二(keepalived+lvs+读写分离+负载均衡)

    mysql主从复制与lvs+keepalived实现负载高可用 文件夹 1.前言    4 2.原理    4 2.1.概要介绍    4 2.2.工作原理    4 2.3.实际作用    4 3方 ...

  9. 高负载集群实战之lvs负载均衡-技术流ken

    lvs简介 LVS的英文全称是Linux Virtual Server,即Linux虚拟服务器. 特点 跨平台:window,linux 作用 实现负载均衡 核心组件 ip_vs:linux的内核功能 ...

随机推荐

  1. Python——Message控件

    一.messagebox的方法: showerror   : 错误提示对话框 showinfo  :  信息提示对话框 showwarning   : 警告对话框 askokcansel   :确认或 ...

  2. Vue生产环境部署

    前面的话 开发时,Vue 会提供很多警告来帮助解决常见的错误与陷阱.生产时,这些警告语句却没有用,反而会增加载荷量.再次,有些警告检查有小的运行时开销,生产环境模式下是可以避免的.本文将详细介绍Vue ...

  3. cuda培训素材

    http://www.geforce.cn/hardware/desktop-gpus/geforce-gtx-480/architecture http://cache.baiducontent.c ...

  4. python基础数据类型--dict 字典

    字典 字典是python中唯一的映射类型,采用键值对(key-value)的形式存储数据.python对key进行哈希函数运算,根据计算的结果决定value的存储地址,所以字典是无序存储的,且key必 ...

  5. Ubuntu 16.04配置Java Web开发环境

    说明:在Linux下无论是开发还是服务器配置,我个人建议都安装二进制包版本的,优点:配置清晰,容易发现问题,性能调优方便等.缺点:配置太复杂.而其余平台的建议是一键安装版本,毕竟都是用于测试的,不会实 ...

  6. python主流测试框架的简介

    1.python自动化的一些测试框架 1).unitest(也称为PyUnit)  地址:https://docs.python.org/2/library/unittest.html 2).Nose ...

  7. 搭建gogs常见问题

    1.无法连接ssh,显示connection refuse. 原因是“custom/conf/app.ini”没有开启ssh功能,改为以下配置就行了  START_SSH_SERVER = true ...

  8. flask项目第一次如何运行创建数据库

  9. MT【273】2014新课标压轴题之$\ln2$的估计

    已知函数$f(x)=e^x-e^{-x}-2x$(1)讨论$f(x)$的单调性;(2)设$g(x)=f(2x)-4bf(x),$当$x>0$时,$g(x)>0,$求$b$的最大值;(3)已 ...

  10. Dynamic CRM 2015学习笔记(2)更改系统显示语言

    默认装的是英文的系统,想换成中文的.下面列出操作步骤: 1. 下载并安装语言包 http://www.microsoft.com/en-US/download/details.aspx?id=4501 ...