推荐一首歌

  - 《可不可以》张紫豪

好吧,随便从排行榜上找了一首

  第十一章《MySQL的复制特性》

总结

1:复制(Replication) 应用场景?

  - 提高性能 (通过主从特性,把写操作全部放在 Master 端,读操作放在 Slave 端,提高整体的 写入/查询 效率)

  - 保存数据 (即使 Master 挂掉,从数据库还保存着数据)

  - 数据分析 (将数据挖掘等耗时吃资源的事,放到 Slave 去做)

2:MySQL 的复制过程是什么样子的?

  - MySQL 的复制过程默认是异步的,也就是说,Master 和 Slave 是不需要实时连接的,甚至 Slave 可以很长时间都不连接 Master ,需要同步时,在连接 Master(一般没人这么做)

  - 但是面对 读写实时性要求很高的场景,明显就不合适了。

    - 在 MySQL5.0 Google 的 MySQL 团队提交了一个补丁,可以实现半同步的功能。

    - 在 MySQL5.5 之后,官方就自带了半同步功能

4:配置主从

  - 修改 Master 数据库

    - log-bin [必须] 二进制日志

    - server-id [必须] 唯一标识

  - 建立专用的复制用户 [授予权限]

    - grant replication slave on *.* to '用户名'@'允许主机' identified by '密码';

  - 查询 Master 主机 bin-log 日志位置,和开始起始位置

mysql> show master status;
+------------------+----------+--------------+------------------+-------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+-------------------+
| bin-log 日志位置 | 起始位置 | | | |
+------------------+----------+--------------+------------------+-------------------+
row in set (0.00 sec)

  - 配置 slave 机器

mysql> change master to
-> master_host='主机IP',
-> master_port='主机端口',
-> master_user='用户名',
-> master_password='密码',
-> master_log_file='master主机bin-log日志位置',
-> master_log_pos='master主机位置';
Query OK, rows affected, warnings (0.00 sec)

  - 配置成功后,查看下 slave 状态

mysql> show slave status \G;
*************************** . row ***************************
Slave_IO_State: Waiting for master to send event
Master_Host: 192.168.27.27
Master_User: genee
Master_Port:
Connect_Retry:
Master_Log_File: mysql-bin.
Read_Master_Log_Pos:
Relay_Log_File: 3c02e653a082-relay-bin.
Relay_Log_Pos:
Relay_Master_Log_File: mysql-bin.
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
Replicate_Do_DB:
Replicate_Ignore_DB:
Replicate_Do_Table:
Replicate_Ignore_Table:
Replicate_Wild_Do_Table:
Replicate_Wild_Ignore_Table:
Last_Errno:
Last_Error:
Skip_Counter:
Exec_Master_Log_Pos:
Relay_Log_Space:
Until_Condition: None
Until_Log_File:
Until_Log_Pos:
Master_SSL_Allowed: No
Master_SSL_CA_File:
Master_SSL_CA_Path:
Master_SSL_Cert:
Master_SSL_Cipher:
Master_SSL_Key:
Seconds_Behind_Master:
Master_SSL_Verify_Server_Cert: No
Last_IO_Errno: 0
Last_IO_Error:
Last_SQL_Errno:
Last_SQL_Error:
Replicate_Ignore_Server_Ids:
Master_Server_Id:
Master_UUID: bb3e01f3-b739-11e8-bc2d-02b2c2845dd0
Master_Info_File: /var/lib/mysql/master.info
SQL_Delay:
SQL_Remaining_Delay: NULL
Slave_SQL_Running_State: Slave has read all relay log; waiting for more updates
Master_Retry_Count:
Master_Bind:
Last_IO_Error_Timestamp:
Last_SQL_Error_Timestamp:
Master_SSL_Crl:
Master_SSL_Crlpath:
Retrieved_Gtid_Set:
Executed_Gtid_Set:
Auto_Position:
Replicate_Rewrite_DB:
Channel_Name:
Master_TLS_Version:
row in set (0.00 sec) ERROR:
No query specified

   - Last_IO_Error 如果这个字段没有信息的话,说明是成功的。

  

5:管理常用命令 ( slave )

  - Slave_IO_State 显示 slave 当前的状态

  - Slave_IO_Running 显示 I/O 状态是否正常运行,正常情况下应该在正常运行,除非手动停止或者出现错误。

  - Last_IO_Errno / Last_SQL_Errno 正常情况下应该输出空值,在出错的时候回提示错误信息。

  - Seconds_Behind_Master 显示当前 slave 和 master 的主从延迟,注意这里的主从延迟指的并不是时间上的延迟

    - 其实是 slave 接受到的 master 节点日志,和已经应用到日志的节点数目。

    - 这么说不好理解,举个例子来说,比如 I/O 接受到的日志写入位置为 3306 ,而 SQL 线程才应用到 1106,中间差了 200 ,Seconds_Behind_Master 的值就会是 200。

    - 但是,此事 master 可能已经写到了 7200 ,所以说,这个值并不是完全精确的代表主从延迟。

    - 这个参数,最好是 0,当然,并不意味着为0了就代表主从的完全同步,还时需要通过其他参数来判断。

  - Master_Log_File / Read_Master_Log_Pos 显示当前读取 master 的二进制文件位置 / 读取位置

  - Relay_Log_File / Relay_Log_Pos 显示当前当前 slave 正在使用处理的中继文件位置 / 读取位置

  - Relay_Master_Log_File / Exec_Master_Log_Pos 显示当前当前 slave 正在使用二进制文件位置 / 读取位置

