Java学习:使用logstash将mysql 同步到Docker下的elasticsearch

拉取dockerhub中的logstash镜像

docker pull logstash:版本号

构建镜像文件

FROM logstash

#安装input插件
RUN logstash-plugin install logstash-input-jdbc
#安装output插件
RUN logstash-plugin install logstash-output-elasticsearch
#容器启动时执行的命令.(CMD 能够被 docker run 后面跟的命令行参数替换)
CMD ["-f", "/some/config-dir/logstash-mysql-es.conf"]

构建镜像

docker build -t my-logstash

同步MySQL需要MySQL驱动。
为了挂载目录的时候,只挂载一个目录。我们把mysql驱动与配置文件放到同一个目录下

创建config目录,创建配置文件logstash-mysql-es.conf
文件模版:

input {
 stdin { }
    jdbc {
      #注意mysql连接地址一定要用ip,不能使用localhost等
	  # mysql jdbc connection string to our backup databse
	  jdbc_connection_string => ""
	  # the user we wish to excute our statement as
	  jdbc_user => "root"
	  jdbc_password => "root"
	  # the path to our downloaded jdbc driver  
	  jdbc_driver_library => ""
	  # the name of the driver class for mysql
	  jdbc_driver_class => "com.mysql.jdbc.Driver"
	  jdbc_paging_enabled => "true"
	  jdbc_page_size => "50"
	  #以下对应着要执行的sql的绝对路径。
	  #statement_filepath => ""
	  statement => ""
	  #定时字段 各字段含义(由左至右)分、时、天、月、年,全部为*默认含义为每分钟都更新(测试结果,不同的话请留言指出)
      schedule => "* * * * *"
  }
}
	  #处理中文乱码问题
      codec => plain { charset => "UTF-8"}
	  #是否记录上次运行的结果
      record_last_run => true
      #记录上次运行结果的文件位置
      last_run_metadata_path => ""
      #是否使用数据库某一列的值,
      use_column_value => true
      tracking_column => "createtime"
      #numeric或者timestamp
      tracking_column_type => timestamp
       
      #如果为true则会清除 last_run_metadata_path 的记录,即重新开始同步数据
      #clean_run => false
 
    }
 }
 
 output {
     stdout {
        codec => json_lines
    }
    elasticsearch {
      #注意mysql连接地址一定要用ip,不能使用localhost等
      #ESIP地址与端口
	  hosts => "localhost:9200" 
	  #ES索引名称(自己定义的)
	  index => ""
	  #自增ID编号
	  document_id => "%{id}"
	  document_type => ""
    }

启动容器

docker run -d --name logstash_mysql -v /root/logstash/config:/some/config-dir/ bc8551a7b495
<think>我们正在解决Logstash 7.17.15在运行时提示“could not find java; set JAVA_HOME or ensure java is in PATH”的问题,同时还注意到有警告建议使用LS_JAVA_HOME环境变量,并且Logstash自带了捆绑的JDK。根据引用内容,我们知道问题的核心是Logstash无法找到Java环境。 观察引用: 引用[1]和[2]提到了Windows下的解决方法,但用户的问题没有明确操作系统,不过从引用[3]的Dockerfile内容(centos)来看,用户可能也在Linux环境下遇到问题。但用户本次问题描述中没有明确操作系统,因此我们需要提供通用解决方案,同时兼顾自带捆绑JDK的情况。 特别要注意:Logstash 7.17.15自带捆绑的JDK,因此理论上不需要外部Java环境。但为什么会出现找不到Java的错误呢?可能是因为启动脚本试图使用外部Java,或者环境变量干扰。 根据Logstash官方文档,从6.0版本开始,Logstash自带捆绑的JDK(位于`LS_HOME/jdk`目录),并且默认会使用这个捆绑的JDK。但是,可以通过环境变量`LS_JAVA_HOME`来指定使用外部的Java。 错误提示建议设置`JAVA_HOME`或确保Java在`PATH`中,但实际上Logstash优先使用自带的JDK,除非设置了`LS_JAVA_HOME`或`JAVA_HOME`覆盖了默认行为。 因此,出现这个错误的原因可能是: 1. 自带的JDK损坏或缺失。 2. 环境变量`LS_JAVA_HOME`或`JAVA_HOME`被设置,指向一个不存在或错误的Java路径,导致Logstash试图使用外部Java但找不到。 3. 启动脚本无法正确访问自带JDK(权限问题?)。 解决办法: 1. 首先,检查Logstash安装目录下的jdk目录是否存在。默认路径是`LS_HOME/jdk`(其中LS_HOME是Logstash的安装目录)。如果该目录不存在,可能是安装不完整,需要重新安装Logstash。 2. 如果存在,那么检查环境变量。在启动Logstash之前,确保没有设置`JAVA_HOME`和`LS_JAVA_HOME`。可以临时取消这些环境变量: 在Linux/macOS下: unset JAVA_HOME unset LS_JAVA_HOME 在Windows下: 在命令提示符中: set JAVA_HOME= set LS_JAVA_HOME= 3. 如果不想取消全局的JAVA_HOME(因为其他程序需要),可以在启动Logstash的时候临时覆盖环境变量。例如: 在Linux/macOS下: LS_JAVA_HOME="" ./bin/logstash 或者 JAVA_HOME="" ./bin/logstash 在Windows下(CMD): set LS_JAVA_HOME= set JAVA_HOME= bin\logstash.bat 4. 如果以上方法不行,可以尝试明确设置`LS_JAVA_HOME`指向Logstash自带的JDK。例如: 在Linux/macOS下: export LS_JAVA_HOME=/path/to/logstash-7.17.15/jdk ./bin/logstash 在Windows下: set LS_JAVA_HOME=C:\path\to\logstash-7.17.15\jdk bin\logstash.bat 5. 如果自带的JDK确实损坏,可以考虑使用外部的Java。但注意,Logstash 7.17.15要求Java 11。因此,安装Java 11并设置`LS_JAVA_HOME`指向该Java 11的安装路径(注意不要设置`JAVA_HOME`,因为Logstash会优先使用`LS_JAVA_HOME`): 例如,在Linux下: export LS_JAVA_HOME=/usr/lib/jvm/java-11-openjdk-amd64 在Windows下: set LS_JAVA_HOME=C:\Program Files\Java\jdk-11.0.12 6. 另外,检查文件权限。在Linux/macOS下,确保Logstash的整个目录(尤其是jdk目录)的权限允许当前用户执行和访问。 7. 如果使用Docker(如引用[3]),在构建镜像时,如果不需要使用外部Java,则确保在Dockerfile中不设置`JAVA_HOME`或`LS_JAVA_HOME`环境变量(除非指向Logstash自带的JDK路径)。但注意,LogstashDocker镜像通常已经配置好,所以最好使用官方镜像。 总结步骤: 对于非Docker环境(Linux/macOS/Windows): 步骤1:检查自带JDK 进入Logstash安装目录,查看jdk目录是否存在,并且里面的结构是否完整(应该有bin, lib等目录)。 步骤2:清除相关环境变量(临时) 在启动Logstash的终端中,清除JAVA_HOME和LS_JAVA_HOME环境变量。 步骤3:尝试启动 运行Logstash(例如:bin/logstash -e 'input { stdin { } } output { stdout {} }')。 步骤4:如果步骤3失败,尝试设置LS_JAVA_HOME指向自带JDK 在启动Logstash之前,设置LS_JAVA_HOME为Logstash自带JDK的绝对路径。 步骤5:如果自带JDK不可用,安装外部Java 11并设置LS_JAVA_HOME指向它。 步骤6:如果是在Docker中,确保使用官方Logstash镜像,或者在自己构建的镜像中正确设置了LogstashJava环境。 注意:在Linux/macOS下,设置环境变量是临时生效的,如果要永久生效,可以将设置写入~/.bashrc或~/.profile等文件。在Windows下,可以通过系统属性设置环境变量,但临时设置建议在命令提示符中使用set命令。 根据引用[2]提到的,如果是Java程序员,可能已经配置好了JDK,但Logstash的自带JDK机制可能被环境变量干扰,所以清除环境变量是关键一步。 下面我们将按照上述步骤给出详细的操作指令。 </think>针对 Logstash 7.17.15 运行时提示 `could not find java; set JAVA_HOME or ensure java is in PATH` 且警告使用 `LS_JAVA_HOME` 的问题,以下是分步解决方案: ### 原因分析 1. **自带 JDK 未被识别** Logstash 7.x 起内置 OpenJDK(路径:`<Logstash_HOME>/jdk`),但启动脚本可能因环境变量干扰未能正确加载。 2. **环境变量冲突** 系统已设置 `JAVA_HOME` 指向外部 JDK,与 Logstash 捆绑的 JDK 冲突,引发警告: ``` WARNING: Using LS_JAVA_HOME while Logstash distribution comes with a bundled JDK. ``` --- ### 解决方案 #### ✅ 方法 1:优先使用自带 JDK(推荐) ```bash # 清除所有 Java 相关环境变量(临时生效) unset JAVA_HOME # Linux/macOS unset LS_JAVA_HOME # Linux/macOS # Windows CMD set JAVA_HOME= set LS_JAVA_HOME= # Windows PowerShell Remove-Item Env:\JAVA_HOME Remove-Item Env:\LS_JAVA_HOME # 启动 Logstash使用内置 JDK) ./bin/logstash -e 'input { stdin {} } output { stdout {} }' ``` #### ✅ 方法 2:显式指向内置 JDK ```bash # 设置 LS_JAVA_HOME 指向 Logstash 内置 JDK export LS_JAVA_HOME=/path/to/logstash-7.17.15/jdk # Linux/macOS # Windows CMD set LS_JAVA_HOME=C:\path\to\logstash-7.17.15\jdk # 启动 Logstash ./bin/logstash ``` #### ✅ 方法 3:验证内置 JDK 完整性 1. 检查 `<Logstash_HOME>/jdk` 目录是否存在 ```bash ls /path/to/logstash-7.17.15/jdk/bin/java # 应存在可执行文件 ``` 2. 若目录缺失或损坏,重新解压安装包,或从官方下载 `jdk` 目录补充[^1]。 --- ### 关键注意事项 1. **优先级顺序** Logstash 加载 JDK 的优先级: `LS_JAVA_HOME` > `JAVA_HOME` > 内置 JDK **推荐清除外部变量**,让 Logstash 默认使用内置 JDK[^2]。 2. **路径规范** Windows 路径需转义或使用短路径: ```powershell # 示例:短路径格式 (C:\Progra~1\...) set LS_JAVA_HOME=C:\Logst~1.15\jdk ``` 3. **权限问题(Linux/macOS)** ```bash chmod -R 755 /path/to/logstash-7.17.15/jdk/bin/* ``` --- ### 验证成功 启动时应输出: ```log Using bundled JDK: /path/to/logstash-7.17.15/jdk Successfully started Logstash API endpoint {:port=>9600} ``` 表示已正确加载内置 JDK[^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值