从零搭建 RocketMQ Dledger集群(公网服务器)

1:先介绍环境:

  • 3台个人云服务器 A(20)阿里云 B(37)腾讯云 C(44) 腾讯云
    操作系统版本:CentOS 7.7 64位 RocketMQ版本:4.8
    20 这台作为Master 37、44作为Slave
    开放端口:8090(对应运维页面),30911,30921,30931 9876

2:每台服务器安装 jdk

https://blog.csdn.net/publicv/article/details/103948599 之前写过的安装jdk教程

3:每台服务器安装 RocketMQ

(1):rocketmq 下载 官网下载链接

在这里插入图片描述
在这里插入图片描述

(2):下载到本地 ,通过Xftp 上传至 服务器 /opt 路径

在这里插入图片描述

(3):解压zip ,然后放入 /usr/local 路径下

unzip rocketmq-all-4.8.0-bin-release.zip
mv rocketmq-all-4.8.0-bin-release  /usr/local/
cd /usr/local/rocketmq-all-4.8.0-bin-release/

(4):修改 NameServer JVM 参数(配置高可以不用此步骤)


cd bin
vim runserver.sh

# 定位到如下代码
JAVA_OPT="${JAVA_OPT} -server -Xms4g -Xmx4g -Xmn2g -XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=320m"

# 修改 "-Xms -Xmx -Xmn" 参数
JAVA_OPT="${JAVA_OPT} -server -Xms512M -Xmx512M -Xmn256M -XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=320m"

这里修改 JVM 参数主要目的是我的服务器内存不够,默认 NameServer 会占用 4G。

(5):启动 NameServer

nohup sh ./bin/mqnamesrv &
查看日志,确认是否成功
tail -f ~/logs/rocketmqlogs/namesrv.log

在这里插入图片描述

(6):修改 Broker 的配置文件

vim conf/broker.conf
# 使用如下配置文件
brokerClusterName = DefaultCluster
brokerName = broker-a
brokerId = 0
deleteWhen = 04
fileReservedTime = 48
brokerRole = ASYNC_MASTER
flushDiskType = ASYNC_FLUSH
storePathRootDir=/data/rocketmq/store
storePathCommitLog=/data/rocketmq/store/commitlog
namesrvAddr=你的服务器外网ip:9876
autoCreateTopicEnable=true
aclEnable=true
brokerIP1=你的服务器外网ip

缺少storePathRootDir(用于存储数据) 和storePathCommitLog(日志) 文件夹 创建一下

mkdir -p /data/rocketmq/store/commitlog
mkdir -p /data/rocketmq/store/consumequeue

(7):修改 Broker JVM参数(配置高可以不用此步骤)

cd bin
vim runbroker.sh 
#修改如下配置(配置前)
JAVA_OPT="${JAVA_OPT} -server -Xms8g -Xmx8g -Xmn4g"
#配置后
JAVA_OPT="${JAVA_OPT} -server -Xms1g -Xmx1g -Xmn512m"

(8):启动 Broker

nohup ./bin/mqbroker -n localhost:9876 -c conf/broker.conf &
查看日志,确认是否成功
tail -f ~/logs/rocketmqlogs/broker.log

在这里插入图片描述

4:修改配置文件为Dledger 高可用集群模式

(生产中应该将 NameServer 部署到其他服务器中,在这为了方便,与Broker部署在一起)

(1):先将每台服务器原来单机模式的关闭服务

sh bin/mqshutdown broker
sh bin/mqshutdown namesrv

在这里插入图片描述

(2):A(20)阿里云 作为Master

vim conf/dledger/broker-n0.conf
# Broker所属哪个集群
brokerClusterName = RaftCluster
# Broker名称
brokerName=RaftNode00
listenPort=30911
#你设置的NameServer地址和端口
namesrvAddr=服务器1:9876;服务器2:9876;服务器3:9876
# 存储消息以及一些配置信息的根目录
storePathRootDir=/tmp/rmqstore/node00
storePathCommitLog=/tmp/rmqstore/node00/commitlog
enableDLegerCommitLog=true
dLegerGroup=RaftNode00
# n0 n1 n2 分别对应 broker1 broker2 broker3
dLegerPeers=n0-服务器1:40911;n1-服务器2:40912;n2-服务器3:40913
# 此节点选择的是n0
dLegerSelfId=n0
# 发送消息线程池数量  建议和服务器cpu核数一致
sendMessageThreadPoolNums=2
# 指定当前节点的IP ,没配置在外网会尝试用内网连接其他节点。内网环境可不配置
brokerIP1=服务器1

(2):B(37)腾讯云 作为Slave C(44) 腾讯云 作为Slave

B(37)腾讯云 作为Slave 配置文件选择broker-n1.conf ,配置内容在Master的基础上修改 port和 dlegerId 和 brokerIP1 不可重复

vim conf/dledger/broker-n1.conf
# 节点端口
listenPort=30921
# dLegerId
dLegerSelfId=n1
# 指定当前节点的IP ,没配置在外网会尝试用内网连接其他节点。内网环境可不配置
brokerIP1=服务器2

C(44)腾讯云 作为Slave 配置文件选择broker-n2.conf ,配置内容在Master的基础上修改 port和 dlegerId 和 brokerIP1 不可重复

