• RocketMQ的介绍和环境搭建


    一、介绍

    我也不知道是啥,知道有什么用、怎么用就行了,说到mq(MessageQueue)就是消息队列,队列是先进先出的一种数据结构,但是RocketMQ不一定是这样,简单的理解一下,就是临时存储的数据的一个临时仓库,货送到了就行了

    作用一般有三个

    1. 异步:服务器把客户端请求放到RocketMQ,服务器就可以继续处理其它请求,RocketMQ可以按照自己的规则推送到对应的服务器进行处理
    2. 解耦:比如订单服务和库存服务直接,如果不用队列,下单必须等库存响应才能返回,这样依赖性太强,服务中间加入中间件可以降低服务直接的依赖
    3. 削峰:洪峰流量时,大量请求涌入,如果处理不过来服务器就容易瘫痪,就像处理水患一样,中间挖一个坑蓄水,RocketMQ就相当于这个坑,再把消息发到对应的下游服务器

    二、单机部署

    RocketMQ下载地址:下载 | RocketMQ

    对bin目录下的runserver.sh和runbroker.sh两个脚本进行一下修改,主要是jvm的的内存参数设置

    1. vim runserver.sh
    2. # 找到choose_gc_options 根据jdk版本配置合适的内存大小
    3. JAVA_OPT="${JAVA_OPT} -server -Xms512m -Xmx512m -Xmn256m -XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=320m"
    4. vim runbroker.sh
    5. # 找到choose_gc_options 根据jdk版本配置合适的内存大小
    6. JAVA_OPT="${JAVA_OPT} -Xmn512m -XX:+UseConcMarkSweepGC -XX:+UseCMSCompactAtFullCollection -XX:CMSInitiatingOccupancyFraction=70 -XX:+CMSParallelRemarkEnabled -XX:SoftRefLRUPolicyMSPerMB=0 -XX:+CMSClassUnloadingEnabled -XX:SurvivorRatio=8 -XX:-UseParNewGC"
    7. JAVA_OPT="${JAVA_OPT} -server -Xms1g -Xmx1g"

    1、启动nameserver服务

    1. cd /usr/local/rocketmq/rocketmq-all-5.0.0-bin-release
    2. # 后台启动
    3. nohup bin/mqnamesrv &
    4. # 查看是否启动成功
    5. less nohup.out
    6. # 查看java进程NamesrvStartup服务
    7. jps

    2、启动broker服务

    配置环境遍历NAMESRV_ADDR 

    1. vi ~/.profile
    2. #最后一行添加如下内容
    3. export NAMESRV_ADDR='localhost:9876'
    4. #source生效
    5. source ~/.profile

    启动broker服务 

    1. cd /usr/local/rocketmq/rocketmq-all-5.0.0-bin-release
    2. vim conf/broker.conf
    3. #在最后一行添加如下 意思是开启自动创建topic
    4. autoCreateTopicEnable=true
    5. #启动broker
    6. nohup bin/mqbroker &
    7. # 查看是否启动成功
    8. less nohup.out
    9. # 查看java进程BrokerStartup服务
    10. jps

    3、关闭

    1)、在实际服务部署时,通常会将RocketMQ的部署地址添加到环境变量当中。例如使用vi ~/.bash_profile指令,添加以下内容。

    export ROCKETMQ_HOME=/app/rocketmq/rocketmq-all-4.9.5-bin-releasePATH=$ROCKETMQ_HOME/bin:$PATHexport PATH

    这样就不必每次进入RocketMQ的安装目录了。直接可以使用mqnamesrv 和mqbroker指令。

    2)、停止RocketMQ服务可以通过mqshutdown指令进行

    mqshutdown namesrv # 关闭nameserver服务

    mqshutdown broker # 关闭broker服务

    4、测试收发消息

    1. #通过指令启动RocketMQ的消息生产者发送消息
    2. bin/tools.sh org.apache.rocketmq.example.quickstart.Producer
    3. #启动消息消费者接收之前发送的消息
    4. bin/tools.sh org.apache.rocketmq.example.quickstart.Consumer

    5、搭建RocketMQ可视化界面

    在RocketMQ下载页找到RocketMQ Dashboard进行源码的下载,解压后在maven环境下进行编译

    mvn clean package -Dmaven.test.skip=true

     编译完成后,在源码的target目录下会生成可运行的jar包rocketmq-dashboard-1.0.0.jar。接下来可以将这个jar包上传到服务器上

    1. cd /usr/local/rocketmq
    2. mkdir rocketmq-dashboard
    3. cd rocketmq-dashboard
    4. #上传文件到此目录后,新建application.yml(如果出现错误可以不添加yml文件)
    5. vim application.yml
    6. application.yml内容如下
    7. rocketmq:
    8. config:
    9. namesrvAddrs:
    10. - 192.168.146.128:9876
    11. #结果启动RocketMQ可视化界面的jar包
    12. java -jar rocketmq-dashboard-1.0.0.jar 1>dashboard.log 2>&1 &

    查看dashboard.log文件们没有报错的情况下访问部署的所在机器的ip:8080(默认)

    三、集群搭建

    如果单节点部署,nameserver或者broker挂了都不能正常访问RocketMQ了,针对这种情况可以基于集群部署,先是对集群做了如下部署规划

    不要想用一台机器来搭建,否则就会出现这个错误

    正式开始,下面开了三台机器,ip依次是192.168.64.133、192.168.64.134、192.168.64.128

    第一步,先按照之前的步骤配置nameserver然后启动
    1. #三台机器启动nameserver都是一样的操作
    2. cd /usr/local/rocketmq/rocketmq-all-4.9.5-bin-release
    3. vim bin/runserver.sh
    4. # 找到choose_gc_options 根据jdk版本配置合适的内存大小
    5. JAVA_OPT="${JAVA_OPT} -server -Xms512m -Xmx512m -Xmn256m -XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=320m"
    6. # 后台启动
    7. nohup bin/mqnamesrv &
    8. # 查看是否启动成功
    9. less nohup.out
    10. # 查看java进程NamesrvStartup服务
    11. jps
    第二步配置并启动broker主从集群

    1)、在192.168.64.133上配置broker-a,修改conf/2m-2s-async/broker-a.properties,把原来的注释掉,添加如下内容

    1. #所属集群名字,名字一样的节点就在同一个集群内
    2. brokerClusterName=rocketmq-cluster
    3. #broker名字,名字一样的节点就是一组主从节点。
    4. brokerName=broker-a
    5. #brokerid,0就表示是Master,>0的都是表示 Slave
    6. brokerId=0
    7. #nameServer地址,分号分割
    8. namesrvAddr=192.168.64.133:9876;192.168.64.134:9876;192.168.64.128:9876
    9. #是否允许 Broker 自动创建Topic,建议线下开启,线上关闭
    10. autoCreateTopicEnable=true
    11. deleteWhen=04
    12. fileReservedTime=120
    13. #存储路径
    14. storePathRootDir=/usr/local/rocketmq/store
    15. storePathCommitLog=/usr/local/rocketmq/store/commitlog
    16. storePathConsumeQueue=/usr/local/rocketmq/store/consumequeue
    17. storePathIndex=/usr/local/rocketmq/store/index
    18. storeCheckpoint=/usr/local/rocketmq/store/checkpoint
    19. abortFile=/usr/local/rocketmq/store/abort
    20. #Broker 的角色
    21. brokerRole=ASYNC_MASTER
    22. flushDiskType=ASYNC_FLUSH
    23. #Broker 对外服务的监听端口
    24. listenPort=10911

    2)、在192.168.64.134上配置broker-a的slave,修改conf/2m-2s-async/broker-a-s.properties,把原来的注释掉,添加如下内容

    1. #所属集群名字,名字一样的节点就在同一个集群内
    2. brokerClusterName=rocketmq-cluster
    3. #broker名字,名字一样的节点就是一组主从节点。
    4. brokerName=broker-a
    5. #brokerid,0就表示是Master,>0的都是表示 Slave
    6. brokerId=1
    7. #nameServer地址,分号分割
    8. namesrvAddr=192.168.64.133:9876;192.168.64.134:9876;192.168.64.128:9876
    9. #是否允许 Broker 自动创建Topic,建议线下开启,线上关闭
    10. autoCreateTopicEnable=true
    11. deleteWhen=04
    12. fileReservedTime=120
    13. #存储路径
    14. storePathRootDir=/usr/local/rocketmq/storeSlave
    15. storePathCommitLog=/usr/local/rocketmq/storeSlave/commitlog
    16. storePathConsumeQueue=/usr/local/rocketmq/storeSlave/consumequeue
    17. storePathIndex=/usr/local/rocketmq/storeSlave/index
    18. storeCheckpoint=/usr/local/rocketmq/storeSlave/checkpoint
    19. abortFile=/usr/local/rocketmq/storeSlave/abort
    20. #Broker 的角色
    21. brokerRole=SLAVE
    22. flushDiskType=ASYNC_FLUSH
    23. #Broker 对外服务的监听端口
    24. listenPort=11011

    3)、在192.168.64.134上配置broker-b,修改conf/2m-2s-async/broker-b.properties,把原来的注释掉,添加如下内容

    1. #所属集群名字,名字一样的节点就在同一个集群内
    2. brokerClusterName=rocketmq-cluster
    3. #broker名字,名字一样的节点就是一组主从节点。
    4. brokerName=broker-b
    5. #brokerid,0就表示是Master,>0的都是表示 Slave
    6. brokerId=0
    7. #nameServer地址,分号分割
    8. namesrvAddr=192.168.64.133:9876;192.168.64.134:9876;192.168.64.128:9876
    9. #是否允许 Broker 自动创建Topic,建议线下开启,线上关闭
    10. autoCreateTopicEnable=true
    11. deleteWhen=04
    12. fileReservedTime=120
    13. #存储路径
    14. storePathRootDir=/usr/local/rocketmq/store
    15. storePathCommitLog=/usr/local/rocketmq/store/commitlog
    16. storePathConsumeQueue=/usr/local/rocketmq/store/consumequeue
    17. storePathIndex=/usr/local/rocketmq/store/index
    18. storeCheckpoint=/usr/local/rocketmq/store/checkpoint
    19. abortFile=/usr/local/rocketmq/store/abort
    20. #Broker 的角色
    21. brokerRole=ASYNC_MASTER
    22. flushDiskType=ASYNC_FLUSH
    23. #Broker 对外服务的监听端口
    24. listenPort=10911

    4)、在192.168.64.133上配置broker-b的slave,修改conf/2m-2s-async/broker-b-s.properties,把原来的注释掉,添加如下内容

    1. #所属集群名字,名字一样的节点就在同一个集群内
    2. brokerClusterName=rocketmq-cluster
    3. #broker名字,名字一样的节点就是一组主从节点。
    4. brokerName=broker-b
    5. #brokerid,0就表示是Master,>0的都是表示 Slave
    6. brokerId=1
    7. #nameServer地址,分号分割
    8. namesrvAddr=192.168.64.133:9876;192.168.64.134:9876;192.168.64.128:9876
    9. #是否允许 Broker 自动创建Topic,建议线下开启,线上关闭
    10. autoCreateTopicEnable=true
    11. deleteWhen=04
    12. fileReservedTime=120
    13. #存储路径
    14. storePathRootDir=/usr/local/rocketmq/storeSlave
    15. storePathCommitLog=/usr/local/rocketmq/storeSlave/commitlog
    16. storePathConsumeQueue=/usr/local/rocketmq/storeSlave/consumequeue
    17. storePathIndex=/usr/local/rocketmq/storeSlave/index
    18. storeCheckpoint=/usr/local/rocketmq/storeSlave/checkpoint
    19. abortFile=/usr/local/rocketmq/storeSlave/abort
    20. #Broker 的角色
    21. brokerRole=SLAVE
    22. flushDiskType=ASYNC_FLUSH
    23. #Broker 对外服务的监听端口
    24. listenPort=11011

    ​ 这样就完成了2主2从集群的配置。配置过程汇总有几个需要注意的配置项:

    • store开头的一系列配置:表示RocketMQ的存盘文件地址。在同一个机器上需要部署多个Broker服务时,不同服务的存储目录不能相同。

    • listenPort:表示Broker对外提供服务的端口。这个端口默认是10911。在同一个机器上部署多个Broker服务时,不同服务占用的端口也不能相同。

    • 如果你使用的是多网卡的服务器,比如阿里云上的云服务器,那么就需要在配置文件中增加配置一个brokerIP1属性,指向所在机器的外网网卡地址。

    第三步,启动broker服务

    在启动之前还是需要配置jvm参数(所有机器都一样)

    1. vim bin/runbroker.sh
    2. JAVA_OPT="${JAVA_OPT} -server -Xms1g -Xmx1g"

    先启动在192.168.64.133的broker-a和broker-b-s服务

    1. cd /usr/local/rocketmq/rocketmq-all-4.9.5-bin-release
    2. nohup bin/mqbroker -c ./conf/2m-2s-async/broker-a.properties &
    3. nohup bin/mqbroker -c ./conf/2m-2s-async/broker-b-s.properties &

    再启动192.168.64.134的broker-b和broker-a-s服务

    1. cd /usr/local/rocketmq/rocketmq-all-4.9.5-bin-release
    2. nohup bin/mqbroker -c ./conf/2m-2s-async/broker-b.properties &
    3. nohup bin/mqbroker -c ./conf/2m-2s-async/broker-a-s.properties &
    第四步,检查broker集群状态
    bin/mqadmin clusterList

    也可以通过rocketmq dashboard查看,我之前添加yml启动报错,不知道怎么回事,欢迎大佬留言解决,其实rocketmq dashboard可以这样配置nameserver的地址

    1. rocketmq:
    2. config:
    3. namesrvAddrs:
    4. - 192.168.64.133:9876
    5. - 192.168.64.134:9876
    6. - 192.168.64.128:9876

    具体查看集群结果就是如图

    ​ 在RocketMQ的这种主从架构的集群下,客户端发送的消息会分散保存到broker-a和broker-b两个服务上,然后每个服务都配有slave服务,可以备份对应master服务上的消息,这样就可以防止单点故障造成的消息丢失问题。 

    有个问题就是主节点挂了,为了保证数据的完整性不会选举新的主节点,因为如果因为网络波动出现脑裂问题很有可能会丢失数据

    把broker-b和broker-a-s也就是把192.168.64.134的broker服务停掉,看下什么状态,操作如下命令

    bin/mqshutdown broker

    四、升级高可用集群

    在Dledger集群中,就不再单独指定各个broker的服务,而是由这些broker服务自行进行选举,产生一个Leader角色的服务,响应客户端的各种请求。而其他的broker服务,就作为Follower角色,负责对Leader上的数据进行备份 

    Dledger集群的选举是通过Raft协议进行的,Raft协议是一种多数同意机制。也就是每次选举需要有集群中超过半数的节点确认,才能形成整个集群的共同决定。同时,这也意味着在Dledger集群中,只要有超过半数的节点能够正常工作,那么整个集群就能正常工作。因此,在部署Dledger集群时,通常都是部署奇数台服务,这样可以让集群的容错性达到最大。

    还是用之前的机器,ip依次是192.168.64.133、192.168.64.134、192.168.64.128

    第一步:部署nameserver

    这一步和之前部署主从集群没有区别,不需要做过多的配置,直接在三台服务器上启动nameserver服务即可。

    第二步:对Broker服务进行集群配置

     在conf/dledger目录下,RocketMQ默认给出了三个配置文件,这三个配置文件可以在单机情况下直接部署成一个具有三个broker服务的Dledger集群,我们只需要按照这个配置进行修改即可。

    注:在RocketMQ运行包的bin/dledger目录下,RocketMQ还提供了一个fast-try.sh脚本。这个脚本会指定conf/deldger目录下的配置文件,直接启动有三个broker服务的Dledger集群。每个集群指定的内存大小占用1G。

    在三台机器的conf/dledger目录下,都创建一个broker.conf文件,对每个broker服务进行配置。

    192.168.64.133的broker.conf配置示例

    1. vim /usr/local/rocketmq/rocketmq-all-4.9.5-bin-release/conf/dledger/broker.conf
    2. # 文件内容如下
    3. brokerClusterName = RaftCluster
    4. brokerName=RaftNode00
    5. listenPort=30911
    6. namesrvAddr=192.168.64.133:9876;192.168.64.134:9876;192.168.64.128:9876
    7. storePathRootDir=/usr/local/rocketmq/storeDledger/
    8. storePathCommitLog=/usr/local/rocketmq/storeDledger/commitlog
    9. storePathConsumeQueue=/usr/local/rocketmq/storeDledger/consumequeue
    10. storePathIndex=/usr/local/rocketmq/storeDledger/index
    11. storeCheckpoint=/usr/local/rocketmq/storeDledger/checkpoint
    12. abortFile=/usr/local/rocketmq/storeDledger/abort
    13. enableDLegerCommitLog=true
    14. dLegerGroup=RaftNode00
    15. dLegerPeers=n0-192.168.64.133:40911;n1-192.168.64.134:40911;n2-192.168.64.128:40911
    16. ## must be unique
    17. dLegerSelfId=n0
    18. sendMessageThreadPoolNums=16

    192.168.64.134的broker.conf配置示例

    1. vim /usr/local/rocketmq/rocketmq-all-4.9.5-bin-release/conf/dledger/broker.conf
    2. # 文件内容如下
    3. brokerClusterName = RaftCluster
    4. brokerName=RaftNode00
    5. listenPort=30911
    6. namesrvAddr=192.168.64.133:9876;192.168.64.134:9876;192.168.64.128:9876
    7. storePathRootDir=/usr/local/rocketmq/storeDledger/
    8. storePathCommitLog=/usr/local/rocketmq/storeDledger/commitlog
    9. storePathConsumeQueue=/usr/local/rocketmq/storeDledger/consumequeue
    10. storePathIndex=/usr/local/rocketmq/storeDledger/index
    11. storeCheckpoint=/usr/local/rocketmq/storeDledger/checkpoint
    12. abortFile=/usr/local/rocketmq/storeDledger/abort
    13. enableDLegerCommitLog=true
    14. dLegerGroup=RaftNode00
    15. dLegerPeers=n0-192.168.64.133:40911;n1-192.168.64.134:40911;n2-192.168.64.128:40911
    16. ## must be unique
    17. dLegerSelfId=n1
    18. sendMessageThreadPoolNums=16

    192.168.64.128的broker.conf配置示例

    1. vim /usr/local/rocketmq/rocketmq-all-4.9.5-bin-release/conf/dledger/broker.conf
    2. # 文件内容如下
    3. brokerClusterName = RaftCluster
    4. brokerName=RaftNode00
    5. listenPort=30911
    6. namesrvAddr=192.168.64.133:9876;192.168.64.134:9876;192.168.64.128:9876
    7. storePathRootDir=/usr/local/rocketmq/storeDledger/
    8. storePathCommitLog=/usr/local/rocketmq/storeDledger/commitlog
    9. storePathConsumeQueue=/usr/local/rocketmq/storeDledger/consumequeue
    10. storePathIndex=/usr/local/rocketmq/storeDledger/index
    11. storeCheckpoint=/usr/local/rocketmq/storeDledger/checkpoint
    12. abortFile=/usr/local/rocketmq/storeDledger/abort
    13. enableDLegerCommitLog=true
    14. dLegerGroup=RaftNode00
    15. dLegerPeers=n0-192.168.64.133:40911;n1-192.168.64.134:40911;n2-192.168.64.128:40911
    16. ## must be unique
    17. dLegerSelfId=n2
    18. sendMessageThreadPoolNums=16

    这里对几个需要重点关注的配置项,做下介绍:

    • enableDLegerCommitLog: 是否启动Dledger。true表示启动

    • namesrvAddr: 指定nameserver地址

    • dLedgerGroup: Dledger Raft Group的名字,建议跟brokerName保持一致。

    • dLedgerPeers: Dledger Group内各个服务节点的地址及端口信息。同一个Group内的各个节点配置必须要保持一致。

    • dLedgerSelfId: Dledger节点ID,必须属于dLedgerPeers中的一个。同一个Group内的各个节点必须不能重复。

    • sendMessageThreadPoolNums:dLedger内部发送消息的线程数,建议配置成cpu核心数。

    • store开头的一系列配置: 这些是配置dLedger集群的消息存盘目录。如果你是从主从架构升级成为dLedger架构,那么这个地址可以指向之前搭建住主从架构的地址。dLedger集群会兼容主从架构集群的消息格式,只不过主从架构的消息无法享受dLedger集群的两阶段同步功能。

    第三步:启动broker服务

    和启动主从架构的broker服务一样,我们只需要在启动broker服务时,指定配置文件即可。在三台服务器上分别执行以下指令,启动broker服务

    1. cd /usr/local/rocketmq/rocketmq-all-4.9.5-bin-release
    2. nohup bin/mqbroker -c conf/dledger/broker.conf &
    第四步:检查集群服务状态

    通过rocketmq dashboard查看

    停掉192.168.64.128之后的dashboard

    不能停了,再停宕机超过半数只剩一台就无法选举产生新的master 

  • 相关阅读:
    深入react源码看setState究竟做了什么?
    学习笔记(15)跨域
    python_剔除符合要求的数据并生成新的文件
    从零到一建设数据中台 - 数据可视化
    知识点滴 - 英语词汇
    Synopsys Sentaurus TCAD系列教程之-Tcl《3》
    读高性能MySQL(第4版)笔记09_创建高性能索引(下)
    linux网络——HTTPS加密原理
    window 11 wsl 安装docker
    易基因 | 简化基因组DNA甲基化测序(RRBS)实验怎么做?
  • 原文地址:https://blog.csdn.net/gp3056/article/details/132897995