标签:define lvs 依赖包 www. 发送 bsp clear yum 基于
LVS负载均衡项目,是Linux开源项目中专门用于负载均衡的,主要应用在client访问server时,通过LVS来分配对应的server来响应client的请求。client访问时,都是访问的LVS的VIP虚拟地址,LVS有三种工作模式:
LVS负载均衡器,有多种负载均衡算法,不同的场景使用不同的算法:
我们重点来了解一下DR模式。
下面来做一个关于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:80 -s wrr -p 10 ipvsadm -a -t 192.168.245.200:80 -r 192.168.245.101:80 -g -w 1 ipvsadm -a -t 192.168.245.200:80 -r 192.168.245.102:80 -g -w 1
-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:0 192.168.245.200 netmask 255.255.255.255 up echo "1" > /proc/sys/net/ipv4/conf/lo/arp_ignore echo "1" > /proc/sys/net/ipv4/conf/all/arp_ignore echo "2" > /proc/sys/net/ipv4/conf/lo/arp_announce echo "2" > /proc/sys/net/ipv4/conf/all/arp_announce route add -host 192.168.245.200 dev lo:0
这个写都配置完成之后,就可以通过VIP来访问了。
由于LVS是一种应用,是需要自己配置的,所以重启之后,服务就会消失,需要重新配置加载,下面我们要考虑的是,做一个脚本,能够开机自启动,并且能够监测RS的状态,当RS服务不可用时,需要将该节点从LVS中移除,当节点可用时,再添加回来。
首先我们先做一个自动的LVS配置脚本,具体脚本如下:
[ -f /etc/init.d/functions ] && . /etc/init.d/functions VIP=192.168.245.200 PORT=80 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 1 ] && $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 10 #add real server for ((i=0;i<`echo ${#RIP[*]}`;i++)) do $IPVSADM -a -t $VIP:$PORT -r ${RIP[$i]}:$PORT -g -w 1 done
这是一个自动添加的脚本,如果做的好的话,应该还包含删除等操作,所以我们再优化一下:
1 [ -f /etc/init.d/functions ] && . /etc/init.d/functions 2 3 VIP=192.168.245.200 4 PORT=80 5 NETMASK=255.255.255.0 6 IFCONFIG=/sbin/ifconfig 7 IPVSADM=/sbin/ipvsadm 8 ROUTE=/sbin/route 9 RIP=( 10 192.168.245.101 11 192.168.245.102 12 ) 13 #define the VIP dev 14 secondary_dev=eth0:`echo $VIP|cut -d. -f4` 15 #panduan dev is exist,if exists ,down the dev 16 17 ipvs_start(){ 18 19 [ `$IFCONFIG|grep $secondary_dev|wc -l` -eq 1 ] && $IFCONFIG $secondary_dev down 20 $IFCONFIG $secondary_dev $VIP netmask $NETMASK up 21 22 #clear the ipvs 23 $IPVSADM -C 24 #add virtual server 25 $IPVSADM -A -t $VIP:$PORT -s wrr -p 10 26 #add real server 27 for ((i=0;i<`echo ${#RIP[*]}`;i++)) 28 do 29 $IPVSADM -a -t $VIP:$PORT -r ${RIP[$i]}:$PORT -g -w 1 30 done 31 [ $? -eq 0 ] && action " starting ipvs..." /bin/true || action " starting ipvs..." /bin/false 32 } 33 34 ipvs_stop(){ 35 $IPVSADM -C 36 $IFCONFIG $secondary_dev down 37 [ $? -eq 0 ] && action " stopping ipvs..." /bin/true || action " starting ipvs..." /bin/false 38 } 39 usage(){ 40 echo "$0 usage: {start|stop|restart}" 41 } 42 43 main(){ 44 if [ $# -ne 1 ];then 45 usage 46 else 47 48 case "$1" in 49 start|START) 50 ipvs_start 51 ;; 52 stop|STOP) 53 ipvs_stop 54 ;; 55 restart|RESTART) 56 ipvs_stop 57 ipvs_start 58 ;; 59 *) 60 usage 61 esac 62 fi 63 } 64 main $*
在这个脚本中,我们用到了函数定义和函数的调用,在shell函数定义时要(),在调用的时候不需要(),另外,main函数的调用直接main $*就可以。
在VIP数组中,可以通过${#VIP[*]}来计算属组的长度,然后通过${#VIP[i]}来取值。
以上的代码是在LVS上面的配置,而在RS上面的配置就比较简单了,只需要添加lo0接口地址,然后抑制arp就可以了。简单写一下。
1 [ -f /etc/init.d/functions ] && . /etc/init.d/functions 2 VIP=192.168.245.200 3 PORT=80 4 NETMASK=255.255.255.255 5 IFCONFIG=/sbin/ifconfig 6 secondary_dev=lo:`echo $VIP|cut -d. -f4` 7 8 9 ipvs_start(){ 10 11 [ `$IFCONFIG|grep $secondary_dev|wc -l` -eq 1 ] && route del -host $VIP && $IFCONFIG $secondary_dev down 12 $IFCONFIG $secondary_dev $VIP netmask $NETMASK up 13 echo "1" > /proc/sys/net/ipv4/conf/lo/arp_ignore 14 echo "1" > /proc/sys/net/ipv4/conf/all/arp_ignore 15 echo "2" > /proc/sys/net/ipv4/conf/lo/arp_announce 16 echo "2" > /proc/sys/net/ipv4/conf/all/arp_announce 17 route add -host $VIP dev $secondary_dev 18 [ $? -eq 0 ] && action " starting ipvs..." /bin/true || action " starting ipvs..." /bin/false 19 20 } 21 22 ipvs_stop(){ 23 [ `$IFCONFIG|grep $secondary_dev|wc -l` -eq 1 ] && route del -host $VIP && $IFCONFIG $secondary_dev down 24 echo "0" > /proc/sys/net/ipv4/conf/lo/arp_ignore 25 echo "0" > /proc/sys/net/ipv4/conf/all/arp_ignore 26 echo "0" > /proc/sys/net/ipv4/conf/lo/arp_announce 27 echo "0" > /proc/sys/net/ipv4/conf/all/arp_announce 28 29 [ $? -eq 0 ] && action " stopping ipvs..." /bin/true || action " starting ipvs..." /bin/false 30 } 31 32 usage(){ 33 echo "$0 usage: {start|stop|restart}" 34 } 35 36 main(){ 37 if [ $# -ne 1 ];then 38 usage 39 else 40 41 case "$1" in 42 start|START) 43 ipvs_start 44 ;; 45 stop|STOP) 46 ipvs_stop 47 ;; 48 restart|RESTART) 49 ipvs_stop 50 ipvs_start 51 ;; 52 *) 53 usage 54 esac 55 fi 56 } 57 58 main $*
标签:define lvs 依赖包 www. 发送 bsp clear yum 基于
原文地址:https://www.cnblogs.com/bobo137950263/p/9279503.html