一步一步,雄辩。大并发大吞吐的互联网分层架构一般是什么?数据库上层有一个微服务。服务层记录“业务库”和“数据库实例配置”的映射关系,通过数据库连接池Routesql语句到数据库。如上图所示,服务层配置用户库user对应的数据库实例ip。画外音:其实就是一个内网域名。这种分层架构是如何处理数据库的高可用的呢?数据库的高可用是一种很常见的方式,采用双主同步+keepalived+虚拟ip。如上图所示,相互同步的两个主库使用同一个虚拟ip。当主库挂掉时,虚拟IP会自动漂移到另一个主库,整个过程对调用者是透明的,通过这种方式保证数据库的高可用。画外音:关于高可用,《互联网分层架构如何保证“高可用“?》已经在专题中介绍过了,本文不再赘述。这种分层架构如何应对数据量的突然增加?随着数据量的增加,需要对数据库进行水平切分。数据库划分后,将数据分布到不同的数据库实例(甚至物理机),以减少数据扩容的目的,提升性能。如上图所示,用户库user分布在ip0和ip1两个实例上,服务层使用用户iduid取模进行库搜索路由。模2大于0访问ip0上的用户库,模2大于1访问ip1上的用户库。画外音:至此,水平分片集群的读写实例翻倍,单实例数据量减半,性能可提升一倍以上。总结以上三点,大数据量高可用的互联网微服务分层架构如下:既有横向切分,又能保证高可用。如果数据量继续增加,两个数据库的性能无法处理,怎么办?此时,需要继续水平拆分成更多的数据库,减少单个数据库的数据量,增加主数据库(机器)的实例数,提升性能。一个新的问题出现了。分成n个数据库后,随着数据量的增加,需要增加到2*n个数据库。如何扩容数据库,数据能否顺利迁移,能否继续对外提供服务,保证服务的可用性?画外音:你遇到过类似的问题吗?暂停服务扩展是最容易想到的解决方案?在讨论二级平滑扩容方案之前,先简单说明一下停服扩容方案的步骤:本站挂出公告“为服务广大广大用户提供更好的服务,本站/游戏将于00时至:今晚00-2:00,届时用户将无法登录,用户心知肚明”;画外音:看到这样的公告了吗,其实是在迁移数据。微服务停止服务,数据库不再有流量写入;创建2*n个新库并使它们高度可用;写一个数据迁移的小脚本,从n个库中选择数据,插入到2*n修改微服务的数据库路由配置,模n变成模2*n;重启微服务,连接新的数据库,重新对外提供服务;整个过程中最耗时的一步是数据迁移的第四步。如果出现问题,如何回滚?如果数据迁移失败,或者迁移后测试失败,只需将配置改回旧数据库并恢复服务即可。暂停计划的优缺点是什么?优点:简单。缺点:需要停止服务,解决方案不高可用;技术类的学生压力很大,所有的作业都要在规定的时间内完成。根据经验,压力越大,越容易犯错误;画外音:这是致命的。如果有问题,第一时间不checkout,启动服务,运行一段时间后,一旦有问题,回滚就很难了。如果回滚文件,会丢失部分数据;有没有秒级实现,更流畅,更帅气的方案?什么?我们再看一下扩容前的架构,分成两个数据库,假设每个数据库的数据量都是1亿。如何平滑扩容、增加实例数、减少单个数据库的数据量?三个简单的步骤。第一步:修改配置。主要有两个修改:数据库实例所在机器双虚拟ip:原来%2=0的库是虚拟ip0,现在增加一个虚拟ip00;%2=1的原库是虚拟ip1,现在增加一个虚拟ip11;修改服务配置,将2个库的数据库配置修改为4个库的数据库配置。修改时注意旧库和新库的映射关系:%2=0库会变成%4=0和%4=2;%2=1的部分会变成%4=1和%4=3;画外音:这可以确保仍然路由正确的数据。第2步:重新加载配置并扩展实例。服务层reload配置,reload可能有几种方式:比较原始,重启服务,读取新的配置文件;更高级一点,配置中心向服务发送信号,重新读取配置文件,重新初始化数据库连接池;不管怎样,reload之后,数据库实例的扩容就完成了。原来是两个数据库实例提供服务,现在是四个数据库实例提供服务。这个过程一般可以在几秒钟内完成。整个过程可以一步步重启,完全不影响服务的正确性和可用性:即使%2库搜索和%4库搜索同时存在,也不会影响数据的正确性,因为此时双主数据还在同步;即使%4=0和%4=2的库搜索落在同一个数据库实例上,也不影响数据的正确性,因为此时双主数据还在同步;实例扩容完成后,会发现各个数据库的数据量依然没有减少,所以第三步还需要做一些收尾工作。画外音:这一步,数据库实例的数量增加了一倍。第三步:收尾工作,数据收缩。有一些收尾工作:将双虚拟ip改回单虚拟ip;去掉旧的双主同步,这样paireddatabase的数据就不会再同步增加;添加新的双主同步以确保高可用性;删除冗余数据,例如:删除ip0中%4=2的所有数据,只提供%4=0的数据;画外音:这一步,数据库单实例的数据量减半。总结互联网大数据量、高吞吐量、高可用的微服务分层架构,实现数据库秒级平滑扩容的三个步骤如下:修改配置(双虚拟ip,微服务数据库路由);重新加载配置,实例翻倍;完成删除冗余数据等工作,数据量减半;想法比结论更重要,希望大家有所收获。【本文为专栏作者《58神剑》原创稿件,转载请联系原作者】点此阅读更多该作者好文
