RDS 高可用保障之 – 隐式主键

在构建稳定可靠的应用架构时, 数据库是最底层、最稳定的组件之一;而在云环境中,RDS 提供一个7*24小时不间接访问的云服务,可用性达到99.95%.

RDS 采用主备复制架构,用户购买一个实例,RDS都会提供一个性能对等的备库用于保证高可用。 高可用性组件(AURORA)会每3秒检查主库(Master)状态,当发现 Master 出现Down机时可以将用户的SQL请求快速转移到备库(Slave)上面。

图1 – RDS 架构图

在这样的架构设计下, RDS需要保证主备数据一致性并且延时不超过10秒,以快速完成主备切换;否则,RDS会保证一致性而牺牲可用性,必须等待数据同步一致再进行切换;所以主备延时会直接影响服务的高可用性;

数据复制可靠性

MySQL复制模式可以通过参数:BINLOG_FORMAT进行配置 ;在MySQL5.1以前,MySQL默认采用 Statement 模式进行数据复制,这种模式下有可能会让主备数据产生不一致情况,比如使用UUID等函数;MySQL在5.1版本以后,提供了基于ROW 模式的复制模式,从而大大提高了数据复制的可靠性;但这种模式在以下场景下会让备库的数据延时很大;

1) 存在没有主键的表,导致备库应用每个Event 都需要全表扫描 ;
2) 主库执行了大表DDL 或大事务,导致备库也要相同时间执行完 ;

RDS在实际的运行过程中发现,99%以上的主备延时,都是因为用户在建表的时候没有指定主键;RDS 曾经尝试过临时解决方案, 把有延迟的实例日志格式改为MIXED,无主键表的操作用STATEMENT 格式记录,但这种方案还是有可能产生主备数据不一致;

ROW模式数据复制
ROW 模式之所以能保证复制可靠性,是其在BINLOG里记录每一行完整记录,包括所有列的值;在备库应用日志时,MySQL 会先尝试用行里的主键去匹配自身的记录,如果没有主键, 则进行全表扫描所有的行,每一行都与日志进行匹配,直到发现完全匹配的行;

图2- ROW模式日志匹配处理流程

方案设计

在保证主备数据复制可靠性的前提下,减小主备延时;

方案一: 提醒用户去加上主键,问题迎刃而解;但在实际的实施过程中,这根本不现实,用户的学习成本、应用兼容、实施成本远远超过我们的想像;

方案二: 这也是云平台自身要解决的问题,用户不应该去关注这些问题;让MySQL 在底层能智能的处理,对用户透明,兼大欢喜;

对于方案二,有两个解决思路:

1. 为什么ROW格式日志一定要用主键定位记录,如果用二级索引行不行?虽然没有主键那么精准,但至少可以避免全表扫描

2. InnoDB 引擎也是严重依赖主键,它对于没有主键的表,就自己强制加进去一个主键对用户隐藏,MySQL Server层可否也这样实现?

思路一,需要考虑的问题主要是成本开销:

图3-利用二级索引处理无主键的ROW格式Event

如果像执行SQL一样,每一行都走一遍执行计划看哪个二级索引比较好,那么速度一样快不起来.主库只对每个SQL走一次执行计划选择一个索引,备库需要对这个SQL影响的所有行记录都重新生成一次执行计划。

因为ROW格式中的行包含了所有列,所以更合理的方案是,选择一个固定规则的二级索引即可,总是有列可以被用上进行过滤。例如总是利用第一个二级索引,这样不需要走执行计划,可以大大节省生成执行计划的时间,而且有这个规则,也可以调整二级索引的位置,来匹配这个规则,让过滤性好的二级索引调整到可以被利用的位置。

幸好,MariaDB开发了一个这样的补丁,对于有二级索引而没有主键的表来说,效果还不错。

思路二,要解决的情况是:完全没有任何索引、以及二级索引过滤性都不好的情况(比如,性别字段)。这里我们考虑过把InnoDB的二级索引直接引用到Server层来,但是如此一来,对于使用MyISAM表的用户,还是没有效果,所以需要一个更通用的设计方案:MySQL可以自动会用户添加主键而对应用透明 – 隐式主键(Implict Primary Key)。 最终,我们采取了这样的设计方案:

