巧用 Ansible 实现 MySQL 备份,运维看过来

网友投稿 1073 2023-06-15

巧用 Ansible 实现 MySQL 备份,运维看过来

巧用 Ansible 实现 MySQL 备份,运维看过来

本文以容器形式部署了开源自动化运维工具 Ansible,基于自带的 MySQL 管理模块编排了 playbook 配置文件,最终实现 MySQL 数据库备份的目标。选择容器而非直接安装的部署形式,可以避免对系统环境的污染,使运维工作开展更加高效和灵活。

MySQL 数据库备份技术和相关方案已经非常成熟,本文不做赘述和展开。在实际场景中,数据库不可能脱离业务单独存在;因此对于备份等运维操作来说,应当在运维平台统一的调度下发起或实施,Ansible 作为近年来流行的自动化运维工具,可以定位于运维平台的核心来使用。

Ansible简介

环境准备

笔者对红帽系统比较熟悉,原本想直接通过 yum 命令安装 ansible,但是从实际工作角度出发,一方面要维护非联网环境中 yum 源,另一方面 ansible 需要连带安装大量依赖包,易对系统造成“污染”,因此并不推荐 yum 直接安装。根据 Ansible 的官方文档,使用 mysql_db 模块需要安装 MySQL 客户端和其他一些工具,这些对于操作系统本身也非必要。基于以上考虑,笔者最终采用构建自定义 docker 镜像的方式部署 Ansible。除了克服以上弊端外,镜像制作完成后可以方便地移植到任意安装 docker 的环境中,无需兼顾环境因素。本文使用 debian11 的官方镜像作为底座和中科大的软件源,Dockerfile 文件定义如下:

FROM debian:latestRUN sed -i 's/deb.debian.org/mirrors.ustc.edu.cn/g' /etc/apt/sources.list \ && apt-get update -y \ && apt-get upgrade -y \ && apt-get install ansible -y \ && apt-get install sshpass -y \ && apt-get install pip -y \ && apt-get install libmysql++-dev -y \ && apt-get install default-mysql-client -y \ && apt-get autocleanRUN pip3 install mysqlclientRUN mkdir -p /etc/ansible/CMD ["/bin/bash"]

使用 docker 编译后,导出的镜像约 900MB,安装的 ansible 版本为 2.10.8。使用该镜像部署的容器启动后检查输出如下图。

mysql_db模块

该模块用于实现 MySQL 库级别的管理,提供 CREATE、DROP、DUMP、IMPORT 四种功能。本文通过把 state 设置为 dump,实现调用 mysqldump 工具完成备份,mysql_db 模块备份功能可能用到的主要输入参数说明如下:

connect_timeout

integer

The connection timeout when connecting to the MySQL server.

Default: 30

dump_extra_args

string

Provide additional arguments for mysqldump. Used when state=dump only, ignored otherwise.

encoding

string

Encoding mode to use, examples include utf8 or latin1_swedish_ci, at creation of database, dump or importation of sql script.

Default: “”

force

boolean

Continue dump or import even if we get an SQL error.

Used only when state is dump or import.

Choices:

no ← (default)yes

hex_blob

boolean

Dump binary columns using hexadecimal notation.

Choices:

no ← (default)yes

ignore_tables

list / elements=string

A list of table names that will be ignored in the dump of the form database_name.table_name.

Default: []

login_host

string

Host running the database.

In some cases for local connections the login_unix_socket=/path/to/mysqld/socket, that is usually /var/run/mysqld/mysqld.sock, needs to be used instead of login_host=localhost.

Default: “localhost”

login_password

string

The password used to authenticate with.

login_port

integer

Port of the MySQL server. Requires login_host be defined as other than localhost if login_port is used.

Default: 3306

login_user

string

The username used to authenticate with.

master_data

integer

Option to dump a master replication server to produce a dump file that can be used to set up another server as a slave of the master.

0 to not include master data.

1 to generate a ‘CHANGE MASTER TO’ statement required on the slave to start the replication process.

Can be used when state=dump.

Choices:

012

Default: 0

name

aliases: db

list / elements=string / required

Name of the database to add or remove.

name=all may only be provided if state is dump or import.

List of databases is provided with state=dump, state=present and state=absent.

If name=all it works like –all-databases option for mysqldump (Added in 2.0).

quick

boolean

Option used for dumping large tables.

Choices:

noyes ← (default)

restrict_config_file

boolean

Read only passed config_file.

If this behavior is undesirable, use yes to read only named option file.

Choices:

no ← (default)yes

single_transaction

boolean

Execute the dump in a single transaction.

Choices:

no ← (default)yes

skip_lock_tables

boolean

Skip locking tables for read. Used when state=dump, ignored otherwise.

Choices:

no ← (default)yes

state

string

The database state.

Choices:

absentdumpimportpresent ← (default)

target

path

Location, on the remote host, of the dump file to read from or write to.

playbook编排

playbook 是 Ansible 用于配置、部署、和管理被控节点的剧本,给被控节点列出的一系列 to-do-list。剧本在执行过程中按照编排定义,执行一个或多个 task,实现目标主机完成指定任务,达到预期的状态。笔者编写了一个简单的 playbook,配置了一个task调用 mysql_db 模块实现备份目标,需要注意的是 hosts 建议设定为127.0.0.1,表示 ansible 所在容器本身,yml 文件具体如下:

---- hosts: 127.0.0.1 tasks: - name: "mysql dump test" mysql_db: login_host: 192.168.43.51 login_user: root login_password: ****** state: dump name: test target: /tmp/test_{{ ansible_date_time.date }}.gz

执行该 playbook 的过程和结果如下图所示:

总结和展望

本文使用容器形式实现 Ansible 轻量化安装部署的尝试,旨在更好地发挥 Ansible 在运维管理中的积极作用,Ansible 模块化的属性可以帮助运维人员摆脱复杂的技术而更好地专注于运维场景本身。笔者仅实现了 MySQL 备份一个场景,在企业级规模运维管理中,要实现更复杂的运维场景,做好模块管理还是有必要部署 Ansible Tower。笔者也会持续开展 Ansible Tower对应的开源产品AWX应用研究。

作者简介:曹杰,中国结算上海分公司高级经理,从事系统运维管理工作。

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:深度解析单线程的 Redis 如何做到每秒数万 QPS 的超高处理能力!
下一篇:MySQL 锁机制存在的价值是什么?
相关文章