2 Star 0 Fork 2

jinzhengdong / mysql

加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
克隆/下载
MySQLDataDesign.md 15.37 KB
一键复制 编辑 原始数据 按行查看 历史
jinzhengdong 提交于 2022-05-21 13:30 . .

开始

影响整个系统性能的关键因素

影响系统性能一般包括两个部分:前端Web服务器和后端的数据库服务器。对于Web服务器来说相对容易扩展,只要有足够的服务器就可部署更多的Web服务,而Web服务对外提供的内容服务则是完全一样的;但对于数据库服务器而言扩展就没那么容易了,由于众多的约束条件,使得数据库服务器的扩展不能像Web服务器一样进行扩展,比如:我们不能简单的把相同的数据写到多台数据库服务器上,它可能会导致数据完整性和一致性被破坏。因此:稳定的数据库及服务器环境才是系统性能及可靠性的关键。

数据库服务器

先介绍几个概念:

  • QPS (Queries Per Second): 指服务器每秒钟能过相应的查询次数。
  • TPS (Transactions Per Second): 指服务器在单位时间内(秒)所能处理的事务个数。
  • 并发量:同一时间处理的请求的数量,它与数据库的“同时连接数”不同,“同时连接数”可一很多,不如数千个同时连接,但通常只有较少的并发请求。
  • CPU使用率:系统CPU使用率
  • 磁盘IO: 监控磁盘读写,fashion IO设备通常比普通磁盘的吞吐量大很多,观察磁盘IO的峰值发生在何时,以及导致的原因!
    • 数据备份及同步等操作均可导致磁盘IO的高吞吐量,这将导致系统性能的下降。建议:不要在主库上进行备份,或者在密集数据处理时段取消备份计划。

这里先介绍一种典型的服务器构架(配置)包括一台主服务器(CPU: 64核心,RAM: 512GB,QPS: 350000,TPS: 50000,并发量:700,CPU使用率:近100%)和15台从服务器的集群,这种结构的问题是:当主服务器出现故障时,从服务器不会自动切换,必须手动从众多的从服务器中选择一台数据较新的从服务器来承担主数据服务器的数据服务工作,而这个步骤是比较耗时(半小时左右)。

什么因素影响数据库服务器的性能

影响数据库性能的因素主要包括:

  • SQL查询速度
  • 服务器硬件的性能
  • 网卡流量
  • 磁盘IO

超高的QPS和TPS可能导致SQL的效率低下,当前的MySQL不支持多CPU的并发运算,也就是说每一SQL只会用到一个CPU,因此SQL的执行效率很重要,写出高效率的SQL也就非常重要!通常情况,80%的性能问题都是由查询导致的,也就是说,大多数的性能问题都可以通过SQL的优化得到解决。

大量并发会导致数据库连接数被占满,MySQL中默认情况max_connections=100;而超高的CPU使用率则可能导致资源耗尽而宕机。

磁盘IO导致的服务器性能下降通常只能通过使用更快的磁盘设备来解决,例如使用固态硬盘,更快速的阵列卡或更好的网卡等;大量消耗磁盘性能的任务计划暂时停掉也可改善磁盘IO性能。

网卡流量也是导致数据库性能变化的原因,减少从服务器(从主服务器上复制日志)数量可在一定程度上降低网卡流量的影响;通过分级缓存解决;避免使用select *;分离业务网络和服务器网络。

大表问题

概念:

  • 大表,当数据库表中的行数超过千万数量级时性能就会急剧下降,通常我们把超过千万行的表或数据超过10GB的表称为大表。另外,如果表只有插入和查询操作而很少更新或删除时这里表的性能变化不太明显。

大表、大事务都会给数据库性能造成一定的影响,大表通常导致慢查询;大表的ddl操作也将导致性能问题,如:创建索引(MySQL 5.5前将锁表)、修改表结构(可导致长时间锁表)等等。

