mysql设置主从数据库的同步

本文详细介绍了如何通过MysqlReplication实现服务器负载均衡,包括读写分离和数据备份,以及如何配置一主多备、双主互备和一从多主架构。涵盖了从环境准备到实际操作的全过程,重点讲解了主从复制原理和常见配置方法。

1.业务场景

  • 场景1:实现服务器负载均衡
    若我们所有的业务代码存于一个服务器上,而这个服务器有的时候回宕机,导致业务停顿,造成影响。这个时候 就需要做高可用,在数据库的处理上如果两个mysql实现高可用,避免单点问题。
  • 场景2:读写分离;master写,其他slave读,这种架构最大问题I/O压力集中在Master上;
  • 场景3:通过复制实现数据的异地备份
    可以定期的将数据从主服务器上复制到从服务器上,这无疑是先了数据的异地备份。在传统的备份体制下,是将数据备份在本地。此时备份 作业与数据库服务器运行在同一台设备上,当备份作业运行时就会影响到服务器的正常运行。有时候会明显的降低服务器的性能。同时,将备份数据存放在本地,也 不是很安全。如硬盘因为电压等原因被损坏或者服务器被失窃,此时由于备份文件仍然存放在硬盘上,数据库管理员无法使用备份文件来恢复数据。这显然会给企业 带来比较大的损失。

2.实现的目标

一台服务器充当主数据库服务器,另一台或多台服务器充当从数据库服务器,主服务器中的数据自动复制到从服务器之中。对于多级复制,数据库服务器即可充当主机,也可充当从机。
一句话表示就是,主数据库做什么,从数据库就跟着做什么。

3.原理

我们的主从复制基于Mysql Replication来进行实现

3.1 什么是Mysql Replication

Replication可以实现将数据从一台数据库服务器(master)复制到一台或多台数据库服务器(slave)

  • 默认情况下属于异步复制,无需维持长连接
  • 通过配置,可以复制所有的库或者几个库,甚至库中的一些表
  • 是MySQL内建的,本身自带的

3.2 Mysql Replication的原理

简单的说就是master将数据库的改变写入二进制日志,slave同步这些二进制日志,并根据这些二进制日志进行数据操作。
在这里插入图片描述

注意:

  • DML表示SQL操作语句如:update, insert,delete
  • Relay log :中继日志

整体上来说,复制有3个步骤:
(1) master将改变记录到二进制日志(binary log)中(这些记录叫做二进制日志事件,binary log events)
(2) slave将master的binary log events拷贝到它的中继日志(relay log)
(3) slave重做中继日志中的事件,修改salve上的数据。

3.3 My Replication的作用

  • Fail Over 故障切换
  • Backup Server 备份服务,无法对SQL语句执行产生的故障恢复,有限的备份
  • High Performance 高性能,可以多台slave,实现读写分离
    在这里插入图片描述

3.4 MySQL主从复制

第一步:master记录二进制日志

在每个事务更新数据完成之前,master在二进制日志记录这些改变。MySQL将事务写入二进制日志,即使事务中的语句都是交叉执行的。在事件写入二进制日志完成后,master通知存储引擎提交事务。

第二步:slave将master的binary log拷贝到它自己的中继日志

首先,slave开始一个工作线程—I/O线程。I/O线程在master上打开一个普通的连接,然后开始binlog dump process。Binlog dump process从master的二进制日志中读取事件,如果已经执行完master产生的所有文件,它会睡眠并等待master产生新的事件。I/O线程将这些事件写入中继日志。

第三步:SQL slave thread(SQL从线程)处理该过程的最后一步

SQL线程从中继日志读取事件,并重新执行其中的事件而更新slave的数据,使其与master中的数据一致。

4 My Replication常见方案

One master and Muti salve 一主多备(MS)

在这里插入图片描述

一般用来做读写分离的,master写,其他slave读,这种架构最大问题I/O压力集中在Master上<多台同步影响IO>

M-S-S

使用一台slave作为中继,分担Master的压力,slave中继需要开启bin-log,并配置log-slave-updates
在这里插入图片描述

Slave中继可使用Black-hole存储引擎,不会把数据存储到磁盘,只记录二进制日志。

M-M 双主互备(互为主从)

每个服务器需要做同样的同步更新,破坏了事物的隔离性和数据的一致性。
在这里插入图片描述

M-M-M

监控三台机器互相作对方的master
在这里插入图片描述

