-
服务器架构
-
一般公司的数据库架构图
首先,主服务器所组成的一个集群中,只存在一个master服务器,也就是只有一个主数据库服务器,没有任何的主从复制的高可用的组件。
也就是说,一旦这个主服务器出现了故障,很难得自动地进行故障切换,我们必须的,从更多的从服务器中选择出一台,数据最新的从服务器,手动的把他提升成主服务器,对这个新主再进行同步,这个操作过程那是相当耗时的,如果在服务器比较多的情况下,完成一次切换可能要耗费半个小时左右的时间;
而且,这么多从服务器,在业务量大的时候呢,对主服务器的网卡容量也是一个挑战。
并发量和同时连接数区别?
并发量:数据库在同一时间所处理的请求的数量;
同时连接数:在一个繁忙的服务服务器中,同一时间可以有上千甚至更多的连接,但是这其中只有一小部分请求在处理,通常大部分出于sleep状态。
-
对数据库影响的因素
1、超高的QPS和TPS
风险:效率低下的SQL
随着访问量的增长,就会有超高的QPS和TPS的产生,那么这个时候每处理一个sql的时间就尤为重要,在当前的sql版本中,它还不支持多cpu并发运算,也就是说每一个sql只能用到一个CPU,我们通常用QPS和TPS作为sql的处理效率!
QPS:每秒钟处理的查询量。
假如服务器只有一个CPU的情况下:
2、大量的并发和超高的CPU使用率
大量的并发,可能会使我们的这个连接数被占满,同时段超高的CPU使用率,可能会因为CPU资源的耗尽的,而出现宕机;
这里有一个时常被人们混淆的概念,我们刚才也提到过,就是并发量跟连接量这两个概念。
在这里的我们所说的并发量是同一时刻,所需要的数据库服务器所处理的请求的数量,而连接量往往要比并发量,要大的多得多。
现在的系统中,每一个前端服务器ngnix tomcat apache,都会对数据库建立多个连接。在这众多连接中的通常只有几个是在请求数据库处理,其他的大多数连接都处于sleep状态。
对于数据库来说,所能建立的连接数那是有限的,在MYSQL中这个通常是max_connections这个参数来决定的,这个参数的默认值只有一百,所以在生产服务器,我们要将这个参数改的稍微大一些,但是如果连接数超过了这个参数的限制,其他真正有用的服务器就会连接不上数据库,其他服务器从而出现500错误提示。
3、磁盘IO
4、网卡流量
结构图中的我没看到,这个服务器在双11当天的网卡流量有几次都被跑满了。这时候如果他有新的连接,要查询数据库,会出现无法连接数据库的情况,从而影响正常业务访问,那么我们怎么样做避免这种情况发生?
减少从服务器的数量,因为每一个从服务器都会去主服务器复制日志,从服务器越多网络流量越大;
缓存一定要进行分级,一定要避免前端大量的缓存突然间失效,对数据库流量的冲击;
尽量避免“select *”查询,特别是访问量过多的情况,查询出不必要的列,对于网络流量来说也是一种浪费;
最后我们可以将业务网络和服务器网络进行分离,这样就可以避免由于主从同步或者网络备份作业的影响,影响网络的性能。
5、还有什么会影响数据库性能
首先,
这个其实是相对而言的,对于不同的存储引擎会有不同的限制,目前的InnoDB当然并没有定义表最大行是多少?至少说存储空间允许,我们就将数据放置到mysql数据表中。
-----------------------------------------------------------------------------------------------------
大表对查询的影响
慢查询:很难在一定时间内过滤出所需要的数据
如果数据库数据存在上亿条,然后对其中一个类型进行筛选,那么就会产生大量的磁盘io,同时产生的效率也会很低,降低磁盘效率,产生大量慢查询,严重影响用户体验。
大表对DDL操作的影响
-
如何处理数据库中的大表
sss另外一种处理大表的方式,这是对大表进行历史历史数据归档,特别是对于那些日志类、订单类业务类型表也可以进行历史数据归档
好处是尽量的减少对前后端业务的影响,因为对于前端来说,表结构并没有什么任何的变化,所以一切的程序,可以正常的使用,只是对于订单表这样的业务表,我们要进行归档,则需要在前端多增加一个,历史性的查询入口,可以说已经归档的历史订单,很少有人会去查询,所以说就算归档表很大,但是对业务的影响也是很轻微的。
归档表可以与现在正使用的表放在不同的服务器上,一方面减少热数据所在服务器表容量,同时也减少了核心服务器查询压力,对于后端来说,已经归档的历史数据,是已经完成相关操作和统计的历史数据,所以对于后端的应用也没有什么影响,但是为了不影响现有的前后端业务逻辑,我们在进行数据归档时,同样也面临归档的难点:
前面我们已经说了,归档的数据是已经不会被使用和很少会使用;比如说订单类,我们可以归档一年前或者一个月前的数据,比如说日之类,我们可以归档一周前的数据。
如果我们要进行归档,就要将数据从现有的表中删除,如果数据量过大,轻则会产生数据的延迟,重则会产生大量的阻塞,影响我们正常的业务访问。
-
大事物带来的问题
什么是事务?
1、事务是关系型数据库系统区别相对于其他一切基于文件的系统的重要特性之一【对于文件系统中,如果药保证两个文件的一致,而在我们修改完一文件后,系统突然崩溃了,在系统恢复后,就很难保证两个文件的一致,数据库系统中,由于使用了事务,通常在数据库服务器突然间崩溃的时候,我们可以恢复数据库中的数据,其数据还是保持一致性】
2、事务是一组具有原子性的sql语句,或是一个独立的工作单元【这个SQL可以说是一条简单的查询,也可以是一组由多个增删改查的SQL所组成的一组SQL语句的集合,但是这一组SQL是具有原子性的,也就是说,要么全部完成,要么全部失败】
从以上两个原则,事务是要求符合以下特性的:
什么是事务
例子:
第一步是检查理财账户中的余额是否高于2000元?第二步就是从理财账户的余额中减去2000元,第三步在活期存款上增加2000元,如果在执行第二步骤时就崩溃了,如果没有事务原子性会发生什么呢?毫无疑问我们会损失2000元,如果说以上三个步骤在一个事务中完成,在执行第二步骤时系统崩溃了,等待系统恢复后,就会在日志中发现,有没有没提交的事务?这时候就会没有执行完的第二步骤进行回滚,这样就避免了用户的损失。所以,事物的首先特性是具有原子性。
-----------------------------------------------------------------------------------------------------
例子:银行
在转账之前和转账之后,我们的总金额应该不发生变化。转账之前在我们的理财账户中有2000余额,转账之后2000余额,过渡到活期存款中,但是账户的总余额还是2000。
-----------------------------------------------------------------------------------------------------
第三个特性
例子:银行
当我们执行完第二步,在理财账户中减去2000元之后,如果说这个时候另外一个事务,需要对银行理财账户中的余额进行汇总,那时候这个我们能在我们的理财账户中看到我们已经转出的2000块钱,这是由于我们第一个事务减去2000块钱,但是还没有提交,对于第二个事务来说是不可见的,这就是事务的隔离型。
-----------------------------------------------------------------------------------------------------
-----------------------------------------------------------------------------------------------------
-
什么是大事物
定义:运行时间比较长,操作的数据比较多的事务
-----------------------------------------------------------------------------------------------------