一、主从复制概述

这章来说说主从复制,对于主从复制,有很多知识,在以后分篇记录,所以在这里只说说简单的用法,用来入个门可以,先说啥是主从复制,主从复制就是将一台主机的数据复制到另一台或者多台主机上,复制过程中一台服务器充当主库(Master),就是源数据存放的主机,还有一台或者多台服务器充当从库(Slave),Mysql支持单向、双向、链式级联、异步复制,还有在5.5版本后的半同步复制等。

利用主从复制功能,我们可以做到在主库发生意外时,让从库接管主库,也能让从库分担主库的读压力,这一点,也可以看看以前关于Redis主从复制的介绍。

模式图


二、主从复制演示

Docker安装MySQL

由于本次演示需要用到多个MySQL实例,可以使用Docker来做,但是貌似MySQL自身就可以配置多个实例,这一点不太清楚,没有试过,所以还是使用Docker吧,关于Docker的安装就不说了,下面说Docker中部署MySQL服务器。

(多说一句话,Docker真是个好东西,在上次团队需要马上运行一个服务端,需要数据库,要把sql文件导入进去,由于版本的差异,这个只能在5.6版本下导入,我们电脑上的所有版本完美的避开了5.6,这时想起了Docker,敲了几行命令,一个崭新的MySQL5.6就出来了,最终成功把数据导入进去,救了急)

关于安装Docker,看官方的一篇就够了:

https://docs.docker.com/engine/install/ubuntu/
  1. 首先拉取镜像
docker pull mysql/mysql-server:8.0
  1. 启动两个实例,端口为3307和3308,密码都为123456
docker run -p 3307:3306 --name mysql1 -e MYSQL_ROOT_PASSWORD=123456 -d mysql/mysql-server:8.0

docker run -p 3308:3306 --name mysql2 -e MYSQL_ROOT_PASSWORD=123456 -d mysql/mysql-server:8.0
更多可以参考下面官网:https://dev.mysql.com/doc/mysql-installation-excerpt/8.0/en/docker-mysql-getting-started.html

查看进程。

root@hxl-PC:/home/hxl# docker psCONTAINER ID        IMAGE                    COMMAND                  CREATED             STATUS                    PORTS                               NAMES4f16b40cb2d4        mysql/mysql-server:8.0   "/entrypoint.sh mysq…"   5 hours ago         Up 30 minutes (healthy)   33060/tcp, 0.0.0.0:3308->3306/tcp   mysql280faae4d305b        mysql/mysql-server:8.0   "/entrypoint.sh mysq…"   6 hours ago         Up 31 minutes (healthy)   33060/tcp, 0.0.0.0:3307->3306/tcp   mysql1root@hxl-PC:/home/hxl# 

配置主库(3307)

修改master数据库的配置文件,位置在/etc/my.cnf,可以在本地编辑好,然后使用docker cp命令复制到里面。

server-id是唯一的,主从的不能一样,如果没有设置server_id或设置成0的话,从主机会无法连接。

log-bin是二进制日志名称,服务器会将所有更改数据的语句记录到二进制日志中,这个日志就可以实现备份和复制,但这个只是基本名称,MySQL还会在这个名称后面拼接一串数字来依次创建二进制日志文件。

[mysqld]server-id=101log-bin=mysql-bin

接下来要创建主从复制账号,在从主机上会用到,还要把他赋予REPLICATION SLAVE特权,这个操作可以不使用命令行,如果您用的dbeaver的话,可以通过界面去创建。

mysql> create user 'bak'@'%' identified by '123456';Query OK, 0 rows affected (0.03 sec)

mysql> grant replication slave on *.* to 'bak'@'%';Query OK, 0 rows affected (0.01 sec)

mysql> flush privileges;Query OK, 0 rows affected (0.01 sec)

mysql> 
关于主从复制账号,可以查看官网:https://dev.mysql.com/doc/refman/8.0/en/replication-howto-repuser.html

关于二进制日志配置选项,可以查看官网:https://dev.mysql.com/doc/refman/5.6/en/replication-options-binary-log.html

最后查看master状态,show master status这个命令用于查看服务器的二进制日志文件的状态信息,需要用的字段是Position,在配置从节点的时候,需要传递给他。

