深度优化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,以及buffertcp优化 
千兆网卡及千兆、万兆交换机 
提示: 
数据库属于IO密集型服务,硬件尽量不要使用虚拟化。 
Slave硬件要等于大于Master的性能


2、企业案例:

百度:某部门IBM服务器为48核CPU,内存96GB,一台服务器跑3~4个实例: 
sina:服务器是DELL R510巨多,CPU是E521048GB内存,硬盘12*300G SAS,做RAID10

3、服务器硬件配置调整

(1)服务器BIOS调整: 
  提升CPU效率参考设置: 
a.打开Perfirmance Per Watt OptimeizedDAPC)模式,发挥CPU最大性能,数据库通常需要高运算量 
b.打开CIEC States等选项,目的也是为了提升CPU效率 
c. Memory Frequency(内存频率)选择Maximum Performance(最佳性能) 
d.内存设置菜单中,启动Node Interleaving,避免NUMA问题 
(2)阵列卡调整: 
a.购置阵列卡同时配备CACHEBBU模块(机械盘) 
b.设置阵列写策略为WEB,甚至OFRCE WB (对数据安全要求高)(wbraid卡的写策略:会写(write back)) 
c.严禁使用WT策略,并且关闭阵列预读策略

操作系统层面优化

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

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. 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

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


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_commitsync_binlog的值。如果要需要数据不能丢失,那么两个都设为1.如果允许丢失大一点数据,则可分别设为20,在slave上可设为0
  5. 设置innodb_file_per_table = 1,使用独立表空间
  6. 设置innodb_data_file_path = ibdata1:1G:autoextend,不要使用默认的10%
  7. 设置innodb_log_file_size=256M,设置innodb_log_files_in_group=2,基本可满足90%以上的场景;
  8. 不要将innodb_log_file_size参数设置太大,这样可以更快同时又更多的磁盘空间,丢掉多的日志通常是好的,在数据库崩溃后可以降低恢复数据库的事件
  9. 设置long_query_time = 1记录那些执行较慢的SQL,用于后续的分析排查;
  10. 根据业务实际需要,适当调整max_connection(最大连接数)max_connection_error(最大错误数,建议设置为10万以上,而open_files_limitinnodb_open_filestable_open_cachetable_definition_cache这几个参数则可设为约10倍于max_connection的大小;)不要设置太大,会将数据库撑爆
  11. tmp_table_sziemax_heap_table_sizesort_buffer_sizejoin_buffer_sizeread_buffer_sizeread_rnd_buffer_size等都是每个连接session分配的,因此不能设置过大
  12. 建议关闭query cache功能或降低设置不要超过512M

更多内核参数:my-innodb-heavy-4G.cnf 配置文件参数介绍 
MySQL工具mysqlreport 我们可以使用工具来分析MySQL的性能 
如何才能做到网站高并发访问? 生产环境中对于防范DDOS攻击的讨论 
面试可能会问到DOOS 攻击防护


关于库表的设计规范

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

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代替子查询 
  多表连接查询时,把结果集小的表(注意,这里是指过滤后的结果集,不一样是全表数据量小的)作为驱动表


爬虫获取数据的过程

1.png-81.8kB
2.png-40.2kB
3.png-179.4kB

**网站集群架构上的优化

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.客户端管理,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控制

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/575926.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

element vue 纵向滑动条_Vue 部分

1、ES6Vue :1、Vue 是一套用于构建用户界面的渐进式框架。与其它大型框架不同的是,Vue 被设计为可以自底向上逐层应用。Vue 的核心库只关注视图层,不仅易于上手,还便于与第三方库或既有项目整合。另一方面,当与现代化的…

C#集合通论

前言 写这篇文章的最初动力是来自于一次笔试经历。有一道笔试题大概是这样的:程序使用一个txt文件来存储操作记录。存储记录是多行字符串,每一行代表一次操作记录,格式如下:用户名操作事项名称操作时间。现在假设这个txt文件已经非…

Shell 脚本案例实战 [4]

for循环结构for 循环结构语句1.for循环结构:语法:for 变量名 in 变量取值列表do指令…done提示:在此结构中“in 变量取值列表”可省略,省略时相当于in “$”,使用for i 就相当于使用for i in “$”2.C语言型for循环结构…

深度优化LNMP之PHP

PHP缓存加速介绍1.操作码介绍及缓存原理当客户端请求一个php程序时,服务器的PHP引擎会解析该PHP程序,并将其编译为特定的操作码文件(Operate Code,opcode)该文件是执行PHP代码后的一种二进制表示形式。默认情况下,这个…

PHP服务Fcgi进程及PHP解析优化

1、PHP引擎缓存加速常见四种软件:1.eAccelerator2.Zendcache3.xcache4.apc5.zendopcache php5.5自带2、使用tmpfs作为缓存加速缓存的文件目录 [rootweb02 ~]# mount -t tmpfs tmpfs /dev/shm -o size256m[rootweb02 ~]# mount -t tmpfs /dev/shm/ /tmp/eaccelerator…

电路 晶振频率_都说晶振是电路的心脏,你真的了解它吗?

之所以说晶振是数字电路的心脏,就是因为所有的数字电路都需要一个稳定的工作时钟信号,最常见的就是用晶振来解决,可以说只要有数字电路的地方就可以见到晶振。常见种类我们常说的晶振,包含两种。一种需要加驱动电路才能产生频率信…

