Updated MariaDB to the new release version (10.0)

The change updates mariadb to use version 10.
* The percona-xtrabackup repository was added
* the custom mysql init script was removed in favor of allowing the
  packages to resolve its own init script
* the install process was modified such that its faster while
  preserving the variable functionality already implemented.
* The Galera cluster.cnf was modified to allow the user to define
  the wsrep method and a section for xtrabackup was added.
* The galera_max_connections option will now appropriately set the
  max connection value such that any value used will be picked up
  by the running process.

These changes enable us to leverage all of the new features and
stability found within the updated version of MariaDB+Galera.

DocImpact
UpgradeImpact
Implements: blueprint upgrade-mariadb-v10

Change-Id: I2d773e569667e07106862507b881e3f0aca85591
This commit is contained in:
Kevin Carter
2015-09-25 12:14:59 -05:00
parent 4745e709f6
commit e50ce375ca
15 changed files with 226 additions and 277 deletions

View File

@@ -13,60 +13,10 @@
# See the License for the specific language governing permissions and
# limitations under the License.
- name: Check galera cluster status
- name: Galera container config
hosts: galera_all
max_fail_percentage: 0
tasks:
- name: Check if mysql is running
command: /usr/bin/mysqladmin --defaults-file=/etc/mysql/debian.cnf ping
ignore_errors: true
register: mysql_running
- fail:
msg: "The cluster may be broken, mysql is not running but appears to be installed. Fix it before re-running the playbook or override with 'openstack-ansible -e galera_ignore_cluster_state=true galera-install.yml'."
when:
- not galera_ignore_cluster_state | bool
- mysql_running.rc == 1
- mysql_running.stderr | search("Check that mysqld is running and that the socket")
- name: Gather mysql facts
mysql_status_facts:
ignore_errors: true
- fail:
msg: "The cluster may be broken, mysql is running but unable to gather mysql facts. Fix it before re-running the playbook or override with 'openstack-ansible -e galera_ignore_cluster_state=true galera-install.yml'."
when:
- not galera_ignore_cluster_state | bool
- mysql_running.rc == 0
- "{{ 'mysql_status' not in hostvars[inventory_hostname] }}"
- fail:
msg: "wsrep_incoming_addresses does not match across the cluster. Please fix before re-running the playbooks or override with 'openstack-ansible -e galera_ignore_cluster_state=true galera-install.yml'."
with_items: play_hosts
when:
- not galera_ignore_cluster_state | bool
- mysql_running.rc == 0
- hostvars[item]['mysql_running']['rc'] == 0
- hostvars[inventory_hostname]['mysql_status']['wsrep_incoming_addresses'] != hostvars[item]['mysql_status']['wsrep_incoming_addresses']
- set_fact:
galera_existing_cluster: false
- set_fact:
galera_existing_cluster: true
with_items: play_hosts
when: hostvars[item].mysql_running.rc == 0
vars:
galera_ignore_cluster_state: false
tags:
- discover-galera-cluster-state
- name: Install galera server
hosts: galera_all
serial: 1
max_fail_percentage: 20
user: root
pre_tasks:
- name: Use the lxc-openstack aa profile
lxc_container:
name: "{{ container_name }}"
@@ -96,6 +46,16 @@
delegate_to: "{{ physical_host }}"
tags:
- galera-ssh-wait
vars:
is_metal: "{{ properties.is_metal|default(false) }}"
tags:
- galera-lxc-container-setup
- name: Install galera server
hosts: galera_all
serial: 1
max_fail_percentage: 20
user: root
roles:
- { role: "galera_server", tags: [ "galera-server" ] }
- role: "rsyslog_client"
@@ -112,6 +72,7 @@
- "system-crontab-coordination"
vars:
galera_wsrep_node_name: "{{ container_name }}"
galera_lb_address: "{{ internal_lb_vip_address }}"
ansible_hostname: "{{ container_name }}"
ansible_ssh_host: "{{ container_address }}"
is_metal: "{{ properties.is_metal|default(false) }}"
tags:
- galera-install-cluster

View File

