/mysql-master-slave

Mysql主从集群搭建方法,以及基于spring boot注解式数据库读写分离代码示例

Primary LanguageJava

Mysql主从复制集群

为什么要使用Mysql主从复制集群

我们知道单个Mysql引用的性能是有极限的,随着应用业务数据不断的增大,随之读写操作并发量巨大,导致应用的响应速度不断下降,甚至会造成数据库直接不可用。我们知道数据写操作会造成表锁,或者行锁来实现数据库的事务隔离。单个Mysql应用要同时处理读、写操作,势必会造成数据库的性能更进一步的下降。在使用大多数应用中我们发现大多数的请求都是查询操作。此时,我们可以将数据库扩展成主从复制模式 ,将读操作写操作分离开来,多台数据库分摊请求,从而减少单库的访问压力,进而应用得到优化,响应速度提升。

Mysql主从复制的原理

MySQL数据库的主从复制方案,使用的是scp/rsync等命令进行的文件级别复制类似,都是数据的远程传输,只不过MySQL的主从复制是其自带的功能,无需借助第三方工具。而且,MySQL的主从复制并不是数据库磁盘上的文件直接拷贝,而是通过逻辑的binlog日志复制到要同步的服务器本地,然后由本地的线程读取日志里面的SQL语句重新应用到MySQL数据库中。

Mysql主从复制的底层流程细节

主从复制的流程

MySQL同步操作通过3个线程实现,其基本步骤如下:

  1. 主服务器将数据的更新记录到二进制日志(Binary log)中,用于记录二进制日志事件,这一步由主库线程完成;
  2. 从库主库的二进制日志复制到本地的中继日志(Relay log),这一步由 从库 I/O 线程 完成;
  3. 从库读取中继日志中的事件,将其重放到数据中,这一步由从库 SQL线程 完成。

Mysql主从复制集群搭建

基于Docker compose搭建

详细文档见同目录文件:Mysql主从复制集群搭建-基于DockerCompose.md

基于原生linux mysql 搭建

详细文档见同目录文件:Mysql主从复制集群搭建-Linux版.md

Mysql主从复制集群的优缺点

优点

1. 负载均衡

通常情况下,会使用 主服务器 对数据进行 更新删除新建 等操作,而将 查询 工作落到 从库 头上。

2. 异地容灾备份

可以将主服务器上的数据同步到 异地从服务器 上,极大地提高了 数据安全性

3. 高可用

数据库的复制功能实现了 主服务器从服务器间 的数据同步,一旦主服务器出了 故障,从服务器立即担当起主服务器的角色,保障系统持续稳定运作。

4. 高扩展性

主从复制 模式支持 2 种扩展方式:

  • scale-up

向上扩展或者 纵向扩展,主要是提供比现在服务器 性能更好 的服务器,比如 增加 CPU内存 以及 磁盘阵列等,因为有多台服务器,所以可扩展性比单台更大。

  • scale-out

向外扩展或者 横向扩展,是指增加 服务器数量 的扩展,这样主要能分散各个服务器的压力。

缺点

1. 成本增加

搭建主从肯定会增加成本,毕竟一台服务器和两台服务器的成本完全不同,另外由于主从必须要开启 二进制日志,所以也会造成额外的 性能消耗

2. 数据延迟

从库主库 复制数据肯定是会有一定的 数据延迟 的。所以当刚插入就出现查询的情况,可能查询不出来。当然如果是插入者自己查询,那么可以直接从 主库 中查询出来,当然这个也是需要用代码来控制的。

3. 写入更慢

主从复制 主要是针对 读远大于写 或者对 数据备份实时性 要求较高的系统中。因为 主服务器 在写中需要更多操作,而且 只有一台 可以写入的 主库,所以写入的压力并不能被分散。

MySQL主从复制的复制方式

MySQL的主从复制并不完美,存在着几个由来已久的问题,首先一个问题是复制方式:

  • 基于SQL语句的复制(statement-based replication,SBR)
  • 基于行的复制(row-based replication,RBR)
  • 混合模式复制(mixed-based replication,MBR)
  • 全局事务标识符 GTID(Global Transaction Identifier,GTID)
  • 基于SQL语句的方式是最古老的方式,也是目前默认的复制方式,后来的三种是MySQL 5以后才出现的复制方式。

SBR方式的优缺点

SBR的优点

  • 历史悠久,技术成熟
  • binlog文件较小
  • binlog中包含了所有数据库更改信息,可以据此来审核数据库的安全等情况
  • binlog可以用于实时的还原,而不仅仅用于复制
  • 主从版本可以不一样,从服务器版本可以比主服务器版本高

SBR的缺点:

  • 不是所有的UPDATE语句都能被复制,尤其是包含不确定操作的时候
  • 复制需要进行全表扫描(WHERE 语句中没有使用到索引)的 UPDATE 时,需要比 RBR 请求更多的行级锁
  • 对于一些复杂的语句,在从服务器上的耗资源情况会更严重,而 RBR 模式下,只会对那个发生变化的记 录产生影响
  • 数据表必须几乎和主服务器保持一致才行,否则可能会导致复制出错
  • 执行复杂语句如果出错的话,会消耗更多资源

RBR方式的优缺点

RBR的优点

  • 任何情况都可以被复制,这对复制来说是最安全可靠的
  • 和其他大多数数据库系统的复制技术一样
  • 多数情况下,从服务器上的表如果有主键的话,复制就会快了很多

RBR 的缺点:

  • binlog 大了很多
  • 复杂的回滚时 binlog 中会包含大量的数据
  • 主服务器上执行 UPDATE 语句时,所有发生变化的记录都会写到 binlog 中,而 SBR 只会写一次,这会
  • 导致频繁发生 binlog 的并发写问题
  • 无法从 binlog 中看到都复制了写什么语句

混合方式

混合方式就是有mysql自动选择RBR方式和SBR方式,能够充分发挥两种方式的优点,一般情况下都使用该种方式实现主从复制

Mysql主从复制注意事项

  1. 主从服务器 操作系统版本位数 一致。
  2. 主数据库和从数据库的 版本 要一致。
  3. 主数据库和从数据库中的 数据 要一致。
  4. 主数据库 开启 二进制日志,主数据库和从数据库的 server_id 在局域网内必须 唯一

Mysql其他集群方式

  • MyCat 数据库中间件