之前我们已经介绍过RocketMQ单节点的安装使用, 对于大数据量高性能要求的场景,单节点容易产生瓶颈, 无法满足需要, 这个时候可以采用RocketMQ集群模式,通过扩展多个节点, 分解单机压力瓶颈, 提升整体吞吐能力。
官方推荐了三种集群方式(官方给出了三种集群的配置参考文件, 在 $ROCKETMQ_HOME/conf配置目录下):
所有节点全是Master,没有Slave, 但必须最少2个主节点。
优点: 配置简便, 单个节点故障对集群使用无影响, 因为不需要主从同步复制,减少开销, 性能最高。
缺点: 单台机器宕机期间 , 会导致该节点未被消费的消息在在节点恢复前不可订阅。
每个主节点跟随一个从节点, 由多对主从节点组成整个集群, HA数据采用异步复制方式 , 主从有短暂消息延迟, 但是毫秒级别。
优点: 主节点出现故障, 不影响消息的订阅, 消费者仍可以从Slave节点继续消费, 由于数据采用异步同步模式, 消息实时性不会受影响, 性能与多主模式几乎一样。
缺点: 主节如果突然宕机, 磁盘受损情况, 会存在消息丢失的可能。
每个主节点跟随一个从节点, 由多对主从节点组成整个集群, HA数据采用同步复制方式, 只有主备都写入成功, 才会返回成功。
优点:基于数据同步处理模式, 服务的可用性与数据可用性都非常高。
缺点:性能比异步复制模式略低,大约低10%左右。
Disk Flush(磁盘刷新/同步操作), 将内存的数据落地,存储在磁盘中。RocketMQ提供了以下两种模式:
SYNC_FLUSH(同步刷盘):
生产者发送的每一条消息都在保存到磁盘成功后才返回告诉生产者成功。这种方式不会存在消息丢失的问题,但是有很大的磁盘IO开销,性能有一定影响。
ASYNC_FLUSH(异步刷盘):
生产者发送的每一条消息并不是立即保存到磁盘,而是暂时缓存起来,然后就返回生产者成功。随后再异步的将缓存数据保存到磁盘,有两种处理机制:
一是定期将缓存中更新的数据进行刷盘; 二是当缓存中更新的数据条数达到某一设定值后进行刷盘,这种方式会存在消息丢失(在还未来得及同步到磁盘的时候宕机),但是性能很好。 默认是采用这种模式。
准备四台虚拟机:
10.10.20.28: 1号主节点、NameServer1(9876)。
10.10.20.29: 1号从节点、NameServer2(9876)。
10.10.20.30: 2号主节点、Rocket Console(8080)。
10.10.20.32: 2号从节点。
下载安装包
Rocket MQ 4.4安装包
如果不能下载, 换用其他地址:
https://mirrors.cloud.tencent.com/apache/rocketmq/4.3.2/rocketmq-all-4.3.2-bin-release.zip
解压
unzip -qo rocketmq-all-4.4.0-bin-release.zip
修改启动配置
如果用的RocketMQ 4.X版本, 建议使用JDK1.8版本, 避免有些JVM参数不支持。
修改name server启动配置
vi bin/runserver.sh
修改内容:
# 指定JDK1.8的路径, 如果在系统环境变量中已设置, 可以不用修改此项
export JAVA_HOME=/usr/local/jdk1.8.0_181
# 启动内存设置, 如在虚拟机在本地, 建议将内存设置小一些, 节省资源
JAVA_OPT="${JAVA_OPT} -server -Xms512m -Xmx1g -Xmn512m -XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=256m"
修改broker server启动配置:
vi bin/runbroker.sh
修改内容:
# 指定JDK1.8的路径, 如果在系统环境变量中已设置, 可以不用修改此项
export JAVA_HOME=/usr/local/jdk1.8.0_181
# 启动内存设置, 如在虚拟机在本地, 建议将内存设置小一些, 节省资源
JAVA_OPT="${JAVA_OPT} -server -Xms512m -Xmx1g -Xmn512m"
修改tools工具内存配置:
vi bin/tools.sh
修改内容:
# 指定JDK1.8的路径, 如果在系统环境变量中已设置, 可以不用修改此项
export JAVA_HOME=/usr/local/jdk1.8.0_181
# 启动内存设置, 如在虚拟机在本地, 建议将内存设置小一些, 节省资源
JAVA_OPT="${JAVA_OPT} -server -Xms256m -Xmx512m -Xmn256m -XX:PermSize=128m -XX:MaxPermSize=128m"
在部署的四台节点机器上, 分别进行安装配置。
这里我们采用的是双主双从异步模式,RocketMQ官方帮我们内置了配置文件, 我们可以直接采用内置文件启动, 也可以根据需要做些调整修改, Broker 配置详解:
参数名 | 默认值 | 说明 |
---|---|---|
listenPort | 10911 | Broker对外服务的监听端口 |
namesrvAddr | Null | NameServer地址 |
brokerIP1 | 本机IP | 本机ip地址,默认系统自动识别,但是某些多网卡机器会存在识别错误的情况,这种情况下可以人工配置 |
brokerName | 本机主机名 | |
brokerClusterName | DefaultCluster | Broker所属那个集群 |
brokerId | 0 | BrokerId,必须是大于等于0的整数,0表示Master, 大于0表示Slave, 一个Master可以挂多个Slave,Master和Slave通过BrokerName来配对 |
storePathCommitLog | $HOME/store/commitlog | commitLog存储路径 |
storePathConsumerQueue | $HOME/store/consumequeue | 消费队列存储路径 |
storePathIndex | $HOME/store/index | 消息索引存储队列 |
deleteWhen | 4 | 删除时间点,默认凌晨4点 |
fileReserverdTime | 48 | 文件保留时间,默认48小时 |
maxTransferBytesOnMessageInMemory | 262144 | 单次pull消息(内存)传输的最大字节数 |
maxTransferCountOnMessageInMemory | 32 | 单次pull消息(内存)传输的最大条数 |
maxTransferBytesOnMessageInDisk | 65535 | 单次Pull消息(磁盘)传输的最大字节数 |
maxTransferCountOnMessageInDisk | 8 | 单次pull消息(磁盘)传输的最大条数 |
messageIndexEnable | TRUE | 是否开启消息索引功能 |
messageIndexSafe | FALSE | 是否提供安全的消息索引机制,索引保证不丢 |
brokerRole | ASYNC_MASTER | Broker的角色:ASYNC_MASTER异步复制Master; SYNC_MASTER同步双写MASTER; SLAVE |
flushDiskType | ASYNC_FLUSH | 刷盘方式: ASYNC_FLUSH异步刷盘;SYNC_FLUSH同步刷盘clientFileForciblyEnable |
修改broker配置文件, 只修改namesrvAddr参数, 其他按默认值处理:
进入10.10.20.28机器, 查看对应配置:
vi /usr/local/rocketmq4.3.2/conf/2m-2s-async/broker-a.properties
注意, 根据双主双从配置, 每个节点的配置文件名称不一样, 不要修改错误:
10.10.20.28 对应配置文件: broker-a.properties
10.10.20.29 对应配置文件: broker-a-s.properties
10.10.20.30 对应配置文件: broker-b.properties
10.10.20.32 对应配置文件: broker-b-s.properties
broker-a.properties 配置内容示例:
brokerClusterName=DefaultCluster
brokerName=broker-a
brokerId=0
deleteWhen=04
fileReservedTime=48
brokerRole=ASYNC_MASTER
flushDiskType=ASYNC_FLUSH
# Namer Server服务地址, 多个以”;“分号隔离
namesrvAddr=10.10.20.28:9876;10.10.20.29:9876
在10.10.20.28节点,启动第一个Name Server
nohup /usr/local/rocketmq4.3.2/bin/mqnamesrv >/dev/null 2>&1 &
查看进程:
[root@localhost rocketmq4.3.2]# ps -ef | grep namesrv
root 7214 1 0 04:54 ? 00:00:00 /bin/sh bin/mqnamesrv
root 7218 7214 0 04:54 ? 00:00:00 sh /usr/local/rocketmq4.3.2/bin/runserver.sh org.apache.rocketmq.namesrv.NamesrvStartup
在10.10.20.29节点, 启动第二个Name Server
nohup /usr/local/rocketmq4.3.2/bin/mqnamesrv >/dev/null 2>&1 &
查看进程
[root@localhost rocketmq4.3.2]# ps -ef | grep namesrv
root 24958 1 0 17:11 ? 00:00:00 /bin/sh bin/mqnamesrv
root 24962 24958 0 17:11 ? 00:00:00 sh /usr/local/rocketmq4.3.2/bin/runserver.sh org.apache.rocketmq.namesrv.NamesrvStartup
检查日志:
less ~/logs/rocketmqlogs/namesrv.log
上面我们在每个Broker节点上, 都配置好了Name Server地址, 现在可以直接启动Broker服务。
在10.10.20.28, 启动1号主节点服务:
nohup bin/mqbroker -c /usr/local/rocketmq4.3.2/conf/2m-2s-async/broker-a.properties > /dev/null 2>&1 &
查看进程:
[root@localhost rocketmq4.3.2]# ps -ef | grep broker
root 8034 8012 0 10:27 pts/2 00:00:00 /bin/sh bin/mqbroker -c /usr/local/rocketmq4.3.2/conf/2m-2s-async/broker-a.properties
root 8038 8034 0 10:27 pts/2 00:00:00 sh /usr/local/rocketmq4.3.2/bin/runbroker.sh org.apache.rocketmq.broker.BrokerStartup -c /usr/local/rocketmq4.3.2/conf/2m-2s-async/broker-a.properties
在10.10.20.29, 启动1号从节点服务:
nohup bin/mqbroker -c /usr/local/rocketmq4.3.2/conf/2m-2s-async/broker-a-s.properties > /dev/null 2>&1 &
查看进程:
[root@localhost rocketmq4.3.2]# ps -ef | grep broker
root 40260 39833 0 22:25 pts/1 00:00:00 /bin/sh bin/mqbroker -c /usr/local/rocketmq4.3.2/conf/2m-2s-async/broker-a-s.properties
root 40265 40260 0 22:25 pts/1 00:00:00 sh /usr/local/rocketmq4.3.2/bin/runbroker.sh org.apache.rocketmq.broker.BrokerStartup -c /usr/local/rocketmq4.3.2/conf/2m-2s-async/broker-a-s.properties
在10.10.20.30, 启动2号主节点服务:
nohup bin/mqbroker -c /usr/local/rocketmq4.3.2/conf/2m-2s-async/broker-b.properties > /dev/null 2>&1 &
查看进程:
[root@localhost rocketmq_console]# ps -ef | grep broker
root 1270 1245 0 04:19 pts/0 00:00:00 /bin/sh bin/mqbroker -c /usr/local/rocketmq4.3.2/conf/2m-2s-async/broker-b.properties
root 1274 1270 0 04:19 pts/0 00:00:00 sh /usr/local/rocketmq4.3.2/bin/runbroker.sh org.apache.rocketmq.broker.BrokerStartup -c /usr/local/rocketmq4.3.2/conf/2m-2s-async/broker-b.properties
在10.10.20.32, 启动2号从节点服务:
nohup bin/mqbroker -c /usr/local/rocketmq4.3.2/conf/2m-2s-async/broker-b-s.properties > /dev/null 2>&1 &
查看进程:
[root@localhost 2m-2s-async]# ps -ef | grep broker
root 1250 1232 0 04:30 pts/0 00:00:00 /bin/sh bin/mqbroker -c /usr/local/rocketmq4.3.2/conf/2m-2s-async/broker-b-s.properties
root 1254 1250 0 04:30 pts/0 00:00:00 sh /usr/local/rocketmq4.3.2/bin/runbroker.sh org.apache.rocketmq.broker.BrokerStartup -c /usr/local/rocketmq4.3.2/conf/2m-2s-async/broker-b-s.properties
下载地址
Rocket Console 控制台
在10.10.20.30
解压
mkdir -p /usr/local/rocket_console
unzip rocketmq-console-1.0.0.zip
MAVEN打包 (编译源码)
如果采用安装包, 可以不需要编译, 跳过此步骤。
如果没有maven环境, 通过yum安装
yum -y install maven
进入安装目录, 执行打包命令:
mvn clean package -Dmaven.test.skip=true
打包成功后, target目录下会生成rocketmq-console-ng-1.0.0.jar文件。
创建配置文件
新建application.properties配置文件与jar包放到同一目录:
vi /usr/local/rocketmq_console/application.properties
配置信息:
server.port=8080
rocketmq.config.namesrvAddr=10.10.20.28:9876;10.10.20.29:9876
启动控制台服务
nohup java -jar /usr/local/rocketmq_console/rocketmq-console-ng-1.0.0.jar > /dev/null 2>&1 &
查看集群状态
访问地址: http://10.10.20.30:8080/#/cluster
我们可以看到存在4个节点, 两主两从, 显示的IP地址与集群部署规划一致。
应用服务的连接配置
以Spring Boot工程为例, 修改工程配置文件bootstrap.yml:
spring:
stream:
rocketmq:
binder:
#RocketMQ Name Server地址, 集群多个地址以”;"分号隔离
name-server: 10.10.20.28:9876;10.10.20.29:9876
未经本人同意, 请勿随意转载! 相逢是缘, 希望对大家有所帮助, 谢谢!
如需获取最新技术资讯或交流, 请关注: