当前位置: 首页 > 科技观察

如何在几分钟内构建可扩展且高可用的GraphQLAPI

时间:2023-03-16 18:54:23 科技观察

谭健审稿人|SunShujuan梁策对于云原生应用,一个现代的GraphQLAPI层需要具备两个特性:横向扩展和高可用。例如,向运行API层的现有机器添加更多CPU、内存和其他资源就是垂直可扩展性。横向可扩展性将为您的API基础架构添加更多设备。垂直扩展主要是为了实现特定的扩展,具有水平扩展能力的API层可以发挥超越单机的能力。当谈到高可用性时,GraphQL层需要继续无错误地运行(即使在一些我们无法控制的意外情况下)。这是判断一个系统是否具备99.999%高可用特性的最佳考核指标。本文将向您介绍:如何使用一个基础数据库,在几分钟内快速搭建一个跨越同一公有云区域多个可用区的GraphQL层。由此产生的解决方案将跨越多个可用性区域,在区域级故障中幸存下来,并水平扩展。下面我们以AWS、HasuraCloud、YugabyteCloud为参考平台进行案例演示。跨多个可用性区域部署YugabyteDB从数据库层开始。我们选择YugabyteDB——一个开源的分布式SQL数据库。它是可扩展且可快速恢复的API的理想支持服务。YugabyteDB也是一个符合PostgreSQL语法习惯的数据库。这意味着我们不需要学习另一种SQL方言或从头开始重写现有应用程序。那么部署一个弹性的、多区域的YugabyteDB集群需要多少时间呢?这取决于,但如果你像我一样懒惰,或者更喜欢直接使用云原生服务,那么YugabyteCloud将是完成此任务的最简单方法:1.首先,创建或注册你的Yugabyte云帐户。2.然后,准备一个跨越多个可用区域的多节点YugabyteDB集群:选择一个自定义的集群名称,例如multi-zone-cluster,并将集群服务放在离你最近的AWS区域(对我来说,N.Virginia-us-east-1是最近的),然后确保设置容错参数到可用区级别。b.单击下载凭据以下载证书。然后点击“创建集群”。那么我们如何使用YugabyteDB来实现高可用呢?该集群具有三个节点,并部署在三个可用性区域之一。备份因子也设置为3。这意味着每个节点(实际上在每个区域中)都维护数据记录的副本。在我的例子中,us-east-1b、us-east-1c、us-east-1a各有一个节点:节点YugabyteDB基于Raft共识协议。因此,根据目前三个节点的配置,我们可以将其作为一个节点(或者说,一个可用区——只要每个分片中都有一个节点)发布,这个节点仍然是可运行的。为什么YugabyteDB不选择只用一个节点来处理请求服务呢?根据CAP定理(也称为Brewer定理),YugabyteDB是一个遵循一致性和分区容错性(CP)的数据库。下面的公式定义了容错变量K和备份因子RF之间的依赖关系:RF=(2k+1)在我的例子中,K=1(意思是,集群可以作为1个节点被释放),因此,RF的结果为3(数据的3个副本)。问题来了,如果数据库需要处理100倍的查询或者存储更多的数据,我们如何使用YugabyteDB来完成横向扩展呢?只需在集群的设置界面中为基础设施添加更多节点即可。构建可扩展且弹性的HasuraGraphQL层Hasura是一种高级GraphQL服务器,可提供基于PostgreSQL方言兼容数据库(例如YugabyteDB)的快速实时GraphQLAPI。Hasura有一个完全可管理的云版本。创建一个具有水平可扩展性和高可用性的Hasura项目,开箱即用:创建或登录您的HasuraCloud帐户;创建一个标准层项目:选择一个AWS切片,类似于部署YugabyteDB-在我的例子中,它是美国东部(弗吉尼亚北部)。单击创建项目按钮继续部署操作。正如我们所见,Hasura没有任何与可扩展性或区域级别可用性相关的设置。那么,在可能出现区域性故障或者需要横向扩展的时候,如何保证API层能够继续运行呢?其实只要我们选择了StandardTier,这两个功能就可以使用了。这就是Hasura在文档中所说的:水平扩展:HasuraCloud可以自动扩展您的应用程序,而不管实例、内核、内存或阈值的数量。您可以不断增加并发用户数和API调用数,同时哈修罗云会自动为您优化。**高可用性:**Hasura的多个实例可以在graphql引擎上运行。在HasuraCloud中,无需人工干预即可安排自动化扩展过程和支持运营所需的基础架构。Hasura对接YugabyteDB至此,我们已经部署了一个HasuraGraphQL层和YugabyteDB集群,可以支持区域级别的水平扩展和突发故障。剩下要做的就是连接这两个组件,为我们的应用程序提供最终解决方案。将Hasura加入YugabyteDB白名单YugabyteDB集群实例需要我们设置被访问数据库的应用IP地址。这对我们的Hasura实例来说并不困难。将HasuraCloudIP添加到YugabyteCloud终端的允许IP列表中:从您的Hasura项目界面复制HasuraCloudIP。转到YugabyteDBCloud并将IP添加到IP允许列表。建立连接授权Hasura访问YugabyteDB实例后,我们需要在两个服务之间建立连接。这需要两个步骤:1.打开YugabyteCloud,然后复制一个链接URL:点击Connect按钮并选择ConnecttoyourApplication选项。检查优化。复制链接YSQL(YugabyteSQL)的唯一URL。确保将数据库用户和密码替换为您之前从YugabyteDB集群部署步骤下载的证书中的信息。3、进入Hasura云,与YugabyteDB建立连接:点击LaunchConsole按钮,跳转到Data&Schema管理界面。填写YugabyteDB链接参数,建立链接。单击“连接数据库”按钮以建立链接。我们刚刚完成了一个GraphqlAPI层的搭建,可以支持区域级故障和水平扩展能力。现在,让我们对一些示例数据和请求进行健全性测试。创建示例数据库按照以下步骤在YugabyteDB中创建用户表和消息表:1.在YugabyteDB云终端中,单击启动CloudShell。2.创建用户表Users和消息表Messages:3.SQL:CREATESEQUENCEusers_pk_seqCACHE100;CREATESEQUENCEmessages_pk_seqCACHE100;CREATETABLEUsers(idintNOTNULLDEFAULTnextval('users_pk_seq'),nametext,ageint,citytext,PRIMARYKEY(;CREATETABLEMessages(idintNOTNULLDEFAULTnextval('messages_pk_seq'),sender_idintREFERENCESUsers(id),recipient_idintREFERENCESUsers(id),payloadtext,PRIMARYKEY(id));4.最后初始化user表,创建两条记录:SQL:INSERTINTOUSERS(name,age,city)VALUES('John',35,'Austin'),('Mark',36,'Seattle');使用GraphQL查询数据并将示例数据库加载到YugabyteDB中,我们可以体验一下方便Hasura提供的GraphQLAPI层将数据表暴露给GraphQL层即使Hasura自动检测数据库端的结构变化,我们仍然需要明确指定哪些表可以通过GraphQLAPI查询:1.OpenData&Schema在Hasura控制台中进行管理。2、点击TrackAll按钮,通过YugabyteDBAPI显示两张数据表:3、最后点击Track按钮,建立消息表到用户表的外键关系:查询数据接下来我们使用GraphQL读取用户表中记录:1.打开HasuraConsole界面的ApiExplorer选项卡:2.查询所有用户:query{users{idnameagecity}}3.最后确认输出如下:{"data":{"users":[{"id":1,"name":"John","age":35,"city":"Austin"},{"id":2,"name":"Mark","age":36,"city":"Seattle"}]}}更新数据最后,让我们确认我们的GraphQLAPI可以顺利处理写入问题。1.使用以下GraphQL变体语法向数据库添加一条消息记录:mutation{insert_messages_one(object:{recipient_id:2,sender_id:1,payload:"Hi,Mark!Howareyoudoing?"}){id}}2。从YugabyteDB中反向读取消息:query{messages{payloaduserBySenderId{namecity}user{namecity}}}3.确认输出如下:{"data":{"messages":[{"payload":"嗨,马克!你好吗?","userBySenderId":{"name":"John","city":"Austin"},"user":{"name":"Mark","city":"Seattle"}}]}}结论正如我们在本文中看到的,正确集成现代云原生服务可以构建一个水平可扩展且高度可用的GraphQLAPI层。几分钟后,我们就有了一个API层,可以处理请求的增加并将其容量从10GB扩展到100GB甚至更多。此外,最重要的是,即使面对突然的区域级故障,它也可以继续为应用程序请求提供服务。最后,如果您的GraphQLAPI层需要跨多个具有分片级突发容错的云分片工作,您仍然可以使用Hasura和YugabyteDB。目前,此功能可作为自我管理的安装选项使用(参见YugabyteDB多区域部署)。相信在不久的将来,它也会朝着全托管版本技术的方向发展。译者介绍,谭健毕业于广东财经大学,现在个体户。喜欢编程、外语、阅读。原标题:HowToSetUpaScalableandHigh-AvailableGraphQLAPIinMinutes,作者:DenisMagda