mysql> show master status;+------------------+----------+--------------+------------------+-------------------+| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |+------------------+----------+--------------+------------------+-------------------+| mysql-bin.000003 |      156 |              |                  |                   |+------------------+----------+--------------+------------------+-------------------+1 row in set (0.00 sec)

mysql> 

配置从库(3308)

[mysqld]server-id=101

最后在从库中执行下面命令,注意修改主机地址、端口、日志文件,最后的start slave用于开始执行主从复制。

mysql> change master to master_host='10.204.27.177',master_user='bak',master_password='123456',master_log_file='mysql-bin.000003',master_log_pos=156,master_port=156,get_master_public_key=1;Query OK, 0 rows affected, 2 warnings (0.04 sec)

mysql> start slave;Query OK, 0 rows affected (0.01 sec)

mysql> 
  1. master_user:之前创建的复制账号
  2. master_host:主库的IP地址
  3. master_password:复制账号的密码
  4. master_log_file:二进制文件
  5. master_port:主库端口号
  6. master_log_pos:从备份文件中获取postion号。
  7. get_master_public_key:指示是否从源请求基于RSA密钥对的密码交换所需的公共密钥

查看状态,当Slave_IO_Running和Slave_SQL_Running都是yes的话就代表配置成功了。\G是格式化格式,否则会一团糟。

ysql> show slave status\G;*************************** 1. row ***************************               Slave_IO_State: Waiting for master to send event                  Master_Host: 10.204.27.177                  Master_User: bak                  Master_Port: 3307                Connect_Retry: 60              Master_Log_File: mysql-bin.000003          Read_Master_Log_Pos: 746               Relay_Log_File: 4f16b40cb2d4-relay-bin.000002                Relay_Log_Pos: 324        Relay_Master_Log_File: mysql-bin.000003             Slave_IO_Running: Yes            Slave_SQL_Running: Yes.......

测试

这是两个库此时的初始化状态。

现在在主库中创建一个数据库test。


在主库中新增一张表。

CREATE TABLE `tb_user` (  `id` int NOT NULL AUTO_INCREMENT,  `userName` varchar(100) NOT NULL,  PRIMARY KEY (`id`)) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;

可以看到从库也同步了,数据也都为空。


主库插入一条数据。


主从复制原理

首先主库会在二进制日志里记录了对数据库的更改,从库会从主库中获取这个二进制日志,然后在从库中重放这部分日志,就实现了数据的同步。

  1. 主服务器将更新写入二进制日志文件,并维护文件的一个索引。
  2. 从库复制主库的二进制日志事件到本地的中继日志(relay log)。
  3. 从库重放中继日志。

MySQL会使用3个线程来执行复制功能,其中一个在主服务器上,另两个在从服务器上。当从服务器执行start slave命令时,从服务器会创建一个I/O线程,用于连接主服务器,并让它发送二进制日志中的语句。

主服务器就会创建一个线程将二进制日志中的内容发送到从服务器中,从服务器中的I/O线程读取主服务器线程发送的内容并将数据复制到本地文件中,也就是中继日志,第3个线程就是SQL线程,是从服务器创建的,用于读取中继日志文件内容,并执行日志中所包含的更新。

