aboutsummaryrefslogtreecommitdiffstats
path: root/templates
diff options
context:
space:
mode:
authorEmilien Macchi <emilien.macchi@enovance.com>2015-02-02 13:18:35 -0500
committerEmilien Macchi <emilien.macchi@enovance.com>2015-02-02 15:15:57 -0500
commit6509561ab3ac08c26372d892e5937f85672bf14f (patch)
treeea4f3105ed30661a7ee22dc34e3612c5ad834203 /templates
parentbbf683b11659c6a0ed4ceddce7d24f2e9d707846 (diff)
First implementation of tripleo::database::mysql
Diffstat (limited to 'templates')
-rw-r--r--templates/database/clustercheck.erb56
-rw-r--r--templates/database/debian.cnf.erb13
-rwxr-xr-xtemplates/database/etc_initd_mysql_Debian202
-rwxr-xr-xtemplates/database/etc_initd_mysql_RedHat48
-rw-r--r--templates/database/mysql.conf.erb69
-rw-r--r--templates/database/mysqlchk.erb23
6 files changed, 411 insertions, 0 deletions
diff --git a/templates/database/clustercheck.erb b/templates/database/clustercheck.erb
new file mode 100644
index 0000000..cc3231b
--- /dev/null
+++ b/templates/database/clustercheck.erb
@@ -0,0 +1,56 @@
+#!/bin/bash
+# Managed by puppet
+#
+# Script to make a proxy (ie HAProxy) capable of monitoring Galera cluster
+#
+# Author: Olaf van Zandwijk <olaf.vanzandwijk@nedap.com>
+# Mehdi Abaakouk <mehdi.abaakouk@enovance.com>
+#
+# Documentation and download: https://github.com/olafz/percona-clustercheck
+#
+# Based on the original script from Unai Rodriguez
+#
+MYSQL_USERNAME='<%= @galera_clustercheck_dbuser %>'
+MYSQL_PASSWORD='<%= @galera_clustercheck_dbpassword %>'
+
+TIMEOUT=10
+ERR_FILE="/dev/null"
+AVAILABLE_WHEN_DONOR=0
+
+MYSQL_CMDLINE="mysql -nNE --connect-timeout=$TIMEOUT --user=${MYSQL_USERNAME} --password=${MYSQL_PASSWORD} "
+
+mysql_get_status(){
+ ( $MYSQL_CMDLINE -e "SHOW STATUS LIKE '$1';" | tail -1 ) 2>>${ERR_FILE}
+}
+mysql_get_var(){
+ ( $MYSQL_CMDLINE -e "SHOW GLOBAL VARIABLES LIKE '$1';" | tail -1 ) 2>>${ERR_FILE}
+}
+
+http_response(){
+ status=$1
+ shift
+ msg="$@"
+ if [ "$status" == 200 ]; then
+ /bin/echo -en "HTTP/1.1 200 OK\r\n"
+ else
+ /bin/echo -en "HTTP/1.1 503 Service Unavailable\r\n"
+ fi
+ /bin/echo -en "Content-Type: text/plain\r\n"
+ /bin/echo -en "\r\n"
+ /bin/echo -en "$msg\r\n"
+ /bin/echo -en "\r\n"
+}
+
+
+WSREP_LOCAL_STATE=$(mysql_get_status wsrep_local_state)
+WSREP_READY=$(mysql_get_status wsrep_ready)
+WSREP_CONNECTED=$(mysql_get_status wsrep_connected)
+READY_ONLY=$(mysql_get_var read_only)
+
+case ${AVAILABLE_WHEN_DONOR}-${WSREP_LOCAL_STATE}-${WSREP_READY}-${WSREP_CONNECTED}-${READY_ONLY} in
+ 1-2-ON-ON-OFF|0-4-ON-ON-OFF) http_response 200 "Mariadb Cluster Node is synced, ready and connected." ;;
+ *-*-OFF-*-*) http_response 503 "Mariadb Cluster Node is not ready." ;;
+ *-*-*-OFF-*) http_response 503 "Mariadb Cluster Node is not connected" ;;
+ *-*-*-*-ON) http_response 503 "Mariadb Cluster Node is readonly" ;;
+ *) http_response 503 "Mariadb Cluster Node is not synced" ;;
+esac
diff --git a/templates/database/debian.cnf.erb b/templates/database/debian.cnf.erb
new file mode 100644
index 0000000..ddcc442
--- /dev/null
+++ b/templates/database/debian.cnf.erb
@@ -0,0 +1,13 @@
+# Managed by Puppet
+#
+[client]
+host = localhost
+user = debian-sys-maint
+password = <%= @mysql_sys_maint_password %>
+socket = /var/run/mysqld/mysqld.sock
+[mysql_upgrade]
+host = localhost
+user = debian-sys-maint
+password = <%= @mysql_sys_maint_password %>
+socket = /var/run/mysqld/mysqld.sock
+basedir = /usr
diff --git a/templates/database/etc_initd_mysql_Debian b/templates/database/etc_initd_mysql_Debian
new file mode 100755
index 0000000..292251f
--- /dev/null
+++ b/templates/database/etc_initd_mysql_Debian
@@ -0,0 +1,202 @@
+#!/bin/bash
+#
+### BEGIN INIT INFO
+# Provides: mysql-bootstrap
+# Required-Start: $remote_fs $syslog
+# Required-Stop: $remote_fs $syslog
+# Should-Start: $network $named $time
+# Should-Stop: $network $named $time
+# Default-Start: 2 3 4 5
+# Default-Stop: 0 1 6
+# Short-Description: Start and stop the mysql database server daemon
+# Description: Controls the main MariaDB database server daemon "mysqld"
+# and its wrapper script "mysqld_safe".
+### END INIT INFO
+#
+# Managed by Puppet
+#
+MYSQLD_STARTUP_TIMEOUT=${MYSQLD_STARTUP_TIMEOUT:-60}
+[ -e /etc/mysql/my.cnf ] && \
+ MYSQLD_DATA_DIR=$(awk -F= '/^datadir/{print $2}' /etc/mysql/my.cnf | sed -e 's/^ *//')
+MYSQLD_DATA_DIR=${MYSQLD_DATA_DIR:-<%= scope.lookupvar('::mysql::datadir') %>}
+set -e
+set -u
+${DEBIAN_SCRIPT_DEBUG:+ set -v -x}
+
+test -x /usr/sbin/mysqld || exit 0
+
+. /lib/lsb/init-functions
+
+SELF=$(cd $(dirname $0); pwd -P)/$(basename $0)
+CONF=/etc/mysql/my.cnf
+MYADMIN="/usr/bin/mysqladmin --defaults-file=/etc/mysql/debian.cnf"
+
+# priority can be overriden and "-s" adds output to stderr
+ERR_LOGGER="logger -p daemon.err -t /etc/init.d/mysql -i"
+
+# Safeguard (relative paths, core dumps..)
+cd /
+umask 077
+
+# mysqladmin likes to read /root/.my.cnf. This is usually not what I want
+# as many admins e.g. only store a password without a username there and
+# so break my scripts.
+export HOME=/etc/mysql/
+
+## Fetch a particular option from mysql's invocation.
+#
+# Usage: void mysqld_get_param option
+mysqld_get_param() {
+ /usr/sbin/mysqld --print-defaults \
+ | tr " " "\n" \
+ | grep -- "--$1" \
+ | tail -n 1 \
+ | cut -d= -f2
+}
+
+## Do some sanity checks before even trying to start mysqld.
+sanity_checks() {
+ # check for config file
+ if [ ! -r /etc/mysql/my.cnf ]; then
+ log_warning_msg "$0: WARNING: /etc/mysql/my.cnf cannot be read. See README.Debian.gz"
+ echo "WARNING: /etc/mysql/my.cnf cannot be read. See README.Debian.gz" | $ERR_LOGGER
+ fi
+
+ # check for diskspace shortage
+ datadir=`mysqld_get_param datadir`
+ if LC_ALL=C BLOCKSIZE= df --portability $datadir/. | tail -n 1 | awk '{ exit ($4>4096) }'; then
+ log_failure_msg "$0: ERROR: The partition with $datadir is too full!"
+ echo "ERROR: The partition with $datadir is too full!" | $ERR_LOGGER
+ exit 1
+ fi
+}
+
+## Checks if there is a server running and if so if it is accessible.
+#
+# check_alive insists on a pingable server
+# check_dead also fails if there is a lost mysqld in the process list
+#
+# Usage: boolean mysqld_status [check_alive|check_dead] [warn|nowarn]
+mysqld_status () {
+ ping_output=`$MYADMIN ping 2>&1`; ping_alive=$(( ! $? ))
+
+ ps_alive=0
+ pidfile=`mysqld_get_param pid-file`
+ if [ -f "$pidfile" ] && ps `cat $pidfile` >/dev/null 2>&1; then ps_alive=1; fi
+
+ if [ "$1" = "check_alive" -a $ping_alive = 1 ] ||
+ [ "$1" = "check_dead" -a $ping_alive = 0 -a $ps_alive = 0 ]; then
+ return 0 # EXIT_SUCCESS
+ else
+ if [ "$2" = "warn" ]; then
+ echo -e "$ps_alive processes alive and '$MYADMIN ping' resulted in\n$ping_output\n" | $ERR_LOGGER -p daemon.debug
+ fi
+ return 1 # EXIT_FAILURE
+ fi
+}
+
+#
+# main()
+#
+
+case "${1:-''}" in
+ 'start')
+ sanity_checks;
+ # Start daemon
+ log_daemon_msg "Starting MariaDB database server" "mysqld"
+ if mysqld_status check_alive nowarn; then
+ log_progress_msg "already running"
+ log_end_msg 0
+ else
+ # Could be removed during boot
+ test -e /var/run/mysqld || install -m 755 -o mysql -g root -d /var/run/mysqld
+
+ # Start MariaDB! in a Galera setup we want to use
+ # new-cluster only when the galera cluster hasn't been
+ # bootstraped
+ if [ -e ${MYSQLD_DATA_DIR}/grastate.dat ]; then
+ # normal boot
+ /usr/bin/mysqld_safe "${@:2}" > /dev/null 2>&1 &
+ else
+ # bootstrap boot
+ log_progress_msg " (Galera bootstrap) "
+ /usr/bin/mysqld_safe "${@:2}" --wsrep-new-cluster > /dev/null 2>&1 &
+ fi
+
+ # 6s was reported in #352070 to be too few when using ndbcluster
+ for i in $(seq 1 "${MYSQLD_STARTUP_TIMEOUT:-30}"); do
+ sleep 1
+ if mysqld_status check_alive nowarn ; then break; fi
+ log_progress_msg "."
+ done
+ if mysqld_status check_alive warn; then
+ log_end_msg 0
+ # Now start mysqlcheck or whatever the admin wants.
+ output=$(/etc/mysql/debian-start)
+ [ -n "$output" ] && log_action_msg "$output"
+ else
+ log_end_msg 1
+ log_failure_msg "Please take a look at the syslog"
+ fi
+ fi
+ ;;
+
+ 'stop')
+ # * As a passwordless mysqladmin (e.g. via ~/.my.cnf) must be possible
+ # at least for cron, we can rely on it here, too. (although we have
+ # to specify it explicit as e.g. sudo environments points to the normal
+ # users home and not /root)
+ log_daemon_msg "Stopping MariaDB database server" "mysqld"
+ if ! mysqld_status check_dead nowarn; then
+ set +e
+ shutdown_out=`$MYADMIN shutdown 2>&1`; r=$?
+ set -e
+ if [ "$r" -ne 0 ]; then
+ log_end_msg 1
+ [ "$VERBOSE" != "no" ] && log_failure_msg "Error: $shutdown_out"
+ log_daemon_msg "Killing MariaDB database server by signal" "mysqld"
+ killall -15 mysqld
+ server_down=
+ for i in `seq 1 600`; do
+ sleep 1
+ if mysqld_status check_dead nowarn; then server_down=1; break; fi
+ done
+ if test -z "$server_down"; then killall -9 mysqld; fi
+ fi
+ fi
+
+ if ! mysqld_status check_dead warn; then
+ log_end_msg 1
+ log_failure_msg "Please stop MariaDB manually and read /usr/share/doc/mariadb-server-5.5/README.Debian.gz!"
+ exit -1
+ else
+ log_end_msg 0
+ fi
+ ;;
+
+ 'restart')
+ set +e; $SELF stop; set -e
+ $SELF start
+ ;;
+
+ 'reload'|'force-reload')
+ log_daemon_msg "Reloading MariaDB database server" "mysqld"
+ $MYADMIN reload
+ log_end_msg 0
+ ;;
+
+ 'status')
+ if mysqld_status check_alive nowarn; then
+ log_action_msg "$($MYADMIN version)"
+ else
+ log_action_msg "MariaDB is stopped."
+ exit 3
+ fi
+ ;;
+
+ *)
+ echo "Usage: $SELF start|stop|restart|reload|force-reload|status"
+ exit 1
+ ;;
+esac
+
diff --git a/templates/database/etc_initd_mysql_RedHat b/templates/database/etc_initd_mysql_RedHat
new file mode 100755
index 0000000..5efdde2
--- /dev/null
+++ b/templates/database/etc_initd_mysql_RedHat
@@ -0,0 +1,48 @@
+# It's not recommended to modify this file in-place, because it will be
+# overwritten during package upgrades. If you want to customize, the
+# best way is to create a file "/etc/systemd/system/mariadb.service",
+# containing
+# .include /lib/systemd/system/mariadb.service
+# ...make your changes here...
+# or create a file "/etc/systemd/system/mariadb.service.d/foo.conf",
+# which doesn't need to include ".include" call and which will be parsed
+# after the file mariadb.service itself is parsed.
+#
+# For more info about custom unit files, see systemd.unit(5) or
+# http://fedoraproject.org/wiki/Systemd#How_do_I_customize_a_unit_file.2F_add_a_custom_unit_file.3F
+# For example, if you want to increase mysql's open-files-limit to 10000,
+# you need to increase systemd's LimitNOFILE setting, so create a file named
+# "/etc/systemd/system/mariadb.service.d/limits.conf" containing:
+# [Service]
+# LimitNOFILE=10000
+# Note: /usr/lib/... is recommended in the .include line though /lib/...
+# still works.
+# Don't forget to reload systemd daemon after you change unit configuration:
+# root> systemctl --system daemon-reload
+#
+# Managed by Puppet
+#
+
+[Unit]
+Description=MariaDB database server
+After=syslog.target
+After=network.target
+
+[Service]
+Type=simple
+User=mysql
+Group=mysql
+ExecStartPre=/usr/libexec/mariadb-prepare-db-dir %n
+# Note: we set --basedir to prevent probes that might trigger SELinux alarms,
+# per bug #547485
+ExecStart=/usr/bin/mysqld_safe --wsrep-new-cluster --basedir=/usr
+ExecStartPost=/usr/libexec/mariadb-wait-ready $MAINPID
+
+# Give a reasonable amount of time for the server to start up/shut down
+TimeoutSec=60
+
+# Place temp files in a secure directory, not /tmp
+PrivateTmp=true
+
+[Install]
+WantedBy=multi-user.target
diff --git a/templates/database/mysql.conf.erb b/templates/database/mysql.conf.erb
new file mode 100644
index 0000000..a997a7b
--- /dev/null
+++ b/templates/database/mysql.conf.erb
@@ -0,0 +1,69 @@
+# MANAGED BY PUPPET
+#
+[mysqld]
+bind-address = <%= @bind_address %>
+default_storage_engine = innodb
+collation_server = utf8_general_ci
+init_connect = 'SET NAMES utf8'
+character_set_server = utf8
+max_connections = 1000
+skip_name_resolve = 1
+connect_timeout = 5
+wait_timeout = 600
+max_allowed_packet = 64M
+thread_cache_size = 128
+sort_buffer_size = 4M
+bulk_insert_buffer_size = 16M
+tmp_table_size = 512M
+max_heap_table_size = 128M
+query_cache_type = 0
+myisam_recover = BACKUP
+key_buffer_size = 16M
+open_files_limit = 65535
+table_open_cache = 1024
+table_definition_cache = 500
+myisam_sort_buffer_size = 512M
+concurrent_insert = 2
+read_buffer_size = 2M
+read_rnd_buffer_size = 1M
+slow_query_log = 1
+slow_query_log_file = /var/log/mysql/slow.log
+log_error = /var/log/mysql/error.log
+long_query_time = 1
+log_slow_verbosity = query_plan
+innodb_buffer_pool_size = 512M
+innodb_flush_log_at_trx_commit = 1
+innodb_lock_wait_timeout = 50
+innodb_thread_concurrency = 48
+innodb_file_per_table = 1
+innodb_open_files = 65535
+innodb_io_capacity = 1000
+innodb_file_format = Barracuda
+innodb_file_format_max = Barracuda
+innodb_max_dirty_pages_pct = 50
+binlog_format = ROW
+innodb_autoinc_lock_mode = 2
+innodb_locks_unsafe_for_binlog = 1
+wsrep_provider = "<%= @wsrep_provider %>"
+wsrep_cluster_name = "galera_cluster"
+wsrep_cluster_address = "gcomm://<%= @gcomm_definition %>"
+wsrep_sst_auth = root:<%= @mysql_root_password %>
+wsrep_drupal_282555_workaround = 0
+wsrep_sst_method = rsync
+wsrep_node_address = "<%= @bind_address %>"
+wsrep_node_incoming_address = "<%= @bind_address %>"
+# This is the minimal value (proc*2)
+wsrep_slave_threads = "<%= @processorcount.to_i * 2 %>"
+
+# Thoses TWEAK assume that the galera cluster is used in master/slave mode
+wsrep_provider_options = "gcache.size=<%= @galera_gcache %>;gcs.fc_master_slave=1;gcs.fc_limit=256;gcs.fc_factor=0.9"
+
+# this value here are used by /usr/bin/innobackupex
+# and wsrep_sst_xtrabackup take only one configuration file and use the last one
+# (/etc/mysql/my.cnf is not used)
+datadir = /var/lib/mysql
+tmpdir = /tmp/
+innodb_flush_method = O_DIRECT
+innodb_log_buffer_size = 32M
+innodb_log_file_size = 256M
+innodb_log_files_in_group = 2
diff --git a/templates/database/mysqlchk.erb b/templates/database/mysqlchk.erb
new file mode 100644
index 0000000..f9fea1d
--- /dev/null
+++ b/templates/database/mysqlchk.erb
@@ -0,0 +1,23 @@
+# Managed by puppet
+#
+# default: on
+# description: mysqlchk
+service mysqlchk
+{
+# this is a config for xinetd, place it in /etc/xinetd.d/
+ disable = no
+ flags = REUSE
+ socket_type = stream
+ port = 9200
+ wait = no
+ user = nobody
+ server = /usr/bin/clustercheck
+ log_on_failure += USERID
+ log_on_success =
+ #FIXME(sbadia) Security: Restrict this parameter to HAProxy pool.
+ only_from = 0.0.0.0/0
+ bind = <%= @galera_clustercheck_ipaddress %>
+ # recommended to put the IPs that need
+ # to connect exclusively (security purposes)
+ per_source = UNLIMITED
+}