主从复制(Master-Slave Replication)是数据库的一种数据备份和数据冗余技术,它可以在多个数据库实例之间复制数据,从而提高数据库的可靠性和读写性能。在主从复制中,主数据库(Master)处理所有的写操作,而从数据库(Slave)负责从主数据库同步数据并处理读操作。
下面是详细的主从复制配置步骤和代码示例,假设使用的是 MySQL 数据库。
1. 主从复制的基本概念
- 主数据库(Master):负责处理所有的写操作(INSERT、UPDATE、DELETE),并记录这些操作到二进制日志(Binary Log)中。
- 从数据库(Slave):从主数据库读取二进制日志并重放这些日志,以保持与主数据库的数据一致。
2. 主从复制配置步骤
2.1 主数据库配置
- 修改主数据库配置文件(
my.cnf
或my.ini
):
[mysqld]
server-id = 1
log-bin = mysql-bin
binlog-do-db = your_database_name # 将 'your_database_name' 替换为实际的数据库名
- 重启主数据库:
sudo systemctl restart mysql
- 在主数据库上创建复制用户:
CREATE USER 'replica_user'@'%' IDENTIFIED BY 'replica_password';
GRANT REPLICATION SLAVE ON *.* TO 'replica_user'@'%';
FLUSH PRIVILEGES;
- 获取二进制日志信息:
SHOW MASTER STATUS;
记下 File
和 Position
的值,将在配置从数据库时使用。
2.2 从数据库配置
- 修改从数据库配置文件(
my.cnf
或my.ini
):
[mysqld]
server-id = 2
relay-log = mysql-relay-bin
- 重启从数据库:
sudo systemctl restart mysql
- 在从数据库上设置复制:
CHANGE MASTER TO
MASTER_HOST='master_host_ip',
MASTER_USER='replica_user',
MASTER_PASSWORD='replica_password',
MASTER_LOG_FILE='mysql-bin.000001', # 替换为获取的 File 值
MASTER_LOG_POS=123; # 替换为获取的 Position 值
START SLAVE;
- 检查复制状态:
SHOW SLAVE STATUS\G;
确保 Slave_IO_Running
和 Slave_SQL_Running
均为 Yes
。
3. 检查和维护主从复制
3.1 检查复制状态
在从数据库上运行以下命令以检查复制状态:
SHOW SLAVE STATUS\G;
关键字段解释:
Slave_IO_Running
和Slave_SQL_Running
:应为Yes
。Seconds_Behind_Master
:从数据库落后于主数据库的时间,通常应为 0 或接近 0。Last_Error
:最近一次复制错误的详细信息。
3.2 停止和启动复制
如果需要停止或启动复制,可以使用以下命令:
-- 停止复制
STOP SLAVE;
-- 启动复制
START SLAVE;
3.3 处理复制错误
如果复制过程中出现错误,可以通过以下步骤进行处理:
- 查看错误信息:
SHOW SLAVE STATUS\G;
- 跳过错误(不建议长期使用,最好找到并解决根本问题):
-- 跳过当前错误
SET GLOBAL SQL_SLAVE_SKIP_COUNTER = 1;
START SLAVE;
- 重新同步从数据库(如果错误无法解决,可以考虑重新初始化从数据库):
- 停止从数据库的复制:
STOP SLAVE;
- 在主数据库上锁表并创建数据快照:
FLUSH TABLES WITH READ LOCK;
SHOW MASTER STATUS;
- 复制主数据库的数据文件到从数据库(可以使用
mysqldump
工具):
mysqldump -u root -p --all-databases --master-data > master_data_dump.sql
- 解锁主数据库表:
UNLOCK TABLES;
- 在从数据库上导入数据:
mysql -u root -p < master_data_dump.sql
- 恢复从数据库的复制:
CHANGE MASTER TO
MASTER_HOST='master_host_ip',
MASTER_USER='replica_user',
MASTER_PASSWORD='replica_password',
MASTER_LOG_FILE='mysql-bin.000001', # 替换为获取的 File 值
MASTER_LOG_POS=123; # 替换为获取的 Position 值
START SLAVE;
4. 自动故障转移和负载均衡
在生产环境中,考虑使用自动故障转移和负载均衡工具,如 MHA(Master High Availability)、Orchestrator 或 ProxySQL。
4.1 使用 Orchestrator 进行主从复制管理
Orchestrator 是一个开源的 MySQL 高可用和复制管理工具。
- 安装 Orchestrator:
参考 Orchestrator 官方文档 进行安装和配置。
- 配置 Orchestrator:
配置文件示例:
InstanceDBFile = "/usr/local/orchestrator/orchestrator.sqlite3"
MySQLTopologyUser = "orchestrator"
MySQLTopologyPassword = "orchestrator_password"
- 启动 Orchestrator:
orchestrator -c discover -i master_host_ip
通过 Web 界面管理主从复制拓扑。
小结
实施主从复制可以显著提高数据库系统的可靠性和性能。通过详细的配置步骤和示例代码,您可以轻松地设置 MySQL 主从复制。在实际生产环境中,推荐使用自动化工具(如 Orchestrator)来简化复制管理和故障处理。