mysql主从复制原理详解_深入研究MySQL(三)、主从复制原理及演示相关推荐

  1. mysql数据库约束详解_深入理解mysql数据库的约束

    摘要:MYSQL添加约束,删除约束添加列,修改列,删除列 添加主键约束: altertable表名addconstraint主键(形如:PK_表名)primarykey表名(主键字段); 添加外键约束 ...

  2. 《MySQL安装流程详解》及《MySQL安装一直失败,重新安装显示已安装》

    <MySQL安装流程详解>及<MySQL安装一直失败,重新安装显示已安装> 本文由博主经过查阅网上资料整理总结后编写,如存在错误或不恰当之处请留言以便更正,内容仅供大家参考学习 ...

  3. 电路计算机仿真的优点,施密特触发器电路及工作原理详解_施密特触发器特点_施密特触发器的作用...

    描述 什么是施密特触发器 施密特触发器(Schmidt trigger)是包含正回授的比较器电路.它也有两个稳定状态,但与一般触发器不同的是,施密特触发器采用电位触发方式,其状态由输入信号电位维持:对 ...

  4. Mycat原理详解,Mycat 实现 MySQL 的读写分离(Mysql主从复制)

    文章目录 1 Mycat 介绍 2 Mycat 安装 2.1下载安装JDK 2.2下载安装mycat 2.3启动和连接 3 Mycat 主要配置文件说明 4 利用 Mycat 实现 MySQL 的读写 ...

  5. mysql mha配置文件详解_十四、MySQL MHA 高可用配置(一)

    MHA 高可用 1.准备三台机器 IP:10.0.0.51 主机名:db01 内存:2G IP:10.0.0.52 主机名:db02 内存:2G IP:10.0.0.53 主机名:db03 内存:2G ...

  6. mysql innodb 设置详解_【mysql】mysql innodb 配置详解

    MySQLinnodb 配置详解 innodb_buffer_pool_size:这是InnoDB最重要的设置,对InnoDB性能有决定性的影响.默认的设置只有8M,所以默认的数据库设置下面InnoD ...

  7. mysql查询语句详解_基于mysql查询语句的使用详解

    1> 查询数据表除了前三条以外的数据. 起初我想到的是这条语句 SELECT * FROM admin WHERE userid NOT IN (SELECT userid FROM admin ...

  8. 0832工作原理详解_最经典MOS管电路工作原理及详解没有之一

    欢迎加入技术交流QQ群(2000人):电力电子技术与新能源 1105621549 高可靠新能源行业顶尖自媒体 在这里有电力电子.新能源干货.行业发展趋势分析.最新产品介绍.众多技术达人与您分享经验,欢 ...

  9. dbcp连接池配置详解_重学MySQL:事务与连接池,一文详解带你搞懂

    拼多多三面惨败,java中间件.数据库与spring框架,答不上... 吊打MySQL:21性能优化实践+学习导图+55面试+笔记+20高频知识点 Mysql事务 事务: 事务指逻辑上的一组操作,组成 ...

最新文章

  1. python添加文字水印中间旋转45度_pythonpdf添加水印
  2. Java反编译器Java Decompiler
  3. hibernate系列之一
  4. 19-linux下ElasticSearch.6.2.1与head、Kibana、X-Pack、SQL、IK、PINYIN插件的配置安装
  5. php模板中的数组在哪,php – Twig:从包含的模板中添加项目到数组
  6. IntelliJ IDEA 文件夹重命名--解决重命名后js文件引用找不到路径报404错误
  7. ModuleNotFoundError: No module named ‘pygame’——Python3.6安装pip并下载pygame模块
  8. php多线程扩展pthreads安装使用,swoole多进程,内置多进程
  9. 【VRP问题】基于帝国企鹅优化算法求解冷链配送物流车辆调度优化研究(Matlab代码实现)
  10. [论文阅读笔记16]More data,relations,context ,openness:A review and outlook for relation extraction
  11. [人工智能-深度学习-65]:环境搭建 - Nvidia最新显卡性能排名
  12. 全球与中国的前50家最佳网站
  13. python如何查询数据库_通过Python查询数据库信息
  14. java从零到项目实战(八)
  15. Linux怎样低格移动硬盘,移动硬盘低级格式化操作方法详细步骤【图文详解】
  16. Three.js实现分区Bloom辉光效果
  17. 一个屌丝程序猿的人生(一百二十六)
  18. 上海科技领军企业CIMC中集飞瞳集装箱人工智能AI走向成熟,先进产品领跑全球集装箱AI航运港口人工智能应用,上海人工智能企业公司
  19. GO对接验证码短信接口DEMO示例
  20. Python实战之小说下载神器(一)看小说怎么能少了这款宝藏神器呢?全网小说书籍随便下,随便看,爆赞(你准备好了吗?)

热门文章

  1. python 爬取了租房数据
  2. RESTful 架构详解设计模式一种约束
  3. 爱卡创誓记java饰品,《创誓记AIKA》芙兰精灵配上框架眼睛折服宅男宅女
  4. bootstrap切换tab页局部刷新_bootstrap在 刷新页面,tab选择页面不会改变。
  5. 手工机器人的做法大全用易拉罐_快来吃“智能机器人炒饭”啦!顾客:比人工炒饭还好吃!...
  6. DHT11温湿度传感器模块使用方法和驱动代码实现
  7. linux 查看日志
  8. hightcharts 3d 堆积图下钻
  9. webmin开新网站/创建虚拟服务器失败setquota: Quota file not found
  10. python的返回函数的作用_函数的返回值和作用域