Files
scylladb/dist/common/scripts/scylla_setup
Takuya ASADA 4262edd843 dist: use distribution standard fstrim script instead of our custom one
We recently introduced fstrim cronjob / systemd timer unit, but some of
distributions already has their own fstrim cronjob / systemd timer unit.
So let's use them when it's posssible.

Fixes #2233

Signed-off-by: Takuya ASADA <syuu@scylladb.com>
Message-Id: <1491226727-10507-1-git-send-email-syuu@scylladb.com>
2017-04-04 16:44:45 +03:00

484 lines
15 KiB
Bash
Executable File

#!/bin/bash -e
#
# Copyright (C) 2015 ScyllaDB
. /usr/lib/scylla/scylla_lib.sh
GREEN='\033[0;32m'
RED='\033[0;31m'
NO_COLOR='\033[0m' # No Color
if [ "`id -u`" -ne 0 ]; then
echo "Requires root permission."
exit 1
fi
print_usage() {
echo "scylla_setup --disks /dev/hda,/dev/hdb... --nic eth0 --ntp-domain centos --ami --setup-nic --developer-mode --no-kernel-check --no-verify-package --no-enable-service --no-selinux-setup --no-bootparam-setup --no-ntp-setup --no-raid-setup --no-coredump-setup --no-sysconfig-setup --no-cpuscaling-setup --no-fstrim-setup"
echo " --disks specify disks for RAID"
echo " --nic specify NIC"
echo " --ntp-domain specify NTP domain"
echo " --ami setup AMI instance"
echo " --setup-nic optimize NIC queue"
echo " --developer-mode enable developer mode"
echo " --no-kernel-check skip kernel version check"
echo " --no-verify-package skip verifying packages"
echo " --no-enable-service skip enabling service"
echo " --no-selinux-setup skip selinux setup"
echo " --no-bootparam-setup skip bootparam setup"
echo " --no-ntp-setup skip ntp setup"
echo " --no-raid-setup skip raid setup"
echo " --no-coredump-setup skip coredump setup"
echo " --no-sysconfig-setup skip sysconfig setup"
echo " --no-io-setup skip IO configuration setup"
echo " --no-version-check skip daily version check"
echo " --no-node-exporter do not install the node exporter"
echo " --no-cpuscaling-setup skip cpu scalling setup"
if is_redhat_variant; then
echo " --no-fstrim-setup skip fstrim setup"
fi
exit 1
}
interactive_ask_service() {
echo $1
echo $2
while true; do
if [ "$3" == "yes" ]; then
prompt="[YES/no]"
elif [ "$3" == "no" ]; then
prompt="[yes/NO]"
else
prompt="[yes/no]"
fi
result=""
while [ x == x"$result" ]; do
read -p $prompt ans
if [ x == x"$ans" ]; then
result="$3"
else
result="$ans"
fi
done
case $(echo $result | tr '[:upper:]' '[:lower:]') in
"y" | "yes")
return 1
;;
"n" | "no")
return 0
;;
esac
done
}
verify_package() {
if is_debian_variant; then
dpkg -s $1 > /dev/null 2>&1 &&:
else
rpm -q $1 > /dev/null 2>&1 &&:
fi
if [ $? -eq 1 ]; then
echo "$1 package is not installed."
exit 1
fi
}
list_block_devices() {
if lsblk --help | grep -q -e '^\s*-p'; then
# to skip ROM devices, drop 'rom'
lsblk -pnr | awk '$6 != "rom" { print $1 }'
else
ls -1 /dev/sd* /dev/hd* /dev/xvd* /dev/nvme* /dev/mapper/* 2>/dev/null|grep -v control
fi
}
get_unused_disks() {
list_block_devices|grep -v loop|while read dev
do
count_raw=$(grep $dev /proc/mounts|wc -l)
count_pvs=0
if [ -f /usr/sbin/pvs ]; then
count_pvs=$(pvs|grep $dev|wc -l)
fi
count_swap=$(swapon -s |grep `realpath $dev`|wc -l)
if [ $count_raw -eq 0 -a $count_pvs -eq 0 -a $count_swap -eq 0 ]; then
echo -n "$dev "
fi
done
}
run_setup_script() {
name=$1
shift 1
$* &&:
if [ $? -ne 0 ] && [ $INTERACTIVE -eq 1 ]; then
printf "${RED}$name setup failed. press any key to continue...${NO_COLOR}\n"
read
return 1
fi
return 0
}
AMI=0
SET_NIC=0
DEV_MODE=0
KERNEL_CHECK=1
VERIFY_PACKAGE=1
ENABLE_SERVICE=1
ENABLE_CHECK_VERSION=1
SELINUX_SETUP=1
BOOTPARAM_SETUP=1
NTP_SETUP=1
RAID_SETUP=1
COREDUMP_SETUP=1
SYSCONFIG_SETUP=1
IO_SETUP=1
NODE_EXPORTER=1
CPUSCALING_SETUP=1
FSTRIM_SETUP=1
SELINUX_REBOOT_REQUIRED=0
if [ $# -ne 0 ]; then
INTERACTIVE=0
else
INTERACTIVE=1
fi
while [ $# -gt 0 ]; do
case "$1" in
"--disks")
DISKS="$2"
shift 2
;;
"--nic")
NIC="$2"
shift 2
;;
"--ntp-domain")
NTP_DOMAIN="$2"
shift 2
;;
"--ami")
AMI=1
shift 1
;;
"--setup-nic")
SET_NIC=1
shift 1
;;
"--developer-mode")
DEV_MODE=1
shift 1
;;
"--no-kernel-check")
KERNEL_CHECK=0
shift 1
;;
"--no-verify-package")
VERIFY_PACKAGE=0
shift 1
;;
"--no-enable-service")
ENABLE_SERVICE=0
shift 1
;;
"--no-version-check")
ENABLE_CHECK_VERSION=0
shift 1
;;
"--no-selinux-setup")
SELINUX_SETUP=0
shift 1
;;
"--no-bootparam-setup")
BOOTPARAM_SETUP=0
shift 1
;;
"--no-ntp-setup")
NTP_SETUP=0
shift 1
;;
"--no-raid-setup")
RAID_SETUP=0
shift 1
;;
"--no-coredump-setup")
COREDUMP_SETUP=0
shift 1
;;
"--no-sysconfig-setup")
SYSCONFIG_SETUP=0
shift 1
;;
"--no-io-setup")
IO_SETUP=0
shift 1
;;
"--no-node-exporter")
NODE_EXPORTER=0
shift 1
;;
"--no-cpuscaling-setup")
CPUSCALING_SETUP=0
shift 1
;;
"--no-fstrim-setup")
FSTRIM_SETUP=0
shift 1
;;
"-h" | "--help")
print_usage
shift 1
;;
esac
done
if [ $INTERACTIVE -eq 0 ] && [ $RAID_SETUP -eq 1 ] && [ "$DISKS" = "" ]; then
print_usage
fi
if [ $INTERACTIVE -eq 0 ] && [ $SYSCONFIG_SETUP -eq 1 ] && [ "$NIC" = "" ]; then
print_usage
fi
printf "${GREEN}Skip any of the following steps by answering 'no'${NO_COLOR}\n"
if [ $INTERACTIVE -eq 1 ]; then
interactive_ask_service "Do you want to run kernel version check?" "Answer yes to have this script verify that the currently installed kernel is qualified to run Scylla; answer no to skip this check." "yes" &&:
KERNEL_CHECK=$?
fi
if [ $KERNEL_CHECK -eq 1 ]; then
/usr/lib/scylla/scylla_kernel_check
fi
if [ $INTERACTIVE -eq 1 ]; then
interactive_ask_service "Do you want to verify ScyllaDB packages installed?" "Answer yes to have this script check that ScyllaDB is already installed; answer no to skip this check." "yes" &&:
VERIFY_PACKAGE=$?
fi
if [ $VERIFY_PACKAGE -eq 1 ]; then
verify_package scylla-jmx
verify_package scylla-tools
fi
if [ $INTERACTIVE -eq 1 ]; then
interactive_ask_service "Do you want to enable ScyllaDB services?" "Answer yes to automatically start Scylla when the node boots; answer no to skip this step." "yes" &&:
ENABLE_SERVICE=$?
fi
if [ $ENABLE_SERVICE -eq 1 ]; then
if is_systemd; then
systemctl enable scylla-server.service
systemctl enable collectd.service
fi
if [ $INTERACTIVE -eq 1 ] && [ ! -f /etc/scylla.d/housekeeping.cfg ]; then
interactive_ask_service "Do you want to enable ScyllaDB version check?" "Answer yes to automatically start Scylla-housekeeping service that checks for a newer version periodically; answer no to skip this step." "yes" &&:
ENABLE_CHECK_VERSION=$?
fi
if [ $ENABLE_CHECK_VERSION -eq 1 ]; then
if [ ! -f /etc/scylla.d/housekeeping.cfg ]; then
printf "[housekeeping]\ncheck-version: True\n" > /etc/scylla.d/housekeeping.cfg
fi
if is_systemd; then
systemctl unmask scylla-housekeeping-daily.timer
systemctl unmask scylla-housekeeping-restart.timer
fi
else
if [ ! -f /etc/scylla.d/housekeeping.cfg ]; then
printf "[housekeeping]\ncheck-version: False\n" > /etc/scylla.d/housekeeping.cfg
fi
if is_systemd; then
systemctl mask scylla-housekeeping-daily.timer
systemctl mask scylla-housekeeping-restart.timer
systemctl stop scylla-housekeeping-daily.timer || true
systemctl stop scylla-housekeeping-restart.timer || true
fi
fi
fi
CUR_VERSION=`scylla --version` || true
if [ "$CUR_VERSION" != "" ] && [ "$UUID" != "" ]; then
NEW_VERSION=`sudo -u scylla /usr/lib/scylla/scylla-housekeeping --uuid-file /var/lib/scylla-housekeeping/housekeeping.uuid version --version $CUR_VERSION --mode i` || true
if [ "$NEW_VERSION" != "" ]; then
echo $NEW_VERSION
fi
fi
# scylla_selinux_setup only supports Red Hat variants
if ! is_debian_variant; then
if [ $INTERACTIVE -eq 1 ]; then
interactive_ask_service "Do you want to disable SELinux?" "Answer yes to disable SELinux and improve performance; answer no to keep it activated." "yes" &&:
SELINUX_SETUP=$?
fi
if [ $SELINUX_SETUP -eq 1 ]; then
run_setup_script "SELinux" /usr/lib/scylla/scylla_selinux_setup &&:
if [ $? -eq 0 ]; then
SELINUX_REBOOT_REQUIRED=1
fi
fi
fi
if [ $AMI -eq 1 ]; then
if [ $INTERACTIVE -eq 1 ]; then
interactive_ask_service "Do you want to setup bootloader options?" "Answer yes to enable hugepages at boot time and improve performance. Answer no to skip this step." "yes" &&:
BOOTPARAM_SETUP=$?
fi
if [ $BOOTPARAM_SETUP -eq 1 ]; then
run_setup_script "boot parameter" /usr/lib/scylla/scylla_bootparam_setup --ami
fi
fi
if [ $INTERACTIVE -eq 1 ]; then
interactive_ask_service "Do you want to setup NTP?" "Answer yes to enable time synchronization at boot time. This keeps time right on the node. Answer no to do nothing." "yes" &&:
NTP_SETUP=$?
fi
if [ $NTP_SETUP -eq 1 ]; then
if [ "$NTP_DOMAIN" != "" ]; then
run_setup_script "NTP" /usr/lib/scylla/scylla_ntp_setup --subdomain $NTP_DOMAIN
else
run_setup_script "NTP" /usr/lib/scylla/scylla_ntp_setup
fi
fi
if [ $INTERACTIVE -eq 1 ]; then
interactive_ask_service "Do you want to setup RAID and XFS?" "It is recommended to use RAID0 and XFS for Scylla data. If you select yes, you will be prompt to choose which unmounted disks to use for Scylla data. Selected disks will be formatted in the process." "yes" &&:
if [ $? -eq 1 ]; then
interactive_ask_service "Are you sure you want to setup RAID and XFS?" "If you choose Yes, selected drive will be reformated, erasing existing data in the process." "yes" &&:
RAID_SETUP=$?
else
RAID_SETUP=0
fi
if [ $RAID_SETUP -eq 1 ]; then
DEVS=`get_unused_disks`
if [ "$DEVS" = "" ]; then
echo "No free disks detected, abort RAID/XFS setup."
echo
RAID_SETUP=0
else
echo "Please select unmounted disks from the following list: $DEVS"
fi
while [ "$DEVS" != "" ]; do
echo "type 'cancel' to cancel RAID/XFS setup."
echo "type 'done' to finish selection. Selected: $DISKS"
echo -n "> "
read dsk
if [ "$dsk" = "cancel" ]; then
RAID_SETUP=0
break
fi
if [ "$dsk" = "done" ]; then
if [ "$DISKS" = "" ]; then
continue
fi
break
fi
if [ "$dsk" = "" ]; then
continue
fi
if [ -b $dsk ]; then
if [ "$DISKS" = "" ]; then
DISKS=$dsk
else
DISKS="$DISKS,$dsk"
fi
else
echo "$dsk not found"
fi
done
fi
fi
if [ $RAID_SETUP -eq 1 ]; then
run_setup_script "RAID" /usr/lib/scylla/scylla_raid_setup --disks $DISKS --update-fstab
fi
if [ $INTERACTIVE -eq 1 ]; then
interactive_ask_service "Do you want to setup coredump?" "Answer yes to enable core dumps; this allows to do post-mortem analysis of Scylla state after a crash. Answer no to do nothing." "yes" &&:
COREDUMP_SETUP=$?
fi
if [ $COREDUMP_SETUP -eq 1 ]; then
if [ "$DISKS" != "" ]; then
run_setup_script "coredump" /usr/lib/scylla/scylla_coredump_setup --dump-to-raiddir
else
run_setup_script "coredump" /usr/lib/scylla/scylla_coredump_setup
fi
fi
if [ $INTERACTIVE -eq 1 ]; then
interactive_ask_service "Do you want to setup sysconfig?" "Answer yes to do system wide configuration customized for Scylla. Answer no to do nothing." "yes" &&:
SYSCONFIG_SETUP=$?
if [ $SYSCONFIG_SETUP -eq 1 ]; then
NICS=$(for i in /sys/class/net/*;do nic=`basename $i`; if [ "$nic" != "lo" ]; then echo $nic; fi; done)
NR_NICS=`echo $NICS|wc -w`
if [ $NR_NICS -eq 0 ]; then
echo "NIC not found."
exit 1
elif [ $NR_NICS -eq 1 ]; then
NIC=$NICS
else
echo "Please select NIC from following list: "
while true; do
echo $NICS
echo -n "> "
read NIC
if [ -e /sys/class/net/$NIC ]; then
break
fi
done
fi
interactive_ask_service "Do you want to optimize NIC queue settings?" "Answer yes to enable network card optimization and improve performance. Answer no to skip this optimization." "yes" &&:
SET_NIC=$?
fi
fi
if [ $SYSCONFIG_SETUP -eq 1 ]; then
SETUP_ARGS=
if [ $SET_NIC -eq 1 ]; then
SETUP_ARGS="--setup-nic"
fi
run_setup_script "NIC queue" /usr/lib/scylla/scylla_sysconfig_setup --nic $NIC $SETUP_ARGS
fi
if [ $INTERACTIVE -eq 1 ]; then
interactive_ask_service "Do you want to setup IO configuration?" "Answer yes to let iotune study what are your disks IO profile and adapt Scylla to it. Answer no to skip this action." "yes" &&:
IO_SETUP=$?
fi
if [ $IO_SETUP -eq 1 ]; then
run_setup_script "IO configuration" /usr/lib/scylla/scylla_io_setup
fi
if [ $INTERACTIVE -eq 1 ]; then
interactive_ask_service "Do you want to install node exporter and export Prometheus data from the node?" "Answer yes to install it; answer no to skip this installation." "yes" &&:
NODE_EXPORTER=$?
fi
if [ $NODE_EXPORTER -eq 1 ]; then
run_setup_script "node exporter" /usr/lib/scylla/node_exporter_install
fi
if [ $DEV_MODE -eq 1 ]; then
/usr/lib/scylla/scylla_dev_mode_setup --developer-mode 1
fi
if [ $INTERACTIVE -eq 1 ]; then
interactive_ask_service "Do you want to setup CPU scalling governor?" "Answer yes to set CPU scalling governor to performance at boot time. Answer no to do nothing." "yes" &&:
CPUSCALING_SETUP=$?
fi
if [ $CPUSCALING_SETUP -eq 1 ]; then
run_setup_script "CPU Scalling" /usr/lib/scylla/scylla_cpuscaling_setup
fi
if is_redhat_variant; then
if [ $INTERACTIVE -eq 1 ]; then
interactive_ask_service "Do you want to enable fstrim service?" "Answer yes to run fstrim on your SSD. Answer no to do nothing." "yes" &&:
FSTRIM_SETUP=$?
fi
if [ $FSTRIM_SETUP -eq 1 ]; then
run_setup_script "fstrim" /usr/lib/scylla/scylla_fstrim_setup
fi
fi
echo "ScyllaDB setup finished."
if [ $SELINUX_REBOOT_REQUIRED -eq 1 ]; then
echo "Please restart machine before using ScyllaDB, since you have disabled"
echo " SELinux."
fi