LVS+keepalived实现负载均衡(系列一)

LVS+keepalived实现负载均衡 (系列一)

本文介绍LVS+keepalived实现负载均衡的方案,采用DR模式
LVS+keepalived实现负载均衡 (系列一);
nginx+keepalived实现负载均衡 (系列二)
HAProxy+keepalived实现负载均衡(系列三)

软件环境

本文是在如下环境进行安装

  • CentOS 6.9
  • JDK 1.7
  • Keepalived v1.2.13 (yum安装,版本随意)
  • apache-tomcat-8.5.39.tar.gz (版本随意,主要用于启动web服务)

服务器规划

可以用虚拟机系统,分别用4台服务器,别名是

  • lvs1:作为lvs主,IP192.168.1.101
  • lvs2:作为lvs热备,IP192.168.1.102
  • real1:作为真实接口服务器,IP192.168.1.103
  • real2:同样是真是接口服务器,IP192.168.1.104

VIP(虚拟IP)定为192.168.1.200

实验步骤

如无特别说明,使用root帐号操作

一、安装LVS模块

由于Linux 2.4 内核以上已经集成,不用安装,如需安装,仅针对 lvs1lvs2 安装

注: 目前基本所有的 Linux 系统都无需额外安装

二、基础准备工作

四台机器都要按如下操作

  • 绑定静态IP
  • 设置主机名,设置完成后需要重启
  • 修改hosts,方便适用别名访问
vim /etc/hosts,添加如下
192.168.80.101 lvs1
192.168.80.102 lvs2
192.168.80.103 real1
192.168.80.104 real2
  • 关闭防火墙,并禁止开机启动
service iptables stop
chkconfig iptables off
三、配置2台 Web 服务器

以下仅针对2台 Web 服务器(real1real2)操作

  • 安装 JDK 并配置环境变量,版本随意,选择7或8都可以
  • 上传 apache-tomcat-8.5.39.tar.gz到服务器,位置随意
  • 解压,保持默认的8080端口,启动Tomcat
  • 检查是否可以访问:curl http://127.0.0.1:8080
  • 修改Tomcat的首页,增加标记,以便访问时可知道落到哪台服务器
vim TOMCAT_HOME/webapps/ROOT/index.jsp
在 
    If you're seeing this, you've successfully installed Tomcat. Congratulations! 

前面添加本机的标识,以便检验负载均衡效果的时候可以区分是什么机器,在这句话前面添加
    real1   或   real2
  • 在宿主机的浏览器中访问如下URL并检查是否修改成功
  • 配置realserver (关键)
    • 进入指定目录:cd /etc/init.d/

    • 编辑脚本(文件不存在自行创建):vim realserver,文件内容在最后见:realserver

      脚本对于2台 Web 服务器都是一样的,如果你不是使用192.168.1.200作为VIP,则需要修改SNS_VIP,注意在别的教程里拷贝的脚本可能会出错,按照我这个即可保证正确(据说其他教程出错是因为. /etc/rc.d/init.d/functions 少了一个点)

    • 保存脚本文件后更改该文件权限:chmod 755 realserver

    • 开启realserver服务:service realserver start,启动成功后使用ip addr查看lo网卡是否出现VIP

1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet 192.168.1.200/32 brd 192.168.1.200 scope global lo:0
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever

realserver脚本:

#vi /usr/local/sbin/realserver.sh
#!/bin/bash
# description: Config realserver lo and apply noarp
#Written by :NetSeek http://www.linuxtone.org

SNS_VIP=192.168.1.200

. /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
四、配置主负载服务器lvs1

只针对lvs1进行操作

  • 安装 keepalived 相关包:yum install -y keepalived
  • 编辑 keepalived.conf 配置文件:也可以备份原来的配置再修改,vim /etc/keepalived/keepalived.conf,修改内容如下:
