使用 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-id
为1
,并开启了二进制日志。 - 在从服务器上设置了
server-id
为2
。
执行 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 数据库有所帮助。