我的activemq JDBC Master Slave主从和持久化配置过程

今天的目标是安装好activemq的JDBC Master Slave主从集群,要求是当一台消息队列服务器挂了,或者维护重启的时候不会影响平台正常运行。
首先就是安装mysql数据库,这个已经安装过很多次了,本以为不会有任何问题。没想到还是遇到了麻烦。
我习惯去http://repo.mysql.com/找对应的MySQL YUM源下载地址。
上次安装使用的是http://repo.mysql.com/mysql-community-release-el7-5.noarch.rpm,这次觉得应该有更新的版本了,就按上传时间找了一下,下载了mysql57-community-release-el7-8.noarch.rpm
整个安装过程也没有什么不同,但是安装完成后我怎样都无法用mysql -u root命令登陆,我想通过安全模式(mysqld_safe --skip-grant-tables &)启动mysql服务,结果提示没有mysqld_safe命令。反复尝试了好久,最后想到mysql57和mysql会不会有什么不同?
结果卸载mysql57后,重新下载了mysql-community-release-el7-7.noarch.rpm,安装后果然一切正常了。
mysql-community-release-el7-7.noarch.rpm 和 mysql57-community-release-el7-8.noarch.rpm 到底有什么区别我也没搞清楚,希望大神能过解答。


下面进入正题,开始安装activemq,现在最新版本是apache-activemq-5.13.3,我用的就是它。
整过安装过程没有什么好说的,从官网下载 wget http://mirror.bit.edu.cn/apache//activemq/5.13.3/apache-activemq-5.13.3-bin.tar.gz
然后解压缩 tar zxvf apache-activemq-5.13.3-bin.tar.gz
我习惯把自己安装的应用放在/usr/local目录下,所以 mv apache-activemq-5.13.3 /usr/local/


接下来开始修改配置文件,噩梦就是从这里开始的。
我参考了网上的一篇文章 http://showlike.iteye.com/blog/2040809
这篇文章里又推荐了三篇其他文章,写的都很好。可能因为人家是大神,所以有些细节一笔带过。但往往就是这些细节耽误了很多时间。
修改配置文件apache-activemq-5.13.3/conf/activemq.xml,其实整个过程也就修改了这一个文件
文章中提到了三处修改,
第一处,是开启网络监控功能(useJmx="true"),顺便改了一下名字(brokerName="localhost01")
<broker xmlns="http://activemq.apache.org/schema/core" brokerName="localhost01" dataDirectory="${activemq.data}" useJmx="true">
第二处,是修改服务端口,默认端口是61616,文章中改成了61618。如果你不是部署在一台电脑上,这个也可以不改。
<transportConnectors>  
    <transportConnector name="openwire" uri="tcp://0.0.0.0:61618"/>  
</transportConnectors>
第三处,是数据库持久化配置,一定要注释掉之前的文件支持事务的消息存储器(<!-- <kahaDB directory="${activemq.data}/kahadb"/> -->)
<persistenceAdapter>  
    <jdbcPersistenceAdapter dataDirectory="${activemq.data}" dataSource="#mysql-ds" createTablesOnStartup="false" useDatabaseLock="true"/>  
</persistenceAdapter>
这里提醒大家注意createTablesOnStartup和useDatabaseLock两个参数,后面这两个参数折腾的我好惨。


很快就修改完成了。启动activemq,结果一启动马上就结束进程。打开/apache-activemq-5.13.3/data/activemq.log日志文件看了一下,原来是没有找到数据库持久化配置中的mysql-ds(dataSource="#mysql-ds")。
改配置文件的时候我就觉得很奇怪,为什么不把数据库信息配置进来呢?
赶紧看看其他文章怎么配置,大神推荐的文章 http://blog.csdn.net/jiangxuchen/article/details/8004612 里面有例子,照猫画虎的改一下,就放在配置文件里了。
    <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://192.168.1.94:3306/cluster_jdbc?relaxAutoCommit=true"/>  
        <property name="username" value="root"/>  
        <property name="password" value="pwd123456"/>  
        <property name="maxActive" value="200"/>
        <property name="poolPreparedStatements" value="true"/>  
    </bean>
