数据库运维
记录DBA学习成长历程

1.MySQL介绍

文章目录

1. DBA是什么?

DBA(Database Administrator)集合了: SA(System Administrator 系统管理员)、 PD(Product Developer 产品研发)、PM(Product Manager 产品经理)、 CTO(Create Table Officer首席技术官,NoNoNo...., 首席建表官)、FireMan、 银行点钞员、出租车司机。 总之,DBA是偏向于服务型的职业,服务好用户、运维、产品、开发等诸多方面才是正道。

2. DBA 的职业素质

—2.1 素养

人品 严谨 细心 心态

—2.2 能力

熟悉系统 熟悉业务 熟悉行业 喜欢数据库

—2.3 精神

——2.3.1责任心

维护数据库数据的安全和完整是管理员的首要责任。在管理数据库的过程中,作为一个DBA,要把数据库看做自己的财产、 自己的儿女、自己身体的一部分。此种职责,需要你像呵护自己眼睛一样去照顾你所维护的数据库。 时刻去想,有没有做应该有的备份,有没加应该有的监控,有没有做必须的安全权限限制。一旦出问题, 有没有第一时间去分析和解决问题,这就像你的自己的眼睛,一旦出现红肿病态,多少人会视而不见?

——2.3.2 服务心

现代互联网对DB的需求,是需要支撑业务持续稳定的运行和源源不断的变更,这要求DBA有7X24小时的服务精神。 这是一个服务性职业,需要随时随地响应来自各方面的各种需求。其一,人的需求,业务要发展,DB就会有变更, 只有DBA与开发人员紧密配合,才能顺畅高效地完成工作。其二,事的需求,DB是个动态的系统,不断的运转就会不断的面临新问题, 机器故障,磁盘报警,内存不足,CPU过载等等。这是个脆弱的系统,它不会对DBA的迟钝有半点仁慈,一旦有问题,任性的宕机是必然的结果。 其三,心的需求,DBA应该出自内心地主动去对DB做不断的优化,这种优化,可以在结构上,可以在架构上,可以在业务逻辑上, 关键之处在于,你有没有心。说得通俗一点:“没事找事儿”。

——2.3.3 沟通心

DBA的工作,不是封闭的科学研究和孤傲的英雄主义,不管是主动的优化,还是被动的接受任务,都是需要与人做不断的沟通与交流。假如你不懂业务流程,不知道数据的来龙去脉,轻重缓急,那就谈不上数据库表的设计和优化。而数据库的优化,往往最大的进展是来自对业务逻辑的优化。这需要运用良好的沟通心态和技巧,深入了解业务流程和架构。与人沟通,是DBA获取知识和信息的主要途径,需要做到能与人沟通和会与人沟通。生活工作中,人的个性是千差万别的,面对形形色色的沟通对象,充分调动对方的积极性,进行愉快有效的交流也是DBA需要掌握的一门技术。

——2.3.4 学习心

DB在技术体系中是一个承上启下的中间环节,它运行在物理硬件和操作系统之上,同时承载着上层各种各样的业务逻辑的调用。对DB的运维和管理,不仅仅需要掌握数据库自身的基础知识,要保证这个系统的稳定和优化,就需要知己知彼,去了解它上下游的知识和特性。所以,一个优秀的DBA,需要了解你所使用的硬件,这包括磁盘的特性,网络的布局,内存的使用,CPU的处理能力等等;需要了解DB所运行的操作系统的知识,它是怎么调度IO的,怎么管理内存的,怎么优化文件的;需要了解上层业务是怎么调用数据库的,SQL怎么写的,看懂了业务逻辑的程序才能明白有的SQL是不是多余,某些SQL是不是可以优化。我们看到在MySQL官方和MariaDB官方,都已经针对硬件开始在官方源码的基础上做自动优化了,同时MySQL官方也提供了自己的集成于业务端的高可用方案,这都是开源数据库进步发展的必然结果。同时,由于开源数据库的盛行,针对数据库自身代码的学习和研究,也逐渐成为优秀DBA的必修课了。

——2.3.5 进取心

随时发现问题,分析问题,解决问题。通过问题现象,依赖自己的经验和知识,同时探索未知的知识去解决现实的问题,在这个过程中,也是自己积累经验和不断成长的过程。相对而言,解决问题本身并不重要,重要的是在此过程中探求解决问题的方法和所获取的经验,DBA的职业优势也在于此,同时,主动花费心思与精力去不断追求问题的优解和技术的极致,也是DBA应尽的职责。

——2.3.6 分享心

