1. RDS架构解析
1) RDS整体访问架构
• 正常情况下,业务部署在ECS上,通过URL访问会解析到负载均衡SLB上转发到主实例;如果主实例出现故障,可以切换到备实例;
• 如果开通数据库代理,会到主实例中来。数据库代理有读写分离的地址,ECS换了URL,用此URL到负载均衡SLB,再到数据库代理,判断读写流量的去向;
• 备份以及日志备份,存在OSS中。基于备份一键生成一个新的RDS实例时,数据恢复的过程就是备份,基于备份生成新实例。
2) RDS底层系统架构
• 用户访问,解析DNS到防火墙,转发到客户端。
• 控制实例有:HA控制系统、备份系统、在线迁移系统、任务调度系统、监控系统等。
• 当创建/删除实例时,先到任务调度系统,触发是做迁移还是备份,最后发送到指定的cluster中,再进行下一步相关的操作。
3) RDS主从切换原理
RDS高可用版采用主备架构,具备高可用性。
• 高可用控制系统主要负责所有数据库实例主备之间的健康检查,以及实时切换,以保证数据库高可用性达到99.95%;
• 3秒轮循一次,实例轮询并发进行,当发现有节点不健康时,需要完成秒级切换;
• 高可用控制系统是作为第三方身份去判断数据库实例是否在正常运行,不会出现脑裂现象;
• 可模拟应用去做更新,这样对故障点的判断更为准确;
• 高可用系统集群本身也是一个高可用的环境,集群内所有节点相互检查和任务接管。
2. RDS核心技术解析
1) RDS自研内核 - AliSQL简介
• AliSQL是阿里云深度定制的独立MySQL分支,除了社区版的所有功能外,AliSQL提供了类似于MySQL企业版的诸多功能,如企业级备份恢复、线程池等;
• RDSMySQL使用AliSQL内核,为用户提供了MySQL所有的功能,同时提供了企业级的安全、备份、恢复、监控、性能优化、只读实例等高级特性;
• 在通用基准测试场景下,AliSQL版本比MySQL官方版本有着70%的性能提升。在秒杀场景下,性能提升100倍。
2) AliSQL增强Feature介绍
功能增强类
• ThreadPool
• StatementOutline
• SequenceEngine
• Returning
• Lizard事务系统
性能增强类
• FastQueryCache
• BinloginRedo
• StatementQueue
• InventoryHint
稳定性增强类
• FasterDDL
• Statement(oncurrencyControl)
• PerformanceAgent
• Rurge,LargeFileAsynchronously
• PerformanceInsight
安全增强类
• RecycleBin
AliSQL详细信息请参考
https://help.aliyun.com/document.detail/129925.html
a) 示例:ThreadPool
Multi-queuethreadpool
• 限制线程数量,避免过多线程调度和大量缓存失效;
• 区分语句和事务的优先级,控制并发数量,从而减少资源竞争;
• 给予管理类SQL语句更高的优先级,保证这些语句优先执行;
• 给予复杂查询SQL语句较低的优先级,并且限制其最大并发数。
参数配置
• thread_poolenabled:是否开启线程池功能,默认开启,ON|OFF;
• thread_pool_size:线程池内分组的数量,默认值4;
• thread_pooloversubscribe:每个分组中允许的活跃线程数量,默认值32。
b) 示例:StatementQueue
将冲突的SQL语句放在同一个队列(桶)中排队,减少冲突导致的开销;
支持两种Hint
• /*+ccl_queue_value([int|string])*/
• 根据输入的值的hash进行分桶
• /*+ccl_queue_field(column)*/
• 根据指定column值的hash进行分桶
参数设置
• ccl_queue_bucket_count:桶的数量
• ccl_queue_bucket_size:一个桶内允许的并发数
c) 示例:RecycleBin
回收机制
• DROP/TRUNCATETABLE的表对象移到RecycleBin目录(新库"_recycle_bin_");
• 表相关的trigger以及foreignKey会被删除;
• 表的附属属性(ColumnStatistics)会进入RecycleBin。
回收站清理
• 无法直接使用DROPTABLE清理回收站中的数据;
• 可通过DBMS_RECYCLE.purge_table()清理;
• 清理时需要用户具有原表和回收站表的DROP权限。
Master-Slave独立回收
• 回收站功能的开启及保留周期都是实例级别,主备之间不会通过binlog进行同步。