从AWS 2010年推出关系型数据库服务到国内厂商的纷纷的跟进,华云关系型数据库服务(RDS)并不算是先行者,但是华云RDS自投入研发以来集百家之长,力求为用户打造最合适的数据库服务。本文中,笔者将从一个用户的角度历数市场上现有关系型数据库服务的主要功能,探索是否有一些改进的空间以及华云RDS技术上所做的一些选择。
关于备份
数据库备份是用户常用的功能之一,mysqldump/xtrabackup 是最常见的备份方案,同时也是大多数厂商的选择。
Mysqldump有比较明显的缺陷,无法做增量备份,对于经常需要做备份的用户来说,是无法接受的。Xtrabackup是Percona推出的商业解决方案,同时提供免费版本,基本机制是通过比较LSN来做增量拷贝,从机制来看,需要innodb事务的支持,对于非innodb比如myisam,则通过FLUSH TBALES WITH READ LOCAK来保证数据的一致性,显然地,block write的时间取决于myisam表拷贝时间。好吧,我们可以禁用myisam表,这个问题可以跳过。另一方面,xtrabackup需要运行在GuestOS中,读取拷贝生产环境数据目录同时会影响到线上的IO的表现。
最后,如果用户想要删除其中一个增量备份,该如何做增量的合并和删除?还是将依赖的增量一并删除?
恐怕对用户来说,这都不是理想的。
有没有既不影响生产环境IO,又能做增量并且还能独立删除的办法呢?快照或许是一个比较好的选择。
秒级增量备份 :快速完成数据备份,避免大数据量备份时间过长。
避免链式依赖 : 不同于市场上某些云数据库产品,备份点之间存在强依赖,无法单独删除,华云RDS采用了不同的方式,可单独删除某增量备份快照。
线上业务无干扰 : 基于快照的备份过程不占用实例IO资源、无业务阻塞。
数据库引擎
Innodb、myisam是最常用的MySQL数据库引擎,前者是事务安全的,后者则拥有更高的性能。前文描述到,myisam无法保证备份点数据的一致性,FLUSH TBALES WITH READ LOCAK又需要block write,得不偿失,华云RDS强制关闭myisam表的使用。
主从
MySQL replication是做读写分离的基础,分为异步和半同步的方式,前者有对主机性能影响小,但数据有一定延时,后者则相反。两种技术可以满足用户不同场景的需求。关于crush safe的问题,分为master crush safe和slave crush safe。MySQL 5.6版本之前存在一个bug,即当sync_binlog=1/innodb-flush-log-at-trx-commit=1时,会使得InnoDB存储引擎的group commit失效,导致性能急剧下降,crash-safe slave的问题更复杂些,主要replication中的SQL thread和IO thread 原子性问题,这里不再累述,MySQL 5.6版本通过将relay-info.log的信息保存在InnoDB的事务表中解决了这个问题。因此,华云RDS目前只在MySQL 5.6版本中启用复制功能。
后续
关于高可用:市场上主流RDS HA 采用双机热备架构,一台主机宕机另一台快速接管服务,并保持对外IP不变。这种架构最为传统,也被生产环境证明可以解决部分高可用的问题。只是那令人头疼的脑裂问题如何解决或者有效缓解,脑裂情况下数据可靠性是否有保证?从公开的资料看,目前市场上RDS HA产品并没有回答这一问题。
关于读写分离:传统方案通过部署proxy节点来接管数据库的访问,自然的,proxy节点的性能很容易成为整个集群的瓶颈,
并且重新引入了单点故障的问题,不可避免又需要引入proxy HA架构,此时脑裂问题又无法完全避免。有没有一种方案可以有效解决这些问题?
敬请关注华云RDS后续版本。希望试用华云关系型数据库服务(RDS)?