6: Master 管理 slave 状态

  - 在本地搭建了两个 slave 从机,作为试验

mysql> show processlist \G;
*************************** . row ***************************
Id:
User: root
Host: localhost
db: demo
Command: Query
Time:
State: starting
Info: show processlist
*************************** . row ***************************
Id:
User: genee
Host: 172.17.42.3:
db: NULL
Command: Binlog Dump
Time:
State: Master has sent all binlog to slave; waiting for more updates
Info: NULL
*************************** . row ***************************
Id:
User: genee
Host: 172.17.42.4:
db: NULL
Command: Binlog Dump
Time:
State: Master has sent all binlog to slave; waiting for more updates
Info: NULL
rows in set (0.00 sec)

  - 通过 show processlist 可以在 Master 主机上获取全部的 Slave 从机信息,包括他们的连接状态等

  - 但是如果我们只想获取 slave 的节点消息时,直接可以使用 show slave hosts 来获取全部的状态信息。

mysql> show slave hosts;
+-----------+------+------+-----------+--------------------------------------+
| Server_id | Host | Port | Master_id | Slave_UUID |
+-----------+------+------+-----------+--------------------------------------+
| | | | | a34fad42-b7ca-11e8-a457-0242ac112a04 |
| | | | | 898e0435-b753-11e8-99c5-0242ac112a03 |
+-----------+------+------+-----------+--------------------------------------+
rows in set (0.00 sec)

 7:复制特性的原理?

  - 复制的核心,就是基于 Master 节点对数据库的各项变更机制。

  - Slave 只要连接到 Master 就会不断的去请求 Master 的二进制文件,拿到二进制文件中,解析之后再本地处理。(这个过程中 Slave 是主导地位拉取日志)

7:MySQL的复制模式?(目前只做了解,之后如果有机会的话会详细说)

  - 基于语句复制 (SBR) 基于实际执行的SQL语句复制方案。[S]tatement [B]ase [R]eplication

  - 基于记录复制 (RBR) 基于修改列的复制模式。[R]ow [B]ase [R]eplication

  - 混合复制模式 (MBR) 。 [M]ixed [B]ase [R]eplication

  - 可以通过 查看 binlog_format 参数查看

mysql> show global variables like 'binlog_format';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| binlog_format | ROW |
+---------------+-------+
row in set (0.00 sec)

    - statment 基于语句复制

    - row 基于行复制

    - mixed 混合复制

8:什么是中继日志?

  - 从文件类型上来看,中继日志(Relay Log) 和二进制日志及其相似,区别是逻辑上的。

    - 二进制日志用于保存自身节点产生的数据。

    - 中继日志则是保存接受其他节点的事件。

      - 可以在 my.cnf 中指定中继日志的位置和索引位置(不要随意更改 日志位置/和主机名称 -> 会导致文件位置和索引位置不符合报错)

      - relay-log=‘中继日志位置’

      - relay-log-index=‘中继日志索引位置’

  - MySQL 会在下列情况下 创建新的中继日志文件,并更新其索引

    - 启动 Slave 节点时候。

    - 日志文件达到最大值

      - 由 max_relay_log_size 和 控制。(如果没有 max_relay_log_size 则指定 max_binlog_size 来确定大小)

9:部署联级 Slave 增强性能

  - 总的来说,如果只有 Master 为全部的 Slave 提供节点服务,那么本身就会增加 Master 的负载

  - 所以,我们也可以让 Slave 承担起中转节点的作用。

    - 但是 Slave 只有中继日志,没有二进制日志怎么办

    - 设置 log-slave-updates 参数就好啦

  - 

10:复制环境中的主从切换

  - 在 MySQL 中 并没有很严格的定义 Master 和 Slave 定义。

  - 也就是说,在 MySQL 的复制环境中,随时都可以通过 change master to 来改变。随意性非常强

  - 主从的切换也就是如此,也是用过改变 Master 的状态来改变

