环境准备
- activemq-5.16.2 安装包
- 3台安装了 jdk1.8 的 centos 7.5 服务器
- 1台安装了 mysql 的服务器 ( 基于 jdbc 的集群方案)
- 3台安装了 zookeeper 的服务器集群 (基于 zookeeper + 可复制的 LevelDB 的集群方案)
服务器IP
服务器 | IP | 域名 |
---|---|---|
mysql-130 | 192.168.86.130 | |
zk-100 | 192.168.86.100 | zk-100.com |
zk-101 | 192.168.86.101 | zk-101.com |
zk-102 | 192.168.86.102 | zk-102.com |
activemq-155 | 192.168.86.155 | activemq-155.com |
activemq-156 | 192.168.86.156 | activemq-156.com |
activemq-157 | 192.168.86.157 | activemq-157.com |
基于 jdbc 的集群方案
-
不特殊说明情况下,以下所有操作均在三台 activemq 服务器上操作
-
上传安装包到服务器的 /opt 目录
-
解压安装包,并且移动到 /usr/local 目录
cd /opt tar -zxvf apache-activemq-5.16.2-bin.tar.gz mv apache-activemq-5.16.2 /usr/local/apache-activemq-5.16.2
-
修改 activemq.xml 配置
cd /usr/local/apache-activemq-5.16.2/conf vi activemq.xml
-
在 节点后面增加数据源配置,内容如下:
<!-- 这里使用了activemq 自带的连接池,可以根据需要配置为其它连接池,但注意要在 /usr/local/apache-activemq-5.16.2/lib 引入相关连接池的包 --> <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://192.168.86.130/activemq?relaxAutoCommit=true"/> <property name="username" value="root"/> <property name="password" value="root"/> <property name="maxTotal" value="200"/> <property name="poolPreparedStatements" value="true"/> </bean>
-
修改
里面的内容,修改之后内容如下: <persistenceAdapter> <jdbcPersistenceAdapter dataDirectory="${activemq.data}" dataSource="#mysql-ds" /> </persistenceAdapter>
-
-
修改 jetty.xml 以便其它机器可以访问到 8161 前台管理界面
vi /usr/local/apache-activemq-5.16.2/conf/jetty.xml 找到 <bean id="jettyPort" ... 的节点,修改 host 参数从 127.0.0.1到 0.0.0.0
-
上传 mysql-connector-java-8.0.20.jar 到 /usr/local/apache-activemq-5.16.2/lib 目录下 (如果使用了其它连接池,则一并上传)
-
在数据库中创建一个 activemq 的数据库
create database activemq
-
启动
cd /usr/local/apache-activemq-5.16.2/bin ./activemq start
-
查看数据库是否自动生成了3张表
activemq_acks:订阅表
activemq_lock:用于记录当前哪台机器获取到了锁
activemq_msgs:持久化消息的存放表
-
查看日志
cd /usr/local/apache-activemq-5.16.2/data tail -1000 activemq.log
会发现除了master 之外,其它的两台 slave 都在尝试获取数据库锁
-
访问前台管理界面,会发现只有 master可以正常访问,其余两台 slave均无法访问
-
此时关闭 master,两台 slave 中一台会获取到锁,进而成为 master
基于 zookeeper + 可复制的 LevelDB 的集群部署
-
不特殊说明情况下,以下所有操作均在三台 activemq 服务器上操作
-
上传安装包到服务器的 /opt 目录
-
解压安装包,并且移动到 /usr/local 目录
cd /opt tar -zxvf apache-activemq-5.16.2-bin.tar.gz mv apache-activemq-5.16.2 /usr/local/apache-activemq-5.16.2
-
修改 activemq.xml 配置
cd /usr/local/apache-activemq-5.16.2/conf vi activemq.xml
-
修改
节点的 brokerName属性,三台机器需要完全一样 -
修改
里面的内容,每台机器的 hostname 需要修改为自己的 ,修改之后内容如下: <!-- directory: 数据文件存放目录; replicas: 集群中节点数量,不能少于3; bind: 当此节点成为主节点时,它将绑定配置的地址和端口来为复制协议提供服务,支持动态端口;hostname:当此节点成为主节点时用于通告复制服务的主机名,支持自动获取 --> <persistenceAdapter> <replicatedLevelDB directory="${activemq.data}" replicas="3" bind="tcp://0.0.0.0:0" zkAddress="zk-100.com:2181,zk-101.com:2181,zk-102.com:2181" zkPath="/activemq/leveldb-stores" hostname="activemq-155.com" /> </persistenceAdapter>
-
修改 jetty.xml 以便其它机器可以访问到 8161 前台管理界面
vi /usr/local/apache-activemq-5.16.2/conf/jetty.xml 找到 <bean id="jettyPort" ... 的节点,修改 host 参数从 127.0.0.1到 0.0.0.0
-
-
为了解决后续集群启动之后关闭之后出现的报错,可以先上传 failureaccess-1.0.1 jar包 到 /usr/local/apache-activemq-5.16.2/lib 目录下,可以等到后面真正报错的时候再执行
-
启动
cd /usr/local/apache-activemq-5.16.2/bin ./activemq start
-
查看日志
cd /usr/local/apache-activemq-5.16.2/data tail -1000 activemq.log
如果只启动了一台的话,日志如下:
如果启动两台到三台,会发现 slave 会从 master 中同步数据:
-
查看 zookeeper
前台管理界面也只有 master 机器能够访问,关闭 master 之后,其中一个 slave 变为 master
常见问题
-
基于 jdbc 的集群启动时,抛出了 Cannot create PoolableConnectionFactory 以下异常:
解决:在mysql 数据库中执行以下操作
set time_zone=SYSTEM; set global time_zone='+8:00'; flush privileges;
-
基于 zookeeper 的集群,master 宕机之后,集群启动报错:java.io.IOException:com/google/common/util/concurrent/internal/InternalFutureFailureAccess
解决:上传 failureaccess-1.0.1 jar包