WSO2 SVN 同步器与集群上的管理器更新同步的巨大滞后
Huge lag for WSO2 SVN Synchronizer to sync with manager updates on cluster
我运行在我的 Windows PC 上的 VM 上的 WSO2 APIM 1.10.0 上设置测试环境。它被配置为使用 MySQL 服务器(我在我的 PC 上也使用 运行 的 MiraDB)。一切正常。
最近我想通过在我的 PC 上设置 3 个 VM 来尝试 WSO2 集群环境:
- 第一个是 运行发布者、商店、KM 等(我使用的是偏移量 1,所以端口是 9444、9764 等。)
- 另外两个每个 运行 一个网关工作者("guest" 端口 8243,映射到 "host" 端口 8243 和 8943)。
我也在运行使用 VisualSVN 服务器在它们之间进行同步。
在manager节点上,SVN同步器配置为:
<DeploymentSynchronizer>
<Enabled>true</Enabled>
<AutoCommit>true</AutoCommit>
<AutoCheckout>true</AutoCheckout>
<RepositoryType>svn</RepositoryType>
<SvnUrl>https://10.0.2.2/svn/apigw/</SvnUrl>
<SvnUser>...</SvnUser>
<SvnPassword>...</SvnPassword>
<SvnUrlAppendTenantId>true</SvnUrlAppendTenantId>
</DeploymentSynchronizer>
在工作节点上:
<DeploymentSynchronizer>
<Enabled>true</Enabled>
<AutoCommit>false</AutoCommit>
<AutoCheckout>true</AutoCheckout>
<RepositoryType>svn</RepositoryType>
<SvnUrl>https://10.0.2.2/svn/apigw/</SvnUrl>
<SvnUser>...</SvnUser>
<SvnPassword>...</SvnPassword>
<SvnUrlAppendTenantId>true</SvnUrlAppendTenantId>
</DeploymentSynchronizer>
AXIS2 配置为使用
进行集群
- 端口 4500 上的管理器节点
- 端口 4100 和 4200 上的工作节点
我使用 telnet 检查过,所有端口都可以从所有节点访问。
管理器上 API 的更改已正确提交到 SVN。我检查了 Visual SVN 和命令行 SVN 客户端。例如,在添加 API ofer3 后,创建了修订版 #11,并被命令行 SVN 工具看到:
> svn.exe revert .
> svn.exe update . -r HEAD --depth=infinity
Updating '.':
U -1234\synapse-configs\default\api\admin--ofer3_v1.0.0.xml
Updated to revision 11.
但是需要大约 10 分钟才能将在管理器节点上所做的更改填充到工作程序。
例如,在 16:29
的经理处添加 ofer2 API
TID: [-1234] [] [2017-03-07 16:29:01,156] INFO {org.apache.synapse.rest.API} - Initializing API: admin--ofer2:v1.0.0
TID: [-1234] [] [2017-03-07 16:29:16,104] INFO {org.wso2.carbon.core.deployment.CarbonDeploymentSchedulerTask} - Sent [SynchronizeRepositoryRequest{tenantId=-1234, tenantDomain='carbon.super', messageId=64959660-b2e6-4293-ad9c-3b0d68229976}]
5 分钟后 16:34 到达客户处:
TID: [-1234] [] [2017-03-07 16:34:14,134] INFO {org.apache.synapse.rest.API} - Initializing API: admin--ofer2:v1.0.0
TID: [-1234] [] [2017-03-07 16:34:14,134] INFO {org.apache.synapse.deployers.APIDeployer} - API named 'admin--ofer2:v1.0.0' has been deployed from file : /AppMount/wso2worker-1.10.0/repository/deployment/server/synapse-configs/default/api/admin--ofer2_v1.0.0.xml
而且很多时候花费的时间更长(9-10 分钟)。
我在 worker 上打开了同步调试器,希望看到它每隔几秒尝试与 SVN 存储库同步一次,但只看到它每隔几分钟尝试一次。
也试过:
<SynchronizationPeriod>1</SynchronizationPeriod>
但它并没有改变任何东西。
至于日志消息
在工人日志上,我看到:
TID: [-1234] [] [2017-03-07 15:07:31,431] ERROR {org.apache.catalina.loader.WebappClassLoa
der} - The web application [/api/am/publisher/v0.9] appears to have started a TimerThread
named [Timer-8] via the java.util.Timer API but has failed to stop it. To prevent a memor
y leak, the timer (and hence the associated thread) has been forcibly canceled.
但是/api/am/publisher/0.9是publisher的REST,没有关系
日志中似乎没有其他有趣的内容。
最后说明:根本没有填充对租户的更改。我在管理器上有租户 #1,我确实在 SVN 存储库上看到它,但在工作人员上,目录 /AppMount/wso2/repository/tenants 是空的。仅填充对超级碳 [-1234] 的更改。不确定这是同一个问题还是其他问题。
任何想法将不胜感激。
跟进#1,基于 Pubci
的输入
- 时间同步b/w所有三个节点
- 域在所有三个节点中都是相同的(我保留了默认值)
axis2.xml of manager(10.0.2.2是虚拟机的主机地址,所以它作为一个虚拟机到另一个虚拟机的"bridge")
<parameter name="domain">wso2.am.domain</parameter>
<parameter name="membershipScheme">wka</parameter>
<parameter name="localMemberPort">4500</parameter>
<members>
<member><hostName>127.0.0.1</hostName><port>4500</port></member>
<member><hostName>10.0.2.2</hostName><port>4100</port></member>
<member><hostName>10.0.2.2</hostName><port>4200</port></member>
</members>
工作节点 1 的 axis2.xml:
<parameter name="domain">wso2.am.domain</parameter>
<parameter name="membershipScheme">wka</parameter>
<parameter name="localMemberPort">4500</parameter>
<members>
<member><hostName>10.0.2.2</hostName><port>4500</port></member>
<member><hostName>127.0.0.1</hostName><port>4100</port></member>
<member><hostName>10.0.2.2</hostName><port>4200</port></member>
</members>
当 worker 启动时,它会列出以下成员:
TID: [-1234] [] [2017-03-08 09:40:39,450] INFO {org.wso2.carbon.core.clustering.hazelcast.util.MemberUtils} - Added member: Host:10.0.2.2, Remote Host:null, Port: 4500, HTTP:-1, HTTPS:-1, Domain: null, Sub-domain:null, Active:true
TID: [-1234] [] [2017-03-08 09:40:39,450] INFO {org.wso2.carbon.core.clustering.hazelcast.util.MemberUtils} - Added member: Host:127.0.0.1, Remote Host:null, Port: 4100, HTTP:-1, HTTPS:-1, Domain: null, Sub-domain:null, Active:true
TID: [-1234] [] [2017-03-08 09:40:39,451] INFO {org.wso2.carbon.core.clustering.hazelcast.util.MemberUtils} - Added member: Host:10.0.2.2, Remote Host:null, Port: 4200, HTTP:-1, HTTPS:-1, Domain: null, Sub-domain:null, Active:true
注意日志中的 "Domain: null"。这样可以吗?
当 worker 启动时,它与 SVN 存储库正确同步:
TID: [-1234] [] [2017-03-08 09:40:51,184] DEBUG {org.wso2.carbon.deployment.synchronizer.subversion.SVNNotifyListener} - revert /AppMount/wso2/repository/deployment/server
TID: [-1234] [] [2017-03-08 09:40:58,139] DEBUG {org.wso2.carbon.deployment.synchronizer.subversion.SVNNotifyListener} - update /AppMount/wso2/repository/deployment/server -r HEAD --depth=infinity
TID: [-1234] [] [2017-03-08 09:40:59,766] DEBUG {org.wso2.carbon.deployment.synchronizer.subversion.SVNNotifyListener} - notify.at
TID: [-1234] [] [2017-03-08 09:41:00,103] DEBUG {org.wso2.carbon.deployment.synchronizer.subversion.SVNBasedArtifactRepository} - files were updated to revision number: 15 using SVN Kit
从那时起,carbon scheduler 任务每 15 秒说一次 运行s SVN 同步:
TID: [-1234] [] [2017-03-08 09:41:45,213] DEBUG {org.wso2.carbon.core.deployment.CarbonDeploymentSchedulerTask} -
Running deployment synchronizer update... tenant : carbon.super
但是SVN同步器似乎没有更新server/deployment下synapse-config中的文件。
你提到这是因为经理的消息没有到达工人那里。
我确实看到经理发了一条消息:
TID: [-1234] [] [2017-03-08 08:49:48,121]
INFO {org.wso2.carbon.core.deployment.CarbonDeploymentSchedulerTask} -
Sent [SynchronizeRepositoryRequest{tenantId=-1234, tenantDomain='carbon.super',
messageId=a99ff1fc-58d8-44dd-8804-491216ae1a7c}]
我应该启用哪个调试以查看消息是否到达工作程序?
对于故障排除,您可以检查以下内容。
- Axis2.xml 中的集群配置 - 由于您在单个节点中有 运行 多个配置文件,因此您需要将所有 3 个节点集群为一个集群。所以域名在所有 3 个节点中应该相同。
- 时间应该在所有 3 个节点之间同步。
发布 API 后,集群消息将发送到工作节点。然后只有工作节点会从 SVN 获取更新。
关于您在管理器节点中收到的错误消息,请检查api-manager.xml中的AuthManager配置。看起来您已将值设置为 admin/services。该值应该是密钥管理器节点主机名。在您的情况下,它应该是管理器节点的主机名。
感谢 Pubci 的帮助,我发现了这个问题。
a) 在 manager 和 workers 的 axis2.xml 中,localMemberHost 必须是 10.0.2.2(这是从 VM 到其他主机的网关)而不是 127.0.0.1:
<parameter name="localMemberHost">10.0.2.2</parameter>
b) 同样在 axis2.xml 中,我启用了 groupManagement,但它已被禁用。在管理器节点中:
<groupManagement enable="true">
<applicationDomain name="wso2.apim.domain"
description="APIM group"
agent="org.wso2.carbon.core.clustering.hazelcast.HazelcastGroupManagementAgent"
subDomain="mgt"
port="2233"/>
</groupManagement>
在工作节点中:
<groupManagement enable="true">
<applicationDomain name="wso2.apim.domain"
description="APIM group"
agent="org.wso2.carbon.core.clustering.hazelcast.HazelcastGroupManagementAgent"
subDomain="worker"
port="2233"/>
</groupManagement>
(我使用端口 2233 而不是默认端口 2222,因为端口 2222 在我的集群中用于其他目的)。
现在在管理器中我看到:
INFO {org.wso2.carbon.core.clustering.hazelcast.wka.WKABasedMembershipScheme} -
Member joined [6bf6ae47-bea4-4bc4-beec-9140a626781b]: /10.0.2.2:4200
并且在 worker 中,在 API 更改之后,我确实看到消息进来了,也适用于 super.carbon 以外的租户:
INFO {org.wso2.carbon.core.clustering.hazelcast.HazelcastClusterMessageListener} -
Received ClusteringMessage: SynchronizeRepositoryRequest{tenantId=1, tenantDomain='0000s7.com', messageId=a573eeef-46d7-4a2b-bfc9-362296bb60d4}
给在集群上遇到 SVN 问题的人的提示:
- 确保 Hazelcast 在 WSO2 即将到来时显示的成员列表是正确的。
- 确保在工作人员上任时在经理日志中看到成员加入消息。
- 确保您在经理更改后看到工人 "Message Received"。
帮助您解决问题的调试选项:
log4j.logger.org.wso2.carbon.core.deployment=DEBUG
log4j.logger.org.wso2.carbon.deployment.synchronizer=DEBUG
我运行在我的 Windows PC 上的 VM 上的 WSO2 APIM 1.10.0 上设置测试环境。它被配置为使用 MySQL 服务器(我在我的 PC 上也使用 运行 的 MiraDB)。一切正常。
最近我想通过在我的 PC 上设置 3 个 VM 来尝试 WSO2 集群环境:
- 第一个是 运行发布者、商店、KM 等(我使用的是偏移量 1,所以端口是 9444、9764 等。)
- 另外两个每个 运行 一个网关工作者("guest" 端口 8243,映射到 "host" 端口 8243 和 8943)。
我也在运行使用 VisualSVN 服务器在它们之间进行同步。
在manager节点上,SVN同步器配置为:
<DeploymentSynchronizer>
<Enabled>true</Enabled>
<AutoCommit>true</AutoCommit>
<AutoCheckout>true</AutoCheckout>
<RepositoryType>svn</RepositoryType>
<SvnUrl>https://10.0.2.2/svn/apigw/</SvnUrl>
<SvnUser>...</SvnUser>
<SvnPassword>...</SvnPassword>
<SvnUrlAppendTenantId>true</SvnUrlAppendTenantId>
</DeploymentSynchronizer>
在工作节点上:
<DeploymentSynchronizer>
<Enabled>true</Enabled>
<AutoCommit>false</AutoCommit>
<AutoCheckout>true</AutoCheckout>
<RepositoryType>svn</RepositoryType>
<SvnUrl>https://10.0.2.2/svn/apigw/</SvnUrl>
<SvnUser>...</SvnUser>
<SvnPassword>...</SvnPassword>
<SvnUrlAppendTenantId>true</SvnUrlAppendTenantId>
</DeploymentSynchronizer>
AXIS2 配置为使用
进行集群- 端口 4500 上的管理器节点
- 端口 4100 和 4200 上的工作节点
我使用 telnet 检查过,所有端口都可以从所有节点访问。
管理器上 API 的更改已正确提交到 SVN。我检查了 Visual SVN 和命令行 SVN 客户端。例如,在添加 API ofer3 后,创建了修订版 #11,并被命令行 SVN 工具看到:
> svn.exe revert .
> svn.exe update . -r HEAD --depth=infinity
Updating '.':
U -1234\synapse-configs\default\api\admin--ofer3_v1.0.0.xml
Updated to revision 11.
但是需要大约 10 分钟才能将在管理器节点上所做的更改填充到工作程序。
例如,在 16:29
的经理处添加 ofer2 APITID: [-1234] [] [2017-03-07 16:29:01,156] INFO {org.apache.synapse.rest.API} - Initializing API: admin--ofer2:v1.0.0
TID: [-1234] [] [2017-03-07 16:29:16,104] INFO {org.wso2.carbon.core.deployment.CarbonDeploymentSchedulerTask} - Sent [SynchronizeRepositoryRequest{tenantId=-1234, tenantDomain='carbon.super', messageId=64959660-b2e6-4293-ad9c-3b0d68229976}]
5 分钟后 16:34 到达客户处:
TID: [-1234] [] [2017-03-07 16:34:14,134] INFO {org.apache.synapse.rest.API} - Initializing API: admin--ofer2:v1.0.0
TID: [-1234] [] [2017-03-07 16:34:14,134] INFO {org.apache.synapse.deployers.APIDeployer} - API named 'admin--ofer2:v1.0.0' has been deployed from file : /AppMount/wso2worker-1.10.0/repository/deployment/server/synapse-configs/default/api/admin--ofer2_v1.0.0.xml
而且很多时候花费的时间更长(9-10 分钟)。
我在 worker 上打开了同步调试器,希望看到它每隔几秒尝试与 SVN 存储库同步一次,但只看到它每隔几分钟尝试一次。
也试过:
<SynchronizationPeriod>1</SynchronizationPeriod>
但它并没有改变任何东西。
至于日志消息
在工人日志上,我看到:
TID: [-1234] [] [2017-03-07 15:07:31,431] ERROR {org.apache.catalina.loader.WebappClassLoa
der} - The web application [/api/am/publisher/v0.9] appears to have started a TimerThread
named [Timer-8] via the java.util.Timer API but has failed to stop it. To prevent a memor
y leak, the timer (and hence the associated thread) has been forcibly canceled.
但是/api/am/publisher/0.9是publisher的REST,没有关系
日志中似乎没有其他有趣的内容。
最后说明:根本没有填充对租户的更改。我在管理器上有租户 #1,我确实在 SVN 存储库上看到它,但在工作人员上,目录 /AppMount/wso2/repository/tenants 是空的。仅填充对超级碳 [-1234] 的更改。不确定这是同一个问题还是其他问题。
任何想法将不胜感激。
跟进#1,基于 Pubci
的输入- 时间同步b/w所有三个节点
- 域在所有三个节点中都是相同的(我保留了默认值)
axis2.xml of manager(10.0.2.2是虚拟机的主机地址,所以它作为一个虚拟机到另一个虚拟机的"bridge")
<parameter name="domain">wso2.am.domain</parameter>
<parameter name="membershipScheme">wka</parameter>
<parameter name="localMemberPort">4500</parameter>
<members>
<member><hostName>127.0.0.1</hostName><port>4500</port></member>
<member><hostName>10.0.2.2</hostName><port>4100</port></member>
<member><hostName>10.0.2.2</hostName><port>4200</port></member>
</members>
工作节点 1 的 axis2.xml:
<parameter name="domain">wso2.am.domain</parameter>
<parameter name="membershipScheme">wka</parameter>
<parameter name="localMemberPort">4500</parameter>
<members>
<member><hostName>10.0.2.2</hostName><port>4500</port></member>
<member><hostName>127.0.0.1</hostName><port>4100</port></member>
<member><hostName>10.0.2.2</hostName><port>4200</port></member>
</members>
当 worker 启动时,它会列出以下成员:
TID: [-1234] [] [2017-03-08 09:40:39,450] INFO {org.wso2.carbon.core.clustering.hazelcast.util.MemberUtils} - Added member: Host:10.0.2.2, Remote Host:null, Port: 4500, HTTP:-1, HTTPS:-1, Domain: null, Sub-domain:null, Active:true
TID: [-1234] [] [2017-03-08 09:40:39,450] INFO {org.wso2.carbon.core.clustering.hazelcast.util.MemberUtils} - Added member: Host:127.0.0.1, Remote Host:null, Port: 4100, HTTP:-1, HTTPS:-1, Domain: null, Sub-domain:null, Active:true
TID: [-1234] [] [2017-03-08 09:40:39,451] INFO {org.wso2.carbon.core.clustering.hazelcast.util.MemberUtils} - Added member: Host:10.0.2.2, Remote Host:null, Port: 4200, HTTP:-1, HTTPS:-1, Domain: null, Sub-domain:null, Active:true
注意日志中的 "Domain: null"。这样可以吗?
当 worker 启动时,它与 SVN 存储库正确同步:
TID: [-1234] [] [2017-03-08 09:40:51,184] DEBUG {org.wso2.carbon.deployment.synchronizer.subversion.SVNNotifyListener} - revert /AppMount/wso2/repository/deployment/server
TID: [-1234] [] [2017-03-08 09:40:58,139] DEBUG {org.wso2.carbon.deployment.synchronizer.subversion.SVNNotifyListener} - update /AppMount/wso2/repository/deployment/server -r HEAD --depth=infinity
TID: [-1234] [] [2017-03-08 09:40:59,766] DEBUG {org.wso2.carbon.deployment.synchronizer.subversion.SVNNotifyListener} - notify.at
TID: [-1234] [] [2017-03-08 09:41:00,103] DEBUG {org.wso2.carbon.deployment.synchronizer.subversion.SVNBasedArtifactRepository} - files were updated to revision number: 15 using SVN Kit
从那时起,carbon scheduler 任务每 15 秒说一次 运行s SVN 同步:
TID: [-1234] [] [2017-03-08 09:41:45,213] DEBUG {org.wso2.carbon.core.deployment.CarbonDeploymentSchedulerTask} -
Running deployment synchronizer update... tenant : carbon.super
但是SVN同步器似乎没有更新server/deployment下synapse-config中的文件。
你提到这是因为经理的消息没有到达工人那里。
我确实看到经理发了一条消息:
TID: [-1234] [] [2017-03-08 08:49:48,121]
INFO {org.wso2.carbon.core.deployment.CarbonDeploymentSchedulerTask} -
Sent [SynchronizeRepositoryRequest{tenantId=-1234, tenantDomain='carbon.super',
messageId=a99ff1fc-58d8-44dd-8804-491216ae1a7c}]
我应该启用哪个调试以查看消息是否到达工作程序?
对于故障排除,您可以检查以下内容。
- Axis2.xml 中的集群配置 - 由于您在单个节点中有 运行 多个配置文件,因此您需要将所有 3 个节点集群为一个集群。所以域名在所有 3 个节点中应该相同。
- 时间应该在所有 3 个节点之间同步。
发布 API 后,集群消息将发送到工作节点。然后只有工作节点会从 SVN 获取更新。
关于您在管理器节点中收到的错误消息,请检查api-manager.xml中的AuthManager配置。看起来您已将值设置为 admin/services。该值应该是密钥管理器节点主机名。在您的情况下,它应该是管理器节点的主机名。
感谢 Pubci 的帮助,我发现了这个问题。
a) 在 manager 和 workers 的 axis2.xml 中,localMemberHost 必须是 10.0.2.2(这是从 VM 到其他主机的网关)而不是 127.0.0.1:
<parameter name="localMemberHost">10.0.2.2</parameter>
b) 同样在 axis2.xml 中,我启用了 groupManagement,但它已被禁用。在管理器节点中:
<groupManagement enable="true">
<applicationDomain name="wso2.apim.domain"
description="APIM group"
agent="org.wso2.carbon.core.clustering.hazelcast.HazelcastGroupManagementAgent"
subDomain="mgt"
port="2233"/>
</groupManagement>
在工作节点中:
<groupManagement enable="true">
<applicationDomain name="wso2.apim.domain"
description="APIM group"
agent="org.wso2.carbon.core.clustering.hazelcast.HazelcastGroupManagementAgent"
subDomain="worker"
port="2233"/>
</groupManagement>
(我使用端口 2233 而不是默认端口 2222,因为端口 2222 在我的集群中用于其他目的)。
现在在管理器中我看到:
INFO {org.wso2.carbon.core.clustering.hazelcast.wka.WKABasedMembershipScheme} -
Member joined [6bf6ae47-bea4-4bc4-beec-9140a626781b]: /10.0.2.2:4200
并且在 worker 中,在 API 更改之后,我确实看到消息进来了,也适用于 super.carbon 以外的租户:
INFO {org.wso2.carbon.core.clustering.hazelcast.HazelcastClusterMessageListener} -
Received ClusteringMessage: SynchronizeRepositoryRequest{tenantId=1, tenantDomain='0000s7.com', messageId=a573eeef-46d7-4a2b-bfc9-362296bb60d4}
给在集群上遇到 SVN 问题的人的提示:
- 确保 Hazelcast 在 WSO2 即将到来时显示的成员列表是正确的。
- 确保在工作人员上任时在经理日志中看到成员加入消息。
- 确保您在经理更改后看到工人 "Message Received"。
帮助您解决问题的调试选项:
log4j.logger.org.wso2.carbon.core.deployment=DEBUG
log4j.logger.org.wso2.carbon.deployment.synchronizer=DEBUG