读写分离与分库分表
首页->学习资料->编程语言->java架构师教程->分布式架构 关键词: 发布时间:2020-05-29 16:05:05 浏览次数:1502

这些概念应该都很熟悉了,只说一下优缺点:

垂直切分的优缺点:

优点:

  • 拆分后业务清晰,拆分规则明确;

  • 系统之间容易扩展和整合;

  • 数据维护简单

缺点:

  • 部分业务表无法join,只能通过接口调用,提升了系统的复杂度;

  • 跨库事务难以处理;

  • 垂直切分后,某些业务数据过于庞大,仍然存在单体性能瓶颈;



水平拆分的优缺点:

优点:

  • 解决了单库大数据、高并发的性能瓶颈;

  • 拆分规则封装好,对应用端几乎透明,开发人员无需关心拆分细节;

  • 提高了系统的稳定性和负载能力;

缺点:

  • 拆分规则很难抽象;

  • 分片事务一致性难以解决;

  • 二次扩展时,数据迁移、维护难度大。比如:开始我们按照用户id对2求模,但是随着业务的增长,2台数据库难以支撑,还是继续拆分成4个数据库,那么这时就需要做数据迁移了。



总结

世界上的万物没有完美的,有利就有弊,就像数据切分一样。无论是垂直切分,还是水平切分,它们解决了海量数据的存储和访问性能问题,但也随之而来的带来了很多新问题,它们的共同缺点有:

  • 分布式的事务问题;

  • 跨库join问题;

  • 多数据源的管理问题

针对多数据源的管理问题,主要有两种思路:

  1. 客户端模式,在每个应用模块内,配置自己需要的数据源,直接访问数据库,在各模块内完成数据的整合;

  2. 中间代理模式,中间代理统一管理所有的数据源,数据库层对开发人员完全透明,开发人员无需关注拆分的细节。



读写分离的弊端

读写分离给我们带来的好处是很多的,我们对比一下原始的架构和读写分离的架构,从数据流上看,他们的区别是,数据从写入到数据库,到从数据库取出,读写分离的架构多了一个同步的操作。大家想一想,同步操作的时间是多少,延迟如果太大对系统有没有影响,如果同步挂了怎么办?举一个亲身经历的案例,那时老师在做个人中心的订单列表页,这个功能挺简单,只需要把订单数据取出来,在页面上展示就可以了。但是在做的时候,订单以及订单相关的数据都是从读库取出的,其中就包括支付状态,这个用户非常敏感的字段。就在某一天的某一个时段,突然接到了用户大量的投诉,说用户已经付了钱了,但是订单的状态还是未支付。我也觉得很奇怪,马上要了一个订单号,去数据库里查询,发现订单状态就是未支付呀,没有问题,过了一会,为了保险起见,我还是去写库再查一下这个订单吧,发现写库的订单状态确实是已支付,这下完了,写库和读取的数据不一致,我马上通知DBA,让他去查数据库,他的反馈是同步挂掉了。

大家看到了吧,这就是读写分离的弊端,当同步挂掉,或者同步延迟比较大时,写库和读库的数据不一致,这个数据的不一致,用户能不能接受,订单支付状态这个不一致当然是不能接受的了,其他的业务场景能不能接受呢?这个要对不同的业务场景做具体的分析了。

如何正确的使用读写分离

一些对数据实时性要求不高的业务场景,可以考虑使用读写分离。但是对数据实时性要求比较高的场景,比如订单支付状态,还是不建议采用读写分离的,或者你在写程序时,老老实实的从写库去读取数据。我也咨询过专门做数据同步的机构,他们给出的建议是,如果你做数据的同步,你的网络延迟应该在5ms以内,这个对网络环境要求是非常高的,大家可以ping一下你网络中的其他机器,看看能不能达到这个标准。如果你的网络环境很好,达到了要求,那么使用读写分离是没有问题的,数据几乎是实时同步到读库,根本感觉不到延迟。


赞:(0)
踩:(0)
相关文章
navicate连接mycat报1184错误
centos7下mycat安装及配置
分布式锁对比
MyCat读写分离和分库分表
热门文章
win7中将文件拷贝到虚拟机linux下
phpexcel设置行高及列宽,背景颜色,
rabbitmq无法启动
intellij idea不显示git push按钮
php7中使用mongodb的aggregate进行
centos7.4 64位下swoole安装及配置
laravel页面静态化的方法
navicate连接mycat报1184错误
单点登录sso原理及php实现方式及de
devops-jenkins容器为pending状态
好评文章
phpexcel设置行高及列宽,背景颜色,
php7中使用mongodb的aggregate进行
intellij idea打开文件所在文件夹
windows下使用MongoDB Compass Com
win7中将文件拷贝到虚拟机linux下
laravel 中悲观锁 & 乐观锁的使用
单点登录sso原理及php实现方式及de
navicate连接mycat报1184错误
rabbitmq无法启动
laravel整合dingo/api方法步骤:jwt
标签
rabbitmq mysql备份 elasticsearch golang swoole
我的项目
【github】www.github.com/hurong241
【码云】gitee.com/hu_rong/projects
【docker hub】hub.docker.com/repositories/hurong241
【packagist】packagist.org/users/hurong241/packages
站点信息
建站时间:2011年
文章数:607篇
浏览数:935521
粤ICP备18028092号-1  微信:hurong241