您当前的位置:首页 > 电脑百科 > 数据库 > MYSQL

MySql主从复制,从原理到实践

时间:2020-01-17 10:20:18  来源:  作者:

摘要

本文将从MySQL主从复制的原理出发,详细介绍MySql在Docker环境下的主从复制搭建,以一个主实例和一个从实例实现主从复制为例。

什么是主从复制?

主从复制是指将主数据库的DDL和DML操作通过二进制日志传到从数据库上,然后在从数据库上对这些日志进行重新执行,从而使从数据库和主数据库的数据保持一致。

主从复制的原理

  • MySql主库在事务提交时会把数据变更作为事件记录在二进制日志Binlog中;
  • 主库推送二进制日志文件Binlog中的事件到从库的中继日志Relay Log中,之后从库根据中继日志重做数据变更操作,通过逻辑复制来达到主库和从库的数据一致性;
  • MySql通过三个线程来完成主从库间的数据复制,其中Binlog Dump线程跑在主库上,I/O线程和SQL线程跑着从库上;
  • 当在从库上启动复制时,首先创建I/O线程连接主库,主库随后创建Binlog Dump线程读取数据库事件并发送给I/O线程,I/O线程获取到事件数据后更新到从库的中继日志Relay Log中去,之后从库上的SQL线程读取中继日志Relay Log中更新的数据库事件并应用,如下图所示。
MySql主从复制,从原理到实践

 

主实例搭建

  • 运行mysql主实例:
docker run -p 3307:3306 --name mysql-master -v /mydata/mysql-master/log:/var/log/mysql -v /mydata/mysql-master/data:/var/lib/mysql -v /mydata/mysql-master/conf:/etc/mysql -e MYSQL_ROOT_PASSword=root  -d mysql:5.7
  • 在mysql的配置文件夹/mydata/mysql-master/conf中创建一个配置文件my.cnf:
touch my.cnf
  • 修改配置文件my.cnf,配置信息如下:
[mysqld]## 设置server_id,同一局域网中需要唯一server_id=101 ## 指定不需要同步的数据库名称binlog-ignore-db=mysql  ## 开启二进制日志功能log-bin=mall-mysql-bin  ## 设置二进制日志使用内存大小(事务)binlog_cache_size=1M  ## 设置使用的二进制日志格式(mixed,statement,row)binlog_format=mixed  ## 二进制日志过期清理时间。默认值为0,表示不自动清理。expire_logs_days=7  ## 跳过主从复制中遇到的所有错误或指定类型的错误,避免slave端复制中断。## 如:1062错误是指一些主键重复,1032错误是因为主从数据库数据不一致slave_skip_errors=1062  
  • 修改完配置后重启实例:
docker restart mysql-master
  • 进入mysql-master容器中:
docker exec -it mysql-master /bin/bash
  • 在容器中使用mysql的登录命令连接到客户端:
mysql -uroot -proot
  • 创建数据同步用户:
CREATE USER 'slave'@'%' IDENTIFIED BY '123456';GRANT REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'slave'@'%';复制代码

从实例搭建

  • 运行mysql从实例:
docker run -p 3308:3306 --name mysql-slave -v /mydata/mysql-slave/log:/var/log/mysql -v /mydata/mysql-slave/data:/var/lib/mysql -v /mydata/mysql-slave/conf:/etc/mysql -e MYSQL_ROOT_PASSWORD=root  -d mysql:5.7
  • 在mysql的配置文件夹/mydata/mysql-slave/conf中创建一个配置文件my.cnf:
touch my.cnf
  • 修改配置文件my.cnf:
[mysqld]## 设置server_id,同一局域网中需要唯一server_id=102## 指定不需要同步的数据库名称binlog-ignore-db=mysql  ## 开启二进制日志功能,以备Slave作为其它数据库实例的Master时使用log-bin=mall-mysql-slave1-bin  ## 设置二进制日志使用内存大小(事务)binlog_cache_size=1M  ## 设置使用的二进制日志格式(mixed,statement,row)binlog_format=mixed  ## 二进制日志过期清理时间。默认值为0,表示不自动清理。expire_logs_days=7  ## 跳过主从复制中遇到的所有错误或指定类型的错误,避免slave端复制中断。## 如:1062错误是指一些主键重复,1032错误是因为主从数据库数据不一致slave_skip_errors=1062  ## relay_log配置中继日志relay_log=mall-mysql-relay-bin  ## log_slave_updates表示slave将复制事件写进自己的二进制日志log_slave_updates=1  ## slave设置为只读(具有super权限的用户除外)read_only=1  
  • 修改完配置后重启实例:
docker restart mysql-slave

将主从数据库进行连接

  • 连接到主数据库的mysql客户端,查看主数据库状态:
show master status;
  • 主数据库状态显示如下:
MySql主从复制,从原理到实践

 

 

  • 进入mysql-slave容器中:
docker exec -it mysql-slave /bin/bash
  • 在容器中使用mysql的登录命令连接到客户端:
mysql -uroot -proot
  • 在从数据库中配置主从复制:
change master to master_host='192.168.6.132', master_user='slave', master_password='123456', master_port=3307, master_log_file='mall-mysql-bin.000001', master_log_pos=617, master_connect_retry=30;  
  • 主从复制命令参数说明: master_host:主数据库的IP地址; master_port:主数据库的运行端口; master_user:在主数据库创建的用于同步数据的用户账号; master_password:在主数据库创建的用于同步数据的用户密码; master_log_file:指定从数据库要复制数据的日志文件,通过查看主数据的状态,获取File参数; master_log_pos:指定从数据库从哪个位置开始复制数据,通过查看主数据的状态,获取Position参数; master_connect_retry:连接失败重试的时间间隔,单位为秒。
  • 查看主从同步状态:
show slave status G;
  • 从数据库状态显示如下:
MySql主从复制,从原理到实践

 

  • 开启主从同步:
start slave;
  • 查看从数据库状态发现已经同步:
MySql主从复制,从原理到实践

 

 

主从复制测试

主从复制的测试方法有很多,可以在主实例中创建一个数据库,看看从实例中是否有该数据库,如果有,表示主从复制已经搭建成功。

  • 在主实例中创建一个数据库mall;
MySql主从复制,从原理到实践

 

  • 在从实例中查看数据库,发现也有一个mall数据库,可以判断主从复制已经搭建成功。
MySql主从复制,从原理到实践

 


作者:macroZheng
链接:https://juejin.im/post/5e1daba46fb9a02fb75d5e92



Tags:MySql 主从复制   点击:()  评论:()
声明:本站部分内容及图片来自互联网,转载是出于传递更多信息之目的,内容观点仅代表作者本人,如有任何标注错误或版权侵犯请与我们联系(Email:2595517585@qq.com),我们将及时更正、删除,谢谢。
▌相关推荐
Mysql 内建的复制功能是构建基于 Mysql 的大规模、高性能应用的基础,同时也是高可用性、可扩展性、灾难恢复、备份及数据仓库等工作的基础。通过本章内容,可以更好地理解主从...【详细内容】
2020-11-07  Tags: MySql 主从复制  点击:(141)  评论:(0)  加入收藏
摘要本文将从MySql主从复制的原理出发,详细介绍MySql在Docker环境下的主从复制搭建,以一个主实例和一个从实例实现主从复制为例。什么是主从复制?主从复制是指将主数据库的DDL...【详细内容】
2020-01-17  Tags: MySql 主从复制  点击:(74)  评论:(0)  加入收藏
一、简介Mysql作为目前世界上使用最广泛的免费数据库,在实际的生产环境中,由单台Mysql作为独立的数据库是完全不能满足实际需求的,无论是在安全性,高可用性以及高并发等各个方面...【详细内容】
2019-08-19  Tags: MySql 主从复制  点击:(196)  评论:(0)  加入收藏
▌简易百科推荐
作者:雷文霆 爱可生华东交付服务部 DBA 成员,主要负责Mysql故障处理及相关技术支持。爱好看书,电影。座右铭,每一个不曾起舞的日子,都是对生命的辜负。 本文来源:原创投稿 *爱可生...【详细内容】
2021-12-24  爱可生    Tags:MySQL   点击:(7)  评论:(0)  加入收藏
生成间隙(gap)锁、临键(next-key)锁的前提条件 是在 RR 隔离级别下。有关Mysql记录锁、间隙(gap)锁、临键锁(next-key)锁的一些理论知识之前有写过,详细内容可以看这篇文章...【详细内容】
2021-12-14  python数据分析    Tags:MySQL记录锁   点击:(18)  评论:(0)  加入收藏
binlog 基本认识 MySQL的二进制日志可以说是MySQL最重要的日志了,它记录了所有的DDL和DML(除了数据查询语句)语句,以事件形式记录,还包含语句所执行的消耗的时间,MySQL的二...【详细内容】
2021-12-14  linux上的码农    Tags:mysql   点击:(13)  评论:(0)  加入收藏
为查询优化你的查询 大多数的MySQL服务器都开启了查询缓存。这是提高性最有效的方法之一,而且这是被MySQL的数据库引擎处理的。当有很多相同的查询被执行了多次的时候,这些查...【详细内容】
2021-12-09  元宇宙iwemeta    Tags:mysql   点击:(15)  评论:(0)  加入收藏
测试的目的和原因,公司有很多程序员,每个程序员对数据库和表结构都有自己的理解。而且每个程序员的理解往往是以效率考虑。既然都是为了效率考虑,那么我就来测试一下究竟哪种使...【详细内容】
2021-12-08  吴彬的分享    Tags:Mysql数据库   点击:(14)  评论:(0)  加入收藏
当你们考虑项目并发的时候,我在部署环境,当你们在纠结使用ArrayList还是LinkedArrayList的时候,我还是在部署环境。所以啊,技术不止境,我在部环境。今天这篇文章缕一下在同一台服...【详细内容】
2021-12-08  秃头码哥    Tags:MySQL数据库   点击:(17)  评论:(0)  加入收藏
对于数据分析来说,MySQL使用最多的是查询,比如对数据进行排序、分组、去重、汇总及字符串匹配等,如果查询的数据涉及多个表,还需要要对表进行连接,本文就来说说MySQL中常用的查询...【详细内容】
2021-12-06  笨鸟学数据分析    Tags:MySQL   点击:(21)  评论:(0)  加入收藏
在学习SQL语句之前,首先需要区分几个概念,我们常说的数据库是指数据库软件,例如MySQL、Oracle、SQL Server等,而本文提到的数据库是指数据库软件中的一个个用于存储数据的容器。...【详细内容】
2021-11-24  笨鸟学数据分析    Tags:SQL语句   点击:(23)  评论:(0)  加入收藏
概述以前参加过一个库存系统,由于其业务复杂性,搞了很多个应用来支撑。这样的话一份库存数据就有可能同时有多个应用来修改库存数据。比如说,有定时任务域xx.cron,和SystemA域...【详细内容】
2021-11-05  Java云海    Tags:分布式锁   点击:(31)  评论:(0)  加入收藏
MySQL的进阶查询 一、 按关键字排序 使用ORDERBY语句来实现排序排序可针对一个或多个字段ASC:升序,默认排序方式 【升序是从小到大】DESC:降序 【降序是从大到小】ORDER BY的...【详细内容】
2021-11-05  Java热点    Tags:SQL语句   点击:(28)  评论:(0)  加入收藏
最新更新
栏目热门
栏目头条