深度优化LNMP之MySQL

MySQL数据库优化框架体系

1.硬件层面优化

2.操作系统层面优化

3.MySQL数据库层面优化

4.MySQL安全优化

5.网站集群架构上的优化

6.MySQL流程、制度控制优化

1

硬件层面优化

1、数据库物理机采购

CPU: 64位CPU,一台机器2-16颗CPU。至少2-4颗,L2(缓存)越大越好

内存: 96-128G,MySQL 3-4个实例。32-64G,1-2实例

硬盘:机械:选SAS,数量越多越好,转速越高越好15k

性能:SSD(高并发) > SAS(普通业务线上) >SATA(线下)

选SSD:使用SSD或者PCIe SSD设备,可提升上千倍的IOPS效率。

随机IO:SAS单盘能力300IOPS SSD随机IO:单盘能力可达35000IOPS Flashcache HBA卡

raid磁盘阵列: 4快盘:RAID0>RAID1(推荐)>RAID5(少用)>RAID1

主库选择raid10,从库可选raid5/raid0/raid10,从库配置等于或大于主库

网卡:使用多块网卡bond,以及buffer,tcp优化

千兆网卡及千兆、万兆交换机

提示:

数据库属于IO密集型服务,硬件尽量不要使用虚拟化。

Slave硬件要等于或大于Master的性能

2、企业案例:

百度:某部门IBM服务器为48核CPU,内存96GB,一台服务器跑3~4个实例:

sina:服务器是DELL R510居多,CPU是E5210,48GB内存,硬盘12*300G SAS,做RAID10

3、服务器硬件配置调整

(1)服务器BIOS调整:

提升CPU效率参考设置:

a.打开Perfirmance Per Watt Optimeized(DAPC)模式,发挥CPU最大性能,数据库通常需要高运算量

b.打开CIE和C States等选项,目的也是为了提升CPU效率

c. Memory Frequency(内存频率)选择Maximum Performance(最佳性能)

d.内存设置菜单中,启动Node Interleaving,避免NUMA问题

(2)阵列卡调整:

a.购置阵列卡同时配备CACHE及BBU模块(机械盘)

b.设置阵列写策略为WEB,甚至OFRCE WB (对数据安全要求高)(wb指raid卡的写策略:会写(write back))

c.严禁使用WT策略,并且关闭阵列预读策略

2

操作系统层面优化

1.操作系统及MySQL实例选择

1.一定要选择x86_64系统,推荐使用CentOS6.8 linux,关闭NUMA特性

2.将操作系统和数据分开,不仅仅是逻辑上,还包括物理上

3.避免使用Swap交换分区

4.避免使用软件磁盘阵列

5.避免使用LVM逻辑卷

6.删除服务器上未使用的安装包和守护进程

2.文件系统层优化

(1)调整磁盘Cache mode

  1. 启用WCE=1(Write Cache Enable),RCD=0(Read Cache Disable)模式
  2. 命令:sdparm -s WCE=1,RCD=0 -S /dev/sdb

(2)采用Linux I/O scheduler算法deadline
deadline调度参数 
对于Centos Linux建议 read_expire = 1/2 write_expire

  1. echo 500 > /sys/block/sdb/queue/iosched/read_expire
  2. echo 1000 > /sys/block/sdb/queue/iosched/write_expire

Linux I/O调度方法 Linux deadline io 调度算法

(3)采用xfs文件系统 
业务量不是很大也可采用ext4,业务量很大,推荐使用xfs:调整XFS文件系统日志缓冲变量 
XFS高性能设置

(4)mount挂载文件系统 
增加:async,noatime,nodiratime,nobarrier

noatime

访问文件时不更新inode的时间戳,高并发环境下,推线显示应用该选项,可以提高系统I/O性能

async

写入时数据会先写到内存缓冲区,只到硬盘有空档才会写入磁盘,这样可以提升写入效率!风险为若服务器宕机或不正常,会损失缓冲区中未写入磁盘的数据 解决办法:服务器主板电池或加UPS不间断电源

