zoukankan      html  css  js  c++  java
  • RockerMQ介绍 及搭建双master模式

    一.RocketMQ介绍

    1.1 简介

    RocketMQ 是一款分布式、队列模型的消息中间件,具有以下特点:

    能够保证严格的消息顺序

    提供丰富的消息拉取模式

    高效的订阅者水平扩展能力

    实时的消息订阅机制

    亿级消息堆积能力

    选用理由:

    • 强调集群无单点,可扩展,任意一点高可用,水平可扩展
    • 海量消息堆积能力,消息堆积后,写入低延迟
    • 支持上万个队列
    • 消息失败重试机制
    • 消息可查询
    • 开源社区活跃
    • 成熟的

    1.2 关键概念

    1.2.1 主题与标签

      主题Topic:第一级消息类型,书的标题

      标签Tags: 第二级消息类型,书的目录,可以基于Tag做消息过滤

      例如:

      主题:

        订单交易

      标签:

        订单交易-创建

        订单交易-付款

        订单交易-完成

    1.2.2 发送与订阅群组

    生产组:用于消息的发送

    消费组:用于消息的订阅处理

    生产组和消费组,方便扩缩机器,增减处理能力,集群组的名字,用于标记用途中的一员。每次只会随机的发给每个集群中的一员。

    二、RocketMQ集群方式

    推荐的几种 Broker 集群部署方式,这里的Slave 不可写,但可读,类似于 Mysql 主备方式。

    2.1 单个Master

      这种方式风险较大,一旦Broker重启或者宕机时,会导致整个服务不可用,不建议线上环境使用

    2.2 多master模式

      一个集群无Slave,全是master,例如2个master或者3个master

      优点:配置简单,单个Master宕机或重启维护对应用无影响,在磁盘配置为RAID10时,及时机器宕机不可回复的情况下,由于RAID10磁盘非常可靠,消息也不会丢(异步刷盘丢失少量消息,同步刷盘一条不丢)性能最高。

      缺点:单台机器宕机期间,这台机器上未被消费的消息在机器恢复之前不可订阅,消息实时性会收到影响。

      ###先启动NameServer

      ###在机器A,启动第一个Master

      ###在机器B,启动第二个Master

    2.3 多Master多Slave模式,异步复制

      每个Master配置一个Slave,有多对Master-Slave,HA采用异步复制方式,主备有短暂消息延迟,毫秒级。

      优点:即使磁盘损坏,消息丢失的非常少,且消息实时性不会受影响,因为Master宕机后,消费者仍然可以从Slave消息,此过程对应用透明,不需要人工干预,性能同多Master模式几乎一样。

      缺点:Master宕机,磁盘损坏情况,会丢失少量消息

      ### 先启动 NameServer

      ### 在机器 A,启动第一个 Master

      ### 在机器 B,启动第二个 Master

      ### 在机器 C,启动第一个 Slave

      ### 在机器 D,启动第二个 Slave

    2.4 多Master多Slave模式,同步双写

      每个 Master 配置一个 Slave,有多对Master-Slave,HA 采用同步双写方式,主备都写成功,向应用返回成功。

      优点:数据与服务都无单点,Master宕机情况下,消息无延迟,服务可用性与 数据可用性都非常高

      缺点:性能比异步复制模式略低,大约低 10%左右,发送单个消息的 RT 会略高。目前主宕机后,备机不能自动切换为主机,后续会支持自动切换功能 。

      ### 先启动 NameServer

      ### 在机器 A,启动第一个 Master

      ### 在机器 B,启动第二个 Master

      ### 在机器 C,启动第一个 Slave

      ### 在机器 D,启动第二个 Slave

      以上 Broker 与 Slave 配对是通过指定相同的brokerName 参数来配对,Master 的 BrokerId 必须是 0,Slave 的BrokerId 必须是大与 0 的数。另外一个 Master 下面可以挂载多个 Slave,同一 Master 下的多个 Slave通过指定不同的 BrokerId 来区分。

    三、RocketMQ部署【双master模式】

    3.1 服务器环境

    序号  IP 用户名 密码 角色 模式
    1 192.168.1.114 root   nameServer1,brokerServer1 master
    2 192.168.2.2 root   nameServer1,brokerServer1 master

    3.2 Hosts添加信息

    IP NAME
    192.168.1.114 rocketmq-nameserver1
    192.168.1.114 rocketmq-master1
    192.168.2.2 rocketmq-nameserver2
    192.168.2.2 rocketmq-master2

    通过ssh链接,修改linux服务器相关信息;

    #  vi /etc/hosts  

    添加相应信息后,保存退出

    3.3 上传解压【两台机器】

    上传alibaba-rocketmq-3.2.6.tar.gz 文件至/usr/local

    解压文件到执行目录

    #  tar -zxvf alibaba-rocketmq-3.2.6.tar.gz -C /usr/local

    重命名 增加版本号,方便日后整理

    #  mv alibaba-rocketmq alibaba-rocketmq-3.2.6

    创建软连接,这边没有-s 就是创建硬连接

    #  ln -s alibaba-rocketmq-3.2.6 rocketmq

    # ll .usr/local    查看文件,会看到软连接标识

    3.4 创建存储路径【两台机器】

    # mkdir /usr/local/rocketmq/store

    # mkdir /usr/local/rocketmq/store/commitlog

    # mkdir /usr/local/rocketmq/store/consumequeue

    # mkdir /usr/local/rocketmq/store/index

     3.5 RocketMQ配置文件【两台机器】

    # vim /usr/local/rocketmq/conf/2m-noslave/broker-a.properties

    # vim /usr/local/rocketmq/conf/2m-noslave/broker-b.properties

    删除原配置,复制下面的配置,粘贴后,进行相应的修改,然后保存退出 

    #所属集群名字
    brokerClusterName=rocketmq-cluster
    #broker名字,注意此处不同的配置文件填写的不一样,a.properties,就写broker-a,b的就填写b
    brokerName=broker-a|broker-b
    #0 表示 Master,>0 表示 Slave
    brokerId=0
    #nameServer地址,分号分割
    namesrvAddr=rocketmq-nameserver1:9876;rocketmq-nameserver2:9876
    #在发送消息时,自动创建服务器不存在的topic,默认创建的队列数
    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

     3.6 修改日志配置文件【两台机器】

    #  mkdir -p /usr/local/rocketmq/logs

    #  cd /usr/local/rocketmq/conf && sed -i 's#${user.home}#/usr/local/rocketmq#g' *.xml

     3.7 修改启动脚本参数【两台机器】

     #  vim /usr/local/rocketmq/bin/runbroker.sh

    这边由于机器的硬件配置不够,所以采用最低配置,注意的是 -Xms -Xmx 不能低于1g 

    # vim /usr/local/rocketmq/bin/runserver.sh

    3.8 启动NameServer【两台机器】

    # cd /usr/local/rocketmq/bin

    # nohup sh mqnamesrv &

    可以输入命令 jps  可以查看到 

    NamesrvStartup  

    在这里注意:如果jdk是sun jdk,同时也配置了JAVA_HOME,那么现在问题应该不大。如果是openjdk,这个在平时用的时候,不配JAVA_HOME也是可以用的,但是因为rocketmq是纯java编的,所以必须配置JAVA_HOME。一般openjdk默认安装的位置在/usr/lib/jvm/java-8-openjdk-amd64,在这个目录下看到bin目录下有javac文件,就说明这就是JDK了。编辑/etc/profile或者/root/.bashrc
    export JAVA_HOME=/usr/lib/jvm/java-8-openjdk-amd64
    export CLASSPATH=.:$JAVA_HOME/jre/lib/rt.jar:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar 
    export PATH=$PATH:$JAVA_HOME/bin

    如果执行bash mqnamesrv还是报错:"Please set the JAVA_HOME variable in your environment, We need java(x64)!"
    查看runserver.sh文件:

    [ ! -e "$JAVA_HOME/bin/java" ] && JAVA_HOME=$HOME/jdk/java
    [ ! -e "$JAVA_HOME/bin/java" ] && JAVA_HOME=/opt/taobao/java
    [ ! -e "$JAVA_HOME/bin/java" ] && error_exit "Please set the JAVA_HOME variable in your environment, We need java(x64)!"

    这个位置,没有用全部注释掉添加[ ! -e "$JAVA_HOME/bin/java" ] && JAVA_HOME=/usr/lib/jvm/java-8-openjdk-amd64。当然删了也没有问题。

    效果如下:

    #[ ! -e "$JAVA_HOME/bin/java" ] && JAVA_HOME=$HOME/jdk/java
    #[ ! -e "$JAVA_HOME/bin/java" ] && JAVA_HOME=/opt/taobao/java
    #[ ! -e "$JAVA_HOME/bin/java" ] && error_exit "Please set the JAVA_HOME variable in your environment, We need java(x64)!"  
    [ ! -e "$JAVA_HOME/bin/java" ] && JAVA_HOME=/usr/lib/jvm/java-8-openjdk-amd64

    3.9 启动BrokerServer A 【192.168.1.114】

    # cd /usr/local/rocketmq/bin

    # nohup sh mqbroker -c /usr/local/rocketmq/conf/2m-noslave/broker-a.properties >/dev/null 2>&1 &

    # netstat -ntlp

    # jps

    # tail -f -n 500 /usr/local/rocketmq/logs/rocketmqlogs/broker.log

    # tail -f -n 500 /usr/local/rocketmq/logs/rocketmqlogs/namesrv.log

    3.10 启动BrokerServer B 【192.168.2.2】

    # cd /usr/local/rocketmq/bin

    # nohup sh mqbroker -c /usr/local/rocketmq/conf/2m-noslave/broker-b.properties >/dev/null 2>&1 &

    # netstat -ntlp

    # jps

    # tail -f -n 500 /usr/local/rocketmq/logs/rocketmqlogs/broker.log

    # tail -f -n 500 /usr/local/rocketmq/logs/rocketmqlogs/namesrv.log

    3.11 部署RocketMQ Console

    wget https://github.com/duomu/rocketmq-console/raw/master/rocketmq-console.war 下载

    也可以复制后面这个地址直接下载,完成后

    将rocketmq-console.war 部署到tomcat上,启动之前,修改war包中的WEB-INFclasses的config.properties文件里面的配置,

    我这边将配置修改成:

    rocketmq.namesrv.addr=192.168.2.2:9876;192.168.1.114:9876

    然后启动tomcat,查看tomcat的启动日志

    然后浏览器访问控制台,我这边项目是部署在192.168.1.114:10000

    这样环境就搭建完成了,后面,就是编写HelloWorld。

  • 相关阅读:
    Linux小命了(6)cd
    Linux小命令(5)mkdir
    性能测试(1)-开篇杂谈
    Linux小命令(4)ls
    Linux小命令(3)cat
    Linux小命令(2)man
    机器学习-学习方法
    flask-cache
    mysql 常用时间函数
    发现变化,拥抱变化
  • 原文地址:https://www.cnblogs.com/shmilyToHu/p/8875521.html
Copyright © 2011-2022 走看看