keepalive+LVS

面试必考

keepalived的功能,脚本也能实现

keepalive,主要是有VRRP

基于IP(第3层网络层),port(第4层传输层),应用层(第7层),保证服务正常运行

master会定时给bakcup发广播包,不发了backup就认为master挂了,重新选举,这个只能检查本机,重启本机,要配合LVS才能均衡,

直接yum install -y keepalived ipvsadm

或者源码安装

yum install kernel kernel-devel popt-devel openssl-devel gcc gcc-c++ -y &&

wget http://www.keepalived.org/software/keepalived-1.2.1.tar.gz &&

tar -zxf keepalived-1.2.1.tar.gz && cd keepalived-1.2.1;


./configure --with-kernel-dir=/usr/src/kernels/2.6.32-696.1.1.el6.x86_64/

mkdir /etc/keepalived

\cp /usr/local/sbin/keepalived /usr/sbin/keepalived
\cp /usr/local/etc/rc.d/init.d/keepalived /etc/rc.d/init.d/keepalived
\cp /usr/local/etc/sysconfig/keepalived /etc/sysconfig/keepalived
\cp -r /usr/local/etc/keepalived /etc/keepalived


cd /etc/keepalived

改conf文件如下,配置文件分三部分

第一部分全局配置,主要是改邮箱和路由ID,两个机器要一样

第二部分是配置虚拟IP,

第三部分写检查本机哪些服务

! Configuration File for keepalived  #配置全局变量,全局主要是改邮件,发给谁、从哪里发

global_defs {  

   notification_email {  

      wgkgood@139.com  #配置接收报警邮件

   }  

   notification_email_from wgkgood@139.com  #配置谁发邮件

   smtp_server 127.0.0.1  

   smtp_connect_timeout 30  

   router_id LVS_DEVEL  #路由id

}  

# VIP1  VRRP协议 Config这一段的配置就是生成虚拟路由器

vrrp_instance VI_1 {  

    state BACKUP    #master和backup,比优先级更优先

    interface eth0  #发广播包是用哪个网卡发

    lvs_sync_daemon_inteface eth0  

    virtual_router_id 151  #两台的路由id是一样的

    priority 100  #优先级

    advert_int 5  

    nopreempt  #不抢占,就选优先级高也不抢占,这条加或不加

    authentication {  

        auth_type PASS  

        auth_pass 2222  

    }  

    virtual_ipaddress {  ##虚拟ip地址,特别重要,可以回车配多个

        192.168.1.204

    }  

       notify_master #当是matser执行这个脚本

       notify_backup 

}  

##这里写检查本机什么服务,只能检查本机

virtual_server 192.168.1.204 3306 {  

    delay_loop 6     

    lb_algo wrr     

    lb_kind DR    

    persistence_timeout 60     

    protocol TCP          

    real_server 192.168.1.104 3306 {  

        weight 100         

        notify_down /data/sh/mysql.sh  #当down了就执行这个脚本

       notify_up也可以


        TCP_CHECK {  

        connect_timeout 10  #连接超时时间

        nb_get_retry 3  #重连次数

        delay_before_retry 3  #重连间隔时间

        connect_port 80  #健康检查的端口的端口

        }  

    }  

}


然后重启/etc.init.d/keepalived restart

tail -fn 100 /var/log/message

如果没有IPVS这个模块,modprobe ip_vs加载这个模块

通过ip addr list 可以看到虚拟IP配在了eth0上

        TCP_CHECK {  

        connect_timeout 10  #连接超时时间

        nb_get_retry 3  #重连次数

        delay_before_retry 3  #重连间隔时间

        connect_port 80  #健康检查的端口的端口

        }  

1、上面是基于端口。基于2、应用:

注意:使用了脚本监控Nginx或者MYSQL,不需要虚拟服务器设置块,也就是端口检查块。

vrrp_script chk_nginx {

    script "/data/script/nginx.sh"          #监控服务脚本;

    interval 2                    #检测时间间隔(执行脚步间隔)

    weight 2

}


#实例1 

