时间:2021-07-01 10:21:17 帮助过:7人阅读
内存
(1)关闭NUMA特性。NUMA陷阱现象是当你的服务器还有内存的时候,发现它已经在开始使用swap了,甚至已经导致机器出现停滞的现象。这个就有可能是由于numa的限制,如果一个进程限制它只能使用自己的numa节点的内存,那么当自身numa node内存使用光之后,就不会去使用其他numa node的内存了,会开始使用swap,甚至更糟的情况,机器没有设置swap的时候,可能会直接宕机。所以,强烈建议在操作系统层面关闭NUMA特性。直接在/etc/grub.conf的kernel行最后添加numa=off即可。
(2)尽量配置高内存。这种mysql可以充分利用内存资源缓存热块数据,避免由于内存不足导致脏数据不断地刷盘从而产生IO瓶颈,也可以避免热块数据被挤出缓存区的情况发生。
磁盘IO
(1)尽量将数据文件和日志文件分开,各自承载相应的磁盘。避免日志刷盘和数据刷盘之间争用IO。
(2)尽量使用高IO的磁盘,或者使用raid10这类磁盘阵列,或者直接采用SSD盘
网络优化
集群内机器最好部署在同一内网or专线直连的网络环境,以保证低延迟,高吞吐的网络环境。避免由于网络问题导致的集群内脑裂or主从复制异常的情况。
操作系统层面:
文件系统
强烈建议采用xfs文件系统,ext4文件系统存在bug,触发会占用自身大部分IO,造成IO瓶颈。详见http://1057212.blog.51cto.com/1047212/1891734
IO调度算法
NOOP:NOOP算法的全写为No Operation。该算法实现了最最简单的FIFO队列,所有IO请求大致按照先来后到的顺序进行操作。
CFQ:CFQ算法的全写为Completely Fair Queuing。该算法的特点是按照IO请求的地址进行排序,而不是按照先来后到的顺序来进行响应。
DEADLINE:DEADLINE在CFQ的基础上,解决了IO请求饿死的极端情况。除了CFQ本身具有的IO排序队列之外,DEADLINE额外分别为读IO和写IO提供了FIFO队列。读FIFO队列的最大等待时间为500ms,写FIFO队列的最大等待时间为5s。FIFO队列内的IO请求优先级要比CFQ队列中的高,,而读FIFO队列的优先级又比写FIFO队列的优先级高。优先级可以表示为:FIFO(Read) > FIFO(Write) > CFQ
一般mysql服务器的磁盘IO调度算法采用deadline,既可以保证IO请求不被饿死,又可以使得读IO的处理优先级大于写IO。
系统架构层面优化
负载均衡
这里可以分为两类:
1、PXC or mysql cluster or mysql group replication这类数据库集群,由于支持多点写入的方式,这里的负载均衡可以实现读和写都均衡负载的情况,通过在数据库前端部署haproxy或者LVS的方式实现负载均衡。但是需要强调的是,目前这类型集群在多点写入的情况很容易产生锁冲突和更新丢失的情况,一般官方建议开启单点写入。也就是说,一般也只能实现主库承载写操作,若干从库均衡负载读操作。
2、mysql一主多从架构:由于主库必须单独承载写操作,故均衡负载只是针对于读操作。也是通过在数据库前端部署haproxy或者LVS的方式实现读操作负载均衡。
缓存
一般采用内存数据库如Redis、memcached同mysql结合,将热点数据放在内存数据库上实现高并发。可以参考博客:http://blog.csdn.net/stubborn_cow/article/details/50586990
分布式优化
分库分表:
这里也可以分为2类:
(1)通过前端应用代码逻辑实现的方式,实现表分拆的方式。这样做对应用程序的侵入性比较大,但是数据处理逻辑的过程把控在自己手上,有异常可以自主定位。
(2)通过中间件的方式实现,目前常用的mycat、cobar实现数据分片。
读写分离:
一般通过数据库中间件的方式实现,常用的中间件例如:maxscale、mycat、cobar、altas等
本文出自 “林志坚的博客” 博客,请务必保留此出处http://linzhijian.blog.51cto.com/1047212/1914330
mysql 优化
标签:优化 规范