Mysql的主从复制

anlan

共 3181字,需浏览 7分钟

 · 2021-07-31

  • 一、什么是主从复制?

主从复制是指数据可以从一个MySQL数据库服务器主节点复制到一个或多个从节点。
  • 二、为什么要做主从复制?

  • 主库故障后,可切换到从数据库继续工作,一定程度上实现高可用。

  • 读写分离,单库情况下如果某张表写的时候造成锁表,那读操作也会被阻塞,主从的话主库负责写,从库负责读,如果主库写的时候锁表,不会影响从库读。

  • 业务量越来越大,I/O访问频率过高,单机无法满足,此时做多库的存储,降低磁盘I/O访问的频率,提高单个机器的I/O性能。

  • 三、Mysql主从复制的原理?

  • master必须启用binlog,binlog中记录了每一次数据变化事件

  • slave会在一定时间间隔内对master的binlog进行探测,判断其是否发生改变,如果发生改变,则开启一个I/O线程请求master的binlog中的事件

  • master为slave的I/O线程启动一个dump线程(binlog转储线程),检查自己binlog中的事件,跟对方请求的位置对比后,向其发送二进制事件

  • slave接收到master发送过来的数据把它放置到Relay log(中继日志,也是二进制)文件中;并记录该次请求到master的具体哪一个二进制日志文件内部的哪一个位置

  • slave将启动一个sql线程从Relay log中读取二进制日志,在本地重放,使得其数据和主节点的保持一致;并记录relay log中该次执行的位置信息

  • 最后I/O线程和SQL线程将进入睡眠状态,等待下一次被唤醒

下面来张图可以清晰的表示:

1d12872e4a9c4ca04c90e63b4eaa3c46.webp

  • 四、主从复制搭建

本文基于centos7,mysql5.7
  • 4.1、安装mysql

需要至少两台mysql服务,安装方式参考centos7安装mysql

注:我已经安装好两台mysql服务,分别为192.168.209.128、192.168.209.129

rpm安装默认目录:/var/lib/mysql/数据文件/usr/share/mysql配置文件模板/usr/bin/mysql客户端工具目录/var/log/日志目录
  • 4.2、修改配置

192.168.209.128(主)的配置如下
#mysql主从配置--主节点#节点ID,需要在集群中唯一server-id=1#开启binloglog-bin=mysql-bin#是否控制binlog刷盘,0:不控制,意思就是让mysql自己决定是否刷盘,性能好但可能造成刷盘不及时,1:每次事务提交都会刷盘,性能差但安全sync_binlog=1#binlog日志格式,一共分为statement、row、mixed三种模式binlog_format=mixed#binlog过期清理时间expire_logs_days=7#binlog每个日志文件的大小max_binlog_size=100m#binlog缓存大小binlog_cache_size=4m#最大binlog缓存大小max_binlog_cache_size=512m#不生成日志文件的数据库,多个忽略数据库可以用逗号拼接,这库一般都是mysql自带的库,和业务无关的,就不用记录binlog了binlog_ignore_db=mysql,information_schema, performance_schema#跳过从库的错误slave-skip-errors=all
192.168.209.129(从)的配置如下
#mysql主从配置-从节点#节点ID,需要在集群中唯一server_id=2#开启binloglog-bin=mysql-bin#中继日志名relay-log=mysql-relay-bin#从库上事件从中继日志中过滤,下面的这些表建议都过滤掉replicate-wild-ignore-table =mysql.%replicate-wild-ignore-table =test.%replicate-wild-ignore-table =log.%replicate-wild-ignore-table =information_schema.%replicate-wild-ignore-table =performance_schema.%

6462ab7cd755b68f49290756aff7c251.webp

配置完后运行如下命令重启mysql
systemctl restart mysqld查看下mysql是否启动成功
systemctl status mysqld

66bfdec344c514b29ac038c153554d56.webp

  • 4.3、执行语句

master(主)中执行:
#创建用户CREATE USER replyer IDENTIFIED BY 'Reply_12345';#赋予该用户复制的权利grant replication slave on *.* to 'replyer'@'192.168.209.129'  identified by 'Reply_12345';FLUSH PRIVILEGES;#查看master的状态show master status;

6e299200a1659244c2cd17419fc67e42.webp

c35181e2f9b8878ac7b87d856ba437e5.webp

slave(从)中执行:
#配置从库CHANGE MASTER TO MASTER_HOST = '192.168.209.128',  MASTER_USER = 'replyer', MASTER_PASSWORD = 'Reply_12345',MASTER_PORT = 3306,MASTER_LOG_FILE='mysql-bin.000001',MASTER_LOG_POS=861,MASTER_RETRY_COUNT = 60,MASTER_HEARTBEAT_PERIOD = 10; #启动从库slave进程start slave;#查看从库状态show slave status;

69f87dacef27ba5af7b183db30417d56.webp

注:配置从库的MASTER_LOG_POS一定要和master的Position一致,不要看我上面这个图,我这个图是后来补的。最后运行完后,主库状态中的Position和从库状态中的Read_Master_Log_Pos一定是一致的。

5e0ef2e4a7ff59ac68ff78a9be35c3fa.webp

27f0353319b3d13daa4705b15bc8770f.webp

如果Slave_SQL_Running是no执行:
stop slave;SET GLOBAL SQL_SLAVE_SKIP_COUNTER=1; start slave; show slave status;如果Slave_IO_Running是no执行:show master status;

f4ce13c750a2e534a3eed9ed71430d92.webp

show slave status;

9c8328867aa44d4ef7fdb67daa0fbb96.webp

看这俩文件是不是一个,不是一个的话执行:slave stop; CHANGE MASTER TO MASTER_LOG_FILE='mysql-bin.000001', MASTER_LOG_POS=0; slave start;show slave status;一般也就是这问题了。
  • 4.4、主从复制演示

登上master执行:
#创建xp_db库create database xp_db;#使用xp_db库use xp_db;#在xp_db库中创建student表CREATE TABLE `student` (`id`  int(11) NOT NULL AUTO_INCREMENT ,`name`  varchar(255) NULL ,PRIMARY KEY (`id`));#查看xp_db库中的表show tables;#往student表中插入数据INSERT INTO student(name) VALUES ('xiaopi');
登上slave执行(master执行完每一步后可以执行对应的语句观察同步情况):
show databases;use xp_db;show tables;select * from student;

6bc5a2c61e50336d3c19268411cd55aa.webp

浏览 21
点赞
评论
收藏
分享

手机扫一扫分享

举报
评论
图片
表情
推荐
点赞
评论
收藏
分享

手机扫一扫分享

举报