1、环境准备
4台机器,2台部署NameServer,4台部署Broker,双主双从 同步复制,异步刷盘。
192.168.1.38 nameServer Broker-a
192.168.1.39 nameServer Broker-a-s
192.168.1.40 Broker-b
192.168.1.41 Broker-b-s
2、修改内存
#进入该目录
cd /usr/local/rocketmq/distribution/target/apache-rocketmq/bin
#如果NameServer Broker报内存错误 那么修改NameServer Broker的内存
vim runserver.sh
JAVA_OPT="${JAVA_OPT} -server -Xms256m -Xmx256m -Xmn256m -XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=320m"
vim runbroker.sh
JAVA_OPT="${JAVA_OPT} -server -Xms528m -Xmx528m -Xmn256m"
3、修改配置文件
3.1、192.168.1.38 修改broker-a配置文件
cd /usr/local/rocketmq/distribution/target/apache-rocketmq/conf/2m-2s-sync
vim broker-a.properties
#寻找NameServer
namesrvAddr=192.168.1.38:9876;192.168.1.39:9876
#集群名称
brokerClusterName=DefaultCluster
#brokername,从节点根据brokerName找主节点
brokerName=broker-a
#brokerID,0是主节点
brokerId=0
#删除时间为每天凌晨4点
deleteWhen=04
#保存时间48小时
fileReservedTime=48
#broker关系
#ASYNC_MASTER:异步复制
#SYNC_MASTER:同步双写
brokerRole=SYNC_MASTER
#刷盘方式
#- ASYNC_FLUSH 异步刷盘
#- SYNC_FLUSH 同步刷盘
flushDiskType=ASYNC_FLUSH
#存储路径
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
3.2、192.168.1.39修改broker-a-s配置文件
cd /usr/local/rocketmq/distribution/target/apache-rocketmq/conf/2m-2s-sync
vim broker-a-s.properties
namesrvAddr=192.168.1.38:9876;192.168.1.39:9876
brokerClusterName=DefaultCluster
#找brokerName
brokerName=broker-a
#brokerID 为1是从节点
brokerId=1
deleteWhen=04
fileReservedTime=48
brokerRole=SLAVE
flushDiskType=ASYNC_FLUSH
#存储路径
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
3.3、192.168.1.40 修改broker-b主节点
cd /usr/local/rocketmq/distribution/target/apache-rocketmq/conf/2m-2s-sync
vim broker-b.properties
namesrvAddr=192.168.1.38:9876;192.168.1.39:9876
brokerClusterName=DefaultCluster
brokerName=broker-b
brokerId=0
deleteWhen=04
fileReservedTime=48
brokerRole=SYNC_MASTER
flushDiskType=ASYNC_FLUSH
#存储路径
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
3.4、192.168.1.41 修改broker-b-s 从节点
cd /usr/local/rocketmq/distribution/target/apache-rocketmq/conf/2m-2s-sync
vim broker-b-s.properties
namesrvAddr=192.168.1.38:9876;192.168.1.39:9876
brokerClusterName=DefaultCluster
brokerName=broker-b
brokerId=1
deleteWhen=04
fileReservedTime=48
brokerRole=SLAVE
flushDiskType=ASYNC_FLUSH
#存储路径
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
4、启动NameServer
#38,39两台机器:
cd /usr/local/rocketmq/distribution/target/apache-rocketmq/bin
nohup sh ./mqnamesrv >/dev/null 2>&1 &
5、启动broker
#38 39 40 41
cd /usr/local/rocketmq/distribution/target/apache-rocketmq/bin
nohup sh ./mqbroker -c ../conf/2m-2s-sync/broker-a.properties >/dev/null 2>&1 &
nohup sh ./mqbroker -c ../conf/2m-2s-sync/broker-a-s.properties >/dev/null 2>&1 &
nohup sh ./mqbroker -c ../conf/2m-2s-sync/broker-b.properties >/dev/null 2>&1 &
nohup sh ./mqbroker -c ../conf/2m-2s-sync/broker-b-s.properties >/dev/null 2>&1 &
6、控制台
cd /usr/local/rocketmq-console/src/main/resources
vim application.properties
rocketmq.config.namesrvAddr=192.168.1.38:9876;192.168.1.39:9876
7、启动
nohup java -jar rocketmq-console-ng-1.0.1.jar 1>/dev/null 2>&1 &
8、测试程序
8.1、pom
<dependencies>
<dependency>
<groupId>org.apache.rocketmq</groupId>
<artifactId>rocketmq-client</artifactId>
<version>4.4.0</version>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.6</version>
</dependency>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
<version>3.8.1</version>
</dependency>
</dependencies>
8.2、Consts
public class RocketMQConsts {
//=========================Hello RocketMQ==========================
public static final String HELLO_TOPIC = "helloTopic";
public static final String HELLO_GROUP_PROVIDER = "helloGroupProvider";
public static final String HELLO_TAG = "helloTag";
public static final String HELLO_KEY = "helloKey";
public static final String HELLO_NAMESERVER = "192.168.1.38:9876;192.168.1.39:9876";
public static final String HELLO_GROUP_CUSTOMER = "helloGroupCustomer";
}
8.3、Producer
public class RocketMQProducer {
public static void main(String[] args) throws Exception {
//创建producer,设置NameServer地址, 关闭rocketmq 虚拟IP
DefaultMQProducer producer = new DefaultMQProducer(RocketMQConsts.HELLO_GROUP_PROVIDER);
producer.setNamesrvAddr(RocketMQConsts.HELLO_NAMESERVER);
producer.start();
for (int i = 1; i <= 10; i++) {
Message msg = new Message(RocketMQConsts.HELLO_TOPIC, RocketMQConsts.HELLO_TAG, RocketMQConsts.HELLO_KEY, "HELLO MSG".getBytes());
SendResult send = producer.send(msg);
System.out.println(send);
}
producer.shutdown();
}
}
8.4、Custsomer
public class RocketMQCustomer {
public static void main(String[] args) {
DefaultMQPushConsumer consumer = new DefaultMQPushConsumer();
//配置组名 IP
consumer.setNamesrvAddr(RocketMQConsts.HELLO_NAMESERVER);
consumer.setConsumerGroup(RocketMQConsts.HELLO_GROUP_CUSTOMER);
//最后偏移量读取消息
consumer.setConsumeFromWhere(ConsumeFromWhere.CONSUME_FROM_LAST_OFFSET);
try {
//订阅主题,监听主题下哪些标签
consumer.subscribe(RocketMQConsts.HELLO_TOPIC, "*");
consumer.registerMessageListener(new MessageListenerOrderly() {
@Override
public ConsumeOrderlyStatus consumeMessage(List<MessageExt> msgs, ConsumeOrderlyContext context) {
Message msg = msgs.get(0);
try {
System.out.println(Thread.currentThread().getName() + "receive msg: " + new String(msg.getBody(), "utf-8"));
return ConsumeOrderlyStatus.SUCCESS;
} catch (Exception e) {
e.printStackTrace();
//等会在消费
return ConsumeOrderlyStatus.SUSPEND_CURRENT_QUEUE_A_MOMENT;
}
}
});
//开始
consumer.start();
} catch (MQClientException e) {
e.printStackTrace();
}
}
}
8.5、运行消费者 运行生产者