From 25de6deb4b229413c89eb9592d116fa621b15ade Mon Sep 17 00:00:00 2001 From: Nick Jones Date: Fri, 9 Mar 2018 17:27:00 +0000 Subject: Introduce Percona XtraBackup image blueprint database-backup-recovery Implements an image suitable for taking MariaDB backups via Percona's XtraBackup tool. Install XtraBackup from Percona's repos, ensuring that packages from this source aren't used for any other purpose. Include a script which invokes XtraBackup with the appropriate options for either a full or incremental backup. Change-Id: Ifebe2045e5815c573c0a2ae05951c428c3f06a92 --- docker/base/Dockerfile.j2 | 8 ++++--- docker/base/apt_preferences.debian | 4 ++++ docker/base/apt_preferences.ubuntu | 5 ++++ docker/base/percona-release.repo | 13 ++++++++++ docker/base/sources.list.debian | 4 ++++ docker/base/sources.list.ubuntu | 3 +++ docker/xtrabackup/Dockerfile.j2 | 24 +++++++++++++++++++ docker/xtrabackup/backup.sh | 49 ++++++++++++++++++++++++++++++++++++++ 8 files changed, 107 insertions(+), 3 deletions(-) create mode 100644 docker/base/percona-release.repo create mode 100644 docker/xtrabackup/Dockerfile.j2 create mode 100755 docker/xtrabackup/backup.sh (limited to 'docker') diff --git a/docker/base/Dockerfile.j2 b/docker/base/Dockerfile.j2 index 639f85297..0b8b81011 100644 --- a/docker/base/Dockerfile.j2 +++ b/docker/base/Dockerfile.j2 @@ -63,15 +63,17 @@ COPY yum.conf /etc/yum.conf 'influxdb.repo', 'nfs_ganesha.repo', 'opendaylight.repo', - 'td.repo', - 'rabbitmq_rabbitmq-server.repo' + 'percona-release.repo', + 'rabbitmq_rabbitmq-server.repo', + 'td.repo' ] %} {% set base_yum_repo_keys = [ 'https://artifacts.elastic.co/GPG-KEY-elasticsearch', + 'https://grafanarel.s3.amazonaws.com/RPM-GPG-KEY-grafana', 'https://repos.influxdata.com/influxdb.key', 'https://packagecloud.io/gpg.key', - 'https://grafanarel.s3.amazonaws.com/RPM-GPG-KEY-grafana', + 'https://www.percona.com/downloads/RPM-GPG-KEY-percona', 'https://packages.treasuredata.com/GPG-KEY-td-agent' ] %} {% endif %} diff --git a/docker/base/apt_preferences.debian b/docker/base/apt_preferences.debian index e69de29bb..1ac2b108a 100644 --- a/docker/base/apt_preferences.debian +++ b/docker/base/apt_preferences.debian @@ -0,0 +1,4 @@ +# Lower the priority of packages from Percona's repos +Package: * +Pin: origin repo.percona.com +Pin-Priority: 100 diff --git a/docker/base/apt_preferences.ubuntu b/docker/base/apt_preferences.ubuntu index a9baa53a3..12c7057f6 100644 --- a/docker/base/apt_preferences.ubuntu +++ b/docker/base/apt_preferences.ubuntu @@ -2,3 +2,8 @@ Package: ceph* *cephfs* librbd* *rados* python-rbd librgw* Pin: version 13.* Pin-Priority: -1 + +# Lower the priority of packages from Percona's repos +Package: * +Pin: origin repo.percona.com +Pin-Priority: 100 diff --git a/docker/base/percona-release.repo b/docker/base/percona-release.repo new file mode 100644 index 000000000..b7d5c54b8 --- /dev/null +++ b/docker/base/percona-release.repo @@ -0,0 +1,13 @@ +[percona-release-$basearch] +name = Percona-Release YUM repository - $basearch +baseurl = http://repo.percona.com/release/$releasever/RPMS/$basearch +enabled = 0 +gpgcheck = 1 +gpgkey = file:///etc/pki/rpm-gpg/RPM-GPG-KEY-Percona + +[percona-release-noarch] +name = Percona-Release YUM repository - noarch +baseurl = http://repo.percona.com/release/$releasever/RPMS/noarch +enabled = 0 +gpgcheck = 1 +gpgkey = file:///etc/pki/rpm-gpg/RPM-GPG-KEY-Percona diff --git a/docker/base/sources.list.debian b/docker/base/sources.list.debian index 44476cef8..50532ddfb 100644 --- a/docker/base/sources.list.debian +++ b/docker/base/sources.list.debian @@ -15,3 +15,7 @@ deb [arch=amd64] https://artifacts.elastic.co/packages/5.x/apt stable main # main docker repo deb https://download.docker.com/linux/debian stretch stable + +# Percona XtraBackup repo +deb http://repo.percona.com/apt stretch main + diff --git a/docker/base/sources.list.ubuntu b/docker/base/sources.list.ubuntu index 3c5229ba8..5448bb067 100644 --- a/docker/base/sources.list.ubuntu +++ b/docker/base/sources.list.ubuntu @@ -35,3 +35,6 @@ deb http://ppa.launchpad.net/odl-team/carbon/ubuntu xenial main # rabbitmq repo deb https://packagecloud.io/rabbitmq/rabbitmq-server/ubuntu/ xenial main + +# Percona XtraBackup repo +deb http://repo.percona.com/apt bionic main diff --git a/docker/xtrabackup/Dockerfile.j2 b/docker/xtrabackup/Dockerfile.j2 new file mode 100644 index 000000000..72fd82288 --- /dev/null +++ b/docker/xtrabackup/Dockerfile.j2 @@ -0,0 +1,24 @@ +FROM {{ namespace }}/{{ image_prefix }}base:{{ tag }} +LABEL maintainer="{{ maintainer }}" name="{{ image_name }}" build-date="{{ build_date }}" + +{% block xtrabackup_header %}{% endblock %} + +{% import "macros.j2" as macros with context %} + +{% if base_distro in ['centos', 'oraclelinux', 'rhel'] %} +RUN yum-config-manager --enable percona\* +{% endif %} + +{% if base_distro in ['centos', 'oraclelinux', 'rhel', 'ubuntu', 'debian'] %} + {% set xtrabackup_packages = ['percona-xtrabackup-24', 'qpress'] %} +{% endif %} + +{{ macros.install_packages(xtrabackup_packages | customizable("packages")) }} + +COPY backup.sh /usr/local/bin/kolla_mariadb_backup.sh +RUN chmod 755 /usr/local/bin/kolla_mariadb_backup.sh + +CMD /usr/local/bin/kolla_mariadb_backup.sh + +{% block xtrabackup_footer %}{% endblock %} +{% block footer %}{% endblock %} diff --git a/docker/xtrabackup/backup.sh b/docker/xtrabackup/backup.sh new file mode 100755 index 000000000..f8dff8bd7 --- /dev/null +++ b/docker/xtrabackup/backup.sh @@ -0,0 +1,49 @@ +#!/usr/bin/env bash + +set -eu + +# Execute a full backup +backup_full() { + echo "Taking a full backup" + innobackupex --defaults-file=/etc/mysql/my.cnf \ + --no-timestamp \ + --stream=xbstream \ + --compress \ + --history=$(date +%d-%m-%Y) ./ > \ + $BACKUP_DIR/mysqlbackup-$(date +%d-%m-%Y-%s).qp.xbc.xbs +} + +# Execute an incremental backup +backup_incremental() { + echo "Taking an incremental backup" + innobackupex --defaults-file=/etc/mysql/my.cnf \ + --no-timestamp \ + --stream=xbstream \ + --compress \ + --incremental \ + --incremental-history-name=$(date +%d-%m-%Y) \ + --history=$(date +%d-%m-%Y) ./ > \ + $BACKUP_DIR/incremental-$(date +%H)-mysqlbackup-$(date +%d-%m-%Y-%s).qp.xbc.xbs +} + +BACKUP_DIR=/backup/ +cd $BACKUP_DIR + +if [ -n $BACKUP_TYPE ]; then + case $BACKUP_TYPE in + "full") + backup_full + ;; + "incremental") + backup_incremental + ;; + *) + echo "Only full or incremental options are supported." + exit 1 + ;; + esac +else + echo "You need to specify either full or incremental backup options." + exit 1 +fi + -- cgit v1.2.3