DBA专栏
01-MySQL基础入门
02-MySQL基础入门-部署与管理体系
03-MySQL-基础入门-用户与权限
04-MySQL基础入门-索引
相信可能就有无限可能
-
+
首页
01-MySQL基础入门
## 1.MySQL数据库简介 ### 1.1.什么是数据库 ?什么是HTAP? 数据库管理系统(Database Management System) ```shell 本质:管理数据的大型软件 功能: 解决不同应用的数据存储问题 易于使用和维护 保证数据安全与完整 多个Server端连接支持 实现自定义schema与约束 提供数据定义DDL,数据操作等语言DML,实现增删改查 ``` ![](/media/202403/2024-03-15_094322_3761160.8193165679266652.png) 什么是OLTP? ```shell #1.定义 OLTP(on-line transaction processing)翻译为联机事务处理,保证业务快速响应与支 持,数据库与业务直接高性能低延时并发交互操作(一秒钟几千个用户分别存钱,取钱).这个直接 存储与业务直接相关的数据库,叫做OLTP型数据库,服务在线业务。 #2.数据本质 为业务数据服务:产品使用在前端交互产生两种数据: - 行为数据:行为数据指点击,滑动等操作,也称为埋点数据. - 业务数据:业务数据是在行为数据之后产生的与产品结果挂钩的数据,比如最终下单,存1W块到账号等数据. #3.功能核心 - 实时性强,稳定性强:数据库与业务直接高性能低延时并发交互操作 - 保证交易的完整性 - 主要是对数据的增删改 ``` 什么是OLAP? ```shell #1.定义 OLAP是做分析处理,当数据积累到一定的程度,需要对历史做一个总结分析时,就需要把过去一 段时间内产生的数据拿出来进行统计分析,从中获取我们想要的信息,为公司做决策提供支持. 从对数据库操作来看,OLAP是对数据的查询. #2.本质 为业务数据服务:产品使用在前端交互产生两种数据: - 行为数据:行为数据指点击,滑动等操作,也称为埋点数据. - 业务数据:业务数据是在行为数据之后产生的与产品结果挂钩的数据,比如最终下单,存1W块到账号等数据. #3.功能核心 - 大数据量级的分析,低并发,高延时 - 需要将不同业务数据清洗后再数据仓库统一分析 - 主要是对数据的查询 - OLAP依赖于OLTP,让OLTP产生的数据发现价值的过程 ``` OLTP 和 OLAP 从不同维度之间的对比关系如下所示: | 对比维度 | OLTP | OLAP | | -------------------- | ------------------------------------------------------------ | ------------------------------------------------------------ | | 一句话特征 | 小事务众多的场景 | 使用复杂查询来处理较大数据量的场景 | | ACID | 强 | 弱 | | 面向用户 | 数据库操作人员 | 决策人员、高级管理人员,数据库科学家、业务分析师和知识工作者 | | 使用场景 | 金融(如银行、股票)、电商、旅行预订等 | 商业智能(BI)、数据挖掘和气压决策支持应用程序 | | 基本操作 | 主要为:insert, update, delete为主 | 主要为聚合操作,窗口操作等为主 | | 操作数据范围 | 通常读写数据量较小(数十条记录) | 通常读写数据量大(数百万条记录) | | 主要衡量指标 | 事务吞吐量(TPS) | 查询响应速度(QPS) | | 响应时间要求 | 实时性要求高,通常毫秒级 | 实时性要求低,依赖于所处理的数据量,时间范围由小时,分钟秒级,亚秒级等 | | 数据源 | 业务系统实时事务数据 | 业务系统中的历史数据,事务型数据 | | 数据库表设计规范 | 通常需要满足三范式(3NF) | 不作规范 | | 数据量/磁盘空间 | 较小,MB~TB级 | 较大,GB~PB级 | | 并发量 | 需要支持大并发环境 | 对并发量要求不高 | | 稳定性 | 要求高 | 要求高 | | 可用性(备份,恢复) | 完整的备份,恢复能力(全量,增量) | 主要按时间点进行备份/恢复,备份/恢复要求不高 | | 数据完整性要求 | 强一致性要求 | 数据完整性要求不高 | | 系统吞吐量,IOPS | 低 | 高 | | 挑战 | 1.高吞吐量,保证数据完整性,可靠性等;2.完整的生态工具,不同异构产品间协调使用难度; | 1.海量数据高效,低成本的数据存储;2.复杂查询高效处理; | | 可靠性要求 | 通常要求高可靠性:主备、同城灾备、异地灾备 | 可靠性要求相对低,一般同城灾备 | | 读特性 | 简单查询为主、每次查询只返回少量数据 | 复杂查询为主、对大量数据进行汇总 | | 写特性 | 1.随机、低延迟、小数据量;2.数据更新、删除频繁 | 1.很少有更新、删除操作;2.大数据量批量、并行导入 | | 数据模型 | ER(实体、关系) | 星型或者雪花、星座 | | 数据粒度 | 行级 record | 多表 | | 数据结构 | 高度结构化、复杂,适合操作计算 | 简单、适合分析 | | 数据字段 | 动态变化,按字段更新 | 静态、很少直接更新,定时添加、刷新 | | 数据返回值 | 一般为记录本身或该记录的多个列 | 一般为聚合计算结果 | 随着时间的推移,越来越多的业务对于 AP 的要求越来越向着 TP 的指标看齐,例如:要求 AP 系统能够实时反映出当前 TP 系统中的实际数据。同时,AP 系统可以支持数据的更新等等。总之,TP 系统和 AP 系统之间的边界在业务层面和用户层面上也越来越模糊,市场上迫切希望能够出现一种新的架构或者称之为者解决方案,能够同时满足业务对于 TP 负载和 AP 负载的需求。因此,HTAP 的概念随之而诞生。2014年 Gartner 给出了 HTAP 的明确概念:Systems that can support both OLTP (On-line transaction processing) as well as OLAP (on-line analytics processing) within a single transaction. ### 1.2.为什么学习MySQL?MySQL的产品迭代 - 为什么学习MySQL - 国内市场占有率最高80%,去IOE趋势明显 - OLTP场景是公司发展的根基,所有业务为此场景服务 - 一二线的大厂DBA1+1配置模式 - MySQL的产品迭代 ![](/media/202403/2024-03-15_100855_4128290.13323872715636342.png) ![](/media/202403/2024-03-15_101034_3990120.6152760827129717.png) ### 1.3.一二线大厂主流版本选择 **企业生产环境一般要过20个小版本后才会进行评测阶段** MySQL: ```shell 版本选择 - 5.7版本 - 5.7.20之后的版本 - 8.0版本 - 8.0.20开始评测 安装方式: - 一线大厂:源码功能修改与编译(百度) - 二线(58,陌陌):tar.gz方式,方便做打包的生产标准MySQL包管理 ``` ### 1.4.MySQL 服务管理-systemd 和Surpviser mysql服务器demon进程管理工具。 ### 1.5.MySQL的权限管理 ```shell (1)mysql部署依赖的系统用户权限 root:system mysql命令 mysql:mysql系统用户:/data/ /log 数据安全 (2)mysql访问用户,create user。 数据库权限非常重要:一般业务需求:select(主,从),delete、update、insert(主库)足以。 千万,千万不要给业务root用户,DBA 用 root???不要。 root用户管理:权限只限于127.0.0.1/localhost。登录mysql主机才能操作。 dbadmin:all,ddl+dml+select replica 用户:replica slave,replica client,切记权限扩大化 权限IP限制?dbadmin@·%·?DB服务器开放了外网,撞库风险。权限管理平台,可以定到10.10.10.10,10.10.10.%,10.10.%。千万不要%? 企业办公网访问?建议禁止,提供sql查询平台解决,跳转堡垒机进行访问。 ``` ### 1.6.MySQL的数据类型:够用即可 - 数值类型:tinyint (-128~127),int (+-21亿),bigint() - 字符串类型:char, varchar(200) varchar(50) text 64K,行存:name ,age ,department,comment text select name,age where 怎么办? 拆表:基本信息表:id,user-no,name,age user-extend id,user-no,comment 定律:能用varchar(10000),也不要用text。 - 时间:date、datetime,timestamp timestamp玩法: (1)存的值固定,时区不同,显示不同 (2)长度4字节 (3)update-time timestamp not null default current-timestamp on update current-timestamp; 业务:1、update name update time;有了上面方式,只更新要更新的内容,update-time自动更新。 datetime 1970之前,2038年之后,就用它。8字节够用。 注意点:千万不用用varchar存储时间varchar(255),时间范围查询,很慢!!!! - 枚举:建议tinyint替换枚举,提前想好所有的枚举值,否则增加枚举值就是全表的数据拷贝ddl变更。 - blob:二进制,有压缩。存储图片。 - 浮点数:flolt:非精度类型(四舍五入),decimal(20,10)精确类型 #### 1.6.1 VARCHAR(10) 10的含义 **查询字符串的长度** ```sql create DATABASE test; use test; CREATE TABLE t_1(a VARCHAR(10)); INSERT INTO t_1 VALUES('12345678'); insert into t_1 values('一二三四五六七八'); SELECT * FROM t_1; SELECT a,LENGTH(a),CHAR_LENGTH(a) FROM t_1; INSERT INTO t_1 VALUES(12345678902); mysql> create DATABASE test; Query OK, 1 row affected (0.02 sec) mysql> use test; Database changed mysql> CREATE TABLE t_1(a VARCHAR(10)); Query OK, 0 rows affected (0.04 sec) mysql> INSERT INTO t_1 VALUES('12345678'); Query OK, 1 row affected (0.02 sec) mysql> insert into t_1 values('一二三四五六七八'); Query OK, 1 row affected (0.03 sec) mysql> SELECT * FROM t_1; +------------------+ | a | +------------------+ | 12345678 | | 一二三四五六七八 | +------------------+ 2 rows in set (0.06 sec) mysql> SELECT a,LENGTH(a),CHAR_LENGTH(a) FROM t_1; +------------------+-----------+----------------+ | a | LENGTH(a) | CHAR_LENGTH(a) | +------------------+-----------+----------------+ | 12345678 | 8 | 8 | | 一二三四五六七八 | 24 | 8 | +------------------+-----------+----------------+ 2 rows in set (0.06 sec) # 解释: # LENGTH() 函数返回字符串中的字节数;它适用于所有类型的字符串,包括二进制数据。 # CHAR_LENGTH() 函数返回字符串中的字符数;它只适用于字符数据,不包括二进制数据。 # 在处理多字节字符集(如UTF-8)时,CHAR_LENGTH() 通常比 LENGTH() 更适用,因为它可以准确地告诉我们字符串中有多少个字符,而不是字节。 ``` **超出字符数** ```sql mysql> INSERT INTO t_1 VALUES('12345678902'); 1406 - Data too long for column 'a' at row 1 ``` ![image-20240312133946662](https://img.sunrisenan.com/img/2024/03/12/133949384.png) ```sql mysql> set global sql_mode='NO_ENGINE_SUBSTITUTION'; Query OK, 0 rows affected (0.02 sec) # 重新连接会话 mysql> INSERT INTO t_1 VALUES('12345678902'); Query OK, 1 row affected (0.49 sec) mysql> show warnings; +---------+------+----------------------------------------+ | Level | Code | Message | +---------+------+----------------------------------------+ | Warning | 1265 | Data truncated for column 'a' at row 1 | +---------+------+----------------------------------------+ 1 row in set (0.04 sec) mysql> SELECT a,LENGTH(a),CHAR_LENGTH(a) FROM t_1; +------------------+-----------+----------------+ | a | LENGTH(a) | CHAR_LENGTH(a) | +------------------+-----------+----------------+ | 12345678 | 8 | 8 | | 一二三四五六七八 | 24 | 8 | | 1234567890 | 10 | 10 | +------------------+-----------+----------------+ 3 rows in set (0.05 sec) ``` #### 1.6.2 DATETIME和TIMESTAMP ``` 在MySQL中,DATETIME类型和TIMESTAMP类型在存储和性能方面有一些差异。以下是一些关键点: 1. 存储大小: - DATETIME:通常需要8字节(64位)存储空间,用于存储日期和时间值。 - TIMESTAMP:在大多数情况下,使用4字节(32位)存储空间,但在某些情况下(如MySQL 5.6.4及以后版本中,如果使用的是4字节的UNSIGNED BIGINT作为TIMESTAMP的存储类型)也可能需要8字节。 2. 范围: - DATETIME:可以表示从'1000-01-01'到'9999-12-31'的日期范围,以及从'00:00:00'到'23:59:59'的时间范围。 - TIMESTAMP:可以表示从'1970-01-01 00:00:01' UTC到'2038-01-19 03:14:07' UTC的日期和时间范围。 3. 时区: - DATETIME:不具有时区信息,它表示的是UTC时间,但实际上存储的是一个与服务器时区相关的本地时间。 - TIMESTAMP:可以存储时区信息,这使得它能够在不同时区之间进行转换。 4. 性能: - 在大多数查询操作中,DATETIME和TIMESTAMP的性能差异可以忽略不计。两者在索引和查询优化方面通常被处理得差不多。 - 在某些情况下,TIMESTAMP可能会有一些性能优势,因为它可以存储为更小的数据类型(4字节),并且在某些操作(如时间戳运算)中可能更快。 5. 功能性: - DATETIME:提供了更多的日期和时间函数支持,如日期格式化、时间戳运算等。 - TIMESTAMP:在某些情况下,如自动时间戳、跨时区数据同步等,可能更有优势。 总的来说,选择DATETIME还是TIMESTAMP主要取决于你的具体需求,包括你需要表示的日期时间范围、是否需要时区信息、以及你对日期时间函数的支持需求。在大多数情况下,性能差异不会是选择的主要因素。如果你需要更大的日期时间范围和更丰富的日期时间功能,选择DATETIME。如果你需要处理时区或者更小的存储空间,选择TIMESTAMP。 ``` ### 1.7.MySQL日志介绍 - innodb日志:redo(事务流程、MVCC),undo(功能、不同版本undo特性) - server日志:binlog(复制,格式),errorlog(排查问题必备,有时需要ELK)、general log(审计日志,跟slow log结合优化优先级,问题排查),slow log(30% sql 优化,重要数据来源,pt-query-digest,sql advise,web页面+慢SQL报表)。 ### 1.8.mysql 5.7新特性 https://dev.mysql.com/doc/refman/5.7/en/mysql-nutshell.html (1)数据库安全 引入ALTER USER命令,可用来修改用户密码,密码的过期策略,及锁定用户等 表空间加密 mysql.user表中存储密码的字段从password修改为authentication_string (2)复制 MGR、多源复制、增强半同步(AFTER_SYNC)、基于WRITESET的并行复制、在线开启GTID复制、在线设置复制过滤规则 (3)innodb UNDO表空间的自动回收,InnoDB原生支持分区表,在此之前,是通过ha_partition接口来实现的,引入了innodb_deadlock_detect选项,在高并发场景下,可使用该选项来关闭死锁检测 (4)系统表 优化了Performance Schema,其内存使用减少,集成了SYS数据库,简化了MySQL的管理及异常问题的定位, (5)操作性 可设置SELECT操作的超时时长(max_execution_time) 在线修改Buffer pool的大小 引入了查询改写插件(Query Rewrite Plugin),可在服务端对查询进行改写 mysql_install_db被mysqld --initialize代替,用来进行实例的初始化 可通过SHUTDOWN命令关闭MySQL实例 看阿里的数据库内核月报: https://www.bookstack.cn/read/aliyun-rds-core/fa26cd1629beddd8.md https://www.bookstack.cn/read/aliyun-rds-core/eb37d1fcc2b4ce76.md https://www.bookstack.cn/read/aliyun-rds-core/a3a0f1d936417434.md https://www.bookstack.cn/read/aliyun-rds-core/615266555fb07b04.md ### 1.9.mysql 8.0新特性 https://dev.mysql.com/doc/refman/8.0/en/mysql-nutshell.html 1、新增降序索引 order by A asc,B asc; order by A desc,B desc; order by A asc,B desc; 2、隐式索引 10个索引,索引优化,合并,干掉。drop index 秒。后果??业务force index,月度跑,年度跑SQL,周跑,1天generl log。 ALTER TABLE t ALTER INDEX i INVISIBLE; 3、全局参数持久化 修改配置动态生效,100-》500,vim my。cnf;过了,主库切了。 SET PERSIST max_connections = 500; auto-cnf 4、字符集默认:Latin1->utf8mb4 5、系统表引擎:MyISAM->INnodb 6、DDL原子化,在MySQL 8.0之前,DDL操作是非原子型操作,在执行过程中遇到实例故障重启,可能导 致DDL没有完成也没有回滚。 7、安全:身份认证方式由以前的mysql_native_password改为caching_sha2_password(就算同样的密码,加密后显示也不一样) 8、binlog保留时间:由expire_logs_days->binlog_expire_logs_seconds 9、关闭查询缓存。 10、MGR优化 11、JSON、GIS加强 ## 2.数据库起不来的问题或常见数据库起不来异常处理 1.权限问题 mysql安装时用的root用户,启动时用的mysql用户,目录或者文件的操作权限不够导致的启动问题。 相关提示或者日志报错: 日志中提示:Permission denied ```sql 解决方案:赋权,需要提前建立mysql实例的启动用户,这里用mysql系统用户来举例 chown -R mysql:mysql $basedir/mysql_$port chown -R mysql:mysql $datadir/mysql_data_$port chown -R mysql:mysql $logdir/mysql_logerr_$port chown -R mysql:mysql $slowdir/mysql_slow_$port chown -R mysql:mysql $tmpdir/mysql_tmp_$port chown -R mysql:mysql $binlogdir/mysql_logbin_$port chown -R mysql:mysql $socket-dir/mysql_$port.sock chown -R mysql:mysql $pid-dir/mysql_$port.pid ``` 2.端口已经存在 安装mysql前,一定要查看操作系统环境,启动时查看端口是否已经启动,单机多实例或者忘记修改端口导致。 ```sql 相关日志: [ERROR] Can't start server: Bind on TCP/IP port: Address already in use [ERROR] Do you already have another mysqld server running on port: 3306 ? [ERROR] Aborting 解决问题: 查看当前mysql实例启动情况:ps -ef|grep mysql netstat -tlpn|grep mysql 下线或者修改my.cnf为其他端口 ``` 3.之前机器上已经安装mysql并下线,数据目录忘记删除 ```sql 解决方法:如果确实是已经下线的mysql实例,为了避免误删除,可以 mv 到一个trash目录,另外就是直接删除;对于服务器复用的情况,建议重装OS。 ``` 4、参数配置问题 ```sql (1)安装的高版本,配置文件还是基于低版本修改,对于已经删除或者废弃的参数不调整的话,也会导致启动失败 (2)配置文件参数配置过大:比如配置了超过实际内存的innodb-buffer-pool-size。 报错:[ERROR] InnoDB: Cannot allocate memory for the buffer pool ``` 5、硬盘问题 ```sql (1)磁盘坏道,SSD读写寿命已到,你会发现都 cd 不到数据目录。 解决方案: innodb_force_recovery 0~6 及时切换主或者从库,加强硬件使用监控。 (2)磁盘满了,也是导致启动不起来的的原因。 ``` 6、误删数据 ```sql 比如不小心删除了共享表空间ibdata或者binlog文件等。 解决方案:一定要有主从+备份等可用性架构配置,就算误删除了系统文件,也是有备份可恢复,或者从库可以切。 如果真的只有一个单实例,对于ibdata被删的情况,可以通过拷贝所有表的idb的方式恢复。 ``` 7、Linux有个强制访问控制选项(Seliunx)导致mysql无法启动。 ```sql 一般mysql都会修改默认的各种目录配置,修改配置跟Selinux冲突导致的启动问题 解决问题:sestatus查看SElinux的状态,setenforce 0关闭即可。 ``` 8.基于二进制安装,系统上缺少mysql的依赖文件而无法启动 ```sql yum -y install libaio yum -y install numactl ``` 9、mysql空实例,因为没有初始化而无法启动。 ```sql 日志提示:can't open the mysql.plugin table ,please run mysql_upgrade to create it 解决方案:./mysql_install_db —user=mysql —datadir=$datadir/mysql_data_$port —basedir=$basedir/mysql_$port ``` ## 3.了解MySQL对cup、内存、io子系统资源利用特点 **数据库调优之硬件** 各种数据库官方都有硬件有一定要求,本文就比较普惠的告诉大家为啥要这样设置,以及不同的设置有啥不同。首先硬件都在适配操作系统的,数据库是安装在操作系统之上。不同的分布式数据库对于软件和硬件都有一些推荐配置。比如TiDB在Linux平台推荐CentOS 7.3+版本,并且如果要运行生产环境的集群,TiDB/PD/TiKV等组件都有最低的CPU、内存、硬盘、网卡要求。本文在满足这些需求的基础上,探讨下硬件参数优化。 ### 3.1.CPU 先从CPU聊起 CPU选型 可以分为计算型和存储型。计算型往往需要更多的CPU核心和更高的主频。存储型的CPU可能就配置稍微低些。对于计算型和存储型CPU选择,拿数据库服务器来说,大家可以从TiDB server(计算)和TiKV(存储)使用的CPU来区分,提前规划的目的是为了硬件采购更加合理,节省成本。 CPU架构:X86/ARM X86架构出现在intel/AMD的CPU架构中,采用复杂指令集,也是目前最主流服务器的CPU架构。ARM架构CPU在手机,mac笔记本,以及华为等国产服务器厂商中出现。目前各大公司主要采购的是X86-64架构的CPU,也对ARM服务器进行了web和数据库应用的验证,对于全球缺“芯”的现实来说,ARM CPU未来可期,大家有时间有资源的时候可以测测mysql/redis/tidb等数据库在ARM服务器上的表现。 Numa绑核 现在针对多核心CPU,每个CPU都有自己专属/本地的mem,当然访问本地的mem比其跨NUMA访问内存来的更快,开启NUMA会优先就近使用内存,在本NUMA上的内存不够的时候默认是到其它NUMA上分配内存,也就是跟关闭NUMA是一样的。所以在单机多数据库部署时推荐配置。 CPU-动态节能技术 cpufreq 是一个动态调整 CPU 频率的模块,可支持五种模式。为保证服务性能应选用 performance 模式,将 CPU 频率固定工作在其支持的最高运行频率上,从而获取最佳的性能,一般都是默认powersave,可以通过 cpupower frequency-set修改。 ### 3.2.Memory 关闭Swap 大家都知道Swap是用硬盘来承接到达一定阀值的内存访问,由vm.swappiness 参数控制,默认 60,也就是系统内存使用到40%时开始使用swap,TiDB 运行需要有足够的内存。如果内存不足,不建议使用 swap 作为内存不足的缓冲,因为这会降低性能。建议永久关闭系统 swap。 min_free_kbytes 该内核参数控制了多少内存应该保持空闲而不被文件系统缓存占用。通常情况下,内核会用文件系统缓存占据几乎所有的空闲内存,并根据需要释放内存供进程分配。由于数据库会共享内存中执行大量的分配,默认的内核值可能会导致意外的OOM(Out-of-Memory kill),在mem>40G的情况下,建议将该参数配置为至少1GB,但是不建议超过总内存的5%,这可以确保Linux始终保持足够的内存可用。 关闭透明大页(即 Transparent Huge Pages,缩写为 THP) 数据库的内存访问模式往往是稀疏的而非连续的。当高阶内存碎片化比较严重时,分配 THP 页面会出现较高的延迟,若开启针对 THP 的直接内存规整功能,也会出现系统 CPU 使用率激增的现象,因此建议关闭 THP。 虚拟内存dirty_ratio/dirty_background_ratio参数 dirty_ratio 绝对的脏页百分比值限限制。当脏的 page cache 总量达到系统内存总量的这一百分比后,系统将开始使用 pdflush 操作将脏的 page cache 写入磁盘。默认值为 20%,也就是说如果到达该值时可能会导致应用进程的IO等待,通常不需调整。 dirty_background_ratio 百分比值。当脏的 page cache 总量达到系统内存总量的这一百分比后,系统开始在后台将脏的 page cache 写入磁盘。默认值为 10%,如果后台刷脏页的慢,而数据写的快就容易触发上面dirty-ratio的限制。通常不需调整。对于高性能 SSD,比如 NVMe 设备来说,设置较低的值有利于提高内存回收时的效率。 ### 3.3.硬盘 硬盘选型 SAS/SATA SSD/PCi-e SSD/持久内存:傲腾 (1) SAS一般跟RAID卡搭配,实现raid 0/1/10/5等阵列扩展。 (2) SATA支持热插拔,接口最高6G/s (3) PCIE传输速率更高8G/s,但是支持多通道,可以线性扩展速率。之前网卡/显卡都在用。上面3个接口协议不同,AHCI转为SAS和SATA设计,NVMe协议为PCIE SSD设计性能更优。一般核心的+高I/O的数据库都采用该类型SSD。 (4) 持久内存:傲腾,有钱可以买,它提供丰富的底层接口,对于需要极致写入性能的,可以考虑。持久内存将经济实惠的更大容量与对数据持久性的支持巧妙的结合在一起。以创新技术提供独特的操作模式,可以满足您针对各种工作负载的需求。 除了上面的硬盘外,还有RAID,常见的RAID级别有0/1/5/10,使用RAID的目的就是为了增强写入速度、扩容存储以及可恢复磁盘的作用。RAID主要分为软RAID、硬RAID二种。软RAID是由操作系统来完成的,所以处理I/O时还需要CPU,建议有条件的公司采用硬件RAID卡,硬件RAID卡在独立的RAID控制器和I/O处理下,不占用CPU资源,拥有很好的I/O性能。 I/O 调度算法 1、noop(no operation) Noop调度算法是内核中最简单的IO调度算法。Noop调度算法将IO请求放入到一个FIFO队列中,然后逐个执行这些IO请求,当然对于一些在磁盘上连续的IO请求,Noop算法会适当做一些合并。这个调度算法特别适合那些不希望调度器重新组织IO请求顺序的应用,因为内核的 I/O 调度操作会导致性能损失。在NVMe SSD这种高速I/O设备调度算法设置 noop 后,直接将 I/O 请求下发给硬件(没有内核赚差价),从而获取更好的性能。 2、CFQ(Completely Fair Queuing) CFQ尝试提供由发起I/O进程决定的公平的I/O调度,该算法为每一个进程分配一个时间窗口,在该时间窗口内,允许进程发出IO请求。通过时间窗口在不同进程间的移动,保证了对于所有进程而言都有公平的发出IO请求的机会,假如少数进程存在大量密集的I/O请求的情况,会出现明显的I/O性能下降。 3、 deadline DEADLINE调度算法主要针对I/O请求的延时而设计,每个I/O请求都被附加一个最后执行期限。读请求和写请求被分成了两个队列,默认优先处理读IO,除非写快被deadline时才调度。当系统中存在的I/O请求进程数量比较少时,与CFQ算法相比,DEADLINE算法可以提供较高的I/O吞吐率。 文件系统选择?Ext4 or XFS? ext4是第四代扩展文件系统,是ext3文件系统的后继版本,相比ext3,ext4取消子目录限制,支持的文件卷达到1EB,最大文件支持达到16TB,对于大数据存储足够,ext4在fsck(file system check)做了大量优化,相比ext3用时少很多。 xfs是由SGI公司设计的优秀的64位文件系统。xfs在可扩展、并行I/O、online碎片整理、延迟性能分配等方面做了大量改进,被称为业界最先进的、最具可升级性的文件系统技术。最大文件系统支持8EB,但文件也支持16TB,CentOS 7开始就用XFS作为默认的文件系统了,XFS的性能也比EXT4好。 最后为啥TiDB用ext4,为啥不用xfs?官方给出的是:稳定性 ext4磁盘挂载参数 1、nodelalloc 关闭延迟分配 提到nodealloc需要先知道delalloc, delalloc是说把所有的block分配推到真正要写数据的时候,之前有淘宝内核在线上业务中反馈出delalloc延迟分配导致的写延迟问题,所以禁用延迟分配。 2、noatime 读取文件时,将禁用对元数据的更新。Linux 在默认情况下使用atime选项,每次在磁盘上读取(或写入)数据时都会产生一个记录。默认的atime 选项最大的问题在于即使从页面缓存读取文件(从内存而不是磁盘读取),也会产生磁盘写操作。 ### 3.4.网络 网卡我们很少关注,主要在出现“抖动”问题时查看下监控,排查下流量等问题,日常只需要根据流量和网络延迟的要求选择千兆和万兆即可。所以这里主要涉及到2个方面,一个是网卡的稳定性,一个是网卡的速率。 1、网卡的速率 在现在越来越多的数据库100G网络时,我们现在还在准备将服务器的网卡从千兆升级到万兆网卡,其实是否升级还是看数据库服务器网卡流量和网络延迟情况。在目前的大多数流量情况下,千兆网卡足够用来对外提供服务,而对于PD/tikv等心跳数据交换非常频繁的组件,建议使用万兆网卡。 2、网卡的稳定性 网卡稳定提供服务是数据库服务器的基本要求,为了保障网络稳定性,一般都会采用双网卡做冗余,可以分为2种情况,一是双网卡做bond4,这样任意一个网卡故障都不影响业务的正常运行。另外双网卡的作用可以一块网卡提供数据的读写服务器,另外一块儿网卡用于日常探活和DB备份,这样可以避免DB备份对一块儿网卡流量的影响。 3、网络问题排查的思路 查看硬件监控,看网卡是否被跑满了 查看连通性:ethtool ent0+ping ip+telnet ip 端口,是否是防火墙问题? traceroute查看每一条延迟,iftop看tcp链接的带宽占用 如果有丢包可以使用ethtool -S eth0|grep drop查看,也可以使用tcpdump来抓包查看 ## 4.企业级生产案例:MySQL企业级部署安装-大厂标准集群化部署姿势 根据MySQL的特点 ,指定通用的部署规范 ```sql (1)部署规范:目录、数据盘、log, (2)用自己的部署脚本给大家介绍部署姿势。wget or 目录 or 虚拟机镜像 (3)ansible or saltstack这个是高阶。 ``` ```shell #!/bin/sh Mysql_home='/home/mysql' Base_dir='/ROOT/server' Mysqld_dir='/etc/init.d' Bin_dir='/usr/bin' Recover_dir='/ROOT/install/package' Recover_shell='/ROOT/install/package/db_recover.sh' Prepare_log='/ROOT/install/db_server_init.log' Scripts_file='/ROOT/scripts' Scripts_log='/ROOT/scripts/logs/slow_queries' Scripts_monitor='/ROOT/scripts/monitor' Scripts_dbscripts='/ROOT/scripts/db_scripts' SendMail_script='/usr/bin/sendmail_stmp.py' Nmap_dir='/usr/bin/nmap' Backup_dir='/ROOT/scripts/dj_backup' if ! [ -f "$Prepare_log" ];then touch $Prepare_log else cat /dev/null > $Prepare_log fi echo "you can find more information in /ROOT/install/db_server_init.log" echo "" >>$Prepare_log curTime=`date +'%Y%m%d %H:%M:%S'` echo "------------Prepare MySQL Instance Recover Environment Begin [$curTime]---------" >>$Prepare_log echo "" >>$Prepare_log echo "----Step 1: Check System User: mysql----" >>$Prepare_log if ! [ -d "$Mysql_home" ];then groupadd mysql useradd -g mysql mysql if [ $? -ne 0 ];then echo "Add System group:Mysql add System user:mysql Failed" >>$Prepare_log exit fi echo "Add System group:Mysql add System user:mysql success!!" >>$Prepare_log else echo "System System group:Mysql add System user:mysql is OK" >>$Prepare_log fi echo "" >>$Prepare_log echo "----Step 2: Check Recover scripts and packages----" >>$Prepare_log if ! [ -f "$Recover_shell" ];then echo "you should scp recover scripts and packages: scp -r root@10.10.65.15:/ROOT/install/package /ROOT/install" >>$Prepare_log exit else echo "Recover scripts and packages is OK" >>$Prepare_log fi echo "" >>$Prepare_log echo "----Step 3: Check mysql 5.1 and 5.5 environment----" >>$Prepare_log mysql_5_1_path=`ls -l $Base_dir |grep 'mysql'|grep '5\.1'|grep -v 'gz'` mysql_5_5_path=`ls -l $Base_dir |grep 'mysql'|grep '5\.5'|grep -v 'gz'` mysql_ln_file=`ls -l ${Base_dir}/mysql |grep 'mysql'` mysql_ln_bin=`ls -l ${Bin_dir}/mysql |grep 'mysql'` if [ -n "${mysql_5_1_path}" -a -n "${mysql_5_5_path}" ];then echo "mysql_5.1 and mysql_5.5 find in /ROOT/server" >>$Prepare_log elif [ -n "${mysql_5_1_path}" -a -z "${mysql_5_5_path}" ];then echo "mysql_5.1 find in /ROOT/server,install mysql_5.5" >>$Prepare_log mysql_5_5_install=`find $Recover_dir -name "*mysql_5.5*"` tar -zxf $mysql_5_5_install -C $Base_dir echo "mysql_5.5 install OK" >>$Prepare_log elif [ -z "${mysql_5_1_path}" -a -n "${mysql_5_5_path}" ];then echo "mysql_5.5 find in /ROOT/server" >>$Prepare_log mysql_5_1_install=`find $Recover_dir -name "*mysql_5.1*"` tar -zxf $mysql_5_1_install -C $Base_dir echo "mysql_5.1 Decompress to /ROOT/server" >>$Prepare_log else echo "mysql_5.1 and mysql_5.5 not find in /ROOT/server" >>$Prepare_log mysql_5_1_install=`find $Recover_dir -name "*mysql_5.1*"` tar -zxf $mysql_5_1_install -C $Base_dir mysql_5_5_install=`find $Recover_dir -name "*mysql_5.5*"` tar -zxf $mysql_5_5_install -C $Base_dir echo "mysql_5.1 and mysql_5.5 Decompress to /ROOT/server" >>$Prepare_log fi if [ -n "$mysql_ln_file" ];then echo "mysql link file is OK" else mysql_5_1_file=`ls -l $Base_dir |grep 'mysql'|grep '5\.1'|grep -v 'gz'|awk '{printf $9}'` ln -s ${mysql_5_1_file} $Base_dir/mysql echo "mysql basedir link create OK" >>$Prepare_log fi chown -R mysql:mysql $Base_dir/mysql* if [ -n "$mysql_ln_bin" ];then echo "mysql bin link file is OK" >>$Prepare_log else mysql_5_1_bin=`ls -l ${Base_dir}/mysql/bin/mysql |awk '{printf $9}'` ln -s ${mysql_5_1_bin} $Bin_dir/mysql echo "mysql bin link create OK" >>$Prepare_log fi cp $Recover_dir/mysqld_5.1 $Mysqld_dir cp $Recover_dir/mysqld_5.5 $Mysqld_dir echo "copy mysql start scripts OK" >>$Prepare_log echo "" >>$Prepare_log echo "----Step 4: Check qpress install----" >>$Prepare_log qpress_bin=`ls -l ${Bin_dir}/qprees |grep 'qpress'` if [ -n "$qpress_bin" ];then echo "qpress in /usr/bin OK" >>$Prepare_log else cp $Recover_dir/qpress /usr/bin echo "copy qpress to /usr/bin OK" >>$Prepare_log fi echo "" >>$Prepare_log echo "----Step 5: Check Xtrabackup install----" >>$Prepare_log xtrabackup_bin=`ls -l ${Bin_dir}/innobackupex |grep 'innobackupex'` if [ -n "$xtrabackup_bin" ];then echo "Xtrabackup has install!!" >>$Prepare_log else xtrabackup_tar_file=`find $Recover_dir -name "*xtrabackup*"` tar -zxf $xtrabackup_tar_file -C $Base_dir xtrabackup_install=`find $Base_dir -name "*xtrabackup*"|head -1` cp $xtrabackup_install/bin/* /usr/bin echo "xtrabackup install OK" >>$Prepare_log fi echo "" >>$Prepare_log echo "----Step 6: Check Scripts file----" >>$Prepare_log if ! [ -d "$Scripts_log" ];then mkdir -p $Scripts_log if [ $? -ne 0 ];then echo "Mkdir /ROOT/scripts/logs Failed" >>$Prepare_log exit fi echo "/ROOT/scripts/logs/slow_queries success!!" >>$Prepare_log else echo "/ROOT/scripts/logs is already exists!" >>$Prepare_log fi echo "" >>$Prepare_log if ! [ -d "$Scripts_monitor" ];then mkdir -p $Scripts_monitor if [ $? -ne 0 ];then echo "Mkdir /ROOT/scripts/monitor Failed" >>$Prepare_log exit else cp $Recover_dir/*distribute* $Scripts_monitor echo "cp distribute scprits success!!" >>$Prepare_log fi else cp $Recover_dir/*distribute* $Scripts_monitor if [ $? -ne 0 ];then echo "cp distribute scprits Failed" >>$Prepare_log exit fi echo "cp distribute scprits success!!" >>$Prepare_log fi echo "" >>$Prepare_log if ! [ -d "$Scripts_dbscripts" ];then mkdir -p $Scripts_dbscripts cp $Recover_dir/kill_timeout_sql* $Scripts_dbscripts if [ $? -ne 0 ];then echo "cp kill_timeout_sql Failed" >>$Prepare_log exit else cp $Recover_dir/kill_timeout_sql* $Scripts_dbscripts echo "cp kill_timeout_sql success!!" >>$Prepare_log fi else cp $Recover_dir/kill_timeout_sql* $Scripts_dbscripts if [ $? -ne 0 ];then echo "cp kill_timeout_sql Failed" >>$Prepare_log exit fi echo "cp kill_timeout_sql success!!" >>$Prepare_log fi echo "" >>$Prepare_log if ! [ -f "$Scripts_shell" ];then cp $Recover_dir/init.sh $Scripts_file echo "cp /ROOT/scripts/init.sh success" >>$Prepare_log else echo "/ROOT/scripts/init.sh is OK" >>$Prepare_log fi echo "" >>$Prepare_log if ! [ -f "$SendMail_script" ];then cp $Recover_dir/sendmail_stmp.py /usr/bin echo "cp sendmail_stmp.py success" >>$Prepare_log else echo "/usr/bin/sendmail_stmp.py is already exists!" >>$Prepare_log fi echo "" >>$Prepare_log if ! [ -f "$Nmap_dir" ];then cp $Recover_dir/nmap /usr/bin echo "cp sendmail_stmp.py success" >>$Prepare_log else echo "/usr/bin/sendmail_stmp.py is already exists!" >>$Prepare_log fi echo "" >>$Prepare_log if ! [ -d "$Backup_dir" ];then mkdir -p $Backup_dir if [ $? -ne 0 ];then echo "Mkdir /ROOT/scripts/dj_backup Failed" >>$Prepare_log exit else cp $Recover_dir/*backup* $Backup_dir echo "cp backup scprits success!!" >>$Prepare_log fi else cp $Recover_dir/*backup* $Backup_dir if [ $? -ne 0 ];then echo "cp backup scprits Failed" >>$Prepare_log exit fi echo "cp backup scprits success!!" >>$Prepare_log fi echo "" >>$Prepare_log curTime=`date +'%Y%m%d %H:%M:%S'` echo "------------Prepare MySQL Instance Recover Environment End [$curTime]---------" >>$Prepare_log echo "" >>$Prepare_log echo "----Recover script in /ROOT/install/package/db_recover.sh-----" >>$Prepare_log ``` ## 5.MySQL上云:MySQL in docker/MySQL in K8S 1、docker安装mysql ```sql (1) docker 安装 yum search docker yum install -y docker (2)查看可用mysql版本: docker search mysql (3)拉取官方的最新版本的镜像 docker pull mysql:latest (4)查看本地镜像 docker images (5)运行mysql容器 docker run -itd --name mysql-test -p 3306:3306 -e MYSQL_ROOT_PASSWORD=123456 mysql (6)查看安装的mysql docker ps (7)登录mysql ``` 2、mysql on k8s ```sql (1)安装k8s 大工程 (2)编辑yaml来部署集群 PV,local starge,共享存储 ```
李延召
2024年3月15日 11:35
转发文档
收藏文档
上一篇
下一篇
手机扫码
复制链接
手机扫一扫转发分享
复制链接
Markdown文件
分享
链接
类型
密码
更新密码