使用 Ansible 安装 MySQL 主从复制

在现代企业环境中,数据库的高可用性和数据的及时备份变得愈加重要。MySQL 作为一种流行的关系型数据库,常用于构建可扩展和高可用的应用程序。本文将介绍如何使用 Ansible 安装 MySQL 并设置主从复制。

什么是 MySQL 主从复制?

MySQL 的主从复制是一种数据冗余和负载均衡的策略。通过在主数据库上进行写操作,然后将其数据复制到一个或多个从数据库,您可以:

  • 提高读取操作的性能。
  • 增强容错能力和数据安全性。
  • 实现数据备份和恢复策略。

Ansible 简介

Ansible 是一个简单而强大的 IT 自动化工具,能够帮助用户快速配置和管理大规模的基础设施。使用 Ansible,您可以通过编写简单的 YAML 文件来自动化应用程序的安装和配置。

环境准备

在开始之前,您需要准备以下环境:

  • 至少两台服务器:一台作为 MySQL 主服务器,另一台作为从服务器。
  • 安装了 Ansible 的控制节点。
  • 确保所有服务器可以通过 SSH 无密码访问。

Ansible Inventory

首先,您需要创建一个 Ansible Inventory 文件,列出将要被管理的主从服务器。

# inventory.ini
[mysql_master]
master ansible_host=192.168.1.100

[mysql_slave]
slave ansible_host=192.168.1.101

变量定义

接下来,我们可以定义一些变量,以便使用时更加灵活。创建一个名为 group_vars/mysql.yml 的文件:

# group_vars/mysql.yml
mysql_root_password: "your_root_password"
mysql_database: "your_database"
mysql_user: "your_user"
mysql_password: "your_user_password"

Ansible Playbook

接下来,我们将编写 Ansible Playbook 来进行 MySQL 的安装和配置。创建一个名为 mysql_setup.yml 的文件:

# mysql_setup.yml
---
- hosts: mysql_master
  become: true
  tasks:
    - name: Install MySQL Server
      apt:
        name: mysql-server
        state: present
        
    - name: Ensure MySQL is running
      service:
        name: mysql
        state: started
        enabled: yes

    - name: Set MySQL root password
      mysql_user:
        name: root
        host: localhost
        password: "{{ mysql_root_password }}"
        login_user: root
        login_password: ""
        state: present

    - name: Create database
      mysql_db:
        name: "{{ mysql_database }}"
        state: present

    - name: Create MySQL user
      mysql_user:
        name: "{{ mysql_user }}"
        password: "{{ mysql_password }}"
        host: '%'
        priv: '{{ mysql_database }}.*:ALL'
        state: present

    - name: Configure MySQL for Replication
      lineinfile:
        path: /etc/mysql/mysql.conf.d/mysqld.cnf
        regexp: '^{{ item.key }}'
        line: '{{ item.key }} = {{ item.value }}'
      with_items:
        - { key: 'server-id', value: '1' }
        - { key: 'log_bin', value: 'mysql-bin' }
        - { key: 'binlog_do_db', value: '{{ mysql_database }}' }
        
    - name: Restart MySQL Service
      service:
        name: mysql
        state: restarted

- hosts: mysql_slave
  become: true
  tasks:
    - name: Install MySQL Server
      apt:
        name: mysql-server
        state: present
        
    - name: Ensure MySQL is running
      service:
        name: mysql
        state: started
        enabled: yes

    - name: Set MySQL root password
      mysql_user:
        name: root
        host: localhost
        password: "{{ mysql_root_password }}"
        login_user: root
        login_password: ""
        state: present

    - name: Configure MySQL for Replication
      lineinfile:
        path: /etc/mysql/mysql.conf.d/mysqld.cnf
        regexp: '^{{ item.key }}'
        line: '{{ item.key }} = {{ item.value }}'
      with_items:
        - { key: 'server-id', value: '2' }

    - name: Restart MySQL Service
      service:
        name: mysql
        state: restarted

    - name: Set up Slave
      mysql_replication:
        master_host: "{{ hostvars['mysql_master']['ansible_host'] }}"
        master_user: "replication_user"
        master_password: "replication_password"
        state: present

关键配置说明

以上 Playbook 中,我们对 MySQL 主从进行了如下配置:

  • 在主服务器上设置了 server-id1,并开启了二进制日志。
  • 在从服务器上设置了 server-id2

执行 Ansible Playbook

使用以下命令执行 Playbook:

ansible-playbook -i inventory.ini mysql_setup.yml

验证主从复制

完成上述步骤后,您可以在主服务器上创建数据,并在从服务器上验证是否复制成功。

-- 在主服务器上执行
CREATE TABLE test (id INT PRIMARY KEY, name VARCHAR(50));
INSERT INTO test VALUES (1, 'Test Data');

-- 在从服务器上执行
SELECT * FROM test;

总结

通过使用 Ansible 自动化 MySQL 的安装和主从复制的配置,可以大大简化数据库管理的复杂性。同时,主从结构不仅能提高系统性能,还确保了数据的安全性。在本文中,我们介绍了使用 Ansible 安装 MySQL 的基本步骤,并通过示例代码展示了如何实现主从复制。希望这对您管理 MySQL 数据库有所帮助。