vrrp_instance VI_1 {
    state MASTER            # 指定keepalived的角色,MASTER为主,BACKUP为备
    interface eth0            # 当前进行vrrp通讯的网络接口卡(当前centos的网卡)
    virtual_router_id 66        # 虚拟路由编号,主备要一致
    priority 100            # 优先级,数值越大,获取处理请求的优先级越高
    advert_int 1            # 检查间隔,默认为1s(vrrp组播周期秒数)
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        192.168.1.200        # 定义虚拟ip(VIP),可多设,每行一个
    }
}
# 定义对外提供的LVS的VIP以及port
virtual_server 192.168.1.200 8080 {
    delay_loop 6             # 设置健康检查时间,单位为秒
    lb_algo wrr            # 设置负载调度的算法为wrr
    lb_kind DR            # 设置lvs实现负载的机制,有NAT、TUN、DR三个模式
    nat_mask 255.255.255.0
    persistence_timeout 0        # 同一IP 0秒内的请求都发到同个real server
    protocol TCP
    real_server 192.168.1.103 8080 { # 指定real server1的ip地址
        weight 3        # 配置节点权值,数值越大权重越高
        TCP_CHECK {
            connect_timeout 10
            nb_get_retry 3
            delay_before_retry 3
        }
    }
    real_server 192.168.1.104 8080 {
        weight 3
        TCP_CHECK {
            connect_timeout 10
            nb_get_retry 3
            delay_before_retry 3
        }
    }
}

配置文件说明:

  1. state MASTER 保证是 MASTER 的值
  2. interface eth0 的 eth0,要看你自己的网卡主要是用了什么名字,一般是eth0,有些人可能是eth1,请ifconfig查看
  3. virtual_router_id,虚拟路由编号,主备服务器要一致
  4. priority,优先级,主备配成不一致,主大点,备小点,例如主100,备99,或主101,备100
  5. authentication,不用改,不清楚是什么作用
  6. virtual_ipaddress,改成VIP,如果你不是用本文的VIP,请修改成自己的
  7. 配置virtual_server,这里的VIP和端口根据自己的情况配置,real_server的IP和端口配置成实际需要转发的IP和端口(可以用主机名)

注意:网上其他教程贴的配置多global_defs的内容,实际上是不需要的,这样的例子展示出来容易误导人,让人不知道如何修改

global_defs {
    notification_email {
        997914490@qq.com
    }
    notification_email_from sns-lvs@gmail.com
    smtp_server 192.168.1.114
    smtp_connection_timeout 30
    router_id LVS_MASTER         # 设置lvs的id,在一个网络应该是唯一的
}
  • 配置好文件后,启动服务:service keepalived start
五、配置备用负载服务器lvs2

总体跟配置祝福在服务器lvs1差不多,主要是配置文件有少许的差别,步骤如下

  • 安装 keepalived 相关包:yum install -y keepalived
  • 编 辑keepalived.conf 配置文件:也可以备份原来的配置再修改,vim /etc/keepalived/keepalived.conf,修改内容如下:
vrrp_instance VI_1 {
    state BACKUP            # 指定keepalived的角色,MASTER为主,BACKUP为备
    interface eth0            # 当前进行vrrp通讯的网络接口卡(当前centos的网卡)
    virtual_router_id 66        # 虚拟路由编号,主备要一致
    priority 99            # 优先级,数值越大,获取处理请求的优先级越高
    advert_int 1            # 检查间隔,默认为1s(vrrp组播周期秒数)
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        192.168.1.200        # 定义虚拟ip(VIP),可多设,每行一个
    }
}
# 定义对外提供的LVS的VIP以及port
virtual_server 192.168.1.200 8080 {
    delay_loop 6             # 设置健康检查时间,单位为秒
    lb_algo wrr            # 设置负载调度的算法为wrr
    lb_kind DR            # 设置lvs实现负载的机制,有NAT、TUN、DR三个模式
    nat_mask 255.255.255.0
    persistence_timeout 0        # 同一IP 0秒内的请求都发到同个real server
    protocol TCP
    real_server 192.168.1.103 8080 { # 指定real server1的ip地址
        weight 3        # 配置节点权值,数值越大权重越高
        TCP_CHECK {
            connect_timeout 10
            nb_get_retry 3
            delay_before_retry 3
        }
    }
    real_server 192.168.1.104 8080 {
        weight 3
        TCP_CHECK {
            connect_timeout 10
            nb_get_retry 3
            delay_before_retry 3
        }
    }
}

跟主LVS的配置的区别是:

  1. state 改成了BACKUP
  2. priority 比主的小一点
  3. 注意virtual_router_id保持一致
  • 配置好文件后,启动服务:service keepalived start

