前言:本文概述Vitess架构,如需了解更多信息,请在文章底部查看参考资料。本文基于笔者研究,可能与具体实践情况有所差异。
从前,三个PayPal前员工决定建立一个约会网站,然而他们的商业模式失败了。
因此他们转而创建了一个视频共享网站,并将其命名为YouTube。
他们将视频标题、描述和用户数据存储在MySQL中。随着用户增加,他们采用领导者-追随者(Leader-Follower)复制拓扑设置 MySQL 来扩展。
MySQL 中的领导者-追随者复制拓扑
MySQL中的复制是单线程的,因此,追随者无法跟上领导者的极端写入操作的新数据。
YouTube的增长速度是爆炸性的,其用户数达到惊人的十亿,成为世界上访问量第二大的网站。
因此,他们通过添加缓存进行了横向扩展,并预加载了MySQL二进制日志中的所有事件。这意味着复制变得受内存限制,速度更快。
尽管这暂时解决了他们的可扩展性问题,但新的问题又出现了,比如:
1. 分片
MySQL必须分区以处理存储需求,但在分片后,事务和连接就会变得困难,因此应该使用应用程序逻辑处理。
这意味着应用程序逻辑应该找到要查询的分片,这会增加停机的可能性。
2. 性能
领导者-跟随者复制拓扑导致从跟随者读取陈旧数据,因此,如果需要新鲜数据,应用逻辑必须将读取路由到领导者。
这需要额外的逻辑实现。
3. 保护
有些查询可能需要太长时间才能返回数据,同时,太多的MySQL连接可能存在问题,会使数据库崩溃。
MySQL
他们希望在MySQL之上建立一个抽象层,实现简单性和可扩展性,因此,他们创建了Vitess。
以下是Vitess提供极端可扩展性的方式:
1. 与数据库交互
他们在每个MySQL实例前安装了一个边车(sidecar)服务器,并称之为VTTablet。
VTTablet作为边车服务器运行
作用:
2. 路由SQL查询
设置了一个无状态代理服务器来路由查询,并称之为VTGate。
VTGate将查询路由到特定分片
作用:
使用多个VTGate服务器进行扩展
同时运行多个VTGate服务器来实现扩展。
3. 状态信息
设置了一个分布式键值数据库来存储有关模式、分片方案和角色的信息。
存储元信息的键值数据库
键值数据库还处理数据库之间的关系,如领导者和跟随者。
YouTube使用Zookeeper来实现键值数据库,并将这些数据缓存在VTGate上以获得更好的性能。
更新键值数据库
他们运行了一个HTTP服务器来保持键值数据库更新,并称之为VTctld。它获取所有服务器及其关系的完整列表,然后更新键值数据库。
总结
Vitess的高级架构
YouTube工程师们用Go编写了Vitess并将其开源,并支持MariaDB。
YouTube通过Vitess+MySQL组合就能服务24.9亿用户,该案例研究表明,MySQL可以轻松处理互联网规模的流量。
>>>>
参考资料
扫码关注腾讯云开发者
领取腾讯云代金券
Copyright © 2013 - 2025 Tencent Cloud. All Rights Reserved. 腾讯云 版权所有
深圳市腾讯计算机系统有限公司 ICP备案/许可证号:粤B2-20090059 深公网安备号 44030502008569
腾讯云计算(北京)有限责任公司 京ICP证150476号 | 京ICP备11018762号 | 京公网安备号11010802020287
Copyright © 2013 - 2025 Tencent Cloud.
All Rights Reserved. 腾讯云 版权所有