MENU

使用lvs+keepalived实现负载均衡及高可用

2016 年 07 月 22 日 • 应用服务器

前几天已经写过一个实现web高可用实现方法了,也就是nginx配合keepalived一起使用。我记得我第一家公司最前端所用的就是lvs,lvs代理的nginx,nginx代理tomcat,但是刚开始我不是很明白,为什么不用lvs直接代理tomcat,而是中间放了一个nginx,直到渐渐的熟悉nginx,发现很多事情是lvs做不到的,只能通过nginx来实现,譬如说添加jvm-route插件解决session问题,动静分离,以及防盗链,等等,所以我现在用nginx的时候比较多,用着顺手,当然lvs也得会,要是哪天碰上了,不会玩就尴尬了,下面的是配置是使用的DR模式。

官网原理说明:基于直接路由来实现,当用户请求到达director(lvs调度器)之后,director将请求报文的目标地址(VIP)改成选定的realserver地址,还要改写请求报文的mac地址,将请求发送到指定mac的realserver,而realserver将响应直接返回给客户端,不经director,是三种方式中调度性能最好的,也是生产环境中使用最多的。

安装阶段

1.两台服务器安装软件
[root@master ~]# yum -y install ipvsadm keepalived

ipvsadm,也就是lvs,使用lvs做负载均衡,使用keepalived做高可用,他俩加一起,也就是实现了负载均衡及高可用集群,配置的时候修改keepalived的配置文件就能搞定,相对nginx配置来说这个比较简单些。

2.检查是否安装成功
[root@master ~]# rpm -qa |egrep "ipvsadm|keep" --color=auto
keepalived-1.2.13-5.el6_6.x86_64
ipvsadm-1.26-4.el6.x86_64
[root@master ~]# /etc/init.d/keepalived start
Starting keepalived:                                       [  OK  ]
[root@master ~]# ipvsadm -L -n
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn

master配置阶段

1.修改master的keepalived.conf文件
[root@master ~]# vim /etc/keepalived/keepalived.conf
! Configuration File for keepalived

global_defs {
   notification_email {
   rj-bai@qq.com                  #邮箱地址
   }
   notification_email_from Alexandre.Cassen@firewall.loc
   smtp_server 127.0.0.1
   smtp_connect_timeout 30
   router_id 1b01                    #id为1b01 不同的keepalived 次id要唯一
}

vrrp_instance VI_1 {                 #实例名字为VI_1 相同的实例的备用节点要和这个相同
    state MASTER                     #主节点为MASTER,备节点需要为BACKUP  
    interface eth0                   #通信接口为eth0,此参数主备需要一致
    virtual_router_id 55             #实例ID为55,keepalived.conf里唯一
    priority 150                     #优先级150 备节点优先级必须比主节点低
    advert_int 1                     #通信检查为1秒 
    authentication {
        auth_type PASS               #pass为认证类型 此参数主备节点设置相同
        auth_pass 1111               #密码是1111 主备节点设置相同
    }
    virtual_ipaddress {
    10.10.79.213 dev eth0 label eth0:1    #虚拟VIP主备相同,可以添加多个
    }
}

    virtual_server 10.10.79.213 80 {                  #集群地址,端口
    delay_loop 3                                      #健康检查时间间隔
    lb_algo rr                                        #负载均衡调度算法
    lb_kind DR                                        #使用DR模式   
    persistence_timeout 20                            #回话保持时间
    protocol TCP                                      #使用TCP协议

    real_server 10.10.79.128 80 {                     #节点1
    weight 3                                          #权重3
    TCP_CHECK {                                       #使用tcp检查
    connect_timeout 3                                 #超时3次,则失败                  
    nb_get_retry 3                                    #重试次数
    delay_before_retry 3                              #重试时间间隔
    connect_port 80                                   #检测端口为80
    }
}
    real_server 10.10.79.129 80 {                     #节点2
    weight 3
    TCP_CHECK {
    connect_timeout 3
    nb_get_retry 3
    delay_before_retry 3
    connect_port 80
    }
}

slave配置阶段

1.直接复制master节点的配置文件,需要求改两处,其他的全部一样。
    state BACKUP  #将MASTER改为backup
    priority 100  #优先级小于MASTER节点
2.重启keepalived,查看结果。
[root@master ~]# /etc/init.d/keepalived restart
Stopping keepalived:                                       [  OK  ]
Starting keepalived:                                       [  OK  ]
[root@master ~]# ipvsadm -Ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
TCP  10.10.79.213:80 rr persistent 20
  -> 10.10.79.130:80              Route   3      0          0         
  -> 10.10.79.131:80              Route   3      0          0

后端节点配置

但是你现在访问vip,访问不到,因为节点你没有绑定VIP,一个脚本来实现,把变量SNS_VIP的变量改成自己的VIP,保存为文件,sh 文件名 start启动脚本即可。

#!/bin/bash
    
SNS_VIP=10.10.79.213
    
/etc/rc.d/init.d/functions
    
case "$1" in
start)
ifconfig lo:0 $SNS_VIP netmask 255.255.255.255 broadcast $SNS_VIP
/sbin/route add -host $SNS_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"  
;;
stop)
ifconfig lo:0 down
route del $SNS_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"
;;
*)
echo "Usage: $0 {start|stop}"
exit 1
esac
    
exit 0

查看结果,可以访问到两个服务器节点,vip切换速度也很快,几乎感觉不到,lvs的DR模式及高可用就实现了,结束。


最后编辑于: 2018 年 12 月 10 日
返回文章列表 文章二维码 打赏
本页链接的二维码
打赏二维码