亚搏在线登陆在骚乱运行在线服务:第一部分

我的名字是Jonathan McCaffrey,我在骚乱的基础设施团队上工作。这是一个系列中的第一篇文章,我们将深入了解我们如何部署和操作全球的后端功能。在我们进入技术细节之前,重要的是要了解骚乱者如何考虑特色发展。球员价值在骚乱中是至关重要的,开发团队经常与玩家社区直接工作,以告知功能和改进。为了提供最佳的玩家体验,我们需要快速移动并保持基于反馈快速更改计划的能力。基础设施团队的使命是为开发人员铺平道路,这就是促进骚乱队伍,越快的功能可以向玩家提供享受。

当然,这比做了更容易!鉴于我们部署的多样性性质,我们出现了一系列挑战 - 我们在公共云中的服务器,私人数据中心和像腾讯和Garena这样的合作伙伴环境,所有这些都是在地理上和技术上的多样化。当他们准备发货时,这种复杂性就会造成巨额负担。That’s where the infrastructure team comes in - we’ve recently made progress in removing some of these deployment hurdles with a container-based internal cloud environment that we call ‘rCluster.’ In this article I’ll discuss Riot’s journey from manual deploys to the current world of launching features with rCluster. As an illustration of rCluster’s offerings and technology, I’ll walk through the launch of the Hextech Crafting system.

一点历史

当我7年前在Riot开始时,我们没有大部分部署或服务器管理进程;我们是一个具有重要想法,小预算的初创企业,需要快速移动。随着我们为联盟的生产基础设施进行了建立了基础设施,我们对游戏的需求进行了追加,要求支持我们开发商的更多功能,以及我们区域团队在全球新界发布的需求。我们手动站出服务器和应用程序,几乎没有考虑到指导方针或战略规划。

沿途,我们迈进了杠杆厨师对于许多常见部署和基础架构任务。我们还开始使用越来越多的公共云,为我们的大数据和网络努力。这些演变触发了我们多次网络设计,供应商选择和团队结构的变化。

我们的数据中心包含数千台服务器,其中几乎每种新应用程序安装了新的服务器。新服务器将在自己的手动创建中存在VLAN.使用手动路由和防火墙规则,可在网络之间启用安全访问。虽然这个过程帮助我们安全和明确定义了故障域,但它仍然艰巨而耗时。为了复制这种设计的痛苦,当时的大多数新功能都被设计为小型网络服务,因此我们的生产中的独特应用数量LOL Ecosystem飙升。

在此之上,我们的开发团队对自己的应用程序的能力缺乏信心,特别是当它在部署时的配置和网络连接等问题时。拥有如此密切地绑定到物理基础架构的应用程序意味着生产数据中心环境之间的差异未在QA,暂存和中复制pbe.。每种环境都被手工制作,独特,最终,一贯不一致。

虽然我们在生态系统中进行了这些挑战,但在生态系统中具有越来越多的应用程序,Docker.开始在我们的开发团队中获得人气作为解决配置一致性和开发环境困境的问题的手段。一旦我们开始使用它,就很明显我们可以使用Docker做更多更多,并且它可能在我们接近基础设施的方式发挥关键作用。

季节2016年及以后

基础设施团队为2016年季节的玩家,开发人员和骚乱进行了解决这些问题。到2015年底,我们从手动部署了功能,以便以自动化和一致的方式部署骚乱区域的Hextech制作等功能。我们的解决方案是RCLUSTER - 一个全新的系统,可利用Docker和软件在微服务架构中定义网络。切换到Rcluster会在我们的环境和部署过程中铺平不一致性,并允许产品团队正式关注其产品。

让我们潜入技术有点探讨RCLUSTER如何支持幕后的HEXTECH制作等功能。对于上下文,Hextech制作是联盟中的一个功能,为玩家提供了一种新的方法解锁游戏内容

该功能在内部已知为“Loot”,并且由3个核心组件组成:

  • 战利品服务- 通过HTTP / JSON REST API提供LOOT请求的Java应用程序。

  • Loot Cache.- 使用memcached和一个小的缓存群集戈兰旁章用于监视,配置和启动/停止操作。

  • 抢劫DB.- 具有主设备和多个从站的MySQL DB群集。