nodiratime

不更新系统上的directory inode时间戳,高并发环境,推荐显示该应用,可以提高系统I/O性能 
   
nobarrier

不使用raid卡上电池

(5)Linux 内核参数优化 
1.将vm,swappiness设置为0-10 
2.将vm,dirty_background_ratio设置为5-10,将vm,dirty_ratio设置为它的两倍左右,以确保能持续将脏数据刷新到磁盘,避免瞬间I/O写,产生严重等待

3.优化TCP协议栈

  1. #减少TIME_WAIT,提高TCP效率
  2. net.ipv4.tcp_tw_recyle=1
  3. net.ipv4.tcp_tw_reuse=1
  4. #减少处于FIN-WAIT-2连接状态的时间,使系统可以处理更多的连接net.ipv4.tcp_fin_timeout=2
  5. #减少TCP KeepAlived连接侦测的时间,使系统可以处理更多的连接。
  6. net.ipv4.tcp_keepalived_time=600
  7. #提高系统支持的最大SYN半连接数(默认1024)
  8. net.ipv4.tcp_max_syn_backlog = 16384
  9. #减少系统SYN连接重试次数(默认5)
  10. net,ipv4.tcp_synack_retries = 1
  11. net.ipv4.tcp_sync_retries = 1
  12. #在内核放弃建立的连接之前发送SYN包的数量
  13. net.ipv4.ip_local_prot_range = 4500 65535
  14. #允许系统打开的端口范围

4.网络优化 
#优化系统套接字缓冲区

  1. #Increase TCP max buffer size
  2. net.core.rmem_max=16777216 #最大socket读buffer
  3. net.core.wmem_max=16777216 #最大socket写buffer
  4. net.core.wmem_default = 8388608 #该文件指定了接收套接字缓冲区大小的缺省
  5. 值(以字节为单位)
  6. net.core.rmem_default = 8388608

#优化TCP接收/发送缓冲区

  1. # Increase Linux autotuning TCP buffer limits
  2. net.ipv4.tcp_rmem=4096 87380 16777216
  3. net.ipv4.tcp_wmem=4096 65536 16777216
  4. net.ipv4.tcp_mem = 94500000 915000000 927000000

#优化网络设备接收队列

  1. net.core.netdev_max_backlog=3000

5.其他优化

  1. net.ipv4.tcp_timestamps = 0
  2. net.ipv4.tcp_max_orphans = 3276800
  3. net.ipv4.tcp_max_tw_buckets = 360000

提示:面试的时候说框架,然后说一两个小的优化参数即可 
更多内核可以参考“跟老男孩学运维书的第三章”以及我们的博客,近期将会更新

3

MySQL数据库层面优化

my.cnf参数优化

