分享

单机到分布式系统——数据库的分离

 WindySky 2017-11-23
数据库读写压力大——读写分离
一、采用数据库作为读库
读多写少,那么多加一个数据库作为读库,只用来提供读服务。
单机到分布式系统——数据库的分离
问题
                1、数据怎么复制到读库?
数据库系统一般都提供了数据复制的功能,直接使用数据库系统的自身机制。
                2、数据复制时延问题?
数据复制延迟带来的就是短期的数据不一致。例如我们修改了用户信息,在这个信息还没有复制到读库是,我们从读库上读出来的信息就不是最新的。
                3、对结构变化的影响?
我们的应用需要根据不同的情况来选择不同的数据库源。写操作要走主库,事务中的读也要走主库,即使不是事务中的读,考虑到备库的数据延迟,不同业务下选择也会有差异。

二、搜索引擎也是一个读库
大型网站的站内搜索功能
搜索功能有几种实现方式
1、数据库中的like功能(代价大)
2、使用搜索引擎的倒排表方式(速度快)
搜索引擎要工作,首要一点是需要根据被搜索的数据来构建索引(数据复制)。
引入了搜索引擎之后,我们的应用也需要知道什么数据应该做搜索,什么数据应该走数据库。
单机到分布式系统——数据库的分离
搜索集群的使用方式和读库是一样的。只是构建索引的过程基恩都是需要我们自己来实现的。
从两个维度对搜索系统构建索引的方式进行划分:
按照全量/增量划分:
全量方式用于第一次建立索引,而增量方式用户在全量的基础上持续更新索引。
按照实时/非实时划分:
体现在索引更新的时间上。

三、加速数据读取——增加缓存
1、数据缓存
缓存系统一般是用来保存和查询键值对的。缓存中放的是“热”数据而不是全部的数据,填充方式就是通过应用完成的,即应用访问缓存,如果数据不存在,则从数据库读出数据后放入缓存。随着时间的推移,当缓存容量不够需要清理数据时,最近不被访问的数据就被清除了。
使用这种方式有一个要求,即根据数据库记录的变化去更新缓存的代码要能够理解业务逻辑。

2、页面缓存
采用ESI或者类似的思路来做,也可uiba页面缓存与页面渲染放在一起处理。
web服务器前端有Apache/Nginx服务器。
对于ESI的处理是在Apache中进行。web服务器产生的请求响应结果返回Apache,Apache中的模块会对响应结果做处理解析找到ESI标签,然后去缓存中获取这些ESI标签对应的内容,如果这些内容不存在,那么Apache中的模块会通过web服务器去渲染这些内容,并且把结果放入缓存中,用内容换掉ESI 标签,返回给客户的浏览器。
单机到分布式系统——数据库的分离
四、弥补关系型数据库的不足——分布式存储系统
常见的分布式系统有分布式文件系统、福不是Key-value系统和分布式系统和分布式数据库。
分布式存储系统自身起到了存储的作用,也就是提供数据的读写支持。相对于读写分离中的读“源”,分布式存储系统更多的是直接替代了主库。
单机到分布式系统——数据库的分离
五、读写分离后,主库中业务的数据还是在一个数据库中,这个数据库的压力还是持续增加。解决这个问题,我们有数据垂直拆分和水平拆分两种选择。
1、垂直拆分
专库专用,不同的业务数据拆分 到不同的数据库,适用于业务过多
缺点:应用需要配置多个数据源,这就增加了所需的配置,但是带来每个数据库连接池的隔离
如何处理跨业务的事务?
一种是使用分布式事务,其性能要明显低于之前的单机事务。
另一种是去掉事务或者不去追求强事务支持,则原来在单库中可以使用的表关联的查询就需要改变实现了。

2、数据水平划分
把同一个表的数据拆到两个数据库中。适用于数据量大的数据库
单机到分布式系统——数据库的分离
单机到分布式系统——数据库的分离

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多