Moh*_*lla 5 mysql elasticsearch logstash docker docker-compose
我正在尝试使用logstash 同步MySQL 数据库和Elasticsearch 之间的数据。为此,我创建了一个docker-compose文件,为 Elasticsearch、MySQL 和 Logstash 创建容器。
这是文件:
version: '3.1'
services:
elasticsearch:
image: docker.elastic.co/elasticsearch/elasticsearch:7.1.1
container_name: pelasticsearch
environment:
- discovery.type=single-node
- cluster.name=docker-cluster
- bootstrap.memory_lock=true
- "ES_JAVA_OPTS=-Xms512m -Xmx512m"
ulimits:
memlock:
soft: -1
hard: -1
volumes:
- elasticsearch:/home/django/elasticsearch
ports:
- 9200:9200
db:
image: mysql
container_name: pmysqldb
command: --default-authentication-plugin=mysql_native_password
restart: always
volumes:
- ${PWD}/pdata/data:/docker-entrypoint-initdb.d
environment:
MYSQL_ROOT_PASSWORD: example
MYSQL_DATABASE: ecommerce
adminer:
image: adminer
restart: always
ports:
- 8080:8080
logstash:
image: docker.elastic.co/logstash/logstash:7.1.1
links:
- elasticsearch
volumes:
- ${PWD}/ls_config:/usr/share/logstash/config/
command: bin/logstash-plugin install logstash-input-jdbc
command: logstash -f /usr/share/logstash/config/logstash.conf
depends_on:
- elasticsearch
volumes:
elasticsearch:
Run Code Online (Sandbox Code Playgroud)
我还有logstash.yml和logstash.conf文件来配置我的logstash 插件。
input {
jdbc {
jdbc_driver_library => "./mysql-connector-java-5.1.36-bin.jar"
jdbc_driver_class => "com.mysql.jdbc.Driver"
jdbc_connection_string => "jdbc:mysql://localhost:3306/ecommerce"
jdbc_user => "root"
jdbc_password => "exmaple"
schedule => "* * * * *"
statement => "SELECT * from ecommerce.table;"
}
}
output {
elasticsearch {
hosts => ["elasticsearch:9200"]
user => elastic
password => changeme
}
}
Run Code Online (Sandbox Code Playgroud)
---
http.host: '0.0.0.0'
xpack.monitoring.elasticsearch.hosts: [ "elasticsearch:9200"]
xpack.monitoring.elasticsearch.username: elastic
xpack.monitoring.elasticsearch.password: changeme
xpack.monitoring.enabled: true
Run Code Online (Sandbox Code Playgroud)
因此,当我运行时,docker-compose up我的所有容器都在运行,包括logstash,但是当logstash尝试运行conf文件时,它似乎无法加载驱动程序并返回错误,如下所示:
logstash_1 | 2056 LogStash::ConfigurationError
logstash_1 | 2056 com.mysql.jdbc.Driver not loaded. Are you sure you've included the correct jdbc driver in :jdbc_driver_library?
logstash_1 | 2056 /usr/share/logstash/vendor/bundle/jruby/2.5.0/gems/logstash-input-jdbc-4.3.13/lib/logstash/plugin_mixins/jdbc/jdbc.rb:163:in `open_jdbc_connection'
Run Code Online (Sandbox Code Playgroud)
由于我对 docker 和logstash 都是新手,我做错了什么吗?以及如何解决这个错误。
所以我发布此内容以防有人遇到与我相同的问题。我找到了解决方案:所以首先是使用MariaDB而不是MySQL,似乎MySQL和logstash有很多bug。我还创建了一个用户,而不是以 root 身份连接(这将意味着对文件的更改logstash.conf)docker-compose.yml,我的目标MariaDB如下
db:
image: mariadb # mysql
container_name: ph_mariadb
restart: always
volumes:
- ${PWD}/ph_datalake/data/shopware:/docker-entrypoint-initdb.d
environment:
MYSQL_USER: "toto"
MYSQL_PASSWORD: "123456"
MYSQL_ALLOW_EMPTY_PASSWORD: "yes"
MYSQL_DATABASE: ecommerce
adminer:
image: adminer
restart: always
ports:
- 8080:8080
Run Code Online (Sandbox Code Playgroud)
接下来,将jar包含类的文件com.mysql.jdbc.Driver直接复制到我的容器中 jar 所在的位置。docker-compose.yml我在logstash目标中的文件上使用卷目标来做到这一点,所以它变成:
logstash:
image: docker.elastic.co/logstash/logstash:7.1.1
links:
- elasticsearch
- db
volumes:
- ${PWD}/ls_config/logstash.conf:/usr/share/logstash/config/logstash.conf
- ${PWD}/ls_config/logstash.yml:/usr/share/logstash/config/logstash.yml
- ${PWD}/ls_config/mariadb-java-client-2.4.3.jar:/usr/share/logstash/logstash-core/lib/jars/mariadb-java-client-2.4.3.jar
command: bin/logstash-plugin install logstash-input-jdbc
command: logstash -f /usr/share/logstash/config/logstash.conf
depends_on:
- elasticsearch
- db
Run Code Online (Sandbox Code Playgroud)
我的logstash.conf文件也会改变:
jdbc_driver_library => "./mysql-connector-java-5.1.36-bin.jar"从配置文件中删除。
将用户和密码修改为与MariaDB实例上的用户和密码相同。
所以它看起来像这样:
input {
jdbc {
jdbc_driver_class => 'org.mariadb.jdbc.Driver'
jdbc_connection_string => 'jdbc:mariadb://db:3306/ecommerce'
jdbc_user => 'toto'
jdbc_password => '123456'
schedule => "* * * * *"
statement => 'SELECT * from ecommerce.table;'
}
}
output {
elasticsearch {
hosts => ["elasticsearch:9200"]
user => elastic
password => changeme
index => "logstash"
}
}
Run Code Online (Sandbox Code Playgroud)
到目前为止,我的logstash 设法找到该类并启动一个Driver 实例进行连接,但它没有连接。由于某种原因,连接将地址解释jdbc:mariadb://db:3306/ecommerce为我的logstash的本地主机,这意味着当logstash尝试连接时,toto它会尝试连接到它自己的IP地址。
因此,解决方案是仅启动Logstash,并且由于它依赖于它连接的数据库(MariaDB)和elasticsearch
$ docker-compose up logstash
logstash_1 | [2019-08-16T11:22:12,572][INFO ][logstash.inputs.jdbc ] (3.050417s) SELECT * from ecommerce.table;
logstash_1 | [2019-08-16T11:23:53,329][INFO ][logstash.inputs.jdbc ] (3.014069s) SELECT * from ecommerce.table;
logstash_1 | [2019-08-16T11:25:35,980][INFO ][logstash.inputs.jdbc ] (4.357945s) SELECT * from ecommerce.table;
logstash_1 | [2019-08-16T11:27:11,420][INFO ][logstash.inputs.jdbc ] (3.188877s) SELECT * from ecommerce.table;
logstash_1 | [2019-08-16T11:28:50,292][INFO ][logstash.inputs.jdbc ] (3.456620s) SELECT * from ecommerce.table;
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
3094 次 |
| 最近记录: |