mysql+数据库主从原理_涨知识!MySQL 主从同步原理原来是这样的

原标题:涨知识!MySQL 主从同步原理原来是这样的

bd2b40fbecd332e4d9889ea9f6a0926c.png

什么是 MySQL 主从同步

当 master(主)库的数据发生变化的时候,变化会实时的同步到slave(从)库。

主从同步有什么好处

水平扩展数据库的负载能力

容错,高可用。 Failover/High Availability

数据备份

主从同步的原理是什么

首先我们来了解 master-slave 的体系结构。

如下图:

86e015825bbf0208d199b50a7b70a18d.png

不管是 delete、update、insert,还是创建函数、存储过程,所有的操作都在 master 上。

当 master 有操作的时候,slave 会快速的接收到这些操作,从而做同步。

但是,这个机制是怎么实现的呢?

在 master 机器上,主从同步事件会被写到特殊的 log 文件中(binary-log);

在 slave 机器上,slave 读取主从同步事件,并根据读取的事件变化,在 slave 库上做相应的更改。

如此,就实现了主从同步了!下面我们来详细的了解。

主从同步事件有哪些

上面说到,在 master 机器上,主从同步事件会被写到特殊的 log 文件中(binary-log);

主从同步事件有3种形式:statement、row、mixed。

statement: 会将对数据库操作的 sql 语句写入到 binlog 中。

row: 会将每一条数据的变化写入到 binlog 中。

mixed: statement 与 row 的混合。MySQL 决定什么时候写 statement 格式的,什么时候写 row 格式的 binlog。

在 master 上的操作

当 master 上的数据发生改变的时候,该事件(insert、update、delete)变化会按照顺序写入到binlog中。

binlog dump线程

当 slave 连接到 master 的时候,master机器会为slave开启binlog dump线程。

当 master 的 binlog 发生变化的时候,binlog dump线程会通知slave,并将相应的binlog内容发送给slave。

在 slave 上的操作

当主从同步开启的时候,slave上会创建2个线程。

I/O线程:该线程连接到 master 机器,master 机器上的 binlog dump 线程会将 binlog的内容发送给该 I/O 线程。该 I/O 线程接收到 binlog 内容后,再将内容写入到本地的relay log。

SQL线程:该线程读取 I/O 线程写入的 relay log。并且根据 relay log 的内容对 slave 数据库做相应的操作。

查看上述线程

使用 SHOW PROCESSLIST 命令可以查看,如图,在 master 机器上查看 binlog dump线程。

69bfdbfe157ca76770215f797dfaac3f.png

如图,在 slave 机器上查看I/O、SQL线程。

6cdc9d0f33d4d6000bcaae5e9930e2a5.png

一图以蔽之

讲了这么多,一图以蔽之

147b7a4db8bd2436aa897cfdcacbcd23.png

下面的实战演练,都是基于上面的环境。当然,其他环境也大同小异。

os:ubuntu16.04

mysql:5.7.17

工具

2台机器:

master IP:192.168.33.22

slave IP:192.168.33.33

master 机器上的操作

1、更改配置文件

我们找到文件

/etc/mysql/mysql.conf.d/mysqld.cnf

配置如下:

#your master ip

bind-address = 192.168.33.22

#在master-slave架构中,每台机器节点都需要有唯一的server-id

server-id = 1

#开启binlog

log_bin = /var/log/mysql/mysql-bin.log

2、重启 MySQL,以使配置文件生效。

sudo systemctl restart mysql

3、创建主从同步的 MySQL user

$ mysql -u root -p

Password:

##创建slave1用户,并指定该用户只能在主机192.168.33.33上登录。mysql> CREATE USER 'slave1'@'192.168.33.33' IDENTIFIED BY 'slavepass';Query OK, 0 rows affected (0.00 sec)

##为slave1赋予REPLICATION SLAVE权限。mysql> GRANT REPLICATION SLAVE ON *.* TO 'slave1'@'192.168.33.33';Query OK, 0 rows affected (0.00 sec)

4、为 MySQL 加读锁

为了主库与从库的数据保持一致,我们先为 MySQL 加入读锁,使其变为只读。

mysql> FLUSH TABLES WITH READ LOCK;Query OK, 0 rows affected (0.00 sec)

5、记录下来 MASTER REPLICATION LOG 的位置

mysql> SHOW MASTER STATUS;+------------------+----------+--------------+------------------+-------------------+| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |+------------------+----------+--------------+------------------+-------------------+| mysql-bin.000001 | 613 | | | |+------------------+----------+--------------+------------------+-------------------+1 row in set (0.00 sec)

6、将 master DB 中现有的数据信息导出

$ mysqldump -u root -p --all-databases --master-data > dbdump.sql

7、解除 master DB 的读锁

mysql> UNLOCK TABLES;

8、将步骤 6 中的 dbdump.sql 文件 copy 到 slave

scp dbdump.sql ubuntu@192.168.33.33:/home/ubuntu

slave 机器上的操作

1、更改配置文件

我们找到文件

/etc/mysql/mysql.conf.d/mysqld.cnf

