云数据库服务是云平台不可或缺的重要组成部分,它承载着用户重要关系型数据落地,数据分拆,无缝扩容等重要功能,而RDS(Relation Database Service)服务本身各家都有不同的实现,本文尝试分析京东共享型的云数据库的一些特点,架构及技术实现相关的内容。
通常RDS服务提供商对每个用户的数据库申请会为其单独分配一台数据库实例,通常这个实例也是单独建立在一台或者多台虚拟机上的,这种服务提供方式可以提供相对高性能的解决方案,但是存在一个问题,如果为每个用户的实例背后都是一个或者多个虚拟机的话,必然会导致总体成本的提高,而这种成本上的增加通常也不是必要的,因为大多数中小型的业务是完全可以跑在同一个数据库实例里的。这样也就可以帮助那些中小开发者们大大的节省了成本问题,最终做到一个月几块钱的创业成本。另外也会存在一部分业务数据量和访问量都比较大,不适合同其他用户一起跑在同一个数据库实例里,这部分用户就比较合适独立一个数据库的实例。京东云数据库考虑到了这两种不同的需求,所以单独开发了共享型云数据库平台,独享型数据库平台两套系统,同时又支持无缝地从一个平台迁移到另一个平台上。
共享型云数据库最大的特点就是低成本,同时又不会牺牲数据库的可用性和可靠性,即使很多个用户共享同一个数据库实例,每个用户也都是有自己单独独立的备份,主从互备等支持。 这种方案的几个技术上的关键点在于如何做到用户资源的有效隔离,数据库的平滑扩容升级等。
京东共享型云数据库架构
1.Shared RDS API对外提供create/delete/describe等管理共享型数据库的接口
2.对于创建数据库Shared RDS API会根据DB资源池负载信息选择一个适合的实例为用户创建数据库,并更新集群路由到JManager
3.JManager管理整个集群路由信息,收到的任何路由变更同步到JProxy路由节点
4.JProxy路由节点对外提供透明的MySQL代理服务,根据路由信息将用户请求发送到用户所在的数据库实例上
5.每个数据库实例根据资源使用情况超过指定阈值,会由JTransfer模块将数据迁移到空闲的实例上
6.Cron模块定时通过RDS API动态为资源池增加空闲资源
此外,京东共享型的云数据库做到了以下关键技术实现:
1. 租户隔离。多个租户共享同一数据库实例必然需要一个有效的隔离方案,防止一个用户的慢查询请求或恶意请求影响其他用户访问。这里的隔离实现方式是通过JProxy层对用户所有的访问进行了拦截,并根据用户访问的数据表索引信息等,对用户执行该请求所需资源进行预判,并拦截掉恶意的请求及影响其他用户的请求。同时为了精确控制每个用户的资源使用,整个系统针对用户使用的连接数,内存占用容量,磁盘空间使用情况,带宽流量等都做了有效的记录和监控并根据用户的配额进行控制。
2. 集群路由信息高一致性保障。整体集群采用经典的弱中心化集群结构,在满足集群高性能的基础上同时具备足够的可控性,JManager管理整个集群路由信息,并通过多个Slave避免单点故障,当路由变更时,JManager首先同步路由变更信息给自己的Slave,然后才会同步所有的JProxy,避免路由变更时JManager挂掉导致路由不一致。
3. 高可用保障。整体集群所有节点无单点,用户的数据库会通过zookeeper做主从的高可用,如果用户主库挂掉,会自动切换至从库,并重新绑定floating ip到从库,不会影响对用户的服务
4. 用户数据库无缝升级扩容。当用户的数据库数据增长超过指定配额时,用户可以选择升级数据库,系统会自动根据资源池使用情况将用户数据库迁移到比较空闲的实例上,迁移过程中并不会影响用户的服务。通过定时自动为用户数据库做快照的方式,结合数据库binlog同步工具,来帮助用户实现增量备份,迁移的工作也是依赖于以上这些工具完成的。
共享型云数据库是为降低开发者成本而生,同时提供服务高可用和数据高可靠的保障,这和京东云擎的服务对象是一致的。共享型云数据库实现关键技术在于资源隔离,访问控制及数据库无缝扩容升级等工作。对于创业初期数据量和访问量都不大的业务开发者来说,共享型云数据库是一个非常不错的选择。