如何同步从MongoDB的转换数据与转运到Elasticsearch在Ubuntu 14.04

介绍

Elasticsearch便于您的数据的全文搜索,而MongoDB擅长存储它。 使用MongoDB存储数据和Elasticsearch for search是一种常见的体系结构。

很多时候,您可能会发现需要将数据从MongoDB迁移到Elasticsearch。 为此编写自己的程序虽然是一个很好的练习,但是可能是一项乏味的任务。 有一个美妙的开源工具叫运输车,开发的撰写 (云平台数据库),负责这种工作的关心非常有效。

本教程介绍如何使用开源实用程序Transporter通过自定义转换将数据从MongoDB快速复制到Elasticsearch。

目标

在本文中,我们将介绍如何将数据从MongoDB的复制到Elasticsearch在Ubuntu 14.04使用转运工具。

我们将从快速概述开始,展示如何安装MongoDB和Elasticsearch,虽然我们不会详细介绍两个系统中的数据建模。 如果您已经安装了它们,可以快速浏览安装步骤。

然后我们将转到运输公司。

这些说明与其他版本的Ubuntu以及其他Linux发行版类似。

先决条件

请完成以下先决条件。

  • Ubuntu 14.04 Droplet
  • sudo的用户

第1步 - 安装MongoDB

导入MongoDB存储库的公钥。

sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv 7F0CEB10

为MongoDB创建一个列表文件。

echo 'deb http://downloads-distro.mongodb.org/repo/ubuntu-upstart dist 10gen' | sudo tee /etc/apt/sources.list.d/mongodb.list

重新加载本地包数据库。

sudo apt-get update

安装MongoDB软件包:

sudo apt-get install -y mongodb-org

请注意,每个包都包含相关的版本号。

安装完成后,您可以启动,停止并检查服务的状态。 它将在安装后自动启动。

尝试连接到作为服务运行的MongoDB实例:

mongo

如果它运行,你会看到这样:

MongoDB shell version: 2.6.9
connecting to: test
Welcome to the MongoDB shell.
For interactive help, type "help".
For more comprehensive documentation, see
    http://docs.mongodb.org/
Questions? Try the support group
    http://groups.google.com/group/mongodb-user

这意味着数据库服务器正在运行! 您现在可以退出:

exit

第2步 - 安装Java

Java是Elasticsearch的先决条件。 让我们现在安装它。

首先,添加存储库:

sudo apt-add-repository ppa:webupd8team/java

再次更新您的包列表:

sudo apt-get update

安装Java:

sudo apt-get install oracle-java8-installer

当系统提示您接受许可,选择<Ok> ,然后<Yes>

第3步 - 安装Elasticsearch

现在我们将安装Elasticsearch。

首先,创建一个新目录,您将在其中安装搜索软件,并移动到其中。

mkdir ~/utils
cd ~/utils

访问Elasticsearch的下载页面看到最新的版本。

现在下载最新版本的Elasticsearch。 在写这篇文章的时候,最新的版本是1.5.0。

wget https://download.elasticsearch.org/elasticsearch/elasticsearch/elasticsearch-1.5.0.zip

安装解压缩:

sudo apt-get install unzip

解压缩归档文件:

unzip elasticsearch-1.5.0.zip

导航到您解压缩它的目录:

cd elasticsearch-1.5.0

通过发出以下命令启动Elasticsearch:

bin/elasticsearch

Elasticsearch需要几秒钟才能启动。 您将看到一些启动日志。 Elasticsearch现在将在终端窗口中运行。

注:在某些时候你可能需要运行Elasticsearch作为一种服务,所以你可以控制它sudo service elasticsearch restart以及类似的命令; 看到这个教程的Upstart小费。 或者,您可以从Ubuntu的存储库安装Elasticsearch,虽然你可能会得到一个较旧的版本。

保持此端子打开。 使另一个终端窗口中的另一个SSH连接到你的服务器,并检查您的实例启动并运行:

curl -XGET http://localhost:9200

