1、缓存式的Web应用程序架构:数据库
在Web层和db层之间加一层cache层,主要目的:减小数据库读取负担,提升数据读取速度。cache存取的媒介是内存,能够考虑采用分布式的cache层,这样更容易破除内存容量的限制,同时增长了灵活性。缓存
2、业务拆分:服务器
电商平台,包含了用户、商品、评价、订单等几大模块,最简单的作法就是在一个数据库中分别建立users、shops、comment、order四张表。架构
可是,随着业务规模的增大,访问量的增大,咱们不得不对业务进行拆分。每个模块都使用单独的数据库来进行存储,不一样的业务访问不一样的数据库,将本来对一个数据库的依赖拆分为对4个数据库的依赖,这样的话就变成了4个数据库同时承担压力,系统的吞吐量天然就提升了。并发
3、MySQL主从复制,读写分离:异步
当数据库的写压力增长,cache层(如Memcached)只能缓解数据库的读取压力。读写集中在一个数据库上让数据库不堪重负。使用主从复制技术(master-slave模式)来达到读写分离,以提升读写性能和读库的可扩展性。读写分离就是只在主服务器上写,只在从服务器上读,基本原理是让主数据库处理事务性查询,而从数据库处理select查询,数据库复制被用于把事务性查询(增删改)致使的改变动新同步到集群中的从数据库。分布式
MySQL读写分离提高系统性能:高并发
一、主从只负责各自的读和写,极大程度缓解X锁和S锁争用。性能
二、slave能够配置MyISAM引擎,提高查询性能以及节约系统开销。spa
三、master直接写是并发的,slave经过主库发送来的binlog恢复数据是异步的。
四、slave能够单独设置一些参数来提高其读的性能。
五、增长冗余,提升可用性。
实现主从分离可使用MySQL中间件如:Atlas
MySQL主从复制的原理:数据复制的实际就是Slave从Master获取Binary log文件,而后再本地镜像的执行日志中记录的操做。因为主从复制的过程是异步的,所以Slave和Master之间的数据有可能存在延迟的现象,此时只能保证数据最终的一致性。
4、分表分库:
在cache层的高速缓存,MySQL的主从复制,读写分离的基础上,这时MySQL主库的写压力开始出现瓶颈,而数据量的持续猛增,因为MyISAM使用表锁,在高并发下会出现严重的锁问题,大量的高并发MySQL应用开始使用InnoDB引擎代替MyISAM。采用Master-Slave复制模式的MySQL架构,只能对数据库的读进行扩展,而对数据的写操做仍是集中在Master上。这时须要对数据库的吞吐能力进一步地扩展,以知足高并发访问与海量数据存储的需求。
对于访问极为频繁且数据量巨大的单表来讲,首先要作的是减小单表的记录条数,以便减小数据查询所需的时间,提升数据库的吞吐,这就是所谓的分表。在分表以前,首先须要选择适当的分表策略,使得数据可以较为均衡地分布到多张表中,而且不影响正常的查询。
分表可以解决单表数据量过大带来的查询效率降低的问题,可是却没法给数据库的并发处理能力带来质的提高。面对高并发的读写访问,当数据库master服务器没法承载写操做压力时,无论如何扩展Slave服务器都是没有意义的,对数据库进行拆分,从而提升数据库写入能力,即分库。
数据库通过业务拆分及分库分表,虽然查询性能和并发处理能力提升了。可是本来跨表的事务上升为分布式事务;因为记录被切分到不一样的库和不一样的表中,难以进行多表关联查询,而且不能不指定路由字段对数据进行查询。且分库分表后须要进一步对系统进行扩容(路由策略变动)将变得很是不方便,须要从新进行数据迁移。
分表策略:
使用用户ID是最经常使用的分库的路由策略。
当数据比较大的时候,对数据进行分表操做,首先要肯定须要将数据平均分配到多少张表中,也就是:表容量。
这里假设有100张表进行存储,则咱们在进行存储数据的时候,首先对用户ID进行取模操做,根据 user_id%100
获取对应的表进行存储查询操做。
在实际的开发中,咱们的用户ID更多的多是经过UUID生成的,这样的话,咱们能够首先将UUID进行hash获取到整数值,而后在进行取模操做。
分库策略:
数据库分表可以解决单表数据量很大的时候数据查询的效率问题,可是没法给数据库的并发操做带来效率上的提升,由于分表的实质仍是在一个数据库上进行的操做,很容易受数据库IO性能的限制。
所以,如何将数据库IO性能的问题平均分配出来,很显然将数据进行分库操做能够很好地解决单台数据库的性能问题。
分库策略与分表策略的实现很类似,最简单的都是能够经过取模的方式进行路由。
分库与分表实现策略:
上述的配置中,数据库分表能够解决单表海量数据的查询性能问题,分库能够解决单台数据库的并发访问压力问题。
有时候,咱们须要同时考虑这两个问题,所以,咱们既须要对单表进行分表操做,还须要进行分库操做,以便同时扩展系统的并发处理能力和提高单表的查询性能,就是咱们使用到的分库分表。
分库分表的策略相对于前边两种复杂一些,一种常见的路由策略以下:
1、中间变量 = user_id%(库数量*每一个库的表数量);
2、库序号 = 取整(中间变量/每一个库的表数量);
3、表序号 = 中间变量%每一个库的表数量;
参考:
https://blog.csdn.net/u010832551/article/details/77836681