Linux下RocketMQ环境的配置
RocketMQ是⼀款分布式消息系统,最初是由阿⾥巴巴消息中间件团队研发并⼤规模应⽤于⽣产系统,满⾜线上海量堆积的需求,在去年捐赠给Apache开源基⾦会,并列为孵化项⽬,今年成功的正式成为了apache顶级项⽬;早期阿⾥曾经基于ActiveMQ研发的消息系统,随着业务消息的规模增⼤,瓶颈逐渐明显,后来也考虑过Kafka,但是因为在低延迟和⾼可靠性⽅⾯没有选择,最后才⾃主研发了RocketMQ,各⽅⾯的性能都⽐⽬前已有的消息队列要好,RocketMQ和kafka在原理和概念上都⾮常相似,所以也经常被拿来对⽐;RocketMQ默认采⽤长轮询的拉模式,单机⽀持千万级别的消息堆积,可以⾮常好的应⽤在海量消息系统中,下⾯主要叙述⼀下RocketMQ的安装配置过程和⼀些相关的概念,因为rocketmq能够很⽅便的扩展到分布式集,所以单机情况下也可以很好的说明,所以下⾯操作都在⼀台服务器上执⾏
⾸先解压安装包然后放到⾃⼰要安装的位置:
unzip rocketmq-all-4.1.0-incubating-bin-release.zip
mv rocketmq-all-4.1.0-incubating /monchickey/
cd /monchickey/rocketmq-all-4.1.0-incubating/
我这⾥安装到了/monchickey⽬录下⾯,⾸先可以按照官⽹上⾯的Quick Start⾛⼀遍,看看⼤致流程,ro
cketmq集包括nameserver和broker,nameserver负责管理集的列表信息,broker是真正作为消息承载和提供数据吞吐服务的,⾸先执⾏下⾯命令启动nameserver:nohup ./bin/mqnamesrv &
执⾏之后再敲⼀次确认键回到命令⾏,然后查看⽇志,默认位置在:~/logs/rocketmqlogs/namesrv.log中,如果看到下⾯内容则表⽰启动成功:
然后执⾏ jps 可以看到NamesrvStartup,就是nameserver进程了
然后需要启动broker,命令如下:
nohup ./bin/mqbroker -n monchickey:9876 &
这⾥-n指定nameserver地址,nameserver服务端⼝为9876,,这⾥如果在配置⽐较低的计算机或者虚拟机上很容易瞬间启动失败,这时候如果前台启动可能会看到下⾯这样的内容:
那么这种情况很明显就是内存不⾜导致的申请失败,RocketMQ默认配置是⽐较好的,这样可以直接应⽤于⽣产环境,所以如果机器内存较⼩,可以⼿动调整JVM的配置,可以先编辑bin/mqbroker会看到最后还是调⽤了bin/runbroker.sh,这⾥打开bin/runbroker.sh,到jvm 启动配置如下:
这⾥broker堆内存最⼤值和初始值都为8G,年轻代⼤⼩为4G,因为是测试环境所以xms和xmx都配置为4g,xmn配置为512m即可,配置完成后再次执⾏上⾯的命令启动即可,启动成功后⽇志位置同样是在家⽬录下,同样使⽤jps查看会看到BrokerStartup就是broker的进程
对于nameserver和broker⽇志位置都可以⼿动配置,具体配置⽂件就是conf下的l和l
现在可以跑⼀个简单的⽰例看⼀下了,现在可以打开两个窗⼝,⼀个查看⽣产者,⼀个查看消费者,⾸先两个shell窗⼝都需要执⾏命令: export NAMESRV_ADDR=monchickey:9876导⼊⼀下nameserver变量,然后第⼀个窗⼝执⾏下⾯命令启动⽣产者实例发送消息:
bin/tools.sh ample.quickstart.Producer
可以看到发送成功的消息返回:
然后另⼀个窗⼝可以启动消费者实例消费:
bin/tools.sh ample.quickstart.Consumer
可以看到消费消息如下:
到这⾥其实最简单的RocketMQ环境就配置好了,可以看到基本上没有什么配置需要修改的,停⽌nameserver和broker可以分别执⾏下⾯命令:
bin/mqshutdown namesrv
bin/mqshutdown namesrv
这样进程就可以结束了,下⾯来详细说⼀下⽣产环境应该怎么部署
对于kafka集,其中有⼀个节点为master,并且我们不⽤⼲预,master是kafka⾃动选择出来的,但是rocketMQ的master和slave都需要⼿动指定,所以kafka是broker中出来master和slave,⽽rocketmq中是多个master和slave,⼀块构建成为broker,两个过程基本上是相反的;另外在⽣产环境中nameserver建议⾄少设置2个,这样⼀个挂了集不受影响
对于rocketmq集,⼀个broker-name⼀般设置⼀个master以及⼀个或多个slave,⼀个集可以设置多个broker-name,在rocketmq的conf⽬录下可以看到如下⼏个常⽤的配置:
其中2m表⽰2个master,2s表⽰2个slave,sync表⽰同步刷盘,asyna表⽰异步刷盘和replication,默认情况下rocketmq是async模式
的,这样性能会⾮常好,但是如果需要保证消息的可靠性,建议使⽤sync的⽅式,
另外多说⼀下,kafka的topic⾥⾯有分区和副本的概念,使⽤之前都是根据数据量⼿动创建,对于rocketmq也⼀样,需要⼿动创建topic,rocketmq的topic中有队列(queue)的概念,也就是说⼀个节点上⾯可以有多个队列,这样能⾮常⼤的提⾼并发性,⽽kafka最多只能是⼀个分区⼀个进程消费,这样并发性限制⾮常⼤,并且单机分区数量不能过多,超过64个分区就出现明显的不稳定,但是rocketmq单机⽀
持上万队列,所以并发性能⾮常好;类⽐⼀下,rocketmq中⼀个broker-name其实就相当于kafka broker中的⼀个partition,⽽rocketmq每⼀个slave就相当于kafka中的⼀个replication,这种情况,所以rocketmq的特点相当于单个partition⽀持多队列,⼤致的原理图如下:
activemq集环境搭建 默认情况下,⼀个topic的队列数是8,当然在实际应⽤中可以设置的更⼤,知道了前⾯这些概念,那么在集中以2m-2s-sync的⽅式启动⼀个集就简单了,假设2台nameserver主机分别为rocket1和rocket2,则步骤如下:
1). 分别启动两个nameserver
rocket1 > nohup ./bin/mqnamesrv &
rocket2 > nohup ./bin/mqnamesrv &
2). 然后分别在剩下主机中分别启动2个master和2个slave:
bin/mqbroker -c ./conf/2m-2s-sync/broker-a.properties -n rocket1:9876,rocket2:9876
bin/mqbroker -c ./conf/2m-2s-sync/broker-a-s.properties -n rocket1:9876,rocket2:9876
bin/mqbroker -c ./conf/2m-2s-sync/broker-b.properties -n rocket1:9876,rocket2:9876
bin/mqbroker -c ./conf/2m-2s-sync/broker-b-s.properties -n rocket1:9876,rocket2:9876
这样就集就启动完毕了,实际⽣产中最好是⼀个服务器只运⾏⼀个broker实例
然后在单机上也可以启动多个broker master,为了加深对配置的理解下⾯是具体的步骤:
⾸先启动nameserver这个和之前⼀样,但是启动broker不能按照之前那样启动了,因为单机伪集模式也必须对应集名称,同样按照集中的概念来启动,先进⼊conf⽬录,可以看到有⼀个f,这个是相当于配置的简单模板,另外其他的配置也可以到上⾯说的
2m-2s那些⽬录中去参考⼀下,这个f是不能直接使⽤的,因为broker启动的时候⽤-c参数传⼊配置⽂件,这⾥只认识*.properties 的配置⽂件,所以这⾥应该分别执⾏:
f broker1.properties
cp broker1.properties broker2.properties
将配置⽂件复制为2份,先执⾏ vim broker1.properties 查看第⼀个配置⽂件,内容如下:
这⾥第⼀个是集名称,⼀个集必须配置⼀个,默认就是DefaultCluster,然后brokerName是broker的名称,master的话brokerId为0,其余的slave依次是1,2,3往后排,然后brokerRole配置表⽰异步的往slave拷贝,如果是slave节点直接写SLAVE即可,最后⼀个是刷盘的类型,这样这个配置⽂件不⽤动,然后启动第⼀个broker即可:
nohup bin/mqbroker -c ./conf/broker1.properties -n monchickey:9876 &
然后打开broker2.properties,修改如下:
⾸先是集名要⼀致,然后brokerName设置为⼀个新的broker-b,这个也是master,相当于第⼆个分区,然后只配置这些启动直接就报端⼝冲突的失败,因为这是单机环境,⽽broker默认端⼝是10911,所以为了避免冲突启动多个broker需要设置个新的端⼝,当然分布式环境都默认即可,这⾥添加了⼀个端⼝配置为11911,然后启动第⼆个broker:
nohup bin/mqbroker -c ./conf/broker2.properties -n monchickey:9876 &
这样就启动了第⼆个进程,此时jps应该可以看到两个broker进程,这就是⼀个最简单的集了,另外还有更多配置项这个可以参考官⽅⽂档讲的很详细,下⾯可以使⽤mqadmin⼯具执⾏⼀些CLI操作,⽐如直接执⾏: ./bin/mqadmin 可以看到所有的操作选项,常⽤的⽐如:updateTopic - 创建或更新topic,deleteTopic 删除topic,clusterList 列出集,topicList 列出topic,另外还可以按照时间戳以及id查看消息等,
⽐如执⾏: bin/mqadmin clusterList -n monchickey:9876查看集如下:
可以看到只有⼀个集2个broker
查看集状态可以执⾏: bin/mqadmin brokerStatus -c DefaultCluster -n monchickey:9876
新建⼀个默认配置的topic可以执⾏: bin/mqadmin updateTopic -b monchickey:10911 -n monchickey:9876 -t test
或者执⾏: bin/mqadmin updateTopic -c DefaultCluster -n monchickey:9876 -t test 这两个命令都可以,也就是说-b broker主机或者-c 集名必须指定⼀个,
这样⼀个topic就创建成功了,默认读和写的队列数都是8个,
然后可以执⾏命令: bin/mqadmin topicList -n monchickey:9876查看topic列表:
以及查看test这个topic队列分布的详细信息: bin/mqadmin topicStatus -n monchickey:9876 -t test
可以看到默认情况下队列都被分到broker-a上⾯了,⽐如我们要创建更多的队列,那么rocketmq会⾃动的均衡分布到集所有的broker 中
基本的命令就是上⾯这些,对于每个命令可以⽤的时候现查,⽐如topicStatus这个具体怎么⽤,可以执⾏: bin/mqadmin help topicStatus 或者 bin/mqadmin topicStatus -h 查看详细的参数,然后根据需要使⽤就可以了
好了,关于rocketmq的基本配置使⽤就先叙述这些,这确实是⼀个⾮常好⽤的消息中间件,值得深⼊的学习.. 最后感谢花时间阅读,如
果有其他内容或问题也欢迎补充,⼀起交流...
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论