深度优化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
启用WCE=1(Write Cache Enable),RCD=0(Read Cache Disable)模式
命令:sdparm -s WCE=1,RCD=0 -S /dev/sdb
(2)采用Linux I/O scheduler
算法deadlinedeadline
调度参数
对于Centos Linux建议 read_expire = 1/2 write_expire
echo 500 > /sys/block/sdb/queue/iosched/read_expire
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协议栈
#减少TIME_WAIT,提高TCP效率
net.ipv4.tcp_tw_recyle=1
net.ipv4.tcp_tw_reuse=1
#减少处于FIN-WAIT-2连接状态的时间,使系统可以处理更多的连接net.ipv4.tcp_fin_timeout=2
#减少TCP KeepAlived连接侦测的时间,使系统可以处理更多的连接。
net.ipv4.tcp_keepalived_time=600
#提高系统支持的最大SYN半连接数(默认1024)
net.ipv4.tcp_max_syn_backlog = 16384
#减少系统SYN连接重试次数(默认5)
net,ipv4.tcp_synack_retries = 1
net.ipv4.tcp_sync_retries = 1
#在内核放弃建立的连接之前发送SYN包的数量
net.ipv4.ip_local_prot_range = 4500 65535
#允许系统打开的端口范围
4.网络优化
#优化系统套接字缓冲区
#Increase TCP max buffer size
net.core.rmem_max=16777216 #最大socket读buffer
net.core.wmem_max=16777216 #最大socket写buffer
net.core.wmem_default = 8388608 #该文件指定了接收套接字缓冲区大小的缺省
值(以字节为单位)
net.core.rmem_default = 8388608
#优化TCP接收/发送缓冲区
# Increase Linux autotuning TCP buffer limits
net.ipv4.tcp_rmem=4096 87380 16777216
net.ipv4.tcp_wmem=4096 65536 16777216
net.ipv4.tcp_mem = 94500000 915000000 927000000
#优化网络设备接收队列
net.core.netdev_max_backlog=3000
5.其他优化
net.ipv4.tcp_timestamps = 0
net.ipv4.tcp_max_orphans = 3276800
net.ipv4.tcp_max_tw_buckets = 360000
提示:面试的时候说框架,然后说一两个小的优化参数即可
更多内核可以参考“跟老男孩学运维书的第三章”以及我们的博客,近期将会更新
3
MySQL数据库层面优化
my.cnf参数优化
此优化主要针对innodb引擎
如果采用MyISAM引擎,需要key_buffer_size加大。
强烈推荐采用innodb引擎,default-storage-engine=Innodb
调整innodb_buffer_pool_size大小,考虑设置为物理内存的50%-60%左右
根据实际需要设置inno_flush_log_at_trx_commit,sync_binlog的值。
如果要需要数据不能丢失,那么两个都设为1.如果允许丢失大一点数据,
则可分别设为2和0,在slave上可设为0
设置innodb_file_per_table = 1,使用独立表空间
设置innodb_data_file_path = ibdata1:1G:autoextend,不要使用默认的10%
设置innodb_log_file_size=256M,设置innodb_log_files_in_group=2,基本可
满足90%以上的场景;
不要将innodb_log_file_size参数设置太大,这样可以更快同时又更多的磁盘空间,
丢掉多的日志通常是好的,在数据库崩溃后可以降低恢复数据库的事件
设置long_query_time = 1记录那些执行较慢的SQL,用于后续的分析排查;
根据业务实际需要,适当调整max_connection(最大连接数max_connection_error
(最大错误数,建议设置为10万以上,而open_files_limit、innodb_open_files、
table_open_cache、table_definition_cache这几个参数则可设为约10倍于
max_connection的大小;)不要设置太大,会将数据库撑爆
tmp_table_szie、max_heap_table_size、sort_buffer_size、
join_buffer_size、read_buffer_size、read_rnd_buffer_size等都是
每个连接session分配的,因此不能设置过大
建议关闭query cache功能或降低设置不要超过512M
更多内核参数:my-innodb-heavy-4G.cnf 配置文件参数介绍
MySQL工具mysqlreport
我们可以使用工具来分析MySQL
的性能
如何才能做到网站高并发访问? 生产环境中对于防范DDOS攻击的讨论
面试可能会问到DOOS 攻击防护
关于库表的设计规范
推荐utf-8字符集,虽然有人说谈没有latin1快
固定字符串的列尽可能多用定长char,少用varchar
存储可变长度的字符串使用VARCHAR而不是CAHR---节省空间,因为固定
长度的CHAR,而VARCHAR长度不固定(UTF8不愁此影响)
所有的InnoDB表都设计一个无业务的用途的自增列做主键
字段长度满足需求前提下,尽可能选择长度小的
字段属性尽量都加NOT NULL约束
对于某些文本字段,例如“省份”或者“性别”我们可以将他们定义为ENUM类型尽可能不使用TEXT/BLOB类型,确实需要的话,建议拆分到子表中,不要和主表
放在一起,避免SELECT *的时候读性能太差。
读取数据时,只选取所需要的列,不要每次都SELECT * 避免产生严重的随机读
问题,尤其是读到一些TEXT/BLOB类型,确实需要的话,建议拆分到子表中,不要
和主表放在一起,避免SELECT *的时候读性能太差
对一个VARCHAR(N)列创建索引时,通常取其50%(甚至更小)左右长度创建前缀
索引就足以满足80%以上的查询需求了,没必要创建整列的全长度索引。
多用符合索引,少用多个独立索引,尤其是一些基础(Cardinality)太小
(如果说:该列的唯一值总数少于255)的列就不要创建独立索引了。
4
SQL语句的优化
索引优化
1)白名单机制一百度,项目开发
啊,DBA
参与,减少上线后的慢SQL
数据
抓出慢SQL
,配置my.cnf
long_query_time = 2
log-slow-queries=/data/3306/slow-log.log
log_queries_not_using_indexs
按天轮询:slow-log.log
2)慢查询的日志分析工具——mysqlsla
或pt-query-digest
(推荐)
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)使用explain
及set 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
深度优化LNMP之MySQL的更多相关文章
- 深度优化LNMP之Nginx (转)
深度优化LNMP之Nginx Nginx基本安全优化 1.调整参数隐藏Nginx版本号信息 一般来说,软件的漏洞都和版本有关,因此我们应尽量隐藏或清除Web服务队访问的用户显示各类敏感信息(例 ...
- 深度优化LNMP之PHP (转)
深度优化LNMP之PHP PHP缓存加速介绍 1.操作码介绍及缓存原理 当客户端请求一个php程序时,服务器的PHP引擎会解析该PHP程序,并将其编译为特定的操作码文件(Operate ...
- 深度优化LNMP之Nginx [2]
深度优化LNMP之Nginx [2] 配置Nginx gzip 压缩实现性能优化 1.Nginx gzip压缩功能介绍 Nginx gzuo压缩模块提供了压缩文件内容的功能,用户请求 ...
- 深度优化LNMP
优化前准备工作 Centos准备及配置 准备安装包及软件:http://pan.baidu.com/s/1chHQF 下载解压到U盘即可安装http://pan.baidu.com/s/15TUWf ...
- 深度优化LNMP之PHP
PHP缓存加速介绍 1.操作码介绍及缓存原理 当客户端请求一个php程序时,服务器的PHP引擎会解析该PHP程序,并将其编译为特定的操作码文件(Operate Code,opcode)该文 ...
- [sql]大型网站MySQL深度优化揭秘
大型网站MySQL深度优化揭秘 第1章优化的思路和线路 1.1 网站优化的思路 2 1.2 MySQL优化,nginx这样的东西怎么优化? 第2章硬件层面优化 2.1 数据库物理机 2.1.1 ...
- MySQL内核深度优化
版权声明:本文由简怀兵原创文章,转载请注明出处: 文章原文链接:https://www.qcloud.com/community/article/179 来源:腾云阁 https://www.qclo ...
- lnmp全面优化集合nginx+mysql+php
lnmp的全名是linux+nginx+mysql+php,既然是全面优化那我们就从linux系统的选择入手.debian系统可以算是 linux各分支中做的比较突出的一类,连谷歌都抛弃linux订制 ...
- 腾讯云数据库团队:浅谈如何对MySQL内核进行深度优化
作者介绍:简怀兵,腾讯云数据库团队高级工程师,负责腾讯云CDB内核及基础设施建设:先后供职于Thomson Reuters和YY等公司,PTimeDB作者,曾获一项发明专利:从事MySQL内核开发工作 ...
随机推荐
- 常见linux命令用法介绍
su switch user 用途:用于用户之间的切换 格式: su - USERNAME切换用户后,同时切换到新用户的工作环境中 su USERNAME切换用户后,不改变原用户的工作目录,及其他环境 ...
- Linux系统Java环境安装配置
jdk安装配置 首先下载JDK和JRE,这里你的需要看看你的Linux系统是多少位的,比如我的是64位的: 下载JDK并指定到Download目录,JRE同样操作: 解压并且配置环境: tar -zx ...
- [Link-Cut-Tree]【学习笔记】
可以按照<Utopiosphere>的调唱出来 “Link-Cut ,Time doesn’t stop .Prepare your doubts ,Eat them up” 参考资料: ...
- bzoj:1654 [Usaco2006 Jan]The Cow Prom 奶牛舞会
Description The N (2 <= N <= 10,000) cows are so excited: it's prom night! They are dressed in ...
- POJ 1163 The Triangle【dp+杨辉三角加强版(递归)】
The Triangle Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 49955 Accepted: 30177 De ...
- BZOJ2425: [HAOI2010]计数
题目:http://www.lydsy.com/JudgeOnline/problem.php?id=2425 其实能够构成的数就是原数的排列(算前导0),然后组合计数一下就可以了. #include ...
- CSS3动画属性和flex弹性布局各个属性
[CSS3动画的使用] 1.声明一个关键帧(动画): @keynames name{ from{} to{} } 每个阶段的写法: ①可以直接使用from-to的写法 ②可以设置0%-100%的写法, ...
- 构建LVS-DR+Keepalive高可用集群
------client----------主LVS----------从LVS------------WEB1-------------WEB2--------- 2.2.2.250 2.2.2. ...
- Java入门篇(四)——数组
上篇在foreach中有引入一个数组的概念,数组是最为常见的一种数据结构,是相同类型的.用一个标识符封装到一起的基本类型数据序列或对象序列. 数组是具有相同数据类型的一组数据的集合,根据维数不同可以分 ...
- EntityFramework默认映射规则
我不太习惯通过CodeFirst去维护数据库(尽管这是未来实现自动编程的必经之路),还是喜欢通过数据库设计工具如PowerDesigner去建表.如果不想对EF的实体和数据表做什么映射的话,就要注意默 ...