当您打开制作屏幕时,这就是会发生什么:

  1. 播放器在客户端打开绘制屏幕。

  2. 客户做了一个RPC.呼叫前端应用程序,AKA“Feapp”在播放器和内部后端服务之间调用。

  3. feapp调用Loot服务器

    1. Feapp在“服务发现”中查找战利品服务,以查找其IP和端口信息。

    2. FeApp使HTTP调用LOOT服务。

    3. Loot Service检查Loot缓存以查看是否存在播放器的库存。

    4. 清单不在缓存中,因此Loot Service调用Loot DB以查看玩家当前拥有的内容并填充高速缓存。

    5. LOOT服务回复了接听电话。

  4. Feapp将RPC响应发送回客户端。

使用Loot团队,我们能够将内置的服务器和缓存图层内置于Docker容器中,以及它们在JSON文件中定义的部署配置,这些配置如下所示:

Loot Server Json示例

{“姓名”:“euw1.loot.lootserver”,“服务”:{“appname”:{loot.lootserver“,”位置“:”lociot.ams1.euw1_loot“},”容器“:[{”图像“:"compet/lootserver", "version": "0.1.10-20160511-1746", "ports": [] } ], "env": [ "LOOT_SERVER_OPTIONS=-Dloot.regions=EUW1", "LOG_FORWARDING=true" ], "count": 12, "cpu": 4, "memory": 6144 }

Loot Cache Json示例

{“姓名”:“euw1.loot.memcached”,“服务”:{“appname”:“loot.memcached”,“位置”:“lociot.ams1.euw1_loot”},“容器”:[{“名称”:"loot.memcached_sidecar", "image": "rcluster/memcached-sidecar", "version": "0.0.65", "ports": [], "env": [ "LOG_FORWARDING=true", "RC_GROUP=loot", "RC_APP=memcached" ] }, { "name": "loot.memcached", "image": "rcluster/memcached", "version": "0.0.65", "ports": [], "env": ["LOG_FORWARDING=true"] } ], "count": 12, "cpu": 1, "memory": 2048 }

但是,为了实际部署此功能 - 并且真正在减轻早期概述的痛苦方面取得了进展 - 我们需要创建可以在北美,欧洲和亚洲等地支持世界各地的Docker的集群。这需要我们解决一堆难题,如:

  • 调度容器

  • 与Docker联系

  • 连续交货

  • 运行动态应用程序

随后的帖子将更详细地潜入rcluster系统的这些组件,因此我将在这里简要地触摸。

安排

我们使用我们写的软件在RCLUSTER生态系统中实施了集装箱调度,我们写得称为海军上将。海军上将与一系列物理机器的Docker Daemons谈判以了解他们当前的现场状态。用户通过HTTPS发送上述JSON来提出请求,该主持人用于更新其对相关容器所需状态的理解。然后,它不断扫描集群的实时和期望状态,以确定所需的行动。最后,海军上将对Docker守护进程进行额外的调用来启动和停止容器,以便在该期望的状态下收敛。

如果集装箱崩溃,海军上将会看到所需的活V可见,并在另一个主机上启动容器以纠正它。这种灵活性使得管理我们的服务器更容易,因为我们可以无缝地“排除”它们,进行维护,然后重新启用它们以获取工作负载。

海军上将类似于开源工具马拉松,我们目前正在调查将我们的工作移植到利用Mesos,Marathon和DC / OS。如果这是果实的,我们将在未来的文章中讨论它。

与Docker联系

一旦容器运行,我们需要在Loot应用程序和生态系统的其他部分之间提供网络连接。为了做到这一点,我们利用了opencontrail.要为每个应用程序提供私有网络,并让我们的开发团队在Github中使用JSON文件管理他们的策略。

LOOT服务器网络:

{“inbound”:[{“source”:“loot.loadbalancer:lolriot.ams1.euw1_loot”,“ports”:[“main”]},{“源”:“riot.offices:globalriot.earth.alloffices”,“端口”:[“main”,“jmx”,“jmx_rmi”,“bproxy”]},{源“:”hmp.metricsd:globalriot.ams1.ams1“,”ports“:[main',“logaUrous”]},{“source”:“platform.gsm:lolriot.ams1.euw1”,“端口”:[“main”]},{“source”:“platform.feapp:lolriot.ams1.euw1”,“端口”:[“main”]},{source“:”platform.beapp:lolriot.ams1.euw1“,”端口“:[”main“]},{”源“:”store.purchase:lolriot.ams1.euw1“,”端口“:[”main“]},{”source“:”pss.psstool:lolriot.ams1.euw1“,”端口“:[”main“]},{”源“:"championmastery.server:lolriot.ams1.euw1", "ports": [ "main" ] }, { "source": "rama.server:lolriot.ams1.euw1", "ports": [ "main" ] } ], "ports": { "bproxy": [ "1301" ], "jmx": [ "23050" ], "jmx_rmi": [ "23051" ], "logasaurous": [ "1065" ], "main": [ "22050" ] } }

Loot缓存网络:

{“Inbound”:[{“source”:“loot.lootserver:lolriot.ams1.euw1_loot”,“端口”:[“memcached”]},{“source”:“riot.offices:globalriot.earth.alloffices”,“端口”:[“sidecar”,“memcached”,“bproxy”,“bproxy”]},{“source”:“hmp.metricsd:globalriot.ams1.ams1”,“端口”:[“sidecar”]},{“源“:”riot.las1build:globalriot.las1.buildfarm“,”端口“:[”sidecar“]}],”端口“:{”sidecar“:{”sidecar“:8080,”memcached“:11211,”bproxy“:1301}}

当工程师在GitHub中更改此配置时,变压器作业运行并使API调用绑定以创建和更新其应用程序的专用网络的策略。

Contrail使用调用的技术实现这些私人网络覆盖网络。在我们的案例中,Contrail使用gr计算主机之间的隧道和网关路由器来管理进入的流量并将覆盖隧道留出,并转到其余的网络。OpenContrail系统受到标准MPLS L3VPN的启发和概念性地非常相似。可以找到更多深度建筑细节这里

当我们实施这个系统时,我们必须解决一些关键挑战:

  • accearail和docker之间的集成

  • 允许其余的网络(在RCLUSTER之外)无缝访问我们的新覆盖网络

  • 允许从一个群集允许应用程序与另一个群集交谈

  • 在AWS之上运行覆盖网络

  • 在覆盖层中构建HA边缘的应用

连续交货

Max Stewart之前发布关于骚乱在持续交付中使用Docker,哪个rcluster也利用了。

对于LOOT应用程序,CI流程如下:

这里的一般目标是,当更改主仓库时,会创建一个新的应用程序容器并部署到QA环境。通过此工作流程,团队可以在其代码上快速迭代,并查看在工作游戏中反映的更改。这种紧密的反馈循环使得可以快速地改进体验,这是骚乱玩家专注于球员的重要目标。

运行动态应用程序

到目前为止,我们通过我们的构建和部署了像Hextech制作,但如果您花了很多时间与这样的容器环境一起使用,那么您就知道这不是整个问题。

在RCLUSTER模型中,容器具有动态IP地址,并且不断上下旋转。这是一个完全不同的范式,而不是我们以前的静态服务器和部署方法,因此需要新的工具和程序是有效的。

提出的一些关键问题是:

  • 如果其容量和端点一直在更改,我们如何监视应用程序?

  • 如果它一直在变化,一个应用程序如何知道另一个的终点?

  • 如果您无法在容器中SSH无法进行SSH,则如何在启动新容器时复位日志?

  • 如果我在构建时烘烤我的容器,我如何配置我的数据库密码等事情,或者为土耳其vs北美切割了哪些选项?

要解决这些问题,我们必须建立一个微服务平台要处理服务发现,配置管理和监控等内容;我们将深入了解有关该系统的更多详细信息以及在我们的最后一系列中,它对我们解决了我们解决的问题。

结论

我希望这篇文章能够概述我们试图解决的问题,以使骚乱更容易提供球员价值。如前所述,我们将遵循这一系列专注于Rcluster使用调度,网络与Docker和运行动态应用程序的文章;由于这些文章被释放,请在此处更新链接。

如果您在类似的旅程中,或者想成为谈话的一部分,我们很乐意在下面的评论中收到您的意见。


有关更多信息,请查看此系列的其余部分:

第一部分:简介(本文)
第二部分:调度
第三部分:带OpenContrail和Docker的网络
第三部分:Part Deux:带OpenContrail和Docker的网络
第四部分:动态应用 - 微服务生态系统
第V部分:动态应用程序 - 开发人员生态系统
第VI部分:产品,而不是服务

发布由Jonathan McCaffrey