架构设计:系统间通信——ActiveMQ集群方案(上)
来源:互联网 发布:淘宝店铺上新提醒设置 编辑:程序博客网 时间:2024/06/06 13:01
1、综述
通过之前的文章,我们讨论了ActiveMQ的基本使用,包括单个ActiveMQ服务节点的性能特征,关键调整参数;我们还介绍了单个ActiveMQ节点上三种不同的持久化存储方案,并讨论了这三种不同的持久化存储方案的配置和性能特点。但是这还远远不够,因为在生产环境中为了保证让我们设计的消息服务方案能够持续工作,我们还需要为消息中间件服务搭建集群环境,从而在保证消息中间件服务可靠性和处理性能。
2、ActiveMQ多节点方案
集群方案主要为了解决系统架构中的两个关键问题:高可用和高性能。ActiveMQ服务的高可用性是指,在ActiveMQ服务性能不变、数据不丢失的前提下,确保当系统灾难出现时ActiveMQ能够持续提供消息服务,高可靠性方案最终目的是减少整个ActiveMQ停止服务的时间。
ActiveMQ服务的高性能是指,在保证ActiveMQ服务持续稳定性、数据不丢失的前提下,确保ActiveMQ集群能够在单位时间内吞吐更高数量的消息、确保ActiveMQ集群处理单条消息的时间更短、确保ActiveMQ集群能够容纳更多的客户端稳定连接。
下面我们分别介绍如何通过多个ActiveMQ服务节点集群方式,分别提供热备方案和高性能方案。最后我们讨论如何将两种方案结合在一起,最终形成在生成环境下使用的推荐方案。
2-2、ActiveMQ高性能方案
ActiveMQ的多节点集群方案,主要有动态集群和静态集群两种方案。所谓动态集群就是指,同时提供消息服务的ActiveMQ节点数量、位置(IP和端口)是不确定的,当某一个节点启动后,会通过网络组播的方式向其他节点发送通知(同时接受其他节点的组播信息)。当网络中其他节点收到组播通知后,就会向这个节点发起连接,最终将新的节点加入ActiveMQ集群;所谓静态集群是指同时提供消息服务的多个节点的位置(IP和端口)是确定的,每个节点不需要通过广播的方式发现目标节点,只需要在启动时按照给定的位置进行连接。
静态集群方案
动态集群方案
2-1-1、基于组播(multicast)的节点发现
在使用动态集群配置时,当某个ActiveMQ服务节点启动后并不知道整个网络中还存在哪些其他的服务节点。所以ActiveMQ集群需要规定一种节点与节点间的发现机制,以保证能够解决上述问题。ActiveMQ集群中,使用“组播”原理进行其他节点的发现。
组播(multicast)基于UDP协议,它是指在一个可连通的网络中,某一个数据报发送源向一组数据报接收目标进行操作的过程。在这个过程中,数据报发送者只需要向这个组播地址(一个D类IP)发送一个数据报,那么加入这个组播地址的所有接收者都可以收到这个数据报。组播实现了网络中单点到多点的高效数据传送,能够节约大量网络带宽,降低网络负载。
在IP协议中,规定的D类IP地址为组播地址。224.0.0.0~239.255.255.255这个范围内的IP都是D类IP地址,其中有一些IP段是保留的有特殊含义的:
224.0.0.0~224.0.0.255:这个D类IP地址段为保留地址,不建议您在开发过程中使用,因为可能产生冲突。例如224.0.0.5这个组播地址专供OSPF协议(是一种路由策略协议,用于找到最优路径)使用的组播地址;224.0.0.18这个组播地址专供VRRP协议使用(VRRP协议是虚拟路由器冗余协议)。
224.0.1.0~224.0.1.255:这个D类IP地址为公用组播地址,用于在整个Internet网络上进行组播。除非您有顶级DNS的控制/改写权限,否则不建议在局域网内使用这个组播地址断。
239.0.0.0~239.255.255.255:这个D类IP地址段为推荐在局域网内使用的组播地址段。注意,如果要在局域网内使用组播功能,需要局域网中的交换机/路由器支持组播功能。幸运的是,目前市面上只要不是太过低端的交换机/路由器,都支持组播功能(组播功能所使用的主要协议为IGMP协议,关于IGMP协议的细节就不再进行深入了)。
下面我们使用java语言,编写一个局域网内的组播发送和接受过程。以便让各位读者对基于组播的节点发现操作有一个直观的理解。虽然ActiveMQ中关于节点发现的过程,要比以下的示例复杂得多,但是基本原理是不会改变的。
- 组播数据报发送者:
- 组播数据报接收者:
另外,我们之前讲过的DUBBO框架中,也有基于“组播”的发现/注册管理。具体可参考DUBBO框架中的com.alibaba.dubbo.registry.multicast.MulticastRegistry类和其引用类(以下为MulticastRegistry类中,创建组播套接字和接受组播数据报的关键代码段):
2-1-2、桥接Network Bridges
为了实现ActiveMQ集群的横向扩展要求和高稳定性要求,ActiveMQ集群提供了Network Bridges功能。通过Network Bridges功能,技术人员可以将多个ActiveMQ服务节点连接起来。并让它们通过配置好的策略作为一个整体对外提供服务。
这样的服务策略主要包括两种:主/从模式和负载均衡模式。对于第一种策略我们会在后文进行讨论。本节我们要重点讨论的是基于Network Bridges的负载均衡模式。
2-1-3、动态Network Connectors
既然已经讲述了ActiveMQ中的动态节点发现原理和ActiveMQ Network Bridges的概念,那么关于ActiveMQ怎样配置集群的方式就是非常简单的问题了。我们先来讨论如何进行基于组播发现的ActiveMQ负载均衡模式的配置——动态网络连接Network Connectors;再来讨论基于固定地址的负载均衡模式配置——静态网络连接Network Connectors。
要配置基于组播发现的ActiveMQ负载均衡模式,其过程非常简单。开发人员只需要在每一个ActiveMQ服务节点的主配置文件中(activemq.xml),添加/更改 以下配置信息即可:
2-1-3-1:networkConnector标签
如果使用ActiveMQ的组播发现功能,请在networkConnector标签的uri属性中添加如下格式的信息:
例如,您可以按照如下方式使用ActiveMQ默认的组播地址来发现网络种其他ActiveMQ服务节点:
也可以按照如下方式,指定一个组播地址——这在高安全级别的网络中很有用,因为可能其他的组播地址已经被管理员禁用。注意组播地址只能是D类IP地址段:
以下是通过抓包软件获得的的组播UDP报文:
从上图中我们可以获得几个关键信息:
192.168.61.138和192.168.61.139这两个IP地址分别按照一定的周期(1秒一次),向组播地址239.0.0.5发送UDP数据报。以便让在这个组播地址的其它服务节点能够感知自己的存在
另外,以上UDP数据报文使用的端口是6155。您也可以更改这个端口信息通过类似如下的方式:
- 每个UDP数据报中,包含的主要信息包括本节点ActiveMQ的版本信息,以及连接到自己所需要使用的host名字、协议名和端口信息。类似如下:
2-1-3-2:transportConnector标签的关联设置
任何一个ActiveMQ服务节点A,要连接到另外的ActiveMQ服务节点,都需要使用当前节点A已经公布的transportConnector连接端口,例如以下配置中,能够供其它服务节点进行连接的就只有两个transportConnector连接中的任意一个:
那么要将哪一个连接方式通过UDP数据报向其他ActiveMQ节点进行公布,就需要在transportConnector标签上使用discoveryUri属性进行标识,如下所示:
2-1-3-3:其他注意事项
关于防火墙:请记得关闭您Linux服务器上对需要公布的IP和端口的限制;
关于hosts路由信息:由于基于组播的动态发现机制,能够找到的是目标ActiveMQ服务节点的机器名,而不是直接找到的IP。所以请设置当前服务节点的hosts文件,以便当前ActiveMQ节点能够通过hosts文件中的IP路由关系,得到机器名与IP的映射:
关于哪些协议能够被用于进行Network Bridges连接:根据笔者以往的使用经验,只有tcp头的uri格式(openwire协议)能够被用于Network Bridges连接;当然您可以使用auto头,因为其兼容openwire协议;另外,您还可以指定为附加nio头。
2-1-4、静态Network Connectors
相比于基于组播发现方式的动态Network Connectors而言,虽然静态Network Connectors没有那样灵活的横向扩展性,但是却可以适用于网络环境受严格管理的情况。例如:管理员关闭了交换机/路由器的组播功能、端口受到严格管控等等。
配置静态Network Connectors的ActiveMQ集群的方式也很简单,只需要更改networkConnectors标签中的配置即可,而无需关联改动transportConnectors标签。但是配置静态Network Connectors的ActiveMQ集群时,需要注意非常关键的细节:每一个节点都要配置其他所有节点的连接位置。
为了演示配置过程,我们假设ActiveMQ集群由两个节点构成,分别是activemq1:192.168.61.138 和 activemq2:192.168.61.139。那么配置情况如下所示:
- 192.168.61.138:需要配置activemq2的位置信息以便进行连接:
- 192.168.61.139:需要配置activemq1的位置信息以便进行连接:
同理,如果您的ActiveMQ集群规划中有三个ActiveMQ服务节点,那么任何一个节点都应该配置其它两个服务节点的连接方式。在配置格式中使用“,”符号进行分割:
以下是配置完成后可能的效果:
- 192.168.61.138(activemq1):
- 192.168.61.139(activemq2):
2-1-5、其他配置属性
下表列举了在networkConnector标签中还可以使用的属性以及其意义。请特别注意其中的duplex属性。如果只从字面意义理解该属性,则被称为“双工模式”;如果该属性为true,当这个节点使用Network Bridge连接到其它目标节点后,将强制目标也建立Network Bridge进行反向连接。其目的在于让消息既能发送到目标节点,又可以通过目标节点接受消息,但实际上大多数情况下是没有必要的,因为目标节点一般都会自行建立连接到本节点。所以,该duplex属性的默认值为false。
以下这些属性,只能在静态Network Connectors模式下使用
请注意这些属性,并不是networkConnector标签的属性,而是在uri属性中进行设置的,例如:
- 架构设计:系统间通信(25)——ActiveMQ集群方案(上)
- 架构设计:系统间通信——ActiveMQ集群方案(上)
- 架构设计:系统间通信(26)——ActiveMQ集群方案(下)
- 架构设计:系统间通信(22)——提高ActiveMQ工作性能(上)
- 架构设计:系统间通信(22)——提高ActiveMQ工作性能(上)
- 架构设计:系统间通信(22)——提高ActiveMQ工作性能(上)
- 系统间通信方式之(ActiveMQ的集群方案介绍上)(十七)
- 架构设计:系统间通信(23)——提高ActiveMQ工作性能(中)
- 架构设计:系统间通信(24)——提高ActiveMQ工作性能(下)
- 架构设计:系统间通信(23)——提高ActiveMQ工作性能(中)
- 架构设计:系统间通信(21)——ActiveMQ的安装与使用
- 架构设计:系统间通信(21)——ActiveMQ的安装与使用
- 架构设计:系统间通信——提高ActiveMQ工作性能(下)
- 架构设计:系统间通信(21)——ActiveMQ的安装与使用
- ActiveMQ系列—ActiveMQ集群方案(上)(高性能方案)
- 系统间通信方式之(ActiveMQ的集群方案介绍结束)(十八)
- 架构设计:系统存储(17)——Redis集群方案:高可用
- 架构设计:系统存储(18)——Redis集群方案:高性能
- 检查分类覆盖方法
- ZOJ 3600 Taxi Fare (细节题)
- oj计算某一天是该年中的第几天
- Scala进阶源码实战之三——文件IO、正则表达式、高阶函数
- 模拟输出受限制的字符串函数-strncat,strncmp,strncpy
- 架构设计:系统间通信——ActiveMQ集群方案(上)
- 搬瓦工安装ShadowSocks,FinalSpeed优化实现YouTube 1080P无压力
- 【java读书笔记】——java的异常处理
- activity初识
- 攒了个程序员笔记本,做个记录
- 在ViewPager实现属性动画(包含:怎样获取手机屏的宽高)
- matlab中 rand和 randn的区别
- JVM内存回收机制简述
- 【java读书笔记】——Collection集合之六大接口(Collection、Set、List、Map、Iterator和Comparable)