再次启动消息队列,发现org.apache.commons.dbcp.BasicDataSource不存在,改成org.apache.commons.dbcp2.BasicDataSource就可以了。当然如果你愿意把其他几个缺少的jar包补上也可以啦。需要补的jar包分别是:commons-collections-3.1.jar、commons-dbcp-1.2.1.jar、commons-pool-1.2.jar
改完再试,还是不行。缺包,赶紧又把mysql-connector-java-5.1.6-bin.jar拷贝到了apache-activemq-5.13.3/lib。请注意这个jar包,后面也给我填了不小的麻烦。
再试,依然不行。主机名不对,在/etc/hosts里面加上了一句192.168.1.91 t91(t91是我服务器名),原来activemq是通过主机名来获取物理ip的呀。
再试,不行。没找到cluster_jdbc库(jdbc:mysql://192.168.1.94:3306/cluster_jdbc?relaxAutoCommit=true),赶紧自己手动创建。这里要注意,据说数据库要用latin1编码,utf8不行。我一开始就用latin1编码,所以不知道是不是真的,有兴趣的朋友可以试试。
再试,不行。没找到对应表。把 createTablesOnStartup="false" 改成 createTablesOnStartup="true" 这样activemq就会自己去创建表啦。注意啊,等表创建好之后,这里还要再改回createTablesOnStartup="false",否则每次启动activemq时都会尝试创建表。
再执行,表创建成功,一共三个,分别是ACTIVEMQ_ACKS、ACTIVEMQ_LOCK、ACTIVEMQ_MSGS。其中ACTIVEMQ_MSGS是存放代销费消息的,其他两个不知道干什么用的,希望知道的大神给解释一下。现在启动终于正常了。


到这里我送了一口气,觉得后面的应该很轻松了。但可是……可但是……还是继续讲吧。
我的三台active服务器分别是t91(192.168.1.91)、t92(192.168.1.92)、t93(192.168.1.93)。我用java写了个简单的生产者,通过下面代码创建了生产者工厂
ActiveMQConnectionFactory connectionFactory = new ActiveMQConnectionFactory("QXT_SaveMo_QUEUE", "QXT_SaveMo_QUEUE", "failover:(tcp://192.168.1.91:61616,tcp://192.168.1.92:61616,tcp://192.168.1.93:61616)");
然后直接生产了10条消息,在控制台上已经看到了Number Of Pending Messages 变成了10,但是数据库里没有记录。我反复尝试了好久,差不多把activemq.xml里面能改的配置都改过了,但就是保存不到数据库里面。
后来无意间看到自己生产者工厂的方法里有这样一句producer.setDeliveryMode(DeliveryMode.NON_PERSISTENT);
无语了,直接粘过来的代码,都没好好看一眼。赶紧改成producer.setDeliveryMode(DeliveryMode.PERSISTENT);再启动生产者,插入数据库成功了。
下面就要测试主从服务器切换了。直到此时才有时间仔细观察了一下active的主从机制。主服务启动时通过配置文件中的useDatabaseLock="true"独占服务器,据说不这样设置在保存数据时会报数据主键重复异常。我没有测试过,
主服务与数据库建立连接后,从服务器就阻断在链接数据库的环节,直到主服务与数据库连接中断,从服务器就会接替主服务工作与数据库建立连接。这样看起来从服务有两台就够,只要不同时挂掉就能保证运行了。
原理是明白了,但是在切换主从服务器时报mysql语法错误。这个语句实在activemq内部执行的,又不是我写的怎么会有语法错误呢?
又是一通检查,最后发现activemq创建的表里面OPTION SQL_SELECT_LIMIT=10包含了mysql关键字,而我用的mysql-connector-java-5.1.6-bin.jar版本比较低,不能自动处理语句中的关键字。于是赶紧升级到mysql-connector-java-5.1.39-bin.jar。问题解决。
再做主从切换测试,一切正常了。

猜你喜欢

转载自blog.csdn.net/ziele_008/article/details/51859638