我正在尝试将ehcache和lucene与Liferay 6.2 EE sp2捆绑在2台启用多播的服务器上。我们有Apache HTTPD服务器前端tomcat服务器使用反向代理。两个节点上都部署了有效的6.2 license。
我们在门户中使用以下属性-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上移动portlet,在节点2上不显示
除了lucene的启动错误外,没有其他错误。
14:19:35,771错误[CLUSTER_EXECUTOR_CALLBACK_THREAD_POOL-1] [LuceneHelperImpl: 1186)无法加载公司10157的索引com.liferay.portal.kernel.exception.SystemException:连接被拒绝com.liferay.portal.search.lucene.LuceneHelperImpl.getLoadIndexesInputStreamFromCluster (LuceneHelperImpl.java: 488)在com.liferay.portal.search.lucene.LuceneHelperImpl LoadIndexClusterResponseCallback.callback美元(LuceneHelperImpl.java: 1176)在com.liferay.portal.cluster.ClusterExecutorImpl ClusterResponseCallbackJob.run美元(ClusterExecutorImpl.java: 614)在com.liferay.portal.kernel.concurrent.ThreadPoolExecutor WorkerTask._runTask美元(ThreadPoolExecutor.java: 682)在com.liferay.portal.kernel.concurrent.ThreadPoolExecutor WorkerTask.run美元(ThreadPoolExecutor.java: 593)at java.lang.Thread.run(Thread.java:745)连接被拒绝socketconnect(本机方法java.net.AbstractPlainSocketImpl.doConnect (AbstractPlainSocketImpl.java: 339)在java.net.AbstractPlainSocketImpl.connectToAddress (AbstractPlainSocketImpl.java: 200)在java.net.AbstractPlainSocketImpl.connect (AbstractPlainSocketImpl.java: 182)(SocksSocketImpl.java:392java.net.Socket.connect (Socket.java: 579)sun.security.ssl.SSLSocketImpl.connect (SSLSocketImpl.java: 625)sun.security.ssl.BaseSSLSocketImpl.connect (BaseSSLSocketImpl.java: 160)(NetworkClient.java:180sun.net.www.http.HttpClient.openServer (HttpClient.java: 432)sun.net.www.http.HttpClient.openServer (HttpClient.java: 527)sun.net.www.protocol.https.HttpsClient。(HttpsClient.java: 275)sun.net.www.protocol.https.HttpsClient.New (HttpsClient.java: 371)
我们通过运行以下命令并使用下载的jgroups.jar副本并替换为5个组播ip和端口,验证了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.
谢谢!
在我的团队和生活支持部门的许多人进行了大量的故障排除和帮助之后,我们切换到使用单播,并且效果好得多。
我们这样做了:
- 从tomcat home/webappts/ROOT/WEB_INF/lib中提取jgroups.jar,保存在本地。
- 解压缩jgroups.jar文件,并从jar的WEB_INF文件夹中提取并保存tcp.xml文件
-
作为基线测试,更改tcp.xml中的部分并保存
tcp超时= " 3000 "initial_hosts = " $ {servername2 jgroups.tcpping.initial_hosts:服务器1[7800],[7800]}"port_range = " 1 "num_initial_members = " 10 "
-
将tcp.xml复制到两个节点上的liferay home
-
更改门户文本。属性来删除组播属性,并添加以下行。
cluster.link.channel.properties.control = $ {liferay.home}/tcp.xmlcluster.link.channel.properties.transport.0 = $ {liferay.home}/tcp.xml
-
启动节点1
-
启动节点2
-
检查日志
-
执行集群缓存测试:
-
在节点1上移动portlet,显示在节点2上
-
在控制面板->许可证管理器下,两个节点都显示有效的许可证。
-
在控制面板中添加节点1后在节点2上搜索用户->用户和组织。
以上测试都成功了。
因此,我们关闭服务器并将tcp.xml更改为使用jdbc而不是tcpping,因此我们不必手动指定节点名称。
jdbc配置步骤:
-
在liferay数据库中手动创建表
CREATE TABLE JGROUPSPING (own_addr varchar(200) not null, cluster_name varchar(200) not null, ping_data blob默认为null,主键(own_addr, cluster_name))
更改tcp.xml并删除tcping部分并添加以下内容。
注意:请将以下代码块中的前导替换为小于号。SO编辑器/解析器中的前导小于号会隐藏后面的内容:
JDBC_PING datasource_jndi_name = " java: comp/env/jdbc/LiferayPool"initialize_sql = " "/>
- 保存并手动推送文件到两个节点。
启动服务器并重复上述测试。
它应该可以无缝地工作。
在接下来的文章中提到的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复制在两个节点之间更好地工作:
portal.instance.http.port=port that the app servers listen on ex. 8080
portal.instance.protocol=http
希望这能帮助到一些人。
群集中的lucene索引负载问题由Liferay 6.2 EE补丁解决,支持上述LPS。