328 lines
8.8 KiB
Bash
328 lines
8.8 KiB
Bash
|
|
#!/bin/bash
|
|||
|
|
#
|
|||
|
|
# This script is used to install, upgrade,
|
|||
|
|
# start and stop the query processing
|
|||
|
|
# nodes (QPNs) of a DSECONDO installation.
|
|||
|
|
#
|
|||
|
|
# Jan Kristof Nidzwetzki
|
|||
|
|
#
|
|||
|
|
#######################################
|
|||
|
|
|
|||
|
|
# Scriptname and Path
|
|||
|
|
pushd `dirname $0` > /dev/null
|
|||
|
|
scriptpath=`pwd`
|
|||
|
|
scriptname=$(basename $0)
|
|||
|
|
popd > /dev/null
|
|||
|
|
|
|||
|
|
# Include functions
|
|||
|
|
. $scriptpath/functions.sh
|
|||
|
|
|
|||
|
|
# Set language to default
|
|||
|
|
LANG=C
|
|||
|
|
|
|||
|
|
# port for secondo (the port range $port - $port+$instances-1 will be used)
|
|||
|
|
port=12234
|
|||
|
|
|
|||
|
|
# secondo worker instances (2 cores for the kernel and cassandra
|
|||
|
|
# and the remaning cores for DSECONDO)
|
|||
|
|
instances=$(($(cat /proc/cpuinfo | grep processor | wc -l) - 3))
|
|||
|
|
|
|||
|
|
# Keyspace to use
|
|||
|
|
keyspace="keyspace_r3"
|
|||
|
|
|
|||
|
|
# QPN Nodes
|
|||
|
|
nodes="${DSECONDO_QPN}"
|
|||
|
|
|
|||
|
|
if [ -z "$nodes" ]; then
|
|||
|
|
echo "Your environment variable \$(DSECONDO_QPN) is empty. Please check your .secondorc"
|
|||
|
|
exit -1
|
|||
|
|
fi
|
|||
|
|
|
|||
|
|
# Overwrite nodes by cli argument
|
|||
|
|
if [ $# -eq 2 ]; then
|
|||
|
|
nodes=$2
|
|||
|
|
fi
|
|||
|
|
|
|||
|
|
if [ -z "$DSECONDO_QPN_DIR" ]; then
|
|||
|
|
echo "Your environment variable \${DSECONDO_QPN_DIR} is empty. Please check your .secondorc"
|
|||
|
|
exit -1
|
|||
|
|
fi
|
|||
|
|
|
|||
|
|
if [ -z "$DSECONDO_DIR" ]; then
|
|||
|
|
echo "Your environment variable \${DSECONDO_DIR} is empty. Please check your .secondorc"
|
|||
|
|
exit -1
|
|||
|
|
fi
|
|||
|
|
|
|||
|
|
# Variables
|
|||
|
|
screensessionServer="dsecondo-server"
|
|||
|
|
screensessionExecutor="dsecondo-executor"
|
|||
|
|
|
|||
|
|
# Get ID for Screen
|
|||
|
|
function getScreenId {
|
|||
|
|
ids=$(screen -ls | grep $1 | cut -f1 -d'.' | tr -d '\t')
|
|||
|
|
|
|||
|
|
if [ $(screen -ls | grep $1 | cut -f1 -d'.' | wc -l) -eq 1 ]; then
|
|||
|
|
echo -n $ids
|
|||
|
|
else
|
|||
|
|
echo -n "-1"
|
|||
|
|
fi
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
# Exec a command in screen session
|
|||
|
|
function execCommandsInScreen {
|
|||
|
|
session=$1
|
|||
|
|
shift
|
|||
|
|
|
|||
|
|
screenid=$(getScreenId "$session")
|
|||
|
|
|
|||
|
|
while [ "$1" != "" ]; do
|
|||
|
|
COMMAND=$1
|
|||
|
|
|
|||
|
|
# Line borrowed from psecondo tools
|
|||
|
|
screen -S $screenid -p 0 -X stuff "${COMMAND}$(printf \\r)"
|
|||
|
|
shift
|
|||
|
|
done
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
# Start local dsecondo instance
|
|||
|
|
start_local() {
|
|||
|
|
echo "Starting DSECONDO instance"
|
|||
|
|
|
|||
|
|
if [ ! -f $SECONDO_CONFIG ]; then
|
|||
|
|
echo "Unable to locate SECONDO config" 1>&2
|
|||
|
|
exit -1
|
|||
|
|
fi
|
|||
|
|
|
|||
|
|
if [ $(grep CassandraHost $SECONDO_CONFIG | wc -l ) -ne 1 ]; then
|
|||
|
|
echo "CassandraHost is not set in your SECONDO config, exiting" 1>&2
|
|||
|
|
exit -1
|
|||
|
|
fi
|
|||
|
|
|
|||
|
|
# Check if screen is already running
|
|||
|
|
sInstances=$(screen -ls | egrep "($screensessionServer|$screensessionExecutor)" | wc -l)
|
|||
|
|
|
|||
|
|
if [ $sInstances -ne 0 ]; then
|
|||
|
|
echo "[Error] Screen is already running... " 1>&2
|
|||
|
|
exit -1
|
|||
|
|
fi
|
|||
|
|
|
|||
|
|
# local ip
|
|||
|
|
ip=$(getIp)
|
|||
|
|
|
|||
|
|
# username
|
|||
|
|
username=$(whoami)
|
|||
|
|
|
|||
|
|
ports=""
|
|||
|
|
instance=0
|
|||
|
|
while [ $instance -le $((instances-1)) ]; do
|
|||
|
|
|
|||
|
|
instance_port=$((port+instance))
|
|||
|
|
ports+=":${instance_port}"
|
|||
|
|
|
|||
|
|
# Change SECONDO Server Port in configuration
|
|||
|
|
configuration=/tmp/SecondoConfig_${username}_${instance}.ini
|
|||
|
|
cp ${SECONDO_CONFIG} $configuration
|
|||
|
|
sed -i "s/^SecondoPort=.*/SecondoPort=$instance_port/" $configuration
|
|||
|
|
sed -i "s/^SecondoHome=\(.*\)/SecondoHome=\1_$instance/" $configuration
|
|||
|
|
sed -i "s/^CassandraHost=.*/CassandraHost=$ip/" $configuration
|
|||
|
|
|
|||
|
|
secondoHome=$(grep ^SecondoHome $configuration | cut -d "=" -f 2)
|
|||
|
|
mkdir -p $secondoHome
|
|||
|
|
|
|||
|
|
# Start screen in deamon mode
|
|||
|
|
screenId=${screensessionServer}_${instance}
|
|||
|
|
screen -dmS $screenId
|
|||
|
|
sleep 1
|
|||
|
|
execCommandsInScreen $screenId "cd $SECONDO_BUILD_DIR/bin; ./SecondoMonitor -s -c ${configuration}"
|
|||
|
|
|
|||
|
|
instance=$((instance+1))
|
|||
|
|
done
|
|||
|
|
|
|||
|
|
sleep 5
|
|||
|
|
|
|||
|
|
# remove trailing ':' in ports list
|
|||
|
|
ports=$(echo $ports | sed s/^://g)
|
|||
|
|
|
|||
|
|
screen -dmS $screensessionExecutor
|
|||
|
|
localIp=$(getIp "")
|
|||
|
|
#execCommandsInScreen $screensessionExecutor "cd $SECONDO_BUILD_DIR/Algebras/Cassandra/tools/queryexecutor/" "./Queryexecutor -i $localIp -k $keyspace -s 127.0.0.1 -p $ports | tee /tmp/qe.log"
|
|||
|
|
execCommandsInScreen $screensessionExecutor "cd $SECONDO_BUILD_DIR/Algebras/Cassandra/tools/queryexecutor/" "while [ true ]; do ./Queryexecutor -i $localIp -k $keyspace -s 127.0.0.1 -p $ports; sleep 5; done"
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
# Stop local dsecondo instance
|
|||
|
|
stop_local() {
|
|||
|
|
echo "Stopping DSECONDO instance"
|
|||
|
|
|
|||
|
|
# Kill the screen executor session
|
|||
|
|
screenid=$(getScreenId "$screensessionExecutor")
|
|||
|
|
|
|||
|
|
if [ "$screenid" != "-1" ]; then
|
|||
|
|
echo $screenid
|
|||
|
|
kill $screenid
|
|||
|
|
fi
|
|||
|
|
|
|||
|
|
# Stop secondo instances
|
|||
|
|
instance=0
|
|||
|
|
while [ $instance -le $((instances-1)) ]; do
|
|||
|
|
|
|||
|
|
screenId=${screensessionServer}_${instance}
|
|||
|
|
|
|||
|
|
# Line borrowed from psecondo tools
|
|||
|
|
screenpid=$(getScreenId "$screenId")
|
|||
|
|
if [ "$screenpid" != "-1" ]; then
|
|||
|
|
execCommandsInScreen $screenpid "quit" "y" "exit"
|
|||
|
|
fi
|
|||
|
|
instance=$((instance+1))
|
|||
|
|
done
|
|||
|
|
|
|||
|
|
sleep 5
|
|||
|
|
|
|||
|
|
# kill remaining secondo instances
|
|||
|
|
instance=0
|
|||
|
|
while [ $instance -le $((instances-1)) ]; do
|
|||
|
|
|
|||
|
|
screenId=${screensessionServer}_${instance}
|
|||
|
|
|
|||
|
|
# Kill the screen executor session
|
|||
|
|
screenpid=$(getScreenId "$screenId")
|
|||
|
|
|
|||
|
|
if [ "$screenpid" != "-1" ]; then
|
|||
|
|
echo $screenpid
|
|||
|
|
kill $screenpid
|
|||
|
|
fi
|
|||
|
|
|
|||
|
|
instance=$((instance+1))
|
|||
|
|
done
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
# Kill local dsecondo instances
|
|||
|
|
kill_local() {
|
|||
|
|
echo "Killing DSECONDO instance"
|
|||
|
|
|
|||
|
|
pids=$(ps ux | grep SecondoBDB | grep -v grep | awk {'print $2'})
|
|||
|
|
|
|||
|
|
for pid in $pids; do
|
|||
|
|
kill -9 $pid
|
|||
|
|
done
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
# Start all descondo instances
|
|||
|
|
start() {
|
|||
|
|
#execute_parallel "bash -x $scriptpath/$scriptname start_local > /dev/null" "Starting DSECONDO" "$nodes" $max_pending
|
|||
|
|
execute_parallel "source .secondorc; export SECONDO_BUILD_DIR=$DSECONDO_QPN_DIR/secondo; export SECONDO_CONFIG=$SECONDO_BUILD_DIR/bin/SecondoConfig.ini; \$SECONDO_BUILD_DIR/Algebras/Cassandra/tools/$scriptname start_local > /dev/null" "Starting DSECONDO" "$nodes" $max_pending
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
# Stop all desecondo instances
|
|||
|
|
stop() {
|
|||
|
|
#execute_parallel "bash -x $scriptpath/$scriptname stop_local > /dev/null" "Stopping DSECONDO" "$nodes" $max_pending
|
|||
|
|
execute_parallel "source .secondorc; export SECONDO_BUILD_DIR=$DSECONDO_QPN_DIR/secondo; export SECONDO_CONFIG=$SECONDO_BUILD_DIR/bin/SecondoConfig.ini; \$SECONDO_BUILD_DIR/Algebras/Cassandra/tools/$scriptname stop_local > /dev/null" "Stopping DSECONDO" "$nodes" $max_pending
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
# Kill all dsecondo instances
|
|||
|
|
kill_dsecondo() {
|
|||
|
|
execute_parallel "source .secondorc; export SECONDO_BUILD_DIR=$DSECONDO_QPN_DIR/secondo; export SECONDO_CONFIG=$SECONDO_BUILD_DIR/bin/SecondoConfig.ini; \$SECONDO_BUILD_DIR/Algebras/Cassandra/tools/$scriptname kill_local > /dev/null" "Killing DSECONDO" "$nodes" $max_pending
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
# Install SECONDO on all QPNs
|
|||
|
|
install() {
|
|||
|
|
|
|||
|
|
execute_parallel "mkdir -p $DSECONDO_QPN_DIR" "Creating DSECONDO directory" "$nodes" $max_pending
|
|||
|
|
|
|||
|
|
for node in $nodes; do
|
|||
|
|
echo "Copy .secondorc to Node $node"
|
|||
|
|
scp ~/.secondorc ${node}:
|
|||
|
|
done
|
|||
|
|
|
|||
|
|
execute_parallel "if [ $(cat ~/.bashrc | grep .secondorc | wc -l) -eq 0 ]; then echo 'source ~/.secondorc' >> ~/.bashrc; fi" "Adding SECONDO environment variables" "$nodes" $max_pending
|
|||
|
|
|
|||
|
|
# Upgrade DSECONDO Build on all QPNs
|
|||
|
|
upgrade
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
# Upgrade the SECONDO installation and all drivers on all QPNs
|
|||
|
|
upgrade() {
|
|||
|
|
for node in $nodes; do
|
|||
|
|
echo "Upgrading drivers on Node $node"
|
|||
|
|
rsync --progress -l -H -p -o -g -D -t -r -e "ssh" ${DSECONDO_DIR}/driver/ $node:${DSECONDO_QPN_DIR}/driver > /dev/null
|
|||
|
|
echo "Upgrading QPN-SECONDO on Node $node"
|
|||
|
|
rsync --progress -l -H -p -o -g -D -t -r --files-from=${DSECONDO_DIR}/secondo/Algebras/Cassandra/tools/qpnfiles -e "ssh" ${DSECONDO_DIR}/secondo/ $node:${DSECONDO_QPN_DIR}/secondo > /dev/null
|
|||
|
|
done
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
# Download and install the CPP driver and all dependencies
|
|||
|
|
install_driver() {
|
|||
|
|
|
|||
|
|
# Install LIBUV
|
|||
|
|
if [ -d ${DSECONDO_DIR}/driver/libuv ]; then
|
|||
|
|
echo "LibUV is already installed";
|
|||
|
|
else
|
|||
|
|
mkdir -p ${DSECONDO_DIR}/driver
|
|||
|
|
cd ${DSECONDO_DIR}/driver
|
|||
|
|
git clone https://github.com/libuv/libuv.git
|
|||
|
|
cd libuv
|
|||
|
|
sh autogen.sh
|
|||
|
|
./configure
|
|||
|
|
make
|
|||
|
|
cd ..
|
|||
|
|
fi
|
|||
|
|
|
|||
|
|
# Install the CPP Driver
|
|||
|
|
if [ -d ${DSECONDO_DIR}/driver/cpp-driver ]; then
|
|||
|
|
echo "cpp-driver is already installed";
|
|||
|
|
else
|
|||
|
|
mkdir -p ${DSECONDO_DIR}/driver
|
|||
|
|
cd ${DSECONDO_DIR}/driver
|
|||
|
|
git clone https://github.com/datastax/cpp-driver.git
|
|||
|
|
cd cpp-driver
|
|||
|
|
|
|||
|
|
# Fix for LIBUV detection, the first cmake call fails,
|
|||
|
|
# the second is successful. If you remove the first
|
|||
|
|
# call, the second will fail.
|
|||
|
|
export LIBUV_ROOT_DIR=${DSECONDO_DIR}/driver/libuv/.libs
|
|||
|
|
cmake .
|
|||
|
|
export LIBUV_ROOT_DIR=${DSECONDO_DIR}/driver/libuv/
|
|||
|
|
cmake .
|
|||
|
|
|
|||
|
|
make
|
|||
|
|
cd ..
|
|||
|
|
fi
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
|
|||
|
|
case "$1" in
|
|||
|
|
|
|||
|
|
start)
|
|||
|
|
start
|
|||
|
|
;;
|
|||
|
|
stop)
|
|||
|
|
stop
|
|||
|
|
;;
|
|||
|
|
kill)
|
|||
|
|
kill_dsecondo
|
|||
|
|
;;
|
|||
|
|
start_local)
|
|||
|
|
start_local
|
|||
|
|
;;
|
|||
|
|
stop_local)
|
|||
|
|
stop_local
|
|||
|
|
;;
|
|||
|
|
kill_local)
|
|||
|
|
kill_local
|
|||
|
|
;;
|
|||
|
|
install_driver)
|
|||
|
|
install_driver
|
|||
|
|
;;
|
|||
|
|
install)
|
|||
|
|
install
|
|||
|
|
;;
|
|||
|
|
upgrade)
|
|||
|
|
upgrade
|
|||
|
|
;;
|
|||
|
|
*)
|
|||
|
|
echo "Usage $0 {start | stop | kill | install | upgrade | install_driver}"
|
|||
|
|
;;
|
|||
|
|
esac
|
|||
|
|
|
|||
|
|
exit 0
|
|||
|
|
|