activemq的HA架构(master/slave)

来源:互联网 发布:mac bash 3.2解除密码 编辑:程序博客网 时间:2024/06/05 05:24

翻译ActiveMQ与HA架构(master/slave)


HA(高可用性)几乎在所有的架构中都需要有一定的保证,可靠的备份是必须的。



对于Client端而言,使用failover协议来访问broker:
//Client使用failover协议来与有效的master交互  
//master地址在前,slave在后,randomize为false让Client优先与master通信  
//如果master失效,failover协议将会尝试与slave建立链接,并依此重试 

connectionFactory = new ActiveMQConnectionFactory("username","userpwd", "failover:(tcp://0.0.0.0:61617,tcp://0.0.0.0:61618)");


一. Share nothing storage master/slave(无共享的数据备份)
master与slave有各自的存储系统,不共享任何数据。master接收到的所有指令(消息生产,消费,确认,事务,订阅等)都会同步发送给slave。
对于持久化消息,将会采用同步的方式(sync)在master与slave之间备份,master接受到消息之后,首先发给slave,slave存储成功后,master才会存储消息并向producer发送ACK。
首先启动master,在master有效时,salve将不会创建任何transportConnector,即Client不能与slave建立链接;如果master失效,slave是否接管服务是可选择的
1) 关闭:如果slave检测到master失效,slave实例关闭自己。此后管理员需要手动依次启动master、slave来恢复服务。
2) 角色转换: slave将自己提升为master,并初始化transportConnector,此后Client可以通过failover协议切换到Slave上,并与slave交互。


Master配置:
//waitForSlave表示当master启动之后,是否等待slave接入,如果为true,那么master将会等待waitForSlaveTimeout毫秒数,直到有slave接入之后master才会初始化transportConnector,此间Client无法与master交互;如果等待超时,则有shutdownOnSlaveFailure决定master是否关闭。
<broker brokerName="master" waitForSlave="true" shutdownOnSlaveFailure="false" waitForSlaveTimeout="600000" useJmx="false" >  
    ...  
    <transportConnectors>  
      <transportConnector uri="tcp://localhost:61616"/>  
    </transportConnectors>  
</broker>  
Slave配置:
//shutdownOnMasterFailure表示当master失效后,slave是否自动关闭,默认为false,表示slave将提升为master。
<broker brokerName="slave" shutdownOnMasterFailure="false">  
    <services>  
      <masterConnector remoteURI= "tcp://master:61616"/>  
    </services>  
    ....  
    <transportConnectors>  
      <transportConnector uri="tcp://localhost:61616"/>  
    </transportConnectors>  
</broker>  
“Shared nothing”模式已经被active所抛弃,将在5.8+之后版本中移除。


二. Shared storage master/slave (共享存储的HA)
“Shared storage”允许集群中有多个slave共存,因为存储数据在salve与master之间共享(物理共享),所以当master失效后,slave自动接管服务
 在此需要明确一个问题,“Shared storage”模式只会共享“持久化”类型的消息;对于非持久化消息将不能从从中收益,它们不会在slaves中备份,这也意味着如果master失效,即使slave接管了服务,此前保存在master上的非持久化消息也将丢失。
配置一个插件,强制将所有消息转换成持久化类型,这样所有的消息都可以在故障恢复之后不会丢失。
<broker>    
    <plugins>    
        <!-- 将所有消息的传输模式,修改为"PERSISTENT" -->    
      <forcePersistencyModeBrokerPlugin persistenceFlag="true"/>    
    </plugins>    
</broker>  
1. Shared File System master/slaves(基于文件系统的HA,默认的持久化方式)
Master/Slave配置:
<broker xmlns="http://activemq.apache.org/schema/core" brokerName="broker-locahost-0" useJmx="false">  
      
    <persistenceAdapter>  //持久化数据存储位置
        <levelDB directory="/data/leveldb"/>  
    </persistenceAdapter>  
    <tempDataStore>  //临时数据存储位置
        <levelDB directory="/data/leveldb/tmp"/>  
    </tempDataStore>  
    <transportConnectors>  
        <transportConnector name="openwire" uri="tcp://0.0.0.0:61616?maximumConnections=1000&amp;wireformat.maxFrameSize=104857600"/>  
    </transportConnectors>  
</broker>  
 


 2.  JDBC Store master/slaves(基于数据库的HA)
数据存储引擎为database,activeMQ通过JDBC的方式与database交互,排他锁使用database的表级排他锁,其他原理基本上和1)一致。
Master/Slave配置:
<broker brokerName="broker-locahost-0">  
      
    <persistenceAdapter>  
        <jdbcPersistenceAdapter dataSource="#mySql"/>  
    </persistenceAdapter>  
  
    <transportConnectors>  
        <!-- DOS protection, limit concurrent connections to 1000 and frame size to 100MB -->  
        <transportConnector name="openwire" uri="tcp://0.0.0.0:61616?maximumConnections=1000&amp;wireformat.maxFrameSize=104857600"/>  
    </transportConnectors>  
  
</broker>  
  
<bean id="mySql" class="org.apache.tomcat.jdbc.pool.DataSource" destroy-method="close">    
   <!--Connection Info-->
   <property name="driverClassName" value="com.mysql.jdbc.Driver"/>
   <property name="url" value="jdbc:mysql://localhost:3306/test_mq?serverTimezone=UTC"/>
   <property name="username" value="root"/>
   <property name="password" value="123456"/>
</bean> 
JDBC Store有个小小的问题,就是临时文件无法保存在database中,我们不能在<tmpDataStore>使用JDBC Store;所以临时文件还是只能保存在broker本地。(即非持久消息不会保存在database中,只会保存在master上)


三. Replicated LevelDB Store
基于复制的LevelDB Store,这是ActiveMQ全力打造的HA存储引擎,也是目前比较符合“Master-slave”架构模型的存储方案,此特性在5.9+版本中支持。
“Replicated LevelDB”也同样允许有多个Slaves,而且Slaves的个数有了约束性的限制,这归结于其使用zookeeper作为Broker master选举。每个Broker实例将消息数据保存本地(类似于“Shared nothing”),它们之间并不共享任何数据,所以把“Replicated LevelDB”归类为“Shared storage”并不妥当。
配置:
<broker xmlns="http://activemq.apache.org/schema/core" brokerName="mq-group" brokerId="mq-group-0" dataDirectory="${activemq.data}">  
  
    <persistenceAdapter>  
        <replicatedLevelDB directory="${activemq.data}"  
          replicas="2"  
          bind="tcp://127.0.0.1:0"  //当此broker实例成为master时,开启一个socket地址,此后其他的slave可以通过此地址与其同步数据。
          zkAddress="127.0.0.1:2181"  //zookeeper的地址
          zkSessionTmeout="30s"  //与zookeeper创建回话的超时
          zkPath="/activemq/leveldb-stores"  //对应的zookeeper的文件位置,在文件位置下用来存储group中所有broker的注册信息
          hostname="broker0" />  
     </persistenceAdapter>  
           
</broker>  
所有的broker必须具有相同的brokerName,它作为group域来限定集群的成员
brokerId可以不同,它仅作为描述信息。
“replicas”参数非常重要,默认为3,表示消息最多可以备份在几个broker实例上。此值必须>=2。
0 0
原创粉丝点击