这是前段时间面试,被问到的一个问题,觉得还是不错的,记录下来;
整体记录:
1.解决DB的读写压力;
2.高可用;
3.数据同步;
4.再优化
只是记录理念,具体的实现搭建自行学习哈;
首先,算是个人逻辑,
在我们拿到这样一道题目,或者说,平时工作过程中,接到新需求时,
我们应该会有一个大概的实现方案,包含我们将会采用的技术,实现的逻辑等等;
也就是说:想一想实现过程中可能遇到的问题,及其解决方案.
1.问题分析及解决方案
正如上面说的:我们首先拿到这道题目,我们应该来分析,我们可能遇到的问题,及其解决方案.
1.1 DB的读写压力;
首先:映入眼帘的,高数据量.高并发;
那最直接的问题:**数据库的读写压力**;
解决方案:
分库分表
关于分库分表;
暂时简单了解一些,懂得这些东西就够了,具体需要搭建设计的时候,再深入去学习实践吧;
分库分表:
1,水平分库分表:
分库:
把一个数据库的数据表分到多个不同的数据库,每个库只有这个表的部分数据,这些库可以分布在不同服务器,从而使访问压力被多服务器负载;
分表:
把一个表的数据分到多个同一个数据库的多张表中,每个表只有这个表的部分数据,从而减轻数据库表的压力;
2.垂直分库分表:
分库:
把一个数据库里的表,按照不同的标准规则,分别保存在不同的数据库,实现减轻服务器的压力,提高性能;
分表:
把一张表里的字段,按照不同的标准规则,分别保存在不同的表中.实现减轻数据库表的压力,提高性能;
通过分库分表,解决-单个数据库读写压力过高的问题;
1.2 高可用
那解决了数据库的读写压力后,问题又来了,这么多数据库,万一其中一个挂了,那涉及到这部分的业务全都挂,阻塞从而导致整个系统的崩溃;
解决方案:
主从备份,读写分离,集群
1.3 数据同步
通过主从备份,读写分离解决了高可用的问题;但是,同时也带来了新问题:
数据的同步问题;
保证主从数据库间的数据同步;
解决方案:
中间件
2.再优化
2.1添加缓存
对数据进行分类:
1.一些实时性和精确性要求比较高的数据,比如订单信息,支付信息等 --> 不添加缓存,直接读写数据库;
2.一些读多写少的数据 --> 可以使用redis缓存;
3.一些几乎没有业务关联的数据, --> 可以使用mongoDb缓存;
3.几乎不修改的数据,比如一些商品的分类栏目等, --> 可以使用本地内存缓存;
2.2有些特殊时刻.拥有超高的并发,比如,整点发放优惠券.双十一呀这种的;
解决方案:
可以采用消息队列 --> 削峰; 以保证程序不会瞬间宕机;