一、MySQL主备基本原理

1.如下图所示是基本的主备切换流程

MySQL主备切换流程

在状态1中,客户端的读写都直接访问节点A,而节点B是A的备库,只是将A的更新都同步过来,到本地执行。这样可以保持节点B和A的数据是相同的。
当需要切换的时候,就切成状态2。这时候客户端读写访问的都是节点B,而节点A是B的备库。
在状态1中,虽然节点B没有被直接访问,但是依然建议把节点B(也就是备库)设置成只读 (readonly)模式。这样做,有以下几个考虑:
  1. 有时候一些运营类的查询语句会被放到备库上去查,设置为只读可以防止误操作;
  2. 防止切换逻辑有bug,比如切换过程中出现双写,造成主备不一致;
  3. 可以用readonly状态,来判断节点的角色。
把备库设置成只读了,还怎么跟主库保持同步更新呢?
因为readonly设置对超级(super)权限用户是无效的,而用于同步更新的 线程,就拥有超级权限。
2.节点A到节点B这条线的内部流程是什么样的?
如下图所示就是执行一个update语句在节点A执行,然后同步到节点B的完整流程图。
主备流程图
备库B跟主库A之间维持了一个长连接。主库A内部有一个线程,专门用于服务备库B的这个长连接。一个事务日志同步的完整过程是这样的:
  1. 在备库B上通过change master命令,设置主库A的IP、端口、用户名、密码,以及要从哪个位置开始请求binlog,这个位置包含文件名和日志偏移量
  2. 在备库B上执行start slave命令,这时候备库会启动两个线程,就是图中的io_thread和 sql_thread。其中io_thread负责与主库建立连接。
  3. 主库A校验完用户名、密码后,开始按照备库B传过来的位置,从本地读取binlog,发给B。
  4. 备库B拿到binlog后,写到本地文件,称为中转日志(relay log)。
  5. sql_thread读取中转日志,解析出日志里的命令,并执行。

这里需要说明,后来由于多线程复制方案的引入,sql_thread演化成为了多个线程。

二、配置主从同步的基本步骤

有很多种配置主从同步的方法,可以总结为如下的步骤:

  1. 在主服务器上,必须开启二进制日志机制和配置一个独立的ID
  2. 在每一个从服务器上,配置一个唯一的ID,创建一个用来专门复制主服务器数据的账号
  3. 在开始复制进程前,在主服务器上记录二进制文件的位置信息
  4. 如果在开始复制之前,数据库中已经有数据,就必须先创建一个数据快照(可以使用mysqldump导出数据库,或者直接复制数据文件)
  5. 配置从服务器要连接的主服务器的IP地址和登陆授权,二进制日志文件名和位置

三、详细配置主从同步的方法

环境准备

CentOS7

mysql安装包:mysql8.0.12_bin_centos7.tar.gz

MySQL安装方法及步骤

安装前主备,执行后重启系统:

[root@hdss7-11 ~]# systemctl stop firewalld
[root@hdss7-11 ~]# systemctl disable firewalld
[root@hdss7-11 ~]# setenforce 0
[root@hdss7-11 ~]# sed -ir '/^SELINUX=/s/=.+/=disabled/' /etc/selinux/config

3.1备份主服务器原有数据到从服务器

mysqldump -uroot -p --all-databases --lock-all-tables > ~/master_db.sql

说明:

  • -u :用户名
  • -p :示密码
  • --all-databases :导出所有数据库
  • --lock-all-tables :执行操作时锁住所有表,防止操作时有数据修改
  • ~/master_db.sql :导出的备份数据(sql文件)位置,可自己指定

3.2 在从服务器上进行数据还原

mysql> source /root/master_db.sql;
Query OK, 0 rows affected (0.00 sec)Query OK, 0 rows affected (0.00 sec)
...
Query OK, 0 rows affected (0.00 sec)Query OK, 0 rows affected (0.00 sec)
mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| seckilling         |
| sys                |
| test               |
+--------------------+
6 rows in set (0.00 sec)mysql> use test;
Database changed
mysql>
mysql> show tables;
+----------------+
| Tables_in_test |
+----------------+
| t1             |
| t2             |
+----------------+
2 rows in set (0.00 sec)

3.3主服务器配置

3.3.1 在配置文件/data/mysql/conf/my.cnf中,修改如下几个字段

[mysqld]
server_id                       = 1  #服务器 id ,主从机器在同一局域网内必须全局唯一,不能相同
log-bin                         = /data/mysql/binlog/binlog
log_bin_index                   = /data/mysql/binlog/binlog.index
binlog-do-db                    =palan-dev    #待同步的数据库,如果有多个以空格隔开db1 db2 db3 ....
binlog-ignore-db                =mysql  #不同步的数据  如果有多个以空格隔开db1 db2 db3 ....

3.3.2查看主服务器是否开启binlog日志,如果没有开启则开启