1 打开RDS 特有的参数implict_primary_key,让隐式主键功能生效 ;
2 当用户建表(CREATE TABLE)时,判断表结构

2.1 如果表上有主键,则pass
2.2 如果表上没有主键,有唯一键,则把唯一键放在索引的第一个位置,可以利用二级索引补丁 ;
2.3 如果表上没有主键,也没有唯一键,则为用户建立一个特定名称的自增主键 ;

3 当用户修改表结构(ALTER TABLE)时,判断新表结构

3.1 如果用户自己添加了主键或唯一键,则删除系统添加的主键
3.2 如果用户删除了原有的主键和唯一键,则为用户建立一个特定名称的自增主键

4 用户做DML操作时,屏蔽这个隐式主键的存在

4.1 INSERT INTO table VALUES (…),用户不需要在VALUES中填写主键的值,系统会自动填充NULL,从而在写入数据库时自动填入自增值
4.2 SELECT * FROM table,行数据返回给用户前,自动过滤了隐式主键列
4.3 LOAD DATA INFILE,用户不会感知到表中存在主键,系统会自动填充NULL来使用自增主键值
4.4 SHOW CREATE TABLE/SHOW COLUMNS等SHOW语句,生成结构语句时自动过滤隐式主键列,用户不会看到有主键列

5 对于系统用户(root)需要查看真实情况的,提供show_ipk_info参数,SET show_ipk_info=1,则可以查看隐式主键,不会进行任何隐藏操作
6 如果implict_primary_key参数关闭,则隐式主键功能不再发挥作用,即当用户进行DDL操作时,如果原来表上有隐式主键,则会趁用户DDL之机一起删除。但是原有的没有删除的隐式主键列并不会显示给用户,会一直隐藏。

图4 – 隐含主键操作展示;

基于思路2,RDS MySQL 源代码团队已经完成开发适应于RDS场景的MySQL Patch,并全面覆盖到RDS所有MySQL5.1和 MySQL 5.5服务器中,目前运行稳定 ;

时间: 2024-08-01 21:10:17

RDS 高可用保障之 – 隐式主键的相关文章

云中的高可用保障,且看Auth0的跨提供商多云架构

Auth0是一个"身份即服务"创业公司,同时也是重度的云服务用户.对于他们来说,服务中断意味着大量用户托管应用无法登陆,因此可用性对于他们来说至关重要.近日,Auth0工程主管Jose Romaniello分享了他们可以豁免大范围Microsoft Azure宕机的跨提供商多云架构. 以下为译文 Auth0是一个"身份即服务"创业公司,它可以让用户忽略底层基础设施,为移动.网络.本地等任何类型堆栈上的应用提供身份验证.授权及单点登录功能. 对绝大部分应用来说,身份验

UCloud高可用UDB 开启金融级云端数据库服务

  数据库作为底层的数据存储和管理工具,是企业IT系统中不可或缺的一环.从Oracle.DB2到目前最流行的开源数据库MySQL,关系型数据库已经存在了近40年,在企业中所发挥的作用不可替代. 但与此同时"不重视数据安全的情况在企业中比较突出",千人计划专家王子骏表示.尤其对于高成长性企业,普遍采用开源MySQL数据库,但其对某些功能(例如引用.事务.审计等)的实现方式使得它与其他关系型数据库相比缺少了一些可靠性.在数据库容量增长很快时,系统宕机.数据丢失总是在意想不到的时间.地点.场

详解数据中心网络高可用的技术

