b25c0ee477
Upgrading MariaDB from Rocky to Stein currently fails, with the new container left continually restarting. The problem is that the Rocky container does not shutdown cleanly, leaving behind state that the new container cannot recover. The container does not shutdown cleanly because we run dumb-init with a --single-child argument, causing it to forward signals to only the process executed by dumb-init. In our case this is mysqld_safe, which ignores various signals, including SIGTERM. After a (default 10 second) timeout, Docker then kills the container. A Kolla change [1] removes the --single-child argument from dumb-init for the MariaDB container, however we still need to support upgrading from Rocky images that don't have this change. To do that, we add new handlers to execute 'mysqladmin shutdown' to cleanly shutdown the service. A second issue with the current upgrade approach is that we don't execute mysql_upgrade after starting the new service. This can leave the database state using the format of the previous release. This patch also adds handlers to execute mysql_upgrade. [1] https://review.openstack.org/644244 Depends-On: https://review.openstack.org/644244 Depends-On: https://review.openstack.org/645990 Change-Id: I08a655a359ff9cfa79043f2166dca59199c7d67f Closes-Bug: #1820325
235 lines
6.9 KiB
YAML
235 lines
6.9 KiB
YAML
---
|
|
- name: Starting first MariaDB container
|
|
vars:
|
|
service_name: "mariadb"
|
|
service: "{{ mariadb_services[service_name] }}"
|
|
become: true
|
|
kolla_docker:
|
|
action: "start_container"
|
|
common_options: "{{ docker_common_options }}"
|
|
environment:
|
|
KOLLA_CONFIG_STRATEGY: "{{ config_strategy }}"
|
|
BOOTSTRAP_ARGS: "--wsrep-new-cluster"
|
|
image: "{{ service.image }}"
|
|
labels:
|
|
BOOTSTRAP:
|
|
name: "{{ service.container_name }}"
|
|
restart_policy: "never"
|
|
volumes: "{{ service.volumes }}"
|
|
dimensions: "{{ service.dimensions }}"
|
|
when:
|
|
- bootstrap_host is defined
|
|
- bootstrap_host == inventory_hostname
|
|
listen: Bootstrap MariaDB cluster
|
|
notify:
|
|
- restart mariadb
|
|
|
|
# TODO(jeffrey4l), remove the task check when the wait_for bug is fixed
|
|
# https://github.com/ansible/ansible-modules-core/issues/2788
|
|
- name: wait first mariadb container
|
|
wait_for:
|
|
host: "{{ api_interface_address }}"
|
|
port: "{{ mariadb_port }}"
|
|
connect_timeout: 1
|
|
timeout: 60
|
|
search_regex: "MariaDB"
|
|
register: check_mariadb_port
|
|
until: check_mariadb_port is success
|
|
retries: 10
|
|
delay: 6
|
|
when:
|
|
- bootstrap_host is defined
|
|
- bootstrap_host == inventory_hostname
|
|
listen: Bootstrap MariaDB cluster
|
|
|
|
# NOTE(mgoddard): In Rocky the MariaDB image had an issue where it would not
|
|
# stop on demand, and would result in Docker forcibly killing the container.
|
|
# This could lead to a failed upgrade if the new image is unable to recover
|
|
# from the crash. See https://bugs.launchpad.net/kolla-ansible/+bug/1820325.
|
|
# TODO(mgoddard): Remove this task in Train.
|
|
- name: shutdown slave mariadb
|
|
vars:
|
|
service_name: "mariadb"
|
|
service: "{{ mariadb_services[service_name] }}"
|
|
become: true
|
|
kolla_docker:
|
|
action: "start_container"
|
|
command: >-
|
|
bash -c '
|
|
sudo -E kolla_set_configs &&
|
|
mysqladmin shutdown --host={{ api_interface_address }} --user=root --password={{ database_password }}
|
|
'
|
|
common_options: "{{ docker_common_options }}"
|
|
detach: False
|
|
name: "mariadb_shutdown"
|
|
image: "{{ service.image }}"
|
|
volumes: "{{ service.volumes }}"
|
|
dimensions: "{{ service.dimensions }}"
|
|
labels:
|
|
UPGRADE:
|
|
restart_policy: "never"
|
|
no_log: true
|
|
when:
|
|
- kolla_action != "config"
|
|
- has_cluster | bool
|
|
- inventory_hostname != master_host
|
|
listen: restart mariadb
|
|
|
|
- name: restart slave mariadb
|
|
vars:
|
|
service_name: "mariadb"
|
|
service: "{{ mariadb_services[service_name] }}"
|
|
become: true
|
|
kolla_docker:
|
|
action: "recreate_or_restart_container"
|
|
common_options: "{{ docker_common_options }}"
|
|
name: "{{ service.container_name }}"
|
|
image: "{{ service.image }}"
|
|
volumes: "{{ service.volumes }}"
|
|
dimensions: "{{ service.dimensions }}"
|
|
when:
|
|
- kolla_action != "config"
|
|
- inventory_hostname != master_host
|
|
listen: restart mariadb
|
|
|
|
# TODO(jeffrey4l), remove the task check when the wait_for bug is fixed
|
|
# https://github.com/ansible/ansible-modules-core/issues/2788
|
|
- name: wait for slave mariadb
|
|
wait_for:
|
|
host: "{{ api_interface_address }}"
|
|
port: "{{ mariadb_port }}"
|
|
connect_timeout: 1
|
|
timeout: 60
|
|
search_regex: "MariaDB"
|
|
register: check_mariadb_port
|
|
until: check_mariadb_port is success
|
|
retries: 10
|
|
delay: 6
|
|
when:
|
|
- kolla_action != "config"
|
|
- inventory_hostname != master_host
|
|
listen: restart mariadb
|
|
|
|
- name: run upgrade on slave
|
|
vars:
|
|
service_name: "mariadb"
|
|
service: "{{ mariadb_services[service_name] }}"
|
|
become: true
|
|
kolla_docker:
|
|
action: "start_container"
|
|
common_options: "{{ docker_common_options }}"
|
|
detach: False
|
|
dimensions: "{{ service.dimensions }}"
|
|
environment:
|
|
KOLLA_UPGRADE:
|
|
KOLLA_CONFIG_STRATEGY: "{{ config_strategy }}"
|
|
DB_HOST: "{{ api_interface_address }}"
|
|
DB_PORT: "{{ mariadb_port }}"
|
|
DB_ROOT_PASSWORD: "{{ database_password }}"
|
|
image: "{{ service.image }}"
|
|
labels:
|
|
UPGRADE:
|
|
name: "upgrade_mariadb"
|
|
restart_policy: "never"
|
|
volumes: "{{ service.volumes }}"
|
|
no_log: true
|
|
when:
|
|
- kolla_action == "upgrade"
|
|
- inventory_hostname != master_host
|
|
listen: restart mariadb
|
|
|
|
# NOTE(mgoddard): In Rocky the MariaDB image had an issue where it would not
|
|
# stop on demand, and would result in Docker forcibly killing the container.
|
|
# This could lead to a failed upgrade if the new image is unable to recover
|
|
# from the crash. See https://bugs.launchpad.net/kolla-ansible/+bug/1820325.
|
|
# TODO(mgoddard): Remove this task in Train.
|
|
- name: shutdown master mariadb
|
|
vars:
|
|
service_name: "mariadb"
|
|
service: "{{ mariadb_services[service_name] }}"
|
|
become: true
|
|
kolla_docker:
|
|
action: "start_container"
|
|
command: >-
|
|
bash -c '
|
|
sudo -E kolla_set_configs &&
|
|
mysqladmin shutdown --host={{ api_interface_address }} --user=root --password={{ database_password }}
|
|
'
|
|
common_options: "{{ docker_common_options }}"
|
|
detach: False
|
|
name: "mariadb_shutdown"
|
|
image: "{{ service.image }}"
|
|
volumes: "{{ service.volumes }}"
|
|
dimensions: "{{ service.dimensions }}"
|
|
labels:
|
|
UPGRADE:
|
|
restart_policy: "never"
|
|
no_log: true
|
|
when:
|
|
- kolla_action != "config"
|
|
- inventory_hostname == master_host
|
|
listen: restart mariadb
|
|
|
|
- name: restart master mariadb
|
|
vars:
|
|
service_name: "mariadb"
|
|
service: "{{ mariadb_services[service_name] }}"
|
|
become: true
|
|
kolla_docker:
|
|
action: "recreate_or_restart_container"
|
|
common_options: "{{ docker_common_options }}"
|
|
name: "{{ service.container_name }}"
|
|
image: "{{ service.image }}"
|
|
volumes: "{{ service.volumes }}"
|
|
dimensions: "{{ service.dimensions }}"
|
|
when:
|
|
- kolla_action != "config"
|
|
- inventory_hostname == master_host
|
|
listen: restart mariadb
|
|
|
|
# TODO(jeffrey4l), remove the task check when the wait_for bug is fixed
|
|
# https://github.com/ansible/ansible-modules-core/issues/2788
|
|
- name: Waiting for master mariadb
|
|
wait_for:
|
|
host: "{{ api_interface_address }}"
|
|
port: "{{ mariadb_port }}"
|
|
connect_timeout: 1
|
|
timeout: 60
|
|
search_regex: "MariaDB"
|
|
register: check_mariadb_port
|
|
until: check_mariadb_port is success
|
|
retries: 10
|
|
delay: 6
|
|
when:
|
|
- kolla_action != "config"
|
|
- inventory_hostname == master_host
|
|
listen: restart mariadb
|
|
|
|
- name: run upgrade on master
|
|
vars:
|
|
service_name: "mariadb"
|
|
service: "{{ mariadb_services[service_name] }}"
|
|
become: true
|
|
kolla_docker:
|
|
action: "start_container"
|
|
common_options: "{{ docker_common_options }}"
|
|
detach: False
|
|
dimensions: "{{ service.dimensions }}"
|
|
environment:
|
|
KOLLA_UPGRADE:
|
|
KOLLA_CONFIG_STRATEGY: "{{ config_strategy }}"
|
|
DB_HOST: "{{ api_interface_address }}"
|
|
DB_PORT: "{{ mariadb_port }}"
|
|
DB_ROOT_PASSWORD: "{{ database_password }}"
|
|
image: "{{ service.image }}"
|
|
labels:
|
|
UPGRADE:
|
|
name: "upgrade_mariadb"
|
|
restart_policy: "never"
|
|
volumes: "{{ service.volumes }}"
|
|
no_log: true
|
|
when:
|
|
- kolla_action == "upgrade"
|
|
- inventory_hostname == master_host
|
|
listen: restart mariadb
|