LVS/DR+Keepalived负载均衡实战(一)

引言

负载均衡这个概念对于一个IT老鸟来说再也熟悉不过了,当听到此概念的第一反应是想到举世闻名的nginx,但殊不知还有一个大名鼎鼎的负载均衡方案可能被忽略了,因为对于一般系统来说,很多应用场合中采用nginx基本已经满足需求,但对于大型机高性能系统掌握lvs负载均衡是非常有必要的,接下来将小哥对lvs负载均衡进行初步探索。

lvs 简介

概念

LVS(Linux Virtual Server),顾名思义是linux 虚拟服务器的意思,一个虚拟的服务器集群系统,使用负载均衡技术将多台服务器组成一个虚拟服务器。

LVS的由来

由于互联网用户的急剧增长,用户对服务器的访问数量快速增加,这就要求广大的互联网服务器需要具备较大的并发服务能力,因此对于大负载的服务器来讲, CPU、I/O处理能力很快会成为瓶颈。由于单台服务器的性能总是有限的,简单的提高硬件性能并不能真正解决这个问题。为此,必须采用多服务器和负载均衡技术才能满足大量并发访问的需要。

LVS 的优势

1、LVS具有较高的带负载能力,理论上来说,首先LVS 工作在网络7层模型的第4层,一般情况下,越低的工作层次就代表其效率也会越高,工作在低4层模型也就意味着不用和客户端建立连接,不用握手,不用付出因为建立连接或者握手而开辟的资源开销;其次从操作系统层面来讲,LVS是内核级别的功能,对于有限核数的cpu来看,内核级别的功能优先级远远高于用户级别功能的优先级,其执行效率一般会计较高;最后从系统资源层面来看, LVS只对数据进行转发,不消耗操作系统的IO 资源,因此LVS对操作系统资源的依赖是大大降低。根据小哥我查到的数据,LVS 并发服务量大概在几十万这个级别。

2、LVS具有较高的可用,LVS适合对所有的应用层软件做负载均衡解决方案。

3、可靠性较高,LVS工作在7网络模型第四层,他的运行只和网络协议栈和操作系统有关系,因此和其他应用软件的冲突机率大大降低,此外

LVS自身有完整的双机热备方案,如LVS+Keepalived和LVS+Heartbeat,这使得LVS的可靠性得到充分保障。

LVS 搭建高可靠负载均衡集群

集群负载均衡的三种模式

NAT

NAT(Network Address Translation)意即网络地址转换,允许一个整体机构以一个公用IP地址出现在Internet上,即把内部私有网络地址翻译成合法网络IP地址的技术。通过网络地址转换,调度器重写请求报文的目标地址,根据预设的调度算法,将请求分派给后端的真实服务器;真实服务器的响应报文通过调度器时,报文的源地址被重写,再返回给客户,完成整个负载调度过程。

IP Tunneling

采用NAT技术做负载均衡时,自身网络带宽和cpu算力变成瓶颈,为了解决这个问题,调度器把请求报 文通过IP隧道转发至真实服务器,而真实服务器将响应直接返回给客户,所以调度器只处理请求报文。

Direct Routing

Direct Routing 也就是常说的DR模式,此模式通过改写请求报文的MAC地址,将请求发送到真实服务器,而真实服务器将响应直接返回给客户。同TUN模式一样,DR模式可提高集群系统的扩展性。DR模式下没有IP隧道的开销,对集群中的真实服务器也没有必须支持IP隧道协议的要求,但是要求LVS服务器和其他应用服务必须在同一物理网段上。其模型图如下所示:

LVS 实战

LVS 高可靠负载均衡集群至少得准备四台虚拟机

按照本大猿的结构准备环境,架构框图如下所示:

从上图中可以看出,我们需要将node1和node2的两台机子作为LVS负载均衡的主机和从机,需要检查两台机器的环境。

所有节点关闭防火墙

shell 复制代码
systemctl stop firewalld
systemctl disable firewalld

LVS 环境准备

从linux 2.4 开始已经自带LVS,我们只需要安装ipvsadm 工具包即可。node1 和node2 分别安装ipvsadm 工具。

shell 复制代码
yum install ipvsadm -y


LVS环境检查

查看LVS 环境配置是否污染,如果污染需要清空

shell 复制代码
# 查看配置
ipvsadm  -ln
#  清空配置
ipvsadm  -C

如果虚拟网卡(VIP)已经存在,则需要先卸载网卡,保持环境干净。

shell 复制代码
ifconfig  down  eth0:xxx down

本文中LVS 主副节点均为新建,无需其他清理操作。

keepalived环境准备

LVS 需要和keepalived结合,

什么是keepalived

Keepalived is a routing software written in C. The main goal of this project is to provide simple and robust facilities for loadbalancing and high-availability to Linux system and Linux based infrastructures. Loadbalancing framework relies on well-known and widely used Linux Virtual Server (IPVS) kernel module providing Layer4 loadbalancing. Keepalived implements a set of checkers to dynamically and adaptively maintain and manage loadbalanced server pool according their health. On the other hand high-availability is achieved by VRRP protocol. VRRP is a fundamental brick for router failover. In addition, Keepalived implements a set of hooks to the VRRP finite state machine providing low-level and high-speed protocol interactions. In order to offer fastest network failure detection, Keepalived implements BFD protocol. VRRP state transition can take into account BFD hint to drive fast state transition. Keepalived frameworks can be used independently or all together to provide resilient infrastructures.

