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或PCIeSSD设备可以将IOPS效率提高数千倍。随机IO:SAS单盘容量300IOPSSSD随机IO:单盘容量可达35000IOPSFlashcacheHBA卡raid磁盘阵列:4个快盘:RAID0>RAID1(推荐)>RAID5(很少用)>RAID1主库选择raid10,从库可以选择raid5/raid0/raid10,从库配置等于或大于主库网卡:使用多个网卡bonds,buffer,tcp优化千兆网卡和千兆,10千兆开关。使用虚拟化。从硬件必须等于或大于Master2的性能。企业案例:百度:某部门的IBM服务器,CPU为48核,内存为96GB。一台服务器运行3~4个实例:sina:大部分服务器是DELLR510,CPU是E5210。48GB内存,硬盘12*300GSAS,做RAID103,服务器硬件配置调整(1)服务器BIOS调整:提高CPU效率参考设置:a.开启PerfirmancePerWattOptimized(DAPC)模式以最大化CPU的性能,数据库通常需要高计算量b.开启CIE和CStates等选项,目的也是为了提高CPU效率c。MemoryFrequency(内存频率)选择MaximumPerformance(最佳性能)d.在内存设置菜单中,启动NodeInterleaving以避免NUMA问题(2)Arraycard调整:a.购买同时配备CACHE和BBU模块的阵列卡(机械盘)b.设置数组写策略为WEB,甚至OFRCEWB(数据安全要求高)(wb指的是raid卡的写策略:能写(writeback))c.不使用WT策略,关闭数组预读策略2操作系统级优化1.操作系统和MySQL实例选择1.一定要选择x86_64系统,推荐使用CentOS6.8linux,关闭NUMA特点2.将操作系统和数据分开,不仅在逻辑上,而且在物理上也分开3.避免使用Swap交换分区4.避免使用软件磁盘阵列5.避免使用LVM逻辑卷6.删除不用的安装包和Daemon进程2.文件系统层优化(1)调整diskCache模式使能WCE=1(WriteCacheEnable),RCD=0(ReadCacheDisable)模式命令:sdparm-sWCE=1,RCD=0-S/dev/sdb(2)采用LinuxI/O调度算法deadlinedeadline调度参数对于CentosLinux,建议read_expire=1/2write_expireecho500>/sys/block/sdb/queue/iosched/read_expireecho1000>/sys/block/sdb/queue/iosched/write_exPireLinuxI/O调度方法Linuxdeadlineio调度算法(三)使用xfs文件系统如果业务量不是很大,也可以使用ext4。如果业务量大,建议使用xfs:调整XFS文件系统日志和缓冲区变量XFS高性能设置(4)挂载文件系统增加:async、noatime、nodiratime、nobarrier等noatime不要访问文件时更新inode的时间戳。在高并发环境下,推线显示并应用该选项,可以提高系统I/O性能asyncwrite数据会先写入内存缓冲区,只有在硬盘写入时才会写入磁盘磁盘空闲,可以提高写入效率!风险是如果服务器宕机或者不正常,buffer中还没有写入磁盘的数据会丢失解决办法:服务器主板电池或者UPS不间断电源nodiratime没有更新目录inode时间戳系统,高并发环境,建议显示此应用可以提高系统I/O性能nobarrier不使用raid卡上的电池(五)Linux内核参数优化1.设置vm,swappiness为0-102.设置vm,dirty_background_ratio为5-10,设置vm,Dirty_ratio为2倍左右,保证脏数据可以不断刷到磁盘,避免瞬间I/O写和严重等待。3、优化TCP协议栈,减少TIME_WAIT,提高TCP效率net.ipv4.tcp_tw_recyle=1net。ipv4.tcp_tw_reuse=1减少FIN-WAIT-2连接状态的时间,让系统处理更多的连接net.ipv4.tcp_fin_timeout=2减少TCPKeepAlived连接检测的时间,让系统处理更多的连接net.ipv4.tcp_keepalived_time=600增加系统支持的最大SYN半连接数(默认1024)net.ipv4.tcp_max_syn_backlog=16384减少系统SYN连接重试次数(默认5)net,ipv4.tcp_synack_retries=1net.ipv4.tcp_sync_retries=1内核放弃已建立连接前发送的SYN包数net.ipv4.ip_local_prot_range=450065535系统允许开放的端口范围4.网络优化优化系统socketbuffer增加TCPmaxbuffersizenet.core.rmem_max=16777216#最大套接字读取buffernet.core.wmem_max=16777216#最大套接字写入buffernet.core.wmem_default=8388608#这个文件指定接收套接字缓冲区大小的默认值(以字节为单位)net.core.rmem_default=8388608优化tcp接收/发送缓缓增加LinuxAutotuningTCPBufferlimitsNet.ipv4.tcp_rmem=409687380167777216NET.IPV4.IPV4.TCP_WMEM=4096655555361677777777777777777777777777777777777777777777.PP_16777777777777777777777777777777777777.PP_EMET.netdev_max_backlog=30005.Otheroptimizationsnet.ipv4.tcp_timestamps=0net.ipv4.tcp_max_orphans=3276800net.ipv4.tcp_max_tw_buckets=360000提示:面试的时候,先说框架,再说一两个小的优化参数。更多核心可以参考《老男孩运维书第三章》,我们的博客会在近期更新。3MySQL数据库级优化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等是为每个connectionsession分配的,所以不能设置太大。建议关闭querycache功能或者减小设置不超过512M更多内核参数:my-innodb-heavy-4G.cnf配置文件参数介绍MySQL工具mysqlreport我们可以使用工具分析MySQL-8字符集的性能,虽然有人说没有latin1快。带f的列尽量使用定长char固定字符串,并使用lessvarchar来存储可变长度的字符串。使用VARCHAR而不是CAHR---节省空间,因为固定长度的CHAR,而VARCHAR长度不固定(UTF8不担心这种影响)allInnoDB表设计有一个自增列作为主键,该列没有业务用途。在字段长度满足要求的前提下,尽量选择长度较小的字段。尝试对某些文本字段添加NOTNULL约束,例如“省”或“性别”。我们可以将它们定义为ENUM类型,并尽可能避免使用TEXT/BLOB类型。如果需要,建议拆分成子表,不要和主表放在一起,避免读SELECT*时读性能差,只选择需要的列,不要每次都SELECT*,避免严重的随机读取问题,尤其是读取一些TEXT/BLOB类型的时候,如果需要的话,建议拆分成子表,不要和主表放在一起,避免SELECT*时读取性能差。在对VARCHAR(N)列创建索引时,通常为其长度的50%(甚至更少)创建前缀索引就足以满足80%以上的查询需求。没有必要在整个列上创建全长索引。多用符合性索引,少用独立索引,尤其是一些基数太小的列(如果该列的唯一值总数小于255),不要创建独立索引。4SQL语句优化索引优化1)白名单机制百度,项目开发,DBA参与,减少上线后的慢SQL数据抓取慢SQL,配置my.cnflong_query_time=2log-slow-queries=/data/3306/slow-log.loglog_queries_not_using_indexspollingbyday:slow-log.log2)慢查询的日志分析工具-mysqlsla或pt-query-digest(推荐)pt-quey-diges,mysqldumpslow,mysqlsla,myprofi,mysql-explain-slow-log,mysqllogfileter3)Analyze每晚0:00定时慢查询,发给核心开发、DBA分析、高级运维,CTO邮箱DBA分析给出优化建议-->核心开发确认更新-->DBA在线运维处理4)定时使用pt-duplicate-key-checker检查删除重复索引定期使用pt-index-usage工具检查删除不常用索引5)使用pt-online-schema-change完成大表ONLINEDDL需求6)有时MySQL会使用错误的索引,这种情况下使用USEINDEX7)使用explain和setprofile优化SQL语句大而复杂的SQL语句拆分成多个小的SQL语句子查询,JOIN连接表查询,一张表有4000万条记录,数据库是存储数据的地方,而不是计算数据的地方。对于数据计算和应用处理,必须由前端应用来解决。禁止在数据库上处理查找功能,如'%oldboy%'一般不要使用MySQL数据库使用连接(JOIN)代替子查询(Sub_Queries)避免对整个表使用cout(*),它可能会锁定整个表更多的时候表连接查询,相关字段类型尽量保持一致,必须有索引。在WHERE子句中使用UNION代替多表连接查询的子查询时,使用结果集小的表(注意这里指的是过滤后的结果集,不同于整个数据量小的表)table)作为驱动表爬虫获取数据流程5网站集群架构优化1.在服务器上运行多个实例,2-4个(根据服务器的硬件信息而定)2.主从复制,一主五slaves,使用混合模式,尽量不要跨机房同步(处理远程读本地写)3.定期使用pt-table-checksum和pt-table-sync检查修复mysql主从复制的数据差异4.业务拆分:搜索功能,像'%oldboy%'一般不用MySQL数据库5.业务拆分:部分业务应用使用nosql持久化存储,如:memcached、redis、ttserver如粉丝关注、好友关系等。6.FR数据库ont端必须加缓存,如:memcached、用户登录、产品查询7.动态数据库静态,整个文件静态,页面分片静态8.数据库集群读写分离.一主多从,通过程序或dbproxy集群读写分离9.单表超过800万,会拆库和表。手动拆表和拆库(登录、产品、订单)10、国内前三的百度和阿里都会选择从数据库备份,将数据库分库分表6MySQL进程和系统控制优化必须有一个过程:a.人的流程:开发-->核心开发-->运维或DBAb。测试流程:内网测试-->IDC测试-->在线执行c.客户端管理,phpmyadminMySQL基本安全1、启动程序700,所有者和用户组为MySQL2、设置MySQL超级用户root的密码3、如果要求严格,可以删除root用户,创建其他管理用户,例如admin4。登录时尽量不要在命令行暴露密码,如果备份脚本中有密码,设置为700,所有者和密码组为mysql或root5.删除默认存在的测试库6.最初删除无用用户,只保留|根|127.0.0.1||根|本地主机|7、不要用一个用户管理所有的数据库,尽量使用专用的数据库用户。8、清理mysql运行日志文件~/.mysql_history(权限600,不可删除)9、禁止开发获取web连接密码,禁止开发连接运行生产外部库10、phpmyadmin安全11.服务器禁止设置外网IP12.防SQL注入(WEB)php.ini或web开发插件监控,waf控制