这些年,我们一直在倡导做一件事情,那就是提倡DBA在开源社区持续做技术分享。通过分享,大家学到了技术、开拓了视野、展开了思路,当然也交到了朋友。我们希望能通过这样的活动,把DBA精神永续下去,让更多人受益,让更多DBA技术普及。

3. 数据库行业现状

—3.1 大环境

随着互联网行业的持续升温,高级IT人才缺口持续拉大。特别是数据库行业,由第二代数据库产品到第三代数据产品更替的转折点,行业中对于数据库DBA的技术能力要求持续升高。

由于DBA从业工作者,受到各方面技术的冲击。例如:DevOps,AIOps等平台化、自动化;以及云服务的大量出现。使得初、中级DBA已不再具备行业竞争力,将会面临着大批量失去企业核心竞争力现象。

因此,本课程项目(DBA专家班)就是为了解决,未来行业更加需要的DBA高端人才而诞生。

—3.2 数据库产品演进

第一代数据库架构产品:传统的关系型数据库主导。

第二代数据库架构产品:传统关系型数据库+NoSQL多厂家产品配合使用。

第三代数据库架构产品:NewSQL(关系型+NoSQL+大数据+分布式架构完整解决方案)

—3.3 课程优势

本课程项目,由多年DBA专家主导开展。讲师具备多项技术相关,世界级高级认证:IBM、Oracle、MySQL等。并具备10年以上大厂DBA实战经验。并积累了大量的企业级客户:供应商、解决方案商、多家银行、金融类公司、互联网公司等资源。

4. 主流数据库产品介绍

RDBMS:Oracle,MySQL,PG,MSSQL,DB2,SQLLite

NoSQL:MongoDB,Redis,ElasticSearch,Cassandra,Neo4j,Solr

NewSQL: Google Spanner,PinCAP TiDB

云数据库:Aliyun RDS ,DRDS,PolarDB 腾讯云 TDSQL

5. MySQL产品历史

6.MySQL企业版本选择

准备安装MySQL时,请确定要使用哪个版本和发行格式(二进制或源码)。

首先,决定要安装开发版本还是通用版本(GA)。开发版本具有最新功能,但不建议用于生产环境。

GA版本(也称为生产版本或稳定版本)是供生产使用的。选择小版本号20以上的双数版,一般使用GA版本(6-12月)。新上业务选8.x版本,现有业务5.7版本升级最新双数版。

7. MySQL8.0版本新特性简介

https://dev.mysql.com/doc/refman/8.0/en/mysql-nutshell.html

https://dev.mysql.com/doc/refman/8.0/en/added-deprecated-removed.html

8. MySQL 8.0源码结构前瞻

https://dev.mysql.com/doc/dev/mysql-server/latest/

9.生产MySQL系统预装准备

—9.1 硬件标准化

——9.1.1 标准化数据库专用服务器

帮助公司和运维团队,选择最合适MySQL数据库运行的服务器硬件,从品牌、CPU、MEM、IO设备、网络设备、存储设备等各个层次进行合理建议.而不是上采购人员、商务人员或根本不懂数据库的人员制定服务器标准。杜绝类似:内存小了、磁盘没法用、不符合最低3-5年扩展性硬件等此类问题出现。

建议CPU:MEM=1:2+
低配需求:8C:32G   500以内连接数,QPS在500以内,TPS在100左右
标配:16C:64G+   1000以内连接数,QPS在500-1000,TPS在100-200
高配:64C:256G

——9.1.2 标准化服务器硬件带来的收益

出现业务系统故障或性能问题。可以让排错或者优化时间大大缩减。帮助管理员可以快速根据基准值结合经验,定位瓶颈问题。

—9.2 操作系统及配置标准化

——9.2.1 标准化数据库操作系统

目前,互联网企业广泛应用centos系列操作系统。并且在同一组集群架构的服务器系统都保持系统和内核版本一致。

——9.2.2 标准化数据库稳定系统

目前采用Centos7.2以上双数版。并且安装同版本光盘稳定兼容较好的软件包。

——9.2.3 标准化操作系统及硬件参数

———9.2.3.1 关闭NUMA

对于CPU每一个内核绑定独立一块内存,默认打开,MySQL有独立的内内存管理极致,所以需要关掉。

bios级别:

在bios层面numa关闭时,无论os层面的numa是否打开,都不会影响性能。
# numactl --hardware
available: 1 nodes (0)    #如果是2或多个nodes就说明numa没关掉

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=offinitrd 
/boot/initrd-2.6.18-128.1.16.0.1.el5.img

