RocketMQ环境搭建 *此教程不是docker安装,如linux系统已安装docker,在rocketmq搭建好之后,会使用docker的ip地址,而不是linux系统的ip,因此会造成错误,本人试了把docker卸载还是使用docker的ip,只好重装虚拟机在搭建,结果成功*
1.下载源码包 地址 http://rocketmq.apache.org/docs/quick-start/
unzip rocketmq-all-4.4.0-source-release.zip cd rocketmq-all-4.4.0/ mvn -Prelease-all -DskipTests clean install -U cd distribution/target/apache-rocketmq 使用maven打包源码包 完成后在distribution/target/apache-rocketmq目录下找到生成的文件
2.修改linux Hosts vi /etc/hosts
添加
192.168.6.129 rocketmq-nameserver1
192.168.6.129 rocketmq-master1
nameserver和master映射关系
3.建立RocketMQ目录
mkdir /usr/local/apache-rocketmq cp apache-rocketmq.tar.gz /usr/local/apache-rocketmq cd /usr/local/apache-rocketmq tar -zxvf apache-rocketmq.tar.gz ln -s ./../apache-rocketmq rocketmq
4.创建存储路径 mkdir /usr/local/rocketmq/store mkdir /usr/local/rocketmq/store/commitlog mkdir /usr/local/rocketmq/store/consumequeue mkdir /usr/local/rocketmq/store/index
5.修改RocketMQ配置文件 vi /usr/local/rocketmq/conf/2m-2s-async/broker-a.properties
内容如下
集群名称
#所属集群名字
brokerClusterName=rocketmq-cluster
#broker名字,注意此处不同的配置文件填写的不一样 例如:在a.properties 文件中写 broker-a 在b.properties 文件中写 broker-b
brokerName=broker-a
#0 表示 Master,>0 表示 Slave
brokerId=0
#nameServer地址,这里nameserver是单台,如果nameserver是多台集群的话,就用分号分割(即namesrvAddr=ip1:port1;ip2:port2;ip3:port3或者修改hosts文件不使用IP而是域名)
namesrvAddr=rocketmq-nameserver1:9876;rocketmq-nameserver2:9876
#在发送消息时,自动创建服务器不存在的topic,默认创建的队列数。由于是4个broker节点,所以设置为4
defaultTopicQueueNums=4
#是否允许 Broker 自动创建Topic,建议线下开启,线上关闭
autoCreateTopicEnable=true
#是否允许 Broker 自动创建订阅组,建议线下开启,线上关闭
autoCreateSubscriptionGroup=true
#Broker 对外服务的监听端口
listenPort=10911
#删除文件时间点,默认凌晨 4点
deleteWhen=04
#文件保留时间,默认 48 小时
fileReservedTime=120
#commitLog每个文件的大小默认1G
mapedFileSizeCommitLog=1073741824
#ConsumeQueue每个文件默认存30W条,根据业务情况调整
mapedFileSizeConsumeQueue=300000
#destroyMapedFileIntervalForcibly=120000
#redeleteHangedFileInterval=120000
#检测物理文件磁盘空间
diskMaxUsedSpaceRatio=88
#存储路径
storePathRootDir=/usr/local/rocketmq/store
#commitLog 存储路径
storePathCommitLog=/usr/local/rocketmq/store/commitlog
#消费队列存储路径存储路径
storePathConsumeQueue=/usr/local/rocketmq/store/consumequeue
#消息索引存储路径
storePathIndex=/usr/local/rocketmq/store/index
#checkpoint 文件存储路径
storeCheckpoint=/usr/local/rocketmq/store/checkpoint
#abort 文件存储路径
abortFile=/usr/local/rocketmq/store/abort
#限制的消息大小
maxMessageSize=65536
#flushCommitLogLeastPages=4
#flushConsumeQueueLeastPages=2
#flushCommitLogThoroughInterval=10000
#flushConsumeQueueThoroughInterval=60000
#Broker 的角色
#- ASYNC_MASTER 异步复制Master
#- SYNC_MASTER 同步双写Master
#- SLAVE
brokerRole=ASYNC_MASTER
#刷盘方式
#- ASYNC_FLUSH 异步刷盘
#- SYNC_FLUSH 同步刷盘
flushDiskType=ASYNC_FLUSH
#checkTransactionMessageEnable=false
#发消息线程池数量
#sendMessageThreadPoolNums=128
#拉消息线程池数量
#pullMessageThreadPoolNums=128
6.修改日志文件路径 mkdir -p /usr/local/rocketmq/logs cd /usr/local/rocketmq/conf sed -i 's#${user.home}#/usr/local/rocketmq#g' *.xml
7.修改启动脚本参数(主要防止配置内存过大,本地机器内存不够用,生产另说) vi /usr/local/rocketmq/bin/runbroker.sh 修改jvm内存为最大,最小,新生代为1g vi /usr/local/rocketmq/bin/runserver.sh 修改jvm内存为最大,最小,新生代为1g
8.启动 cd /usr/local/rocketmq/bin/ 先启动 NameServer nohup sh mqnamesrv &
再启动 broker nohup sh mqbroker -c /usr/local/rocketmq/conf/2m-2s-async/broker-a.properties > /dev/null 2>&1 &
9.查看日志 broker 日志 tail -f /usr/local/rocketmq/logs/rocketmqlogs/broker.log tail -f /usr/local/rocketmq/logs/rocketmqlogs/namesrv.log
RocketMQ生产者使用
public static void main(String[] args) throws MQClientException, RemotingException, InterruptedException, MQBrokerException {
DefaultMQProducer producer = new DefaultMQProducer("testQuickStart");
producer.setNamesrvAddr(Const.NAME_SERVER_ADDR);
producer.start();
for (int i = 0; i < 5; i++) {
Message message = new Message("test_quick_topic", "TagA", "Keys" + i, ("Hello RocketMQ" + i).getBytes());
SendResult res = producer.send(message);
System.out.println("消息发送结果" + res);
}
producer.shutdown();
}
}
运行代码可以发现Topic和Queue是一对多的关系,一个Topic发送多条消息会落到不同queueId的队列中去
消费端:
public class Consumer {
public static void main(String[] args) throws MQClientException {
DefaultMQPushConsumer consumer = new DefaultMQPushConsumer("test_quick_consumer_name");
consumer.setNamesrvAddr(Const.NAME_SERVER_ADDR);
consumer.setConsumeFromWhere(ConsumeFromWhere.CONSUME_FROM_LAST_OFFSET);
consumer.subscribe("test_quick_topic", "*");
consumer.registerMessageListener(new MessageListenerConcurrently() {
@Override
public ConsumeConcurrentlyStatus consumeMessage(List<MessageExt> list, ConsumeConcurrentlyContext consumeConcurrentlyContext) {
MessageExt messageExt = list.get(0);
try {
String topic = messageExt.getTopic();
String msgId = messageExt.getMsgId();
String body = new String(messageExt.getBody(), RemotingHelper.DEFAULT_CHARSET);
System.out.println("topic " + topic + " msgId " + msgId + " body " + body);
int i = 1 / 0;
} catch (Exception e) {
e.printStackTrace();
int reconsumeTimes = messageExt.getReconsumeTimes();
System.out.println("reconsumeTimes " + reconsumeTimes);
if (reconsumeTimes == 3) {
return ConsumeConcurrentlyStatus.CONSUME_SUCCESS;
}
return ConsumeConcurrentlyStatus.RECONSUME_LATER;
}
return ConsumeConcurrentlyStatus.CONSUME_SUCCESS;
}
});
consumer.start();
}
可以看到RocketMQ会有自动重试机制,在捕获异常时RocketMQ Broker可以进行消息重发。
至此,完成了单机RocketMQ的搭建和简单生产者消费者的demo运行。
RocketMQ主从搭建
**RocketMQ-四种集群环境构建**
1.单点模式
2.主从模式 主节点消息收发,同步到从节点,主节点挂了,从节点可以保证消息不丢失
3.双主模式
4.双主双从模式,多主多从模式
主要使用2和4两种
主从模式集群构建
保障消息的即时性和可靠性并存
投递一条消息后,关闭主节点,故障演练,数据一致性能否保证
(同步刷盘和异步刷盘)
从节点可以继续提供消费者继续消费,不能接收消息
主节点重新上线后进行消费进度的offset同步
开始构建主从模式架构 1.在构建过的虚拟机中修改配置 vi /etc/hosts
192.168.6.129 rocketmq-nameserver1
192.168.6.129 rocketmq-master1
192.168.6.130 rocketmq-nameserver2
192.168.6.130 rocketmq-master1-slave1
两台机器都配置hosts如上
2.修改129服务上/usr/local/rocketmq/conf/2m-2s-async目录中的broker-a-s.properties配置文件,slave机器修改配置文件如下
#所属集群名字
brokerClusterName=rocketmq-cluster
#broker名字,注意此处不同的配置文件填写的不一样 例如:在a.properties 文件中写 broker-a 在b.properties 文件中写 broker-b
brokerName=broker-a
#0 表示 Master,>0 表示 Slave
brokerId=1
#nameServer地址,这里nameserver是单台,如果nameserver是多台集群的话,就用分号分割(即namesrvAddr=ip1:port1;ip2:port2;ip3:port3或者修改hosts文件不使用IP而是域名)
namesrvAddr=rocketmq-nameserver1:9876;rocketmq-nameserver2:9876
#在发送消息时,自动创建服务器不存在的topic,默认创建的队列数。由于是4个broker节点,所以设置为4
defaultTopicQueueNums=4
#是否允许 Broker 自动创建Topic,建议线下开启,线上关闭
autoCreateTopicEnable=true
#是否允许 Broker 自动创建订阅组,建议线下开启,线上关闭
autoCreateSubscriptionGroup=true
#Broker 对外服务的监听端口
listenPort=10911
#删除文件时间点,默认凌晨 4点
deleteWhen=04
#文件保留时间,默认 48 小时
fileReservedTime=120
#commitLog每个文件的大小默认1G
mapedFileSizeCommitLog=1073741824
#ConsumeQueue每个文件默认存30W条,根据业务情况调整
mapedFileSizeConsumeQueue=300000
#destroyMapedFileIntervalForcibly=120000
#redeleteHangedFileInterval=120000
#检测物理文件磁盘空间
diskMaxUsedSpaceRatio=88
#存储路径
storePathRootDir=/usr/local/rocketmq/store
#commitLog 存储路径
storePathCommitLog=/usr/local/rocketmq/store/commitlog
#消费队列存储路径存储路径
storePathConsumeQueue=/usr/local/rocketmq/store/consumequeue
#消息索引存储路径
storePathIndex=/usr/local/rocketmq/store/index
#checkpoint 文件存储路径
storeCheckpoint=/usr/local/rocketmq/store/checkpoint
#abort 文件存储路径
abortFile=/usr/local/rocketmq/store/abort
#限制的消息大小
maxMessageSize=65536
#flushCommitLogLeastPages=4
#flushConsumeQueueLeastPages=2
#flushCommitLogThoroughInterval=10000
#flushConsumeQueueThoroughInterval=60000
#Broker 的角色
#- ASYNC_MASTER 异步复制Master
#- SYNC_MASTER 同步双写Master
#- SLAVE
brokerRole=SLAVE
#刷盘方式
#- ASYNC_FLUSH 异步刷盘
#- SYNC_FLUSH 同步刷盘
flushDiskType=ASYNC_FLUSH
#checkTransactionMessageEnable=false
#发消息线程池数量
#sendMessageThreadPoolNums=128
#拉消息线程池数量
#pullMessageThreadPoolNums=128
复制上述两个文件到130服务器的对应目录下
scp broker-a.properties broker-a-s.properties 192.168.6.130:/usr/local/rocketmq/conf/2m-2s-async/
3.增加相关日志信息配置,详见Rocket单机的环境配置
第一台机器启动NameServer nohup sh mqnamesrv & 第一台机器启动Broker nohup sh mqbroker -c /usr/local/rocketmq/conf/2m-2s-async/broker-a.properties > /dev/null 2>&1 &
第一台机器启动NameServer nohup sh mqnamesrv & 第二台机器启动Broker nohup sh mqbroker -c /usr/local/rocketmq/conf/2m-2s-async/broker-a-s.properties > /dev/null 2>&1 &
值得注意的是放火墙需要打开10912端口,HA主要使用该端口同步数据。 查看防火墙端口是否打开 firewall-cmd --query-port=10912/tcp
(1)首先启动完成master和slave (2)用Producer发送消息到集群 (3)将主节点关闭,模拟主节点宕机 (4)Consumer启动之后还是能消费到Producer发送的数据 (5)再次启动Master节点,没有消费到新的数据 证明主从架构能够保证主节点宕机之后,能够保证数据不丢失。具备高可用特性,可避免单点故障。
</div>
</div>
</div>