zoukankan      html  css  js  c++  java
  • 搭建RocketMQ集群

    一、环境及准备

    集群环境:

    软件版本:

    部署前操作:

    关闭防火墙,关闭selinux(生产环境按需关闭或打开)
    同步服务器时间,选择公网ntpd服务器或者自建ntpd服务器
    [root@es1 ~]# crontab -l #为了方便直接使用公网服务器
    #update time
    */5 * * * *  /usr/bin/rdate -s time-b.nist.gov &>/dev/null

    安装配置Java环境

    配置hosts

    127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
    ::1         localhost localhost.localdomain localhost6 localhost6.localdomain6
    172.16.150.134 rocketmq-nameserver1
    172.16.150.134 rocketmq-master1
    172.16.150.135 rocketmq-nameserver2
    172.16.150.135 rocketmq-master2
    172.16.150.136 rocketmq-nameserver3
    172.16.150.136 rocketmq-master3

    二、RocketMQ简介

    1.集群方式:

    单Master方式

    风险比较大, 一旦Broker重启或者宕机, 将导致整个环境不可用, 不建议线上使用.

    多Master模式

    一个集群中没有slave, 全是master, 例如2个master或者3个master. 
    优点:配置简单, 性能最好,单个Master宕机或重启对应用无影响, 磁盘配置为RAID10时, 即使机器宕机不可恢复, 由于RAID10磁盘非常可靠, 消息也不会丢(异步刷盘丢失少量信息, 同步刷盘一条不丢) 
    缺点 : 单台机器宕机期间, 这个机器上未被消费消息在机器恢复之前不可订阅, 消息实时性受到影响 .

    多Master多Slave模式, 异步复制

    每个 Master 配置一个 Slave,有多对Master-Slave,采用异步复制方式,主备有短暂消息延迟,毫秒级。 
    优点:即使磁盘损坏,消息丢失的非常少,且消息实时性不会受影响,因为Master 宕机后,消费者仍然可以从 Slave消费,此过程对应用透明。不需要人工干预。性能同Master 模式几乎一样。 
    缺点:Master 宕机,磁盘损坏情况,会丢失少量消息。

    多Master多Slave模式, 同步双写

    每个 Master 配置一个 Slave,有多对Master-Slave,采用同步双写方式,主备都写成功,向应用返回成功。 
    优点:数据与服务都无单点,Master宕机情况下,消息无延迟,服务可用性与数据可用性都非常高 
    缺点:性能比异步复制模式略低,大约低 10%左右,发送单个消息的 RT会略高。目前主宕机后,备机不能自动切换为主机,后续会支持自动切换功能。

    2.名词解释

    NameServer

    NameServer顾名思义,在系统中肯定是做命名服务,服务治理方面的工作,功能应该是和zookeeper差不多,据说RocketMq的早期版本确实是使用的zookeeper,后来改为了自己实现的NameServer。
    NameServer在RocketMQ中的两个主要作用:
      NameServer维护了一份Broker的地址列表和,broker在启动的时候会去NameServer进行注册,会维护Broker的存活状态。
      NameServer维护了一份Topic和Topic对应队列的地址列表,broker每次发送心跳过来的时候都会把Topic信息带上。
    
    NameServer的稳定性非常高。原因有二:
      NameServer互相独立,彼此没有通信关系,单台NameServer挂掉,不影响其他NameServer,即使全部挂掉,也不影响业务系统使用。无状态。
      NameServer不会有频繁的读写,所以性能开销非常小,稳定性很高。

    Broker

    broker是消息接收处理,落地的核心模块。这个模块用于接收producer发送的消息以及consumer。
    与NameServer关系
    
    连接
      单个broker和所有nameServer保持长连接
    
    心跳
      心跳间隔:每隔30秒(此时间无法更改)向所有nameserver发送心跳,心跳包含了自身的topic配置信息。
      心跳超时:nameserver每隔10秒钟(此时间无法更改),扫描所有还存活的broker连接,若某个连接2分钟内(当前时间与最后更新时间差值超过2分钟,此时间无法更改)没有发送心跳数据,则断开连接。
    
    断开
      时机:broker挂掉;心跳超时导致nameserver主动关闭连接
      动作:一旦连接断开,nameserver会立即感知,更新topc与队列的对应关系,但不会通知生产者和消费者
    
    负载均衡
      一个topic分布在多个broker上,一个broker可以配置多个topic,它们是多对多的关系。
      如果某个topic消息量很大,应该给它多配置几个队列,并且尽量多分布在不同broker上,减轻某个broker的压力。
      topic消息量都比较均匀的情况下,如果某个broker上的队列越多,则该broker压力越大。

     三、RocketMQ集群部署(多master方式)

    1.下载软件(这里采用二进制安装,由于是实验环境,所以安装的版本为最新版本,如果生产不建议使用最新版本,但是建议使用4.3+版本,4.3之后RocketMQ开始支持事务)

    [root@rocketmq-master1 ~]#  wget http://mirrors.tuna.tsinghua.edu.cn/apache/rocketmq/4.5.1/rocketmq-all-4.5.1-bin-release.zip

    2.解压RocketMQ

    [root@rocketmq-master1 ~]#unzip rocketmq-all-4.5.1-bin-release.zip
    [root@rocketmq-master1 ~]#mv rocketmq-all-4.5.1-bin-release /usr/local
    [root@rocketmq-master1 ~]#cd /usr/local
    [root@rocketmq-master1 local]#ln -sv rocketmq-all-4.5.1-bin-release  rocketmq

    3.创建相关数据及日志目录

    mkdir -p /mnt/store/{commitlog,consumequeue,index,logs}

    4.目录解析(根据部署的架构进入对应的目录)

    [root@rocketmq-master1 local]# cd rocketmq/conf/
    [root@rocketmq-master1 conf]# ll
    总用量 36
    drwxr-xr-x 2 root root   118 2019-03-28 17:08 2m-2s-async  #多主多从异步刷新参考配置文件
    drwxr-xr-x 2 root root   118 2019-03-28 17:08 2m-2s-sync  #多主多从同步刷新参考配置文件
    drwxr-xr-x 2 root root   118 2019-06-04 10:10 2m-noslave  #多master参考配置文件
    ....
    [root@rocketmq-master1 conf]# cd 2m-noslave/ #由于我们使用的是多master架构,进入2m-noslave目录

    5.创建配置文件

    #所属集群名字
    brokerClusterName=rocketmq-cluster
    #broker名字,注意此处不同的配置文件填写的不一样,a.properties,就写broker-a,b的就填写b
    brokerName=broker-a
    #0 表示 Master,>0 表示 Slave
    brokerId=0
    #nameServer地址,分号分割
    namesrvAddr=rocketmq-nameserver1:9876;rocketmq-nameserver2:9876;rocketmq-nameserver3: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=/mnt/store
    #commitLog 存储路径
    storePathCommitLog=/mnt/store/commitlog
    #消费队列存储路径存储路径
    storePathConsumeQueue=/mnt/store/consumequeue
    #消息索引存储路径
    storePathIndex=/mnt/store/index
    #checkpoint 文件存储路径
    storeCheckpoint=/mnt/store/checkpoint
    #abort 文件存储路径
    abortFile=/mnt/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
    brokerIP1=172.16.150.134 #绑定本地IP,如果主机有多块网卡则需要配置,否则报错

    拷贝配置文件(注意要修改brokerName的名称)

    [root@rocketmq-master1 2m-noslave]# cp broker-a.properties broker-b.properties   #第二台配置文件,注意要修改brokerName的名称和绑定地址  !!!
    [root@rocketmq-master1 2m-noslave]# cp broker-a.properties broker-c.properties   #第三台配置文件  
    [root@rocketmq-master1 2m-noslave]# scp broker-a.properties broker-b.properties broker-c.properties 172.16.150.135:/usr/local/rocketmq/conf/
    [root@rocketmq-master1 2m-noslave]# scp broker-a.properties broker-b.properties broker-c.properties 172.16.150.136:/usr/local/rocketmq/conf/

    6.修改log路径

    [root@rocketmq-master1 2m-noslave]# cd ..
    [root@rocketmq-master1 conf]# pwd
    /usr/local/rocketmq/conf
    [root@rocketmq-master1 conf]#  sed -i 's#${user.home}#/mnt#g' *.xml   #默认位置为用户家目录下logs目录

    7.修改服务启动脚本参数 

    [root@rocketmq-master1 conf]# cd ../bin/
    [root@rocketmq-master1 bin]# pwd
    /usr/local/rocketmq/bin
    [root@rocketmq-master1 bin]# vim runbroker.sh  

    [root@rocketmq-master1 bin]# vim runserver.sh 

    8.先启动nameserver服务(必须)

    [root@rocketmq-master1 bin]# nohup sh mqnamesrv &
    [root@rocketmq-master1 logs]# cd /mnt/logs/rocketmqlogs/
    [root@rocketmq-master1 rocketmqlogs]# tailf namesrv.log 

    9.启动broker服务

    [root@rocketmq-master1 bin]#nohup sh mqbroker -c /usr/local/rocketmq/conf/2m-noslave/broker-a.properties  &  #注意,每台服务启动时指定的配置文件也要同时改变
    [root@rocketmq-master2 bin]# nohup sh mqbroker -c /usr/local/rocketmq/conf/2m-noslave/broker-b.properties  &
    [root@rocketmq-master3 bin]# nohup sh mqbroker -c /usr/local/rocketmq/conf/2m-noslave/broker-c.properties  &
    
    [root@rocketmq-master1 bin]# tailf /mnt/logs/rocketmqlogs/broker.log  
    [root@rocketmq-master1 bin]# tailf /mnt/logs/rocketmqlogs/broker.log

     四、部署rockmq-console

    Git地址:https://github.com/apache/rocketmq-externals/tree/release-rocketmq-console-1.0.0

    [root@rocketmq-master1 bin]#cd /mnt/
    [root@rocketmq-master1 mnt]#git clone -b release-rocketmq-console-1.0.0 https://github.com/apache/rocketmq-externals.git
    [root@rocketmq-master1 mnt]# cd /mnt/rocketmq-externals/rocketmq-console/src/main/resources
    [root@rocketmq-master1 resources]#vim application.properties 

     编辑配置文件,按照实际情况修改

    编译源代码(需要maven环境)

    [root@rocketmq-master1 resources]# cd /mnt/rocketmq-externals/rocketmq-console/
    [root@rocketmq-master1 rocketmq-console]# mvn clean package -Dmaven.test.skip=true

    启动服务

    [root@rocketmq-master1 rocketmq-console]# cd target/
    [root@rocketmq-master1 target]# java -jar target/rocketmq-console-ng-1.0.0.jar

    浏览器访问

    编译过程中出现的报错:

    -source 1.6 中不支持 diamond 运算符
    [ERROR] (请使用 -source 7 或更高版本以启用 diamond 运算符)

    解决方法:pom.xml的plugins下添加:

    在pom.xml的plugins下添加以下内容(全部内容):

    <plugin>
      <groupId>org.apache.maven.plugins</groupId>
      <artifactId>maven-compiler-plugin</artifactId>
      <version>2.3.2</version>
      <configuration>
        <source>1.8</source>
        <target>1.8</target>
      </configuration>
    </plugin>

    拷贝时注意中文空格,否则会报错

    或者使用容器的方式部署,步骤如下:

    docker pull styletang/rocketmq-console-ng
    docker run -d -e "JAVA_OPTS=-Drocketmq.namesrv.addr=127.0.0.1:9876 -Dcom.rocketmq.sendMessageWithVIPChannel=false" -p 8080:8080 -t styletang/rocketmq-console-ng   #将127.0.0.1修改为nameserver地址

    如果当前环境已经存在rockmq,且为3.x版本时,使用最新的console时,在页面会有部分信息不展示,可以使用对应版本的console,下面的链接为3.2.6版本,使用Tomcat部署即可

    步骤:

    1.unzip解压war包 -d指定到某个目录,
    2.进入解压目录下WEB-INF/classes/目录中
    3.修改config.properties配置文件,添加name server地址
    格式IP(域名):port  如果有多个,已;为分割
    4将目录移动到Tomcat docBase目录下,并启动
    链接:https://pan.baidu.com/s/10NeEeBH8eugdYcDn6e02aQ  提取码:aq1t 

    打开的界面略有不同,如下图

    注意事项:

    1.配置文件名称和服务器对应,a:master1 b:master2 ..
    2.注意不同主机配置文件名称不同,brokerNam也不同
    3.每台briker服务启动时,注意要指定正确的配置文件
    4.建议生产每个服务使用screen命令启动,不要使用nohup

    参考文档:

    https://github.com/apache/rocketmq-externals/tree/release-rocketmq-console-1.0.0/rocketmq-console

    https://github.com/apache/rocketmq-externals/blob/master/rocketmq-console/doc/1_0_0/UserGuide_CN.md

    http://rocketmq.apache.org/docs/quick-start/

    https://juejin.im/post/5a911ea16fb9a0633f0e36a1

    https://blog.csdn.net/sybnfkn040601/article/details/64920062

    https://www.cnblogs.com/buyige/p/9437054.html

  • 相关阅读:
    Android 开发转型前端准备知识
    atom写文档技巧
    gerrit升级到16.04之后连接不到服务器
    adb shell am pm
    ArrayList和LinkedList的区别
    Android源码编译
    Android动态加载代码技术
    File 与 FileStream 文件运用
    物体在一定范围自有碰撞
    扫描二维码加载网页图片
  • 原文地址:https://www.cnblogs.com/panwenbin-logs/p/11003241.html
Copyright © 2011-2022 走看看