RabbitMQ负载均衡(1)

面对大量业务访问、高并发请求可以使用高性能的服务器来提升RabbitMQ服务的负载能力。当单机容量达到极限时,我们可以采取集群的策略来对负载能力做进一步的提升,但是这里还存在一个负载不均衡的问题。试想如果一个集群中有3个节点,那么所有的客户端都与其中的单个节点node1建立TCP连接,那么node1的网络负载必然会大大增加而显得难以承受,其他节点又由于没有那么多的负载而造成硬件资源的浪费,所以负载均衡显得尤为重要。

负载均衡(Load balance)是一种计算机网络技术,用于在多个计算机(计算机集群)、网络连接、CPU、磁盘驱动器或其他资源中分配负载,以达到最佳资源使用、最大化吞吐率、最小响应时间以及避免过载的目的。使用带有负载均衡的多个服务器组件,取代单一的组件,可以通过冗余提高可靠性。负载均衡通常分为软件负载均衡和硬件负载均衡两种。

软件负载均衡是指在一个或者多个交互的网络系统中的多台放服务器上安装一个或多个相应的负载均衡软件来实现一种均衡负载技术。软件可以很方便的安装在服务器上,并且实现一定的均衡负载功能。软件负载均衡技术配置简单、操作也仿版,最重要的是成本很低。

硬件负载均衡是指在多台服务器间安装相应的负载均衡设备,也就是负载均衡器(如F5)来完成均衡负载技术,与软件负载均衡技术相比,能达到更好的负载均衡效果。由于硬件负载均衡技术需要额外的增加负载均衡器,成本比较高,所以适用于流量高的大型网站系统。

这里主要讨论的是如何有效的对RabbitMQ集群使用软件负载均衡技术,目前主流的方式有在客户端内部实现负载均衡,或者使用HAProxy、LVS等负载均衡软件来实现。

客户端内部实现负载均衡

对于RabbitMQ而言可以在客户端连接时简单的使用负载均衡算法来实现负载均衡。负载均衡算法有很多种,主流的有:

轮询法
将请求按顺序轮流地分配到后端服务器上,它均衡地对待后端的每一台服务器,而不关系服务器实际的连接数和当前的系统负载。
示例如代码清单所示,如果多个客户端需要连接到这个有3个节点的RabbitMQ集群,可以调用RoundRobin.getConnectionAddress()来获取相应的连接地址。

public class RoundRobin {
    private static List<String> list = new ArrayList<String>(){{
        add("192.168.0.2");
        add("192.168.0.3");
        add("192.168.0.4");
    }};
    private static int pos = 0;
    private static final Object lock = new Object();
    public static String getConnectionAddress(){
        String ip = null;
        synchronized (lock) {
            ip = list.get(pos);
            if (++pos >= list.size()) {
                pos = 0;
            }
        }
        return ip;
    }
}

随机法
通过随机算法,根据后端服务器的列表大小值来随机选取其中的一台服务器进行访问。由概率统计理论可以得知,随着客户端调用服务端的次数增多,其实际效果越来越接近于平均分配调用量到后端的每一台服务器,也就是轮询的结果。对应的示例代码如下:

public class RandomAccess {
    private static List<String> list = new ArrayList<String>(){{
        add("192.168.0.2");
        add("192.168.0.3");
        add("192.168.0.4");
    }};
    public static String getConnectionAddress(){
        Random random = new Random();
        int pos = random.nextInt(list.size());
        return list.get(pos);
    }
}

源地址哈希法
源地址哈希的思想是根据获取的客户端IP地址,通过哈希函数计算得到的一个数值,用该数值对服务器列表的大小进行取模运算,得到的结果便是客户端要访问服务器的序号。采用源地址哈希法进行负载均衡,同一IP地址的客户端,当后端服务器列表不变时,它每次都会映射到同一台后端服务器进行访问。

public class IpHash {
    private static List<String> list = new ArrayList<String>(){{
        add("192.168.0.2"); add("192.168.0.3"); add("192.168.0.4");
    }};
    public static String getConnectionAddress() throws UnknownHostException {
        int ipHashCode = InetAddress.getLocalHost().getHostAddress().hashCode();
        int pos = ipHashCode % list.size();
        return list.get(pos);
    }
}

加权轮询法
不同的后端服务器可能机器的配置和当前系统的负载并不相同,因此它们的抗压能力也不相同。给配置高、负载低的机器配置更高的权重,让其处理更多的请求;而配置低、负载高的集群,给其分配较低的权重,降低其系统负载,加权轮询能很好地处理这一问题,并将请求顺序且按照权重分配到后端。

加权随机法
与加权轮询法一样,加权随机法也根据后端机器的配置、系统的负载分配不同权重。不同的是,它是按照权重随机请求后端服务器,而非顺序。

最小连接数法
最小连接数算法比较灵活和智能,由于后端服务器的配置不尽相同,对于请求的处理有块有慢,它是根据后端服务器当前的连接情况,动态地选取其中当前积压连接数最少的一台服务器来处理当前的请求,尽可能地提高后端服务的利用效率,将负载合理地分流到每一台服务器。

有关于加权轮询法、加权随机法和最小连接数法的实现也比较简单,这里就留给读者自己动手实践一下。