解决大表问题:

  • 分库分表解决大表问题,重点:分表主键的选择;分表后垮分区数据的查询和统计;
  • 对大表数据进行历史日志归档,数据归档后可能需要增加新的查询入口;同时,数据归档后也可提升主服务器的数据访问性能。归档难点:归档时间的选择;如何归档;慎重操作删除相关大表数据。

大事务问题

概念:

  • 事务:是数据库系统区别于其它文件系统的重要特性之一,它是一组具有原子性的sql语句,是一个独立的工作单元,它具有这些特性:原子性、一致性、隔离性、持久性。
    • 原子性(Atomicity):被视为不可分割的最小工作单元,事务中的所有操作要么全部成功,要么全部失败(回滚)。
    • 一致性(Consistency):指事务将数据库从一种一致性状态转移到另一种一致性状态,即:事务开始前和事务结束后的数据完整性没有被破坏。
    • 隔离性(Isolation):要求事务对数据的修改在事务提交完成前对于其它事务来说是不可见的,SQL标准定义了四中隔离级别:
      • 未提交读(Read Uncommited,脏读、脏数据,sql server的with nolock)【隔离性最低、并发性最高】
      • 已提交读(Read Commited,默认的隔离级别,MS SQL和Oracle)
      • 可重复读(Repeatabel Read),事务提交前select的结果总是相同的
      • 可串行化(Serializable),读取的数据行上加锁,可能会产生大量的超时问题很少使用,除非要求严格的一致性和几乎没有并发的情况下【隔离性最高、并发性最低】
    • 持久性(Durability),一旦事务提交,相关修改就会保存到数据库中。
  • 大事务,运行时间长,操作的数据较多,它可能导致锁定大量的数据,造成阻塞和超时;回滚时间比较长,回滚期间数据仍然锁定;容易造成主从延迟

如何处理大事务:

  • 避免一次处理太多的数据
  • select操作中移除不必要的事务

看下面的例子:

use mydb;
select * from s;

运行上面代码看到如下图:

继续执行下面带码:

show variables like '%iso%'

完成上面代码后可看到如下结果:

之后执行下面指令:

begin;
select * from s where id < 7;
commit;

show tables;
begin
insert into s values(2)
commit;

--back to first query and do the same 
set sesstion tx_isolation = 'read-committed';

总结

高并发场景数据库系统面临的挑战:

  • 数据库构架不合理
  • 高并发磁盘IO及网络IO
  • SQL性能(慢查询)
  • 大表及大事务
  • 大量并发对数据库连接池和CPU使用率的影响
  • 磁盘IO性能会大幅影响SQL的执行效率
  • 网路IO会影响主从服务器之间的同步

影响MySQL性能的因素

影响数据库性能的几个方面

影响数据库性能的因素包括:

  • 数据库服务的硬件性能(内存、CPU、磁盘IO)
  • 服务器操作系统,系统的优化参数对系统性能的影响也很大
  • 数据库服务器的存储引擎,MySQL数据库的最大特点就是插件式存储引擎,我们可以根据业务需求选择适合的存储引擎,不同的存储引擎也有不同的特点:
    • MyISAM,它不支持事务,且使用表级锁
    • InnoDB,事务级存储引擎,完美支持行级锁,支持事务ACID特性
  • 数据库参数配置,MySQL包括上百项的配置参数,针对不同的存储引擎也有不同的配置参数,有些参数对性能影响微乎其微,有些参数却是决定性的影响,根据存储引擎的特点对数据库性能进行优化是DBA的一个关键技能。
    • 重要:服务器硬件、服务器系统、数据库存储引擎三者对数据库性能影响之和可能还没有数据库参数配置影响重要
  • 数据库结构设计和SQL语句
    • 慢查询是大多数数据库性能的罪魁祸首,而造成慢查询的根本原因又是数据库表结构的设计问题导致的
    • 系统一旦上线库结构和表结构是很难更改的,因此,SQL的优化几乎就是我们最后和最好的突破口

