Docker安装Logstash并实现mysql与mysql之间的数据同步

  • Docker安装Logstash并实现mysql与mysql之间的数据同步已关闭评论
  • 1,836次阅读
  • A+
所属分类:Docker ElasticSearch

Docker安装Logstash并实现mysql与mysql之间的数据同步

背景

最近接到一个需求是定时将某mysql数据库的数据同步到到另一个mysql数据库中,当时第一个想法就是使用程序去写对应的同步逻辑,最后还是决定使用Logstash去进行数据库之间的同步工作,一是自己写程序同部数据工作量还是比较大的,二是扩展性并不是很理想,Logstash中安装对应的数据输入输出插件,简单的编写配置文件就可以轻松实现数据库之间的同步工作。既简单又方便。

Logstash简介

Logstash是一款集中、转换和存储数据的中间件,属于Elastic旗下的,ELK中的L。它具体有哪些功能呢?

输入、过滤器和输出

Logstash 能够动态地采集、转换和传输数据,不受格式或复杂度的影响。利用 Grok 从非结构化数据中派生出结构,从 IP 地址解码出地理坐标,匿名化或排除敏感字段,并简化整体处理过程。

  1. 采集各种样式、大小和来源的数据

数据往往以各种各样的形式,或分散或集中地存在于很多系统中。Logstash 支持各种输入选择,可以同时从众多常用来源捕捉事件。能够以连续的流式传输方式,轻松地从您的日志、指标、Web 应用、数据存储以及各种 AWS 服务采集数据。

  1. 实时解析和转换数据

数据从源传输到存储库的过程中,Logstash 过滤器能够解析各个事件,识别已命名的字段以构建结构,并将它们转换成通用格式,以便进行更强大的分析和实现商业价值。

Logstash 能够动态地转换和解析数据,不受格式或复杂度的影响:

  • 利用 Grok 从非结构化数据中派生出结构
  • 从 IP 地址破译出地理坐标
  • 将 PII 数据匿名化,完全排除敏感字段
  • 简化整体处理,不受数据源、格式或架构的影响
  1. 选择您的存储库,导出您的数据

尽管 Elasticsearch 是我们的首选输出方向,能够为我们的搜索和分析带来无限可能,但它并非唯一选择。

Logstash 提供众多输出选择,您可以将数据发送到您要指定的地方,并且能够灵活地解锁众多下游用例。

  1. 以您自己的方式创建和配置管道

Logstash 采用可插拔框架,拥有 200 多个插件。您可以将不同的输入选择、过滤器和输出选择混合搭配、精心安排,让它们在管道中和谐地运行。

从自定义应用程序采集数据?没有看到所需的插件?Logstash 插件很容易构建。我们有一个极好的插件开发 API 和插件生成器,可帮助您开始创作并分享成果。

Docker安装Logstash

我们使用docker命令直接从远程仓库拉去Logstash镜像,这里笔者使用的是7.2.0

docker pull logstash:7.2.0

拉取完镜像后就可以编辑自定义conf文件了,Logstash默认加载/usr/share/logstash/config/目录下的logstash.yml文件 。

Logstash配置文件

这里我们可以在Logstash容器启动之前编辑好conf文件,然后在启动的时候指定对应的目录去挂载conf文件,当然如果使用的是mysql数据库的话,还需要对应的数据库链接JAR文件,可以同时放在挂载的目录下。

mysql.conf

input {
  stdin {
  }
  jdbc {
  jdbc_connection_string => "jdbc:mysql://127.0.0.1:3306/test1?useUnicode=true&characterEncoding=utf-8&useSSL=true&serverTimezone=UTC"
  jdbc_user => "test1"
  jdbc_password => "test1"
  jdbc_driver_library => "/usr/share/logstash/config/mysql-connector-java-8.0.15.jar"
  jdbc_driver_class => "com.mysql.cj.jdbc.Driver"
  jdbc_paging_enabled => "true"
  jdbc_page_size => "50000"
  schedule => "* * * * *"
  statement => "select id from test1.test1 r where r.id = 3"
  }
}


output {
 jdbc{
  connection_string => "jdbc:mysql://127.0.0.1:3306/test2?useUnicode=true&characterEncoding=utf-8&useSSL=true&serverTimezone=UTC"
  username => "test2"
  password => "test2"
  driver_jar_path => "/usr/share/logstash/config/mysql-connector-java-8.0.15.jar"
  driver_class => "com.mysql.cj.jdbc.Driver"
  statement => ["insert into test2.test2 (id) values (?) ","id"]
}
  stdout {
  codec => json_lines
  }
}

