V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
sr0miao
V2EX  ›  问与答

请教 logstash 一个问题,如果配置了多个 output,如果其中一个 output 出了问题,如何保证其他的 output 正常工作呢

  •  
  •   sr0miao · 2019-06-26 10:29:28 +08:00 · 3254 次点击
    这是一个创建于 1977 天前的主题,其中的信息可能已经有所发展或是发生改变。
    比如:output{redis1, redis2, redis3}
    reids1 无法连接,如何保证数据能到 redis2 和 redis3 上,logstash 里是如何设置呢
    22 条回复    2019-06-28 01:28:04 +08:00
    PriestTomb
        1
    PriestTomb  
       2019-06-26 15:45:56 +08:00   ❤️ 1
    作为没用过 logstash-output-redis 插件但用过 Logstash 的人。。你这个问题的描述有比较大的分歧

    你这三个 redis 是同时配置在一个 redis 插件里( 例如 host => ["redis1", "redis2", "redis3"]),还是同时配置了三个 redis 插件,每个插件的 host 配置了一个 redis ?

    Logstash 的 output 配置是可以多个的,数据经过 input -> filter 之后是同时传递给多个 output 插件的,不是说第一个 output 插件失败就不继续执行后面的 output 插件了(不是串行)

    所以你如果配置多个 redis 插件,就不用纠结这个问题

    如果你是第一种配法,可能要看下插件的处理逻辑,一个 redis 写入失败的时候会不会自动重连到另一个 redis 重试写入,还是具体什么逻辑
    PriestTomb
        3
    PriestTomb  
       2019-06-26 16:00:46 +08:00
    没怎么写过回复。。V 站的回复不是 markdown 么。。抱歉上条的链接有点炸,单发下

    https://github.com/logstash-plugins/logstash-output-redis/blob/92203ab42c97d83ff46414a99dbf271b8e8dd531/lib/logstash/outputs/redis.rb#L227
    sr0miao
        4
    sr0miao  
    OP
       2019-06-26 18:41:15 +08:00
    @PriestTomb 抱歉描述不完整,今天我试了下,试过多个 output,像这样
    output {
    redis1{}
    }
    output {
    redis2{}
    }
    也试过 output{
    redis1{}
    redis2{}
    }
    还试过写两个 config,用-f 去执行,但是都不行,我故意写错其中一个 redis,但是另一个的正常的 redis 也没了数据。
    sr0miao
        5
    sr0miao  
    OP
       2019-06-26 18:43:59 +08:00
    @PriestTomb 官方文档说有 logstash.yml 使用隔离管道,但是我在我用的版本中没有看到,我用的 docker 集成的 logstash,可能版本比较低。

    https://www.elastic.co/guide/en/logstash/current/logstash-settings-file.html
    PriestTomb
        6
    PriestTomb  
       2019-06-26 19:04:11 +08:00
    @sr0miao
    output{
    redis1{}
    redis2{}
    }
    正常的配置是这样

    所以你的需求是 Logstash 采集的数据同时往多个 redis 去写么?我在用的是 6.4 版本,可以实现 output 模块配置多个插件,你用的是哪个版本?

    比较新的版本有一个 pipelines.yml 配置文件,根据配置的 pipeline.id 不同可以实现同一个 Logstash 进程启动多个 pipeline 实例,每个实例根据不同的配置文件做不同的日志采集处理
    sr0miao
        7
    sr0miao  
    OP
       2019-06-26 19:05:50 +08:00
    @PriestTomb https://elasticsearch.cn/article/6176,这是 elastic 中文社区的帖子,上面说单管道的 output 是“相依为命”的,和你说的不同,是否能详细解答一下呢,先谢谢了
    sr0miao
        8
    sr0miao  
    OP
       2019-06-26 19:11:31 +08:00
    @PriestTomb 现在想要 Logstash 采集的数据同时往多个 redis 去写,但是环境是一个多 docker 集成的环境,其中一个 docker 容器里的 logstash 收集其他 docker 应用生成的日志文件,然后将相同的数据推送到不同的终端。

    因为 docker 容器里的应用不是我写的,所以想尽量在那个有 logstash 的 docker 容器里更改 config 文件,它上面的 logstash 可能版本比较老了,但我也不清楚具体版本
    PriestTomb
        9
    PriestTomb  
       2019-06-26 19:28:17 +08:00
    @sr0miao 回想了一下我这边使用的一些场景,确实还没有遇到过“某一个 output 出问题”的情况,一会儿我测试一下

    另外,Logstash 在启动的时候输出的日志里是能看到版本的
    PriestTomb
        10
    PriestTomb  
       2019-06-26 21:13:48 +08:00
    @sr0miao [捂脸] 我测试了一下,还真的是这样,配置多个插件仿佛是有个先后顺序,前一个失败或卡住,就不会走到下一个。。是我的锅,我之前还真没测过这种场景。。这几天我再研究下 Logstash 的逻辑

    不过配置多 pipeline 实例一起运行的情况,官方说过一个比较推荐的场景,就是这些 pipeline 处理的数据来源最好是不一样的,比如一个 pipeline 接收 Filebeat 的数据,输出到本地文件;另一个 pipeline 接收 http 传入的数据,而输出到 es 等等。

    我看了下你发的文章,你目前的场景用输出隔离模式貌似是能完美解决,只是会带来一定的性能开销
    jianzhao123
        11
    jianzhao123  
       2019-06-26 21:23:07 +08:00 via iPhone
    歪楼问下 geoip 无法生成 geoip.location 怎么回事,其他坐标,地区 code 都可以
    PriestTomb
        12
    PriestTomb  
       2019-06-26 21:42:05 +08:00
    @jianzhao123 没用过这个哈哈哈 抱歉帮不上忙
    jianzhao123
        13
    jianzhao123  
       2019-06-26 23:24:04 +08:00 via iPhone
    @PriestTomb 没事儿,自己在折腾下
    jianzhao123
        14
    jianzhao123  
       2019-06-26 23:24:25 +08:00 via iPhone
    @PriestTomb 没事儿,自己再折腾下
    iyaozhen
        15
    iyaozhen  
       2019-06-27 00:22:49 +08:00
    这就是 logstash 的问题,其实也不算问题吧

    多个 output 会影响速度,每个必须多个 output 都执行成功,好像还是串行的,第一个有失败第二个就歇菜了。
    mansurx
        16
    mansurx  
       2019-06-27 08:05:08 +08:00 via Android
    @jianzhao123 好像是数据类型问题,去谷歌搜一下看看
    sr0miao
        17
    sr0miao  
    OP
       2019-06-27 09:22:19 +08:00
    @PriestTomb 我也看了官方的说明,用管道还要给 logstash 升级,这样就得重做 docker 了,还想心存侥幸地找简单的方法,看来没有阿。
    PriestTomb
        18
    PriestTomb  
       2019-06-27 09:33:52 +08:00
    @sr0miao 你的输入源如果是日志文件( file 插件采集?),其实更粗暴一点的方法就是同时启动三个 Logstash,每个 Logstash 进程对应的配置文件 input 环节一样,output 环节配不同的 redis
    jianzhao123
        19
    jianzhao123  
       2019-06-27 09:41:08 +08:00 via iPhone
    @mansurx Google 了,Elas ticsearch 的索引也改了,也重启了😂😂
    mansurx
        20
    mansurx  
       2019-06-27 10:55:42 +08:00 via Android
    @jianzhao123 索引名是不是要改成 logstash-xxxxx 才行,我记得这个名字的索引是有那个类型的字段的。
    jianzhao123
        21
    jianzhao123  
       2019-06-27 14:26:46 +08:00 via iPhone
    @mansurx 谢谢,我再看看
    Samuelcc
        22
    Samuelcc  
       2019-06-28 01:28:04 +08:00 via Android
    就是因为这个问题,我们最后改成了使用多个 consumer 来处理,这样一个失败不会影响另一个
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1745 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 24ms · UTC 16:38 · PVG 00:38 · LAX 08:38 · JFK 11:38
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.