Building a simple Modeshape cluster
janpetzold Nov 10, 2014 7:53 AMI'm trying to build a cluster with Modeshape 4 and a simple web application deployed on Tomcat. I've read somewhere that Modeshape does not have a classic Master/Slave environment, instead all nodes are "equal", however when I look at the JBoss clustering examples there is a distinction between master and slave. It's confusing. My general questions:
1. Is it true that all cluster nodes can use the same JGroups configuration?
2. Can I dynamically add/remove cluster participants at runtime so that they are automatically detected?
I have no experience with Infinispan or JGroups, so it it very likely that something is wrong in my configuration files. Whats happening is that I can start one server but as soon as I start the next one (expecting it to joiun the cluster) an error appears.
repository-config.json:
{
"name" : "jpd-repo",
"jndiName" : "",
"monitoring" : {
"enabled" : true
},
"storage" : {
"cacheConfiguration" : "infinispan-config.xml",
"cacheName" : "persisted_repository",
"binaryStorage" : {
"type" : "file",
"directory": "stored",
"minimumBinarySizeInBytes" : 40
}
},
"workspaces" : {
"predefined" : [],
"default" : "default",
"allowCreation" : true
},
"security" : {
"anonymous" : {
"roles" : ["readonly","readwrite","admin"],
"useOnFailedLogin" : false
},
"providers" : [
{ "classname" : "servlet" }
]
}
}
infinispan-config.xml:
<?xml version="1.0" encoding="UTF-8"?>
<infinispan xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="urn:infinispan:config:6.0 http://www.infinispan.org/schemas/infinispan-config-6.0.xsd
urn:infinispan:config:jdbc:6.0 http://www.infinispan.org/schemas/infinispan-cachestore-jdbc-config-6.0.xsd"
xmlns="urn:infinispan:config:6.0">
<global>
<globalJmxStatistics enabled="false" allowDuplicateDomains="true" />
<!-- Configure clustering -->
<transport clusterName="jpd-repo-cluster">
<properties>
<property name="configurationFile" value="jgroups-config.xml" />
</properties>
</transport>
</global>
<namedCache name="persisted_repository">
<eviction strategy="LIRS" maxEntries="600"/>
<!-- Configure a synchronous replication cache -->
<clustering mode="replication">
<stateTransfer fetchInMemoryState="true" timeout="2000" />
<sync />
</clustering>
<locking isolationLevel="READ_COMMITTED" writeSkewCheck="false" lockAcquisitionTimeout="1000" />
<transaction
transactionManagerLookupClass="org.modeshape.example.spring.jcr.AtomikosTransactionManagerLookup"
transactionMode="TRANSACTIONAL"
lockingMode="OPTIMISTIC"/>
<persistence passivation="false">
<singleFile
preload="false"
shared="false"
fetchPersistentState="true"
purgeOnStartup="true"
location="storage/repository_${cluster-id}/store">
</singleFile>
</persistence>
</namedCache>
</infinispan>
jgroups-config.xml:
<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.4.xsd">
<UDP
mcast_port="${jgroups.udp.mcast_port:45588}"
tos="8"
ucast_recv_buf_size="5M"
ucast_send_buf_size="640K"
mcast_recv_buf_size="5M"
mcast_send_buf_size="640K"
loopback="true"
max_bundle_size="64K"
max_bundle_timeout="30"
ip_ttl="${jgroups.udp.ip_ttl:8}"
enable_diagnostics="true"
thread_naming_pattern="cl"
timer_type="new3"
timer.min_threads="2"
timer.max_threads="4"
timer.keep_alive_time="3000"
timer.queue_max_size="500"
thread_pool.enabled="true"
thread_pool.min_threads="2"
thread_pool.max_threads="8"
thread_pool.keep_alive_time="5000"
thread_pool.queue_enabled="true"
thread_pool.queue_max_size="10000"
thread_pool.rejection_policy="discard"
oob_thread_pool.enabled="true"
oob_thread_pool.min_threads="1"
oob_thread_pool.max_threads="8"
oob_thread_pool.keep_alive_time="5000"
oob_thread_pool.queue_enabled="false"
oob_thread_pool.queue_max_size="100"
oob_thread_pool.rejection_policy="discard"/>
<PING timeout="2000"
num_initial_members="20"/>
<MERGE2 max_interval="30000"
min_interval="10000"/>
<FD_SOCK/>
<FD_ALL/>
<VERIFY_SUSPECT timeout="1500" />
<BARRIER />
<pbcast.NAKACK2 xmit_interval="500"
xmit_table_num_rows="100"
xmit_table_msgs_per_row="2000"
xmit_table_max_compaction_time="30000"
max_msg_batch_size="500"
use_mcast_xmit="false"
discard_delivered_msgs="true"/>
<UNICAST3 xmit_interval="500"
xmit_table_num_rows="100"
xmit_table_msgs_per_row="2000"
xmit_table_max_compaction_time="60000"
conn_expiry_timeout="0"
max_msg_batch_size="500"/>
<pbcast.STABLE stability_delay="1000" desired_avg_gossip="50000"
max_bytes="4M"/>
<pbcast.GMS print_local_addr="true" join_timeout="3000"
view_bundling="true"/>
<UFC max_credits="2M"
min_threshold="0.4"/>
<MFC max_credits="2M"
min_threshold="0.4"/>
<FRAG2 frag_size="60K" />
<RSVP resend_interval="2000" timeout="10000"/>
<pbcast.STATE_TRANSFER />
<!-- pbcast.FLUSH /-->
</config>
Starting a single node works, no errors are reported. However once I start a second Tomcat (using the same web app with the same configuration) I see the error
java.lang.IllegalArgumentException: fork-channel with id=modeshape-fork-channel is already present
According to the release notes, this was fixed in Modeshape 4 Beta1, I'm using the FINAL version.
Many thanks,
Jan
UPDATE
I did not see any message like that:
SPN000094: Received new cluster view:
I switched to Wildfly now where everything worked right away.