ActiveMQ Cannot open the store. It's schema version is not supported.

LevelDB存储已被弃用,不再受支持或建议使用。推荐的商店是KahaDB

现象

目前使用的ActiveMQ集群,发现三台节点正常启动,关掉Master后,不能再启动Slave为Master。

查看Zookeeper和ActiveMQ运行状态均为running。

在日志中查看到如下错误内容
Cannot open the store.  It's schema version is not supported.

 处理

 在网上搜索一下,说是ActiveMQ的Leveldb的/data/leveldb/store-version.txt文件内容没了。

查看三台节点,返现一个节点store-version.txt文件内容为空

将文件内容恢复为:activemq_leveldb_store:1

保存后重启ActiveMQ发现可以进行主从切换了。

 分析

本次对【store-version.txt】文件进行分析,确保生产环境下不再复现此问题。

参考链接

 关于本次事件,网上的信息少之又少,所以只能局限于链接中的文章和自身的经历进行分析。

文章中提到,store-version.txt文件被截断的问题可能是OS主机被硬关闭(电源关闭,未正确关闭)或填满驱动器空间。

与我的操作相似的是,我的主节点也被强制关机过,因此推测store-version.txt文件是一个IO锁,当有生产者进行数据生产时,主节点进行持久化操作时(还未进行完持久化),突然将主节点下电,导致store-version.txt文件内容没有恢复。再次进行上电恢复后,因store-version.txt文件内容为空,导致ActiveMQ无法进行读写操作,即便Zookeeper和ActiveMQ运行状态为running。

 备注

本次使用的ActiveMQ版本为5.15.9

配置文件如下

<!--
    Licensed to the Apache Software Foundation (ASF) under one or more
    contributor license agreements.  See the NOTICE file distributed with
    this work for additional information regarding copyright ownership.
    The ASF licenses this file to You under the Apache License, Version 2.0
    (the "License"); you may not use this file except in compliance with
    the License.  You may obtain a copy of the License at

    http://www.apache.org/licenses/LICENSE-2.0

    Unless required by applicable law or agreed to in writing, software
    distributed under the License is distributed on an "AS IS" BASIS,
    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    See the License for the specific language governing permissions and
    limitations under the License.
-->
<!-- START SNIPPET: example -->
<beans
  xmlns="http://www.springframework.org/schema/beans"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
  http://activemq.apache.org/schema/core http://activemq.apache.org/schema/core/activemq-core.xsd">

    <!-- Allows us to use system properties as variables in this configuration file -->
    <bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
        <property name="locations">
            <value>file:${activemq.conf}/credentials.properties</value>
        </property>
    </bean>

   <!-- Allows accessing the server log -->
    <bean id="logQuery" class="io.fabric8.insight.log.log4j.Log4jLogQuery"
          lazy-init="false" scope="singleton"
          init-method="start" destroy-method="stop">
    </bean>

    <!--
        The <broker> element is used to configure the ActiveMQ broker.
    -->
    <broker xmlns="http://activemq.apache.org/schema/core" brokerName="ActiveMQCluster" dataDirectory="/home/activemq/data">

        <destinationPolicy>
            <policyMap>
              <policyEntries>
                <policyEntry topic=">" >
                    <!-- The constantPendingMessageLimitStrategy is used to prevent
                         slow topic consumers to block producers and affect other consumers
                         by limiting the number of messages that are retained
                         For more information, see:

                         http://activemq.apache.org/slow-consumer-handling.html

                    -->
                  <pendingMessageLimitStrategy>
                    <constantPendingMessageLimitStrategy limit="1000"/>
                  </pendingMessageLimitStrategy>
                </policyEntry>
              </policyEntries>
            </policyMap>
        </destinationPolicy>


        <!--
            The managementContext is used to configure how ActiveMQ is exposed in
            JMX. By default, ActiveMQ uses the MBean server that is started by
            the JVM. For more information, see:

            http://activemq.apache.org/jmx.html
        -->
        <managementContext>
            <managementContext createConnector="false"/>
        </managementContext>

        <!--
            Configure message persistence for the broker. The default persistence
            mechanism is the KahaDB store (identified by the kahaDB tag).
            For more information, see:

            http://activemq.apache.org/persistence.html
        -->
        <networkConnectors>
            <networkConnector uri="multicast://default"/>
        </networkConnectors>
        <persistenceAdapter>
            <replicatedLevelDB
                directory="/home/activemq/data/leveldb"
                replicas="3"
                bind="tcp://0.0.0.0:61611"
                zkAddress="************"
                zkPath="/activemq/leveldb-stores"
                hostname="******"
                verifyChecksums="true"
                paranoidChecks="true"
                indexCacheSize="536870912"
                sync="local_disk"
                zkPassword="admin"
            />
        </persistenceAdapter>



          <!--
            The systemUsage controls the maximum amount of space the broker will
            use before disabling caching and/or slowing down producers. For more information, see:
            http://activemq.apache.org/producer-flow-control.html
          -->
          <systemUsage>
            <systemUsage>
                <memoryUsage>
                    <memoryUsage percentOfJvmHeap="70" />
                </memoryUsage>
                <storeUsage>
                    <storeUsage limit="100 gb"/>
                </storeUsage>
                <tempUsage>
                    <tempUsage limit="50 gb"/>
                </tempUsage>
            </systemUsage>
        </systemUsage>

        <!--
            The transport connectors expose ActiveMQ over a given protocol to
            clients and other brokers. For more information, see:

            http://activemq.apache.org/configuring-transports.html
        -->
        <transportConnectors>
            <!-- DOS protection, limit concurrent connections to 1000 and frame size to 100MB -->
            <transportConnector name="openwire" uri="tcp://0.0.0.0:61617?maximumConnections=1000&amp;wireFormat.maxFrameSize=104857600" discoveryUri="multicast://default" enableStatusMonitor="true"/>
            <transportConnector name="amqp" uri="amqp://0.0.0.0:5672?maximumConnections=1000&amp;wireFormat.maxFrameSize=104857600"/>
            <transportConnector name="stomp" uri="stomp://0.0.0.0:61613?maximumConnections=1000&amp;wireFormat.maxFrameSize=104857600"/>
            <transportConnector name="mqtt" uri="mqtt://0.0.0.0:1883?maximumConnections=1000&amp;wireFormat.maxFrameSize=104857600"/>
            <transportConnector name="ws" uri="ws://0.0.0.0:61614?maximumConnections=1000&amp;wireFormat.maxFrameSize=104857600"/>
        </transportConnectors>

        <!-- destroy the spring context on shutdown to stop jetty -->
        <shutdownHooks>
            <bean xmlns="http://www.springframework.org/schema/beans" class="org.apache.activemq.hooks.SpringContextHook" />
        </shutdownHooks>

    </broker>

    <!--
        Enable web consoles, REST and Ajax APIs and demos
        The web consoles requires by default login, you can disable this in the jetty.xml file

        Take a look at ${ACTIVEMQ_HOME}/conf/jetty.xml for more details
    -->
    <import resource="jetty.xml"/>

</beans>
<!-- END SNIPPET: example -->
View Code

原文地址:https://www.cnblogs.com/GoCircle/p/12557266.html