vrrp_instance VI_1 {  

    state MASTER    #master和backup,比优先级更优先

    interface eth0  #发广播包是用哪个网卡发

    lvs_sync_daemon_inteface eth0  

    virtual_router_id 151  #两台的路由id是一样的

    priority 100  #优先级

    advert_int 5  

    nopreempt  #不抢占,就选优先级高也不抢占,这条加或不加

    authentication {  

        auth_type PASS  

        auth_pass 2222  

    }  

#实例2

vrrp_instance VI_2 {  

    state BACKUP    #master和backup,比优先级更优先

    interface eth0  #发广播包是用哪个网卡发

    lvs_sync_daemon_inteface eth0  

    virtual_router_id 152  #两台的路由id是一样的

    priority 100  #优先级

    advert_int 5  

    nopreempt  #不抢占,就选优先级高也不抢占,这条加或不加

    authentication {  

        auth_type PASS  

        auth_pass 2222  

    }  

track_script {                          #以脚本为监控chk_nginx

        chk_nginx

    }

    virtual_ipaddress {             #设置vip

        192.168.111.188

    }

}



#其中/data/script/nginx.sh里的内容:

#!/bin/bash

NUM=`ps -C nginx --no-header |wc -l`

if [ $NUM -eq 0 ];then

/etc/init.d/keepalived stop

sleep 30

/usr/local/nginx/sbin/nginx

/etc/init.d/keepalived start

fi

###

3、基于URL

把TCP_CHECK那部分改成

              HTTP_GET{

              url{                  #检查url,可以指定多个

              path /

              digest ATM       #检查后的摘要信息

              status_code 200       #检查的返回状态码,

                 }


从上

把state改成backup,priority改成90,检查的服务器改成本机


然后就可以用LAP连虚拟服务器的mysql了


keepalived的核心:

当端口停了,执行脚本,down.sh

然后VIP才会切到从上

脚本内容:

/etc/init,d/keepalived stop

sleep 5

/etc/init,d/keepalived start

监控的服务 restart

从上也要有这个脚本

这个脚本要给o+x权限

互为主主

两个实例两个虚拟服务器,各一个VIP,互为主备,路由id不能一样

Heartbeat

两台机器必须要用网线连起来

LVS

基于IP实现负载均衡是目前负载调度器中效率最高的

有NAT,TUN,DR模式

有算法:RR(round-robin)、LC(least_connection)、W(weight)RR、WLC模式等(RR为轮询模式,LC为最少连接模式)

NAT方式:VIP所在主机可以为公网IP,进出都要做个地址转换,效率比较低。用户请求LVS到达director(主管),director将请求的报文的目标地址和端口改成后端的realserver地址和端口,请求到达realserver,realserver将数据返给director,director再把数据返给用户(两次请求都要经过director),访问量大的话director会成为瓶颈。后端不能超过20台。  

DR原理(将VIP配在后端realserver上):IP为内网,用户请求LVS到达director,director将请求目标的MAC地址改成realserver的MAC地址,目标IP还是VIP,源IP还是用户IP,然后director将报文发送给realserver,realserver发现目标IP和MAC都是自己。如果用户跟realserver不在一个网段,则通过网关返回给用户,如果在同一网段,将请求直接返给用户。 效率最高,互联网企业。这个要求LVS和后端服务器在一个网络里,不然没法实现VIP配在后端realserver上。

TUN原理:跟DR类似,也是改变封装MAC地址,多了一层隧道加密,比DR效率略低,比NAT高。


DR模式,后端带几百台nginx

cd /usr/src/

wget http://www.linuxvirtualserver.org/software/kernel-2.6/ipvsadm-1.24.tar.gz

版本不同需要的这个软件版本可能也不同

yum install kernel kernel-devel gcc gcc-c++ -y

ln -s /usr/src/kernels/2.6* /usr/src/linux

tar xzvf ipvsadm-1.24.tar.gz &&cd ipvsadm-1.24 && make && make install

ipvsadm看安装成功没

参数说明:

-A 增加一台虚拟服务器地址。-D删除

-t  虚拟服务器提供的是tcp服务。

-s  使用的调度算法。

-a  在虚拟服务器中增加一台后端真实服务器。

-r  指定真实服务器地址。

-m 设置当前转发方式为NAT模式;-g为直接路由模式;-i  模式为隧道模式。

-w 后端真实服务器的权重。

LVS安装完毕之后,需要进行配置,配置的步骤有两步,第一步为定义端口服务,第二步为添加realserver后端服务。

ipvsadm -A -t 192.168.1.200:80 -s rr  #添加VIP

 

ipvsadm -a -t 192.168.1.200:80 -r 192.168.1.103 -g -w 2


在后端realserver上,在回环地址上配上VIP

VIP=192.168.1.201

ifconfig lo:0 $VIP netmask 255.255.255.255 broadcast $VIP

/sbin/route add -host $VIP dev lo:0

这样绑重启了就失效了

ipvsadm-save >/tmp/lvs.txt保存LVS配置

ipvsadm-restore </tmp/lvs.txt回复LVS配置

route -n

看网关

然后抑制ARP,不抑制的话所有赔了VIP的都可以响应了

客户端抑制ARP脚本,企业里客户端可能不止一个VIP,就把lo:0换成1 2 3 4

vim auto_realserver.sh

#!/bin/sh

#LVS Client Server

VIP=192.168.2.200

case  $1  in                                                                                                                                                                                                                                                    

start)                                                                                                                                                                                                                                            

    ifconfig lo:0 $VIP netmask 255.255.255.255 broadcast $VIP

    /sbin/route add -host $VIP dev lo:0

    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 >/dev/null 2>&1

    echo "RealServer Start OK"

    exit 0

;;                                                                                                                                                                                                                                         

stop)

    ifconfig lo:0 down

    route del $VIP >/dev/null 2>&1

    echo "0" >/proc/sys/net/ipv4/conf/lo/arp_ignore

    echo "0" >/proc/sys/net/ipv4/conf/lo/arp_announce

    echo "0" >/proc/sys/net/ipv4/conf/all/arp_ignore

    echo "0" >/proc/sys/net/ipv4/conf/all/arp_announce

    echo "RealServer Stoped OK"

    exit 1

