硬件标准化
标准化数据库专用服务器
帮助公司和运维团队,选择最合适MySQL数据库运行的服务器硬件,从品牌、CPU、MEM、IO设备、网络设备、存储设备等各个层次进行合理建议.而不是上采购人员、商务人员或根本不懂数据库的人员制定服务器标准。杜绝类似:内存小了、磁盘没法用、不符合最低3-5年扩展性硬件等此类问题出现。
标准化服务器硬件带来的收益
出现业务系统故障或性能问题。可以让拍错或者优化时间大大缩减。帮助管理员可以快速根据基准值结合经验,定位瓶颈问题。
操作系统及配置标准化
标准化数据库操作系统
互联网企业广泛应用centos系列操作系统。并且在同一组集群架构的服务器系统都保持系统和内核版本一致。
标准化数据库稳定系统
采用Centos7.2以上双数版。并且安装同版本光盘稳定兼容较好的软件包
标准化操作系统及硬件参数
关闭NUMA
a. bios级别: 在bios层面numa关闭时,无论os层面的numa是否打开,都不会影响性能。 # numactl --hardware available: 1 nodes (0) #如果是2或多个nodes就说明numa没关掉 b. OS grub级别: vi /boot/grub2/grub.cfg #/* Copyright 2010, Oracle. All rights reserved. */ default=0 timeout=5 hiddenmenu foreground=000000 background=ffffff splashimage=(hd0,0)/boot/grub/oracle.xpm.gz title Trying_C0D0_as_HD0 root (hd0,0) kernel /boot/vmlinuz-2.6.18-128.1.16.0.1.el5 root=LABEL=DBSYS ro bootarea=dbsys rhgb quiet console=ttyS0,115200n8 console=tty1 crashkernel=128M@16M numa=off initrd /boot/initrd-2.6.18-128.1.16.0.1.el5.img 在os层numa关闭时,打开bios层的numa会影响性能,QPS会下降15-30%; c. 数据库级别: mysql> show variables like '%numa%'; +------------------------+-------+ | Variable_name | Value | +------------------------+-------+ | innodb_numa_interleave | OFF | +------------------------+-------+ 或者: vi /etc/init.d/mysqld 找到如下行 # Give extra arguments to mysqld with the my.cnf file. This script # may be overwritten at next upgrade. $bindir/mysqld_safe --datadir="$datadir" --pid-file="$mysqld_pid_file_path" $other_args >/dev/null & wait_for_pid created "$!" "$mysqld_pid_file_path"; return_value=$? 将$bindir/mysqld_safe --datadir="$datadir"这一行修改为: /usr/bin/numactl --interleave all $bindir/mysqld_safe --datadir="$datadir" --pidfile="$mysqld_pid_file_path" $other_args >/dev/null & wait_for_pid created "$!" "$mysqld_pid_file_path"; return_value=$?
备注: Non-Uniform Memory Access (NUMA) 是一种针对多处理器系统(包括多核心系统)的体系结构设计,它将内存分为不同的区域,每个区域可以被给定的一个或多个处理器访问。在这种设计中,由于不同区域的内存访问延迟不同,因此需要优化数据访问的方式,同时这种机制也会产生一定的性能开销。
在数据库场景中,通常需要大量的内存访问,而 NUMA 机制在分配内存时可能会产生由于不同区域内存访问延迟的差异而导致的性能瓶颈。因此,在一些数据库场景中,关闭 NUMA 可以提高整体性能。
需要注意的是,是否关闭 NUMA 取决于具体的应用场景和硬件环境。在某些情况下,开启 NUMA 可以提高性能。因此,在进行相应的调整之前,需要进行充分的测试和评估。
开启CPU高性能模式
关闭THP
THP 介绍
THP是Transparent Huge Pages的缩写,是一种Linux内核的特性。当THP启用时,操作系统会自动将内存页合并为更大的“超级页”,这样可以减少页面表的大小,降低内存管理的开销,从而提高内存管理的性能。 在数据库场景中,由于数据库常常需要大量的内存管理操作,开启THP可能会导致一些问题。例如: 1. THP可能会占用大量内存空间,这可能会影响数据库的性能。 2. THP可能会导致不可预测的性能问题,例如内存调度和缓存管理问题。 3. 由于THP会改变页面分配的方式,因此可能会导致应用程序无法发现重要的内存错误。 因此,在一些数据库场景中,关闭THP可能是一种更好的选择。但是,需要注意的是,这也取决于具体的硬件环境和应用场景,因此在关闭THP之前,需要先进行充分的测试和评估。
具体操作
vi /etc/rc.local 在文件末尾添加如下指令: if test -f /sys/kernel/mm/transparent_hugepage/enabled; then echo never > /sys/kernel/mm/transparent_hugepage/enabled fi if test -f /sys/kernel/mm/transparent_hugepage/defrag; then echo never > /sys/kernel/mm/transparent_hugepage/defrag fi [root@master ~]# cat /sys/kernel/mm/transparent_hugepage/enabled always madvise [never] [root@master ~]# cat /sys/kernel/mm/transparent_hugepage/defrag always madvise [never]
网卡绑定
bonding技术,业务数据库服务器都要配置bonding继续。建议是主备模式(mode1),交换机堆叠。
存储多路径
使用独立SAN存储设备的话,需要配置多路径软件:
使用linux 自带多路径或者厂商提供的多路径软件
系统层面参数优化
a. 更改文件句柄和进程数 内核优化 /etc/sysctl.conf vm.swappiness = 5(也可以设置为0) vm.dirty_ratio = 20 vm.dirty_background_ratio = 10 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 b. 防火墙 禁用selinux : /etc/sysconfig/selinux 更改SELINUX=disabled. iptables如果不使用可以关闭。可是需要打开MySQL需要的端口号 c. 文件系统优化 推荐使用XFS文件系统 MySQL数据分区独立 ,例如挂载点为: /data mount参数 defaults, noatime, nodiratime, nobarrier 如/etc/fstab: /dev/sdb /data xfs defaults,noatime,nodiratime,nobarrier 1 2 这个字符串是让系统在启动时自动挂载/dev/sdb分区到/data目录,使用XFS文件系统,并且指定了一些挂载选项:defaults表示使用默认参数,noatime和nodiratime表示禁用文件访问时间的记录以提高性能,nobarrier表示禁用写入缓存以提高性能但也增加了数据丢失的风险。"1 2" 表示在启动时按照顺序挂载,数字代表处理特殊情况的顺序,1表示根目录 "/", 2表示其他需要挂载的文件系统。 d. 不使用LVM 在数据库场景下,使用LVM(逻辑卷管理)作为磁盘管理技术可能会带来一些不必要的问题,如下: 1. 额外的性能开销:LVM需要在磁盘和文件系统之间添加一层逻辑层,这会带来一定的性能开销。 2. 维护复杂度:使用 LVM 会增加磁盘管理的复杂度,诊断问题和维护时也会变得更加困难。 3. 数据丢失风险:LVM 可能会导致磁盘故障期间数据的丢失,而在数据库场景下数据是极其重要的,所以这是一个不可接受的风险。 4. 难以进行最小化部署:数据库服务器通常需要遵循最小化安装的最佳实践,使用 LVM 可能会扩大最终的部署规模。 因此,在数据库场景下,建议使用专用存储解决方案或硬件RAID,以最大程度地降低数据丢失的风险并提高性能。 e. io调度 SAS : deadline SSD&PCI-E: noop centos 7 默认是deadline cat /sys/block/sda/queue/scheduler #临时修改为deadline(centos6) echo deadline >/sys/block/sda/queue/scheduler vi /boot/grub/grub.conf 更改到如下内容:
预装MySQL前硬件烤机压测
stress 进行CPU、IO、MEM烤机压测
a. 安装 yum install -y epel-release yum install -y stress b. 烤机CPU [root@slave1 ~]# stress -c 4 c. 烤机 MEM stress -m 3 --vm-bytes 300M d. 烤机多参数 stress -c 4 -m 2 -d 1
FIO 进行定制化IO烤机压测
FIO 介绍
FIO是测试IOPS的非常好的工具,用来对磁盘进行压力测试和验证。 磁盘IO是检查磁盘性能的重要指标,可以按照负载情况分成照顺序读写,随机读写,混合读写两大类。 FIO是一个可以产生很多线程或进程并执行用户指定的特定类型I/O操作的工具,FIO的典型用途是编写和模拟的I/O负载匹配的作业文件。 FIO是一个多线程io生成工具,可以生成多种IO模式,用来测试磁盘设备的性能(也包含文件系统:如针对网络文件系统 NFS 的IO测试)。 FIO压测可以帮助管理员,提前预知磁盘瓶颈,及时作出扩容建议。也可以作为有效烤机的
FIO压测
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=4k -size=2G -numjobs=64 -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 测试类型.
选用GA版本mysql
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是一个不错的版本选择。向后可以选择双数版。
其他数据库工具
官方工具: workbench mysql-shell 第三方: PXB PT binlog2sql FIO sysbench stress navicat/sqlyog