Loading

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)
posted @ 2020-07-22 14:14  莫伊u  阅读(422)  评论(0)    收藏  举报