业务上线初期,流量少数据库压力小只有一个主库绝对够用,但是随着业务的发展,流量的增多,一个数据库就很难承受如此巨大的流量了,特别是峰值时段.然而几乎所有系统都是读多写少的场景,因此如果能够将读写分离就会大大提高系统的并发量.下面来讲解一下从分离的几个方法.
主从复制
简单说就是一个主库,一个或多个从库,其中主库主要负责数据的写入,从库主要负责数据的读取.
实现方法:
以mysql为例,主从复制是依赖binlog日志的,mysql的所有操作都会记录到以二进制形式保存的binlog日志文件中,然后将此日志文件同步到从库,最终达到主从一致,但是此过程是有延迟的,但是大部分互联网场景都能够容忍此延迟.
主从实现过程:
从库会创建一个IO线程,用于请求主库的binlog日志,并将请求的数据保存到relay log的日志文件中,而主库也需要创建一个log dump的线程发送binlog给从库.从库还需要创建一个sql线程来读取relay log的内容到从库做回放,最终实现主从一致.

缺点:
-
主库的写入是异步的,不会等待从库响应,因此如果中间网络断开或者磁盘坏掉会造成主从不一致,不过大多数互联网场景是可以接受的. -
从库数量不宜过多,因为从库越多主库需要创建的log dump线程也会越多,造成主库资源消耗比较大,所以一般一个主库连接 3-5个 从库即可.另外从库越多后期部署和维护也会大大增加难度.
注意事项:
主从复制并不是强实时的,因此可能会出现数据写入成功了,但是查询一直查询不到数据.此时并非全部为代码问题,因此应该加上 主从落后时间作为数据库的关键指标告警,一般延迟在毫秒级即为正常.如果没有此告警再进行代码检查是否存在问题.
读写分离实现
未进行读写分离之前只需要配置一个数据库地址即可,如果现在需要读写分离则需要配置一个主库地址和多个从库地址,并且还要去分查询和写入操作,这无疑增加了实现难度,目前主要有两种实现方式业界.
-
淘宝TDDL(Taobao Distributed Data Layer), 一种数据源的代理,可以配置多个数据源,没个数据源可以是主库也可以是从库,当有数据请求时候,将SQL语句发送到对应的数据库并返回结果信息. -
单独部署代理层方案,此类中间件单独部署在独立的服务器,业务代码可以直接使用单一数据库一样使用,此中间件管理多个数据源,当有sql请求时候,发往制定的数据源.
写在最后
主从分离是提高系统性能的方法之一,希望这篇文章可以帮助大家更深刻理解主从复制。关注程序员小徐,专注技术坑。
原文始发于微信公众号(程序员小徐):数据库主从分离真的理解么
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/240835.html