在os层numa关闭时,打开bios层的numa会影响性能,QPS会下降15-30%;

数据库级别:

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" --pid
file="$mysqld_pid_file_path" $other_args >/dev/null &
wait_for_pid created "$!" "$mysqld_pid_file_path"; return_value=$?

———9.2.3.2 开启CPU高性能模式

———9.2.3.3 阵列卡RAID配置

raid10(推荐)
SAS  SSD、PCI-E、Flash
T+1 业务: 报表 分析 备份...

———9.2.3.4 关闭THP

centos6以后增加的功能,分配大的内存页导致无法使用,超出最大内存分配上限,会导致OOM。有独立内存管理机制的应用都要关闭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@db01 ~]# cat /sys/kernel/mm/transparent_hugepage/enabled
[always] madvise never
[root@db01 ~]# echo never> /sys/kernel/mm/transparent_hugepage/enabled
[root@db01 ~]# cat /sys/kernel/mm/transparent_hugepage/enabled
always madvise [never]
[root@db01 ~]#  cat /sys/kernel/mm/transparent_hugepage/defrag
[always] madvise never
[root@db01 ~]# echo never> /sys/kernel/mm/transparent_hugepage/defrag
[root@db01 ~]#  cat /sys/kernel/mm/transparent_hugepage/defrag
always madvise [never]

———9.2.3.5 网卡绑定

bonding技术,业务数据库服务器都要配置bonding继续。建议是主备模式。

交换机一定要堆叠。

———9.2.3.6 存储多路径

使用独立存储设备的话,需要配置多路径:

linux 自带

厂商提供

———9.2.3.7 系统层面参数优化

更改文件句柄和进程数

内核优化 vim /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
========================================
文件句柄 vim /etc/security/limits.conf
root nofile hard 65535
root nofile soft 65535
* nofile hard 65535
* nofile soft 65535
========================================
[root@db01 ~]# cat /proc/sys/vm/swappiness
30

云数据库MySQL一般不启用swap。PG和Oracle都要启用swap,一般4G物理内存,
设置为3-6G,一般设置为和物理内存一样大。
========================================
控制后台脏页刷新的比例(百分比)
vm.dirty_ratio = 20 同步刷新
vm.dirty_background_ratio = 10 异步刷新

防火墙

禁用selinux : /etc/sysconfig/selinux 更改SELINUX=disabled.
iptables如果不使用可以关闭。可是需要打开MySQL需要的端口号

文件系统优化

推荐使用XFS文件系统
MySQL数据分区独立 ,例如挂载点为: /data
永久生效:
mount参数:defaults, noatime, nodiratime, nobarrier 如/etc/fstab:
[root@db01 ~]# blkid
/dev/sdb: UUID="3b8309c5-a971-489e-9533-d47846b61f22" TYPE="xfs"
vim /etc/fstab
UUID=3b8309c5-a971-489e-9533-d47846b61f22 /data =xfs    defaults,noatime,nodiratime,nobarrier   1   2

手动挂载(临时生效):
[root@db01 ~]# fdisk -l 查看新盘
[root@db01 ~]# mkfs.xfs /dev/sdb 格式化新盘
[root@db01 ~]# mkdir -p /data 创建挂载点
[root@db01 ~]# mount -o noatime,nodiratime /dev/sdb /data 挂载成功

不使用LVM

io调度

SAS : deadline(最后期限模式)
SSD&PCI-E: noop (电梯模式)
临时修改:
#SAS盘为deadline(centos6) ;SSD&PCI-E盘为&PCI-E
[root@db01 ~]# cat /sys/block/sdb/queue/scheduler
noop [deadline] cfq
echo deadline >/sys/block/sdb/queue/scheduler
永久修改:
vi /boot/grub2/grub.cfg
更改到如下内容:
kernel /boot/vmlinuz-2.6.18-8.el5 ro root=LABEL=/ elevator=deadline rhgb quiet

———9.2.3.8 xshell工具ssh连接优化

[root@db01 ~]# vim /etc/ssh/sshd_config
UseDNS no

—9.3 预装MySQL前硬件烤机压测

——9.3.1 stress 进行CPU、MEM烤机压测

安装
yum install -y epel-release
yum install -y stress
烤机CPU
[root@slave1 ~]# stress -c 1
烤机 MEM
stress -m 3 --vm-bytes 300M
烤机多参数
stress -c 4 -m 2 -d 1

——9.3.2 FIO 进行定制化IO烤机压测

———9.3.2.1 FIO介绍

IO评估有三个指标:吞吐量(m/s),IOPS(磁盘每秒发生IO次数),LA(CPU花在调度上的延时)。

