Skip to content

Instantly share code, notes, and snippets.

@snaga
Last active August 29, 2015 14:14
Show Gist options
  • Select an option

  • Save snaga/de48c014eaa4a8791c76 to your computer and use it in GitHub Desktop.

Select an option

Save snaga/de48c014eaa4a8791c76 to your computer and use it in GitHub Desktop.
install_pgxl.sh
#!/bin/sh
# install_pgxl.sh
#
# Copyright(c) 2015 Uptime Technologies, LLC.
PGXL_HOME=/opt/uptime/pgxl
PGXL_DATA=/var/lib/pgxl
PGXC_CTL_HOME=${PGXL_DATA}/pgxc_ctl
export PGXL_HOME PGXL_DATA PGXC_CTL_HOME
LD_LIBRARY_PATH=${PGXL_HOME}/lib
PATH=${PGXL_HOME}/bin:$PATH
export LD_LIBRARY_PATH PATH
function create_user_and_ssh_config()
{
adduser pgxl
if [ ! -d ~pgxl/.ssh ]; then
mkdir -p ~pgxl/.ssh
chmod 700 ~pgxl/.ssh
fi
# config ssh to allow no-password login.
if [ ! -f ~pgxl/.ssh/id_rsa ]; then
ssh-keygen -t rsa -f ~pgxl/.ssh/id_rsa -N ""
fi
chown -R pgxl:pgxl ~pgxl/.ssh
/bin/cp ~pgxl/.ssh/id_rsa.pub ~pgxl/.ssh/authorized_keys
chown -R pgxl:pgxl ~pgxl/.ssh
ls -la ~pgxl/.ssh/
# add pgxl settings to .bash_profile
if [ ! -f ~pgxl/.bash_profile.orig ]; then
# take a backup for original file.
cp ~pgxl/.bash_profile ~pgxl/.bash_profile.orig
else
# restore the original file.
cp ~pgxl/.bash_profile.orig ~pgxl/.bash_profile
fi;
cat <<EOF >> ~pgxl/.bash_profile
# PGXL
LD_LIBRARY_PATH=${PGXL_HOME}/lib
PATH=${PGXL_HOME}/bin:$PATH
export LD_LIBRARY_PATH PATH
PGXC_CTL_HOME=${PGXC_CTL_HOME}
export PGXC_CTL_HOME
EOF
chown pgxl:pgxl ~pgxl/.bash_profile
}
function download_and_extract()
{
# Convert '/' char into '-' in the branch name.
SUFFIX=`echo $PGXL_BRANCH | sed 's/\//-/'`
wget https://codeload.github.com/snaga/postgres-xl/zip/${PGXL_BRANCH}
OUTFILE=`basename $PGXL_BRANCH`
if [ ! -f $OUTFILE ]; then
echo "ERROR: Failed to download $OUTFILE branch from github. Abort."
exit 1
fi
mv $OUTFILE $OUTFILE.zip
unzip $OUTFILE.zip
rm -rf postgres-xl
mv postgres-xl-${SUFFIX} postgres-xl
}
CONTRIB_MODULES="pgxc_clean pgxc_ctl pgxc_ddl pgxc_monitor"
function get_num_disks()
{
NUM_DISKS=$#
}
function _build_all()
{
get_num_disks $PGXL_DISKS
./configure --prefix=${PGXL_HOME} --enable-debug
make -j $NUM_DISKS
for c in $CONTRIB_MODULES; do
pushd contrib/$c; make -j $NUM_DISKS; popd
done;
}
function _install_all()
{
sudo rm -rf ${PGXL_HOME}
sudo make install
for c in $CONTRIB_MODULES; do
pushd contrib/$c; sudo make install; popd
done;
}
function build_and_install()
{
_build_all
_install_all
}
function delete_and_create_directory()
{
d=$1
echo deleting in $d
rm -rf $d/*
echo creating $d
mkdir -p $d
chown -R pgxl:pgxl $d
}
function stop_and_cleanup()
{
echo terminating postgres and gtm processes.
killall -9 postgres gtm
sleep 3
delete_and_create_directory ${PGXL_DATA}/gtm
delete_and_create_directory ${PGXL_DATA}/coord
for d in "$@"; do
delete_and_create_directory $d
done;
delete_and_create_directory $PGXC_CTL_HOME
}
function init_all()
{
sudo -u pgxl cp -v $1 ${PGXC_CTL_HOME}/pgxc_ctl.conf
sudo -u pgxl ${PGXL_HOME}/bin/pgxc_ctl --home $PGXC_CTL_HOME init all
}
function create_pgxc_ctl_conf()
{
TEMPLATE=$1
shift
OUTPUT=$1
shift
# Directories for GTM and coordinator nodes
firstdatadir=$1
i=1
while [ $i -le $NUM_NODES ]; do
name="data$i"
port=`expr 20007 + $i`
poolerport=`expr 21001 + $i`
datanodeNames="$datanodeNames $name"
datanodePorts="$datanodePorts $port"
datanodePoolerPorts="$datanodePoolerPorts $poolerport"
datanodeMasterServers="$datanodeMasterServers 127.0.0.1"
dir=$1
datanodeMasterDirs="$datanodeMasterDirs $dir"
shift
datanodeMaxWALSenders="\$datanodeMaxWALSenders $datanodeMaxWALSenders"
i=`expr $i + 1`
done;
datanodeNames=`echo $datanodeNames | sed 's/^ //'`
datanodePorts=`echo $datanodePorts | sed 's/^ //'`
datanodePoolerPorts=`echo $datanodePoolerPorts | sed 's/^ //'`
datanodeMasterServers=`echo $datanodeMasterServers | sed 's/^ //'`
datanodeMasterDirs=`echo $datanodeMasterDirs | sed 's/^ //'`
datanodeMaxWALSenders=`echo $datanodeMaxWALSenders | sed 's/^ //'`
# Directories for GTM and coordinator nodes
gtmMasterDir=${PGXL_DATA}/gtm
coordMasterDir=${PGXL_DATA}/coord
cat $TEMPLATE \
| sed "s,__gtmMasterDir__,$gtmMasterDir," \
| sed "s,__coordMasterDir__,$coordMasterDir," \
| sed "s,__datanodeNames__,$datanodeNames," \
| sed "s,__datanodePorts__,$datanodePorts," \
| sed "s,__datanodePoolerPorts__,$datanodePoolerPorts," \
| sed "s,__datanodeMasterServers__,$datanodeMasterServers," \
| sed "s,__datanodeMasterDirs__,$datanodeMasterDirs," \
| sed "s,__datanodeMaxWALSenders__,$datanodeMaxWALSenders," \
> $OUTPUT
diff -rc $TEMPLATE $OUTPUT
}
function setup()
{
NUM_NODES=$#
echo "Number of nodes: $NUM_NODES"
stop_and_cleanup $@
curl https://gist.githubusercontent.com/snaga/afac9528e629a2eb2e35/raw > /tmp/pgxc_ctl.conf.template
create_pgxc_ctl_conf /tmp/pgxc_ctl.conf.template /tmp/pgxc_ctl.conf $@
init_all /tmp/pgxc_ctl.conf
}
if [ -z "$PGXL_BRANCH" ]; then
PGXL_BRANCH=develop
export PGXL_BRANCH
fi
if [ -z "$PGXL_DISKS" ]; then
PGXL_DISKS=/var/lib/pgxl/data1
export PGXL_DISKS
fi
create_user_and_ssh_config
download_and_extract
cd postgres-xl
build_and_install
setup $PGXL_DISKS
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment