1.mysql硬件选择
cpu mem io 设备多少合适
标准配置 16c 32G cpu和内存的比例最好是1:3 1:4左右最少是1比2以上,标准是1:4<br />io设备至少是read5 最好是read10 有条件使用固态盘<br /> 硬件设备最好选择,知名厂商不要买伪劣品,如果是物理服务器,规划出三年之内大概需要多少配置,不推荐经常更换硬件。云服务器可不考虑,可以动态扩展<br />建议 CPU:MEM1:2+<br />低配需求8C 32G+ 500连接数以内 qps 500 - tps 100-<br />标配 16c+,64G+ 100以内的连接数 qps 500-1000 tps 100-200 注意不能盲目的加硬件的配置 连接数到达2000 已经压力很大了,网络可能会到瓶颈或者磁盘io<br />高配 64G 512G+/256 土豪企业 <br />操作系统最适合mysql的就是linux了其次是windows大几率都是linux
2.关闭numa
numa是控制cpu分配内存的控制手段,比如8核cpu 64G内存,每个核心分为8个核心的内存大家就不会争抢资源了,那为什么要关闭numa呢?<br />对于mysql来讲呢用不上这个机制,myslq有独立的内存管理机制,他怎么分内存,线程如何使用内存是mysql自己独立控制的不希望别人来控制这个内存的使用,完全公平去分配的话,有的时候某一个线程需要的内存大一些会出现阻塞 ,最后关闭numa。<br /> 关闭numa方法<br />最好是在bios中关闭,还可以在配置文件关闭,注意虚拟机关闭与开启的作用不大,操作内核可能有风险最好还是在bois中更改<br />在bios中关闭numa性能会提示15%-30% <br />关闭方法示例:<br />vi /boot/grub2/grub.cfg<br />#/* Copyright 2010, Oracle. All rights reserved. */<br />default=0<br />timeout=5<br />hiddenmenu<br />foreground=000000<br />background=ffffff<br />splashimage=(hd0,0)/boot/grub/oracle.xpm.gz<br />title Trying_C0D0_as_HD0<br />root (hd0,0)<br />kernel /boot/vmlinuz-2.6.18-128.1.16.0.1.el5 root=LABEL=DBSYS ro bootarea=dbsys<br />rhgb quiet console=ttyS0,115200n8 console=tty1 crashkernel=128M@16M numa=off ##注意主要改这行前面都是默认配置
3.磁盘优化
在生产中磁盘在软件方面强烈建议使用read10(推荐)不管是主库还是从库都是使用read10(推荐),为什么推荐read10因为他至少有4块盘这就意味着有一块热备盘,即使有一块磁盘损坏,还可以即使更换,缺点就是会浪费一块盘的资源,提高了安全性。
4.关闭THP(大页内存)
在centos6之后才加入的一个分配内存的机制,为什么要关闭系统新加入的内存机制THP。<br />因为应用在申请内存的时候呢,因为mysql不需要他来管理内存机制,mysql有自己的内存管理机制<br />THP分配的内存可能会比mysql实际需要的多的多,因为mysql内部机制申请内存是16kb,THP分配大页内存机制是1M这个时候就会出现内存碎片,内存碎片就是THP分配给mysql多余的内存,不会进行释放(还是一直在占用资源),这个时候会产生OOM,内存溢出,会造成资源的浪费,操作系统没有内存可以使用了,就会kill掉mysql这个线程, 生产建议关闭(推荐)。<br /> 关闭THP方法示例:<br />vi /etc/rc.local<br />在文件末尾添加如下指令:<br />if test -f /sys/kernel/mm/transparent_hugepage/enabled; then<br />echo never > /sys/kernel/mm/transparent_hugepage/enabled<br />fi<br />if test -f /sys/kernel/mm/transparent_hugepage/defrag; then<br />echo never > /sys/kernel/mm/transparent_hugepage/defrag<br />fi<br />下面为临时生效用来进行压力测试<br />root@master ~]# cat /sys/kernel/mm/transparent_hugepage/enabled<br />always madvise [never]<br />echo > naver /sys/kernel/mm/transparent_hugepage/enabled<br />root@master ~]# cat /sys/kernel/mm/transparent_hugepage/defrag<br />always madvise [never]<br />echo > /sys/kernel/mm/transparent_hugepage/defrag
5.网卡绑定(网卡优化)
bonding 技术,业务数据服务器都要配置bonding继续,建议是主备模式,交换机一定要堆叠。<br />将多个网卡绑定为逻辑网卡(网卡多可用)<br />bond 0 bond1 网卡主备模式,配置这里不做详细说明
6.存储多路径
linux 存储多路径感兴趣自己百度了解一下如何配置不是DBA配置。
7.系统层面的优化
7.1更改文件句柄和进程数
内核优化 /etc/sysctl.conf
vm.swappiness = 5(也可以设置为0) #物理内存剩余百分之5启动交换分区swap,推荐是不要设置0防止OOM
vm.dirty_ratio = 20 ## 脏页比例达到百分之多少进行刷新,脏页文件系统缓存中一些被修改完的数据需要落入到磁盘中的数据
vm.dirty_background_ratio = 10 ##脏页异步刷新,上面是同步刷新
##vm dirty参数要根据自己硬盘的性能调整参数,磁盘性能高就调低,磁盘性能差就调高,上面是ssd磁盘的配置,性能差就让他刷新的频率不要那么频繁
net.ipv4.tcp_max_syn_backlog = 819200
net.core.netdev_max_backlog = 400000
net.core.somaxconn = 4096
net.ipv4.tcp_tw_reuse=1
net.ipv4.tcp_tw_recycle=0
7.2文件句柄
文件句柄就是你打开某个文件,在磁盘的对应关系,你打开某个文件就是找到这个文件句柄的位置如果文件句柄满了会怎么样?
为什么要打开文件句柄的限制,因为数据库需要打开的文件数很大,如果文件句柄同打开数量过小,数据库会报错连接失败
文件句柄设置示例:
vi /etc/security/limits.conf
soft nofile 204800
hard nofile 204800
soft nproc 204800
hard nproc 204800
查看是否生效
ulimit -a
7.3临时生效设置线程打开数
echo 6553560 > /proc/sys/fs/file-max
vi /etc/sysctl.conf
fs.file-max=65535
reboot
查看是否生效
sudo sysctl -p
7.4防火墙
禁用selinux : /etc/sysconfig/selinux 更改SELINUX=disabled.
iptables如果不使用可以关闭。可是需要打开MySQL需要的端口号
7.5文件系统优化
推荐使用XFS文件系统
MySQL数据分区独立 ,例如挂载点为: /data
mount参数 defaults, noatime, nodiratime, nobarrier 如/etc/fstab:
/dev/sdb /data xfs defaults,noatime,nodiratime,nobarrier 1 2
noatime,nodiratime ,nobarrier(可以不加)#防止文件系统的争用在挂载文件系统的时候要加上这两个参数
mount -o noatime,nodiratime ,nobarrier /dev/sdb1 /data #-o是参数
blkid 查看磁盘uuid号
7.6不使用lvm
mysql的存储非常不建议使用lvm
7.7io调度
SAS : deadline
SSD&PCI-E: noop
centos 7 默认是deadline
cat /sys/block/sda/queue/scheduler
#临时修改为deadline(centos6)
echo deadline >/sys/block/sda/queue/scheduler #/block/sba #注意sba 改为你要更改的磁盘名称
vi /boot/grub/grub.cfg
更改到如下内容:
kernel /boot/vmlinuz-2.6.18-8.el5 ro root=LABEL=/ elevator=deadline rhgb quiet
8.预装MySQL前硬件烤机压测
stress 进行CPU、IO、MEM烤机压测
a. 安装
yum install -y epel-release ##加载epel源
yum install -y stress ##安装命令
b. 烤机CPU
[root@slave1 ~]# stress -c 4 ## -c指定cpu核心数
c. 烤机 MEM
stress -m 3 —vm-bytes 300M #-m启动多少个进程,—vm是压多少M 一共使用300M内存 三个进程都占用300M
d. 烤机多参数
stress -c 4 -m 2 -d 1 #
8.1FIO 进行定制化IO烤机压测
FIO是测试IOPS的非常好的工具,用来对磁盘进行压力测试和验证。
磁盘IO是检查磁盘性能的重要指标,可以按照负载情况分成照顺序读写,随机读写,混合读写两大类。
FIO是一个可以产生很多线程或进程并执行用户指定的特定类型I/O操作的工具,FIO的典型用途是编写
和模拟的I/O负载匹配的作业文件。
FIO是一个多线程io生成工具,可以生成多种IO模式,用来测试磁盘设备的性能(也包含文件系统:如针
对网络文件系统 NFS 的IO测试)。
FIO压测可以帮助管理员,提前预知磁盘瓶颈,及时作出扩容建议。也可以作为有效烤机的
io评估
吞吐量: 吞吐量就是文件传输的速度(类似于拷贝文件的进度条),吞吐量越高传输速度越快单位是每秒多少 M kB G
iops:一秒钟能发生多少次的io超过这个次数就要进行io等待,什么叫io?
数据从磁盘到内存叫in,从内存到磁盘叫out 一次输入/输出叫io,io的次数有控制in和out都算一次io ,每一块磁盘都有最大限度的io次数,超过最大次数就要进行io等待
LA:
a. 环境准备
mkdir -p /testio
mkfs.xfs /dev/sdb
mount /dev/sdb /testio
dd if=/dev/zero of=/testio/test bs=16k count=512000
b. 安装
yum install libaio libaio-devel fio
c. 各类压测
# 测试随机写:
fio —filename=/testio/test —iodepth=4 —ioengine=libaio -direct=1 — rw=randwrite —bs=16k —size=2G —numjobs=64 —runtime=20 —group_reporting —name=test-rand-write
# 测试顺序读取:
fio —filename=/testio/test -iodepth=64 -ioengine=libaio —direct=1 —rw=read — bs=1m —size=2g —numjobs=4 —runtime=10 —group_reporting —name=test-read
# 测试顺序写性能
fio —filename=/testio/test.big -iodepth=64 -ioengine=libaio -direct=1 -rw=write
-bs=1m -size=2g -numjobs=4 -runtime=20 —group_reporting -name=test-write
测试随机读:
fio —filename=/testio/test -iodepth=64 -ioengine=libaio -direct=1 -rw=randread -
bs=16k -size=10G -numjobs=5 -runtime=20 —group_reporting -name=test-rand-read
# 16k,70%读取,30%写入:
fio —filename=/dev/sdb —direct=1 —rw=randrw —refill_buffers —norandommap — randrepeat=0 —ioengine=libaio —bs=4k —rwmixread=70 —iodepth=16 —numjobs=16 - -runtime=60 —group_reporting —name=73test
# 重要参数解读:
—filename 需要压测的磁盘或者测试文件。
—direct=1 是否绕过文件系统缓存
-ioengine=libaio 采用异步或者同步IO
-iodepth=64 IO队列深度。一次发起多少个IO请求,一般SSD或者flash可以较大。
—numjobs=16 测试并发线程数。在RAID10或Raid5可加大参数。
—rwmixread=70 混合读写,read的比例。一般读写比例28或者37。
—group_reporting 统计汇总结果展示。
—name 起个名。
—rw=randrw 测试类型.
# 结果解读
IOPS
write: IOPS=5883, BW=91.9MiB/s (96.4MB/s)(1841MiB/20020msec)
lat (usec): min=1677, max=78137, avg=43413.06, stdev=7210.57
clat percentiles (usec):
| 1.00th=[23462], 5.00th=[25297], 10.00th=[26084], 20.00th=[27657],
| 30.00th=[28967], 40.00th=[30278], 50.00th=[31851], 60.00th=[33162],
| 70.00th=[34866], 80.00th=[36963], 90.00th=[40109], 95.00th=[42730],
| 99.00th=[49021], 99.50th=[51119], 99.90th=[59507], 99.95th=[61604],
| 99.99th=[64226]
压测总结:
stress 压测:连续压测15-30天,观察系统日志,评估cpu,MEM,整机是否稳定
fio 压测结果: 主要评估IOPS,吞吐量,延迟统计等维度。
9.0总结
1、稳定版:选择开源的社区版的稳定版GA版本。
2、选择mysql数据库GA版本发布后6个月-12个月的GA双数版本,大约在15-20个小版本左右。
3、要选择前后几个月没有大的BUG修复的版本,而不是大量修复BUG的集中版本。
4、要考虑开发人员开发程序使用的版本是否兼容你选的版本。
5、作为内部开发测试数据库环境,跑大概3-6个月的时间。
6、优先企业非核心业务采用新版本的数据库GA版本软件。
7、向DBA高手请教,或者在技术氛围好的群里和大家一起交流,使用真正的高手们用过的好用的GA版本产品。
最终建议: 8.0.20是一个不错的版本选择。向后可以选择双数版。