天生的缺陷:复制延迟,slave上同步要慢于master,如果大并发的情况那延迟更严重。
mysql在5.6已经自身可以实现fail over故障切换

One slave Muti master 一从对多主

好处:节省成本,将多个master数据自动化整合
缺陷:对库和表数据的修改较多

5.实现

5.1 环境准备

本地安装两个mysql,或者使用虚拟机,或者使用docker安装,需要准备两个mysql,本文使用docker安装
在docker中先创建两个mysql服务器
主服务器:3308
从服务器:3309
在这里插入图片描述

不会创建?点击此处

5.2 修改 my.cnf配置文件

  • master的my.cnf配置文件

#mysql master1 config 
[mysqld]
server-id = 1        # 节点ID,确保唯一

# log config
log-bin = mysql-bin     #开启mysql的binlog日志功能
sync_binlog = 1         #控制数据库的binlog刷到磁盘上去 , 0 不控制,性能最好,1每次事物提交都会刷到日志文件中,性能最差,最安全
binlog_format = mixed   #binlog日志格式,mysql默认采用statement,建议使用mixed
expire_logs_days = 7                           #binlog过期清理时间
max_binlog_size = 100m                    #binlog每个日志文件大小
binlog_cache_size = 4m                        #binlog缓存大小
max_binlog_cache_size= 512m              #最大binlog缓存大
binlog-ignore-db=mysql #不生成日志文件的数据库,多个忽略数据库可以用逗号拼接,或者 复制这句话,写多行

auto-increment-offset = 1     # 自增值的偏移量
auto-increment-increment = 1  # 自增值的自增量
slave-skip-errors = all #跳过从库错误

  • slave1的my.cnf配置文件
[mysqld]
server-id = 2
log-bin=mysql-bin
relay-log = mysql-relay-bin
replicate-wild-ignore-table=mysql.%
replicate-wild-ignore-table=test.%
replicate-wild-ignore-table=information_schema.%

6.进入master数据库,创建复制用户并授权

依次执行

CREATE USER repl_user IDENTIFIED BY 'root';
CREATE USER 'repl_user'@'172.17.0.1' IDENTIFIED BY 'root';
CREATE USER 'repl_user'@'192.168.1.2' IDENTIFIED BY 'root';

root表示该用户的用户密码
在这里插入图片描述

你只需要修改的是将 192.168.1.2改为你自己主机的ip地址即可
查看自己创建用户是否成功

 SELECT User, Host FROM mysql.user;

在这里插入图片描述

6.1 赋予该用户复制的权利

依次执行

grant replication slave on *.* to 'repl_user'@'%';
grant replication slave on *.* to 'repl_user'@'172.17.0.1';
grant replication slave on *.* to 'repl_user'@'192.168.1.2';

FLUSH PRIVILEGES;

在这里插入图片描述
注意:我们接下来进行一个很重要的步骤,就是修改主库repl_user的plugin
依次执行以操作:

alter user 'repl_user'@'%' identified with mysql_native_password by 'root';
alter user 'repl_user'@'172.17.0.1' identified with mysql_native_password by 'root';
alter user 'repl_user'@'192.168.1.2' identified with mysql_native_password by 'root';

在这里插入图片描述

6.2 查看master的状态

show master status;

在这里插入图片描述

7.配置从库

登录进入从库的mysql服务内执行以下命令

CHANGE MASTER TO 
MASTER_HOST = 'localhost',  
MASTER_USER = 'repl_user', 
MASTER_PASSWORD = 'root',
MASTER_PORT = 3308,
MASTER_LOG_FILE='binlog.000002',
MASTER_LOG_POS=1374,
MASTER_RETRY_COUNT = 60,
MASTER_HEARTBEAT_PERIOD = 10000; 

在这里插入图片描述

注意你要修改以下内容:
在这里插入图片描述

7.1 启动从库slave进程

start slave;

附:停止从库进程:stop slave;
在这里插入图片描述

7.2 查看是否配置成功

show slave status\G

在这里插入图片描述

当这两个信息 都为yes时说明你配置成功啦。

8.测试主从同步

我用navicat连接到主库和从库
在这里插入图片描述

接下来我先在master中创建一个数据库test1
在这里插入图片描述

然后刷新salve
然后会发现salve中也会出现一个test1数据库
在这里插入图片描述

至此我们的主从同步就完全实现了

