blob: 1d1a02b627ed4a770499cd4e38d7338bce2cf4c5 [file] [log] [blame] [view]
This plugin allows making Gerrit highly available by having redundant Gerrit
masters.
The masters must be:
* connecting to the same database
* sharing the git repositories using a shared file system (e.g. NFS)
* behind a load balancer (e.g. HAProxy)
Currently, the mode supported is one primary (active) master and multiple backup
(passive) masters but eventually the plan is to support `n` active masters. In
the active/passive mode, the active master is handling all traffic while the
passives are kept updated to be always ready to take over.
Even if database and git repositories are shared by the masters, there are a few
areas of concern in order to be able to switch traffic between masters in a
transparent manner from the user's perspective. The 4 areas of concern are
things that Gerrit stores either in memory or locally in the review site:
* caches
* secondary indexes
* stream-events
* web sessions
They need either to be shared or kept local to each master but synchronized.
This plugin needs to be installed in all the masters and it will take care of sharing
or synchronizing them.
#### Caches
Every time a cache eviction occurs in one of the masters, the eviction will be
forwarded the other masters so their caches do not contain stale entries.
#### Secondary indexes
Every time the secondary index is modified in one of the masters, e.g., a change
is added, updated or removed from the index, the others master's index are
updated accordingly. This way, both indexes are kept synchronized.
#### Stream events
Every time a stream event occurs in one of the masters (see [more events info]
(https://gerrit-review.googlesource.com/Documentation/cmd-stream-events.html#events)),
the event is forwarded to the other masters which re-plays it. This way, the
output of the stream-events command is the same, no matter which master a client
is connected to.
#### Web session
The built-in Gerrit H2 based web session cache is replaced with a file based
implementation that is shared amongst the masters.
## Setup
Prerequisites:
* Unique database server must be accessible from all the masters
* Git repositories must be located on a shared file system
* A directory on a shared file system must be available for @PLUGIN@ to use
For the masters:
* Configure the database section in gerrit.config to use the shared database
* Configure gerrit.basePath in gerrit.config to the shared repositories location
* Configure gerrit.serverId in gerrit.config based on [config](config.md)'s introduction
* Install and configure this @PLUGIN@ plugin [further](config.md) or based on below.
Here is an example of the minimal @PLUGIN@.config:
Primary master
```
[main]
sharedDirectory = /directory/accessible/from/both/masters
[peerInfo "static"]
url = http://backupMasterHost1:8081/
[http]
user = username
password = password
```
Backup master
```
[main]
sharedDirectory = /directory/accessible/from/both/masters
[peerInfo "static"]
url = http://primaryMasterHost:8080/
[http]
user = username
password = password
```
### HA replica site
It is possible to create a copy of the master site and configure both sites to run
in HA mode as peers. This is possible when the directory where the copy will be
created is accessible from this machine. Such a replica site can be created by
means of a gerrit [site init](../../../Documentation/pgm-init.html) step,
contributed by the plugin under its init section.
This init step is optional but defaults to creating the replica. If you want to
create the other site manually, or if the other site needs to be created in a
directory not accessible from this machine, then please skip that init step.
For further information and supported options, refer to [config](config.md)
documentation.