mysql> show variables like '%log_bin%';
+---------------------------------+---------------------------------+
| Variable_name                   | Value                           |
+---------------------------------+---------------------------------+
| log_bin                         | ON                              |
| log_bin_basename                | /data/mysql/binlog/binlog       |
| log_bin_index                   | /data/mysql/binlog/binlog.index |
| log_bin_trust_function_creators | OFF                             |
| log_bin_use_v1_row_events       | OFF                             |
| sql_log_bin                     | ON                              |
+---------------------------------+---------------------------------+
6 rows in set (0.00 sec)

查看生成的binlog日志文件

[root@wxc wxc]# ls /data/mysql/binlog/ -al
total 2388
drwxr-xr-x. 2 mysql mysql     194 Nov 15 19:16 .
drwxr-xr-x. 7 mysql mysql      66 Nov 15 16:09 ..
-rw-r-----. 1 mysql mysql     156 Nov 15 17:18 binlog.000001
-rw-r-----. 1 mysql mysql     170 Nov 15 17:18 binlog.000002
-rw-r-----. 1 mysql mysql    1775 Nov 15 17:40 binlog.000003
-rw-r-----. 1 mysql mysql    1122 Nov 15 18:25 binlog.000004
-rw-r-----. 1 mysql mysql 2409901 Nov 15 19:10 binlog.000005
-rw-r-----. 1 mysql mysql     231 Nov 15 19:10 binlog.000006
-rw-r-----. 1 mysql mysql     210 Nov 15 19:10 binlog.000007
-rw-r-----  1 mysql mysql     191 Nov 15 19:16 binlog.000008
-rw-r-----  1 mysql mysql     264 Nov 15 19:16 binlog.index

3.3.3给从库授权账号,让从库可以复制

mysql> CREATE USER 'rootslave'@'10.4.7.139' IDENTIFIED WITH mysql_native_password BY 'qazWSX123+++';
mysql> grant replication slave on *.* to 'rootslave'@'10.4.7.139';
mysql> FLUSH PRIVILEGES;

重新启动MySQL

3.3.4查看主库状态

mysql> show master status\g;
+---------------+----------+--------------+------------------+--------------------------------------------+
| File          | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set                          |
+---------------+----------+--------------+------------------+--------------------------------------------+
| binlog.000008 |      191 |              |                  | 7fe7893e-2723-11eb-bd3b-000c2957e9b2:1-150 |
+---------------+----------+--------------+------------------+--------------------------------------------+
1 row in set (0.01 sec)ERROR:
No query specified

3.4从服务器配置

3.4.1 在配置文件/data/mysql/conf/my.cnf中,修改如下几个字段

server_id                       = 2  #这里的id一定不要和主库id相同

重新启动数据库systemctl restart mysqld

3.4.2 登录数据库

mysql> change master to master_host='10.4.7.138',master_user='rootslave',master_password='qazWSX123+++',master_log_file='binlog.000005',master_log_pos=191;
mysql> start slave;

3.4.3查看从库状态

mysql> show slave status\G;
*************************** 1. row ***************************Slave_IO_State: Waiting for master to send eventMaster_Host: 10.4.7.138Master_User: rootslaveMaster_Port: 3306Connect_Retry: 60Master_Log_File: binlog.000008Read_Master_Log_Pos: 191Relay_Log_File: wxc-relay-bin.000011Relay_Log_Pos: 391Relay_Master_Log_File: binlog.000008Slave_IO_Running: YesSlave_SQL_Running: YesReplicate_Do_DB: Replicate_Ignore_DB: Replicate_Do_Table: Replicate_Ignore_Table: Replicate_Wild_Do_Table: Replicate_Wild_Ignore_Table: Last_Errno: 0Last_Error: Skip_Counter: 0Exec_Master_Log_Pos: 191Relay_Log_Space: 829Until_Condition: NoneUntil_Log_File: Until_Log_Pos: 0Master_SSL_Allowed: NoMaster_SSL_CA_File: Master_SSL_CA_Path: Master_SSL_Cert: Master_SSL_Cipher: Master_SSL_Key: Seconds_Behind_Master: 0
Master_SSL_Verify_Server_Cert: NoLast_IO_Errno: 0Last_IO_Error: Last_SQL_Errno: 0Last_SQL_Error: Replicate_Ignore_Server_Ids: Master_Server_Id: 1Master_UUID: 7fe7893e-2723-11eb-bd3b-000c2957e9b2Master_Info_File: mysql.slave_master_infoSQL_Delay: 0SQL_Remaining_Delay: NULLSlave_SQL_Running_State: Slave has read all relay log; waiting for more updatesMaster_Retry_Count: 86400Master_Bind: Last_IO_Error_Timestamp: Last_SQL_Error_Timestamp: Master_SSL_Crl: Master_SSL_Crlpath: Retrieved_Gtid_Set: 7fe7893e-2723-11eb-bd3b-000c2957e9b2:10-150Executed_Gtid_Set: 7fe7893e-2723-11eb-bd3b-000c2957e9b2:1-7:10-150Auto_Position: 0Replicate_Rewrite_DB: Channel_Name: Master_TLS_Version: Master_public_key_path: Get_master_public_key: 0
1 row in set (0.10 sec)

其中Slave_IO_Running和Slave_SQL_Running表示两个线程的状态,这两个线程必须都为YES,如果有一个为no都不会进行主从同步

四、FAQ

