# 理论先行
首先在这两台机器上分别启动NameServer(nohup sh bin/mqnamesrv &),这样我们就得到了一个无单点的NameServer服务,服务地址是“192.168.100. 131:9876; 192.168.100.132:9876”。然后启动Broker,每台机器上都要分别启动一个Master角色的Broker和一个Slave角色的Broker,并互为主备。可以基于RocketMQ自带的示例配置文件写自己的配置文件(示例配置文件在conf/2m-2s-sync目录下)。
- 192.168.100.131机器上Master Broker的配置文件:
- 192.168.100.132机器上Master Broker的配置文件:
- 192.168.100.131机器上Slave Broker的配置文件:
- 192.168.100.132机器上Slave Broker的配置文件: 然后分别使用如下命令启动四个Broker: 这样一个高可用的RocketMQ集群就搭建好了,还可以在一台机器上启动rocketmq-console,比如在192.168.100.131上启动RocketMQ-console,然后在浏览器中输入地址192.168.100.131:8080,这样就可以可视化地查看集群状态了。
# 配置参数介绍
本节将逐个介绍Broker配置文件中用到的参数含义:
- namesrvAddr=192.168.100.131:9876; 192.168.100.132:9876 NamerServer的地址,可以是多个。
- brokerClusterName=DefaultCluster Cluster的地址,如果集群机器数比较多,可以分成多个Cluster,每个Cluster供一个业务群使用。
- brokerName=broker-a Broker的名称,Master和Slave通过使用相同的Broker名称来表明相互关系,以说明某个Slave是哪个Master的Slave。
- brokerId=0 一个Master Borker可以有多个Slave,0表示Master,大于0表示不同Slave的ID。
- fileReservedTime=48 在磁盘上保存消息的时长,单位是小时,自动删除超时的消息。
- deleteWhen=04 与fileReservedTime参数呼应,表明在几点做消息删除动作,默认值04表示凌晨4点
- brokerRole=SYNC_MASTE RbrokerRole有3种:SYNC_MASTER、ASYNC_MASTER、SLAVE。关键词SYNC和ASYNC表示Master和Slave之间同步消息的机制,SYNC的意思是当Slave和Master消息同步完成后,再返回发送成功的状态。
- flushDiskType=ASYNC_FLUSH flushDiskType表示刷盘策略,分为SYNC_FLUSH和ASYNC_FLUSH两种,分别代表同步刷盘和异步刷盘。同步刷盘情况下,消息真正写入磁盘后再返回成功状态;异步刷盘情况下,消息写入page_cache后就返回成功状态。
- listenPort=10911 Broker监听的端口号,如果一台机器上启动了多个Broker,则要设置不同的端口号,避免冲突。
- storePathRootDir=/home/rocketmq/store-a 存储消息以及一些配置信息的根目录。
这些配置参数,在Broker启动的时候生效,如果启动后有更改,要重启Broker。现在使用云服务或多网卡的机器比较普遍,Broker自动探测获得的ip地址可能不符合要求,通过brokerIP1=47.98.41.234这样的配置参数,可以设置Broker机器对外暴露的ip地址。
# 实践操作
服务名称 | 服务器地址 | 服务类型 | 端口 | 配置文件 |
---|---|---|---|---|
nameserver-1 | 172.23.26.31 | 注册中心1 | 9876 | |
nameserver-2 | 172.23.26.89 | 注册中心2 | 9876 | |
broker-a-0 | 172.23.26.31 | broker服务a的master | 10911 | broker-a.properties |
broker-a-1 | 172.23.26.89 | broker服务a的slave | 10921 | broker-a-s.properties |
broker-b-0 | 172.23.26.89 | broker服务b的master | 10911 | broker-b.properties |
broker-b-1 | 172.23.26.31 | broker服务b的slave | 10921 | broker-b-s.properties |
# 环境准备
jdk maven(3.5以上)
在两台服务器上分别创建/home/software目录,maven和rocketmq文件包都放在此目录下 wget http://mirror.bit.edu.cn/apache/maven/maven-3/3.5.4/binaries/apache-maven-3.5.4-bin.tar.gz 下载3.5.4版本maven tar -zxvf apache-maven-3.5.4-bin.tar.gz 解压压缩包
向环境变量中添加maven vim /etc/profile 文件末尾追加 export M2_HOME=/home/software/apache-maven-3.5.4 在PATH后面追加 :$M2_HOME/bin 保存并推出配置文件 source /etc/profile 刷新环境变量缓存 执行 mvn -version 判断是否成功
# 本次配置开始
在rocketmq的conf目录下,rocketmq默认给出了三种建议配置模式,分别为3个目录 2m-2s-async(主从异步),----本次采用这种 2m-2s-sync(主从同步) 2m-noslave(仅master)
# 修改2m-2s-async下的配置文件
autoCreateTopicEnable=true,开启自动创建topic,(网上文章建议线下开启测试,线上关闭)
同一个机器上启动多个broker时,需使用不同的broker配置文件来启动实例, 服务器节点1启动一个a-m和b-s,使用broker-a.properties和broker-b-s.properties listenPort默认为10911,当一个机器上启动多个broker示例时,需区分开端口 broker启动时,默认内存设置比较大,改成适合机器的 当一个节点启动多个broker实例时,存储路径如果显示的设置,则需要指定不同的storePath路径
# 在172.23.26.31和172.23.26.89服务器上创建一下两个mq日志store目录
/home/rocketmq/store-a /home/rocketmq/store-b
# 在172.23.26.31和172.23.26.89的rocketmq应用根目录下创建logs启动日志目录
# 在rocketmq应用的conf目录下执行以下命令
sed -i "s/${user.home}//home/rocketmq/g" logback_broker.xml sed -i "s/${user.home}//home/rocketmq/g" logback_namesrv.xml sed -i "s/${user.home}//home/rocketmq/g" logback_tools.xml 修改rocketmq的默认日志目录,方便下面配置自定义的日志目录
# 在172.23.26.31服务器上修改broker-a.properties
brokerClusterName=RocketmqCluster brokerName=broker-a brokerId=0 #删除文件时间点,默认凌晨 4点 deleteWhen=04 #文件保留时间,默认 48 小时 fileReservedTime=48 brokerRole=ASYNC_MASTER flushDiskType=ASYNC_FLUSH #Broker 对外服务的监听端口 listenPort=10911 #nameserver地址,分号分割 namesrvAddr=172.23.26.31:9876;172.23.26.89:9876 #Broker 机器对外暴露的ip 地址 brokerIP1=172.23.26.31 #在发送消息时,自动创建服务器不存在的topic,默认创建的队列数 defaultTopicQueueNums=4 #是否允许 Broker 自动创建Topic,建议测试开启,生产关闭 autoCreateTopicEnable=true #是否允许 Broker 自动创建订阅组,建议测试开启,生产关闭 autoCreateSubscriptionGroup=true #文件保存根路径 storePathRootDir=/home/rocketmq/store-a storePathCommitLog=/home/rocketmq/store-a #消费队列存储路径存储路径 storePathConsumerQueue=/home/rocketmq/store-a #消息索引存储路径 storePathIndex=/home/rocketmq/store-a #checkpoint 文件存储路径 storeCheckpoint=/home/rocketmq/store-a #abort 文件存储路径 abortFile=/home/rocketmq/store-a #commitLog每个文件的大小默认1G mapedFileSizeCommitLog=1073741824 #ConsumeQueue每个文件默认存30W条,根据业务情况调整 mapedFileSizeConsumeQueue=300000
# 在172.23.26.31服务器上修改broker-b-s.properties
brokerClusterName=RocketmqCluster brokerName=broker-b brokerId=1 #删除文件时间点,默认凌晨 4点 deleteWhen=04 #文件保留时间,默认 48 小时 fileReservedTime=48 brokerRole=SLAVE flushDiskType=ASYNC_FLUSH #Broker 对外服务的监听端口 listenPort=10921 #nameserver地址,分号分割 namesrvAddr=172.23.26.31:9876;172.23.26.89:9876 #Broker 机器对外暴露的ip 地址 brokerIP1=172.23.26.31 #在发送消息时,自动创建服务器不存在的topic,默认创建的队列数 defaultTopicQueueNums=4 #是否允许 Broker 自动创建Topic,建议测试开启,生产关闭 autoCreateTopicEnable=true #是否允许 Broker 自动创建订阅组,建议测试开启,生产关闭 autoCreateSubscriptionGroup=true #文件保存根路径 storePathRootDir=/home/rocketmq/store-b storePathCommitLog=/home/rocketmq/store-b #消费队列存储路径存储路径 storePathConsumerQueue=/home/rocketmq/store-b #消息索引存储路径 storePathIndex=/home/rocketmq/store-b #checkpoint 文件存储路径 storeCheckpoint=/home/rocketmq/store-b #abort 文件存储路径 abortFile=/home/rocketmq/store-b #commitLog每个文件的大小默认1G mapedFileSizeCommitLog=1073741824 #ConsumeQueue每个文件默认存30W条,根据业务情况调整 mapedFileSizeConsumeQueue=300000
# 在172.23.26.89上修改broker-b.properties
brokerClusterName=RocketmqCluster brokerName=broker-b brokerId=0 #删除文件时间点,默认凌晨 4点 deleteWhen=04 #文件保留时间,默认 48 小时 fileReservedTime=48 brokerRole=ASYNC_MASTER flushDiskType=ASYNC_FLUSH listenPort=10911 #nameserver地址,分号分割 namesrvAddr=172.23.26.31:9876;172.23.26.89:9876 #Broker 机器对外暴露的ip 地址 brokerIP1=172.23.26.89 #在发送消息时,自动创建服务器不存在的topic,默认创建的队列数 defaultTopicQueueNums=4 #是否允许 Broker 自动创建Topic,建议测试开启,生产关闭 autoCreateTopicEnable=true #是否允许 Broker 自动创建订阅组,建议测试开启,生产关闭 autoCreateSubscriptionGroup=true #文件保存根路径 storePathRootDir=/home/rocketmq/store-b storePathCommitLog=/home/rocketmq/store-b #消费队列存储路径存储路径 storePathConsumerQueue=/home/rocketmq/store-b #消息索引存储路径 storePathIndex=/home/rocketmq/store-b #checkpoint 文件存储路径 storeCheckpoint=/home/rocketmq/store-b #abort 文件存储路径 abortFile=/home/rocketmq/store-b #commitLog每个文件的大小默认1G mapedFileSizeCommitLog=1073741824 #ConsumeQueue每个文件默认存30W条,根据业务情况调整 mapedFileSizeConsumeQueue=300000
# 在172.23.26.89上修改broker-a-s.properties
brokerClusterName=RocketmqCluster brokerName=broker-a brokerId=1 #删除文件时间点,默认凌晨 4点 deleteWhen=04 #文件保留时间,默认 48 小时 fileReservedTime=48 brokerRole=SLAVE flushDiskType=ASYNC_FLUSH listenPort=10921 #nameserver地址,分号分割 namesrvAddr=172.23.26.31:9876;172.23.26.89:9876 #Broker 机器对外暴露的ip 地址 brokerIP1=172.23.26.89 #在发送消息时,自动创建服务器不存在的topic,默认创建的队列数 defaultTopicQueueNums=4 #是否允许 Broker 自动创建Topic,建议测试开启,生产关闭 autoCreateTopicEnable=true #是否允许 Broker 自动创建订阅组,建议测试开启,生产关闭 autoCreateSubscriptionGroup=true #文件保存根路径 storePathRootDir=/home/rocketmq/store-a storePathCommitLog=/home/rocketmq/store-a #消费队列存储路径存储路径 storePathConsumerQueue=/home/rocketmq/store-a #消息索引存储路径 storePathIndex=/home/rocketmq/store-a #checkpoint 文件存储路径 storeCheckpoint=/home/rocketmq/store-a #abort 文件存储路径 abortFile=/home/rocketmq/store-a #commitLog每个文件的大小默认1G mapedFileSizeCommitLog=1073741824 #ConsumeQueue每个文件默认存30W条,根据业务情况调整 mapedFileSizeConsumeQueue=300000
# 修改启动脚本
修改bin目录下的runbroker.sh脚本,将
JAVA_OPT="${JAVA_OPT} -server -Xms8g -Xmx8g -Xmn4g" 修改为
JAVA_OPT="${JAVA_OPT} -server -Xms512m -Xmx512m -Xmn256m" 减小应用启动后占用的内存资源。
修改bin目录下的runserver.sh脚本,将 JAVA_OPT="${JAVA_OPT} -server -Xms4g -Xmx4g -Xmn2g -XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=320m" 修改为 JAVA_OPT="${JAVA_OPT} -server -Xms512m -Xmx512m -Xmn126m -XX:PermSize=128m -XX:MaxPermSize=320m" 减小应用启动后占用的内存资源。
修改bin目录下的tools.sh脚本,将 JAVA_OPT="${JAVA_OPT} -server -Xms1g -Xmx1g -Xmn256m -XX:PermSize=128m -XX:MaxPermSize=128m" 修改为 JAVA_OPT="${JAVA_OPT} -server -Xms256m -Xmx256m -Xmn128m -XX:PermSize=128m -XX:MaxPermSize=128m " 减小应用启动后占用的内存资源。
# 运行脚本启动服务
# 启动nameServer
在172.23.26.31和172.23.26.89的rocketmq应用根目录下创建nameServer启动脚本startNamesvr.sh,脚本内容如下: nohup sh bin/mqnamesrv > ./logs/namesrvrun.log 2>&1 & 执行下面的命令为脚本添加可执行权限: chmod +x startNamesvr.sh ./startNamesvr.sh 运行脚本,启动nameServer服务。
# 在172.23.26.31服务器上启动a-master的broker服务
创建startBroker-a-master.sh脚本,内容如下: nohup sh bin/mqbroker -c conf/2m-2s-async/broker-a.properties > ./logs/broker-a.log 2>&1 & 执行下面的命令为脚本添加可执行权限: chmod +x startBroker-a-master.sh ./startBroker-a-master.sh运行脚本,启动broker服务。
# 在172.23.26.31服务器上启动b-slave的broker服务
创建startBroker-b-slave.sh脚本,内容如下: nohup sh bin/mqbroker -c conf/2m-2s-async/broker-b-s.properties > ./logs/broker-b-s.log 2>&1 & 执行下面的命令为脚本添加可执行权限: chmod +x startBroker-b-slave.sh ./startBroker-b-slave.sh运行脚本,启动broker服务。
# 在172.23.26.89服务器上启动b-master的broker服务
创建startBroker-b-master.sh脚本,内容如下: nohup sh bin/mqbroker -c conf/2m-2s-async/broker-b.properties > ./logs/broker-b.log 2>&1 & 执行下面的命令为脚本添加可执行权限: chmod +x startBroker-b-master.sh ./startBroker-b-master.sh运行脚本,启动broker服务。
# 在172.23.26.89服务器上启动a-slave的broker服务
创建startBroker-a-slave.sh脚本,内容如下: nohup sh bin/mqbroker -c conf/2m-2s-async/broker-a-s.properties > ./logs/broker-a-s.log 2>&1 & 执行下面的命令为脚本添加可执行权限: chmod +x startBroker-a-slave.sh ./startBroker-a-slave.sh运行脚本,启动broker服务。
# 启动RocketMq-console控制台查看集群状态
在mq控制台包文件rocketmq-console-ng-1.0.1.jar所在目录执行以下命令启动控制台,控制台连接的nameSrv设置集群里的两个中的任何一个即可 172.23.26.31:9876/172.23.26.89:9876
java -jar rocketmq-console-ng-1.0.1.jar --server.port=12581 --rocketmq.config.namesrvAddr=172.23.26.11:9876 进入cluster面板下能看到集群服务信息