时间: 2024-07-29 10:41:36

RabbitMQ负载均衡(1)的相关文章

RabbitMQ负载均衡(4)——LVS

负载均衡的方案有很多,适合RabbitMQ使用的处理HAProxy之外还有LVS.LVS是Linux Virtual Server的简称,也就是Linux虚拟服务器, 是一个由章文嵩博士发起的自由软件项目,它的官方站点是www.linuxvirtualserver.org.现在LVS已经是 Linux标准内核的一部分,在Linux2.6.32内核以前,使用LVS时必须要重新编译内核以支持LVS功能模块,但是从Linux2.6.32内核以后,已经完全内置了LVS的各个功能模块,无需给内核打任何补丁

一张图看懂阿里云网络产品[五]负载均衡SLB

负载均衡SLB是对多台云服务器进行流量分发的服务.它可以通过流量分发扩展应用系统的服务能力,通过消除单点故障提升应用系统的可用性.通过设置虚拟IP,将位于同一地域的多台云服务器虚拟成一个高性能.高可用的应用服务池.根据指定的方式,将来自客户端的网络请求分发到云服务器池中. 系列文章持续更新中,敬请关注 [一]网络产品概览 [二]VPC [三]EIP [四]NAT网关 [五]负载均衡SLB [六]共享带宽 [七]共享流量包 [八]高速通道 [九]VPN网关 [十]云托付 [十一]全球加速

Windows 08 R2_NLB负载均衡(图文详解)

目录 目录 Load Balance 使用NLB来部署Web Farm集群 环境准备 在Win08r2pc1中配置DNS服务 在Win08r2pc1中部署File Service文件服务 在Win08r2pc1中部署IIS Web服务 在win08r2pc2上部署IIS Web服务 配置共享的站点文件夹 win08r2pc1中的web共享配置 win08r2pc2中的web共享配置 创建NLB集群 NLB的高级管理 编辑端口规则 Load Balance Load Balance:负载均衡提供了

Lvs+keepalived 高可用性负载均衡自动化配置

原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任.http://navyaijm.blog.51cto.com/4647068/809397 前言* 随着互联网的发展,提供用户访问的web服务器,必须要保证每天24不间断服务,访问量不断增加,有什么好的web架构既能实现高可用性负载均衡,而且价格又是免费的呢?答案有木有?有!lvs+keepalived 是不错的选择!   一.实验环境:4台centos 5.4 ,以及简单的拓扑图: LVS-

服务器的网络负载均衡简介

什么是负载均衡? 负载均衡是由多台服务器以对称的方式组成一个服务器集合,每台服务器都具有等价的地位,都可以单独对外提供服务而无须其他服务器的辅助.通过某种负载分担技术,将外部发送来的请求均匀分配到对称结构中的某一台服务器上,而接收到请求的服务器独立地回应客户的请求.均衡负载能够平均分配客户请求到服务器列阵,籍此提供快速获取重要数据,解决大量并发访问服务问题.这种群集技术可以用最少的投资获得接近于大型主机的性能. 网络负载均衡的优点 第一,网络负载均衡能将传入的请求传播到多达32台服务器上,即可以

apache2.2+tomcat负载均衡在SSH2项目中session无法共享!!!!!!

问题描述 apache2.2+tomcat负载均衡在SSH2项目中session无法共享!!!!!! 使用apache2.2和三个tomcat实例在同一台机器配置负载均衡成功,基本软件:apache.2.225Tomcat8.0.20Tomcat-connectors-1.2.40使用如下Jsp页面时显示session要以复制且sessionId相同,但是加载实际SSH2实际项目,则发现session丢失且每次都创建新的session请有类似配置经验或解决方案的同仁不吝赐教!<% HttpSes

linux内核SMP负载均衡浅析

需求 在<linux进程调度浅析>一文中提到,在SMP(对称多处理器)环境下,每个CPU对应一个run_queue(可执行队列).如果一个进程处于TASK_RUNNING状态(可执行状态),则它会被加入到其中一个run_queue(且同一时刻仅会被加入到一个run_queue),以便让调度程序安排它在这个run_queue对应的CPU上面运行. 一个CPU对应一个run_queue这样的设计,其好处是: 1.一个持续处于TASK_RUNNING状态的进程总是趋于在同一个CPU上面运行(其间,这

【转载】四层和七层负载均衡的区别

简单理解四层和七层负载均衡:①所谓四层就是基于IP+端口的负载均衡:七层就是基于URL等应用层信息的负载均衡:同理,还有基于MAC地址的二层负载均衡和基于IP地址的三层负载均衡. 换句换说,二层负载均衡会通过一个虚拟MAC地址接收请求,然后再分配到真实的MAC地址:三层负载均衡会通过一个虚拟IP地址接收请求,然后再分配到真实的IP地址:四层通过虚拟IP+端口接收请求,然后再分配到真实的服务器:七层通过虚拟的URL或主机名接收请求,然后再分配到真实的服务器. ②所谓的四到七层负载均衡,就是在对后台

调度子系统5_负载均衡(二)

一篇介绍Linux负载均衡的文章:          Linux Load Balancing Mechanism          CSDN资源地址