9200是Elasticsearch的缺省端口。 如果一切顺利,您将看到类似如下所示的输出:

{
  "status" : 200,
  "name" : "Northstar",
  "cluster_name" : "elasticsearch",
  "version" : {
    "number" : "1.5.0",
    "build_hash" : "927caff6f05403e936c20bf4529f144f0c89fd8c",
    "build_timestamp" : "2015-03-23T14:30:58Z",
    "build_snapshot" : false,
    "lucene_version" : "4.10.4"
  },
  "tagline" : "You Know, for Search"
}

注意 :对于本文的后半部分,当你将复制数据,确保Elasticsearch正在运行(并且在端口9200)。

第4步 - 安装Mercurial

接下来,我们将安装版本控制工具Mercurial。

sudo apt-get install mercurial

验证Mercurial是否正确安装:

hg

如果正确安装,您将获得以下输出:

Mercurial Distributed SCM

basic commands:

. . .

第5步 - 安装Go

Transporter是用Go语言编写的。 所以,你需要安装golang您的系统上。

sudo apt-get install golang

要正常工作,您需要设置以下环境变量:

从创建转到文件夹$HOME目录:

mkdir ~/go; echo "export GOPATH=$HOME/go" >> ~/.bashrc

更新路径:

echo "export PATH=$PATH:$HOME/go/bin:/usr/local/go/bin" >> ~/.bashrc

注销当前的SSH会话,然后重新登录。也可以直接关闭,你已经工作了会议,并保持Elasticsearch会话保持运行。 此步骤对于您的环境变量获得更新至关重要。 再次登录,并验证您的变量是否已添加:

echo $GOPATH

这应该显示Go的新路径。 在我们的例子中,它将是:

/home/sammy/go

如果它没有正确显示路径,请仔细检查本节中的步骤。

一旦我们的$GOPATH设置正确,我们需要检查通过构建一个简单的程序,走的是正确安装。

创建一个文件名为hello.go ,并把下面的程序在里面。 您可以使用任何您想要的文本编辑器。 我们将在本文中使用纳米文本编辑器。 键入以下命令以创建新文件:

nano ~/hello.go

现在将这个简短的“Hello,world”程序复制到新打开的文件中。 此文件的整个要点是帮助我们验证Go是否工作。

package main;
import "fmt"

func main() {
    fmt.Printf("Hello, world\n")
}

完成后,按CTRL+X退出该文件。 它将提示您保存文件。 Y ,然后按ENTER 它会询问您是否要更改文件名。 ENTER再次保存当前的文件。

然后,从您的主目录,使用Go运行文件:

go run hello.go

您应该看到这个输出:

Hello, world

如果您看到“Hello,world”消息,那么Go已正确安装。

现在去$GOPATH目录,并创建子目录srcpkgbin 这些目录构成Go的工作区。

cd $GOPATH
mkdir src pkg bin
  • src包含组织到包 Go 源文件(每个目录一个软件包)
  • pkg包含包对象
  • bin包含可执行命令

第6步 - 安装Git

我们将使用Git来安装Transporter。 使用以下命令安装Git:

sudo apt-get install git

第7步 - 安装运输车

现在创建并移动到Transporter的新目录。 由于该工具是由撰写开发的,我们称之为目录compose

mkdir -p $GOPATH/src/github.com/compose
cd $GOPATH/src/github.com/compose

这是compose/transporter将被安装。

克隆运输GitHub存储库:

git clone https://github.com/compose/transporter.git

移动到新目录:

cd transporter

就拿所有权/usr/lib/go目录:

sudo chown -R $USER /usr/lib/go

确保build-essential的安装GCC:

sudo apt-get install build-essential

运行go get命令来获取所有的依赖:

go get -a ./cmd/...

此步骤可能需要一段时间,请耐心等待。 一旦完成,你可以建立Transporter。

go build -a ./cmd/...

如果一切顺利,它将完成,没有任何错误或警告。 通过运行以下命令检查Transporter是否正确安装:

transporter

你应该看到这样的输出:

usage: transporter [--version] [--help] <command> [<args>]

