• docker进行RocketMq集群部署


    环境:

    (1)Centos7
    (2)JDK1.8
    (3)docker
    (4)rocketmq 4.8

    两台服务器ip
    A:192.168.5.49
    B:192.168.5.50

    集群模式

    1、单节点 :

    优点:本地开发测试,配置简单,同步刷盘消息一条都不会丢
    缺点:不可靠,如果宕机,会导致服务不可用

    2、主从(异步、同步双写) :

    优点:同步双写消息不丢失, 异步复制存在少量丢失 ,主节点宕机,从节点可以对外提供消息的消费,但是不支持写入
    缺点:主备有短暂消息延迟,毫秒级,目前不支持自动切换,需要脚本或者其他程序进行检测然后进行停止broker,
    重启让从节点成为主节点

    3、双主:(我们选择这个)

    优点:配置简单, 可以靠配置RAID磁盘阵列保证消息可靠,异步刷盘丢失少量消息
    缺点: master机器宕机期间,未被消费的消息在机器恢复之前不可消费,实时性会受到影响

    4、双主双从,多主多从模式(异步复制)

    优点:磁盘损坏,消息丢失的非常少,消息实时性不会受影响,Master 宕机后,消费者仍然可以从Slave消费
    缺点:主备有短暂消息延迟,毫秒级,如果Master宕机,磁盘损坏情况,会丢失少量消息

    5、双主双从,多主多从模式(同步双写)

    优点:同步双写方式,主备都写成功,向应用才返回成功,服务可用性与数据可用性都非常高
    缺点:性能比异步复制模式略低,主宕机后,备机不能自动切换为主机

    概念

    rocketmq分为Name Server和Broker Server

    名字服务(Name Server)

    名称服务充当路由消息的提供者。生产者或消费者能够通过名字服务查找各主题相应的Broker IP列表。多个Namesrv实例组成集群,但相互独立,没有信息交换。
    是Topic路由注册中心,端口默认为9876

    代理服务器(Broker Server)

    消息中转角色,负责存储消息、转发消息。代理服务器在RocketMQ系统中负责接收从生产者发送来的消息并存储、同时为消费者的拉取请求作准备。代理服务器也存储消息相关的元数据,包括消费者组、消费进度偏移和主题和队列消息等。
    端口有三个
    listenPort:默认10911,接受客户端连接的监听端口,作为对producer和consumer使用服务的端口号,可以通过配置文件改
    haListenPort:默认为listenPort + 1,高可用服务监听端口,主要用于slave同master同步
    fastListenPort:默认为listenPort -2, 主要是fastRemotingServer服务使用,用于VIP通道

    部署:

    1、安装rmqnamesrv

    两台的rmqnamesrv都直接运行即可,所有配置都用默认的即可

    docker run -d --name rmqnamesrv \
     -v /home/docker/rocketmq/data/namesrv/logs:/home/rocketmq/logs \
     -p 9876:9876 \
     --restart=always \
     apacherocketmq/rocketmq:4.8.0-alpine sh mqnamesrv
    
    • 1
    • 2
    • 3
    • 4
    • 5

    2、安装rmqbroker

    docker run -d --name rmqbroker \
     -v /home/docker/rocketmq/data/broker/logs:/home/rocketmq/logs \
     --link rmqnamesrv:namesrv \
     --restart=always \
     -e "NAMESRV_ADDR=namesrv:9876" \
     -p 10909:10909 -p 10911:10911 -p 10912:10912 \
     apacherocketmq/rocketmq:4.8.0-alpine \
     sh mqbroker -c /home/rocketmq/rocketmq-4.8.0/conf/broker.conf
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    拷贝rmqbroker的配置文件到主机目录

    docker cp rmqbroker:/home/rocketmq/rocketmq-4.8.0/conf /home/docker/rocketmq/data/broker/conf
    
    • 1

    编辑配置文件broker.conf

    #切换到刚刚拷贝出来的文件夹下
    cd  /home/docker/rocketmq/data/broker/conf
    #编辑主节点配置文件
    sudo vi broker.conf
    #编辑从节点配置文件
    sudo vi broker-s.conf
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    主节点broker.conf内容如下:

    # 集群名称,取同一个
    brokerClusterName = docker-mq-cluster
    
    # 节点名称,每个主节点取不一样的,另一个主节点我们取broker-b,如果是主从节点名称保持一致
    brokerName = broker-a
    #brokerName = broker-b
    
    # 主从标识,0为主,其他大于0的为从,从只允许读,主可以读写
    brokerId = 0
    
    #未消费的持久化消息清理时间点,默认凌晨4点
    deleteWhen = 04
    
    #持久化消息保存周期(单位:小时)
    fileReservedTime = 48
    
    #brocker角色,异步主
    #- ASYNC_MASTER 异步复制Master
    #- SYNC_MASTER 同步双写Master
    #- SLAVE
    brokerRole = ASYNC_MASTER
    
    #刷盘方式:异步刷盘
    flushDiskType = ASYNC_FLUSH
    
    #节点IP
    brokerIP1 = 192.168.5.49
    #brokerIP1 = 192.168.5.50
    
    #broker的服务端口
    listenPort=10911
    
    #server服务器地址和端口,多个用分号隔开
    namesrvAddr=192.168.5.49:9876;192.168.5.50:9876
    
    #延迟消息等级时间
    messageDelayLevel = 1s 5s 10s 30s
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37

    从节点broker-s.conf内容如下:

    # 集群名称,取同一个
    brokerClusterName = docker-mq-cluster
    
    # 节点名称,每个主节点取不一样的,另一个主节点我们取broker-b,如果是主从节点名称保持一致
    brokerName = broker-a
    #brokerName = broker-b
    
    # 主从标识,0为主,其他大于0的为从,从只允许读,主可以读写
    brokerId = 1
    
    #未消费的持久化消息清理时间点,默认凌晨4点
    deleteWhen = 04
    
    #持久化消息保存周期(单位:小时)
    fileReservedTime = 48
    
    #brocker角色,从
    #- ASYNC_MASTER 异步复制Master
    #- SYNC_MASTER 同步双写Master
    #- SLAVE
    brokerRole = SLAVE
    
    #刷盘方式:异步刷盘
    flushDiskType = ASYNC_FLUSH
    
    #节点IP
    brokerIP1 = 192.168.5.49
    #brokerIP1 = 192.168.5.50
    
    #broker的服务端口,和主节点区分开
    listenPort=11911
    
    #server服务器地址和端口,多个用分号隔开
    namesrvAddr=192.168.5.49:9876;192.168.5.50:9876
    
    #延迟消息等级时间
    messageDelayLevel = 1s 5s 10s 30s
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37

    删除rmqbroker原容器

    #查看容器ID
    docker ps -a
    
    #t停止容器
    docker stop 容器ID
    
    #删除容器
    docker rm 容器ID
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    重启启动rmqbroker

    启动主节点

    docker run -d --name rmqbroker \
     -v /home/docker/rocketmq/data/broker/logs:/home/rocketmq/logs \
     -v /home/docker/rocketmq/data/broker/conf/broker.conf:/home/rocketmq/rocketmq-4.8.0/conf/broker.conf \
     --restart=always \
     -p 10909:10909 -p 10911:10911 -p 10912:10912 \
     apacherocketmq/rocketmq:4.8.0-alpine \
     sh mqbroker -c /home/rocketmq/rocketmq-4.8.0/conf/broker.conf
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    启动从节点

    注意我们的启动命令,-p后面的端口是和主节点不一样的,
    从节点和主节点区分开,我们就直接用11909、11911、11912

    docker run -d --name rmqbroker-s \
     -v /home/docker/rocketmq/data/broker-s/logs:/home/rocketmq/logs \
     -v /home/docker/rocketmq/data/broker/conf/broker-s.conf:/home/rocketmq/rocketmq-4.8.0/conf/broker.conf \
     --restart=always \
     -p 11909:11909 -p 11911:11911 -p 11912:11912 \
     apacherocketmq/rocketmq:4.8.0-alpine \
     sh mqbroker -c /home/rocketmq/rocketmq-4.8.0/conf/broker.conf
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    3、启动可视化页面rocketmq-console-ng

    在一台服务器安装可视化页面即可

    docker run -d -p 8080:8080 --name rocketmq-console-ng \
    -v /home/docker/rocketmq/tmp:/tmp \
    --restart=always \
    -e "JAVA_OPTS=-Drocketmq.namesrv.addr=192.168.5.49:9876;192.168.5.50:9876 -Dcom.rocketmq.sendMessageWithVIPChannel=false" \
    styletang/rocketmq-console-ng
    
    • 1
    • 2
    • 3
    • 4
    • 5

    结果验证

    查看服务端和客户端日志无报错,查看可视化界面
    http://192.168.5.49:8080
    成功检测到两个服务端,集群状态也正常
    在这里插入图片描述

    在这里插入图片描述

    参考:
    https://blog.csdn.net/u011943534/article/details/122628777
    https://blog.csdn.net/leadseczgw01/article/details/107125598
    https://www.jianshu.com/p/819c9719f608
    rocketmq端口描述:
    https://www.lehoon.cn/rocketmq/2016/11/25/rocketmq-net-port.html

  • 相关阅读:
    教你几分钟学会DNAC查看设备健康度
    Java基础面试题
    Reactive 踩坑
    从二元一次方程组到二阶行列式再到克拉默法则
    【springMVC】高级部分
    高并发下丢失更新的解决方案
    ChatGpt3.5已经应用了一段时间,分享一些自己的使用心得.
    学习MySQL先有全局观,细说其发展历程及特点
    【python基础(三)】操作列表:for循环、正确缩进、切片的使用、元组
    C++STL之priority_queue优先队列
  • 原文地址:https://blog.csdn.net/qiaodaima0/article/details/125431771