
1.2. 硬件资源
IP地址 硬件配置
10.22.194.18
PowerEdge R730
Intel® Xeon® CPU E5-2640 v4 @ 2.40GHz
64G/10000 Mbps full duplex*2
10.22.194.77
PowerEdge R730
Intel® Xeon® CPU E5-2640 v4 @ 2.40GHz
64G/10000 Mbps full duplex*2
10.22.194.78
PowerEdge R730
Intel® Xeon® CPU E5-2640 v4 @ 2.40GHz
64G/10000 Mbps full duplex*2
1.3. OS资源
主机名 操作系统
bjccsoftphone01 Red Hat Enterprise Linux Server release 6.9 (Santiago) x64
bjccsoftphone02 Red Hat Enterprise Linux Server release 6.9 (Santiago) x64
bjccsoftphone03 Red Hat Enterprise Linux Server release 6.9 (Santiago) x64
rocketmq-console https://github.com/apache/incubator-rocketmq-externals/tree/master/rocketmq-console
3.2. 架构示例图
1、Disk Flush(磁盘刷新/同步操作):就是将内存的数据落地,存储在磁盘中。RocketMQ提供了以下两种模式:
SYNC_FLUSH(同步刷盘):生产者发送的每一条消息都在保存到磁盘成功后才返回告诉生产者成功。这种方式不会存在消息丢失的问题,但是有很大的磁盘IO开销,性能有一定影响。
ASYNC_FLUSH(异步刷盘):生产者发送的每一条消息并不是立即保存到磁盘,而是暂时缓存起来,然后就返回生产者成功。随后再异步的将缓存数据保存到磁盘,有两种情况:1是定期将缓存中更新的数据进行刷盘,2是当缓存中更新的数据条数达到某一设定值后进行刷盘。这种方式会存在消息丢失(在还未来得及同步到磁盘的时候宕机),但是性能很好。默认是这种模式。
2、Broker Replication(Broker间数据同步/复制):集群环境下需要部署多个Broker,Broker分为两种角色:一种是master,即可以写也可以读,其brokerId=0,只能有一个;另外一种是slave,只允许读,其brokerId为非0。一个master与多个slave通过指定相同的brokerName被归为一个broker set(broker集)。通常生产环境中,我们至少需要2个broker set。Broker Replication只的就是slave获取或者是复制master的数据。
Sync Broker:生产者发送的每一条消息都至少同步复制到一个slave后才返回告诉生产者成功,即“同步双写”。
Async Broker:生产者发送的每一条消息只要写入master就返回告诉生产者成功。然后再“异步复制”到slave。
推荐的几种Broker集群方式:(官网提供了下面几种集群方式的配置文件供参考,在$ROCKETMQ_HOME/target/apache-rocketmq-all/conf目录下)
2m-2s-sync:两主两从同步双写(两个master,两个slave,数据同步双写到master和slave)
2m-2s-async:两主两从异步复制(两个master,两个slave,master数据通过异步复制到slave)
2m-noslave:两主(只有两个master,没有slave)
注:
1、上述“2”只是说作为一个集群的最低配置数量,可以根据实际情况扩展。
2、所有的刷盘(Dish Flush)操作全部默认为:ASYNC_FLUSH(异步刷盘)。
Name Server集群:Name Server集群比较简单,只要部署多个实例就行了,多个实例间不需要进行数据共享,只要保证一个实例存活就可以正常运转。
3.3. 三种Broker集群的优缺点
三种集群方式的优缺点(主要区别在于主从复制方式):
1、多Master模式(2m-noslave)
一个集群无Slave,全是Master,例如2个Master或者3个Master
优点:
配置简单,单个Master宕机或重启维护对应用无影响,在磁盘配置为RAID10时,即使机器宕机不可恢复情况下,由于RAID10磁盘非常可靠,消息也不会丢(异步刷盘丢失少量消息,同步刷盘一条不丢)。性能最高。
缺点:
单台机器宕机期间,这台机器上未被消费的消息在机器恢复之前不可订阅,消息实时性会受到受到影响。
2、多Master多Slave模式,异步复制(2m-2s-async)
每个Master配置一个Slave,有多对Master-Slave,HA采用异步复制方式,主备有短暂消息延迟,毫秒级。
优点:
即使磁盘损坏,消息丢失的非常少,且消息实时性不会受影响,因为Master宕机后,消费者仍然可以从Slave消费,此过程对应用透明。不需要人工干预。性能同多Master模式几乎一样。
缺点:
Master宕机,磁盘损坏情况,会丢失少量消息。
3、多Master多Slave模式,同步双写(2m-noslave)
每个Master配置一个Slave,有多对Master-Slave,HA采用同步双写方式,主备都写成功,向应用返回成功。
优点:
数据与服务都无单点,Master宕机情况下,消息无延迟,服务可用性与数据可用性都非常高
缺点:
性能比异步复制模式略低,大约低10%左右,发送单个消息的RT会略高。目前主宕机后,备机不能自动切换为主机,后续会支持自动切换功能。
4.1. 初始化节点1(10.22.194.18)配置
4.1.1. broker-a-m.properties
vi /home/rocketmq/conf/broker-a-m.propertiesbrokerClusterName=post
brokerName=broker-a
namesrvAddr=10.22.194.18:9876;10.22.194.77:9876
brokerId=0
listenPort=10911
brokerIP1=10.22.194.18
deleteWhen=04
fileReservedTime=72
brokerRole=ASYNC_MASTER
storePathRootDir=/home/rocketmq/rootdir-a-m
storePathCommitLog=/home/rocketmq/commitlog-a-m
defaultTopicQueueNums=4
autoCreateTopicEnable=true
autoCreateSubscriptionGroup=true
flushDiskType=ASYNC_FLUSH
4.1.2. broker-c-s.properties
brokerClusterName=post
brokerName=broker-c
namesrvAddr=10.22.194.18:9876;10.22.194.77:9876
brokerId=1
listenPort=10920
brokerIP1=10.22.194.18
deleteWhen=04
fileReservedTime=72
brokerRole=SLAVE
storePathRootDir=/home/rocketmq/rootdir-c-s
storePathCommitLog=/home/rocketmq/commitlog-c-s
defaultTopicQueueNums=4
autoCreateTopicEnable=true
autoCreateSubscriptionGroup=true
flushDiskType=ASYNC_FLUSH
4.2. 初始化节点2(10.22.194.77)配置
4.2.1. broker-a-s.properties
vi /home/rocketmq/conf/broker-c-s.propertiesbrokerClusterName=post
brokerName=broker-a
namesrvAddr=10.22.194.18:9876;10.22.194.77:9876
brokerId=1
listenPort=10920
deleteWhen=04
brokerIP1=10.22.194.77
fileReservedTime=72
brokerRole=SLAVE
storePathRootDir=/home/rocketmq/rootdir-a-s
storePathCommitLog=/home/rocketmq/commitlog-a-s
defaultTopicQueueNums=4
autoCreateTopicEnable=true
autoCreateSubscriptionGroup=true
flushDiskType=ASYNC_FLUSH
4.2.2. broker-b-m.properties
brokerClusterName=post
brokerName=broker-b
namesrvAddr=10.22.194.18:9876;10.22.194.77:9876
brokerId=0
listenPort=10911
brokerIP1=10.22.194.77
deleteWhen=04
fileReservedTime=72
brokerRole=ASYNC_MASTER
storePathRootDir=/home/rocketmq/rootdir-b-m
storePathCommitLog=/home/rocketmq/commitlog-b-m
defaultTopicQueueNums=4
autoCreateTopicEnable=true
autoCreateSubscriptionGroup=true
flushDiskType=ASYNC_FLUSH
4.3. 初始化节点3(10.22.194.78)配置
4.3.1. broker-b-s.properties
vi /home/rocketmq/conf/broker-b-s.propertiesbrokerClusterName=post
brokerName=broker-b
namesrvAddr=10.22.194.18:9876;10.22.194.77:9876
brokerId=1
listenPort=10920
brokerIP1=10.22.194.78
deleteWhen=04
fileReservedTime=72
brokerRole=SLAVE
storePathRootDir=/home/rocketmq/rootdir-b-s
storePathCommitLog=/home/rocketmq/commitlog-b-s
defaultTopicQueueNums=4
autoCreateTopicEnable=true
autoCreateSubscriptionGroup=true
flushDiskType=ASYNC_FLUSH
4.3.2. broker-c-m.properties
vi /home/rocketmq/conf/broker-c-m.propertiesbrokerClusterName=post
brokerName=broker-c
namesrvAddr=10.22.194.18:9876;10.22.194.77:9876
brokerId=0
listenPort=10911
brokerIP1=10.22.194.78
deleteWhen=04
fileReservedTime=72
brokerRole=ASYNC_MASTER
storePathRootDir=/home/rocketmq/rootdir-c-m
storePathCommitLog=/home/rocketmq/commitlog-c-m
defaultTopicQueueNums=4
autoCreateTopicEnable=true
autoCreateSubscriptionGroup=true
flushDiskType=ASYNC_FLUSH
启动NameServer
1、创建日志文件夹
2、分别启动节点1和节点2
nohup sh /home/rocketmq/bin/mqnamesrv >/home/rocketmq/logs/mqnamesrv.log 2>&1 &4.4. 查看jps信息
在节点1和节点2上分别输入jps查看一下jvm的主要的几个进程,看是否启动正常
节点1:
jps3336 jar
3482 NamesrvStartup
3836 Jps
3260 jar
节点2:
jps11384 NamesrvStartup
11402 Jps
4.5. 启动Broker-a(master在节点1,slave在节点2)
broker-a分为Master和slave,分别位于节点1和节点2上,需要分别启动。
注意:需要根据启动角色,为broker指定一个配置文件
在执行下面的命令前,先修改文件路径:{ROCKET_HOME}/bin/runbroker.sh中的JVM参数配置,如若不改,将会因为内存不够启动不了broker.
1、设置内存大小
修改前:
JAVA_OPT="
J
A
V
A
O
P
T
−
s
e
r
v
e
r
−
X
m
s
8
g
−
X
m
x
8
g
−
X
m
n
4
g
"
修
改
后
:
J
A
V
A
O
P
T
=
"
{JAVA_OPT} -server -Xms8g -Xmx8g -Xmn4g" 修改后: JAVA_OPT="
JAVAOPT−server−Xms8g−Xmx8g−Xmn4g"修改后:JAVAOPT="{JAVA_OPT} -server -Xms256m -Xmx512m -Xmn512m -XX:PermSize=256m -XX:MaxPermSize=640m"
broker-b broker-c 同样处理
4.5.1. 启动broker-a的master-节点1(10.22.194.18)
nohup sh /home/rocketmq/bin/mqbroker -c /home/rocketmq/conf/broker-a-m.properties autoCreateTopicEnable=true >/home/gcti/logs/broker-a-m.log 2>&1 &4.5.2. 启动broker-a的slave-节点2(10.22.194.77)
nohup sh /home/rocketmq/bin/mqbroker -c /home/rocketmq/conf/broker-a-s.properties autoCreateTopicEnable=true >/home/gcti/logs/broker-a-s.log 2>&1 &4.5.3. 验证broker-a
sh /home/rocketmq/bin/mqadmin clusterList -n 10.22.194.18:98764.6. 启动Broker-b(master在节点2,slave在节点3)
4.6.1. 启动broker-b的master-节点2(10.22.194.77)
#nohup sh /home/rocketmq/bin/mqbroker -c /home/rocketmq/conf/broker-b-m.properties autoCreateTopicEnable=true >/home/gcti/logs/broker-b-m.log 2>&1 &
4.6.2. 启动broker-b的slave-节点3(10.22.194.78)
#nohup sh /home/rocketmq/bin/mqbroker -c /home/rocketmq/conf/broker-b-s.properties autoCreateTopicEnable=true >/home/gcti/logs/broker-b-s.log 2>&1 &
4.6.3. 验证broker-b
sh /home/rocketmq/bin/mqadmin clusterList -n 10.22.194.77:98764.7. 启动Broker-c(master在节点3,slave在节点1)
4.7.1. 启动broker-c的master-节点3(10.22.194.78)
nohup sh /home/rocketmq/bin/mqbroker -c /home/rocketmq/conf/broker-c-m.properties autoCreateTopicEnable=true >/home/gcti/logs/broker-c-m.log 2>&1 &4.7.2. 启动broker-c的slave-节点1(10.22.194.18)
#nohup sh /home/rocketmq/bin/mqbroker -c /home/rocketmq/conf/broker-c-s.properties autoCreateTopicEnable=true >/home/gcti/logs/broker-c-s.log 2>&1 &
4.7.3. 验证broker-c
4.8. 安装console监控工具
4.8.1. 编译
下载源码后
打开application.properties按照自己需求进行配置。
例如:
rocketmq.config.namesrvAddr=namesrv服务地址(ip1:port;ip2:port)
在文件根目录执行命令:
mvn clean package -Dmaven.test.skip=true
然后在target目录下找到文件rocketmq-console-ng-1.0.0.jar
4.8.2. 部署
部署在10.22.194.18
运行命令如
打开http://10.22.194.18:12581
5.1.1. 优化内存
MQ:4G ,broker: 1 G
JAVA_OPT="${JAVA_OPT} -server -Xms4g -Xmx4g -Xmn2g -XX:metaspaceSize=128m -XX:MaxmetaspaceSize=320m"
vi /home/rocketmq/bin/mqbroker vi /home/rocketmq/bin/run_broker.sh5.1.2. broker配置详解