一、数据库主从复制的概念
数据库主从复制是一种常用的技术,用于提高数据库系统的可用性、性能和可靠性。通过将数据从主数据库(master)复制到从数据库(slave),可以实现数据的备份、负载均衡和高可用性。以下是对数据库主从复制的详细解释及其在MySQL中的具体实现步骤和示例。
1. 主从复制的基本原理
主从复制是指将一个数据库实例作为主库,将其数据实时地复制到一个或多个从库中。主库负责处理所有的写操作(如插入、更新、删除),而从库通常只处理读操作。通过主从复制,应用可以将读请求分布到多个从库上,从而提高系统的读性能。
2. 主从复制的类型
- 异步复制(Asynchronous Replication):主库在执行完写操作后即返回,不等待从库完成复制。这种方式具有较低的延迟,但可能导致主从数据不一致。
- 半同步复制(Semi-Synchronous Replication):主库在写操作完成后,会等待至少一个从库确认数据已被接收。这种方式保证了一定程度的数据一致性。
- 同步复制(Synchronous Replication):主库在写操作完成后,必须等待所有从库都确认接收到数据才会返回。这种方式确保了主从数据的一致性,但会增加操作延迟。
3. 主从复制的优点
- 数据备份:从库可以作为主库的实时备份,一旦主库发生故障,从库可以快速切换为主库。
- 负载均衡:通过将读操作分配给从库,可以减少主库的负载,提高系统的整体性能。
- 高可用性:主从复制提高了系统的容错能力,使得系统在单点故障时仍能保持服务可用。
二、MySQL主从复制的实现
以下是MySQL数据库中实现主从复制的详细步骤,基于CentOS系统进行演示。
1. 环境准备
假设我们有两台服务器:
-
主库(Master):
- IP地址:192.168.1.10
- MySQL版本:5.7或更高
-
从库(Slave):
- IP地址:192.168.1.20
- MySQL版本:5.7或更高
确保两台服务器上的MySQL版本兼容,并且从库可以通过网络访问主库。
2. 主库配置
在主库上进行以下配置:
2.1 修改MySQL配置文件
编辑MySQL的配置文件/etc/my.cnf
,添加以下内容:
[mysqld]
# 开启二进制日志
log-bin=mysql-bin
# 设置服务器ID,确保在主从环境中唯一
server-id=1
# 配置用于复制的数据库(可选)
binlog-do-db=your_database_name
# 排除不需要复制的数据库(可选)
# binlog-ignore-db=example_db
2.2 创建复制用户
在MySQL中创建一个用于复制的用户,并赋予REPLICATION SLAVE权限:
-- 登录MySQL
mysql -u root -p
-- 创建复制用户
CREATE USER 'replicator'@'%' IDENTIFIED BY 'your_password';
GRANT REPLICATION SLAVE ON *.* TO 'replicator'@'%';
FLUSH PRIVILEGES;
2.3 锁定主库
为了获取当前的二进制日志文件名和位置,需要锁定主库以确保数据一致性:
-- 锁定数据库
FLUSH TABLES WITH READ LOCK;
-- 获取二进制日志状态
SHOW MASTER STATUS;
记下输出中的File
和Position
信息,例如:
+------------------+----------+--------------+------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+------------------+----------+--------------+------------------+
| mysql-bin.000001 | 154 | | |
+------------------+----------+--------------+------------------+
2.4 备份主库
锁定数据库后,立即进行数据库备份。可以使用mysqldump
进行备份:
mysqldump -u root -p --all-databases --master-data > master_backup.sql
完成备份后,解除锁定:
-- 解除锁定
UNLOCK TABLES;
3. 从库配置
在从库上进行以下配置:
3.1 修改MySQL配置文件
编辑MySQL的配置文件/etc/my.cnf
,添加以下内容:
[mysqld]
# 设置服务器ID,确保在主从环境中唯一
server-id=2
# 关闭二进制日志(从库通常不需要开启,除非从库也作为其他从库的主库)
# log-bin=mysql-bin
# 配置从库不需要同步的数据库(可选)
# replicate-ignore-db=example_db
3.2 导入主库备份
将主库备份文件master_backup.sql
复制到从库,导入到MySQL中:
mysql -u root -p < master_backup.sql
3.3 配置复制参数
在从库中执行以下SQL语句,设置主库信息:
-- 登录MySQL
mysql -u root -p
-- 配置主库信息
CHANGE MASTER TO
MASTER_HOST='192.168.1.10',
MASTER_USER='replicator',
MASTER_PASSWORD='your_password',
MASTER_LOG_FILE='mysql-bin.000001', -- 上述获取的二进制日志文件名
MASTER_LOG_POS=154; -- 上述获取的二进制日志位置
3.4 启动从库复制
启动从库复制线程,并检查复制状态:
-- 启动从库
START SLAVE;
-- 检查从库状态
SHOW SLAVE STATUS\G
在输出中,确保Slave_IO_Running
和Slave_SQL_Running
均为Yes
,表示复制正常运行。
4. 验证主从复制
在主库中执行一些数据操作,然后在从库中验证数据是否同步:
在主库中执行操作
USE your_database_name;
-- 插入数据
INSERT INTO your_table (column1, column2) VALUES ('value1', 'value2');
-- 更新数据
UPDATE your_table SET column1 = 'new_value' WHERE column2 = 'value2';
-- 删除数据
DELETE FROM your_table WHERE column1 = 'new_value';
在从库中验证
USE your_database_name;
-- 查询数据
SELECT * FROM your_table;
如果从库中的数据与主库一致,说明主从复制成功。
三、完整主从复制示例
示例1:MySQL主从复制
假设我们有一个数据库shop
,其中包含一个商品表products
。我们将在两台服务器上实现主从复制。
环境准备
-
主库(Master):
- IP地址:192.168.1.10
- 数据库名:
shop
-
从库(Slave):
- IP地址:192.168.1.20
主库配置
-
修改配置文件
编辑
/etc/my.cnf
,添加:[mysqld] log-bin=mysql-bin server-id=1
-
创建复制用户
mysql -u root -p CREATE USER 'replicator'@'%' IDENTIFIED BY 'password'; GRANT REPLICATION SLAVE ON *.* TO 'replicator'@'%'; FLUSH PRIVILEGES;
-
锁定主库并获取日志位置
FLUSH TABLES WITH READ LOCK; SHOW MASTER STATUS;
输出示例:
+------------------+----------+ | File | Position | +------------------+----------+ | mysql-bin.000002 | 120 | +------------------+----------+
-
备份数据库
mysqldump -u root -p --all-databases --master-data > master_backup.sql
-
解除锁定
UNLOCK TABLES;
从库配置
-
修改配置文件
编辑
/etc/my.cnf
,添加:[mysqld] server-id=2
-
导入主库备份
mysql -u root -p < master_backup.sql
-
配置复制参数
mysql -u root -p CHANGE MASTER TO MASTER_HOST='192.168.1.10', MASTER_USER='replicator', MASTER_PASSWORD='password', MASTER_LOG_FILE='mysql-bin.000002', MASTER_LOG_POS=120;
-
启动从库
START SLAVE;
-
检查状态
SHOW SLAVE STATUS\G
确保
Slave_IO_Running
和Slave_SQL_Running
均为Yes
。
验证主从复制
在主库中执行以下操作:
USE shop;
INSERT INTO products (name, price) VALUES ('Laptop', 999.99);
在从库中查询:
USE shop;
SELECT * FROM products;
如果从库中能看到插入的数据,说明主从复制成功。
示例2:MariaDB主从复制
MariaDB的主从复制配置类似于MySQL。假设我们在两个MariaDB服务器上实现主从复制。
环境准备
-
主库(Master):
- IP地址:192.168.1.30
- 数据库名:
inventory
-
从库(Slave):
- IP地址:192.168.1.40
主库配置
-
修改配置文件
编辑
/etc/my.cnf.d/server.cnf
,添加:[mysqld] log-bin=mariadb-bin server-id=1
-
创建复制用户
mysql -u root -p CREATE USER 'replicator'@'%' IDENTIFIED BY 'password'; GRANT REPLICATION SLAVE ON *.* TO 'replicator'@'%'; FLUSH PRIVILEGES;
-
锁定主库并获取日志位置
FLUSH TABLES WITH READ LOCK; SHOW MASTER STATUS;
输出示例:
+-------------------+----------+ | File | Position | +-------------------+----------+ | mariadb-bin.00001 | 345 | +-------------------+----------+
-
备份数据库
mysqldump -u root -p --all-databases --master-data > master_backup.sql
-
解除锁定
UNLOCK TABLES;
从库配置
-
修改配置文件
编辑
/etc/my.cnf.d/server.cnf
,添加:[mysqld] server-id=2
-
导入主库备份
mysql -u root -p < master_backup.sql
-
配置复制参数
mysql -u root -p CHANGE MASTER TO MASTER_HOST='192.168.1.30', MASTER_USER='replicator', MASTER_PASSWORD='password', MASTER_LOG_FILE='mariadb-bin.00001', MASTER_LOG_POS=345;
-
启动从库
START SLAVE;
-
检查状态
SHOW SLAVE STATUS\G
确保
Slave_IO_Running
和Slave_SQL_Running
均为Yes
。
验证主从复制
在主库中执行以下操作:
USE inventory;
INSERT INTO items (item_name, quantity) VALUES ('Monitor', 50);
在从库中查询:
USE inventory;
SELECT * FROM items;
如果从库中能看到插入的数据,说明主从复制成功。
非常感谢您读到这里!如果您觉得这篇文章对您有帮助,可以关注一下博主。关注后,您将第一时间获得最新的AI、云计算、运维(Linux、数据库,容器等)技术,以及更多实用的技能干货。
提供丰富的学习资源和实践经验,让你快速掌握AI技能;提供最新的行业动态和应用案例,帮助你在AI领域脱颖而出。