设为首页 收藏本站
查看: 779|回复: 0

[经验分享] ActiveMQ集群(2)

[复制链接]

尚未签到

发表于 2017-3-1 10:29:18 | 显示全部楼层 |阅读模式
  ActiveMQ具有强大和灵活的集群功能,但在使用的过程中会发现很多的缺点,ActiveMQ的集群方式主要有两种:Master-SlaveBroker Cluster
  1、Master-Slave方式:
  Master-Slave方式中,只能是Master提供服务,Slave是实时地备份Master的数据,以保证消息的可靠性。当Master失效时,Slave会自动升级为Master,客户端会自动连接到Slave上工作。
  Master-Slave模式分为三类:
  a、Pure Master Slave
  b、Shared File System Master Slave
  c、 JDBC Master Slave。
  (1) Pure Master Slave(该方式已经被淘汰:)
  需要两台Broker,一台作为Master,另一台作为Slave,运行时,Slave通过网络实时从Master处复制数据,同时,如果Slave和Master失去连接,Slave就会自动升级为Master,继续为客户端提供消息服务,如图所示:
         DSC0000.png
     实践时,我们使用两台ActiveMQ服务器,一台作为Master,Master不需要做特殊的配置;另一台作为Slave,配置${ACTIVEMQ_HOME}/conf/activemq.xml文件,在<broker>节点中添加连接到Master的URI和设置Master失效后不关闭Slave,代码如下:  
  <broker xmlns="http://activemq.apache.org/schema/core"
  brokerName="pure_slave"
  masterConnectorURI="tcp://0.0.0.0:61616"
  shutdownOnMasterFailure="false"   dataDirectory="${activemq.base}">  
  <!-- 同时修改Slave的服务端口,如下:-->
  <transportConnectors>  
  <transportConnector name="openwire" uri="tcp://0.0.0.0:61617"/>  
  </transportConnectors>   
  </broker>
  为了看到实践的效果,Master和Slave的消息持久化介质都是采用MySQL,并且Master和Slave分别连接不同的数据库。   
  在消息生产者应用和消息消费者应用的Spring配置文件中添加以下红色内容:
  <property name="brokerURL" value="failover:(tcp://localhost:61616,tcp://localhost:61617)?initialReconnectDelay=100" />
  这种方式只能两台机器做集群,可以起到很好的双机热备功能,但只能失效一次,只能停机恢复Master-Slave结构。
   (2) Shared File System Master Slave
  介绍:  这种方式是利用共享文件系统做ActiveMQ集群。kahaDB是ActiveMQ下默认的文件系统。
  当一个AMQ实例获得了共享文件的锁,这个实例就成为了Master,其它实例即为Slave。如果这时Master挂了,其它AMQ实例会竞争共享文件的锁,获得锁的就成为Master,其它实例还是Slave。
  部署时Slave没有限制数,而且自动切换Master不需要人工干预。
  官方资料:http://activemq.apache.org/masterslave.html
  Shared File System Master Slave模式如图所示:
              DSC0001.png
  本例子是在一台机器上运行三个ActiveMQ实例,需要对ActiveMQ的配置文件做一些简单的配置,就是把持久化适配器的存储目录改为本地磁盘的一个固定目录,三个实例共享这个目录,如下:
  <persistenceAdapter>  
          <kahaDB directory="E:/XXX/XXX/XXX/cluster/shared_file/data/kahadb" />  
        </persistenceAdapter>
  然后修改ActiveMQ实例的服务端口和jetty的服务端口,防止端口占用异常。启动三个ActiveMQ实例,就可以进行测试了。
  以上配置只能在一台机器进行,如果各个ActiveMQ实例需要运行在不同的机器,就需要用到分布式文件系统了。
  (3) JDBC Master Slave
  JDBC Master Slave模式和Shared File Sysytem Master Slave模式的原理是一样的,只是把共享文件系统换成了共享数据库。我们只需在所有的ActiveMQ的主配置文件中(${ACTIVEMQ_HOME}/conf/activemq.xml)添加数据源,让所有的数据源都指向同一个数据库即可。
  这种方式的集群相对Shared File System Master Slave更加简单,更加容易地进行分布式部署,但是如果数据库失效,那么所有的ActiveMQ实例都将失效。
  官方资料:http://activemq.apache.org/masterslave.html
  配置概述:  
  A. 配置上,不存在Master和Slave,所有Broder的配置基本是一样的
  B. 多个共享数据源的Broker构成JDBC Master Slave
  C. 给每个Broker取一个名字
  D. 首先抢到资源(数据库锁)的Broker成为Masetr
  E. 其他Broker保持预备状态,定期尝试抢占资源,运行其的Shell中清楚的显示了这一点
  F. 一旦Master崩溃,其他Broker尝试抢占资源,最终只有一台抢到,它立刻成为Master
  G. 之前的Master即使重启成功,也只能作为Slave等待
  配置步骤:
        1. 修改持久化适配器为 MySQL:
  <persistenceAdapter>
            <jdbcPersistenceAdapter dataDirectory="activemq-data" dataSource="#mysql-ds"/>
          </persistenceAdapter>
  2.  在activemq.xml 添加如下代码:
   <!--配置数据源:注意是配在broker标记之外-->
          <bean id="mysql-ds" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">  
            <property name="driverClassName" value="com.mysql.jdbc.Driver"/>  
            <property name="url" value="jdbc:mysql://localhost:3306/mq?relaxAutoCommit=true"/>  
            <property name="username" value="root"/>  
            <property name="password" value="123456"/>  
            <property name="maxActive" value="200"/>  
            <property name="poolPreparedStatements" value="true"/>  
          </bean>  
  3.  修改每个broker的tcp端口。否则,该端口被占用时会报错。
  Eg: <transportConnector   name="openwire"  uri="tcp://0.0.0.0:61616"/>
              <transportConnector  name="openwire"  uri="tcp://0.0.0.0:61617"/>
              <transportConnector   name="openwire"  uri="tcp://0.0.0.0:61618"/>
  4.  测试时,最好为每一个Broker都起一个独立的名字。
  Eg:  <broker brokerName="broker_01" … />
  5. 在 ${ACTIVEMQ_HOME}/lib中添加 MysQL驱动jar包: mysql-connector-java-5.1.7-bin.jar
  详情参见资料: http://blog.csdn.net/jiangxuchen/article/details/8004612
  客户端连接服务端代码:
  ConnectionFactory cf = new ActiveMQConnectionFactory("failover:(tcp://0.0.0.0:61616,  tcp://0.0.0.0:61617,  tcp://0.0.0.0:61618)");
  结论:
  JDBC Master Slave模式实现方式稍微复杂一点,可以实现消息的多点热备功能,Master、Slave的交替完全是即时的,自动的,无需重启任何broker;队列可以实现消息的异步和点对点发送。
  以上三种方式的集群都不支持负载均衡,但可以解决单点故障(某台broker坏掉)的问题,以保证消息服务的可靠性。
  2、Broker Cluster
  Broker Cluster方式主要是通过network of Brokers在多个ActiveMQ实例之间进行消息的路由。Broker的集群分为Static Discovery和Dynamic Discovery两种。
  (1) Static Discovery集群
  Static Discovery集群就是通过硬编码的方式使用所有已知ActiveMQ实例的URI地址。
  如:消息生产者应用连接一个ActiveMQ实例,我们暂时称为MQ1,所有的消息都由该实例提供;两个消息消费者应用分别连接另外两个ActiveMQ实例,分别为MQ2和MQ3,两个消息消费者需要消费MQ1上的消息,但它们连接的都不是MQ1,可以通过Static Discovery方式把MQ1上的消息路由到MQ2和MQ3,为了保证消费者不因某个节点的失效而导致不能消费消息,在消费者应用中需要配置所有节点的URI。
  配置:     
  A、生产者的broker不需要特殊的配置
  B、修改每个broker的tcp端口
  <transportConnector   name="openwire"  uri="tcp://0.0.0.0:61616"/>
          <transportConnector  name="openwire"  uri="tcp://0.0.0.0:61617"/>
          <transportConnector   name="openwire"  uri="tcp://0.0.0.0:61618"/>
  C. 修改每个broker的名字
  Eg:   <broker brokerName="broker_01" … />
  D. 所有的消费者的broker需要添加networkConnectors节点,用于连接到生产者的broker,如:
  <networkConnectors>  
            <networkConnector uri="static:failover://(tcp://localhost:61616)" duplex="true" />  
          </networkConnectors>
  注: 这段配置需要加在<persistenceAdapter>节点的前面。
  E、最后,在消费者应用中设置brokerURL的值如:
   <property name="brokerURL"  value="failover:(tcp://localhost:61616)" />  
  Static Discovery集群方式有些缺点,如不能解决单点故障问题,若某个Broker失效时,有可能造成数据的丢失,动态添加节点不够智能化。
  更加详细的说明与配置请参考:http://activemq.apache.org/networks-of-brokers.html
  (2) Dynamic Discovery集群
  Dynamic Discovery集群方式在配置broker时,不需要知道所有其它broker的URI地址,只需在所有实例的${ACTIVEMQ_HOME}/conf/activemq.xml文件中添加以下内容:
   <networkConnectors>  
        <networkConnector  uri="multicast://default" />  
      </networkConnectors>
  同时在<transportConnectors>节点中添加以下红色部分内容:
  <transportConnectors>  
        <transportConnector name="openwire" uri="tcp://0.0.0.0:61616" discoveryUri="multicast://default" />  
      </transportConnectors>  
  最后,注意修改每个broker的activemq.xml的broker名字和tcp端口号。这样就可以实现消息在所有ActiveMQ实例之间进行路由。Dynamic Discovery集群方式的缺点和Static Discovery一样。
  从以上的分析可以看出,Master-Slave模式不支持负载均衡,但可以通过消息的实时备份或共享保证消息服务的可靠性,Broker Cluster模式支持负载均衡,可以提高消息的消费能力,但不能保证消息的可靠性。所以为了支持负载均衡,同时又保证消息的可靠性,我们可以采用Msater-Slave+Broker Cluster的模式。
       DSC0002.png

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-348702-1-1.html 上篇帖子: 安装Nginx+Tomcat 下篇帖子: Java后端WebSocket的Tomcat实现
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表