ehcache不能在liferay集群中复制

时间:2013-01-21 17:33:06

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

我有以下设置

1.在AWS上有2台机器的1.liferay集群

2.通过tcp与JGroups进行单播集群复制

我在portal-ext.properties

中有以下参数
#Setup hibernate
net.sf.ehcache.configurationResourceName=/myehcache/hibernate-clustered.xml

#Setup distributed ehcache
ehcache.multi.vm.config.location=/myehcache/liferay-multi-vm-clustered.xml

#
# Clustering settings
#
cluster.link.enabled=true
ehcache.cluster.link.replication.enabled=true
cluster.link.channel.properties.control=tcp.xml
cluster.link.channel.properties.transport.0=tcp.xml
lucene.replicate.write=true

#In order to make use of jgroups
    ehcache.bootstrap.cache.loader.factory=com.liferay.portal.cache.ehcache.JGroupsBootstrapCacheLoaderFactory
ehcache.cache.event.listener.factory=net.sf.ehcache.distribution.jgroups.JGroupsCacheReplicatorFactory
 ehcache.cache.manager.peer.provider.factory=net.sf.ehcache.distribution.jgroups.JGroupsCacheManagerPeerProviderFactory
net.sf.ehcache.configurationResourceName.peerProviderProperties=file=/myehcache/tcp.xml
ehcache.multi.vm.config.location.peerProviderProperties=file=/myehcache/tcp.xml

cluster.executor.debug.enabled=true
ehcache.statistics.enabled=true

我无法使群集缓存复制正常工作。任何人都可以指出正确的方向吗? 如果以后需要,我可以发布更多细节。我还试图修改hibernate-clustered.xml和liferay-multi-vm-clustered.xml,但没有任何作用。

2 个答案:

答案 0 :(得分:8)

在花了好几天阅读无数博客文章,论坛主题,当然还有SO问题之后,我想在这里总结一下我们如何最终设法在Liferay 6.2集群中配置缓存复制,使用单播TCP来适应Amazon EC2。

JGroups配置

在配置Liferay进行缓存复制之前,您必须了解Liferay依赖于JGroups通道。基本上,JGroups允许发现远程实例并与之通信。默认情况下(至少在Liferay中)它利用多播UDP来实现这些目标。有关详情,请参阅JGroups website

要启用单播TCP,您必须首先从Liferay webapp中的jgroups.jar获取JGroups的TCP配置文件(类似$LIFERAY_HOME/tomcat-7.0.42/webapps/ROOT/WEB-INF/lib/jgroups.jar)。将此文件解压缩到Liferay webapp的类路径可用的位置。说$LIFERAY_HOME/tomcat-7.0.42/webapps/ROOT/WEB-INF/classes/custom_jgroups/tcp.xml。注意这条道路。

要使此配置在Liferay群集中运行,您只需向singleton_name="liferay"标记添加TCP属性:

<config xmlns="urn:org:jgroups"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="urn:org:jgroups http://www.jgroups.org/schema/JGroups-3.1.xsd">
    <TCP singleton_name="liferay"
         bind_port="7800"
         loopback="false"
         ...

您可能已经注意到:

一个。此配置文件未指定要侦听的绑定地址,

B中。必须通过系统属性设置集群的初始主机。

实际上,您需要修改$LIFERAY_HOME/tomcat-7.0.42/bin/setenv.sh以添加以下JVM系统属性:

-Djava.net.preferIPv4Stack=true
-Djgroups.bind_addr=192.168.0.1
-Djgroups.tcpping.initial_hosts=192.168.0.1[7800],80.200.230.2[7800]

绑定地址定义要侦听的网络接口(在TCP配置文件中JGroups端口设置为7800)。初始主机属性必须包含群集的每个单个实例(有关详细信息,请参阅TCPPING and MERGE2 on JGroups docs)及其侦听端口。远程实例可以通过其主机名,本地地址或公共地址来引用。

提示:如果您在Amazon EC2上设置Liferay群集,则每次重新启动后,实例的本地IP地址和主机名可能会有所不同。要解决此问题,您可以用hostname命令的结果替换setenv.sh中的本地地址:`hostname` - 注意这里的反引号)

提示:如果在EC2上使用安全组,您还应确保将端口7800打开到同一安全组中的所有实例)

Liferay配置

通过向portal-ext.properties添加以下属性,在Liferay上启用了JGroups复制:

# Tells Liferay to enable Cluster Link. This sets up JGroups control and transport channels (necessary for indexes and cache replication)
cluster.link.enabled=true
# This external address is used to determine which network interface must be used. This typically points to the database shared between the instances.
cluster.link.autodetect.address=shareddatabase.eu-west-1.rds.amazonaws.com:5432

为单播TCP配置JGroup只需指向正确的文件:

# Configures JGroups control channel for unicast TCP
cluster.link.channel.properties.control=/custom_jgroups/tcp.xml
# Configures JGroups transport channel for unicast TCP
cluster.link.channel.properties.transport.0=/custom_jgroups/tcp.xml

在同一个文件中,Lucene索引复制需要以下单个属性:

