当前位置: 首页 > news >正文

MySQL--主从复制

前言:本博客仅作记录学习使用,部分图片出自网络,如有侵犯您的权益,请联系删除

一、什么是主从复制

1、定义

主从复制,是用来建立一个和主数据库完全一样的数据库环境,称为从数据库;主数据库一般是准实时的业务数据库。

2、作用

  • 数据的热备,作为后备数据库,主数据库服务器故障后,可切换到从数据库继续工作,避免数据丢失
  • 架构的扩展。业务量越来越大,I/O访问频率过高,单机无法满足,此时做多库的存储,降低磁盘I/O访问的频率,提高单个机器的I/O性能
  • 读写分离,使数据库能支撑更大的并发
    • 在从服务器可以执行查询工作(即我们常说的读功能),降低主服务器压力;(主库写,从库读,降压)
    • 在从服务器进行备份,避免备份期间影响主服务器服务;(确保数据安全)

二、主从复制原理

实现整个主从复制,需要由slave服务器上的IO进程和Sql进程共同完成

要实现主从复制,首先必须打开Master端的binary log(bin-log)功能,因为MySQL主从复制过程实际上就是Slave从Master端获取相应的二进制日志,然后再在自己slave端完全按照顺序执行日志中所记录的各种操作

 master 负责写 -----A slave relay-log -----B I/O 负责通信读取binlog日志 SQL 负责写数据 

其主从复制流程图与步骤如下:

  • 步骤一:主库db的更新事件(update、insert、delete)被写到binlog
  • 步骤二:从库发起连接,连接到主库
  • 步骤三:此时主库创建一个binlog dump thread线程,把binlog的内容发送到从库
  • 步骤四:从库启动之后,创建一个I/O线程,读取主库传过来的binlog内容并写入到relay log.
  • 步骤五:从库还会创建一个SQL线程,从relay log里面读取内容,将更新内容写入到slave的db.

面试题:1、主从复制延迟大比较慢原因

 主服务器配置高,从服务器的配置低并发量大导致主服务器读的慢。从服务器写的慢网络延迟比较高从服务器的读写速度慢从节点过多

面试题:2、从数据库的读的延迟问题了解吗?如何解决?

 解决方法:半同步复制—解决数据丢失的问题并行复制—-解决从库复制延迟的问题

一、主-从-从架构

10.0.0.2主库---10.0.0.3从库--10.0.0.4从库

1、关闭防火墙

 systemctl stop firewalldsystemctl disable firewalld

2、设置serve_id (主从库)

 # 主库2[root@localhost ~]# vim /etc/my.cnfserve_id=2log_bin=2​# 从库3[root@localhost ~]# vim /etc/my.cnfserve_id=3​# 从库4[root@localhost ~]# vim /etc/my.cnfserve_id=4​[root@localhost ~]# systemctl restart mysqld

3、开启binlog日志,查看binlog日志信息-(主库)

 [root@localhost ~]# mysql -u root -pmysql> show master status;   # 查看binlog日志+----------+----------+--------------+------------------+-------------------+| File     | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |+----------+----------+--------------+------------------+-------------------+| 2.000001 |      154 |              |                  |                   |+----------+----------+--------------+------------------+-------------------+1 row in set (0.00 sec)

4、授权 (主库)

 # 允许用户名为"user1",来自10.0.0.*网段的用户使用密码"123"登录到MySQL服务器,并拥有读取二进制日志的权限mysql> grant replication slave on *.* to "user1"@"10.0.0.%" identified by "123";mysql> flush privileges;        # 刷新权限

5、指定主库信息 (从库)

 mysql> change master to master_host="10.0.0.2",master_user="user1",master_password="123",master_log_file="2.000001" ,master_log_pos=154;

6、启动slave

 mysql> start slave;

7、查看从库状态

 mysql> show slave status\G   查看从库状态...Slave_IO_Running: Yes    io线程Slave_SQL_Running: Yes   sql 线程

二、主-主从-从架构

10.0.0.2主库---10.0.0.3主从库--10.0.0.4从库

初始化数据库

 cd /data/mysql/datarm -rf */data/mysql/bin/mysqld --initialize-insecure --user=mysql --basedir=/data/mysql --datadir=/data/mysql/datasystemctl restart mysqld    

1、设置serve_id

 # 主库10.0.0.2[root@localhost ~]# vim /etc/my/cnf...serve_id=2log_bin=2​# 主从库10.0.0.3[root@localhost ~]# vim /etc/my/cnf...serve_id=3log_bin=3log_slave_updates​# 从库10.0.0.4[root@localhost ~]# vim /etc/my/cnfserve_id=4​# 都需要重启mysql服务[root@localhost ~]# systemctl restart mysqld

2、授权与指定主库信息

主库10.0.0.2中操作:

 # 查看主库10.0.0.2的binlog日志[root@localhost ~]# mysql -u root -pmysql> show master status;   # 查看binlog日志+----------+----------+--------------+------------------+-------------------+| File     | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |+----------+----------+--------------+------------------+-------------------+| 2.000001 |      154 |              |                  |                   |+----------+----------+--------------+------------------+-------------------+1 row in set (0.00 sec)# 主库10.0.0.2进行授权mysql> grant replication slave  on *.* to "user1"@"10.0.0.%" identified by "123";mysql> flush privileges;