此优化主要针对innodb引擎

  1. 如果采用MyISAM引擎,需要key_buffer_size加大。
  2. 强烈推荐采用innodb引擎,default-storage-engine=Innodb
  3. 调整innodb_buffer_pool_size大小,考虑设置为物理内存的50%-60%左右
  4. 根据实际需要设置inno_flush_log_at_trx_commit,sync_binlog的值。
  5. 如果要需要数据不能丢失,那么两个都设为1.如果允许丢失大一点数据,
  6. 则可分别设为2和0,在slave上可设为0
  7. 设置innodb_file_per_table = 1,使用独立表空间
  8. 设置innodb_data_file_path = ibdata1:1G:autoextend,不要使用默认的10%
  9. 设置innodb_log_file_size=256M,设置innodb_log_files_in_group=2,基本可
  10. 满足90%以上的场景;
  11. 不要将innodb_log_file_size参数设置太大,这样可以更快同时又更多的磁盘空间,
  12. 丢掉多的日志通常是好的,在数据库崩溃后可以降低恢复数据库的事件
  13. 设置long_query_time = 1记录那些执行较慢的SQL,用于后续的分析排查;
  14. 根据业务实际需要,适当调整max_connection(最大连接数max_connection_error
  15. (最大错误数,建议设置为10万以上,而open_files_limit、innodb_open_files、
  16. table_open_cache、table_definition_cache这几个参数则可设为约10倍于
  17. max_connection的大小;)不要设置太大,会将数据库撑爆
  18. tmp_table_szie、max_heap_table_size、sort_buffer_size、
  19. join_buffer_size、read_buffer_size、read_rnd_buffer_size等都是
  20. 每个连接session分配的,因此不能设置过大
  21. 建议关闭query cache功能或降低设置不要超过512M

更多内核参数:my-innodb-heavy-4G.cnf 配置文件参数介绍

MySQL工具mysqlreport 我们可以使用工具来分析MySQL的性能 
如何才能做到网站高并发访问? 生产环境中对于防范DDOS攻击的讨论 
面试可能会问到DOOS 攻击防护

关于库表的设计规范

  1. 推荐utf-8字符集,虽然有人说谈没有latin1快
  2. 固定字符串的列尽可能多用定长char,少用varchar
  3. 存储可变长度的字符串使用VARCHAR而不是CAHR---节省空间,因为固定
  4. 长度的CHAR,而VARCHAR长度不固定(UTF8不愁此影响)
  5. 所有的InnoDB表都设计一个无业务的用途的自增列做主键
  6. 字段长度满足需求前提下,尽可能选择长度小的
  7. 字段属性尽量都加NOT NULL约束
  8. 对于某些文本字段,例如“省份”或者“性别”我们可以将他们定义为ENUM类型尽可能不使用TEXT/BLOB类型,确实需要的话,建议拆分到子表中,不要和主表
  9. 放在一起,避免SELECT *的时候读性能太差。
  10. 读取数据时,只选取所需要的列,不要每次都SELECT * 避免产生严重的随机读
  11. 问题,尤其是读到一些TEXT/BLOB类型,确实需要的话,建议拆分到子表中,不要
  12. 和主表放在一起,避免SELECT *的时候读性能太差
  13. 对一个VARCHAR(N)列创建索引时,通常取其50%(甚至更小)左右长度创建前缀
  14. 索引就足以满足80%以上的查询需求了,没必要创建整列的全长度索引。
  15. 多用符合索引,少用多个独立索引,尤其是一些基础(Cardinality)太小
  16. (如果说:该列的唯一值总数少于255)的列就不要创建独立索引了。

4

SQL语句的优化

索引优化 
1)白名单机制一百度,项目开发啊,DBA参与,减少上线后的慢SQL数据 
抓出慢SQL,配置my.cnf

  1. long_query_time = 2
  2. log-slow-queries=/data/3306/slow-log.log
  3. log_queries_not_using_indexs
  4. 按天轮询:slow-log.log

2)慢查询的日志分析工具——mysqlslapt-query-digest(推荐)

  1. pt-quey-diges,mysqldumpslow,mysqlsla,myprofi,mysql-explain-slow-log,mysqllogfileter

3)每天晚上0点定时分析慢查询,发到核心开发,DBA分析,及高级运维,CTO的邮箱里 
DBA分析给出优化建议-->核心开发确认更新-->DBA线上操作处理 
4)定期使用pt-duplicate-key-checker检查并删除重复的索引 
定期使用pt-index-usage工具检查并删除使用频率很低的索引 
5)使用pt-online-schema-change来完成大表的ONLINE DDL需求 
6)有时候MySQL会使用错误的索引,对于这种情况使用USE INDEX 
7)使用explainset profile优化SQL语句

大的复杂的SQL语句拆分成多个小的SQL语句 
子查询,JOIN连表查询,某个表4000万条记录 
数据库是存储数据的地方,但不是计算数据的地方 
对数据计算,应用类处理,都要拿到前端应用解决。禁止在数据库上处理 
搜索功能,like ‘%oldboy%’ 一般不要用MySQL数据库 
使用连接(JOIN)来代替子查询(Sub_Queries) 
避免在整个表上使用cout(*),它可能锁住整张表 
多表联接查询时,关联字段类型尽量一致,并且都要有索引。 
在WHERE子句中使用UNION代替子查询 
多表连接查询时,把结果集小的表(注意,这里是指过滤后的结果集,不一样是全表数据量小的)作为驱动表

