深度优化LNMP之MySQL
MySQL数据库优化框架体系
1.硬件层面优化
2.操作系统层面优化
3.MySQL数据库层面优化
4.MySQL安全优化
5.网站集群架构上的优化
6.MySQL流程、制度控制优化
硬件层面优化
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策略,并且关闭阵列预读策略
操作系统层面优化
1.操作系统及MySQL实例选择
1.一定要选择x86_64系统,推荐使用CentOS6.8 linux,关闭NUMA特性
2.将操作系统和数据分开,不仅仅是逻辑上,还包括物理上
3.避免使用Swap交换分区
4.避免使用软件磁盘阵列
5.避免使用LVM逻辑卷
6.删除服务器上未使用的安装包和守护进程
2.文件系统层优化
(1)调整磁盘Cache mode
(2)采用Linux I/O scheduler算法deadline
deadline调度参数
对于Centos Linux建议 read_expire = 1/2 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协议栈
4.网络优化
#优化系统套接字缓冲区
#优化TCP接收/发送缓冲区
#优化网络设备接收队列
5.其他优化
提示:面试的时候说框架,然后说一两个小的优化参数即可
更多内核可以参考“跟老男孩学运维书的第三章”以及我们的博客,近期将会更新
MySQL数据库层面优化
my.cnf参数优化
此优化主要针对innodb引擎
更多内核参数:my-innodb-heavy-4G.cnf 配置文件参数介绍
MySQL工具mysqlreport 我们可以使用工具来分析MySQL的性能
如何才能做到网站高并发访问? 生产环境中对于防范DDOS攻击的讨论
面试可能会问到DOOS 攻击防护
关于库表的设计规范
SQL语句的优化
索引优化
1)白名单机制一百度,项目开发啊,DBA参与,减少上线后的慢SQL数据
抓出慢SQL,配置my.cnf
2)慢查询的日志分析工具——mysqlsla或pt-query-digest(推荐)
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)使用explain及set profile优化SQL语句
大的复杂的SQL语句拆分成多个小的SQL语句
子查询,JOIN连表查询,某个表4000万条记录
数据库是存储数据的地方,但不是计算数据的地方
对数据计算,应用类处理,都要拿到前端应用解决。禁止在数据库上处理
搜索功能,like ‘%oldboy%’ 一般不要用MySQL数据库
使用连接(JOIN)来代替子查询(Sub_Queries)
避免在整个表上使用cout(*),它可能锁住整张表
多表联接查询时,关联字段类型尽量一致,并且都要有索引。
在WHERE子句中使用UNION代替子查询
多表连接查询时,把结果集小的表(注意,这里是指过滤后的结果集,不一样是全表数据量小的)作为驱动表
爬虫获取数据的过程
**网站集群架构上的优化
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.百度、阿里国内前三公司,会选择从库进行备份,对数据库进行分库分表MySQL 流程、制度控制优化
任何一次人为数据库记录的更新,都要走一个流程:
a.人的流程:开发-->核心开发-->运维或DBA b.测试流程:内网测试-->IDC测试-->线上执行 c.客户端管理,phpmyadminMySQL基础安全
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控制总结
以上是生活随笔为你收集整理的深度优化LNMP之MySQL的全部内容,希望文章能够帮你解决所遇到的问题。
- 上一篇: 【译】 Stealing the fun
- 下一篇: Mysql能删了重装吗_mysql卸载重