1.起源(1)大并发大流量的互联网架构。一般来说,在数据库的上层有一个服务层,服务层记录“业务数据库名称”和“数据库实例”之间的映射关系,通过数据库连接池将sql语句路由到数据库执行:如上图所示:服务层配置用户库user对应的数据库实例的物理位置为ip(其实是一个内网域名)。(2)随着数据量的增加,需要对数据进行水平拆分。分库后,将数据分布到不同的数据库实例(甚至物理机),达到减少数据量,增强性能的目的:如上图所示:用户库用户分布在两个实例上,ip0和ip1,service层通过用户iduid取模进行库查找路由,取模2大于0访问ip0上的用户库,取模2大于1访问ip1上的用户库用户库。更多关于数据库水平切分和垂直切分的详细介绍,详见《一分钟掌握数据库垂直拆分》。(3)互联网架构需要保证数据库的高可用。一种常见的方式是采用双主同步+keepalived+虚拟ip来保证数据库的可用性:如上图所示:两个相互同步的主库使用同一个虚拟ip。如上图:当主库挂掉后,虚拟IP会自动漂移到另一个主库,整个过程对调用者是透明的。这样就保证了数据库的高可用。有关高可用性的更多详细信息,请参阅《究竟啥才是互联网架构“高可用”》。(4)结合上面的(2)和(3),实际的线上架构既有水平切分又有高可用的保证,所以实际的数据库架构是这样的:问题:如果数据量不断增加,性能两个数据库搞不定,怎么办?答:继续水平拆分,拆分成更多的数据库,减少单个数据库的数据量,增加主库的实例(机器)数量,提高性能。最后抛出一个问题:分到x个库后,随着数据量的增加,需要增加到y个库。在数据库扩容的过程中,能否顺利对外提供服务,保证服务的可用性,是本文要探讨的问题。二、停服方案在讨论平滑方案之前,先简单说明一下“x库拆y库”的停服方案:(1)本站挂出公告“为了给广大用户提供更好的服务,本站/game今晚00:00-2:00升级,届时将无法登录,用户心知肚明”(2)停止服务(3)新建数据库高可用(4)数据迁移,重新分配,写一个数据迁移程序,从x库导入到y库,路由规则由%x升级为%y(5)修改服务配置,原x线配置升级为y第(6)行重启服务,连接新库在整个重新对外提供服务的过程中,数据迁移的第四步是最耗时的。回滚方案:如果数据迁移失败,或者迁移后测试失败,将配置改回x库,恢复服务,改天发布公告。方案优点:方案简单缺点:(1)停止服务,可用性不高(2)技术同学压力大,必须在规定时间内完成所有工作。根据经验,压力越大,越容易出错(这个是致命的)(3)如果有问题,***时间没有检查出来,启动服务,运行一段时间后的时间,发现有问题,回滚困难,需要回滚,可能会丢失部分数据。有更流畅的解决方案吗?3.二级,流畅,帅气的解决方案再看一下扩容前的架构,分成两个数据库,假设每个数据库的数据量都是1亿。如何平滑扩容、增加实例数、减少单个数据库的数据量?三个简单的步骤。(1)修改配置,主要修改两处:a)数据库实例所在机器有双虚拟ip。%2=0的原库是虚拟ip0。现在添加一个虚拟ip00,另外一个%2=1的库同b。)修改服务的配置(无论是在配置文件还是在配置中心),将2库的数据库配置改为4库的数据库配置,注意旧库与新库的映射关系修改时努力工作:%2=0的库将变为%4=0和%4=2;%2=1的部分将变为%4=1和%4=3;这个修改是为了保证拆分路由到正确的数据后仍然可以使用。(2)重新加载配置,实例扩展服务层重新加载配置,重新加载可能有几种方式:a)比较原始,重启服务,并读取新的配置文件b)更高级的,配置中心向服务发送信号,并重新读取配置文件,重新初始化数据库连接池无论使用哪种方式,reload之后,数据库实例的扩容都完成了。以前是2个数据库实例提供服务,现在变成4个数据库实例提供服务。这个过程一般可以在几秒钟内完成。整个过程可以一步步重启,完全不影响服务的正确性和可用性:a)即使%2库搜索和%4库搜索同时存在,也不会影响数据的正确性受影响,因为此时双主数据还在同步b)重新加载服务前,不对外提供服务。冗余服务可以保证高可用性。实例扩容完成后,会发现各个数据库的数据量并没有减少,所以第三步还需要做一些收尾工作。(3)收尾工作,数据收缩有这些收尾工作:a)将双虚拟ip改回单虚拟ipb)解除旧的双主同步,这样paireddatabase的数据就不会再同步增加c)新增双主Synchronize,保证高可用d)删除冗余数据,例如:删除ip0中%4=2的所有数据,只为%4=0的数据提供服务这样,数据每个数据库的体积都会减少到原来的一半,数据收缩完成。4.小结这个帅气的方案可以实现n个数据库和2n个数据库的秒级平滑扩容,增加数据库服务能力,单个数据库的数据量减少一半。核心原则是:双重扩容,避免数据迁移。迁移步骤:(1)修改配置(2)重新加载配置,实例扩容完成(3)删除冗余数据等收尾工作,数据缩容完成】点此查看作者更多好文章
