====== Solr Replication ====== Solr may be configured to replicate between servers. This can be useful for separating your indexing processes from your running search system, for load balancing, etc. Newer versions of Solr also support a more complex "Solr Cloud" configuration for robust multi-server searching; see [[https://vufind.org/jira/browse/VUFIND-834|VUFIND-834]] for some notes. ===== solrconfig.xml ===== For basic Solr replication, in which one or more servers clone the index from a single authoritative source of truth, the following configuration can be added to the $VUFIND_HOME/solr/$core/conf/solrconfig.xml file (uncomment the appropriate master or slave sections): ===== pull-browse.sh (AlphaBrowse Synchronization) ===== A Bash script to pull browse indexes from another host. The idea is that if you are running a Solr slave to keep the indexing load away from searches, you probably want to do the same for the alphabetical browse indexes. But there's no replication for SQLite! Prereqs are curl and passwordless ssh/scp between the hosts for the administrative user. #!/bin/bash # Tod Olson # Much is stolen shamelessly from scripts by Keith Waclena # # Copy browse index from a remote host to local host via scp. Sets up # the .db-ready file semaphore and calls browse handler to move the # index into place. # ME=`basename $0 .sh` USAGE="Usage: $ME [-t] [-V remote_home] [user@]host index; -H for help" HELP="OPTIONS: -H: print this help message -B: use scp batch and quiet modes -V: VUFIND_HOME on remote host (if different from localhost) -t: testing only - NYI ARGUMENTS: host: name of the remote host to copy from, can accept SSH-style user@host syntax index: name of the index (less the _browse suffix) ENVIRONMENT The following variables must be set: VUFIND_HOME" TAB="$(printf '\t')" TESTING=false # prerequisites prereqs () { satisfied= missing= for p in $@ do if type "$p" > /dev/null 2>&1 then satisfied="$satisfied| $p${TAB}$(which $p)" else missing="$missing $p" fi done if [ "$missing" != "" ] then ( echo "$ME: missing prerequisites:" echo "$missing" echo -n "$ME: satisfied prerequisites:" echo "$satisfied" | tr \| '\012' ) >&2 exit 69 else : ok fi } noreq () { fatal "DRYROT: missing prerequisite!" } prereqs scp # handy functions usage () { echo "$USAGE" 1>&2 case "$1" in '') ;; 0) exit 0 ;; *) exit "$1" ;; esac } nyi () { echo "$1: not yet implemented" 1>&2 exit 2 } warning () { echo "$*" 1>&2 } fatal () { if expr "$1" : '[0-9][0-9]*$' > /dev/null then X=$1; shift else X=1 fi echo "$*" 1>&2 exit $X } prefix () { if $TESTING then echo "TEST$1" else echo "$1" fi } # # Check environment # if [ -z "$VUFIND_HOME" ] then fatal "VUFIND_HOME not set" fi REMOTE_VUFIND_HOME="$VUFIND_HOME" SCP_BATCH="" SSH_QUIET="" while true do case "$1" in -H) shift; usage; echo "$HELP"; exit 0 ;; -t) shift; TESTING=true ;; -B) shift; SCP_BATCH="-Bq"; SSH_QUIET="-q";; -V) REMOTE_VUFIND_HOME=$2; shift; shift;; --) shift; break ;; -) break ;; -*) usage 1 ;; *) break ;; esac done [ $# -eq 2 ] || usage 1 REMOTE_HOST=$1 INDEX=$2 # # Main # INDEX_BASE=${INDEX}_browse REMOTE_BASE=$REMOTE_VUFIND_HOME/solr/alphabetical_browse/${INDEX_BASE} LOCAL_BASE=$VUFIND_HOME/solr/alphabetical_browse/${INDEX_BASE} # .db-ready is the signal that .db-updated is complete, but # .db-updated could move into place and .db-ready could be deleted at # any time if ssh $SSH_QUIET $REMOTE_HOST test -f ${REMOTE_BASE}.db-ready then scp ${SCP_BATCH} -p ${REMOTE_HOST}:${REMOTE_BASE}.db-updated ${LOCAL_BASE}.db-updated || scp ${SCP_BATCH} -p ${REMOTE_HOST}:${REMOTE_BASE}.db ${LOCAL_BASE}.db-updated else scp ${SCP_BATCH} -p ${REMOTE_HOST}:${REMOTE_BASE}.db ${LOCAL_BASE}.db-updated fi if [ $? -ne 0 ] then fatal "failed to copy $INDEX_BASE from $REMOTE_HOST" fi touch ${LOCAL_BASE}.db-ready && curl "http://localhost:8983/solr/biblio/browse?source=${INDEX}" > /dev/null # Local Variables: # End: