Liferay 6.2群集问题与多播

时间:2015-05-27 16:20:01

标签: lucene cluster-computing liferay-6 ehcache jgroups

我正在尝试使用启用了mutlicast的2台服务器上的Liferay 6.2 EE sp2捆绑集群ehcache和lucene。我们使用反向代理在面向tomcat服务器的Apache HTTPD服务器上运行。两个节点都部署了有效的6.2许可证。

我们在portal-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上
  2. 除了lucene的启动错误外没有任何错误。

      14:19:35,771错误   [CLUSTER_EXECUTOR_CALLBACK_THREAD_POOL-1] [LuceneHelperImpl:1186]   无法加载公司10157的索引   com.liferay.portal.kernel.exception.SystemException:   java.net.ConnectException:拒绝连接   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)     在java.lang.Thread.run(Thread.java:745)引起:   java.net.ConnectException:拒绝连接   java.net.PlainSocketImpl.socketConnect(Native Method)at   java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:339)     在   java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:200)     在   java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:182)     在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)     在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)     在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.
    

    谢谢!

1 个答案:

答案 0 :(得分:1)

经过我团队中各方人员和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主页

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

    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 config的步骤:

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

    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部分并添加以下内容。

  3. 注意:请在以下代码块中替换带小于符号的前导\。 SO编辑器/解析器隐藏的内容少于签名存在问题隐藏在它之后:

      

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

    1. 手动保存并将文件推送到两个节点。
    2. 启动服务器并重复上述测试。

      它应该无缝地工作。

      对于以下帖子中提到的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。