mongo数据到elk

116 阅读2分钟

不知道大家如何应对运营以及营销同事的『临时』数据需求,在公司早期的时候,没有专门的BI工程师,其他工程师不够,开发任务紧。于是一次两次还好,多了之后,工程师会很烦,美女妹子的话,写个脚本导出个excel,其他随便给导出个CSV文件,然后没准同事用的是Windows,用Excel打开直接是乱码 😂

当然了,笑归笑,作为一个负责任的工程师 🌚 ,你必须得帮他们解决问题,也得意识到数据对于各个部门的决策的反馈是多么重要,有助于公司的加速成长。退一步说,之后几乎是不用帮着导数据了。(什么?不明白?那。。。解决问题之后就可以约营销妹子了,懂不?

由于这几天在搭日志系统,很自然想到ELK强大的功能,于是进一步想到,能不能把数据库的数据直接同步到elasticsearch,这样的话,他们可以直接到kibana导出数据,或者直接在上门配置好图表,这样就根本不用导出数据了。

由于在公司里面做的是node.js项目,为了同步mongo的数据到elaticssearch,做了几个尝试:

River elasticsearch

mongo-river-elaticsearch
作为elasticsearch的插件,看到很多文章都推荐它,细看了下,通过ES的API配置,还支持filter,但是它不支持最新的elasticsearch/2.3.1,所以直接跳过,如果你的项目中有的话,可以尝试

Mongoosastic

mongoosastic
作为一个mongoose的plugin,需要耦合到系统中去,也需要一些开发,但是可以精确到字段级别,配置更灵活,可以考虑;

Mongo connector

mongo-connector
试了下,配置什么的都挺灵活,关键不用耦合到项目中去,只是我们的mongo数据库中,类型不严格,同步时导致经常报错,主要是类型错误,如果能更灵活一点,到字段级别,就更好了 😎 ;

其实也可以考虑参考mongo connector自己造个轮子

配置参考

Mongo connector配置文件可以参考如下:

{
    "mainAddress": "mongodb://localhost:27017/gleeman",
    "continueOnError": false,
    "oplogFile": "/var/log/mongo-connector/oplog.timestamp",
    "noDump": false,
    "batchSize": -1,
    "verbosity": 0,

    "logging": {
        "type": "file",
        "filename": "/var/log/mongo-connector/mongo-connector.log",
        "__format": "%(asctime)s [%(levelname)s] %(name)s:%(lineno)d - %(message)s",
        "__rotationWhen": "D",
        "__rotationInterval": 1,
        "__rotationBackups": 10,

        "__type": "syslog",
        "__host": "localhost:514"
    },

    "namespaces": {
        "include": [
            "db.source1",
            "db.source2"
        ],
        "__mapping": {
            "db.source1": "db.dest1",
            "db.source2": "db.dest2"
        }
    },

    "docManagers": [{
        "docManager": "elastic2_doc_manager",
        "targetURL": "localhost:9200",
        "__bulkSize": 1000,
        "__uniqueKey": "_id",
        "__autoCommitInterval": null
    }]
}