ActiveMQ高可用集群(ZooKeeper+LevelDB)安装

发表时间:2017-07-19 22:07:16 浏览量( 31 ) 留言数( 0 )




-ActiveMQ的主从配置有三种方式,其中levelDB已经不建议使用了,所以这里我们说一下数据库方式和官方默认的kahaDB的方式

一、原理

在mq进程启动时一个主(某一台mq进程)抓取数据库中表的独占锁,另一台mq进程会由于争抢不到表锁而阻塞,这样其它的进程都变成了从。(只允许有一个主,可以有多个从) 

如果主的服务断开或者服务中断(比如进程中断、机器宕机等),它(原来的主)所占用的数据库表锁就会被释放,此时其他从开始竞争锁,谁先抢到谁就是新的主。

如下图:

我们使用在同一台机器上面的安装两个MQ的伪集群模式,所以这里需要把相关的端口都改了,如果是真实的环境不需要改变那边多的端口

复制两个MQ程序

第二个MQ的相关端口要修改:

1、修改jetty.xml的8161为8162

2、打开activemq.xml文件,找到61616,看到很多相关的端口都修改了就行了。

主从模式主要修改的文件就是activemq.xml

1、修改broker标签,添加 brokerName="liubao" persistent="true"  主从直接的brokerName要一样。

<broker xmlns="http://activemq.apache.org/schema/core"  brokerName="liubao" persistent="true" dataDirectory="${activemq.data}">

2、共享数据库的配置。kahaDB directory,因为这里我使用的是同一台机器,所以可以这样使用相关的文件服务器,但是如果是真正的服务器,那么kahaDB要使用nfs的文件服务器进行挂载才行。

NFS的配置可以参考这个网站:http://www.linuxidc.com/Linux/2015-05/117378.htm

上面注释一行使用的是数据库的配置。

        <persistenceAdapter>

           <!-- <jdbcPersistenceAdapter dataDirectory="${activemq.base}/activemq-data" dataSource="#mysql-ds"/> -->

            <kahaDB directory="D:/apache-activemq-5.11.3/data/kahadb"/>

        </persistenceAdapter>

如果使用的数据库的配置,那么还需要配置数据库的连接信息,在 <broker> 节点外面新增如下内容

    <bean id="mysql-ds" class="org.apache.commons.dbcp2.BasicDataSource" destroy-method="close">

        <property name="driverClassName" value="com.mysql.jdbc.Driver"/>

        <property name="url" value="jdbc:mysql://localhost/activemq?relaxAutoCommit=true"/>

        <property name="username" value="root"/>

        <property name="password" value="123456"/>

        <property name="poolPreparedStatements" value="true"/>

    </bean>

还需要把相关的jar包复制到各个MQ的lib目录之下commons-dbcp2-2.1.1,   commons-pool2   mysql-connector-java。

还需要新建数据库,并建立相关的表:

CREATE DATABASE `activemq`;

USE `activemq`;

DROP TABLE IF EXISTS `activemq_acks`;

CREATE TABLE `activemq_acks` (

  `LAST_ACKED_ID` int(11) DEFAULT NULL,

  `CONTAINER` varchar(250) DEFAULT NULL,

  `PRIORITY` bigint(20) NOT NULL DEFAULT '5',

  `XID` varchar(250) DEFAULT NULL,

  `CLIENT_ID` varchar(250) DEFAULT NULL,

  `SUB_DEST` varchar(250) DEFAULT NULL,

  `SUB_NAME` varchar(250) DEFAULT NULL,

  `SELECTOR` varchar(250) DEFAULT NULL,

  KEY `ACTIVEMQ_ACKS_XIDX` (`XID`)

) ENGINE=MyISAM DEFAULT CHARSET=utf8;

DROP TABLE IF EXISTS `activemq_lock`;

CREATE TABLE `activemq_lock` (

  `ID` bigint(20) NOT NULL,

  `TIME` bigint(20) DEFAULT NULL,

  `BROKER_NAME` varchar(250) DEFAULT NULL,

  PRIMARY KEY (`ID`)

) ENGINE=MyISAM DEFAULT CHARSET=utf8;

DROP TABLE IF EXISTS `activemq_msgs`;

CREATE TABLE `activemq_msgs` (

  `ID` bigint(20) NOT NULL,

  `CONTAINER` varchar(250) DEFAULT NULL,

  `MSGID_PROD` varchar(250) DEFAULT NULL,

  `MSGID_SEQ` bigint(20) DEFAULT NULL,

  `EXPIRATION` bigint(20) DEFAULT NULL,

  `MSG` longblob,

  `PRIORITY` bigint(20) DEFAULT NULL,

  `XID` varchar(250) DEFAULT NULL,

  PRIMARY KEY (`ID`),

  KEY `ACTIVEMQ_MSGS_MIDX` (`MSGID_PROD`,`MSGID_SEQ`),

  KEY `ACTIVEMQ_MSGS_CIDX` (`CONTAINER`),

  KEY `ACTIVEMQ_MSGS_EIDX` (`EXPIRATION`),

  KEY `ACTIVEMQ_MSGS_PIDX` (`PRIORITY`),

  KEY `ACTIVEMQ_MSGS_XIDX` (`XID`)

) ENGINE=MyISAM DEFAULT CHARSET=utf8;

三、客户端需要把连接信息改成这样:

<property name="brokerURL" value="failover:(tcp://localhost:61616,tcp://localhost:61617)?randomize=false" />