爬虫获取数据的过程

5

网站集群架构上的优化

1.服务器上跑多实例,2-4个(具体需要看服务器的硬件信息)

2.主从复制一主五从,采用mixed模式,尽量不要跨机房同步(进程远程读本地写)

3.定期使用pt-table-checksum、pt-table-sync来检查并修复mysql主从复制的数据差异

4.业务拆分:搜索功能,like ‘%oldboy% ‘ 一般不要用MySQL数据库

5.业务拆分:某些业务应用使用nosql持久化存储,例如:memcached、redis、ttserver

例如粉丝关注,好友关系等

6.数据库前端必须要加cache,例如:memcached,用户登录,商品查询

7.动态的数据库静态化,整个文件静态化,页面片段静态化

8.数据库集群与读写分离。一主多从,通过程序或dbproxy进行集群读写分离

9.单表超过800万,拆库拆表。人工拆表拆库(登录、商品、订单)

10.百度、阿里国内前三公司,会选择从库进行备份,对数据库进行分库分表

6

MySQL 流程、制度控制优化

任何一次人为数据库记录的更新,都要走一个流程:

a.人的流程:开发-->核心开发-->运维或DBA

b.测试流程:内网测试-->IDC测试-->线上执行

c.客户端管理,phpmyadmin

MySQL基础安全

1.启动程序700,属主和用户组为MySQL

2.为MySQL超级用户root设置密码

3.如果要求严格可以删除root用户,创建其他管理用户,例如admin

4.登录时尽量不要在命令行暴露密码,备份脚本中如果有密码,给设置700,

属主和密码组为mysql或root

5.删除默认存在的test库

6.初始删除无用的用户,只保留

| root | 127.0.0.1 |

| root | localhost |

7.不要一个用户管理所有的库,尽量专库专用户

8.清理mysql操作日志文件~/.mysql_history(权限600,可以不删)

9.禁止开发获得到web连接的密码,禁止开发连接操作生产对外的库

10.phpmyadmin安全

11.服务器禁止设置外网IP

12.防SQL注入(WEB)php.ini或web开发插件监控,waf控制

文章转自:https://www.abcdocker.com/abcdocker/952

原文地址:https://www.cnblogs.com/Dev0ps/p/8306521.html

时间: 2024-10-20 14:33:29

深度优化LNMP之MySQL的相关文章

大型网站MySQL深度优化揭秘 2

