开发者学堂课程【企业运维训练营之数据库原理与实践课程 :视频 -AliSQL 和读写分离基本原理(一)】学习笔记,与课程紧密联系,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/1201/detail/18284
视频 -AliSQL 和读写分离基本原理
内容介绍:
一、课程目标
二、AliSQL
三、读写分离
四、实例管理
五、总结
一、课程目标
整体内容有三个部分,第一部分主要介绍 AliSQL 相关的功能特性和基本原理;第二部分是数据库用到的读写分离的思想;第三部分会具体介绍 RDS 数据库控制台上相关的基本操作。本次课程的目标是针对这三块内容提供的目标:
①了解 AliSQL 的功能、性能和优势
②了解读写分离的功能和相关原理
③熟悉如何管理 RDS 实例和相关的控制台操作
二、AliSQL
1、AliSQL 简介
(1)AliSQL 是阿里云深度定制的一个独立的分支,在社区版的功能上又提供了类似于 MySQL 企业版的功能,提供了一些更加强大的性能,比如说备份恢复、线程池、并行查询等。还有一些兼容 Oracle 和功能,比如说 sequence 等。AliSQL 是基于 X-Engine 存储架构引擎上的,X-Engine 是阿里云数据库产品自己研发的连接事务处理的数据库引擎,目前已经应用到阿里集团诸多业务系统当中,大幅缩减了业务成本,历经双十一百倍流量的考验,所以开源出来进行功能的增强。X-Engine 的诞生是为了应对业务内部的挑战,背景是在2010年双十一的关系部署了大量的 MYSQL 数据库,但是随着历年流量的增长,面临着极大的挑战。
(2)MySQL 数据库可以通过扩容节点的分布式方案解决,但是如果一直是这种堆积器的方案,则不是一个高效的手段。当时的数据库团队就想用更高的技术手段来提升数据库的性价比,使之达到极致,实现以少量的资源换取性能大幅提高的目的,所以在这个基础上开发了 X-Engine 存储引擎。全新的 X-Engine 存储引擎不仅能够无缝对接 MySQL,同时还使用了分层存储的架构思想,在面向大规模的海量数据存储提供了高并发事务处理能力和降低存储成本,在大部分大数据量的场景下,数据被访问的机会是不均等的,访问频繁的热数据占比很少,X-Engine 根据数据访问频度不同,将数据划分为多个层次。
2、AliSQL 功能
AliSQL 有三方面的功能特性,分别是功能、性能、稳定性三方面。
(1)Ex: Native Flashback
数据库运维过程中的误操作可能会给业务带来严重的影响,比如误删某些表或误删某些表中的数据,常见的恢复手段Binlog,但是 Binlog 操作较为复杂、容易出错且耗时较长,而通过备份集恢复则需要额外的系统资源,在数据量较大时恢复时间不可控。
AliSQL 在 InnoDB 引擎上设计和实现了 Native Flashback 功能,无需复杂的恢复操作,通过简单的 SQL 语句即可查询或恢复误操作前的历史数据,节省了大量宝贵的时间,保证业务平稳运行。可以使用如下语句,用 TIMESTAMP,后面跟一些表达式将数据恢复到想要的时间点。
SELECT ... FROM <表名> AS OF TIMESTAMP <表达式>;
例如:
SELECT ... FROM tablename AS OF TIMESTAMP '2020-11-11 00:00:00’;
SELECT ... FROM tablename AS OF TIMESTAMP now();
SELECT ... FROM tablename AS OF TIMESTAMP (SELECT now());
SELECT ... FROM tablename AS OF TIMESTAMP DATE_SUB(now(), INTERVAL 1 minute);
(2)Ex:Thread Pool
数据库团队为了发挥出 RDS 最佳的性能,提供了 Thread Pool 功能。将线程和会话分离,在拥有大量会话的同时,只需要少量线程完成活跃绘画的任务。MySQL 默认的线程使用的模式是会话独占的模式,所以每个会话都会创建一个独立的线程,当大量会话存在时,就会导致大量的资源争抢,大量的系统线程调度和缓存失效也会导致数据库的性能急剧下降。阿里云 RDS 线程池实现了不同 SQL 操作的优先集和并发控制机制,就是将连接池始终控制在最佳的连接数附近,不让连接数过高,这样就会保持在高性能的状态。线程池的优势有以下几点:
①在大量线程并发工作的时候,线程池会自动调节线程的数量在一个合理范围内
②大量事务并发执行的时候,线程池会将语句事物分为不同的优先级③线程池可以给管理类的 SQL 更高的优先级,保证那些语句优先执行
(3)Ex:Statement Outline
在生产环境中 SQL 语句的执行计划可能会发生改变,原因有很多,可能有一些外部因素导致执行计划方式改变,导致数据库在执行 SQL 的时候不稳定。利用 Optimizer Hint 和 Index Hint 让 MySQL 稳定执行计划,该方法称为Statement Outline,以最优的方法执行。
(4)Ex:Sequence Engine
在 RDS 数据库系统中,不论是单节点的业务组件,还是分布式系统的全局唯一值,或是更多系统的幂等控制,单调递增唯一值是用户常见的需求。不同的数据库系统有不同的实现方法,MySQL 当中提供了 Auto increment,MySQL数据库中如果业务希望封装唯一值,比如说增加日期、用户等信息,使用 Increment 的方法有很多不变,在实际系统当中也存在一些不同的折中方法,比如说序列值由应用端或 proxy,但是弊端非常明显,状态会带到应用端增加扩容或缩容复杂度,所以 AliSQL 提供的 Sequence Engine 功能实现了 MySQL 存储引擎的设计接口,但底层的数据仍然使用现在的存储引擎来达到这样的效果。
(5)Ex:Returning
MySQL 的语句执行结果的的报文通常分为三类,分别是 Resultset、OK、Error,针对 DML 语句返回 OK 或者 Error 报文,会影响扫描记录的特性,所以在很多业务场景下,执行 insert、upset、delete 这样的 DML 语句都会跟随 select 查询当前的内容,以及进行接下来的业务处理,减少客户端和服务器的交互。
(6)Ex:Lizard 事务系统
Lizard 事务系统能够更好地提升 RDS MySQL 数据库的吞吐能力,并支持分布式事务和全局一致性。
3、AliSQL 性能
(1)Fast Query Cache
针对原生 MySQL Query Cache 的不足,阿里云进行重新设计和全新实现,主要解决原生 MySQL Query Cache 的几个不足点,第一个是并发控制,在这上面进行了一些优化,取消了全局锁的同步机制,采用无锁机制,重新设计了并发场景下的同步问题,能够充分利用多核的处理能力保证在高并发下的数据库的性能;第二个是优化内存管理,取消内存预分配的机制,采用了更加灵活的动态内存分配机制;第三点是优化了缓存机制,当动态检测缓存利用率,实时调整缓存策略,解决命中率偏低或者是读写混合场景下性能下降的问题。
(2)Binlog in Redo
在事务提交时将 Binlog 内容同步写入到 Redo Log 中,减少对数据库磁盘的操作,提高数据库性能。
(3)Statement Queue
针对语句的排队机制,将语句进行分桶排队,尽量把可能具有相同冲突的语句(例如操作相同行)放在一个桶内排队,MySQL 的服务层和引擎层在语句并发执行的过程中,有很多串联的点容易导致冲突。比如在 DML 语句中,事务锁冲突比较常见,Inno DB 中事务锁最新的力度是行级锁,如果语句针对相同的行级并发操作,会导致冲突比较严重,系统的吞吐量会随着客户业务端的增加而递减,AliSQL 提供了 Statement Queue 这样一个机制,通过分桶排队的方法,减少冲突的开销,从而达到实现实例性能的作用。
(4)Inventory Hint
快速提交、回滚事务,配合 Returning 和 Statement Queue,能有效提高业务吞吐能力。
AliSQL 提供 Inventory Hint,帮助快速提交/回滚事务,配合 Returning 和 Statement Queue,能有效提高业务吞吐能力。
/*+ COMMIT_ON_SUCCESS */ /*+ ROLLBACK_ON_FAIL */
例子:
UPDATE /*+ COMMIT_ON_SUCCESS ROLLBACK_ON_FAIL */
T SET c = c - 1 WHERE id = 1;
两个事务 Hint 为 COMMIT_ON_SUCCESS和ROLLBACK_ON_FAIL:
•COMMIT_ON_SUCCESS:当前语句执行成功就提交事务上下文。
•ROLLBACK_ON_FAIL:当前语句执行失败就回滚事务上下文。
4、AliSQL 的稳定
AliSQL 在稳定方面针对于 MySQL 数据库或者是 RDS 数据库在平常运行过程中可能出现一些抖动,或者是性能方面,或者是统计方面的不确定性而做出的优化,主要包括下面五方面。
(1)Faster DDL
在很多实际的客户案例中,经常会遇到客户在执行 DDL 的时候会发生一些问题,比如说为什么加索引会造成实例的抖动,影响正常业务的读写;第二个是可能一个表不是很大,但是在执行 DDL 的时候需要十几分钟,类似于客户反馈卡住了;第三个是为什么使用临时表连接退出的时候会造成实例的抖动,这三个问题是平常客户反馈比较多的问题。针对这些常见的问题在 MySQL 源生的 DDL 开发了 Faster DDL,在 DDL 操作期间的缓存维护逻辑存在性能缺陷,通过这样的优化Buffer 处的页面管理策略来减少 DDL 操作的导致的锁锁降用,达到缓解刚才提到的问题,通过这个功能,可以使客户在实例平常的压力下安心的执行 DDL,不会发生刚才提到的问题。
(2)Statement Concurrency Control
并发控制是为了应对数据库请求流量资源消耗过高的语句访问,和 SQL 访问模型的变化,保证 MySQL 实例持续稳定的运行,为了应对流量或资源过高的语句提供的一个功能。
(3)Performance Agent
便捷的性能数据统计方案。通过 MySQL 插件的方式,实现 MySQL 实例内部各项性能数据的采集与统计。他在一个系统部下新增了一张内存表,用于统计最近一段时间的性能数据,使得客户可以直接查询该表把最近一段时间的性能统计的数据进行查看。
(4)Purge Large File Asynchronously
通过异步删除大文件的方式保证系统稳定性。背景是在源生的 Inno DB,就是 MySQL Inno DB 直接删除一个大文件可能会导致严重的稳定性问题,在这上面启动一个后台的线程异步的清理这些数据文件,当删除一个单个表空间的时候会将对应的数据文件先重命名为临时文件,用异步的线程删除,来达到系统的稳定性。
AliSQL 支持通过异步删除大文件的方式保证系统稳定性。
使用 InnoDB 引擎时,直接删除大文件会导致POSIX文件系统出现严重的稳定性问题,因此 InnoDB 会启动一个后台线程来异步清理数据文件。当删除单个表空间时,会将对应的数据文件先重命名为临时文件,然后清除线程将异步、缓慢地清理文件。
set global INNODB_DATA_FILE_PURGE = on;
set global INNODB_DATA_FILE_PURGE_INTERVAL = 100;
set global INNODB_DATA_FILE_PURGE_MAX_SIZE = 128;
select * from information_schema.innodb_purge_files;
(5)Performance Insight
是专注于实例负载监控、关联分析、性能调优的利器,帮助您迅速评
估数据库负载,找到性能问题的源头,提升数据库的稳定性。
5、小结
阿里云在多年的实践经验上开发了 X-Engine 的存储引擎,在上面构架了一套优化 MySQL 源生的 AliSQL,他有三个方面,分别是功能、性能和稳定。在这三大块下有具体的特性来供客户平常在数据库业务过程中进行使用。