2018/09/13《涂抹MySQL》【MySQL复制特性】学习笔记(六)的更多相关文章

  1. 多IDC数据分布--MySQL多机房部署 - 学习笔记 - 51CTO技术博客

    多IDC数据分布--MySQL多机房部署 - 学习笔记 - 51CTO技术博客 多IDC数据分布--MySQL多机房部署

  2. MySQL事务控制语句(学习笔记)

    MySQL事务控制语句(学习笔记) MySQL事务控制语句         在mysql命令行的默认下,事务都是自动提交的,sql语句提交后马上会执行commit操作.因此开启一个事务必须使用begi ...

  3. 深挖计算机基础:MySQL实战45讲学习笔记

    参考极客时间专栏<MySQL实战45讲>学习笔记 一.基础篇(8讲) MySQL实战45讲学习笔记:第一讲 MySQL实战45讲学习笔记:第二讲 MySQL实战45讲学习笔记:第三讲 My ...

  4. MySQL实战45讲学习笔记:第三十九讲

    一.本节概况 MySQL实战45讲学习笔记:自增主键为什么不是连续的?(第39讲) 在第 4 篇文章中,我们提到过自增主键,由于自增主键可以让主键索引尽量地保持递增顺序插入,避免了页分裂,因此索引更紧 ...

  5. 【opencv学习笔记六】图像的ROI区域选择与复制

    图像的数据量还是比较大的,对整张图片进行处理会影响我们的处理效率,因此常常只对图像中我们需要的部分进行处理,也就是感兴趣区域ROI.今天我们来看一下如何设置图像的感兴趣区域ROI.以及对ROI区域图像 ...

  6. java8 新特性学习笔记

    Java8新特性 学习笔记 1主要内容 Lambda 表达式 函数式接口 方法引用与构造器引用 Stream API 接口中的默认方法与静态方法 新时间日期 API 其他新特性 2 简洁 速度更快 修 ...

  7. MySQL实战45讲学习笔记:第二十六讲

    一.引子 在上一篇文章中,我和你介绍了几种可能导致备库延迟的原因.你会发现,这些场景里,不论是偶发性的查询压力,还是备份,对备库延迟的影响一般是分钟级的,而且在备库恢复正常以后都能够追上来. 但是,如 ...

  8. MySQL实战45讲学习笔记:第二十四讲

    一.引子 在前面的文章中,我不止一次地和你提到了 binlog,大家知道 binlog 可以用来归档,也可以用来做主备同步,但它的内容是什么样的呢?为什么备库执行了 binlog 就可以跟主库保持一致 ...

  9. MySQL实战45讲学习笔记:事务隔离级别(第三讲)

    一.隔离性与隔离级别 1.事务的特性 原子性 一致性 隔离性 持久性 2.不同事务隔离级别的区别 读未提交:别人改数据的事务尚未提交,我在我的事务中也能读到.读已提交:别人改数据的事务已经提交,我在我 ...

随机推荐

  1. Cocos2dx网络读取图片

    // // Connection.h // XXDemo // // Created by LeeHonGee on 14-9-4. // // #ifndef __XXDemo__Connectio ...

  2. 大量删除MySQL中的数据

    出现的背景: 公司做了一个redis相关的项目,其中mysql存储了很多统计数据.比如客户端上报的数据,redis实例的数据,应用的数据,机器的数据等.每天都在上报,采集,由于没有定期删除,数据大量累 ...

  3. Go指南练习_rot13Reader

    https://tour.go-zh.org/methods/23 一.题目描述 有种常见的模式是一个 io.Reader 包装另一个 io.Reader,然后通过某种方式修改其数据流. 例如,gzi ...

  4. Go指南练习_Stringer

    源地址 https://tour.go-zh.org/methods/18 一.题目描述 通过让 IPAddr 类型实现 fmt.Stringer 来打印点号分隔的地址. 例如,IPAddr{1, 2 ...

  5. Zookeeper系列五:Master选举、ZK高级特性:基本模型

    一.Master选举 1. master选举原理: 有多个master,每次只能有一个master负责主要的工作,其他的master作为备份,同时对负责工作的master进行监听,一旦负责工作的mas ...

  6. Java如何将每个单词的第一个字符转为大写?

    在Java编程中,如何将每个单词的第一个字符转为大写? 以下示例演示如何使用toUpperCase(),appendTail()方法将字符串中每个单词的第一个字母转换为大写字母. package co ...

  7. Spark学习笔记——房屋价格预测

    先翻译了一下给的房屋数据的特征,这里定义了一个case class,方便理解每个特征的含义, Kaggle的房价数据集使用的是Ames Housing dataset,是美国爱荷华州的艾姆斯镇2006 ...

  8. 一台PC双网卡,一个外网一个内网

    问题:一台PC双网卡,一个连外网一个连内网.用户主要访问外网,内网只访问有限的几个ip.因为外网很大,一般人公司内网常访问的ip是有限的几个. 现在如何做到在上外网的同时也能访问内网的系统?明明两个网 ...

  9. Http Referer的一些总结

    以前对Http中Referer的认识不够透彻.最近理了理,记录一下. 1 Referer可以记录访问的来源,统计访问量,可以用来防盗链. 2 客户端用js不能篡改Referer,用一些插件什么的可以达 ...

  10. vue封装第三方插件并发布到npm

    前言 写此文前特意google了一下,因为有较详细的开发教程我再写意义不大,有把插件封装成组件的教程,有把自己的组件封住成插件的教程,本文主要说明如何把第三方的插件封装成vue插件,简化配置,一键安装 ...