From fdaf169e1ea7acdedac6b6c2a07a02ad2817e8ad Mon Sep 17 00:00:00 2001 From: Jimmy McCrory Date: Wed, 23 Nov 2016 00:38:54 -0800 Subject: [PATCH] Install MariaDB 10.1 server Update repos and packages to install the server for MariaDB 10.1, the current stable release. Several improvements have been made to improve the upgrade process and an upgrade from 10.0 has been included in the test playbooks. Make use of the yum_repository module for installing on yum based systems and give the apt repository files consistent names, 'MariaDB' and 'Percona' for easier maintenance and handling of upgrades going forward. Depends-On: I8939703f26e5d8adc393b984266f4cad7a6e0b4c Change-Id: Ib6409f1fcf4a664b65dbe01372a19509d02d70a4 --- defaults/main.yml | 4 +- meta/main.yml | 2 +- ...-server-mariadb-10-1-8620e7eadafb6e8f.yaml | 10 +++++ tasks/galera_bootstrap.yml | 38 ++++++++++++++----- tasks/galera_install_apt.yml | 26 +++++++++---- tasks/galera_install_yum.yml | 22 ++++------- tasks/galera_post_install.yml | 22 ++++------- tasks/galera_upgrade_check_apt.yml | 2 +- tasks/galera_upgrade_check_yum.yml | 4 +- tasks/galera_upgrade_post.yml | 18 ++------- tasks/galera_upgrade_pre.yml | 30 +++++++++++---- templates/cluster.cnf.j2 | 2 + templates/mysql_defaults.j2 | 2 +- templates/systemd.timeout.conf.j2 | 6 +++ tests/galera_server-overrides.yml | 22 +++++++++++ tests/test.yml | 13 ++++++- vars/redhat-7.yml | 11 ++---- vars/ubuntu-14.04.yml | 13 +++---- vars/ubuntu-16.04.yml | 14 +++---- 19 files changed, 162 insertions(+), 99 deletions(-) create mode 100644 releasenotes/notes/galera-server-mariadb-10-1-8620e7eadafb6e8f.yaml create mode 100644 templates/systemd.timeout.conf.j2 create mode 100644 tests/galera_server-overrides.yml diff --git a/defaults/main.yml b/defaults/main.yml index eef380b9..2035ca1d 100644 --- a/defaults/main.yml +++ b/defaults/main.yml @@ -42,6 +42,8 @@ galera_force_change_cluster_name: False galera_server_distro_package_pins: [] galera_debconf_items: [] galera_server_percona_distro_packages: [] +galera_mariadb_server_package: "{{ _galera_mariadb_server_package }}" +galera_repo_url: "{{ _galera_repo_url }}" galera_existing_cluster: true @@ -101,5 +103,3 @@ galera_debian_cnf_overrides: {} # the cluster will be used which is something to note if deploying galera on different # hardware. # galera_max_connections: 500 - -using_mysql_init: no diff --git a/meta/main.yml b/meta/main.yml index ce8bbdc1..e42487dc 100644 --- a/meta/main.yml +++ b/meta/main.yml @@ -18,7 +18,7 @@ galaxy_info: description: Installation galera server company: Rackspace license: Apache2 - min_ansible_version: 1.9 + min_ansible_version: 2.1 platforms: - name: Ubuntu versions: diff --git a/releasenotes/notes/galera-server-mariadb-10-1-8620e7eadafb6e8f.yaml b/releasenotes/notes/galera-server-mariadb-10-1-8620e7eadafb6e8f.yaml new file mode 100644 index 00000000..891b77c9 --- /dev/null +++ b/releasenotes/notes/galera-server-mariadb-10-1-8620e7eadafb6e8f.yaml @@ -0,0 +1,10 @@ +--- +upgrade: + - The galera_server role now installs MariaDB server version 10.1. + - For systems using the APT package manager, the sources files for + the MariaDB and Percona repos now have consistent names, + 'MariaDB.list' and 'Percona.list'. + - The ``galera_mariadb_apt_server_package`` and ``galera_mariadb_yum_server_package`` + variables have been renamed to ``galera_mariadb_server_package``. + - The ``galera_apt_repo_url`` and ``galera_yum_repo_url`` variables have been renamed + to ``galera_repo_url``. diff --git a/tasks/galera_bootstrap.yml b/tasks/galera_bootstrap.yml index abe523d7..ec4dbc92 100644 --- a/tasks/galera_bootstrap.yml +++ b/tasks/galera_bootstrap.yml @@ -18,27 +18,40 @@ num_retries: 1 wait_delay: 3 +- name: Start galera cluster + command: galera_new_cluster + when: + - ansible_service_mgr == 'systemd' + - inventory_hostname == galera_server_bootstrap_node + - mysql_running.rc != 0 + register: start_cluster + failed_when: false + tags: + - galera-bootstrap + +# TODO: Remove this task after 10.0 is removed from upgrade path +- name: Start cluster with wsrep init fallback + command: "/etc/init.d/mysql bootstrap" + when: + - ansible_service_mgr == 'systemd' + - start_cluster | failed + - inventory_hostname == galera_server_bootstrap_node + - mysql_running.rc != 0 + tags: + - galera-bootstrap + - name: Start cluster with wsrep service: name: mysql state: restarted arguments: "--wsrep-new-cluster" when: - - not using_mysql_init | bool + - ansible_service_mgr != 'systemd' - inventory_hostname == galera_server_bootstrap_node - mysql_running.rc != 0 tags: - galera-bootstrap -- name: Start cluster with wsrep init - command: "/etc/init.d/mysql bootstrap" - when: - - inventory_hostname == galera_server_bootstrap_node - - mysql_running.rc != 0 - - using_mysql_init | bool - 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 @@ -62,3 +75,8 @@ tags: - galera-operational - galera-bootstrap + +- include: galera_upgrade_post.yml + static: no + when: + - galera_upgrade | bool diff --git a/tasks/galera_install_apt.yml b/tasks/galera_install_apt.yml index d616e4da..0ab916b9 100644 --- a/tasks/galera_install_apt.yml +++ b/tasks/galera_install_apt.yml @@ -58,29 +58,39 @@ tags: - galera-apt-keys +- name: Remove old repos + lineinfile: + dest: "/etc/apt/sources.list.d/{{ item.name }}.list" + regexp: "^((?!{{ item.repo }}).*)$" + state: absent + with_items: + - { name: "MariaDB", repo: "{{ galera_repo.repo }}" } + - { name: "Percona", repo: "{{ galera_percona_xtrabackup_repo.repo }}" } + tags: + - galera-client-repos + - percona-repos + - name: Add galera repo apt_repository: - repo: "{{ item.repo }}" - state: "{{ item.state }}" + repo: "{{ galera_repo.repo }}" + filename: MariaDB + state: "{{ galera_repo.state }}" register: add_repos until: add_repos|success retries: 5 delay: 2 - with_items: - - "{{ galera_repo }}" tags: - galera-repos - name: Add percona repo apt_repository: - repo: "{{ item.repo }}" - state: "{{ item.state }}" + repo: "{{ galera_percona_xtrabackup_repo.repo }}" + filename: Percona + state: "{{ galera_percona_xtrabackup_repo.state }}" register: add_repos until: add_repos|success retries: 5 delay: 2 - with_items: - - "{{ galera_percona_xtrabackup_repo }}" when: use_percona_upstream | bool tags: - percona-repos diff --git a/tasks/galera_install_yum.yml b/tasks/galera_install_yum.yml index 1573c89e..7f827de1 100644 --- a/tasks/galera_install_yum.yml +++ b/tasks/galera_install_yum.yml @@ -54,26 +54,18 @@ tags: - galera-gpg-keys -#TODO(cloudnull) Remove this task once we move to Ansible 2.1 -# where we can leverage the `yum_repository` module: -# https://docs.ansible.com/ansible/yum_repository_module.html - name: Add galera repo - copy: - content: | - [{{ item.name }}] - name={{ item.name }} - description={{ item.description }} - baseurl={{ item.baseurl }} - gpgkey={{ item.gpgkey }} - gpgcheck=1 - enabled=1 - dest: "/etc/yum.repos.d/{{ item.file }}.repo" + yum_repository: + name: "{{ galera_repo.name }}" + description: "{{ galera_repo.description }}" + baseurl: "{{ galera_repo.baseurl }}" + gpgkey: "{{ galera_repo.gpgkey }}" + gpgcheck: yes + enabled: yes register: add_repos until: add_repos|success retries: 5 delay: 2 - with_items: - - "{{ galera_repo }}" tags: - galera-repos diff --git a/tasks/galera_post_install.yml b/tasks/galera_post_install.yml index cbc93db3..ef6aa990 100644 --- a/tasks/galera_post_install.yml +++ b/tasks/galera_post_install.yml @@ -63,20 +63,16 @@ dest: /etc/init.d/mysql state: present insertafter: '^export HOME=/etc/mysql/' - line: '[ -r /etc/default/mysql ] && . /etc/default/mysql' + line: '[ -r /etc/default/mariadb ] && . /etc/default/mariadb' backup: yes tags: - galera-config -# NOTE: (mancdaz) REMOVE "/etc/default/mysql" when running MariaDB 10.1 - name: Apply service defaults template: src: "mysql_defaults.j2" - dest: "{{ item }}" + dest: "/etc/default/mariadb" mode: "0644" - with_items: - - /etc/default/mysql - - /etc/default/mariadb notify: - Restart mysql - Reload the systemd daemon @@ -104,11 +100,14 @@ when: - ansible_service_mgr == 'systemd' -- name: Apply resource limits (systemd) +- name: Apply systemd options template: - src: "systemd.limits.conf.j2" - dest: "/etc/systemd/system/mariadb.service.d/limits.conf" + src: "{{ item.src }}" + dest: "/etc/systemd/system/mariadb.service.d/{{ item.dest }}" mode: "0644" + with_items: + - { src: "systemd.limits.conf.j2", dest: "limits.conf" } + - { src: "systemd.timeout.conf.j2", dest: "timeout.conf" } when: - ansible_service_mgr == 'systemd' notify: @@ -123,8 +122,3 @@ state: absent tags: - galera-config - -- include: galera_upgrade_post.yml - static: no - when: - - galera_upgrade | bool diff --git a/tasks/galera_upgrade_check_apt.yml b/tasks/galera_upgrade_check_apt.yml index bcd3fff6..a03265dc 100644 --- a/tasks/galera_upgrade_check_apt.yml +++ b/tasks/galera_upgrade_check_apt.yml @@ -14,7 +14,7 @@ # limitations under the License. - name: Check major galera install version - command: "dpkg -s {{ galera_mariadb_apt_server_package }}" + command: "dpkg -s {{ galera_mariadb_server_package }}" failed_when: false register: installed_galera_specific when: diff --git a/tasks/galera_upgrade_check_yum.yml b/tasks/galera_upgrade_check_yum.yml index 32d54c3b..f6eed534 100644 --- a/tasks/galera_upgrade_check_yum.yml +++ b/tasks/galera_upgrade_check_yum.yml @@ -14,7 +14,7 @@ # limitations under the License. - name: Check major galera install version - command: "rpm -qi '{{ galera_mariadb_yum_server_package }}'" + command: "rpm -qi '{{ galera_mariadb_server_package }}'" failed_when: false register: installed_galera_specific when: @@ -27,7 +27,7 @@ - name: Check for any galera install version shell: | - rpm -qa | grep -i "{{ galera_mariadb_yum_server_package }}" + rpm -qa | grep -i "{{ galera_mariadb_server_package }}" failed_when: false register: installed_galera_any when: diff --git a/tasks/galera_upgrade_post.yml b/tasks/galera_upgrade_post.yml index e2de350f..a38db7dc 100644 --- a/tasks/galera_upgrade_post.yml +++ b/tasks/galera_upgrade_post.yml @@ -13,22 +13,10 @@ # See the License for the specific language governing permissions and # limitations under the License. -# This is starting MySQL as it may be required to restart the service more than -# once to get it to clean up old service files from the previous version. -# If the service fails to start after 3 attempts the shell command will be failed. - name: Start MySQL - shell: | - for i in {1..3}; do - /etc/init.d/mysql start || true - if pgrep mysqld; then - exit 0 - else - sleep 2 - fi - done - echo "Service failed to start" - exit 1 - changed_when: false + service: + name: mysql + state: started tags: - galera-upgrade diff --git a/tasks/galera_upgrade_pre.yml b/tasks/galera_upgrade_pre.yml index bb75719b..5d02600e 100644 --- a/tasks/galera_upgrade_pre.yml +++ b/tasks/galera_upgrade_pre.yml @@ -30,10 +30,22 @@ tags: - galera-upgrade +# Stop through the init script in case the service +# was initially started outside of systemctl. +- name: Stop mysql + command: /etc/init.d/mysql stop + changed_when: false + tags: + - galera-upgrade + +# TODO: Remove the following three tasks in Pike +# They're only required during upgrades transitioning to a +# statically named apt sources file. - name: Find old sources command: > - grep -rnil maria /etc/apt/sources.list.d/* + grep -rnil maria /etc/apt/sources.list.d/ --exclude MariaDB.list changed_when: false + failed_when: false register: old_sources tags: - galera-upgrade @@ -45,8 +57,8 @@ state: absent with_items: "{{ old_sources.stdout_lines | default([]) }}" tags: - - galera-upgrade - - galera-apt-packages + - galera-upgrade + - galera-apt-packages - name: Update apt sources (Forced) apt: @@ -63,11 +75,15 @@ - galera-apt-packages - name: UN-Install galera-server package - apt: - pkg: "mariadb-galera-server*" + package: + name: "{{ item }}" state: absent - when: - - ansible_pkg_mgr == 'apt' + with_items: + - "mariadb-galera-server*" + - "mariadb-server*" + - MariaDB-Galera-server + - MariaDB-server + - mysql-common tags: - galera-upgrade - galera-apt-packages diff --git a/templates/cluster.cnf.j2 b/templates/cluster.cnf.j2 index 8a2050c3..5cbe29f6 100644 --- a/templates/cluster.cnf.j2 +++ b/templates/cluster.cnf.j2 @@ -1,6 +1,8 @@ # {{ ansible_managed }} [mysqld] +wsrep_on = ON + # Path to Galera library wsrep_provider = /usr/lib/galera/libgalera_smm.so {% if galera_wsrep_provider_options is defined %} diff --git a/templates/mysql_defaults.j2 b/templates/mysql_defaults.j2 index c0ac18d5..b7a74967 100644 --- a/templates/mysql_defaults.j2 +++ b/templates/mysql_defaults.j2 @@ -7,7 +7,7 @@ {%- 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 +# How long to wait for successful mysql startup # Startup can take a while if it requires a galera state transfer. MYSQLD_STARTUP_TIMEOUT=1800 diff --git a/templates/systemd.timeout.conf.j2 b/templates/systemd.timeout.conf.j2 new file mode 100644 index 00000000..74b9b1bd --- /dev/null +++ b/templates/systemd.timeout.conf.j2 @@ -0,0 +1,6 @@ +# {{ ansible_managed }} + +[Service] +# How long to wait for successful mysql startup +# Startup can take a while if it requires a galera state transfer. +TimeoutStartSec=1800 diff --git a/tests/galera_server-overrides.yml b/tests/galera_server-overrides.yml new file mode 100644 index 00000000..ac3e1902 --- /dev/null +++ b/tests/galera_server-overrides.yml @@ -0,0 +1,22 @@ +--- +# Copyright 2016, 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. + +galera_server_old_package: + debian: + galera_mariadb_server_package: "mariadb-galera-server-10.0" + galera_repo_url: "http://mirror.rackspace.com/mariadb/repo/10.0/ubuntu" + redhat: + galera_mariadb_server_package: "MariaDB-Galera-server" + galera_repo_url: "http://yum.mariadb.org/10.0/centos/7/x86_64" diff --git a/tests/test.yml b/tests/test.yml index 17c0a43a..106192eb 100644 --- a/tests/test.yml +++ b/tests/test.yml @@ -19,8 +19,19 @@ # Prepare the containers - include: common/test-prepare-containers.yml -# Install Galera server +# Install previous version Galera server - include: common/test-install-galera.yml + vars: + galera_mariadb_server_package: "{{ galera_server_old_package[ansible_os_family | lower]['galera_mariadb_server_package'] }}" + galera_repo_url: "{{ galera_server_old_package[ansible_os_family | lower]['galera_repo_url'] }}" # Run functional tests - include: test-galera-server-functional.yml + +# Install current version Galera server +- include: common/test-install-galera.yml + vars: + galera_upgrade: true + +# Re-run functional tests +- include: test-galera-server-functional.yml diff --git a/vars/redhat-7.yml b/vars/redhat-7.yml index 2f41bb0a..03a18c8f 100644 --- a/vars/redhat-7.yml +++ b/vars/redhat-7.yml @@ -28,24 +28,22 @@ galera_server_required_distro_packages: - MariaDB-client - MariaDB-devel -galera_mariadb_yum_server_package: "MariaDB-Galera-server" +_galera_mariadb_server_package: "MariaDB-server" galera_server_mariadb_distro_packages: - which - - "{{ galera_mariadb_yum_server_package }}" + - "{{ galera_mariadb_server_package }}" - MariaDB-shared - percona-xtrabackup - percona-toolkit - rsync - socat -galera_yum_repo_url: "http://yum.mariadb.org/10.0/centos/7/x86_64" +_galera_repo_url: "http://yum.mariadb.org/10.1/centos/7/x86_64" galera_repo: - state: "present" name: MariaDB description: "MariaDB Repo" - file: MariaDB - baseurl: "{{ galera_yum_repo_url }}" + baseurl: "{{ galera_repo_url }}" gpgkey: "https://yum.mariadb.org/RPM-GPG-KEY-MariaDB" galera_percona_xtrabackup_repo: @@ -79,4 +77,3 @@ qpress_arch_sha256: x86_64: "d6b6b7ca3a5ad4baea34975743106ac54ac746b3e6497d59bce55765d604b697" use_percona_upstream: yes -using_mysql_init: yes diff --git a/vars/ubuntu-14.04.yml b/vars/ubuntu-14.04.yml index 0ad184a0..abb1af43 100644 --- a/vars/ubuntu-14.04.yml +++ b/vars/ubuntu-14.04.yml @@ -44,7 +44,7 @@ galera_server_required_distro_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_apt_server_package: "mariadb-galera-server-10.0" +_galera_mariadb_server_package: "mariadb-server-10.1" # NB This is specifically galera_server_mariadb_distro_packages as these # packages only get installed during the galera play - this is because of @@ -53,18 +53,18 @@ galera_mariadb_apt_server_package: "mariadb-galera-server-10.0" galera_server_mariadb_distro_packages: - libmariadbclient-dev - mariadb-client - - "{{ galera_mariadb_apt_server_package }}" + - "{{ galera_mariadb_server_package }}" - galera-3 - rsync - socat galera_debconf_items: - question: "mysql-server/root_password" - name: "{{ galera_mariadb_apt_server_package }}" + name: "{{ galera_mariadb_server_package }}" value: "{{ galera_root_password }}" vtype: "string" - question: "mysql-server/root_password_again" - name: "{{ galera_mariadb_apt_server_package }}" + name: "{{ galera_mariadb_server_package }}" value: "{{ galera_root_password }}" vtype: "string" @@ -100,10 +100,9 @@ galera_percona_xtrabackup_repo: repo: "deb {{ galera_percona_xtrabackup_repo_url }} {{ ansible_distribution_release }} main" state: "present" -galera_apt_repo_url: "http://mirror.rackspace.com/mariadb/repo/10.0/ubuntu" +_galera_repo_url: "http://mirror.rackspace.com/mariadb/repo/10.1/ubuntu" galera_repo: - repo: "deb {{ galera_apt_repo_url }} {{ ansible_distribution_release }} main" + repo: "deb {{ galera_repo_url }} {{ ansible_distribution_release }} main" state: "present" use_percona_upstream: no -using_mysql_init: no diff --git a/vars/ubuntu-16.04.yml b/vars/ubuntu-16.04.yml index cfa42ddc..3a71ad5d 100644 --- a/vars/ubuntu-16.04.yml +++ b/vars/ubuntu-16.04.yml @@ -44,7 +44,7 @@ galera_server_required_distro_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_apt_server_package: "mariadb-galera-server-10.0" +_galera_mariadb_server_package: "mariadb-server-10.1" # NB This is specifically galera_server_mariadb_distro_packages as these # packages only get installed during the galera play - this is because of @@ -53,18 +53,18 @@ galera_mariadb_apt_server_package: "mariadb-galera-server-10.0" galera_server_mariadb_distro_packages: - libmariadbclient-dev - mariadb-client - - "{{ galera_mariadb_apt_server_package }}" + - "{{ galera_mariadb_server_package }}" - galera-3 - rsync - socat galera_debconf_items: - question: "mysql-server/root_password" - name: "{{ galera_mariadb_apt_server_package }}" + name: "{{ galera_mariadb_server_package }}" value: "{{ galera_root_password }}" vtype: "string" - question: "mysql-server/root_password_again" - name: "{{ galera_mariadb_apt_server_package }}" + name: "{{ galera_mariadb_server_package }}" value: "{{ galera_root_password }}" vtype: "string" @@ -99,16 +99,14 @@ qpress_arch_sha256: ppc64le: "a31d3e00dbcec9b3f98eae82b261d054d0b80a57f4a38967d0e953811cb082f3" # Repositories -# TODO: update this to xenial if the repo ever gets created. galera_percona_xtrabackup_repo_url: "http://repo.percona.com/apt" galera_percona_xtrabackup_repo: repo: "deb {{ galera_percona_xtrabackup_repo_url }} {{ ansible_distribution_release }} main" state: "present" -galera_apt_repo_url: "http://mirror.rackspace.com/mariadb/repo/10.0/ubuntu" +_galera_repo_url: "http://mirror.rackspace.com/mariadb/repo/10.1/ubuntu" galera_repo: - repo: "deb {{ galera_apt_repo_url }} {{ ansible_distribution_release }} main" + repo: "deb {{ galera_repo_url }} {{ ansible_distribution_release }} main" state: "present" use_percona_upstream: no -using_mysql_init: yes