Available commands are:
    about    Show information about database adaptors
    eval     Eval javascript to build and run a transporter application

. . .

所以安装完成。 现在,我们需要在MongoDB中的一些测试数据,我们要同步到Elasticsearch。

故障排除:

如果出现以下错误:

transporter: command not found

这意味着你的$GOPATH未添加到您的PATH变量。 检查您是否正确执行了命令:

echo "export PATH=$PATH:$HOME/go/bin:/usr/local/go/bin" >> ~/.bashrc

尝试注销并重新登录。 如果错误仍然存​​在,请改用以下命令:

$GOPATH/bin/transporter

第8步 - 创建示例数据

现在我们已经安装了一切,我们可以继续到数据同步部分。

连接到MongoDB:

mongo

您现在应该看到MongoDB的提示, > 创建一个数据库名为foo

use foo

将一些样本文档到一个集合命名bar

db.bar.save({"firstName": "Robert", "lastName": "Baratheon"});
db.bar.save({"firstName": "John", "lastName": "Snow"});

选择您刚刚输入的内容:

db.bar.find().pretty();

这将显示如下所示(结果ObjectId将是你机器上的不同):

{
    "_id" : ObjectId("549c3ef5a0152464dde10bc4"),
    "firstName" : "Robert",
    "lastName" : "Baratheon"
}
{
    "_id" : ObjectId("549c3f03a0152464dde10bc5"),
    "firstName" : "John",
    "lastName" : "Snow"
}

现在,您可以从数据库退出:

exit

有点术语:

  • MongoDB中数据库是类似于Elasticsearch 指数
  • MongoDB中集合是类似于Elasticsearch 类型

我们的最终目标是从MongoDB的foo的数据库类型Elasticsearch foo的指数的酒吧集合同步数据。

第9步 - 配置运输车

