面试官问:了解Mysql主从复制原理么?我呵呵一笑

1496 篇文章 10 订阅
1494 篇文章 14 订阅
文章详细介绍了MySQL主从同步的原理,包括主从复制的各个步骤,并通过Docker容器演示了如何搭建主从结构。在Docker中创建了两个MySQL实例,分别作为主节点和从节点,配置了必要的参数,如server_id、binlog日志等,并通过changemaster命令建立了主从关系,最后启动奴隶节点的复制线程完成同步设置。
摘要由CSDN通过智能技术生成

搭建Mysql主从同步之前,我们先来说他们之间同步的过程与原理:

同步复制过程

献上一张图,这张图诠释了整个同步过程

编辑切换为居中

添加图片注释,不超过 140 字(可选)

主从复制过程:

  • slave节点与主节点进行连接,建立主从关系,并把从哪开始同步,及哪个日志文件都一并发送到master

  • master将修改的数据保存到binlog中

  • master开启binlog dump线程,将binlog日志推送到连接的slave中

  • slave接受到推送的binlog,slave开启IO线程将数据写到中继日志(relay log)中

  • slave同时还会开启一个SQL线程,对比中继日志中新增的内容,并且解析SQL,回放数据到从数据库中

好的,复制过程已经说完了,我们现在实践下,快速搭建一个mysql主从架构。

没错,我这里还是使用docker搭建,因为它很香啊!

搭建Mysql 主从

创建mysql网络

 
 

docker network create mysqlNet

安装mysql

  • 运行mysql主节点

 
 

docker run -p 3306:3306 --name mysql_master -h mysql_master --net=mysqlNet \ -v ~/docker/mysql/mysql_master/log:/var/log/mysql \ -v ~/docker/mysql/mysql_master/data:/var/lib/mysql \ -v ~/docker/mysql/mysql_master/conf:/etc/mysql \ -e lower_case_table_names=1 \ -e MYSQL_ROOT_PASSWORD=root \ -d mysql:5.7

  • 修改配置文件

 
 

# 编辑文件 vim ~/docker/mysql/mysql_master/conf [client] default-character-set=utf8 [mysql] default-character-set=utf8 [mysqld] init_connect='SET collation_connection=utf8_unicode_ci' init_connect='SET NAMES utf8' character-set-server=utf8 collation-server=utf8_unicode_ci skip-character-set-client-handshake skip-name-resolve ## 同一局域网内注意要唯一 server-id=1 ## 开启二进制日志功能,可以随便取(关键) log-bin=mysql-bin

  • 重启mysql_master

 
 

docker restart mysql_master

  • 在master节点上 创建给从节点进行复制的用户

 
 

docker exec -it mysql_master mysql -uroot -proot # 创建用户 CREATE USER 'mysql_slave'@'%' IDENTIFIED BY '111111'; # 授权 GRANT REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'mysql_slave'@'%';

  • 运行mysql从节点

 
 

docker run -p 33306:3306 --name mysql_slave -h mysql_slave --net=mysqlNet \ -v ~/docker/mysql/mysql_slave/log:/var/log/mysql \ -v ~/docker/mysql/mysql_slave/data:/var/lib/mysql \ -v ~/docker/mysql/mysql_slave/conf:/etc/mysql \ -e lower_case_table_names=1 \ -e MYSQL_ROOT_PASSWORD=root \ -d mysql:5.7

  • 编辑从节点配置文件

 
 

# 编辑文件 vim ~/docker/mysql/mysql_master/conf [client] default-character-set=utf8 [mysql] default-character-set=utf8 [mysqld] init_connect='SET collation_connection=utf8_unicode_ci' init_connect='SET NAMES utf8' character-set-server=utf8 collation-server=utf8_unicode_ci skip-character-set-client-handshake skip-name-resolve ## 设置server_id,注意要唯一 server-id=2 ## 开启二进制日志功能,以备Slave作为其它Slave的Master时使用 log-bin=mysql-slave-bin ## relay_log配置中继日志 relay_log=edu-mysql-relay-bin ## 设置只读权限 read_only = 1 innodb_read_only ## 使得更新的数据写进二进制日志中 log_slave_updates = 1 #如果master库名与salve库名不同,使用以下配置[需要做映射] #replicate-rewrite-db = [主库名] -> [从库名] #如果不是要全部同步[默认全部同步],则指定需要同步的表 #replicate-wild-do-table=库名.表1 #replicate-wild-do-table=库名.表2

现在主从节点已经安装完成,我们接下来需要让他们建立关系:

先查看master节点当前的状态,主要看下日志文件和当前的位置

 
 

docker exec -it mysql_master mysql -uroot -proot show master status; exit exit

结果如下:文件为mysql-bin.000001 位置为629

编辑切换为居中

添加图片注释,不超过 140 字(可选)

拿到这些信息之后,我们现在就可以让从节点与主节点建立关系,并执行同步了:

 
 

docker exec -it mysql_slave mysql -uroot -proot change master to master_host='mysql_master', master_user='mysql_slave', master_password='111111', master_port=3306, master_log_file='mysql-bin.000001', master_log_pos= 629, master_connect_retry=30;

我们继续看下slave节点的状态

 
 

show slave status\G; 1

编辑切换为居中

添加图片注释,不超过 140 字(可选)

我们看到我们在文首提到的两个线程并没有启动,所以我们需要手动启动着两个线程,一个命令就好了

 
 

start slave;

编辑切换为居中

添加图片注释,不超过 140 字(可选)

现在可以看到两个线程已经在运行了。 到此,已经搭建完成了

测试

这个我就不演示了,大家可以在mysql_master上创建一个数据库,看看是不是会同步到mysql_slave上。

  资源获取:
大家 点赞、收藏、关注、评论啦 、 查看👇🏻👇🏻👇🏻 微信公众号获取联系方式👇🏻👇🏻👇🏻
精彩专栏推荐订阅:下方专栏👇🏻👇🏻👇🏻👇🏻
每天学四小时:Java+Spring+JVM+分布式高并发,架构师指日可待

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值