RocketMQ学习-02双主双从搭建
背景

修改配置文件
将RocketMQ安装到/usr/local/下
配置文件所在目录/usr/local/rocketmq-all-4.7.0-source-release/distribution/target/rocketmq-4.7.0/rocketmq-4.7.0/conf/
配置文件修改及说明
#修改服务器1的broker-a.properties、broker-a-s.properties,服务器2的broker-b.properties、broker-b-s.properties
#后面启动会用到这4个文件
/usr/local/rocketmq-all-4.7.0-source-release/distribution/target/rocketmq-4.7.0/rocketmq-4.7.0/conf/2m-2s-sync
配置:两台服务器(ip1、ip2)
服务器1(ip1)
#主
#如多网卡或者虚拟服务器,需要暴露真实ip
brokerIP1=ip1
namesrvAddr=ip1:9876;ip2:9876
brokerClusterName=DefaultCluster
#主从brokerName值一样,表明关系
brokerName=broker-a
#为0表示主,大于0表示从
brokerId=0
#删除文件时间为凌晨4点
deleteWhen=04
#文件保留时间
fileReservedTime=48
#同步双写Master
brokerRole=SYNC_MASTER
#同步刷盘
flushDiskType=SYNC_FLUSH
#同一台服务器部署主从,需要不同端口来区分
listenPort=10911
#存储路径
storePathRootDir=/usr/local/rocketmq/store-a
#从
brokerIP1=ip1
namesrvAddr=ip1:9876;ip2:9876
brokerClusterName=DefaultCluster
brokerName=broker-a
brokerId=1
deleteWhen=04
fileReservedTime=48
brokerRole=SYNC_MASTER
flushDiskType=ASYNC_FLUSH
listenPort=11011
storePathRootDir=/usr/local/rocketmq/store-a-slave
服务器2(ip2)
#主
brokerIP1=ip2
namesrvAddr=ip1:9876;ip2:9876
brokerClusterName=DefaultCluster
brokerName=broker-b
brokerId=0
deleteWhen=04
fileReservedTime=48
brokerRole=SYNC_MASTER
flushDiskType=SYNC_FLUSH
listenPort=10911
storePathRootDir=/home/rocketmq/store-b
#从
brokerIP1=ip2
namesrvAddr=ip1:9876;ip2:9876
brokerClusterName=DefaultCluster
brokerName=broker-b
brokerId=1
deleteWhen=04
fileReservedTime=48
brokerRole=SLAVE
flushDiskType=ASYNC_FLUSH
listenPort=11011
storePathRootDir=/home/rocketmq/store-b-slave
启动
cd /usr/local/rocketmq-all-4.7.0-source-release/distribution/target/rocketmq-4.7.0/rocketmq-4.7.0/
#启动nameserver
nohup sh bin/mqnamesrv &
#启动broker,其他类似
./bin/mqbroker -c /usr/local/rocketmq-all-4.7.0-source-release/distribution/target/rocketmq-4.7.0/rocketmq-4.7.0/conf/2m-2s-sync/broker-b.properties &
问题及解决
问题1
java.lang.RuntimeException: Lock failed,MQ already started
at org.apache.rocketmq.store.DefaultMessageStore.start(DefaultMessageStore.java:214)
at org.apache.rocketmq.broker.BrokerController.start(BrokerController.java:827)
at org.apache.rocketmq.broker.BrokerStartup.start(BrokerStartup.java:64)
at org.apache.rocketmq.broker.BrokerStartup.main(BrokerStartup.java:58)
解决:将broker的master和slave节点放在同一台机器上,配置的storePath相同导致的,修改配置文件,改为不同的路径即可解决。
问题2
默认RocketMQ占用的内存较大,可修改为如下所示:
cd /usr/local/rocketmq/distribution/target/rocketmq-4.7.0/rocketmq-4.7.0/bin
vi runserver.sh
JAVA_OPT="${JAVA_OPT} -server -Xms256m -Xmx256m -Xmn256m -XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=320m"
vi runbroker.sh
JAVA_OPT="${JAVA_OPT} -server -Xms256m -Xmx256m -Xmn256m"
问题3
如果是阿里云服务器存在安全组的限制时,需要放开对应的端口

问题4
Spring boot整合RocketMQ,启动时报错,更换spring boot版本或直接使用RocketMQ解决
使用如下配置报错,改为直接使用rocketmq-client
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.3.6.RELEASE</version>
</parent>
<dependency>
<groupId>org.apache.rocketmq</groupId>
<artifactId>rocketmq-spring-boot-starter</artifactId>
<version>2.1.0</version>
</dependency>
报错信息:
[ ERROR ] [2020-06-29 16:13:32] [main-org.springframework.boot.SpringApplication--821 line] - Application startup failed
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'org.apache.rocketmq.spring.autoconfigure.ListenerContainerConfiguration': Instantiation of bean failed; nested exception is org.springframework.beans.BeanInstantiationException: Failed to instantiate [org.apache.rocketmq.spring.autoconfigure.ListenerContainerConfiguration$$EnhancerBySpringCGLIB$$85647c72]: No default constructor found; nested exception is java.lang.NoSuchMethodException: org.apache.rocketmq.spring.autoconfigure.ListenerContainerConfiguration$$EnhancerBySpringCGLIB$$85647c72.<init>()
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.instantiateBean(AbstractAutowireCapableBeanFactory.java:1105)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:1050)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:510)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:482)
at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:306)
at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:230)
at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:302)
at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:197)
at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:772)
at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:839)
at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:538)
at org.springframework.boot.context.embedded.EmbeddedWebApplicationContext.refresh(EmbeddedWebApplicationContext.java:118)
at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:760)
at org.springframework.boot.SpringApplication.createAndRefreshContext(SpringApplication.java:360)
at org.springframework.boot.SpringApplication.run(SpringApplication.java:306)

浙公网安备 33010602011771号