高并发系统设计六-查询请求增加时,如何做主从分离

查询请求增加时,如何做主从分离

4核 8G 的机器上运行 MySQL 5.7是,大概可以支撑 500 的 TPS 和 10000 的QPS。

1、主从读写分离

将一个数据库中的数据拷贝为一份或者多份,并且写入到其他的数据库服务器中,原始的数据库我们称为是主库,主要负责数据的写入,拷贝的目标数据库为从库,主要负责支持数据查询。技术关键点为:

1、数据的拷贝-主从复制

2、在主从分离的情况下,如果屏蔽主从分离带来的访问数据库方式的变化,即开发同学像是在使用单一数据库一样。

1.1、主从复制

1、MySQL的主从复制

  • 1、master将改变记录到binary log中,这些记录过程叫做二进制日志时间,binary log events
  • 2、slave 将 master 的 binary log events 拷贝到它的中继日志(relay log)
  • 3、slave 重做中继日志中的事件,将改变应用到自己的数据库中。MySQL复制是异步的且串行化的

做了主从复制之后,可以写入时只写主库,在读数据时只读从库,这样即使写请求会锁表或者锁记录,也不会影响到读请求的执行。同时,在读流量比较大的情况下,我们可以部署多个从库共同承担读流量。

1.2、如何访问数据库

如果项目中需要使用一个主库地址和多个从库地址,并且需要区分写入操作和查询操作。为了降低实现的复杂度,业界有许多数据库中间件可以来解决数据库访问的问题,这些中间件可以分为两类

  • 类似淘宝的 TDDL(Taobao Distributed Date Layer)为代表,以代码式内嵌运行在应用程序内部。

这种方式其实可以看作是一种数据源的代理,它配置管理这多个数据源,每个数据源对应一个数据库,可能是主库,也可能是从库。当一个数据库请求时,中间件将 SQL 语句发给某一个指定的数据源来处理,然后将处理结果返回

  • 单独部署的代理方案,这一类方案代表比较多,比如 阿里的Mycat,360 的 Atlas,美团开源的基于 Atlas 开发啊 DBProxy 等。

这一类中间件部署在独立的服务器上,业务代码如同在使用单一数据库一样使用它,实际上它内部管理着许多的数据源,当有数据库请求时,它会对 SQL 语句做必要的改写,然后发往指定的数据源。它使用表中的 MySQL 的通信协议,可以支持多种语言。维护升级比较方便,适合有一定运维能力的大中型团队使用,缺陷是所有的 SQL 语句都需要跨两次网络:从应用到代理层和从代理层到数据源,所以在性能上会有一些损耗。

2、小总结

  • 1、主从读写分离以及部署一主多从可以解决突发的数据库读流量,是一种数据库横向扩展的方法
  • 2、读写分离后,主从的延迟是一个关键的监控指标,可能会造成写入数据之后立刻读的时候读取不到数据的情况
  • 3、有许多方案可以屏蔽主从分离后访问数据库访问的细节,比如 TDDL、Sharding-JDBC 这样的嵌入应用内部的方案,也有像 Mycat 这样的独立部署的代理方案。
发布了57 篇原创文章 · 获赞 3 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/wmdkanh/article/details/105473639