如上面的配置文件,input与output是配置文件必须配置的选项,即数据同步的输入与输出配置,stdinstdout标识标准输入和输出,这里stout配置了在logstash日志中将最终结果以json形式输出到日志中。input与output标签中的jdbc标签表示为数据库的插件,值得注意的是这里必须要在logstaash中安装logstash-input-jdbclogstash-output-jdbc的插件,否则在执行的时候会出错,下面我会想如何安装对应的插件。其实logstash中支持众多插件,只是这里我们的需求是mysql数据库之间的数据同步,如果换成其他存储引擎,必须安装其他的相关插件,比如es,kafka等等。jdbc里的配置参数,想必大家一看就明白,这里就不在多做赘述了。在input标签里的jdbc中schedule属性还可以配置cron表达式,定时跑数据。

如下图,如果没有安装jdbc则会报错

Docker安装Logstash并实现mysql与mysql之间的数据同步

启动Logstash容器

上面我们已经准备好配置文件了,当然还需要准备mysql的链接jar包,这里我使用的是mysql-connector-java-8.0.15.jar,如有需要大家可以去官网上下载。然后启动docker logstash容器,如下

docker run -it -p 5044:5044 -p 9600:9600 --name logstash -v /Users/liumengxi/Documents/tmp:/usr/share/logstash/config --privileged=true logstash:7.2.0

如上启动命令,可以看到-v 指定当前物理机挂载目录,将tmp目录下的配置文件以及jar文件都挂载到容器的/usr/share/logstash/config目录下,以便使用。

Docker安装Logstash并实现mysql与mysql之间的数据同步

可以看到tmp目录下的文件,这里需要注意的是,在该目录下需要指定一个logstash.yml配置文件,可以写个空文件,否则启动容器的时候会报错,找不到该文件。

安装logstash插件

到这里,进入logstash容器中

//进入容器
docker exec -it logstash /bin/bash
//进入logstash目录,可以看到被挂载的文件
cd /usr/share/logstash/config
//进入bin目录
cd /usr/share/logstash/bin/

进入bin目录后,我们开始安装对应的插件,这里我们使用到了logstash-input-jdbc与logstash-output-jdbc,所以这两个必须都要安装

  1. logstash-input-jdbc 插件相对来说比较好安装,在bin目录下执行 logstash-plugin install logstash-input-jdbc 即可。
WARNING: An illegal reflective access operation has occurred
WARNING: Illegal reflective access by org.jruby.util.SecurityHelper to field java.lang.reflect.Field.modifiers
WARNING: Please consider reporting this to the maintainers of org.jruby.util.SecurityHelper
WARNING: Use --illegal-access=warn to enable warnings of further illegal reflective access operations
WARNING: All illegal access operations will be denied in a future release
Validating logstash-input-jdbc
Installing logstash-input-jdbc
Installation successful

如看到上述日志,则表示安装成功。

  1. logstash-output-jdbc 这款插件是比较独立的,安装的时候会一直连接不上网络,因为被墙了,所以需要离线安装。

在使用 logstash-plugin install logstash-output-jdbc时一直出现如下错误

logstash-plugin install logstash-output-jdbc
WARNING: An illegal reflective access operation has occurred
WARNING: Illegal reflective access by org.jruby.util.SecurityHelper to field java.lang.reflect.Field.modifiers
WARNING: Please consider reporting this to the maintainers of org.jruby.util.SecurityHelper
WARNING: Use --illegal-access=warn to enable warnings of further illegal reflective access operations
WARNING: All illegal access operations will be denied in a future release
ERROR: Something went wrong when installing logstash-output-jdbc, message: Net::OpenTimeout

解决方案:

这里我选择了离线安装

  1. 下载离线包 https://github.com/theangryangel/logstash-output-jdbc,上传到服务器并解压,这里我们使用的是docker容器部署的,所以将文件直接docker cp到指定目录。

Docker安装Logstash并实现mysql与mysql之间的数据同步

这里涉及到unzip解压,logstash7.2.0中并没有unzip等命令,这里我们使用 docker exec -u root -it logstash /bin/bash 命令用root用户进行登录,然后yum install zip unzip,安装完成后解压目录。

  1. 更改logstash根目录下的Gemfile文件,增加gem “logstash-jdbc-output”, :path => “你的插件zip解压后的全路径” 。

  2. 执行 bin/logstash-plugin install --no-verify logstash-output-jdbc,如果你的源不正确仍然会报错。但不用在意,往下执行。

  3. bin/logstash-plugin list

Docker安装Logstash并实现mysql与mysql之间的数据同步

这里我们看到,两款jdbc相关插件都已经安装成功了。

执行logstash

最后在logstash/bin目录下,执行 ./logstash -f ../config/mysql.conf 命令,进行启动logstash.
执行完成后,就可以在对应的数据库中查找同步的数据是否已经插入。如果成功插入数据,表示通过logstash日志采集成功的同步数据了。

  • 我的微信
  • 加好友一起交流!
  • weinxin
  • 微信公众号
  • 关注公众号获取分享资源!
  • weinxin