-
持久化数据库
-
持久化 数据永久保存被称为持久化存储 常用的持久化数据库Oracle,MySql,SQL Server等等
现在最常用的是MySql,以下都是对于MySql实现高并发 -
(1)分库分表
随着系统访问量的增加,QPS越来越高,数据库磁盘容量不断增加,一般数据库服务器的QPS在800-1200的时候性能最佳,当超过2000的时候sql就会变得很慢并且很容易被请求打死,而单表数据量过大也会导致数据库执行sql很慢,为了应付这种场景产生了分库分表这种思想和技术。
分表就是把一个表的数据放到多个表中,然后查询的时候就查一个表。可以按照某一个维度来进行分表(例如按照用户id来分表,将一个用户的数据就放在一个表中。然后操作的时候你对一个用户就操作那个表就好了)。这样可以控制每个表的数据量在可控的范围内。
分库是什么?一般来说一个数据库服务器最多支撑到并发2000,就要扩容了,而且一个单库并发值最好保持在每秒1000左右,如果太大。就需要一个库的数据拆分到多个库中,访问的时候就访问一个库好了。 -
(2)分库分表中间件
常见的分库分表中间件有:cobar、TDDL、atlas、sharding-jdbc、mycat。它们可以分为client层和proxy()方案。client方案的的优点在于不用部署,运维成本很低,但是如果要升级什么的得重新升级版本再发布,各个服务之间都需要耦合client依赖;proxy方案优点是对个各个服务都是透明的,如果需要升级什么的直接在中间件搞就可以了,但是得需要专门去部署运维
先阶段使用最广泛的,就是jdbc,sharding-jdbc:当当开源的,属于client层方案。因为SQL语法支持也比较多,没有太多限制,而且目前推出到了2.0版本,支持分库分表、读写分离、分布式id生成、事务。目前社区也还一直在开发和维护,比较活跃,是一个可选择的方案。
client : 连接数据库层面
proxy : mysql-proxy是mysql官方提供的mysql中间件服务,上游可接入若干个mysql-client,后端可连接若干个mysql-server -
(3)如何对数据库进行垂直拆分或者水平拆分?
水平拆分就是把一个表的数据给弄到多个库的多个表里去,但是每个库的表结构都一样,只不过每个库表放的数据是不同的,所有库表的数据加起来就是全部数据。水平拆分的意义,就是将数据均匀放更多的库里,然后用多个库来抗更高的并发,还有就是用多个库的存储容量来进行扩容。
垂直拆分就是把一个有很多字段的表给拆分成多个表。每个库表的结构都不一样,每个库表都包含部分字段。一般来说,会将较少的访问频率很高的字段放到一个表里去,然后将较多的访问频率很低的字段放到另外一个表里去。因为数据库是有缓存的,你访问频率高的行字段越少,就可以在缓存里缓存更多的行,性能就越好。这个一般在表层面做的较多一些。 -
(4)未分库分表的系统动态迁移到分库分表
双写迁移方案是现在常用的一种迁移方案,思路就是上线一个新服务,把之前所有写库的地方,增删改操作,都除了对老库增删改,都加上对新库的增删改,这就是所谓双写,同时写俩库,老库和新库,读库还是读老库,然后在下线,其他操作还是走老库的老服务。然后新服务替换老服务后,由于新库数据差太远,可以借助工具,导入老库所有数据,反复循环,直到两个库每个表的数据都完全一致为止,这样就可以实现动态迁移到分库分表,它的优势在于,服务可以正常运行,不需要对整个服务停机维护 -
(5)数据库自增id
因为分库分表就是因为并法量和数据量问题,用单库单表去生成主键id,效率很低,不能支持高并发,解决方法使用,snowflake算法开源的分布式id生成算法,就是把一个64位的long型的id,1个bit是不用的,用其中的41 bit作为毫秒数,用10 bit作为工作机器id,12 bit作为序列号,这样这个id也是不会重复的,这个方案属于现在开发中最常用的方案 -
(6)mysql的读写分离
如何实现mysql的读写分离?mysql的读写分离基于主从复制架构,进行相关的配置之后,我们可以搞一个主库,然后主库挂多个从库,然后我们单写主库,然后主库会自动把数据同步到从库,然后读从库来访问数据,对于一般项目来说,数据库主从就可以满足需求 -
(7)mysql主从同步
主从同步原理 : master数据库是用来记录数据的更改操作,在master启用binlog日志,binlog的日志格式二进制数据
当主库db更新事件写到binlog日志里,从库就会发起连接,连接到主库;
这时主库会创建一个binlog-dump-thead 线程,把binlog日志发送到从库;
从库读取里面的每一条日志信息,执行读取的每一步操作,这样就实现了主从同步 -
(8)mysql的主从同步延时问题
分库,将一个主库拆分为多个主库,用多个主库分担并发,让从库在不同的主库获取binlog日志完成同步
(9)关于sql语句
并发处理时,使用MySQL的数据库引擎特性,比如InnoDB,提供了具有提交、回滚和崩溃恢复能力的事物安全存储引擎,MyISAM拥有较高的插入、查询速度等等,可以根据不同的库,设计不同的数据库引擎
查询使用封装完善的工具如 : sqlalchemy,或者直接使用原生sql,提升数据库查询效率
总结:
- 随着业务的不断扩充,随后带来的肯定会是高并发问题,在之前说的那些方法在高并发中可能会用到,真实的系统架构搭配上业务之后,实现一个高并发架构要复杂很多倍,需要考虑很多因素,大致可以分为这6种 : 系统拆分,缓存,MQ,分库分表,读写分离,ElasticSearch,在线上环境中不同的项目,需要根据现有业务需求,选用最合适的一个并发框架,进行这一方面的拓展
综上所述,如果每一个技术点之间都能很好的衔接起来,就是一个很成功的高并发架构
因为都是大量的文字描述,都是些基础知识,若要在开始去了解这些知识点的话,需要自己查阅资料,我就提前给您写了些,随便不完整,但是总体意思还是可以表达明白的!!!还请见谅!