更改配置如下:

#your slave ipbind-address = 192.168.33.33#master-slave结构中,唯一的server-idserver-id = 2#开启binloglog_bin = /var/log/mysql/mysql-bin.log

2、重启 MySQL,以使配置文件生效

sudo systemctl restart mysql

3、导入从 master DB。导出的 dbdump.sql 文件,以使 master-slave 数据一致

$ mysql -u root -p < /home/ubuntu/dbdump.sql

4、使 slave 与 master 建立连接,从而同步

$ mysql -u root -pPassword:mysql> STOP SLAVE;Query OK, 0rows affected, 1warning ( 0. 00sec)

mysql> CHANGE MASTER TO-> MASTER_HOST= '192.168.33.22',-> MASTER_USER= 'slave1',-> MASTER_PASSWORD= 'slavepass',-> MASTER_LOG_FILE= 'mysql-bin.000001',-> MASTER_LOG_POS= 613;Query OK, 0rows affected, 2warnings ( 0. 01sec)

mysql> START SLAVE;Query OK, 0rows affected ( 0. 00sec)

经过如此设置之后,就可以进行 master-slave 同步了~

来源:公众号聊聊代码。

9月25日-26日,2020 GOPS 全球运维大会相聚深圳,17 个专场,近 80 位技术大咖。2020年首站 GOPS,精彩不重样~工行、中行、农行、平安、腾讯、阿里、京东多个国内顶尖企业 DevOps 运维体系首度揭秘,机会难得~

专场一览 ⬇️

6767622460003339bf269cc3edd15be2.png

“高效运维”公众号诚邀广大技术人员投稿,

投稿邮箱:jiachen@greatops.net,或添加联系人微信:greatops1118.

点个“在看”,一年不宕机 返回搜狐,查看更多

责任编辑:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/421594.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

第三方控件netadvantage UltraWebGrid如何生成带加号多级表数据也就是带子表

1.看代码不解释&#xff1a; ds.Relations.Add("fk", ds.Tables[0].Columns["Id"], ds.Tables[1].Columns["ParentCardId"], false); 将父表和子表放到dataset中通过设置外键关联&#xff0c;这样就会自动绑定上。由于某些原因表不允许自动生成列…

mysql 中int(255)_【数据类型】int ,int(1),int(255)有什么区别?

问题&#xff1a;int(255) 数据类型的容量&#xff0c;比int(1)更多吗&#xff1f;遇到问题&#xff0c;第一反应是去查说明书&#xff0c;可以在mysql document 中找到int这种数据类型的容量是多少&#xff0c;Integer Types (Exact Value)里面只提到了 INT的容量&#xff0c;…

mysql 5.5.28 winx64_mysql-5.7.28-winx64(压缩包)安装教程

1.下载完成后解压放到指定位置我放的C:\Develop\mysql-5.7.28-winx642.在目录下新建  my.ini  内容如下[mysql]# 设置mysql客户端默认字符集default-character-setutf8[mysqld]#设置3306端口port 3306# 设置mysql的安装目录basedirC:\Develop\mysql-5.7.28-winx64# 设置my…

顶级旗舰ET9出道,蔚来还是那个「最不计成本」的中国车品牌

作者 |张祥威 编辑 |德新 2008年&#xff0c;李斌和新浪的曹国伟几人一起喝酒&#xff0c;发了第一条微博&#xff0c;「天冷带围巾&#xff0c;心冷发微博」&#xff0c;一晚上涨了2000多个粉丝&#xff0c;他偶尔还会针砭时事&#xff0c;很快积累了最早一波粉丝。 创立蔚来…

mysql5.0 测试_mysql5.0入侵测试以及防范方法分享_MySQL

bitsCN.com在做了之前的SQL SERVER之后&#xff0c;便很想尝试一下MYSQL的入侵测试已经防范&#xff0c;与大家一起分享。总的来说&#xff0c;我一直在用的是MYSQL&#xff0c;对MYSQL比较熟悉&#xff0c;相比较而言&#xff0c;感觉MYSQL更安全&#xff0c;这只是我自己胡乱…

qt 在label上以光标位置进行缩放_Qt编写地图综合应用22-动态轨迹

一、前言上一篇文章写道拿到路径规划的轨迹点坐标集合&#xff0c;并且已经可以通过调用addPolyline绘制线段的形式将轨迹点绘制&#xff0c;接下来就是要如何动态的绘制这些轨迹点&#xff0c;最简单的方法就是开个定时器挨个取出下一个经纬度坐标&#xff0c;然后调用封装好的…

mysql kettle_带你躲过mysql与kettle闹离婚的坑,开发不迷茫

其实呢kettle配mysql还是蛮不错的&#xff0c;首先人家门当户对&#xff0c;都是开源的哈&#xff0c;其次&#xff0c;kettle也是比较听话的&#xff0c;什么事都以mysql为主&#xff0c;mysql不满意&#xff0c;他就立马报错。那下面就是mysql与kettle闹脾气要离婚的例子啦&a…

poj 1161 最短路构图