CPU资源和可用内存

  • 对于计算密集型应用,CPU资源和内存资源可能是很有限的,因此,它们是影响性能的关键资源
  • 热数据,当工作的热数据远远超过可用内存大小时IO系统就成为瓶颈
  • 网络,是另外一种形式的IO,当使用MemCache并且缓存失效时会产生大量的网络传输从而影响性能,升级服务器IO子系统课缓解这类性能问题
  • 服务器硬件对性能的影响:
    • CPU,我们是需要更多的CPU还是更快的CPU?例如:Intel Xeon E7-8890 v2 F:2.5GHz 18Cores and 36线程(价格45K)
    • 我们的应用是CPU密集型吗?
      • 如果是,我们将选择更好的CPU而不是更多的CPU(目前,MySQL不支持多CPU对同一SQL的并发处理)
    • 系统的并发量如何?
      • QPS:同时处理SQL的数量,并发量!这种情况CPU数量可能比性能更重要,同时我们也要考虑MySQL的版本,老版本对多CPU支持的不好,针对多核心CPU建议使用更高版本的MySQL;
    • 选择32位还是64位的CPU:经常发生在64位架构上运行32位系统
    • 内存,按IO性能排序: RAM、SSD、Fusion-IO,所以把数据放到缓存中课大大提高服务器性能,常用的MySQL引擎:
      • MyISAM,索引缓存到内存中,而数据通过操作系统进行访问
      • InnoDB,可同时把索引和数据都缓存在内存中从而提高数据的访问性能
      • 缓存不仅对读有好处对写也有好处,但数据迟早要被写入磁盘,数据库系统提供的相关计数器功能可以把针对数据库的多次写操作合并成一次从而提高系统性能
      • 选择主板支持的最高频率的内存,品牌颗粒相同的内存等等相同型号

磁盘的选择和配置

内存对系统性能的作用是很关键的单IO系统也不可忽视,无论如何,数据都要在磁盘上实现持久存储,因此磁盘的配置和选择也很重要,目前可选的磁盘有以下类型:

  • 传统机械硬盘,最常见、使用最多、价格低、存储空间大、读写速度慢,性能指标包括:访问时间和传输速度,选择时主要考虑存储容量、传输速度、访问时间、主轴转速(7200rpm,10000rpm,15000rpm)、物理尺寸
  • 使用RAID(Redundant Arrays of Independent Disks,独立磁盘的冗余阵列)增强传统机械硬盘的性能,把多个磁盘组成容量更多的逻辑磁盘,并通过数据冗余来保证数据完整性的技术,这种技术可以极大的提高机械硬盘的性能
    • RAID 0,也称为数据条带,组件磁盘阵列最简单的模式,需要2个以上的硬盘、成本低、可提高磁盘的性能和吞吐量,没有数据冗余和错误修复能力。
    • RAID 1,也称为磁盘镜像,在不影响性能的情况下最大限度的保证数据的可靠性和可修复性,成本高,磁盘利用率只有50%,更换硬盘后会需要大量时间进行数据同步
    • RAID 5,也称为分布式奇偶校验磁盘阵列,把数据分散到多个磁盘上,任何一个磁盘失效都可从校验中重建,如果两个磁盘失效则无法恢复
    • RAID 10,也称为分片镜像,实际是先对磁盘做RAID 1(镜像)再对两组RAID 1做RAID 0(条带)读写性能都比较好
  • 使用固态硬盘SSD和PCIe卡
    • 固态硬盘也称为闪存,它有更好的随机读写性能,更好的支持并发,可直接插到SATA接口上,可以同样适用RAID技术,固态存储更容易损坏;适用大量随机IO的场景,解决单线程负载的IO瓶颈,为提高性能从服务器更应使用ssd
    • PCI-E SSD(Fusion-IO),不能使用SATA接口而需要PCI-E接口,比SSD有更好的性能,价格更高,需要使用服务器内存和CPU资源
  • 网络存储NAS和SAN
    • NAS(Network Attached Storage)网络附加存储,使用网络连接访问协议包括NFS或SMB,顺序访问不错但随机访问则不好,不适合存放数据库文件,可用于备份数据库文件;网络性能是性能影响的另一问题,延迟和带宽
      • 建议高性能的网络交互机,核心交换机采用万兆交换
      • 对多个网卡绑定增强可用性和带宽
      • 网络隔离,内外网的隔离,不能把数据库暴露在外网环境
    • SAN(Storage Area Network)存储区域网路,通过光纤接入服务器,服务器可将其当作硬盘使用,可以承受大量的顺序读写操作,随机读写慢不如RAID