# Enable Lucene indexes replication through Cluster Link
lucene.replicate.write=true

EhCache缓存复制更加微妙。您必须为Hibernate缓存和Liferay的内部缓存配置JGroups。要了解此配置,您必须知道,自Liferay 6.2起,默认 EhCache配置文件是&#34; clustered&#34; (不设置这些属性):

# Default hibernate cache configuration file
net.sf.ehcache.configurationResourceName=/ehcache/hibernate-clustered.xml
# Default internal  cache configuration file
ehcache.multi.vm.config.location=/ehcache/liferay-multi-vm-clustered.xml

这些配置文件都依赖于必须设置启用JGroups的EhCache工厂:

# Enable EhCache caches replication through JGroups
ehcache.bootstrap.cache.loader.factory=com.liferay.portal.cache.ehcache.JGroupsBootstrapCacheLoaderFactory
ehcache.cache.event.listener.factory=net.sf.ehcache.distribution.jgroups.JGroupsCacheReplicatorFactory
ehcache.cache.manager.peer.provider.factory=net.sf.ehcache.distribution.jgroups.JGroupsCacheManagerPeerProviderFactory

的JGroups&#39;缓存管理器对等提供程序工厂需要包含JGroups配置的file参数。指定单播TCP配置文件:

# Configure hibernate cache replication for unicast TCP
net.sf.ehcache.configurationResourceName.peerProviderProperties=file=/custom_jgroups/tcp.xml

# Configure internal caches replication for unicast TCP
ehcache.multi.vm.config.location.peerProviderProperties=file=/custom_jgroups/tcp.xml

提示:如果有疑问,您应该参考属性定义和默认值:https://docs.liferay.com/portal/6.2/propertiesdoc/portal.properties.html

调试

此外,您可以使用以下命令启用调试跟踪:

cluster.executor.debug.enabled=true

您甚至可以告诉Liferay在每个页面上显示处理请求的节点的名称:

web.server.display.node=true

最后,JGroups频道通过probe tool公开可用的诊断服务。

最后的注释

请记住,这仅涵盖索引和缓存复制。设置Liferay群集时,还应考虑设置:

  • 共享数据库(AWS上的RDS),
  • 共享DocumentLibrary(AWS上的S3或RDS),
  • Tomcat上的会话复制,
  • 也许更多取决于你如何使用Liferay。

答案 1 :(得分:3)

我花了很多时间在AWS上制作Liferay 6.1.1 CE群集。

这是我的“portal-ext.properties”,与您的

几乎没有区别
##
## JDBC
##

# Tomcat datasource
jdbc.default.jndi.name=jdbc/LiferayPool

##
## Mail
##

# Tomcat mail session
mail.session.jndi.name=mail/MailSession

##
## Document Library Portlet
##

# NFS shared folder
dl.store.file.system.root.dir=/opt/document_library/

##
## Cluster Link
##

# Cluster Link over JGroups TCP unicast
cluster.link.enabled=true
cluster.link.channel.properties.control=custom_cache/tcp.xml
cluster.link.channel.properties.transport.0=custom_cache/tcp.xml

# Any VPC internal IP useful to detect local eth interface
cluster.link.autodetect.address=10.0.0.19:22

##
## Lucene Search
##

# Lucene index replication over Cluster Link
lucene.replicate.write=true

##
## Hibernate
##

# Second Level cache distributed with Ehcache over JGroups TCP unicast
net.sf.ehcache.configurationResourceName=/custom_cache/hibernate-clustered.xml
net.sf.ehcache.configurationResourceName.peerProviderProperties=file=custom_cache/tcp.xml

##
## Ehcache
##

# Liferay cache distributed with Ehcache over JGroups TCP unicast
ehcache.multi.vm.config.location=/custom_cache/liferay-multi-vm-clustered.xml
ehcache.multi.vm.config.location.peerProviderProperties=file=custom_cache/tcp.xml

ehcache.bootstrap.cache.loader.factory=com.liferay.portal.cache.ehcache.JGroupsBootstrapCacheLoaderFactory
ehcache.cache.event.listener.factory=net.sf.ehcache.distribution.jgroups.JGroupsCacheReplicatorFactory
ehcache.cache.manager.peer.provider.factory=net.sf.ehcache.distribution.jgroups.JGroupsCacheManagerPeerProviderFactory

我添加了以下属性

singleton_name="custom_cache"

到“custom_cache / tcp.xml”JGroups config的TCP信封。

最后,我为节点NODE_1的Liferay启动脚本添加了以下选项

JAVA_OPTS="$JAVA_OPTS -Djgroups.bind_addr=NODE_1 -Djgroups.tcpping.initial_hosts=NODE_1[7800],NODE_2[7800] -Djava.net.preferIPv4Stack=true"

和NODE_2

JAVA_OPTS="$JAVA_OPTS -Djgroups.bind_addr=NODE_2 -Djgroups.tcpping.initial_hosts=NODE_1[7800],NODE_2[7800] -Djava.net.preferIPv4Stack=true"

我希望这可以帮助您节省时间。