使用Ansible自动化部署MySQL MHA高可用集群的实践指南

一、环境准备

在开始部署之前,我们需要准备以下环境:

  1. 操作系统:CentOS 7.x 或其他兼容的Linux发行版。
  2. MySQL版本:MySQL 5.6 或更高版本。
  3. Ansible版本:Ansible 2.9 或更高版本。
  4. 主机配置:至少三台服务器,分别用作MySQL主节点、从节点和MHA管理节点。

二、安装Ansible

首先,在管理节点上安装Ansible。可以通过以下命令进行安装:

sudo yum install epel-release -y
sudo yum install ansible -y

安装完成后,验证Ansible版本:

ansible --version

三、编写Ansible playbook

Ansible playbook是Ansible的核心配置文件,用于定义任务和角色。以下是一个示例playbook,用于部署MySQL MHA集群。

1. 目录结构

mysql_mha_ansible/
├── inventory
├── roles
│   ├── common
│   │   ├── tasks
│   │   │   └── main.yml
│   ├── mysql
│   │   ├── tasks
│   │   │   └── main.yml
│   │   ├── templates
│   │   │   └── my.cnf.j2
│   ├── mha
│   │   ├── tasks
│   │   │   └── main.yml
│   │   ├── templates
│   │   │   └── app1.cnf.j2
├── site.yml

2. inventory文件

inventory文件用于定义主机和组:

[master]
master_node ansible_host=192.168.1.10

[slaves]
slave1_node ansible_host=192.168.1.11
slave2_node ansible_host=192.168.1.12

[mha_manager]
mha_manager_node ansible_host=192.168.1.13

3. common角色

common角色用于配置基础环境:

# roles/common/tasks/main.yml
- name: Install common packages
  yum:
    name: "{{ item }}"
    state: present
  loop:
    - epel-release
    - git
    - vim
    - ntp

4. mysql角色

mysql角色用于安装和配置MySQL:

# roles/mysql/tasks/main.yml
- name: Install MySQL
  yum:
    name: mysql-community-server
    state: present

- name: Copy MySQL configuration
  template:
    src: my.cnf.j2
    dest: /etc/my.cnf
  notify:
    - Restart MySQL

- name: Start MySQL service
  service:
    name: mysqld
    state: started
    enabled: yes

# roles/mysql/templates/my.cnf.j2
[mysqld]
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid
server-id={{ ansible_fqdn }}

5. mha角色

mha角色用于安装和配置MHA:

# roles/mha/tasks/main.yml
- name: Install MHA Node
  yum:
    name: mha4mysql-node
    state: present

- name: Install MHA Manager
  yum:
    name: mha4mysql-manager
    state: present
  when: inventory_hostname in groups['mha_manager']

- name: Copy MHA configuration
  template:
    src: app1.cnf.j2
    dest: /etc/mha/app1.cnf
  when: inventory_hostname in groups['mha_manager']

- name: Start MHA Manager
  command: masterha_manager --conf=/etc/mha/app1.cnf
  when: inventory_hostname in groups['mha_manager']

# roles/mha/templates/app1.cnf.j2
[server default]
user=mha_user
password=mha_password
repl_user=repl_user
repl_password=repl_password

[server1]
hostname=master_node
candidate_master=1

[server2]
hostname=slave1_node

[server3]
hostname=slave2_node

[binlog_server]
hostname=slave2_node

[mysql_server]
hostname=mha_manager_node

6. site.yml文件

site.yml文件用于定义整个部署流程:

# site.yml
- name: Deploy MySQL MHA Cluster
  hosts: all
  become: yes
  roles:
    - common
    - mysql
    - mha

四、执行Ansible playbook

在管理节点上执行以下命令,开始部署MySQL MHA集群:

ansible-playbook -i inventory site.yml

五、验证部署结果

部署完成后,可以通过以下步骤验证集群状态:

  1. 检查MySQL服务
ansible all -m shell -a "systemctl status mysqld"
  1. 检查MHA管理节点状态
ansible mha_manager -m shell -a "masterha_check_status --conf=/etc/mha/app1.cnf"

六、总结

通过使用Ansible自动化部署MySQL MHA高可用集群,我们可以极大地简化部署过程,提高运维效率。本文提供了一个基本的实践指南,读者可以根据实际需求进行扩展和定制。希望本文能对你有所帮助,祝你在高可用数据库运维的道路上越走越远!