@@ -23,17 +23,26 @@ galera_client_gpg_keys:
keyserver: 'hkp://keyserver.ubuntu.com:80'
fallback_keyserver: 'hkp://p80.pool.sks-keyservers.net:80'
hash_id: '0xcbcb082a1bb943db'
- key_name: 'percona-xtrabackup'
keyserver: 'hkp://keyserver.ubuntu.com:80'
fallback_keyserver: 'hkp://p80.pool.sks-keyservers.net:80'
hash_id: '0x1c4cbdcdcd2efd2a'
# Repositories
galera_client_apt_repo_url: "https://mirror.rackspace.com/mariadb/repo/5.5/ubuntu"
galera_client_apt_repo_url: "https://mirror.rackspace.com/mariadb/repo/10.0/ubuntu"
galera_client_apt_repo:
repo: "deb {{ galera_client_apt_repo_url }} {{ ansible_distribution_release }} main"
state: "present"
galera_client_apt_percona_xtrabackup_url: "https://repo.percona.com/apt"
galera_client_apt_percona_xtrabackup_repo:
repo: "deb {{ galera_client_apt_percona_xtrabackup_url }} {{ ansible_distribution_release }} main"
state: "present"
galera_client_apt_packages:
- libmariadbclient-dev
- mariadb-client
- xtrabackup
- percona-xtrabackup
galera_client_pip_packages:
- MySQL-python

View File

@@ -52,11 +52,14 @@
- name: Add galera repo(s)
apt_repository:
repo: "{{ galera_client_apt_repo.repo }}"
state: "{{ galera_client_apt_repo.state }}"
repo: "{{ item.repo }}"
state: "{{ item.state }}"
register: add_repos
until: add_repos|success
retries: 5
delay: 2
with_items:
- "{{ galera_client_apt_repo }}"
- "{{ galera_client_apt_percona_xtrabackup_repo }}"
tags:
- galera-client-repos

View File

@@ -13,12 +13,15 @@
# See the License for the specific language governing permissions and
# limitations under the License.
# Defines that the role will be deployed on a host machine
is_metal: true
galera_server_bootstrap_node: "{{ groups['galera_all'][0] }}"
galera_ignore_cluster_state: false
galera_lb_address: 127.0.0.1
galera_cluster_name: openstack_galera_cluster
galera_existing_cluster: true
galera_running_and_bootstrapped: false
galera_monitoring_user: monitoring
galera_monitoring_user_password: ""
@@ -46,11 +49,14 @@ galera_wsrep_node_incoming_address: "{{ galera_wsrep_address }}"
galera_wsrep_slave_threads: "{{ ansible_processor_vcpus }}"
galera_wsrep_retry_autocommit: 3
galera_wsrep_debug: 0
galera_wsrep_sst_method: xtrabackup-v2
galera_wsrep_provider_options:
- { option: "gcache.size", value: "{{ galera_gcache_size }}" }
galera_wsrep_sst_auth_user: "root"
galera_wsrep_sst_auth_password: "{{ galera_root_password }}"
## sst method
galera_sst_method: xtrabackup-v2
# xtrabackup parallel/compression/sync threads
galera_xtrabackup_threads: 4
# Galera GPG Keys
galera_gpg_keys:
@@ -58,6 +64,10 @@ galera_gpg_keys:
keyserver: 'hkp://keyserver.ubuntu.com:80'
fallback_keyserver: 'hkp://p80.pool.sks-keyservers.net:80'
hash_id: '0xcbcb082a1bb943db'
- key_name: 'percona-xtrabackup'
keyserver: 'hkp://keyserver.ubuntu.com:80'
fallback_keyserver: 'hkp://p80.pool.sks-keyservers.net:80'
hash_id: '0x1c4cbdcdcd2efd2a'
# Repositories
galera_apt_repo_url: "https://mirror.rackspace.com/mariadb/repo/5.5/ubuntu"
@@ -65,6 +75,11 @@ galera_apt_repo:
repo: "deb {{ galera_apt_repo_url }} {{ ansible_distribution_release }} main"
state: "present"
galera_apt_percona_xtrabackup_url: "https://repo.percona.com/apt"
galera_apt_percona_xtrabackup_repo:
repo: "deb {{ galera_apt_percona_xtrabackup_url }} {{ ansible_distribution_release }} main"
state: "present"
galera_pip_packages:
- MySQL-python
- python-memcached
@@ -78,7 +93,7 @@ galera_pre_apt_packages:
# The package name for mariaDB is set as a variable
# so that it can be used in debconf later in the
# "galera_common" role.
galera_mariadb_server_package: "mariadb-galera-server-5.5"
galera_mariadb_server_package: "mariadb-galera-server-10.0"
# NB This is specifically galera_packages as these packages only get installed
# during the galera play - this is because of the preseed task and the service
@@ -87,8 +102,9 @@ galera_apt_packages:
- mariadb-client
- "{{ galera_mariadb_server_package }}"
- galera-3
- qpress
- rsync
- xtrabackup
- percona-xtrabackup
- socat
galera_debconf_items:
@@ -109,3 +125,9 @@ galera_unindexed_query_logging: 0
galera_my_cnf_overrides: {}
galera_cluster_cnf_overrides: {}
galera_debian_cnf_overrides: {}
# Set the max connections value for galera. Set this value to override the
# computed value which is (100 x vCPUs). If computed, the lowest value throughout
# the cluster will be used which is something to note if deploying galera on different
# hardware.
# galera_max_connections: 500

