Liferay 6.2 多播集群问题

Liferay 6.2 clustering issue with multicast

我正在尝试在启用多路广播的 2 台服务器上将 ehcache 和 lucene 与 Liferay 6.2 EE sp2 捆绑在一起。我们有 Apache HTTPD 服务器前端 tomcat 服务器使用反向代理。两个节点上都部署了有效的 6.2 许可证。

我们在门户中使用以下属性-ext.properties:

cluster.link.enabled=true
lucene.replicate.write=true
ehcache.cluster.link.replication.enabled=true

# Since we are using SSL on the frontend
web.server.protocol=https

# set this to any server that is visible to both the nodes
cluster.link.autodetect.address=dbserverip:dbport

#ports and ips we know work in our environment for multicast
multicast.group.address["cluster-link-control"]=ip
multicast.group.port["cluster-link-control"]=port1

multicast.group.address["cluster-link-udp"]=ip
multicast.group.port["cluster-link-udp"]=port2

multicast.group.address["cluster-link-mping"]=ip
multicast.group.port["cluster-link-mping"]=port3

multicast.group.address["hibernate"]=ip
multicast.group.port["hibernate"]=port4

multicast.group.address["multi-vm"]=ip
multicast.group.port["multi-vm"]=port5

我们 运行 遇到了 ehcache 和 lucene 集群不起作用的问题。以下测试失败:

  1. 在节点 1 上移动 portlet,但不会显示在节点 2 上

除了lucene的启动错误外,没有其他错误。

14:19:35,771 ERROR [CLUSTER_EXECUTOR_CALLBACK_THREAD_POOL-1][LuceneHelperImpl:1186] Unable to load index for company 10157 com.liferay.portal.kernel.exception.SystemException: java.net.ConnectException: Connection refused at com.liferay.portal.search.lucene.LuceneHelperImpl.getLoadIndexesInputStreamFromCluster(LuceneHelperImpl.java:488) at com.liferay.portal.search.lucene.LuceneHelperImpl$LoadIndexClusterResponseCallback.callback(LuceneHelperImpl.java:1176) at com.liferay.portal.cluster.ClusterExecutorImpl$ClusterResponseCallbackJob.run(ClusterExecutorImpl.java:614) at com.liferay.portal.kernel.concurrent.ThreadPoolExecutor$WorkerTask._runTask(ThreadPoolExecutor.java:682) at com.liferay.portal.kernel.concurrent.ThreadPoolExecutor$WorkerTask.run(ThreadPoolExecutor.java:593) at java.lang.Thread.run(Thread.java:745) Caused by: java.net.ConnectException: Connection refused at java.net.PlainSocketImpl.socketConnect(Native Method) at java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:339) at java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:200) at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:182) at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:392) at java.net.Socket.connect(Socket.java:579) at sun.security.ssl.SSLSocketImpl.connect(SSLSocketImpl.java:625) at sun.security.ssl.BaseSSLSocketImpl.connect(BaseSSLSocketImpl.java:160) at sun.net.NetworkClient.doConnect(NetworkClient.java:180) at sun.net.www.http.HttpClient.openServer(HttpClient.java:432) at sun.net.www.http.HttpClient.openServer(HttpClient.java:527) at sun.net.www.protocol.https.HttpsClient.(HttpsClient.java:275) at sun.net.www.protocol.https.HttpsClient.New(HttpsClient.java:371)

我们通过 运行 以下命令并使用 jgroups.jar 的下载副本并替换为 5 个多播 ips 和端口,验证了 jgroups 多播在 liferay 之外工作。

Testing with JGROUPS

1) McastReceiver -

java -cp ./jgroups.jar org.jgroups.tests.McastReceiverTest -mcast_addr 224.10.10.10 -port 5555

ex. java -cp jgroups-final.jar org.jgroups.tests.McastReceiverTest -mcast_addr 224.10.10.10 -port 5555

2) McastSender -

java -cp ./jgroups.jar org.jgroups.tests.McastSenderTest -mcast_addr 224.10.10.10 -port 5555

ex. java -cp jgroups-final.jar org.jgroups.tests.McastSenderTest -mcast_addr 224.10.10.10 -port 5555

From there, typing things into the McastSender will result in the Receiver printing it out.

谢谢!

在我的团队和 liferay 支持人员的大量故障排除和帮助之后,我们切换到使用单播并且效果更好。

这是我们所做的:

  • 从 tomcat home/webappts/ROOT/WEB_INF/lib 中提取 jgroups.jar,保存在本地。
  • 解压缩 jgroups.jar 文件并从 jar 的 WEB_INF 文件夹
  • 中提取并保存 tcp.xml
  • 作为基线测试,更改了 tcp.xml 中的部分并保存

    TCPPING 超时 =“3000” initial_hosts="${jgroups.tcpping.initial_hosts:servername1[7800],servername2[7800]}" port_range="1" num_initial_members="10"

  • 将tcp.xml复制到两个节点上的liferay home

  • 更改 portal-ext.properties 以删除多播属性并添加以下行。

    cluster.link.channel.properties.control=${liferay.home}/tcp.xml cluster.link.channel.properties.transport.0=${liferay.home}/tcp.xml

  • 开始节点1

  • 开始节点2

  • 检查日志

  • 做集群缓存测试:

  • 在节点 1 上移动 portlet,显示在节点 2 上

  • 在控制面板 -> 许可证管理器下,两个节点均显示有效许可证。

  • 在控制面板 -> 用户和组织中添加节点 1 后在节点 2 上搜索用户。

以上所有测试均有效。

因此我们关闭了服务器并将 tcp.xml 更改为使用 jdbc 而不是 tcpping,因此我们不必手动指定节点名称。

jdbc 配置的步骤:

  1. 手动在liferay数据库中创建table。

    CREATE TABLE JGROUPSPING (own_addr varchar(200) not null, cluster_name varchar(200) not null, ping_data blob default null, primary key (own_addr, cluster_name))

  2. 更改 tcp.xml 并删除 tcpping 部分并添加以下内容。

注意:请将以下代码块中的前导\替换为小于号。 SO editor/parser 中的前导小于号存在问题,隐藏了它后面的任何内容:

\JDBC_PING datasource_jndi_name="java:comp/env/jdbc/LiferayPool" initialize_sql="" />

  1. 手动保存文件并将其推送到两个节点。

启动服务器并重复上面的测试。

它应该可以无缝运行。

在下面 post:

中提到的 jgroups 的调试登录是非常宝贵的

https://bitsofinfo.wordpress.com/2014/05/21/clustering-liferay-globally-across-data-centers-gslb-with-jgroups-and-relay2/

tomcat home/webapps/ROOT/WEB-INF/classes/META-INF/portal-log4j-ext.xml file I used to triage various issues on bootup related to clustering.

<?xml version="1.0"?>
<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">

<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/">

<category name="com.liferay.portal.cluster">
<priority value="TRACE" />
</category>

<category name="com.liferay.portal.license">
<priority value="TRACE" />
</category>

我们还发现 Lucene 集群复制启动错误已在修复包中得到修复,并且正在为其获取补丁。

https://issues.liferay.com/browse/LPS-51714

https://issues.liferay.com/browse/LPS-51428

我们为 lucene 复制添加了以下门户实例属性,以便在 2 个节点之间更好地工作:

portal.instance.http.port=port that the app servers listen on ex. 8080
portal.instance.protocol=http 

希望这对某人有所帮助。

更新

集群中的 lucene 索引加载问题已通过支持上述 LPS 的 Liferay 6.2 EE 补丁解决。