我们知道单个Mysql引用的性能是有极限的,随着应用业务数据不断的增大,随之读写操作并发量巨大,导致应用的响应速度不断下降,甚至会造成数据库直接不可用。我们知道数据写操作会造成表锁,或者行锁来实现数据库的事务隔离。单个Mysql应用要同时处理读、写操作,势必会造成数据库的性能更进一步的下降。在使用大多数应用中我们发现大多数的请求都是查询操作。此时,我们可以将数据库扩展成主从复制模式 ,将读操作和写操作分离开来,多台数据库分摊请求,从而减少单库的访问压力,进而应用得到优化,响应速度提升。
MySQL数据库的主从复制方案,使用的是scp/rsync等命令进行的文件级别复制类似,都是数据的远程传输,只不过MySQL的主从复制是其自带的功能,无需借助第三方工具。而且,MySQL的主从复制并不是数据库磁盘上的文件直接拷贝,而是通过逻辑的binlog日志复制到要同步的服务器本地,然后由本地的线程读取日志里面的SQL语句重新应用到MySQL数据库中。
MySQL同步操作通过3个线程实现,其基本步骤如下:
- 主服务器将数据的更新记录到二进制日志(Binary log)中,用于记录二进制日志事件,这一步由主库线程完成;
- 从库将主库的二进制日志复制到本地的中继日志(Relay log),这一步由 从库 I/O 线程 完成;
- 从库读取中继日志中的事件,将其重放到数据中,这一步由从库 SQL线程 完成。
详细文档见同目录文件:Mysql主从复制集群搭建-基于DockerCompose.md
详细文档见同目录文件:Mysql主从复制集群搭建-Linux版.md
通常情况下,会使用 主服务器 对数据进行 更新、删除 和 新建 等操作,而将 查询 工作落到 从库 头上。
可以将主服务器上的数据同步到 异地从服务器 上,极大地提高了 数据安全性。
数据库的复制功能实现了 主服务器 与 从服务器间 的数据同步,一旦主服务器出了 故障,从服务器立即担当起主服务器的角色,保障系统持续稳定运作。
主从复制 模式支持 2
种扩展方式:
- scale-up
向上扩展或者 纵向扩展,主要是提供比现在服务器 性能更好 的服务器,比如 增加 CPU
和 内存 以及 磁盘阵列等,因为有多台服务器,所以可扩展性比单台更大。
- scale-out
向外扩展或者 横向扩展,是指增加 服务器数量 的扩展,这样主要能分散各个服务器的压力。
搭建主从肯定会增加成本,毕竟一台服务器和两台服务器的成本完全不同,另外由于主从必须要开启 二进制日志,所以也会造成额外的 性能消耗。
从库从主库 复制数据肯定是会有一定的 数据延迟 的。所以当刚插入就出现查询的情况,可能查询不出来。当然如果是插入者自己查询,那么可以直接从 主库 中查询出来,当然这个也是需要用代码来控制的。
主从复制 主要是针对 读远大于写 或者对 数据备份实时性 要求较高的系统中。因为 主服务器 在写中需要更多操作,而且 只有一台 可以写入的 主库,所以写入的压力并不能被分散。
MySQL的主从复制并不完美,存在着几个由来已久的问题,首先一个问题是复制方式:
- 基于SQL语句的复制(statement-based replication,SBR)
- 基于行的复制(row-based replication,RBR)
- 混合模式复制(mixed-based replication,MBR)
- 全局事务标识符 GTID(Global Transaction Identifier,GTID)
- 基于SQL语句的方式是最古老的方式,也是目前默认的复制方式,后来的三种是MySQL 5以后才出现的复制方式。
- 历史悠久,技术成熟
- binlog文件较小
- binlog中包含了所有数据库更改信息,可以据此来审核数据库的安全等情况
- binlog可以用于实时的还原,而不仅仅用于复制
- 主从版本可以不一样,从服务器版本可以比主服务器版本高
- 不是所有的UPDATE语句都能被复制,尤其是包含不确定操作的时候
- 复制需要进行全表扫描(WHERE 语句中没有使用到索引)的 UPDATE 时,需要比 RBR 请求更多的行级锁
- 对于一些复杂的语句,在从服务器上的耗资源情况会更严重,而 RBR 模式下,只会对那个发生变化的记 录产生影响
- 数据表必须几乎和主服务器保持一致才行,否则可能会导致复制出错
- 执行复杂语句如果出错的话,会消耗更多资源
- 任何情况都可以被复制,这对复制来说是最安全可靠的
- 和其他大多数数据库系统的复制技术一样
- 多数情况下,从服务器上的表如果有主键的话,复制就会快了很多
- binlog 大了很多
- 复杂的回滚时 binlog 中会包含大量的数据
- 主服务器上执行 UPDATE 语句时,所有发生变化的记录都会写到 binlog 中,而 SBR 只会写一次,这会
- 导致频繁发生 binlog 的并发写问题
- 无法从 binlog 中看到都复制了写什么语句
混合方式就是有mysql自动选择RBR方式和SBR方式,能够充分发挥两种方式的优点,一般情况下都使用该种方式实现主从复制
- 主从服务器 操作系统版本 和 位数 一致。
- 主数据库和从数据库的 版本 要一致。
- 主数据库和从数据库中的 数据 要一致。
- 主数据库 开启 二进制日志,主数据库和从数据库的
server_id
在局域网内必须 唯一
- MyCat 数据库中间件