IO指in(磁盘写向内存算一次IO)和out(内存写向磁盘算一次IO)

FIO是测试IOPS的非常好的工具,用来对磁盘进行压力测试和验证。

磁盘IO是检查磁盘性能的重要指标,可以按照负载情况分成照顺序读写,随机读写,混合读写两大类。

FIO是一个可以产生很多线程或进程并执行用户指定的特定类型I/O操作的工具,FIO的典型用途是编写

和模拟的I/O负载匹配的作业文件。

FIO是一个多线程io生成工具,可以生成多种IO模式,用来测试磁盘设备的性能(也包含文件系统:如针

对网络文件系统 NFS 的IO测试)。

FIO压测可以帮助管理员,提前预知磁盘瓶颈,及时作出扩容建议。也可以作为有效烤机的

———9.3.2.2 FIO应用

环境准备

mkdir -p /data
mkfs.xfs  /dev/sdb
mount /dev/sdb  /data
生成大文件
[root@db01 ~]# dd if=/dev/zero of=/data/test bs=16k count=128000
128000+0 records in
128000+0 records out
2097152000 bytes (2.1 GB) copied, 1.82159 s, 1.2 GB/s

安装

yum install libaio libaio-devel fio

各类压测

建议numjobs参数为逻辑CPU个数
# 测试随机写:
fio --filename=/data/test --iodepth=4 --ioengine=libaio -direct=1 
--rw=randwrite --bs=16k --size=1G --numjobs=64 --runtime=20 
--group_reporting -- name=test-rand-write

# 测试顺序读取:

fio --filename=/data/test -iodepth=64 -ioengine=libaio --direct=1 --rw=read --
bs=1m --size=1g --numjobs=4 --runtime=10 --group_reporting --name=test-read

# 测试顺序写性能

fio --filename=/data/test.big -iodepth=64 -ioengine=libaio -direct=1 -rw=write
-bs=1m -size=2g -numjobs=2 -runtime=20 --group_reporting -name=test-write

测试随机读:

fio --filename=/data/test -iodepth=64 -ioengine=libaio -direct=1 -rw=randread -
bs=4k -size=2G -numjobs=2 -runtime=20 --group_reporting -name=test-rand-read

——9.3.3 企业应用:16k,70%读取,30%写入:

随机:
fio --filename=/data/test --direct=1 --rw=randrw --ioengine=libaio --bs=16k 
--rwmixread=70 --iodepth=16 --numjobs=1 --runtime=60 --group_reporting --name=73test
read: IOPS=13.1k, BW=204MiB/s (214MB/s)(1401MiB/6852msec)
write: IOPS=5594, BW=87.4MiB/s (91.7MB/s)(599MiB/6852msec)

顺序:
fio --filename=/data/test --direct=1 --rw=rw --ioengine=libaio --bs=16k 
--rwmixread=70 --iodepth=16 --numjobs=1 --runtime=60 --group_reporting 
--name=73test
read: IOPS=13.3k, BW=208MiB/s (218MB/s)(1401MiB/6731msec)
write: IOPS=5695, BW=88.0MiB/s (93.3MB/s)(599MiB/6731msec)

# 重要参数解读:
--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 测试类型.

——9.3.4 总结

stress压测:连续压测15-30天,观察系统日志,评估CPU、MEM、整机等是否稳定。

FIO压测:主要评估IOPS、吞吐量进行各维度统计。

—9.4 数据库软件标准化

——9.4.1 版本

1、稳定版:选择开源的社区版的稳定版GA版本。

2、选择mysql数据库GA版本发布后6个月-12个月的GA双数版本,大约在15-20个小版本左右。

3、要选择前后几个月没有大的BUG修复的版本,而不是大量修复BUG的集中版本。

4、要考虑开发人员开发程序使用的版本是否兼容你选的版本。

5、作为内部开发测试数据库环境,跑大概3-6个月的时间。

6、优先企业非核心业务采用新版本的数据库GA版本软件。

7、向DBA高手请教,或者在技术氛围好的群里和大家一起交流,使用真正的高手们用过的好用的GA版本产品。

最终建议: 8.0.24是一个不错的版本选择。向后可以选择双数版。

5.7.34+

8.0.24+

——9.4.2 插件及工具

官方工具:
workbench
mysql-shell

第三方:
PXB
PT
binlog2sql my2sql myflash
FIO
sysbench
stress
jmeter
navicat/sqlyog

 

赞(1)
MySQL学习笔记 » 1.MySQL介绍