4)多可用区容灾。云数据库默认跨三机房(AZ)部署,也对用户透明,任意一个机房挂掉也不会对服务产生任何影响;同时也可以支持跨多地域,两地三中心等模式。比如北京、上海、深圳各有一个节点,业务采取就近接入的方式来降低业务访问元数据的时延。
弹性伸缩很多时候,业务的访问呈现很明显的周期性或者不均匀的特征,比如外卖类业务属于饭点时高峰期,其他时段访问较少;游戏类业务属于晚上及周末高峰期,上班时间较少;还有一些电商类业务属于遇到特殊时间点(双十一,618)做活动大促时是高峰期等等。
如果按照传统的数据库运维模式,需要提前预估量级,然后运维执行扩容,等活动结束后再缩容回来(不然成本是个问题)。那么在小程序的场景,既然要做到用户对后端服务无感知,那么资源的扩缩容也应当不被感受到。
基于这个出发点,我们实现了云数据库的弹性伸缩。依赖管控系统的负载监控模块,我们可以动态地调整数据库的资源,并且自动调整敏感度,来有效应对数据库负载突增的情况,在负载低的时候也可以将资源释放提供给其他更需要的实例。其次,为了避免单个大查询引起的频繁调整,我们设置了滑动窗口和“去毛刺”机制,保证了弹性伸缩尽可能平滑地进行。
当实例状态发生变更(比如免费-->付费,冷-->热)的时候,可能会需要进行数据迁移,比如从性能较差的机器迁移到性能较好的机器上。
有了接入层的配合,我们实现了用户无感知的数据库热迁移。可以实现在不停服的情况下将用户的数据从一个数据库无损地迁移到另一个数据库。
为了进一步减少后台侧的运维操作,我们实现了自动化运维平台。通过对运行时的存储节点状态的监控,对每个节点进行探活及故障判断,然后在决策中心根据故障的统计结果进行相应的自动化运维操作(比如磁盘只读了则强制切主)同时也会告警给运维人员,确保自动化运维结果正确。
对于一部分自动化运维没办法覆盖的问题,我们有各个层面和维度(机器、实例、节点等)全套的秒级监控,各项指标共计69+项,后端可以实时感知到数据库的状态;发现问题尽早处理。
索引是数据库中非常重要的概念,用于加速数据库的查找。在小程序的场景下,我们希望将用户对于后端的数据库的认知降低到越少越好。于是实现了一系列查询优化的功能,比如自动建索引。
当我们的接入层和存储层发现用户有很多查询到后端都是全表扫描时,就会根据用户的query具体字段进行对应索引的添加工作。等到索引建立完成,用户就可以直接享受优化后的查询结果。重要的是,这一过程用户同样也是无感知的。
使用基础读写能力,实现查询商品列表
使用聚合搜索,实现对商品列表的排序
使用云开发数据库的事务能力,实现下单时查询、扣除商品数量。