4.1
mysql出现ERROR1698(28000):Access denied for user root@localhost错误解决方法

参考:mysql出现ERROR1698(28000):Access denied for user root@localhost错误解决方法 - 丹华抱一鷇音子 - 博客园

Mysql复制原理以及流程相关推荐

  1. MYSQL复制原理及其流程-详

    MySQL复制概述 保证主服务器(Master)和从服务器(Slave)的数据是一致性的,向Master插入数据后,Slave会自动从Master把修改的数据同步过来(有一定的延迟),通过这种方式来保 ...

  2. mysql数据库复制基本原理_MySQL的复制原理以及流程

    原创文章出自公众号:「码农富哥」,如需转载请注明出处! 文章如果对你有收获,可以收藏转发,这会给我一个大大鼓励哟!另外可以关注我公众号「码农富哥」 (搜索id:coder2025),我会持续输出Pyt ...

  3. Mysql 复制原理以及配置 简要分析

    这个图是我根据自己的理解将Mysql的主从复制的流程给画了出来,关于什么是Mysql主从复制技术,这里简单说一下. 有一次去一家刚刚成立的游戏公司面试,面试官问用过Mysql主从技术吗?我说:用过,我 ...

  4. MySQL复制原理及过程

    Replication基本原理 异步复制:从主机拷贝到备机过程中会有延迟,延迟通常由网络.资源可用性和系统负载来决定.使用合适架构和调优,大多复制几乎是瞬间完成的. 同步复制:数据同时向一台或多台机器 ...

  5. MySQL复制原理与配置

    一.Mysql复制基本原理 二.Mysql复制中Binlog的三种格式 2.1 三种格式的介绍 2.2 Binlog格式的优缺点 2.3 Binlog基本配置 三.Mysql常见两种复制方式 3.1  ...

  6. MySQL的原理以及流程_MySQL的复制原理以及流程?

    主从复制:将主数据库中的DDL和DML操作通过二进制日志(BINLOG)传输到从数据库上,然后将这些日志重新执行(重做):从而使得从数据库的数据与主数据库保持一致. 主从复制的作用 主数据库出现问题, ...

  7. 【MySQL】MySQL复制原理与主备一致性同步工作原理解析(原理篇)(MySQL专栏启动)

  8. MySQL复制与高可用水平扩展架构实战

    前言 一键获取MySQL核心数据结构.底层实现原理.索引.事务.锁机制.MySQL性能优化案例.美团MySQL中间件等. 一.什么是MySQL复制 1.什么是复制 MySQL的复制是构建大规模.高性能 ...

  9. mysql主从复制原理 简书_mysql主从复制,从原理讲到安装配置,全干货

    0.为什么需要主从复制? 1.在业务复杂的系统中,有这么一个情景,有一句sql语句需要锁表,导致暂时不能使用读的服务,那么就很影响运行中的业务,使用主从复制,让主库负责写,从库负责读,这样,即使主库出 ...

  10. mysql 复制方式_MySQL复制方法

    MySQL的二进制日志,MySQL复制原理,MySQL主从模式搭建,MySQL双主模式搭建,MySQL级联模式搭建,MySQL半同步模式复制 一.二进制日志 1.概念 MySQL的二进制日志(bina ...

最新文章

  1. 面试宝典:深入理解这110道python面试题,AI和大数据向你招手
  2. 解读ADC采样芯片(EV10AQ190A)的工作模式(四通道模式)
  3. 景色宜人的openeim001
  4. python生成热度图_Python数据可视化 热力图
  5. Gsoap在QT工程里如何调用
  6. 7款Java反编译工具
  7. linux局域网聊天软件,自制局域网内聊天与图片传输小软件
  8. ABB机器人GSD文件获取的几种方法
  9. python常用图形绘图(matplotlib,pyecharts)
  10. 为何电脑不识别iPhone
  11. 某bobo在线视频APP下载暴力流逆向
  12. 【Day2.3】华欣火车站,与火车失之交臂
  13. 几个功能非常强大的学术翻译网站
  14. 怎么在网页中播放视频之一:HTML5视频嵌入
  15. 游戏开发实战之弹球游戏
  16. bpsk传输系统实验matlab,通信原理实验4 BPSK系统仿真matlab程序
  17. 【GEE笔记7】文本ee.String
  18. 数字化转型的必须了解的十个关键词
  19. S7-200 SMART PLC软元件介绍
  20. 基于GIS的校园公交车管理系统设计(西安电子科技大学GIS课程大作业)

热门文章

  1. android5去wifi感叹号,android 5.1 WIFI图标上的感叹号及其解决办法
  2. 隐藏和isa :进化返祖以及白马非马(c++)
  3. 百度正式开放大数据引擎
  4. IDEA使用Statistic插件统计代码数量
  5. java map put map_关于Java中有关Map中put方法理解
  6. 【python gensim使用】word2vec词向量处理英文语料
  7. android脚本精灵开发,触动精灵脚本开发示例代码
  8. 计算机考研复试-英文问答
  9. 计蒜课:Fantastic Graph(图论)(有源汇的上下界的可行流)
  10. Android--高德地图,显示地图,并定位当前的位置