ios 数组中的字典排序_利用数组和字典,实现按指定规则的排序

大家好,今日我们继续讲解数组与字典解决方案,今日讲解第47讲:利用字典和数组,实现按指定规则的排序。随着字典讲解的深入,我们发现字典真的很神奇,在VBA代码中,给人以十分清爽的感觉,在这套数组与字典解决方案中,我会尽可能的把经…

MVC3学习:利用mvc3+ajax实现登录

用到的工具或技术:vs2010,EF code first,JQuery ajax,mvc3。 第一步:准备数据库。 利用EF code first,先写实体类,然后根据实体类自动创建数据库;或者先创建数据库,再写实体类,都可以。如果实体…

vue获取tr内td里面所有内容_vue 项目学习

首先页面的整体内容结构以及package.json 里面的内容package.jsonrouter.js 路由功能import Vue from vue import Router from vue-router import Login from /login;Vue.use(Router) let router new Router({routes: [{path: /,redirect: {name: Login},},{path: /Login,na…

ubuntu中解压rar文件遇到乱码的解决方法

如上图所示,在用ubuntu的时候经常会遇见rar压缩文件打开出现乱码,解压的时候也会出现无效的编码等错误。 解决方法是用 sudo apt-get remove rar 卸载rar 然后用 sudo apt-get instal unrar 安装unrar 然后就可以解决这个问题了。 个人理解rar是用来压缩…

kmeans中的k的含义_硬质合金中P、M、K、N、S、H六大字母含义详解

数控技术在线订单 | 技术 | 干货 | 社群关注可加入机械行业群!关注P类:硬质合金中,P类产品的切削范围是指碳钢,铸钢,包括0.25-0.25%C淬火和调质,易切钢包含退火与淬火调质,低碳合金钢含金元素少于5%的范围&…

gitlab集成ldap用户后,禁用原来的账户体系进行拉取代码

gitlab在集成ldao用户后,经过测试,用户可以还可以通过原来的账号体系进行项目代码的拉取,需要把原来的账号体系的拉取功能关闭,使用ldap的账号体系进行工作开展。 方法如下: 在管理员-设置-通用-登录限制里把 Allow…

ffmpeg 分辨率 压缩_用GPU加速FFmpeg中的超分辨率功能

1. 简要回顾首先简单复述一下FFmpeg中对深度学习的支持情况,如上图所示,FFmpeg在libavfilter中支持基于深度学习的filter,目前已经支持sr, derain和dnn_processing等filter,其中,dnn_processing是一个通用的filter&…

mysql存储过程输入参数拆分_一文看懂mysql数据库存储过程、函数、视图、触发器、表...

概述抽空总结一下mysql的一些概念性内容,涉及存储过程、函数、视图、触发器等。一、查看存储过程、函数、视图、触发器、表1、存储过程select * from mysql.proc where typePROCEDURE;show procedure status; show create procedure proc_name; //存储过程定义2、函…

oracle vm发现无效设置_Oracle数据库编译失效对象相关命令总结大全,值得收藏

概述在日常数据库维护过程中,我们会发现数据库中一些对象(包Package、存储过程Procedure、函数Function、视图View、同义词.....)会失效,呈现无效状态(INVALID)。有时候需要定期检查数据库中存在哪些失效对象,对于存在异常的对象需要重新编译&#xff0c…

WCF-001:WCF的发布

随着“云”时代的到来,“云”已经无处不在了。什么是“云”,无非就是利用互联网强大的功能建立多个服务器,然后再利用互联网的传输数据的特点将数据从某个服务器中读取出来或者将你的数据上传上去。当然这个服务器不是一定就是传统意义的服务…

在线编辑_水墨-在线 Markdown 编辑器

水墨-在线 Markdown 编辑器基于 Spring-boot、FreeMarker、layui、Vditor 构建的一款在线 所见即所得的 Markdown 编辑器。水墨-在线 Markdown 编辑器。本人使用 Vditor 编辑器时日已久,眼看着其功能日益强大,特此基于 Vditor 构建一款 Web 编辑器&#…

退出出库复核是什么意思_细思极恐!为什么是黄晓明退出而不是李菲儿?因为女方是芒果艺人...

本文转载自:娱评人吴清功序言:《乘风破浪的姐姐》第二季即将接档《姐姐的爱乐之程》,于每周五晚上十点档播出。2021年1月5日,《乘风破浪的姐姐2》第一次公演举行,选手李菲儿和发起人黄晓明有亲密互动,李菲儿…

ie6 ie7下使用clear不能将浮动的元素换行问题

在主流浏览器中使用clear方法可以轻松完成浮动元素的换行。 例如&#xff1a; <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns"http://www.w3.o…

传值类型_Java内存管理:Stackoverflow问答-Java是传值还是传引用(十一)

勿在流沙筑高台&#xff0c;出来混迟早要还的。做一个积极的人编码、改bug、提升自己我有一个乐园&#xff0c;面向编程&#xff0c;春暖花开&#xff01;本文导图&#xff1a;一、由一个提问引发的思考在Stack Overflow 看到这样一个问题&#xff1a;Is Java “pass-by-refere…