编译和构建

准备工作

  • Java JDK 1.7 或 1.8
  • Maven 3.3+

从源码包构建

  • 编译和打包:
  1. mvn clean package -DskipTests
  • (可选)使用Docker编译:
  1. docker run -v REPLACE_WITH_SOURCE_PATH:/tubemq apachetubemq/tubemq-build clean package -DskipTests
  • 单元测试:
  1. mvn test
  • 单独对每个 module 进行构建:
  1. mvn clean install
  2. cd module-name (比如: tubemq-client)
  3. mvn test

构建完成之后,在 tubemq-server/target 目录下会有 tubemq-server-[TUBEMQ-VERSION]-bin.tar.gz 文件。 这是 TubeMq 的部署包,包含了脚本、配置文件、依赖以及 web GUI相关的内容。

配置IDE开发环境

在IDE中构建和调试源码,需要先运行以下命令:

  1. mvn compile

执行之后,会生成 protoc 文件对应的 java source file,位于 target/generated-sources 目录。

(可选)如果你打算使用本地的 protoc 可执行文件,你可以修改 tubemq-core/pom.xml 下的 protobuf-maven-plugin 的配置,如下所示。

  1. <configuration>
  2. <outputDirectory>${project.build.directory}/generated-sources/java</outputDirectory>
  3. <protocExecutable>/usr/local/bin/protoc</protocExecutable>
  4. </configuration>

部署运行

部署TubeMQ Standalone

Standalone模式可以在一个容器中启动zookeeper/master/broker服务:

  1. docker run -p 8080:8080 -p 8000:8000 -p 8123:8123 --name tubemq -d apachetubemq/tubemq-all:latest

容器拉起后,可在浏览器访问http://127.0.0.1:8080,然后参考下面快速使用部分开始使用。

注意:Standalone模式只可用于开发和体验,不可作为生产集群。

部署TubeMQ集群

准备工作

选择安装路径后,安装包解压后的目录结构如下:

  1. /INSTALL_PATH/tubemq-server-[TUBEMQ-VERSION]-bin/
  2. ├── bin
  3. ├── conf
  4. ├── lib
  5. ├── logs
  6. └── resources

配置示例

TubeMQ 集群包含有两个组件: MasterBroker. Master 和 Broker 可以部署在相同或者不同的节点上。下面是 一个集群的配置示例:

RoleTCP PortTLS PortWeb PortComment
Master809981998080元数据存储在 /stage/metadata
Broker812381248081消息存储在 /stage/msgdata
Zookeeper2181Offset 存储在 /tubemq

配置Master

编辑conf/master.ini,根据集群信息变更以下配置项

  • Master IP和端口
  1. [master]
  2. hostName=YOUR_SERVER_IP // 替换为当前主机IP
  3. port=8000
  4. webPort=8080
  • 访问授权Token
  1. confModAuthToken=abc // 该token用于页面配置、API调用等
  • ZooKeeper集群地址
  1. [zookeeper]
  2. zkNodeRoot=/tubemq
  3. zkServerAddr=localhost:2181 // 指向zookeeper集群,多个地址逗号分开
  • 配置Replication策略
  1. [replication]
  2. repNodeName=tubemqMasterGroupNode1 // 每个master节点需使用不同名称
  3. repHelperHost=FIRST_MASTER_NODE_IP:9001 // helperHost用于创建master集群,一般配置第一个master节点ip
  • 前端安装路径

编辑resources/velocity.properties

  1. file.resource.loader.path=/INSTALL_PATH/tubemq-server-[TUBEMQ-VERSION]-bin/resources/templates
  • (可选)生产环境,多master HA级别
HA级别Master数量描述
3 masters任何主节点崩溃后,集群元数据仍处于读/写状态,可以接受新的生产者/消费者。
2 masters一个主节点崩溃后,集群元数据处于只读状态。对现有的生产者和消费者没有任何影响。
1 master主节点崩溃后,对现有的生产者和消费者没有影响。

注意:需保证Master所有节点之间的时钟同步

配置Broker

