加入收藏 | 设为首页 | 会员中心 | 我要投稿 湖南网 (https://www.hunanwang.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程 > 正文

英国《卫报》是怎样不断机从MongoDB迁徙到Postgres?

发布时间:2019-01-18 10:49:34 所属栏目:编程 来源:佚名
导读:这篇文章先容了英国《卫报Guardian》为什么和怎样从Mongo迁徙到Postgres,英国卫报大部门内容 - 包罗文章,及时博客,画廊和视频内容 - 都是内部CMS器材Composer中建造的。直到最近一向获得了在AWS上运行的Mongo DB数据库的支持。这个Mongo DB数据库是Guar

思量到这一点,我们必要一个剧本,可以:

  • 发出HTTP哀求。
  • 确保在迁徙一段内容后,两个API的相应都匹配。
  • 假如呈现错误则遏制。
  • 天生具体日记以辅佐诊断题目。
  • 产生错误后从正确的点从头启动。

我们开始行使Ammonite,

Ammonite应承您在Scala中编写剧本,Scala是我们团队的首要说话。这是一个很好的机遇,可以实行我们之前没有效过的对象,看看它对我们是否有效。固然Ammonite应承我们行使认识的说话,但也有弱点。固然Intellij此刻支持Ammonite,但其时它没有,这意味着我们失去了自动完成和自动导入。也不行能长时刻运行Ammonite剧本。

最终,Ammonite不是正确的器材,我们行使sbt项目来执行迁徙。我们回收的要领应承我们行使我们自信的说话事变并执行多次“测试迁徙”,直到我们有信念在出产中运行它。

快进到2017年1月,是时辰在我们的预出产情形CODE中测试完备的迁徙了。

与我们的大大都体系相同,CODE和PROD之间独一的相似之处是它们运行的​​应用措施的版本。支持CODE情形的AWS基本架构远没有PROD那么强盛,由于它的行使率要低得多。

在CODE上运行迁徙将有助于我们:

  • 预计PROD上的迁徙必要多长时刻。
  • 评估迁徙对机能的影响(假若有的话)。

为了精确权衡这些指标,我们必需匹配这两个情形。这包罗将PROD mongo数据库的备份还原到CODE并更新AWS支持的基本架构。

迁徙高出200万项内容必要很长时刻,虽然比办公时刻更长。以是我们一夜之间在屏幕上运行剧本。

为了权衡迁徙的进度,我们将布局化日记(行使标志)发送到ELK仓库。从这里,我们可以建设具体的仪表板,跟踪乐成迁徙的文章数目,失败次数和总体进度。另外,这些表现在团队四面的大屏幕上,以提供更大的可见性。

迁徙完成后,我们回收沟通的技能搜查Postgres匹配的Mongo中的每个文档。

第三部门 - 署理和出产中的运行

此刻,新的Postgres驱动的API正在运行,我们必要行使现实流量和数据会见模式对其举办测试,以确保其靠得住和不变。有两种也许的要领可以实现这一点:更新与Mongo API通讯的每个客户端以与两个API通讯; 或运行署理,这样做。我们行使Akka Streams在Scala中编写了一个署理。

署理操纵相等简朴:

  • 接管来自负载平衡器的流量。
  • 将流量转发到主api并返回。
  • 异步将沟通的流量转发到帮助api。
  • 计较两个相应之间的任何差别并记录它们。

一开始,署理在两个API的相应之间记录了许多差别,在必要修复的API中呈现了一些很是玄妙但重要的举动差别。

布局化日记记录

我们在Guardian长举办日记记录的方法是行使ELK仓库。行使Kibana使我们可以或许机动地以对我们最有效的方法表现日记。Kibana行使相等轻易进修的lucene查询语法。但我们很如意识到,在当前配置中无法过滤掉日记或对其举办分组。譬喻,我们无法过滤掉因GET哀求而发送的日记。

我们的办理方案是向Kibana发送更多布局化日记,而不是仅发送动静。一个日记条目包括多个字段,譬喻时刻戳,发送日记或仓库的应用措施的名称。以编程方法添加新字段很是简朴。这些布局化字段称为标志,可以行使logstash-logback-encoder库实现。对付每个哀求,我们提取了有效的信息(譬喻路径,要领,状态代码),并建设了一个包括我们记录所需的附加信息的舆图。看看下面的例子。

  1. object Logging { 
  2.  val rootLogger: LogbackLogger = LoggerFactory.getLogger(SLFLogger.ROOT_LOGGER_NAME).asInstanceOf[LogbackLogger] 
  3.  
  4.  private def setMarkers(request: HttpRequest) = { 
  5.    val markers = Map( 
  6.      "path" -> request.uri.path.toString(), 
  7.      "method" -> request.method.value 
  8.    ) 
  9.    Markers.appendEntries(markers.asJava) 
  10.  } 
  11.  
  12.  def infoWithMarkers(message: String, akkaRequest: HttpRequest) = 
  13.    rootLogger.info(setMarkers(akkaRequest), message) 

我们日记中的附加布局应承我们构建有效的仪表板并在我们的差别中添加更多上下文,这有助于我们辨认API之间的一些较小的纷歧致。

复制流量和署理重构:

将内容迁徙到CODE数据库后,我们最终获得了险些完全沟通的PROD数据库副本。首要区别是CODE没有流量。为了将现实流量复制到CODE情形中,我们行使了一个名为GoReplay(gor)的开源器材。它的配置很是简朴,可按照您的要求举办定制。

因为进入我们的API的全部流量起首到达了署理,因此在署理处事器上安装gor是故意义的。请参阅下文,相识如安在您的盒子上下载gor以及怎样开始捕捉端口80上的流量并将其发送到另一台处事器。

  1. wget https://github.com/buger/goreplay/releases/download/v0.16.0.2/gor_0.16.0_x64.tar.gz  
  2. tar -xzf gor_0.16.0_x64.tar.gz gor  
  3. sudo gor --input-raw :80 --output-http http://apiv2.code.co.uk 

统统都运行精采一段时刻,但很快我们的署理几分钟时就碰着了出产间断。颠末观测,我们发明署理运行的全部三个盒子同时轮回。我们猜疑gor行使了太多资源并导致署理失败。在进一法式查中,我们在AWS节制台中发明这些盒子已经按期轮回,但不是在统一时刻。

(编辑:湖南网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

热点阅读