学无止境,老男孩教育成就你人生的起点! 相信自己相信老男孩!!! 老男孩-51cto-公开课-大型网站MySQL深度优化揭秘 部分整理有没跟上的抱歉 ? 目 录 大型网站MySQL深度优化揭秘????2 第1章 优化的思路和线路????2 1.1 网站优化的思路????2 1.2 MySQL优化,nginx这样的东西怎么优化?????2 第2章 硬件层面优化????3 2.1 数据库物理机????3 2.1.1 CPU????3 2.1.2 Memory????3 2.1.3 disk(磁盘IO

LAMP和LNMP深度优化

LAMP与LNMP web架构深度优化 企业连接数据库一般用域名,因为连接数据库的文件可能有多个,那么当一旦数据库ip改了,那么数据库连接的文件也都需要修改,这样极容易漏掉而出现错误,正确的做法是每个数据库连接文件里都写连接数据库的域名,然后在本地host里将数据库ip及域名做一个解析 数据库tar备份数据文件 必须停机才能保持备份的数据库和线上的一致,那么企业是不可能随意停机的,所以一般会用到热备工具如mysqldump等进行实时同步备份. 必须要总结的: nginx.conf httpd.c

腾讯云数据库团队:浅谈如何对MySQL内核进行深度优化

作者介绍:简怀兵,腾讯云数据库团队高级工程师,负责腾讯云CDB内核及基础设施建设:先后供职于Thomson Reuters和YY等公司,PTimeDB作者,曾获一项发明专利:从事MySQL内核开发工作8年,具有丰富的优化经验:在分布式存储等领域有较丰富经验. MYSQL数据库适用场景广泛,相较于Oracle.DB2性价比更高,Web网站.日志系统.数据仓库等场景都有MYSQL用武之地,但是也存在对于事务性支持不太好(MySQL 5.5版本开始默认引擎才是InnoDB事务型).存在多个分支.读写效

Nginx深度优化(二)

Nginx作为现在最流行的Web应用程序,对其优化十分重要.通过Nginx初步优化.深度优化Nginx(一)已经可以对Nginx进行大量的优化来满足基本的需要,但是作为一名合格的运维工程师来说,仅仅掌握以上对Nginx进行优化的方法显然是远远不足的.所以就需要本篇博文进一步对Nginx进行优化. 博文大纲:一.安装nginx服务器二.Nginx配置优化(1)Nginx 运行工作进程个数(2)Nginx 事件处理模型 (3)开启高效传输模式(4)连接超时时间(5)fastcgi调优(6)expir

MySQL优化---DBA对MySQL优化的一些总结

MySQL优化---DBA对MySQL优化的一些总结 http://blog.163.com/li_hx/blog/static/183991413201572522214601/ 1. 要确保有足够的内存数据库能够高效的运行,最关建的因素需要内存足更大了,能缓存住数据,更新也可以在内存先完成.但不同的业务对内存需要强度不一样,一推荐内存要占到数据的15-25%的比例,特别的热的数据,内存基本要达到数据库的80%大小. 2. 需要更多更快的CPUMySQL 5.6可以利用到64个核,而MySQL

[mysql][【优化集合】mysql数据库优化集合

三个层面: 1.系统层面 2.mysql配置参数 3.sql语句优化 =========================================================== 一.系统层面 =========================================================== 二.mysql参数层面 http://www.oicto.com/mysql-explain-show/ 2.1slowlog 配置slowlog 配置文件: log-slow

实训之countdown深度优化

今天开始我们为期三周的实训,讲道理很紧张.我们两个多月的时间,小组成员磨合的非常好,可以说是有点默契的程度了,凝聚力明显提高.今天的分组之后立马投入这次实训中. 首先要确定我们这次实训目标,我们选择了继续强化我们的项目.在前段时间配合的不是很理想到通力合作做出粗略的基本功能的实现,我们每个人都付出了很多.这次我们希望继续深入下去这个项目,让它不再是一个简单的功能性软件,我们打算加入一些全新的功能点进去,让这个项目成为我们之前规划中小巧简便实用性高的产品. 首先我们希望加入登录注册,在使用过程中可

索引优化来实现MySQL的ORDER BY语句优化

MySQL索引通常是被用于提高WHERE条件的数据行匹配或者执行联结操作时匹配其它表的数据行的搜索速度. MySQL也能利用索引来快速地执行ORDER BY和GROUP BY语句的排序和分组操作. 通过索引优化来实现MySQL的ORDER BY语句优化: 1.ORDER BY的索引优化.如果一个SQL语句形如: SELECT [column1],[column2],-. FROM [TABLE] ORDER BY [sort]; 在[sort]这个栏位上建立索引就可以实现利用索引进行order

MySQL索引优化-from 高性能MYSQL

Btree: 1. 尽量使用覆盖索引, 即三星索引 2. 多列索引如果带范围的话, 后续列不会作为筛选条件 3. 多列索引应选择过滤性更好的充当前缀索引 4. 尽量按主键顺序插入, 减少页分裂, 采用自增ID在高并发情况下, 可能造成明显征用, 或者更改innodb_autoinc_lock_mode配置. Hash: 1.只有精确匹配所有列的查询才有效, 对于每行数据, 引擎都会对所有索引列计算hash码 2. 只有memory才可以支持hash索引, innodb支持自适应hash索引, 但