共计 3243 个字符,预计需要花费 9 分钟才能阅读完成。
导读 | 使用云上的 MySQL 时,会遇到很多人询问 CDB 的 为了更好的了解云上的 MySQL,本文将介绍一些重要的知识点。 |
使用云上的 MySQL 时,会遇到很多人询问 CDB 的 为了更好的了解云上的 MySQL,本文将介绍一些重要的知识点。
实例类型
目前云数据库 MySQL 支持三种架构:基础版、高可用版、单节点高 IO 版。
应用发起数据更新(含 insert、update、delete 等操作)请求,Master 在执行完更新操作后立即向应用程序返回响应,然后 Master 再向 Slave 复制数据。
数据更新过程中 Master 不需要等待 Slave 的响应,因此异步复制的数据库实例通常具有较高的性能,且 Slave 不可用并不影响 Master 对外提供服务。但因数据并非实时同步到 Slave,而 Master 在 Slave 有延迟的情况下发生故障则有较小概率会引起数据不一致。
腾讯云数据库 MySQL 异步复制采用一主一从的架构。
应用发起数据更新(含 insert、update、delete 操作)请求,Master 在执行完更新操作后立即向 Slave 复制数据,Slave 接收到数据并写到 relay log 中(无需执行)后才向 Master 返回成功信息,Master 必须在接受到 Slave 的成功信息后再向应用程序返回响应。
仅在数据复制发生异常(Slave 节点不可用或者数据复制所用网络发生异常)的情况下,Master 会暂停(MySQL 默认 10 秒左右)对应用的响应,将复制方式降为异步复制。当数据复制恢复正常,将恢复为半同步复制。
腾讯云数据库 MySQL 半同步复制采用一主一从的架构。
应用发起数据更新(含 insert、update、delete 操作)请求,Master 在执行完更新操作后立即向 Slave 复制数据,Slave 接收到数据并执行完 后才向 Master 返回成功信息,Master 必须在接受到 Slave 的成功信息后再向应用程序返回响应。
因 Master 向 Slave 复制数据是同步进行的,Master 每次更新操作都需要同时保证 Slave 也成功执行,因此强同步复制能最大限度的保障主从数据的一致性。但因每次 Master 更新请求都强依赖于 Slave 的返回,因此 Slave 如果仅有单台,它不可用将会极大影响 Master 上的操作。
腾讯云数据库 MySQL 强同步复制采用一主两从的架构,仅需其中一台 Slave 成功执行即可返回,避免了单台 Slave 不可用影响 Master 上操作的问题,提高了强同步复制集群的可用性。
目前使用最多的就是高可用版本的一主一从架构,正常情况下,客户通过 VIP:Port 的方式链接到主库上,从库通过 binlog 和主进行同步。云上 MySQL 在数据库所在的物理机发生硬件故障时是如何保证高可用呢?
从库所在的物理机发生故障是,对客户端来说业务是完全不受影响,在从库所在物理机异常后,云平台会自动发起重建从库的流程,在健康的物理机上新建一个从库,导入冷备数据后和主库进行同步,同步完毕后,此时数据库又恢复了主从高可用状态。
数据库的升级不仅包含数据库版本升级,还包括硬件升配,当然硬件的降配具体的原理也是一样的。
从上面的步骤我们可以看到升级实例时,完全不影响数据库的正常使用。升级主要花费的时间是导入冷备和追 binlog 这两个步骤,而这两个环节的所需的时间取决于客户的数据量大小和产生的 binlog 的大小。一般导入冷备的速度是 50G/h(理论值仅供参考)。
binlog 日志用于记录所有更改数据的语句,俗称二进制日志,主要用于复制和即时点恢复。主从复制也是依赖于 binlog 的。类似于 Oracle 的 archivelog,Mongodb 的 oplog,所有和写有关或者可能有关的语句,都会记录在 binlog 文件中。云上的 MySQL 数据库的 binlog 文件都是每 1G 自动生成一个(新购实例也可能 256M 做一次切割),除非做了 flush logs 的操作。
MySQL 的 binlog 默认保留 5 天,所以如果需要回档的话,只能恢复到 5 天内的任意时间点。
另外控制台下载的 binlog 日志,需要在本地解析的话,须确保客户端的 MySQL 版本与 CDB for MySQL 的版本一致,否则会出现解析出乱码的情况,建议使用 3.4 或以上版本的 mysqlbinlog。
回档是将数据库通过冷备和 binlog 恢复到之前的某个时间点的一种操作。CDB 的回档分为普通回档、快速回档以及极速回档:
慢查询就是执行数据库查询时消耗时间比较大的 SQL 语句。MySQL CPU 利用率过高,大部分原因与低效 SQL 有关系,通过优化低效 SQL 基本可以解决大部分问题。MySQL 慢查询时间的默认值是 10s,在遇到性能问题时,若发现没有慢查询,建议将其参数调成 1s,再观察业务周期内的慢查询,进而对其慢查询进行优化。
如果出现全表扫描较高的情况,可以打开 log_queries_not_using_indexes 参数,此时未使用索引的全表扫描也可以记录到慢查询里面。这个参数并不建议一直打开,会对数据库的磁盘造成较大影响。
用户使用查询语句得到的 MySQL 空间和控制台看到的已使用空间相比有很大出入,为什么?
MySQL 的空洞效应导致,使用过程中的一些碎片没有得到合理释放因此查询语句查出来的空间和控制台统计的实际已使用空间相比少了许多,这部分是碎片,彻底解决需要在夜深人静的时候执行 optimize table。