WSO2-AM:重启后,存储中的API调用失败

时间:2017-10-19 13:36:30

标签: wso2 kubernetes wso2-am

我们已设置最新版本的

  • API Manager
  • Identity Server
  • Data Analytics Server

在kubernetes集群上的单独pod中(我们使用现有脚本作为创建docker镜像的基础),所有共享托管在同一集群上另一个pod中的相关MySQL数据库。经过大量配置后,一切都按预期工作,我们可以添加用户/角色,创建/发布/调用API并收集这些调用的分析。然而,我们面临的最后一个问题是,一旦API发布,就可以在商店中调用它。一旦API管理器启动(例如通过向下/向上扩展相关部署,而不是使用碳仪表板),一旦API管理器启动并在这样(硬)重启后再次运行,问题就出现了,已发布的API在商店中仍然可见,但是,如果尝试调用其中一个(以前正在工作的)端点,则会返回404消息,并且API管理器会记录以下错误:

  

INFO {org.apache.synapse.mediators.builtin.LogMediator} - 状态=   消息已分派到主序列。 URL无效,RE​​SOURCE =   /" context" /"端点被调用"

其中" context"是给定API在发布时设置的上下文和"端点被称为"应该接收呼叫的服务的REST端点。此外,如果我们尝试对发布者中的API进行更改(即重新发布),则可能会有50/50的可能性并且修复所有问题,直到下次重新启动pod或错误为止单击"下一步:实施"已经记录here的第一步按钮(虽然它已经说明它已经在以前的版本中得到解决)。

其余设置如下:

用户/角色

  • 用户:prod,用于在发布商

  • 中创建和发布API
  • 角色:prod-role(没有特权的空角色),内部/创建者, 内部/出版者

  • 用户:cons,用于在商店中调用API

  • 角色:cons-role(空角色,没有特权,只是为了提供 访问商店中的API),内部/订阅者

数据库

  • WSO2_CARBON_DB引用MySQL pod上的数据库,仅由API-Manager使用

  • WSO2REG_DB应该是三个模块之间的共享注册表数据库(am,das,is)

摘自am:

中的master-datasources.xml
        <datasource>
             <name>WSO2_CARBON_DB</name>
             <description>The datasource used by the registry</description>
             <jndiConfig>
               <name>jdbc/WSO2CarbonDB</name>
             </jndiConfig>
             <definition type="RDBMS">
               <configuration>
                 <url>jdbc:mysql://mysql-apimdb:3306/amcarbondb?autoReconnect=true&amp;useSSL=false</url>
                 <username>wso2carbon</username>
                 <password>abc</password>
                 <driverClassName>com.mysql.jdbc.Driver</driverClassName>
                 <maxActive>50</maxActive>
                 <maxWait>60000</maxWait>
                 <testOnBorrow>true</testOnBorrow>
                 <validationQuery>SELECT 1</validationQuery>
                 <validationInterval>30000</validationInterval>
               </configuration>
             </definition>
        </datasource> 

        <datasource>
            <name>WSO2AM_DB</name>
            <description>The datasource used for API Manager database</description>
            <jndiConfig>
                <name>jdbc/WSO2AM_DB</name>
            </jndiConfig>
            <definition type="RDBMS">
                <configuration>
                    <url>jdbc:mysql://mysql-apimdb:3306/apimgtdb?autoReconnect=true&amp;useSSL=false</url>
                    <username>wso2carbon</username>
                    <password>abc</password>
                    <defaultAutoCommit>false</defaultAutoCommit>
                    <driverClassName>com.mysql.jdbc.Driver</driverClassName>
                    <maxActive>50</maxActive>
                    <maxWait>60000</maxWait>
                    <testOnBorrow>true</testOnBorrow>
                    <validationQuery>SELECT 1</validationQuery>
                    <validationInterval>30000</validationInterval>
                </configuration>
            </definition>
        </datasource>

        <datasource>
             <name>WSO2UM_DB</name>
             <description>The datasource used by user manager</description>
             <jndiConfig>
               <name>jdbc/WSO2UM_DB</name>
             </jndiConfig>
             <definition type="RDBMS">
               <configuration>
                 <url>jdbc:mysql://mysql-apimdb:3306/userdb?autoReconnect=true&amp;useSSL=false</url>
                 <username>wso2carbon</username>
                 <password>abc</password>
                 <driverClassName>com.mysql.jdbc.Driver</driverClassName>
                 <maxActive>50</maxActive>
                 <maxWait>60000</maxWait>
                 <testOnBorrow>true</testOnBorrow>
                 <validationQuery>SELECT 1</validationQuery>
                 <validationInterval>30000</validationInterval>
               </configuration>
             </definition>
        </datasource>

        <datasource>
            <name>WSO2REG_DB</name>
            <description>The datasource used for registry</description>
            <jndiConfig>
                <name>jdbc/WSO2REG_DB</name>
            </jndiConfig>
            <definition type="RDBMS">
                <configuration>
                    <url>jdbc:mysql://mysql-apimdb:3306/regdb?autoReconnect=true&amp;useSSL=false</url>
                    <username>wso2carbon</username>
                    <password>abc</password>
                    <driverClassName>com.mysql.jdbc.Driver</driverClassName>
                    <maxActive>50</maxActive>
                    <maxWait>60000</maxWait>
                    <testOnBorrow>true</testOnBorrow>
                    <validationQuery>SELECT 1</validationQuery>
                    <validationInterval>30000</validationInterval>
                </configuration>
            </definition>
        </datasource>