下面开始配置keepalived环境

shell 复制代码
yum install keepalived  -y

keepalived配置文件设置

shell 复制代码
cp /etc/keepalived/keepalived.conf  /etc/keepalived/keepalived.conf.bak
vim /etc/keepalived/keepalived.conf
master
shell 复制代码
vrrp_instance VI_1 {
    state MASTER
    interface ens33
    virtual_router_id 51
    priority 100
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        192.168.150.100/24 dev ens33 label  ens33:1
    }
}

virtual_server 192.168.159.100 80 {
    delay_loop 6
    lb_algo rr
    lb_kind DR
    nat_mask 255.255.255.0
    persistence_timeout 0
    protocol TCP

   real_server 192.168.159.32 80 {
        weight 1
        HTTP_GET {
              url {
                   path /
                   status_code 200
              }
              connect_timeout 3
              nb_get_retry 3
              delay_before_retry 3
       }
    }
    real_server 192.168.159.33 80 {
        weight 1
        HTTP_GET {
              url {
                   path /
                   status_code 200
              }
              connect_timeout 3
              nb_get_retry 3
              delay_before_retry 3
       }
    }
}
slave
shell 复制代码
vrrp_instance VI_1 {
    state BACKUP
    interface ens33
    virtual_router_id 51
    priority 500
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        192.168.150.100/24 dev ens33 label  ens33:1
    }
}

virtual_server 192.168.159.100 80 {
    delay_loop 6
    lb_algo rr
    lb_kind DR
    nat_mask 255.255.255.0
    persistence_timeout 0
    protocol TCP

   real_server 192.168.159.32 80 {
        weight 1
        HTTP_GET {
              url {
                   path /
                   status_code 200
              }
              connect_timeout 3
              nb_get_retry 3
              delay_before_retry 3
       }
    }
    real_server 192.168.159.33 80 {
        weight 1
        HTTP_GET {
              url {
                   path /
                   status_code 200
              }
              connect_timeout 3
              nb_get_retry 3
              delay_before_retry 3
       }
    }
}

在从机上不显示虚拟网卡但显示路由配置

需要注意的是副节点上并没有看到虚拟网卡信息,因为这时候主节点无故障,副节点中的虚拟网卡基本

应用服务器配置

修改内核配置

shell 复制代码
echo 1  >  /proc/sys/net/ipv4/conf/ens33/arp_ignore 
echo 1  >  /proc/sys/net/ipv4/conf/all/arp_ignore 
echo 2 > /proc/sys/net/ipv4/conf/ens33/arp_announce 
echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce 

其他方式修改,永久神效

shell 复制代码
vim /etc/sysctl.conf
net.ipv4.conf.lo.arp_ignore = 1
net.ipv4.conf.lo.arp_announce = 2
net.ipv4.conf.all.arp_ignore = 1
net.ipv4.conf.all.arp_announce = 2
sysctl -p


设置隐藏ip

node3和node4为应用服务器,我们需要在应用服务器上配置VIP

shell 复制代码
ifconfig  lo:1  192.168.159.100  netmask 255.255.255.255

安装httpd插件

node3和node4 首先安装httpd 插件

shell 复制代码
	yum install httpd -y
	systemctl start httpd 

修改首页,两个节点需要分别修改

shell 复制代码
	vi   /var/www/html/index.html
		from node3
	#重启
	systemctl restart httpd

如上图将两个应用服务器节点的httpd服务配置完成。

数据转发失效

这里数据转发失效的最大可能原因是没有注释掉vrrp_strict这条配置。

测试负载均衡效果



经过测试,本次探索的LVS负载均衡器基本达到试目标,后续文章会继续探索这块的知识。

参考文章:

https://blog.csdn.net/weixin_52813907/article/details/127074105

https://www.jianshu.com/p/a2190b6d4333

相关推荐
泥土编程35 分钟前
linux服务器配置大全
linux·运维·服务器·华为
姚永强1 小时前
第三次作业
linux·运维·服务器
Be_insighted1 小时前
从dos上传shell脚本文件到Linux、麒麟执行报错“/bin/bash^M:解释器错误:没有那个文件或目录”
linux·运维·服务器
CodingCos1 小时前
【ARM Coresight OpenOCD 系列 5 -- arp_examine 使用介绍】
arm开发·arp_examine
最后一个bug2 小时前
lua调用C语言函数,在函数中进行类型检查
linux·c语言·开发语言·lua
猫猫的小茶馆2 小时前
【网络编程】字节序:大端序和小端序
linux·c语言·驱动开发·计算机网络·嵌入式软件
诸葛悠闲2 小时前
《操作系统 - 清华大学》3 -3:连续内存分配:内存碎片与分区的动态分配
linux
荣世蓥2 小时前
7、ARM_栈
arm开发
运维佬2 小时前
在 Linux 系统上部署 Oracle 数据库涉及多个步骤
linux·数据库·oracle
勤奋的凯尔森同学2 小时前
Ubuntu24.04配置安装可视化terminal终端
linux·ssh·可视化命令行终端