View File

@@ -1,190 +0,0 @@
#!/usr/bin/env bash
#
### BEGIN INIT INFO
# Provides: mysql
# 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
#
set -e
set -u
${DEBIAN_SCRIPT_DEBUG:+ set -v -x}
test -x /usr/sbin/mysqld || exit 0
. /lib/lsb/init-functions
# Load user defaults
. /etc/default/mysql
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!
/usr/bin/mysqld_safe "${@:2}" > /dev/null 2>&1 &
# 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

View File

@@ -17,4 +17,9 @@
service:
name: mysql
state: restarted
args: "{{ (not galera_existing_cluster | bool and inventory_hostname == groups['galera_all'][0]) | ternary('--wsrep-new-cluster', '') }}"
args: "{{ (not galera_existing_cluster | bool and inventory_hostname == galera_server_bootstrap_node) | ternary('--wsrep-new-cluster', '') }}"
when: not galera_running_and_bootstrapped | bool
register: galera_restart
until: galera_restart|success
retries: 3
delay: 2

View File

@@ -0,0 +1,58 @@
---
# Copyright 2015, Rackspace US, Inc.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
- name: Check if mysql is running
command: /usr/bin/mysqladmin --defaults-file=/etc/mysql/debian.cnf ping
ignore_errors: true
changed_when: mysql_running.rc != 0
register: mysql_running
notify: Restart mysql
tags:
- galera-cluster-state-check
- galera-bootstrap
- name: Start cluster with wsrep
service:
name: mysql
state: restarted
args: "--wsrep-new-cluster"
when:
- inventory_hostname == galera_server_bootstrap_node
- mysql_running.rc != 0
tags:
- galera-bootstrap
- name: Wait for operational state
command: mysql --silent --skip-column-names -e 'SHOW STATUS LIKE "wsrep_evs_state"'
register: galera_check_wait
until: galera_check_wait|success
failed_when: not galera_check_wait.stdout | search("OPERATIONAL")
retries: 6
delay: 5
when:
- inventory_hostname == galera_server_bootstrap_node
- mysql_running.rc != 0
tags:
- galera-operational
- galera-bootstrap
- set_fact:
galera_running_and_bootstrapped: true
when:
- inventory_hostname == galera_server_bootstrap_node
- mysql_running.rc != 0
tags:
- galera-operational
- galera-bootstrap

View File

@@ -0,0 +1,75 @@
---
# Copyright 2015, Rackspace US, Inc.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
- name: Check if mysql is running
command: /usr/bin/mysqladmin --defaults-file=/etc/mysql/debian.cnf ping
ignore_errors: true
changed_when: mysql_running.rc != 0
register: mysql_running
notify: Restart mysql
tags:
- galera-cluster-state-check
- name: Check for cluster state failure
fail:
msg: |
The cluster may be broken, mysql is not running but appears to be
installed. Fix it before re-running the playbook or override with
'openstack-ansible -e galera_ignore_cluster_state=true galera-install.yml'.
when:
- not galera_ignore_cluster_state | bool
- mysql_running.rc == 1
- mysql_running.stderr | search("Check that mysqld is running and that the socket")
tags:
- galera-cluster-state-check
- name: Gather mysql facts
mysql_status_facts:
ignore_errors: true
tags:
- galera-cluster-state-check
- name: Check for cluster state failure
fail:
msg: |
The cluster may be broken, mysql is running but unable to gather mysql facts.
Fix it before re-running the playbook or override with
'openstack-ansible -e galera_ignore_cluster_state=true galera-install.yml'.
when:
- not galera_ignore_cluster_state | bool
- mysql_running.rc == 0
- mysql_status is not defined
tags:
- galera-cluster-state-check
- name: Check for cluster state failure
fail:
msg: |
wsrep_incoming_addresses does not match across the cluster. Please fix before
re-running the playbooks or override with
'openstack-ansible -e galera_ignore_cluster_state=true galera-install.yml'.
with_items: play_hosts
when:
- not galera_ignore_cluster_state | bool
- mysql_running.rc == 0
- mysql_status['wsrep_incoming_addresses'] != hostvars[item]['mysql_status']['wsrep_incoming_addresses']
tags:
- galera-cluster-state-check
- set_fact:
galera_existing_cluster: true
when: mysql_running.rc == 0
tags:
- galera-cluster-state-check