<think>嗯,用户想配置MySQL主从复制,我得先理清楚步骤。首先,主从复制的基本原理是主库记录二进制日志,从库读取这些日志并应用。需要确保主库和从库的server-id不同,这是关键。然后,用户可能已经安装了MySQL,但可能需要检查版本是否兼容。主从复制的配置通常涉及修改配置文件,比如主库的my.cnf里要启用log-bin和设置server-id,从库则要设置server-id、中继日志等。记得提醒用户重启服务使配置生效。 接下来,主库上需要创建一个复制专用的用户,并授予REPLICATION SLAVE权限。这部分可能容易出错,用户得确保用户名和密码正确,权限也正确。然后查看主库的状态,记录File和Position,这些信息在配置从库时会用到。 在从库配置部分,用户需要指定主库的信息,包括主机地址、端口、用户名、密码,还有刚才记录的File和Position。启动从库的复制线程后,要检查Slave_IO_Running和Slave_SQL_Running是否为Yes,否则需要排查错误。 用户可能遇到的问题包括网络连接问题、权限不足、server-id重复,或者二进制日志文件不一致。需要提醒用户检查防火墙设置,确保主从库之间的端口开放。另外,如果主库已经有数据,可能需要先同步现有数据,比如使用mysqldump导出,再导入到从库,保证数据一致性。可能还需要提到一些可选配置,比如从库设置为只读,避免数据冲突。还有半同步复制或GTID的配置,但用户如果是初次配置,可能不需要太复杂的内容,先保证基本的主从复制成功。最后,生成相关问题时,要考虑用户可能的后续需求,比如性能优化、主从切换、故障处理等。这样可以帮助用户进一步学习相关的内容,解决实际应用中的问题。</think>### MySQL主从复制配置步骤 #### 一、主库(Master)配置 1. **修改MySQL配置文件** 在`/etc/my.cnf`或`/etc/mysql/mysql.conf.d/mysqld.cnf`中添加: ```ini [mysqld] server-id = 1 # 唯一ID,主从不能重复 log-bin = mysql-bin # 启用二进制日志 binlog-do-db = mydb2,mydb3 # 指定需要复制的数据库(可选) ``` 重启MySQL服务: ```bash systemctl restart mysqld ``` 2. **创建复制用户** 登录主库执行: ```sql CREATE USER 'repl_user'@'%' IDENTIFIED BY 'password'; GRANT REPLICATION SLAVE ON *.* TO 'repl_user'@'%'; FLUSH PRIVILEGES; ``` 3. **查看主库状态** 记录`File`和`Position`值(从库配置需要): ```sql SHOW MASTER STATUS; ``` 输出示例: ``` +------------------+----------+--------------+------------------+ | File | Position | Binlog_Do_DB | Binlog_Ignore_DB | +------------------+----------+--------------+------------------+ | mysql-bin.000001 | 154 | mydb2,mydb3 | | +------------------+----------+--------------+------------------+ ``` #### 二、从库(Slave)配置 1. **修改MySQL配置文件** 添加以下配置: ```ini [mysqld] server-id = 2 # 唯一ID,与主库不同 relay-log = mysql-relay-bin # 启用中继日志 read_only = ON # 从库只读(可选) ``` 2. **设置主库连接信息** 登录从库执行: ```sql CHANGE MASTER TO MASTER_HOST='主库IP', MASTER_USER='repl_user', MASTER_PASSWORD='password', MASTER_LOG_FILE='mysql-bin.000001', MASTER_LOG_POS=154; ``` 3. **启动复制线程** ```sql START SLAVE; ``` 4. **检查复制状态** ```sql SHOW SLAVE STATUS\G ``` 确认`Slave_IO_Running`和`Slave_SQL_Running`均为`Yes`。 #### 三、同步现有数据(可选) 若主库已有数据,需先手动同步: ```bash mysqldump -u root -p --databases mydb2 mydb3 > dump.sql mysql -u root -p < dump.sql ``` #### 四、验证主从同步 1. 在主库执行数据操作(如`INSERT`)。 2. 在从库查询对应表,观察数据是否一致。 --- ### 常见问题排查 1. **主从连接失败** - 检查防火墙是否开放`3306`端口。 - 验证`repl_user`权限是否配置正确[^2]。 2. **数据不一致** - 确认`server-id`唯一。 - 检查`binlog-do-db`是否包含目标数据库[^4]。 ---
评论 3
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

ZNineSun

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

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

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

打赏作者

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

抵扣说明:

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

余额充值