一.高可用性的定义 系统可用性(Availability)的定义公式为:Availability=MTBF/(MTBF+MTTR)×100% MTBF(MeanTimeBetweenFailure),即平均无故障时间,是描述整个系统可靠性(reliability)的指标.对于一个网络系统来说,MTBF是指整个网络的各组件(链路.节点)不间断无故障连续运行的平均时间. MTTR(MeanTimetoRepair),即系统平均恢复时间,是描述整个系统容错能力(fault-tolerantcapabi

如何在阿里云上构建高可用的跨AZ部署方案

引言: 针对企业而言,不管业务是不是在云上,服务的稳定和连续性总归是无法回避的话题,为了降低不可抗力因素对服务提供造成的影响,我们有了高可用性和容灾的概念.虽然我们的产品已有很高的可用性,我们仍不能忽视构建服务高可用性和容灾的重要性. 针对一般企业而言,主要会用到ECS, SLB, RDS, OSS 产品介绍: ECS 云服务器.相当于阿里云上的虚拟机,本身没有高可用性和容灾,需要通过架构来实现. SLB 负载均衡,高可用性和容灾可以从两点来阐述: 1. 负载均衡的服务提供是基于集群部署的,各集

全是干货---Linux 高可用(HA)集群基本概念详解

http://www.linuxidc.com/Linux/2013-08/88522.htm 高可用集群的衡量标准    HA(High Available), 高可用性群集是通过系统的可靠性(reliability)和可维护性(maintainability)来度量的.工程上,通常用平均无故障时间(MTTF)来度量系统的可靠性,用平均维修时间(MTTR)来度量系统的可维护性.于是可用性被定义为:HA=MTTF/(MTTF+MTTR)*100%   具体HA衡量标准: 99% 一年宕机时间不超

MySQL小型高可用架构(组合)

一.MySQL MySQL小型高可用架构 方案:MySQL双主.主从 + Keepalived主从自动切换   服务器资源:两台PC Server 优点:架构简单,节省资源 缺点:无法线性扩展,主从失败之后需要手动恢复主从架构     MySQL中型高可用架构 方案:MMM + MySQL双主 + 多从高可用方案   服务器资源: 1.至少五台PC Server,2台MySQL主库,2台MySQL从库,1台MMM Monitor: 2.1台MMM Monitor选择低配: 3.如果不采用F5作为

5项优化4种高可用方案,MySQL常用架构调优这样做!

选择Percona Server.MariaDB还是MYSQL   1.Mysql三种存储引擎   MySQL提供了两种存储引擎:MyISAM和 InnoDB,MySQL4和5使用默认的MyISAM存储引擎.从MYSQL5.5开始,MySQL已将默认存储引擎从MyISAM更改为InnoDB.   MyISAM没有提供事务支持,而InnoDB提供了事务支持.   XtraDB是InnoDB存储引擎的增强版本,被设计用来更好的使用更新计算机硬件系统的性能,同时还包含有一些在高性能环境下的新特性.  

10款常见MySQL高可用方案选型解读

作者介绍 王松磊,现任职于UCloud,从事MySQL数据库内核研发工作.主要负责UCloud云数据库udb的内核故障排查工作以及数据库新特性的研发工作.   一.概述   我们在考虑MySQL数据库的高可用架构时,主要考虑如下几方面:   如果数据库发生了宕机或者意外中断等故障,能尽快恢复数据库的可用性,尽可能的减少停机时间,保证业务不会因为数据库的故障而中断. 用作备份.只读副本等功能的非主节点的数据应该和主节点的数据实时或者最终保持一致. 当业务发生数据库切换时,切换前后的数据库内容应当一

业务爆发式增长 电商 IT 系统如何保证高可用?

对于各个电商平台来说,由于电子商务.互联网+.O2O 等各种概念的冲击,电商的业务形态及用户规模都不尽相同,各大电商公司也都在摸索适合自己业务高速发展的技术和业务架构.其中最关键的一点就是,如何才能让自身的基础设施满足企业业务不断发展的需求?如何才能在业务爆发式增长的前提下保证 IT 系统的性能.可靠性?今天的内容主要集中在如何保证业务爆发式增长背后的电商 IT 系统高可用.
 什么是电商平台的高可用? 1.核心业务的"永动机" 由于电商业务系统承载着商品展示.线上支付.物流跟踪.抢购