验证和测试

一、理论验证
  • 检验是否配置正确:在lvs1使用ip addr查看eth0网卡必须有VIP存在,在lvs2上则无(这是因为是热备的原因)
# 在lvs1上查看,看到192.168.1.200,而在lvs2上查看不到
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
    link/ether ea:46:1b:19:0c:a6 brd ff:ff:ff:ff:ff:ff
    inet 192.168.1.249/23 brd 192.168.1.255 scope global eth0
    inet 192.168.1.200/32 scope global eth0
    inet6 fe80::e846:1bff:fe19:ca6/64 scope link 
       valid_lft forever preferred_lft forever
  • lvs1上关闭keepalived:service keepadlived stop再使用ip addr查看,发现lvs1绑定的VIP没了,而在lvs2上出现了,说明了主备的架构生效了,实现了备用顶替主的情况

  • 重新在lvs1上将keepalived启动:service keepalived start,则lvs1重新抢回了主,这是因为其优先级比较高,恢复后抢回主动权

  • 尝试在宿主机打开命令行窗口,PING 一下VIP:ping 192.168.1.200,应该是能ping通的,如果不通,说明有其他问题,必须解决

二、动手验证
1、在宿主机浏览器上输入VIP

可以观察到浏览器中显示Tomcat的欢迎页面,并且页面轮流转发到real1 和 real2 上

注意:
笔者在实验中发生过了访问上述IP却不能正确转到real1 和 real2 上,是有点奇怪,后面又恢复可以了,原因暂未找到,可能是防火墙?

2、当 Web 服务器其中一台发生故障

关闭 real1 或 real2 的 Tomcat,会发现固定得转发请求到正常的机器,当关闭的服务器上线后,可以实现重新加入集群并接受转发

测试下来似乎和Nginx一样,即如果 a 请求,发送到 real1 后如果发生问题,会重新分给 real2,似乎是这样,如果你们研究不是这样,请留言纠正

3、当"主"宕机,"备"上线

在"主"的服务器上执行service keepalived stop 模拟宕机,可以看到正常对外提供服务,在"备"的服务器上输入ip addr查看发现接管了VIP

当然也可以从keepalived 的日志看到主备更替,详细查看 tail -f /etc/log/messages,这里显示的主备更替的日志,更加准确反映了实时

总结

LVS 其实就是一台Linux服务器

LVS+keepalived的DR负载均衡模式,是应用非常广泛的软件负载方案,对比昂贵的硬件负载均衡方案F5,对比其他软件负载均衡方式,是性能比较高,比较不错的选择

如对比 Nginx+keepalived 方案,由于LVS是工作在网络第四层,在效率上比工作在第7层的 Nginx+keepalived 要高得多. 同样对比 HAProxy+keepalived (也是工作在第7层),性能也是更好的. 当然后两者

LVS+keepalived的DR 方案的瓶颈不是CPU和内存,而在网卡带宽上

关于负载均衡方案,目前想到的有:DNS 轮询方案、LVS+keepalived、HAProxy+keepalived、nginx+keepalived、F5等方案

思考

上面说的LVS+keepalived方案,在某一个时刻对外服务的LVS永远只是一台,有什么办法让两台一起对外提供服务呢? 比如主备一起对外提供服务,也就是负载均衡系统本身就是负载均衡

对于这个问题,我觉得除了使用DNS轮询方案外,似乎无解,除了在上游DNS的解析上做点文章,似乎真没办法

因为对外永远只能有一个端点对外暴露,如果有多个点,用户访问一个域名或IP,他从什么入口进来呢? 入口,似乎就永远只能有一个,就不可能有多个接触点

DNS轮询方案:将域名解析到多个IP,多个IP对应多台服务器,域名解析系统会自动轮询解析到不同服务器,实现了负载均衡,于是可以这么解决负载均衡系统本身的负载均衡问题:

  • A 负载均衡:LVS+keepalived,VIP是 a (必须对外可以访问的公网IP)
  • B 负载均衡:LVS+keepalived,VIP是 b (必须对外可以访问的公网IP)

配置某域名转到a和b,从而实现了负载均衡系统单点压力过大的问题

参考资料

参考博客:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值