vim conf/dledger/broker-n2.conf
# 节点端口
listenPort=30931
# dLegerId
dLegerSelfId=n2
# 指定当前节点的IP ,没配置在外网会尝试用内网连接其他节点。内网环境可不配置
brokerIP1=服务器3

(2): 依次启动集群

需要注意下,将已经启动的 NameServer 和 Broker关闭

A(20)阿里云执行

nohup sh bin/mqnamesrv > nohubNameserv &
nohup sh bin/mqbroker  > nohubBroker -c conf/dledger/broker-n0.conf &

B(37)腾讯云执行

nohup sh bin/mqnamesrv > nohubNameserv &
nohup sh bin/mqbroker  > nohubBroker -c conf/dledger/broker-n1.conf &

C(44) 腾讯云执行

nohup sh bin/mqnamesrv > nohubNameserv &
nohup sh bin/mqbroker  > nohubBroker -c conf/dledger/broker-n2.conf &

查看集群情况

sh bin/mqadmin clusterList -n 127.0.0.1:9876

在这里插入图片描述
这么看不太明显 ,官方提供了个运维页面,为了方便演示 。 我已经编译好了。jar端口是8090
链接: RokcetMQ-Console
提取码:csdn
在这里插入图片描述
在这里插入图片描述

(3): kill 主Broker ,再次查看集群情况

在这里插入图片描述

等待大约几秒后 ,主Broker 自动切换到了 44这台slave节点上
在这里插入图片描述

5:期间遇到的一些坑

  1. 节点之间不在共一个内网环境下 ,需要设置 brokerIP1=当前服务器ip 。不然会莫名其妙的报错 127开头的连接不上
  2. listenPort=30911 这个端口不能重复,也不能和下面的 dLegerPeers=n0-服务器1:40911;n1-服务器2:40912;n2-服务器3:40913配置一样
  3. 单机搭建下,大多数报错的原因是 配置不够导致的 ,还有文件夹目录找不到
  4. 外网情况下,防火墙要关闭,端口要开放 例如 30911 30921 30931 等
  5. 启动时查看 broker 为什么报错 命令:sh bin/mqbroker -c conf/broker.conf &
  6. sendDefaultImpl call timeout; nested exception is org.apache.rocketmq.remoting.exception.RemotingToo 导致原因是:broker.conf 没有配置 brokerIP1=服务器外网 ip
  7. accessKey 和 secretKey 必须大于 6 位,两个都必须大于 6 位不只是密码大于 6 位
  8. 关闭命令:sh mqshutdown broker sh mqshutdown namesrv

6:acl 和 spring boot 如何接入

  1. 关于plain_acl.yml 的配置 在这里插入图片描述
    10.控制台编译前的配置 在这里插入图片描述
    jar 包
        <dependency>
            <groupId>org.apache.rocketmq</groupId>
            <artifactId>rocketmq-spring-boot-starter</artifactId>
            <version>2.3.0</version>
        </dependency>

yml 配置

rocketmq:
  name-server: mq 服务外网 ip:9876
  producer:
    group: my-producer-group
    access-key: 配置的公钥
    secret-key: 配置的密钥
    send-message-timeout: 3000 # 发送消息超时时间,单位:毫秒。默认为 3000 。
    compress-message-body-threshold: 4096 # 消息压缩阀值,当消息体的大小超过该阀值后,进行消息压缩。默认为 4 * 1024B
    max-message-size: 4194304 # 消息体的最大允许大小。。默认为 4 * 1024 * 1024B
    retry-times-when-send-failed: 2 # 同步发送消息时,失败重试次数。默认为 2 次。
    retry-times-when-send-async-failed: 2 # 异步发送消息时,失败重试次数。默认为 2 次。
    retry-next-server: false # 发送消息给 Broker 时,如果发送失败,是否重试另外一台 Broker 。默认为 false
    enable-msg-trace: true # 是否开启消息轨迹功能。默认为 true 开启。可阅读 https://github.com/apache/rocketmq/blob/master/docs/cn/msg_trace/user_guide.md 文档
    customized-trace-topic: RMQ_SYS_TRACE_TOPIC # 自定义消息轨迹的 Topic 。默认为 RMQ_SYS_TRACE_TOPIC 。
  consumer:
    access-key: 配置的公钥
    secret-key: 配置的密钥
    listeners: # 配置某个消费分组,是否监听指定 Topic 。结构为 Map<消费者分组, <Topic, Boolean>> 。默认情况下,不配置表示监听。
      erbadagang-consumer-group:
        topic1: false # 关闭 test-consumer-group 对 topic1 的监听消费
    group: my-producer-group

生产者

@Service
public class TestProducer {
    @Autowired
    private RocketMQTemplate rocketMQTemplate;

    public void sendMsg (String topic, Object body) {
        Message<Object> build = MessageBuilder.withPayload(body).build();
        rocketMQTemplate.send(topic,build);
    }
}

消费者

@Slf4j
@Service
@RocketMQMessageListener(topic = "和 Producer一致的 topic",consumerGroup = "my-producer-group")
public class TestConsumer implements RocketMQListener<MqDTO>{
    @Override
    public void onMessage(MqDTO message) {
        log.info("收到消息了", JSON.toJSONString(message));
    }
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值