;;

*)

    echo "Usage: $0 {start|stop}"

;;

esac

###

压测工具http-tools

ab -c 5000 -n 10000 http://192.168.1.200/

watch ipvsadm -L -n 可以实时看压测

keepalived+LVS或者脚本检查+LVS

服务端配置keepalived即可,两个LVS服务器。realserver客户端执行脚本
安装keepalived

写入配置文件

! Configuration File for keepalived

 

global_defs {

   notification_email {

      wgkgood@163.com

   }

   notification_email_from wgkgood@163.com

   smtp_server 127.0.0.1

   smtp_connect_timeout 30

   router_id LVS_DEVEL

}

 

# VIP1

vrrp_instance VI_1 {

    state MASTER   

    interface eth0

    lvs_sync_daemon_inteface eth0

    virtual_router_id 51

    priority 100

    advert_int 5

    nopreempt

    authentication {

        auth_type PASS

        auth_pass 1111

    }

    virtual_ipaddress {

        192.168.1.200   

    }

}

virtual_server 192.168.1.200 80 {

    delay_loop 6    

    lb_algo wrr    

    lb_kind DR   #这里配转发方式

#    persistence_timeout 60    #这里配置会话保持时间

    protocol TCP         

 

    real_server 192.168.1.102 80 {

        weight 100        

        TCP_CHECK {

        connect_timeout 10

        nb_get_retry 3

        delay_before_retry 3

        connect_port 80

        }

    }

    real_server 192.168.1.103 80 {

        weight 100

        TCP_CHECK {

        connect_timeout 10

        nb_get_retry 3

        delay_before_retry 3

        connect_port 80

        

        }

    }

}

################

realserver端

tcpdump -nn port 80  nn是显示网络地址

tcpdump -nn port 22 and host 192.168.0.116看本机有哪些连22端口的

LVS排错

ping网站域名,看能否解析到IP

登录LVS服务器,ipvsadm -Ln查看信息,tail -fn /var/log/messages看报错

看zabbix监控服务器有没有报警

看keepalived.conf配置文件有没有错误

看客户端的auto——realserver.sh脚本是否启动

看realserver有没有挂(nginx)


如果后端nginx能接收到LVS的请求,但是不返回,说明nginx端VIP没有起来

LVS、haproxy与nginx均衡区别

LVS是4层网络层,haproxy是又有7层又有4层,nginx是7层应用层

LVS优点

  1. LVS抗负载能力强、是工作在网络4层之上仅作分发之用,没有流量的产生,这个特点也决定了它在负载均衡软件里的性能最强的,也保证了均衡器I/O的性能不会受到大流量的影响

  2. LVS是专门的负载均衡软件,对任何应用都可以做负载均衡

  3. 工作稳定,因为其本身抗负载能力很强,自身有完整的双机热备方案,目前用的比较多的是lvs+keepalived,比较大型的用的多的是lvs+heartbeat

nginx的优点:

1:Nginx的高并发,同时能承载上万个并发连接;

2:nginx有充足的第三方功能模块的支持,主要通过upstream模块进行负载均衡;

3:nginx对网络的依赖较小,理论上只要Ping得通,网页访问正常,nginx就能连得通;

4:工作在网络的7层之上,可以针对http应用做一些分流的策略,它的正则规则比haproxy更为强大和灵活,这也是它目前广泛流行的主要原因之一,nginx单凭这点可利用的场合就远多于lvs了。

nginx的缺点:

1:将Nginx当做反向代理时,负载均衡功能不是很好,对后端服务器的健康检查功能较弱;

2:nginx仅能支持http、https和email协议,这样就在适用范围上面小些,这个是它的缺点;

3:nginx只支持通过端口来检测,不支持通过url来检测。



keepalived+mysql

msyql主down机了,可以手动换成从的IP,也可以自动切换,用keepalived,heartbeat