mysql复制基本原理流程是啥?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了mysql复制基本原理流程是啥?相关的知识,希望对你有一定的参考价值。

流程如下:
1. 主:binlog线程——记录下所有改变了数据库数据的语句,放进master上的binlog中;
2. 从:io线程——在使用start slave 之后,负责从master上拉取 binlog 内容,放进自己的relay log中;
3. 从:sql执行线程——执行relay log中的语句;
这是黑马程序员讲师的讲义,你可以动手操作一下下。
参考技术A

问题

我们都知道,半同步复制中,如果 slave 比较慢,会拖慢 master 的提交性能。

那么,在一主多从的半同步架构中,如果 master 的提交性能慢,如何判断是哪个 slave 拖慢了性能?


实验

先通过 dbdeployer 快速搭建一主两从半同步集群:

下面给 master 施加一些压力:

然后我们用 strace,拖慢 slave2 的运行速度。

由于半同步复制的原因,现在 slave2 拖慢了 master 的提交性能。我们开始诊断,

设置半同步插件的日志级别为 16:

查看 master 的 error log:

大概扫一下 error log,如图举例,发现大部分半同步阻塞,最后收到的都是 server_id 为 300 的 slave。

而在我们的环境中,slave2 的 server_id 恰好是 300。

最后,记得将调整的日志级别调回来:

半同步插件并没有提供方便的方法查看各个 slave 谁拖慢了性能,所以我们通过调试日志来查看最后一个返回的 ack 都来自于哪台 slave。

大家使用此方法时,要注意调试日志的量比较大,不要开启太久以防占用过多磁盘。

参考技术B mysql使用教程
php将csv文件导入到mysql数据库的方法
本程序实现数据导入原理是先把csv文件上传到服务器,然后再通过php的fopen与fgetcsv文件把数据保存到数组,然后再用while把数据一条条插入到mysql数据库,

“Serializable”接口背后的基本原理是啥? [复制]

【中文标题】“Serializable”接口背后的基本原理是啥? [复制]【英文标题】:What's the rationale behind "Serializable" interface? [duplicate]“Serializable”接口背后的基本原理是什么? [复制] 【发布时间】:2015-04-25 15:32:06 【问题描述】:

如果我们想序列化一个对象,我们可以简单地做如下实现:

class MyClass implements Serializable

  private static final long serialVersionUID = 12345L;

并且不需要额外的努力来强制实现对象将如何写入文件和从文件中读取。 Java 只负责处理所有事情。

另一方面,Externalizable 确实定义了显式的序列化和反序列化方法,因此我们可以进行命令式编程。

这给我留下了一个问题:如果 Serializable 不需要额外的努力,那么让它成为我们必须实现的接口来序列化/反序列化对象的基本原理是什么,而不是默认情况下每个对象都可以序列化/反序列化?

【问题讨论】:

好问题。在 Python 中,默认情况下所有内容都是 serializablepickle-able 答案可以在这里找到:***.com/questions/441196/… 【参考方案1】:

当程序员将一个类标记为可序列化时,他负责如果这个类将来发生变化,保存对象的程序将能够将它们读回更新的类。详细信息在 Effective Java 第 74 条:明智地实现 Serializable

还有另一个理由。你有没有注意到ObjectOutput.writeObject(Object obj) 接受对象,而不是可序列化的?这是因为它假定可以使用不同的序列化机制来保存对象。 Serializable 表示该对象应该使用 Java 标准序列化来保存

【讨论】:

你的意思是ObjectOutput.writeObject()ObjectOutputStream.writeObject() 我的意思是接口ObjectOutput,ObjectOutputStream.writeObject(Object)只接受Serializable【参考方案2】:

因为:

    并非所有对象都对此具有有意义的语义。示例:单例对象 安全。如果您将对象传递给其他人的代码并且他们总是可以捕获和传输对象,那么就需要选择退出与安全相关的代码,并且当人们忽略某个对象时会出现安全漏洞。所以“默认关闭”更安全。 内置的序列化格式会为您编写的每个对象写出类名,因此效率非常低。仅将其用于数据很少的非常简单的情况。 默认序列化不会轻易地与用其他语言编写的代码共享数据,因此如果今天编写的数据将来可能需要由其他软件读取,则应考虑使用特定的表示。所以这不是一个好的长期格式。 并非所有开发人员都牢记它在所有情况下如何工作的确切规则。

如果您阅读 Joshua Bloch 的 Effective Java 一书,它会解释使用内置功能是多么棘手。大多数开发人员在很多情况下都避免使用它。这个答案给出了一个很好的经验法则https://softwareengineering.stackexchange.com/a/240432/129659

【讨论】:

【参考方案3】:

Serializable 接口仅作为标识的掩码。如果每个类 具有被序列化的能力,那么每个类都需要维护serialVersionUID以避免版本冲突。另外,它可能会导致安全问题:有些人会将它用作创建新对象的一种方式,虽然 该对象不打算由客户端代码创建。使用 Serializable 接口是不安全的。有关更多信息,请参阅有效的 Java。

【讨论】:

以上是关于mysql复制基本原理流程是啥?的主要内容,如果未能解决你的问题,请参考以下文章

C++ switch 仅适用于整数类型的基本原理是啥? [复制]

mysql主从复制的基本原理

mysql 试题总结

Mysql面试题

1207MySQL 面试题

mysql面试题三