Mysql

关注公众号 jb51net

关闭
首页 > 数据库 > Mysql > mysql设置主从数据库的同步

mysql如何设置主从数据库的同步

作者:ZNineSun

这篇文章主要介绍了mysql如何设置主从数据库的同步问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教

1.业务场景

场景1:实现服务器负载均衡

若我们所有的业务代码存于一个服务器上,而这个服务器有的时候回宕机,导致业务停顿,造成影响。这个时候 就需要做高可用,在数据库的处理上如果两个mysql实现高可用,避免单点问题。

场景2:读写分离;master写,其他slave读,这种架构最大问题I/O压力集中在Master上;

场景3:通过复制实现数据的异地备份

可以定期的将数据从主服务器上复制到从服务器上,这无疑是先了数据的异地备份。在传统的备份体制下,是将数据备份在本地。此时备份 作业与数据库服务器运行在同一台设备上,当备份作业运行时就会影响到服务器的正常运行。有时候会明显的降低服务器的性能。同时,将备份数据存放在本地,也 不是很安全。如硬盘因为电压等原因被损坏或者服务器被失窃,此时由于备份文件仍然存放在硬盘上,数据库管理员无法使用备份文件来恢复数据。这显然会给企业 带来比较大的损失。

2.实现的目标

一台服务器充当主数据库服务器,另一台或多台服务器充当从数据库服务器,主服务器中的数据自动复制到从服务器之中。

对于多级复制,数据库服务器即可充当主机,也可充当从机。

一句话表示就是,主数据库做什么,从数据库就跟着做什么。

3.原理

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

3.1 什么是Mysql Replication

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

3.2 Mysql Replication的原理

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

注意:

整体上来说,复制有3个步骤:

(1) master将改变记录到二进制日志(binary log)中(这些记录叫做二进制日志事件,binary log events)

(2) slave将master的binary log events拷贝到它的中继日志(relay log)

(3) slave重做中继日志中的事件,修改salve上的数据。

3.3 My Replication的作用

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数据库

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

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

您可能感兴趣的文章:
阅读全文