总结:

服务器硬件对性能的影响:CPU、RAM、IO子系统和网络:

  • CPU,在64位的架构上运行64位的系统;如果并发比较高cpu的数量比频率重要;对于密集计算和复制sql场景cpu频率更重要;
  • 内存,选择主板适配的频率最高的内存;内存尽可能大以保证更好的性能,足够的内存可把大量的随机io变成顺序io则性能更好;
  • io子系统,PCIe > SSD > Raid10(数据库) > SAN(备份)

操作系统对性能的影响

MySQL适合的操作系统:

  • Windows,目录名称大小写不敏感
  • Linux,Redhat和CentOS, Ubuntu
  • FreeBSD,选择最新版本
  • Solaris,易用性不好

CentOS系统参数优化

内核相关参数(/etc/sysctl.conf):

  • 网络配置
    • net.core.somaxconn = 65535
    • net.core.netdev_max_backlog = 65535
    • net.ipv4.tcp_max_syn_backlog = 65535
  • 网络tcp回收
    • net.ipv4.tcp_fin_timeout = 10
    • net.ipv4.tcp_tw_reuse = 1
    • net.ipv4.tcp_tw_recycle = 1
  • tcp发送缓冲区的大小默认值
    • net.core.wmem_default = 87380
    • net.core.wmem_max = 16777216
    • net.core.rmem_default = 87830
    • net.core.rmem_max = 16777216
  • 配置失效连接占用tcp资源的配置
    • net.ipv4.tcp_keepalive_time = 120
    • net.ipv4.tcp_keepalive_intvl = 30
    • net.ipv4.tcp_keepalive_probes = 3
  • 内存相关的参数
    • kernel.shmmax = 4294967295,应足够大以便容纳Innodb缓存池,一般取值为物理内存的一半,最大值为物理内存-1
    • vm.swappiness = 0,当内存不足时会对系统性能有明显影响,很显然不希望发生内存和磁盘存储的交换
    • Vm.swappiness = 0,告诉Linux除非虚拟内存用完,否则不使用交换分区

增加资源限制(/etc/security/limit.conf)Linux插入式认证模块配置文,打开文件数的限制:

  • 下面两个配置项需要重启服务器才能生效:
    • soft nofile 65535
    • hard nofile 65535

磁盘调度策略(/sys/block/devname/queue/scheduler):

  • cat /sys/block/sda/queue/scheduler noop anticipatory deadline [cfq],cfq策略用于桌面系统没问题,但用于服务器系统则不好
    • noop,电梯式调度策略
    • deadline,截止时间调度策略
    • anticipatory,预料io调度策略
  • echo deadline > /sys/block/sda/queue/sheduler
    • echo <schedlername> > /sys/block/sda/queue/sheduler

文件系统对性能的影响

依赖操作系统:

  • Windows
    • FAT
    • NTFS
  • Linux
    • EXT3
    • EXT4
    • XFS,通常认为性能更好

EXT3/4系统的挂载参数(/etc/fstab):

  • data=writeback | ordered |journal
    • writeback for Innodb
    • ordered 更安全
    • journal Innodb没必要
    • noatime, nodiratime可减少一些写的操作
  • 例子
    • /dev/sda1/ext4 noatime,nodiratime,data=writeback 1 1

MySQL体系结构

  • MySQL数据库系统最大特点是插件式存储引擎
  • 客户端 php, java, c api, .net及odbc, jdbc等
  • 连接管理器(MySQL服务层)
    • 查询缓存
    • 查询解析
    • 查询优化器
SQL
1
https://gitee.com/jinzhengdong/mysql.git
git@gitee.com:jinzhengdong/mysql.git
jinzhengdong
mysql
mysql
master

搜索帮助