Author: jbonofre
Date: Wed Dec 11 10:13:57 2013
New Revision: 1550096

URL: http://svn.apache.org/r1550096
Log:
[KARAF-2511] Review and update of the failover page of the user guide.

Modified:
    karaf/trunk/manual/src/main/webapp/users-guide/failover.conf

Modified: karaf/trunk/manual/src/main/webapp/users-guide/failover.conf
URL: 
http://svn.apache.org/viewvc/karaf/trunk/manual/src/main/webapp/users-guide/failover.conf?rev=1550096&r1=1550095&r2=1550096&view=diff
==============================================================================
--- karaf/trunk/manual/src/main/webapp/users-guide/failover.conf (original)
+++ karaf/trunk/manual/src/main/webapp/users-guide/failover.conf Wed Dec 11 
10:13:57 2013
@@ -1,34 +1,63 @@
-h1. Failover Deployments
+h1. HA/failover and cluster
 
-Karaf provides failover capability using either a simple lock file or a JDBC 
locking mechanism. In both cases, a container-level lock system allows bundles 
to be preloaded into the slave Karaf instance in order to provide faster 
failover performance.
+Apache Karaf natively provides a failover mechanism. It uses a kind of 
master/slave topology where one instance is active
+and the others are in standby.
 
-h2. Simple lock file
+If you are looking for cluster of Apache Karaf instances (active/active), 
[Apache Karaf Cellar|http://karaf.apache.org/index/subprojects/cellar.html] is 
a solution.
 
-The simple lock file mechanism is intended for failover configurations where 
instances reside on the same host machine or share a file system with lock 
support.
+Karaf provides failover capability using either a simple lock file or a JDBC 
locking mechanism.
+In both cases, a container-level lock system allows bundles to be preloaded 
into the slave Karaf instance in order to provide faster failover performance.
 
-To use this feature, edit the {{$KARAF_HOME/etc/system.properties}} file as 
follows on each system in the master/slave setup:
+h2. HA/failover (active/passive)
 
-{noformat}
+The Apache Karaf failover capability uses a lock system.
+
+This container-level lock system allows bundles installed on the master to be 
preloaded on the slave, in order to provide faster failover performance.
+
+Two types of lock are supported:
+
+* filesystem lock
+* database lock
+
+When a first instance starts, if the lock is available, it takes the lock and 
become the master.
+If a second instance starts, it tries to acquire the lock. As the lock is 
already hold by the master, the instance becomes
+a slave, in standby mode (not active). A slave periodically check if the lock 
has been released or not.
+
+h3. Filesystem lock
+
+The Apache Karaf instances share a lock on the filesystem. It means that the 
filesystem storing the lock has to be accessible
+to the different instances (using SAN, NFS, ...).
+
+The configuration of the lock system has to be defined in the 
{{etc/system.properties}} file, on each instance (master/slave):
+
+{code}
 karaf.lock=true
 karaf.lock.class=org.apache.karaf.main.SimpleFileLock
 karaf.lock.dir=<PathToLockFileDirectory>
 karaf.lock.delay=10
-{noformat}
+{code}
+
+* {{karaf.lock}} property enables the the HA/failover mechanism
+* {{karaf.lock.class}} property contains the class name providing the lock 
implementation. Here, we use the filesystem lock.
+* {{karaf.lock.dir}} property contains the location where the lock will be 
written. All instances have to share the same lock.
+* {{karaf.lock.delay}} property is the interval period (in seconds) to check 
if the lock has been released or not.
 
-*Note*: Ensure that the {{karaf.lock.dir}} property points to the same 
directory for both the master and slave instance, so that the slave can acquire 
the lock only when the master releases it.
+h3. Database lock
 
+It's not always possible and easy to have a shared filesystem between multiple 
Apache Karaf instances.
 
-h2. JDBC locking
+Instead of sharing a filesystem, Apache Karaf supports sharing a database.
 
-The JDBC locking mechanism is intended for failover configurations where 
instances exist on separate machines. In this deployment, the master instance 
holds a lock on a Karaf locking table hosted on a database. If the master loses 
the lock, a waiting slave process gains access to the locking table and fully 
starts its container. 
+The master instance holds the lock by locking a table in the database. If the 
master loses the lock, a waiting slave
+gains access to the locking table, acquire the lock on the table and starts.
 
-To use this feature, do the following on each system in the master/slave setup:
+The database lock uses JDBC (Java DataBase Connectivity). To use database 
locking, you have to:
 
-* Update the classpath to include the JDBC driver
-* Update the {{$KARAF_HOME/bin/karaf}} script to have a unique JMX remote port 
set if instances reside on the same host
-* Update the {{$KARAF_HOME/etc/system.properties}} file as follows:
+* copy the JDBC driver in the {{lib/ext}} folder on each instance. The JDBC 
driver to use is the one corresponding to the
+ database used for the locking system.
+* update {{etc/system.properties}} file on each instance:
 
-{noformat}
+{code}
 karaf.lock=true
 karaf.lock.class=org.apache.karaf.main.DefaultJDBCLock
 karaf.lock.level=50
@@ -40,23 +69,38 @@ karaf.lock.jdbc.password=password
 karaf.lock.jdbc.table=KARAF_LOCK
 karaf.lock.jdbc.clustername=karaf
 karaf.lock.jdbc.timeout=30
-{noformat}
-
-*Note*:
-
-* This process will fail if a JDBC driver is not on the classpath.
-* The "sample" database referred to above will be created if it does not exist.
-* The first Karaf instance to acquire the locking table is the master instance.
-* If the connection to the database is lost, the master instance tries to 
gracefully shutdown, allowing a slave instance to become master when the 
database service is restored. The former master will require a manual restart.
-* For 2.2.x, 2.3.x, 3.0.x you need to rename the database Driver jar to prefix 
with 'karaf-' in order for karaf to pick it up, otherwise you will see karaf 
just hang on startup and the log will show you that it could not find the 
driver.
+{code}
 
-h3. JDBC locking on Oracle
+* {{karaf.lock}} property enabled the HA/failover mechanism
+* {{karaf.lock.class}} property contains the class name providing the lock 
implementation. The {{org.apache.karaf.main.DefaultJDBCLock}}
+ is the most generic database lock system implementation. Apache Karaf 
supports lock system for specific databases (see later for details).
+* {{karaf.lock.level}} property is the container-level locking (see later for 
details).
+* {{karaf.lock.delay}} property is the interval period (in seconds) to check 
if the lock has been released or not.
+* {{karaf.lock.jdbc.url}} property contains the JDBC URL to the database 
(derby in this example).
+* {{karaf.lock.jdbc.driver}} property contains the class name of the JDBC 
driver to use (derby in this example).
+* {{karaf.lock.jdbc.user}} property contains the username to use to connect to 
the database.
+* {{karaf.lock.jdbc.password}} property contains the password to use to connet 
to the database.
+* {{karaf.lock.jdbc.table}} property contains the database table to use for 
the lock.
+
+{warning}
+Apache Karaf won't start if the JDBC driver is not present in the {{lib/ext}} 
folder. In order to be loaded correctly,
+the JDBC driver jar file has to be prefixed with {{karaf-}} (for instance the 
{{ojdbc14.jar}} has to be renamed as {{karaf-ojdbc14.jar}} in the {{lib/ext}} 
folder.
+{warning}
+
+{warning}
+The {{sample}} database will be created automatically if it does not exist.
+{warning}
+
+{warning}
+If the connection to the database is lost, the master instance tries to 
gracefully shutdown, allowing a slave instance to
+become the master when the database is back. The former master instance will 
required a manual restart.
+{warning}
 
-If you are using Oracle as your database for JDBC locking, the 
{{karaf.lock.class}} property in the {{$KARAF_HOME/etc/system.properties}} file 
must point to {{org.apache.karaf.main.OracleJDBCLock}}.
+h4. Lock on Oracle
 
-Otherwise, configure the system.properties file as normal for your setup, for 
example:
+Apache Karaf supports Oracle database for locking. The lock implementation 
class name to use is {{org.apache.karaf.main.lock.OracleJDBCLock}}:
 
-{noformat}
+{code}
 karaf.lock=true
 karaf.lock.class=org.apache.karaf.main.lock.OracleJDBCLock
 karaf.lock.jdbc.url=jdbc:oracle:thin:@hostname:1521:XE
@@ -66,19 +110,20 @@ karaf.lock.jdbc.password=password
 karaf.lock.jdbc.table=KARAF_LOCK
 karaf.lock.jdbc.clustername=karaf
 karaf.lock.jdbc.timeout=30
-{noformat}
+{code}
 
-As with the default JDBC locking setup, the Oracle JDBC driver JAR file must 
be in your classpath. You can ensure this by copying the {{ojdbc14.jar}} into 
Karaf's {{lib}} folder before starting Karaf.
+The {{ojdbc*.jar}} JDBC driver file has to be copied as 
{{lib/ext/karaf-ojdbc*.jar}}.
 
-*Note*: The {{karaf.lock.jdbc.url}} requires an active SID, which means you 
must manually create a database instance before using this particular lock.
+{warning}
+The {{karaf.lock.jdbc.url}} property contains a JDBC URL which requires an 
active SID. It means that you must manually create the Oracle
+database instance first before using the lock mechanism.
+{warning}
 
-h3. Derby
+h4. Lock on Derby
 
-The same rules apply when using derby.  Make sure you have the driver jar file 
in the Karaf {{lib}} folder before starting Karaf.
+Apache Karaf supports Apache Derby database for locking. The lock 
implementation class name to use is 
{{org.apache.karaf.main.lock.DerbyJDBCLock}}:
 
-Then make you update the properties in {{$KARAF_HOME/etc/system.properties}} 
to look something like this example:
-
-{noformat}
+{code}
 karaf.lock=true
 karaf.lock.class=org.apache.karaf.main.lock.DerbyJDBCLock
 karaf.lock.jdbc.url=jdbc:derby://127.0.0.1:1527/dbname
@@ -88,15 +133,15 @@ karaf.lock.jdbc.password=password
 karaf.lock.jdbc.table=KARAF_LOCK
 karaf.lock.jdbc.clustername=karaf
 karaf.lock.jdbc.timeout=30
-{noformat}
+{code}
 
-h3. MySQL
+The Derby JDBC driver file name has to be copied in the {{lib/ext}} folder 
with the {{karaf-}} prefix.
 
-Make sure you have the MySQL driver jar file in the Karaf {{lib}} folder 
before starting Karaf.
+h4.Lock on MySQL
 
-Then make you update the properties in {{$KARAF_HOME/etc/system.properties}} 
to look something like this example:
+Apache Karaf supports MySQL database for locking. The lock implementation 
class name to use is {{org.apache.karaf.main.lock.MySQLJDBCLock}}:
 
-{noformat}
+{code}
 karaf.lock=true
 karaf.lock.class=org.apache.karaf.main.lock.MySQLJDBCLock
 karaf.lock.jdbc.url=jdbc:mysql://127.0.0.1:3306/dbname
@@ -106,15 +151,15 @@ karaf.lock.jdbc.password=password
 karaf.lock.jdbc.table=KARAF_LOCK
 karaf.lock.jdbc.clustername=karaf
 karaf.lock.jdbc.timeout=30
-{noformat}
+{code}
 
-h3. PostgreSQL
+The MySQL JDBC driver file name has to be copied in {{lib/ext}} folder with 
the {{karaf-}} prefix.
 
-Make sure you have the PostgreSQL driver jar file in the Karaf {{lib}} folder 
before starting Karaf.
+h4. Lock on PostgreSQL
 
-Then make you update the properties in {{$KARAF_HOME/etc/system.properties}} 
to look something like this example:
+Apache Karaf supports PostgreSQL database for locking. The lock implementation 
class name to use is {{org.apache.karaf.main.lock.PostgreSQLJDBCLock}}:
 
-{noformat}
+{code}
 karaf.lock=true
 karaf.lock.class=org.apache.karaf.main.lock.PostgreSQLJDBCLock
 karaf.lock.jdbc.url=jdbc:postgresql://127.0.0.1:1527/dbname
@@ -124,35 +169,62 @@ karaf.lock.jdbc.password=password
 karaf.lock.jdbc.table=KARAF_LOCK
 karaf.lock.jdbc.clustername=karaf
 karaf.lock.jdbc.timeout=0
-{noformat}
-
-
-{anchor:locklevel}
+{code}
 
-h2. Container-level locking
+The PostgreSQL JDBC driver file has to be copied in the {{lib/ext}} folder 
with the {{karaf-}} prefix.
 
-Container-level locking allows bundles to be preloaded into the slave kernel 
instance in order to provide faster failover performance. Container-level 
locking is supported in both the simple file and JDBC locking mechanisms.
+h4. Lock on Microsoft SQLServer
 
-To implement container-level locking, add the following to the 
{{$KARAF_HOME/etc/system.properties}} file on each system in the master/slave 
setup:
+Apache Karaf supports Microsoft SQLServer database for locking. The lock 
implementation class name to use is 
{{org.apache.karaf.main.lock.SQLServerJDBCLock}}:
 
-{noformat}
+{code}
 karaf.lock=true
+karaf.lock.class=org.apache.karaf.main.lock.SQLServerJDBCLock
 karaf.lock.level=50
 karaf.lock.delay=10
-{noformat}
+karaf.lock.jdbc.url=jdbc:jtds:sqlserver://127.0.0.1;databaseName=sample
+karaf.lock.jdbc.driver=net.sourceforge.jtds.jdbc.Driver
+karaf.lock.jdbc.user=user
+karaf.lock.jdbc.password=password
+karaf.lock.jdbc.table=KARAF_LOCK
+karaf.lock.jdbc.clustername=karaf
+karaf.lock.jdbc.timeout=30
+{code}
+
+The JTDS JDBC driver file has to be copied in the {{lib/ext}} folder with the 
{{karaf-}} prefix.
+
+h3. Container-level locking
 
-The {{karaf.lock.level}} property tells the Karaf instance how far up the boot 
process to bring the OSGi container. All bundles with an ID equals or lower to 
this start level will be started in that Karaf instance.
+Apache Karaf supports container-level locking. It allows bundles to be 
preloaded into the slave instance.
+Thanks to that, switching to a slave instance is very fast as the slave 
instance already contains all required bundles.
 
-Bundle start levels are specified in {{$KARAF_HOME/etc/startup.properties}}, 
in the format {{jar.name=level}}. The core system bundles have levels below 50, 
while user bundles have levels greater than 50.
+The container-level locking is supported in both filesystem and database lock 
mechanisms.
+
+The container-level locking uses the {{karaf.lock.level}} property:
+
+{code}
+karaf.lock.level=80
+{code}
+
+The {{karaf.lock.level}} property tells the Karaf instance how far up the boot 
process to bring the OSGi container.
+All bundles with an ID equals or lower to this start level will be started in 
that Karaf instance.
+
+As reminder, the bundles start levels are specified in 
{{etc/startup.properties}}, in the {{url=level}} format.
 
 || Level || Behavior ||
 | 1 | A 'cold' standby instance. Core bundles are not loaded into container. 
Slaves will wait until lock acquired to start server. |
-| <50 | A 'hot' standby instance. Core bundles are loaded into the container. 
Slaves will wait until lock acquired to start user level bundles. The console 
will be accessible for each slave instance at this level. |
-| >50 | This setting is not recommended as user bundles will end up being 
started. |
+| <80 | A 'hot' standby instance. Core bundles are loaded into the container. 
Slaves will wait until lock acquired to start user level bundles. The console 
will be accessible for each slave instance at this level. |
+| >80 | This setting is not recommended as user bundles will end up being 
started. |
+
+{warning}
+Using 'hot' standby means that the slave instances are running and bind some 
ports. So, if you use master and slave instances on the same machine, you have
+to update the slave configuration to bind the services (ssh, JMX, etc) on 
different port numbers.
+{warning}
+
+h2. Cluster (active/active)
 
-*Note*: When using a 'hot' spare on the same host you need to set the JMX 
remote port to a unique value to avoid bind conflicts. You can edit the Karaf 
start script to include the following:
+Apache Karaf doesn't natively support cluster. By cluster, we mean several 
active instances, synchronized with each other.
 
-{noformat}
-DEFAULT_JAVA_OPTS="-server $DEFAULT_JAVA_OPTS 
-Dcom.sun.management.jmxremote.port=1100 
-Dcom.sun.management.jmxremote.authenticate=false"
-{noformat}
+However, [Apache Karaf 
Cellar|http://karaf.apache.org/index/subprojects/cellar.html] can be installed 
to provide cluster support.
 
+See the [Apache Karaf Cellar 
website|http://karaf.apache.org/index/subprojects/cellar.html] for details.
\ No newline at end of file


Reply via email to