介绍
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
目录,并创建子目录src
, pkg
和bin
。 这些目录构成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
部分。 我们已经调整了localmongo
和es
微微节点相比原始文件。 节点是不同的数据源和目的地。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中使用firstName
和lastName
。 这是你可以看到的真正的力量,转换数据,当你同步从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()
字段。 第二行告诉转运来连接firstName
和lastName
形成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
,其中包含firstName
和lastName
一个空格之间串接-我们的改造工作。
结论
现在我们知道如何使用Transporter将数据从MongoDB复制到Elasticsearch,以及如何在同步时将变换应用到我们的数据。 您可以以相同的方式应用更复杂的变换。 此外,您可以链接管道中的多个转换。
这是一个好的做法,如果你做多个转换,保存在单独的文件,并链接它们。 这样,您就可以使您的每一个转换都可以在未来独立使用。
所以,这是很多。 您可以检查出在GitHub上转运项目留更新的API中的最新变化。
您可能还需要看看这个教程中有关基本在Elasticsearch CRUD操作 。