所有这些数据库在使用时都会填充,并使用来自不同产品的DBscripts进行初始化,以进行初始设置。此外,registry.xml配置如下(仅显示更改,文件的其余部分默认配置):

<currentDBConfig>wso2registry</currentDBConfig>
<readOnly>false</readOnly>
<enableCache>false</enableCache>
<registryRoot>/</registryRoot>

<dbConfig name="wso2registry">
    <dataSource>jdbc/WSO2CarbonDB</dataSource>
</dbConfig>
<dbConfig name="govregistry">
    <dataSource>jdbc/WSO2REG_DB</dataSource>
</dbConfig>

<remoteInstance url="https://localhost:9943/registry"> 
   <id>gov</id>
   <dbConfig>govregistry</dbConfig>
   <cacheId>wso2carbon@jdbc:mysql://mysql-apimdb:3306/regdb</cacheId>
   <readOnly>false</readOnly>
   <enableCache>false</enableCache>
   <registryRoot>/</registryRoot>
</remoteInstance>

<mount path="/_system/governance" overwrite="true">
       <instanceId>gov</instanceId>
       <targetPath>/_system/governance</targetPath>
</mount>

<mount path="/_system/config" overwrite="true">
       <instanceId>gov</instanceId>
       <targetPath>/_system/config</targetPath>
</mount>

最后,由于我们已经将所有数据库移动到另一个pod上的持久存储中,因此我们已经将所有数据库移动到另一个pod上的持久存储中,因此在重新启动时,某些数据会因重新启动而丢失,这似乎是一个问题。问题是 - 除非我们错过了什么。是否需要添加/更改其他注册表/数据源?上面未显示的所有其他默认数据源(STATS,MB_STORE,METRICS)也设置为使用MySQL服务器,因此除非数据源文件夹中提供的数据源不是其他内容,否则所有数据都应保留在相应的MySQL数据库中

2 个答案:

答案 0 :(得分:1)

我猜你还没有为API Manager使用任何持久存储。创建API时,API工件在文件系统中创建并存储在wso2am-2.1.0 / repository / deployment / server / synapse-configs / de fault / api位置。您需要为&#39; wso2am-2.1.0 / repository / deployment / server /&#39;提供持久存储。在您的情况下,在重新启动期间,您没有相关数据,因为您有一个新包装。

答案 1 :(得分:1)

这可以通过移动到以下文件夹的持久卷来解决: 正如建议的那样: /repository/deployment/server

但是,在多租户安装的情况下,还需要持久化: /repository/tenants