题目链接&#xff1a;http://poj.org/problem?id1161 #include <cstdio> #include <cmath> #include <algorithm> #include <iostream> #include <cstring> #include <queue> #include <vector>#define maxn 400 #define INF 0x3f…

struct里面有union_联合体union无可替代的使用

在C语言中关键字union和struct用法是一样的&#xff0c;而且在项目中struct随处可见。在我的专栏"嵌入式入门——C语言入门到深入"中我详细的讲解了它们的异同。很多人编码了多年也许会认为有struct就够了&#xff0c;要union干嘛&#xff0c;感觉union的存在有些鸡肋…

[转]字符串匹配那些事

本系列文章主要介绍几种常用的字符串比较算法&#xff0c;包括但不限于蛮力匹配算法&#xff0c;KMP算法&#xff0c;BM算法&#xff0c;Horspool算法&#xff0c;Sunday算法&#xff0c;fastsearch算法&#xff0c;KR算法等等。 本文主要介绍KMP算法和BM算法&#xff0c;它们分…

查看kafka的主从状态_Mysql 主从复制,mysql-proxy读写分离

准备两台mysql服务器&#xff0c;master&#xff08;192.168.43.64&#xff09;、slave&#xff08;192.168.84.129&#xff09;master配置&#xff1a;log-binmysql-bin binlog_formatmixed server_id1 binlog_checksumnoneslave配置:然后给master授权并查看二进制文件名称和位…

14个支持响应式设计的流行前端开发框架

在几年前&#xff0c;并没有真正意义上的前端开发。随着网络技术的发展&#xff0c;网站和 Web 应用程序变得越来越复杂&#xff0c;前端部分的工作独立出来逐渐成为现在的前端开发。如今&#xff0c;我们可以看到越来越多的公司在招聘前端开发岗位。 前端开发并不容易&#xf…

重写方法返回值可以不一样吗_MAX和MIN函数你会用吗?不一样的应用方法

​一看到标题&#xff0c;大家可能会想&#xff0c;MAX和MIN函数谁不会&#xff0c;不就是求最大和最小嘛&#xff0c;今天就给大家介绍点MAX和MIN函数不一样的内容。首先还是先看下它的定义&#xff1a;MAX&#xff1a;返回一组值中的最大值MIN&#xff1a;返回一组值中的最小…

(转载)最黑的黑客米特尼克:多次耍FBI 终被高手擒

&#xff08;转载&#xff09;http://bbs.chinabyte.com/thread-816847-1-1.html凯文米特尼克 50岁 第一个被FBI通缉的黑客,被称为“头号电脑骇客”&#xff0c;曾入侵北美防空指挥系统&#xff0c;现职业是网络安全咨询师。 阿德里安拉莫 入侵《纽约时报》、微软&#xff0c;被…

mysql中的生日应该是什么类型_MySQL中的数据类型和schema优化

最近在学习MySQL优化方面的知识。本文就数据类型和schema方面的优化进行介绍。1. 选择优化的数据类型MySQL支持的数据类型有很多&#xff0c;而如何选择出正确的数据类型&#xff0c;对于性能是至关重要的。以下几个原则能够帮助确定数据类型&#xff1a;更小的通常更好应尽可能…

vsftpd pam_mysql crypt 1_安装vsftpd+pam+mysql实现对虚拟用户身份认证详细步骤

安装vsftpdpammysql实现对虚拟用户身份认证详细步骤发布时间&#xff1a;2020-05-13 11:42:57来源&#xff1a;亿速云阅读&#xff1a;188作者&#xff1a;三月栏目&#xff1a;数据库下文主要给大家带来安装vsftpdpammysql实现对虚拟用户身份认证详细步骤&#xff0c;希望这些…

校园卡系统mysql与java结合_基于Java+JSP+Mysq+Servletl的校园卡一卡通管理系统

需求分析使用JavaJSPMysqServlet技术实现一个校园卡一卡通管理系统, 分为学生与管理员两个角色, 能够进行登录, 充值, 挂失, 历史消费查询等功能本站提供其他类型的 一卡通管理系统源代码 点击查看运行环境java, jdk1.8,tomcat8.5,mysql5.6, EclispseEE/Idea项目技术java, JSP,…

shell监控mysql发邮件_用shell脚本监控linux系统 自动发送邮件

此脚本可以做一个定时的检测&#xff0c;超出设定的值&#xff0c;即往邮箱发送警告脚本用到bc&#xff0c;sendmail&#xff0c;163邮箱&#xff0c;yum install bc#!/bin/bash#System Monitoring Scriptwhile [ 1 ]do#本机需开启postfix或sendmail服务。#报警邮件地址设置MAI…

【C语言】01-C语言概述

说明&#xff1a;这个C语言专题&#xff0c;是学习iOS开发的前奏。也为了让有面向对象语言开发经验的程序员&#xff0c;能够快速上手C语言。如果你还没有编程经验&#xff0c;或者对C语言、iOS开发不感兴趣&#xff0c;请忽略 回到顶部为什么iOS开发要先学C语言&#xff1f; i…