View File

@@ -58,10 +58,3 @@
with_items: galera_pip_packages
tags:
- galera-pip-packages
- name: Check if mysql is running
command: /usr/bin/mysqladmin --defaults-file=/etc/mysql/debian.cnf ping
ignore_errors: true
changed_when: mysql_started.rc != 0
register: mysql_started
notify: Restart mysql

View File

@@ -22,7 +22,8 @@
mode: "{{ item.mode|default('0755') }}"
recurse: "{{ item.recurse|default('false') }}"
with_items:
- { path: "/var/log/mysql/", owner: "mysql", recurse: "true" }
- { path: "/var/lib/mysql", owner: "mysql", mode: "2755" }
- { path: "/var/log/mysql", owner: "mysql", mode: "2755" }
- { path: "/var/log/mysql_logs/", owner: "mysql", group: "syslog", mode: "2755" }
- { path: "/etc/mysql/conf.d" }
tags:
@@ -50,6 +51,7 @@
dest: /etc/mysql/debian.cnf
config_overrides: "{{ galera_debian_cnf_overrides }}"
config_type: "ini"
notify: Restart mysql
tags:
- galera-client-user-config
@@ -64,17 +66,6 @@
tags:
- galera-config
- name: Drop mariadb script(s)
copy:
src: "{{ item.src }}"
dest: "{{ item.dest }}"
mode: "{{ item.mode|default('0644') }}"
with_items:
- { src: mysql_init.sh, dest: /etc/init.d/mysql, mode: "0755" }
notify: Restart mysql
tags:
- galera-config
- name: Remove policy-rc
file:
path: "/usr/sbin/policy-rc.d"

View File

@@ -76,12 +76,15 @@
- name: Add galera repo(s)
apt_repository:
repo: "{{ galera_apt_repo.repo }}"
state: "{{ galera_apt_repo.state }}"
repo: "{{ item.repo }}"
state: "{{ item.state }}"
register: add_repos
until: add_repos|success
retries: 5
delay: 2
with_items:
- "{{ galera_apt_repo }}"
- "{{ galera_apt_percona_xtrabackup_repo }}"
tags:
- galera-repos

View File

@@ -13,9 +13,11 @@
# See the License for the specific language governing permissions and
# limitations under the License.
- include: galera_cluster_state.yml
- include: galera_pre_install.yml
- include: galera_install.yml
- include: galera_post_install.yml
- include: galera_bootstrap.yml
- name: Flush handlers
meta: flush_handlers

View File

@@ -34,8 +34,8 @@ wsrep_node_name = {{ galera_wsrep_node_name }}
wsrep_debug = {{ galera_wsrep_debug }}
# SST method
wsrep_sst_method = {{ galera_sst_method }}
wsrep_sst_auth = root:{{ galera_root_password }}
wsrep_sst_method = {{ galera_wsrep_sst_method }}
wsrep_sst_auth = {{ galera_wsrep_sst_auth_user }}:{{ galera_wsrep_sst_auth_password }}
wsrep_slave_threads = {{ galera_wsrep_slave_threads }}
# Cluster name
@@ -43,3 +43,10 @@ wsrep_cluster_name = "{{ galera_cluster_name }}"
# how many times to retry deadlocked autocommits
wsrep_retry_autocommit = {{ galera_wsrep_retry_autocommit }}
[xtrabackup]
compress
compact
parallel = {{ galera_xtrabackup_threads }}
compress-threads = {{ galera_xtrabackup_threads }}
rebuild-threads = {{ galera_xtrabackup_threads }}

View File

@@ -1,5 +1,15 @@
# {{ ansible_managed }}
{%- set all_calculated_max_connections = [] %}
{%- for galera_node in groups['galera_all'] %}
{%- set _ = all_calculated_max_connections.append(hostvars[galera_node]['ansible_processor_vcpus'] * 100) %}
{%- endfor %}
{%- set calculated_min_connections = all_calculated_max_connections | min %}
{%- set calculated_max_connections = galera_max_connections | default(calculated_min_connections) %}
# How long to wait for successfull mysql startup
# Startup can take a while if it requires a galera state transfer.
MYSQLD_STARTUP_TIMEOUT=1800
ulimit -n {{ calculated_max_connections }}
ulimit -Hn {{ calculated_max_connections }}