zoukankan      html  css  js  c++  java
  • Elasticsearch:同步 MongoDB 数据到 Elasticsearch

    转载自:https://elasticstack.blog.csdn.net/article/details/114639152

    MongoDB 是一个基于分布式文件存储的数据库。由 C++ 语言编写。旨在为 WEB 应用提供可扩展的高性能数据存储解决方案。MongoDB 是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的。Elasticsearch 是一个高效强大的大数据搜索引擎。它的 Speed, Scale 及 Relevance 是很多数据库不具有的。通过 Elasticsearch 的高效搜索引擎,我们可以快速地搜索相关的内容,我们也可以使用 Kibana 所提供的可视化为数据提供洞察。在今天的文章中,我将介绍如何把 MongoDB 里的数据同步到 Elasticsearch。如果你对 JDBC 的数据同步到 Elasticsearch,请参阅我之前的文章 “Logstash:如何使用 Logstash 和 JDBC 确保 Elasticsearch 与关系型数据库保持同步”。
    
    在今天的练习中,我将使用如下的系统结构:
    
    在上面的系统中,我有三个机器:两个运行 Ubuntu OS 20.04 及一个运行 MacOS 的电脑。在两个 Ubuntu OS 上分别运行 MongoDB,而在 MacOS 上运行有 Elasticsearch 及 Kibana,同时我们还在它上面运行了一个 docker。在 docker 里运行 Monstache。Monstache 是一个 Go 语言写的应用,用来实时同步 MongoDB 里的数据到 Elasticsearch。在这里必须说明的一点是:为了能够使得 MongoDB  和 Elasticsearch 同步,我们必须针对 MongoDB 部署一个 replica set。Monstache 使用 MongoDB 的 oplog 作为事件源。 你将需要确保通过部署副本集将 MongoDB 配置为生成操作日志。
    
    
    安装
    Elasticsearch
    
    我们可以阅读文章 “如何在 Linux,MacOS 及 Windows 上进行安装 Elasticsearch” 安装到 MacOS 上或者你自己喜欢的系统上。因为为了让 Elasticsearch 能够正常被  Docker 所访问,所以,我们需要对它的配置做一些小的改动:
    
    config/elasticsearch.yml
    
        network.host: 0.0.0.0
        discovery.type: single-node
    
    通过这样的配置,我们的 Elasticsearch 可以同时以  http://localhost:9200 及 http://privateIP:9200 访问。配置完后,启动 Elasticsearch。
    Kibana
    
    我们可以通过参阅文章 “Kibana:如何在 Linux,MacOS 及 Windows 上安装 Elastic 栈中的 Kibana” 来按照 Kibana。
    MongoDB
    
    我们可以参考链接来安装 MongoDB。简单地说:
    
    在 Terminal 中打入如下的命令:
    
    wget -qO - https://www.mongodb.org/static/pgp/server-4.4.asc | sudo apt-key add -
    
    然后执行如下的命令:
    
    echo "deb [ arch=amd64,arm64 ] https://repo.mongodb.org/apt/ubuntu focal/mongodb-org/4.4 multiverse" | sudo tee /etc/apt/sources.list.d/mongodb-org-4.4.list
    
    针对不同的 Ubuntu 版本,有不同的命令。
    
    接着执行如下的命令:
    
        sudo apt-get update
        sudo apt-get install -y mongodb-org
    
    我们安装上面的步骤针对两个 Ubuntu 的机器分别部署。接下来,我们需要针对这两个 Ubuntu 机器上的 MongoDB 进行配置。首先使用你喜欢的编辑器打开文件 /etc/mongod.conf
    
    /etc/mongod.conf
    
    我们针对两个机器分别进行配置。请注意上面的 bindIp,针对不同的机器,它们的私有 IP 地址是不同的。另外一个集群的配置是这样的:
    
    经过上面的配置后,我们在两个 Ubuntu 机器上分别启动 MongoDB 的服务:
    
    sudo service mongod start
    
    我们可以通过如下的命令来查看 MongoDB 服务的运行状态:
    
    service mongod status
    
    如果能看到上面的 active 状态,则表示我们的 MongoDB 运行正常。我们接着在 terminal 中打入如下的命:
    
    mongo 192.168.0.4
    
    请注意上面的 IP 地址是当前机器的 private IP 地址。我们接着打入如下的命令:
    
    rs.initiate()
    
    我们可以打入 rs.status() 命令来查看 replica 的状态。当前的 MongoDB 为 primary。
    
    这样我们就配置好了 MongoDB 的 replica set。我们可以在 Primary 的 MongoDb 里创建一个数据库:
    
    在上面我们在 PRIMARY 的机器里创建了一个叫做 mydatabase 的数据库。我们回到 SECONDARY 的机器里来查看:
    
    在 SECONDARY 里,我们看不到任何的东西。我们可以使用如下命令:
    
    rs.slaveOk()
    
    在上面,我们可以看到 mydatabase 已经被复制过来了。在 SECONDARY  MongoDB 里,我们不可以创建任何的数据库:
    
    
    Monstache
    
    正对 Monstache 有两种安装方法,一种是直接从地址 https://github.com/rwynn/monstache 下载源码,并使用 Go 的环境进行编译。在今天的练习中,我将使用 Docker 来部署。我们在自己的电脑中创建如下的一个文件结构:
    
        $ pwd
        /Users/liuxg/demos/monstache
        $ tree -L 3
        .
        ├── docker-compose.yml
        └── monstache
            ├── config.toml
            ├── logs
            │   └── error.log
            └── scripts
                └── collection_name.js
         
        3 directories, 4 files
    
    为了配置容器,我们定义 docker-compose.yml 文件如下:
    
    docker-compose.yml
    
        version: '3'
        services:
            monstache_container_name:        
                image: rwynn/monstache:latest        
                container_name: container_name       
                working_dir: /monstache        
                command: -f ./config.toml        
                volumes:          
                    - ./monstache:/monstache/        
                ports:          
                    - "8080:8080"        
                restart: always        
        networks:  
            app-network:    
                driver: bridge
    
    为了配置 monstache 的管道,我们配置 config.toml 如下:
    
    config.toml
    
        mongo-url = "mongodb://192.168.0.4:27017" 
        elasticsearch-urls = ["http://192.168.0.3:9200"]
        elasticsearch-user = "elastic"
        elasticsearch-password = "password"
        direct-read-namespaces = ["test.mycol"]
        change-stream-namespaces = ["test.mycol"] 
        [logs]
        error = "./logs/error.log" 
        [[mapping]]
        namespace = "test.mycol" 
        index = "mongodb"
         
        [[script]]
        namespace = "test.mycol"
        path = "./scripts/collection_name.js"
        routing = true
    
    在上面:
    
        mongodb-url:这个是你的 mongodb 的地址
        elasticsearch-url:这个是你的 Elasticsearch 的地址
        elasticsearch-user:访问 Elasticsearch 所需要的账号
        elasticsearch-password:访问 Elasticsearch 所需要的密码
        direct-read-namespaces:此选项允许你直接将集合从 MongoDB 复制到 Elasticsearch。 Monstache 允许过滤实际索引到 Elasticsearch 的数据,因此你不一定需要复制整个集合。 在上面,我们同步数据库 test 中的 mycol 集合。
        change-stream-namspace:实时通知以告知 Elasticsearch 所有写入文档,包括指定集合中的删除和更新。
    
    [logs]: 记录错误信息
    
    [mapping]: 改写默认的索引名称。在上面我们的索引名称为 mongodb
    
    [[script]]:是一种中间件,能够转换,删除文档或定义索引元数据。 可以使用 Javascript 或 Golang 作为插件编写该中间件。
    
    用于转换文档的脚本示例。
    
        module.exports = function (doc) {
            delete doc._id;
            //TODO
            return doc;
        }
    
    我们把上面的内容复制到 collection_name.js 文件中去。
    
    好了到此为止,我们的配置已经完成。我们可以使用如下的命令来启动 Monstache:
    
    docker-compose up -d
    
    
    测试数据同步
    
    我们到 MongoDB 的  PRIMARY 中打入如下的命令:
    
    我们启动 Kibana 来进行查看索引 mongodb:
    
    至此,我们完成了从 MongoDB 的数据实时地同步到 Elasticsearch。
    
    
    
  • 相关阅读:
    spark 系列之六 SparkStreaming数据源之socket流
    spark 系列之五 SparkStreaming数据源之文件流
    spark 系列之四 Spark数据源之关系型数据库
    spark 系列之三 RDD,DataFrame与DataSet之间的转化
    spark 系列之二 Dataframe的使用
    spark 系列之一 RDD的使用
    Java Int类型与字符,汉字之间的转换
    Java实现栈
    名字的漂亮度
    在字符串中找出连续最长的数字串
  • 原文地址:https://www.cnblogs.com/sanduzxcvbnm/p/14570808.html
Copyright © 2011-2022 走看看