现在,我们可以继续进行配置更改,将我们的数据从MongoDB迁移到Elasticsearch。 转运需要一个配置文件( config.yaml ),转换文件( myTransformation .js )和应用程序文件( application.js

  • 配置文件指定节点,类型和URI
  • 应用程序文件指定从源到目标的数据流和可选的转换步骤
  • 变换文件将变换应用于数据

注意:本节中的所有命令假设您是从转运目录中执行命令。

移动到transporter目录:

cd ~/go/src/github.com/compose/transporter

配置文件

你可以看看这个例子config.yaml如果你喜欢的文件。 我们要备份原件,然后用我们自己的内容替换它。

mv test/config.yaml test/config.yaml.00

新文件类似,但更新一些URI和一些其他设置,以匹配我们的服务器上的内容。 让我们的内容从这里复制并粘贴到新的config.yaml文件。 再次使用nano编辑器。

nano test/config.yaml

将以下内容复制到文件中。 完成后,按照前面所述保存文件。

# api:
#   interval: 60s
#   uri: "http://requestb.in/13gerls1"
#   key: "48593282-b38d-4bf5-af58-f7327271e73d"
#   pid: "something-static"
nodes:
  localmongo:
    type: mongo
    uri: mongodb://localhost/foo
  es:
    type: elasticsearch
    uri: http://localhost:9200/
  timeseries:
    type: influx
    uri: influxdb://root:root@localhost:8086/compose
  debug:
    type: file
    uri: stdout://
  foofile:
    type: file
    uri: file:///tmp/foo

注意nodes部分。 我们已经调整了localmongoes微微节点相比原始文件。 节点是不同的数据源和目的地。Type定义节点的类型。 例如,

  • mongo意味着它是一个MongoDB实例/集群
  • elasticsearch意味着它是一个Elasticsearch节点
  • file意味着它是一个纯文本文件

uri将给API端点与节点连接。 如果未指定,默认端口将用于MongoDB(27017)。 因为我们需要从MongoDB中的捕获数据库中的数据,该URI应该是这样的:

mongodb://localhost/foo

类似地,Elasticsearch的URI将如下所示:

http://localhost:9200/

保存config.yaml文件。 您不需要进行任何其他更改。

应用程序文件

现在,打开application.js在文件test目录。

nano test/application.js

使用下面显示的内容替换文件的示例内容:

Source({name:"localmongo", namespace:"foo.bar"})
.transform({filename: "transformers/addFullName.js"})
.save({name:"es", namespace:"foo.bar"});

保存文件并退出。 这里是我们的管道的简要说明。

  • Source( options )标识从中获取数据源
  • transform指定了改造,在每个申请记录
  • save( options )标识在哪里保存数据

选项包括:

  • name:节点名称出现在config.yaml文件
  • namespace:标识数据库和表名; 它必须通过一个点来限定()。

转换文件

现在,最后一块拼图是变革。 如果你还记得,我们存储的两条记录MongoDB中使用firstNamelastName 这是你可以看到的真正的力量,转换数据,当你同步从MongoDB到Elasticsearch。

比方说,我们要存储在Elasticsearch的文件有另一个名为场fullName 为此,我们需要创建一个新的转换文件, test/transformers/addFullName.js

nano test/transformers/addFullName.js

将以下内容粘贴到文件中。 保存并退出,如前所述。

module.exports = function(doc) {
  doc._id = doc._id['$oid']; 
  doc["fullName"] = doc["firstName"] + " " + doc["lastName"];
  return doc
}

第一行是要解决转运的方式处理MongoDB的ObjectId()字段。 第二行告诉转运来连接firstNamelastName形成fullName

这是一个简单的转换示例,但是使用一些JavaScript,您可以在准备数据进行搜索时进行更复杂的数据操作。

第10步 - 执行转换

现在我们已经完成了设置,现在是同步和转换我们的数据的时候了。

确保Elasticsearch运行如果它不是,在一个新的终端窗口再次启动

~/utils/elasticsearch-1.5.0/bin/elasticsearch

原来终端 ,确保你是在transporter目录:

cd ~/go/src/github.com/compose/transporter

执行以下命令复制数据:

transporter run --config ./test/config.yaml ./test/application.js

run运输车命令需要两个参数。 首先是配置文件,第二是应用程序文件。 如果一切顺利,命令将完成,没有任何错误。

检查Elasticsearch以验证数据已复制,使用我们的转换:

curl -XGET localhost:9200/foo/bar/_search?pretty=true

你会得到这样的结果:

{
  "took" : 10,
  "timed_out" : false,
  "_shards" : {
    "total" : 5,
    "successful" : 5,
    "failed" : 0
  },
  "hits" : {
    "total" : 2,
    "max_score" : 1.0,
    "hits" : [ {
      "_index" : "foo",
      "_type" : "bar_full_name",
      "_id" : "549c3ef5a0152464dde10bc4",
      "_score" : 1.0,
      "_source":{"_id":"549c3ef5a0152464dde10bc4","firstName":"Robert","fullName":"Robert Baratheon","lastName":"Baratheon"}
    }, {
      "_index" : "foo",
      "_type" : "bar_full_name",
      "_id" : "549c3f03a0152464dde10bc5",
      "_score" : 1.0,
      "_source":{"_id":"549c3f03a0152464dde10bc5","firstName":"John","fullName":"John Snow","lastName":"Snow"}
    } ]
  }
}

请注意该领域fullName ,其中包含firstNamelastName一个空格之间串接-我们的改造工作。

结论

现在我们知道如何使用Transporter将数据从MongoDB复制到Elasticsearch,以及如何在同步时将变换应用到我们的数据。 您可以以相同的方式应用更复杂的变换。 此外,您可以链接管道中的多个转换。

这是一个好的做法,如果你做多个转换,保存在单独的文件,并链接它们。 这样,您就可以使您的每一个转换都可以在未来独立使用。

所以,这是很多。 您可以检查出在GitHub上转运项目留更新的API中的最新变化。

您可能还需要看看这个教程中有关基本在Elasticsearch CRUD操作

赞(52) 打赏
未经允许不得转载:优客志 » 系统运维
分享到:

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

微信扫一扫打赏