高性能数据库架构:掌握主从复制技术

在这里插入图片描述

一、数据库主从复制的概念

数据库主从复制是一种常用的技术,用于提高数据库系统的可用性、性能和可靠性。通过将数据从主数据库(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;

记下输出中的FilePosition信息,例如:

+------------------+----------+--------------+------------------+
| 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_RunningSlave_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

主库配置

  1. 修改配置文件

    编辑/etc/my.cnf,添加:

    [mysqld]
    log-bin=mysql-bin
    server-id=1
    
  2. 创建复制用户

    mysql -u root -p
    
    CREATE USER 'replicator'@'%' IDENTIFIED BY 'password';
    GRANT REPLICATION SLAVE ON *.* TO 'replicator'@'%';
    FLUSH PRIVILEGES;
    
  3. 锁定主库并获取日志位置

    FLUSH TABLES WITH READ LOCK;
    SHOW MASTER STATUS;
    

    输出示例:

    +------------------+----------+
    | File             | Position |
    +------------------+----------+
    | mysql-bin.000002 |      120 |
    +------------------+----------+
    
  4. 备份数据库

    mysqldump -u root -p --all-databases --master-data > master_backup.sql
    
  5. 解除锁定

    UNLOCK TABLES;
    

从库配置

  1. 修改配置文件

    编辑/etc/my.cnf,添加:

    [mysqld]
    server-id=2
    
  2. 导入主库备份

    mysql -u root -p < master_backup.sql
    
  3. 配置复制参数

    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;
    
  4. 启动从库

    START SLAVE;
    
  5. 检查状态

    SHOW SLAVE STATUS\G
    

    确保Slave_IO_RunningSlave_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

主库配置

  1. 修改配置文件

    编辑/etc/my.cnf.d/server.cnf,添加:

    [mysqld]
    log-bin=mariadb-bin
    server-id=1
    
  2. 创建复制用户

    mysql -u root -p
    
    CREATE USER 'replicator'@'%' IDENTIFIED BY 'password';
    GRANT REPLICATION SLAVE ON *.* TO 'replicator'@'%';
    FLUSH PRIVILEGES;
    
  3. 锁定主库并获取日志位置

    FLUSH TABLES WITH READ LOCK;
    SHOW MASTER STATUS;
    

    输出示例:

    +-------------------+----------+
    | File              | Position |
    +-------------------+----------+
    | mariadb-bin.00001 |      345 |
    +-------------------+----------+
    
  4. 备份数据库

    mysqldump -u root -p --all-databases --master-data > master_backup.sql
    
  5. 解除锁定

    UNLOCK TABLES;
    

从库配置

  1. 修改配置文件

    编辑/etc/my.cnf.d/server.cnf,添加:

    [mysqld]
    server-id=2
    
  2. 导入主库备份

    mysql -u root -p < master_backup.sql
    
  3. 配置复制参数

    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;
    
  4. 启动从库

    START SLAVE;
    
  5. 检查状态

    SHOW SLAVE STATUS\G
    

    确保Slave_IO_RunningSlave_SQL_Running均为Yes

验证主从复制

在主库中执行以下操作:

USE inventory;

INSERT INTO items (item_name, quantity) VALUES ('Monitor', 50);

在从库中查询:

USE inventory;

SELECT * FROM items;

如果从库中能看到插入的数据,说明主从复制成功。

非常感谢您读到这里!如果您觉得这篇文章对您有帮助,可以关注一下博主。关注后,您将第一时间获得最新的AI、云计算、运维(Linux、数据库,容器等)技术,以及更多实用的技能干货。

提供丰富的学习资源和实践经验,让你快速掌握AI技能;提供最新的行业动态和应用案例,帮助你在AI领域脱颖而出。

  • 15
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

周同学的技术栈

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值