编辑conf/broker.ini,根据集群信息变更以下配置项

  • Broker IP和端口
  1. [broker]
  2. brokerId=0
  3. hostName=YOUR_SERVER_IP // 替换为当前主机IP,broker目前只支持IP
  4. port=8123
  5. webPort=8081
  • Master地址
  1. masterAddressList=MASTER_NODE_IP:8000 //多个master以逗号分隔
  • 数据目录
  1. primaryPath=/stage/msgdata
  • ZooKeeper集群地址
  1. [zookeeper]
  2. zkNodeRoot=/tubemq
  3. zkServerAddr=localhost:2181 // 指向zookeeper集群,多个地址逗号分开

启动Master

进入Master节点的 bin 目录下,启动服务:

  1. ./tubemq master start

访问Master的管控台 http://YOUR_MASTER_IP:8080 ,页面可查则表示master已成功启动:

TubeMQ Console GUI

配置Broker元数据

Broker启动前,首先要在Master上配置Broker元数据,增加Broker相关的管理信息。在Broker List 页面, Add Single Broker,然后填写相关信息:

Add Broker 1

需要填写的内容包括:

  1. broker IP: broker server ip
  2. authToken: conf/master.ini 文件中 confModAuthToken 字段配置的 token

然后上线Broker:

Add Broker 2

启动Broker

进入broker节点的 bin 目录下,执行以下命令启动Broker服务:

  1. ./tubemq broker start

刷新页面可以看到 Broker 已经注册,当 当前运行子状态idle 时, 可以增加topic。

Add Broker 3

快速使用

新增 Topic

可以通过 web GUI 添加 Topic, 在 Topic列表页面添加,需要填写相关信息,比如增加demo topic:

Add Topic 1

然后选择部署 Topic 的 Broker

Add Topic 5

此时 Broker的 可发布可订阅 依旧是灰色的

Add Topic 6

需要在 Broker列表页面重载Broker 配置

Add Topic 2

Add Topic 3

之后就可以在页面查看Topic信息。

Add Topic 4

运行Example

可以通过上面创建的demo topic来测试集群。

  • 生产消息

YOUR_MASTER_IP 替换为实际的IP,然后运行producer:

  1. install_path=/INSTALL_PATH/tubemq-server-[TUBEMQ-VERSION]-bin
  2. java -Dlog4j.configuration=file:${install_path}/conf/tools.log4j.properties \
  3. -Djava.net.preferIPv4Stack=true -cp ${install_path}/lib/*:${install_path}/conf/* \
  4. org.apache.tubemq.example.MessageProducerExample \
  5. YOUR_MASTER_IP:8000 demo 100000

如果能观察下如下日志,则表示数据发送成功:

  1. [2020-06-04 11:19:04,405] INFO Send demo 1000 message, keyCount is 252 (org.apache.tubemq.example.MessageProducerExample)
  2. [2020-06-04 11:19:04,652] INFO Send demo 2000 message, keyCount is 502 (org.apache.tubemq.example.MessageProducerExample)
  3. [2020-06-04 11:19:05,096] INFO Send demo 3000 message, keyCount is 752 (org.apache.tubemq.example.MessageProducerExample)
  4. [2020-06-04 11:19:05,181] INFO Send demo 4000 message, keyCount is 1002 (org.apache.tubemq.example.MessageProducerExample)
  • 消费消息

YOUR_MASTER_IP 替换为实际的IP,然后运行Consumer:

  1. install_path=/INSTALL_PATH/tubemq-server-[TUBEMQ-VERSION]-bin
  2. java -Xmx512m -Dlog4j.configuration=file:${install_path}/conf/tools.log4j.properties \
  3. -Djava.net.preferIPv4Stack=true -cp ${install_path}/lib/*:${install_path}/conf/* \
  4. org.apache.tubemq.example.MessageConsumerExample \
  5. YOUR_MASTER_IP:8000 demo demoGroup 3 1 1

如果能观察下如下日志,则表示数据被消费者消费到:

  1. [2020-06-04 11:20:29,107] INFO Receive messages:270000 (org.apache.tubemq.example.MsgRecvStats)
  2. [2020-06-04 11:20:31,206] INFO Receive messages:272500 (org.apache.tubemq.example.MsgRecvStats)
  3. [2020-06-04 11:20:31,590] INFO Receive messages:275000 (org.apache.tubemq.example.MsgRecvStats)
  4. [2020-06-04 11:20:31,910] INFO Receive messages:277500 (org.apache.tubemq.example.MsgRecvStats)