主从库10.0.0.3中操作:

 # 查看主库10.0.0.3的binlog日志[root@localhost ~]# mysql -u root -pmysql> show master status;   # 查看binlog日志+----------+----------+--------------+------------------+-------------------+| File     | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |+----------+----------+--------------+------------------+-------------------+| 3.000001 |      300 |              |                  |                   |+----------+----------+--------------+------------------+-------------------+1 row in set (0.00 sec)# 主库10.0.0.3进行授权mysql> grant replication slave  on *.* to "user1"@"10.0.0.%" identified by "123";mysql> flush privileges;mysql> change master to master_host="10.0.0.2",master_user="user1",master_password="123",master_log_file="2.000001" ,master_log_pos=154;mysql> start slave;mysql> show slave status\G

从库10.0.0.4中操作:

 mysql> change master to master_host="10.0.0.2",master_user="user1",master_password="123",master_log_file="3.000001" ,master_log_pos=300;mysql> start slave;mysql> show slave status\G 

三、互为主从架构

主库10.0.0.2和10.0.0.3互为主从架构

1、设置serve_id

 # 主从库10.0.0.2[root@localhost ~]# vim /etc/my/cnf...serve_id=2log_bin=2log_slave_updates​# 主从库10.0.0.3[root@localhost ~]# vim /etc/my/cnf...serve_id=3log_bin=3log_slave_updates​[root@localhost ~]# systemctl restart mysqld 

2、授权与指定主库信息

主从库10.0.0.2:

 # 查看主库10.0.0.2的binlog日志[root@localhost ~]# mysql -u root -pmysql> show master status;   # 查看binlog日志+----------+----------+--------------+------------------+-------------------+| File     | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |+----------+----------+--------------+------------------+-------------------+| 2.000001 |      154 |              |                  |                   |+----------+----------+--------------+------------------+-------------------+1 row in set (0.00 sec)# 主库10.0.0.2进行授权mysql> grant replication slave  on *.* to "user1"@"10.0.0.%" identified by "123";mysql> flush privileges;mysql> change master to master_host="10.0.0.3",master_user="user1",master_password="123",master_log_file="3.000001" ,master_log_pos=300;mysql> start slave;mysql> show slave status\G

主从库10.0.0.3:

 # 查看主库10.0.0.3的binlog日志[root@localhost ~]# mysql -u root -pmysql> show master status;   # 查看binlog日志+----------+----------+--------------+------------------+-------------------+| File     | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |+----------+----------+--------------+------------------+-------------------+| 3.000001 |      300 |              |                  |                   |+----------+----------+--------------+------------------+-------------------+1 row in set (0.00 sec)# 主库10.0.0.3进行授权mysql> grant replication slave  on *.* to "user1"@"10.0.0.%" identified by "123";mysql> flush privileges;mysql> change master to master_host="10.0.0.2",master_user="user1",master_password="123",master_log_file="3.000001" ,master_log_pos=154;mysql> start slave;mysql> show slave status\G

四、问题解决

查看uuid,uuid号需要唯一:

 cat /data/mysql/data/auto.cnf

致谢

在此,我要对所有为知识共享做出贡献的个人和机构表示最深切的感谢。同时也感谢每一位花时间阅读这篇文章的读者,如果文章中有任何错误,欢迎留言指正。 

学习永无止境,让我们共同进步!!

http://www.lryc.cn/news/415899.html

相关文章:

  • Linux RT调度器之负载均衡
  • pwn学习笔记(8)--初识Pwn沙箱
  • Day18_2--Vue.js Ajax(使用 Axios)基础入门学习
  • windows11远程桌面如何打开
  • qt代码显示,包含文本颜色设置等
  • 抽象代数精解【6】
  • 如何选择合适的PCB材料?FR4、陶瓷、还是金属基板?
  • PXE学习及其简单应用
  • 【Python】把list转换成json文件(list中为字典,元素按行写入)
  • 《机器人SLAM导航核心技术与实战》第1季:第8章_激光SLAM系统
  • 【安当产品应用案例100集】005-安当ASP实现Exchange双因素登录认证
  • 【Bug】Pytorch RuntimeError: DataLoader worker (pid(s) 15904) exited unexpectedly
  • 谈谈冯诺依曼体系
  • 第十二章 元数据管理10分
  • eco_tracker
  • electron 鼠标事件
  • 网络安全第一次作业(ubuntuan安装nginx以及php部署 and sql注入(less01-08)))
  • 【OpenHarmony4.1 之 U-Boot 2024.07源码深度解析】017 - init_sequence_f 各函数源码分析(一)
  • Mojo AI编程语言(十七)跨平台开发:应用广泛适配
  • Python面试题:结合Python技术,如何使用Astropy进行天文数据处理
  • Jpa-多表关联-OneToOne
  • zdpy+vue3+onlyoffice文档系统实战上课笔记 20240805
  • 【Linux 从基础到进阶】Linux 内核参数调优
  • 【Java数据结构】---泛型
  • Java Lambda表达式总结(快速上手图解)
  • 【算法模板】图论:Tarjan算法求割边割点
  • 如何在IDEA上使用JDBC编程【保姆级教程】
  • linux web系统安装常见问题解决,租房系统为案例
  • Linux驱动开发—平台总线模型详解
  • 说一下网络层,传输层,数据链路层做什么的,之间的关系?