应用一:mysql数据增量同步到kafka

1 准备mysql测试表

mysql> create table test_sync(id int not null auto_increment, name varchar(32), description varchar(64), create_time timestamp, update_time timestamp, primary key(id));
Query OK, 0 rows affected (0.04 sec) mysql> insert into test_sync (name, description, create_time, update_time) values('test1', '', now(), now());
Query OK, 1 row affected (0.02 sec) mysql> select * from test_sync;
+----+-------+-------------+---------------------+---------------------+
| id | name | description | create_time | update_time |
+----+-------+-------------+---------------------+---------------------+
| 1 | test1 | 1 | 2019-03-13 10:45:49 | 2019-03-13 10:45:49 |
+----+-------+-------------+---------------------+---------------------+
1 row in set (0.00 sec)

2 准备kafka topic

# bin/kafka-topics.sh --zookeeper $zk:2181/kafka -create --topic test_sync --partitions 2 --replication-factor 2
WARNING: Due to limitations in metric names, topics with a period ('.') or underscore ('_') could collide. To avoid issues it is best to use either, but not both.
Created topic "test_sync".
# bin/kafka-topics.sh --zookeeper $zk:2181/kafka -describe --topic test_sync
Topic:test_sync PartitionCount:2 ReplicationFactor:2 Configs:
Topic: test_sync Partition: 0 Leader: 112 Replicas: 112,111 Isr: 112,111
Topic: test_sync Partition: 1 Leader: 110 Replicas: 110,112 Isr: 110,112

3 准备logstash conf

input {
jdbc {
jdbc_driver_library => "/path/to/mysql-connector-java-5.1.36-bin.jar"
jdbc_driver_class => "com.mysql.jdbc.Driver"
jdbc_connection_string => "jdbc:mysql://localhost:3306/database"
jdbc_user => "DBUSERNAME"
jdbc_password => "DBPASSWORD"
jdbc_paging_enabled => "true"
jdbc_page_size => "10000"
jdbc_default_timezone => "UTC"
statement => "select * from TABLE where id > :sql_last_value"
tracking_column => id
tracking_column_type => "numeric"
use_column_value => true
record_last_run => true
clean_run => false
#I have scheduled this to run in every second
schedule => "* * * * * * Asia/Shanghai"
}
}

output {
  kafka {
    bootstrap_servers => "192.168.0.1:9092,192.168.0.2:9092"
    topic_id => "test_sync"
    codec => json
  }
  stdout {codec => json}
}

注意

1)必须要设置时区,注意解析后的时间是UTC(会比Asia/Shanghai的时间晚8小时),如果希望解析后的时间和mysql中的时间保持一致,需要设置jdbc_default_timezone => "UTC";

2)最好设置分页;

3)增量有两种方式,

  • 一种是根据id,适用于数据创建之后不会修改的情形,对应 tracking_column_type => "numeric";
  • 一种是根据update_time,适用于每次创建或修改之后都会修改update_time的情形,对应 tracking_column_type => "timestamp";

第二种示例

  statement => "select * from table where update_time > :sql_last_value;"
tracking_column => "update_time"
tracking_column_type => "timestamp"

增量进度位于last_run_metadata_path,默认路径$HOME/.logstash_jdbc_last_run,如果一台机器上启动多个logstash需要每个单独配置

通过schedule控制多久执行一次增量同步;

4 启动logstash

$ logstash -f $conf

观察日志是否正常,日志中会显示执行的sql以及发送的消息;

[2019-03-13T22:43:00,312][INFO ][logstash.inputs.jdbc ] (0.000253s) SELECT version()
[2019-03-13T22:43:00,314][INFO ][logstash.inputs.jdbc ] (0.000564s) select * from test_sync where update_time > '2019-03-13 14:07:41';
{"update_time":"2019-03-13T06:42:40.000Z","id":1,"create_time":"2019-03-13T06:07:41.000Z","@version":"1","@timestamp":"2019-03-13T14:43:00.507Z","name":"test1","description":"2"}

进一步测试mysql修改和新增的情形,一切正常;

5 kafka确认

# $KAFKA_HOME/bin/kafka-console-consumer.sh --bootstrap-server 192.168.0.1:9092 --topic test_sync --from-beginning

6 可能的问题

报错can't dup Fixnum

[2019-03-13T22:19:46,790][ERROR][logstash.pipeline ] Pipeline aborted due to error {:pipeline_id=>"main", :exception=>#<TypeError: can't dup Fixnum>, :backtrace=>["org/jruby/RubyKernel.java:1882:in `dup'", "uri:classloader:/META-INF/jruby.home/lib/ruby/stdlib/date/format.rb:838:in `_parse'", "uri:classloader:/META-INF/jruby.home/lib/ruby/stdlib/date.rb:1830:in `parse'"...

这有可能是因为tracking_column之前按照numeric运行,后来改成timestamp,检查last_run_metadata_path,默认路径$HOME/.logstash_jdbc_last_run,如果是因为以上原因,删除即可

参考:

https://www.elastic.co/guide/en/logstash/current/plugins-inputs-jdbc.html

https://www.elastic.co/guide/en/logstash/current/plugins-outputs-kafka.html

https://stackoverflow.com/questions/31446405/incremental-mysql-reading-using-logstash

【原创】大数据基础之Logstash(2)应用之mysql-kafka的更多相关文章

  1. 【原创】大数据基础之Logstash(4)高可用

    logstash高可用体现为不丢数据(前提为服务器短时间内不可用后可恢复比如重启服务器或重启进程),具体有两个方面: 进程重启(服务器重启) 事件消息处理失败 在logstash中对应的解决方案为: ...

  2. 【原创】大数据基础之Logstash(3)应用之http(in和out)

    一个logstash很容易通过http打断成两个logstash实现跨服务器或者跨平台间数据同步,比如原来的流程是 logstash: nginx log -> kafka 打断成两个是 log ...

  3. 【原创】大数据基础之Logstash(1)简介、安装、使用

    Logstash 6.6.2 官方:https://www.elastic.co/products/logstash 一 简介 Centralize, Transform & Stash Yo ...

  4. 【原创】大数据基础之Logstash(5)监控

    有两种方式来监控logstash: api ui(xpack) When you run Logstash, it automatically captures runtime metrics tha ...

  5. 【原创】大数据基础之Logstash(3)应用之file解析(grok/ruby/kv)

    从nginx日志中进行url解析 /v1/test?param2=v2&param3=v3&time=2019-03-18%2017%3A34%3A14->{'param1':' ...

  6. 【原创】大数据基础之Logstash(6)mongo input

    logstash input插件之mongodb是第三方的,配置如下: input { mongodb { uri => 'mongodb://mongo_server:27017/db' pl ...

  7. 【原创】大数据基础之Gobblin(2)持久化kafka到hdfs

    gobblin 0.10 想要持久化kafka到hdfs有很多种方式,比如flume.logstash.gobblin,其中flume和logstash是流式的,gobblin是批处理式的,gobbl ...

  8. 【原创】大数据基础之Zookeeper(2)源代码解析

    核心枚举 public enum ServerState { LOOKING, FOLLOWING, LEADING, OBSERVING; } zookeeper服务器状态:刚启动LOOKING,f ...

  9. 【原创】大数据基础之词频统计Word Count

    对文件进行词频统计,是一个大数据领域的hello word级别的应用,来看下实现有多简单: 1 Linux单机处理 egrep -o "\b[[:alpha:]]+\b" test ...

随机推荐

  1. SignalR 2.x入门(二):SignalR在MVC5中的使用

    开发(代码下载) 新建一个ASP.NET Web项目,项目类型为MVC,将认证模式改为无身份认证.在程序包管理控制台输入如下语句,安装SignalR <span style="font ...

  2. 自学python 4.

    1.li = ["alex","tom","mike","god","merffy"](1)a = ...

  3. 修改VS 2012调试默认浏览器

    首先用vs打开我们的工程文件,点击任意一个aspx文件,点右键,找到弹出菜单中的“浏览方式”,如图: 然后点击“浏览方式”或者“Browser with”,弹出如图对话框: 

  4. SQL Server进阶(四):联接-cross join、inner join、left join、right jion、union、union all

    测试数据脚本 CREATE TABLE Atable ( S# INT, Sname ), Sage INT, Sfrom ) ) insert into Atable ,N,N'A' union a ...

  5. 【十三】jvm 性能调优工具之 jstack

    一.介绍 jstack是java虚拟机自带的一种堆栈跟踪工具.jstack用于打印出给定的java进程ID或core file或远程调试服务的Java堆栈信息,如果是在64位机器上,需要指定选项&qu ...

  6. Mysql 的远程设置 和链接方式

    Mysql 设置远程链接: > grant all privileges on *.* to 用户@localhost identified by '密码'; > flush privil ...

  7. 状压DP初探·总结

    2018过农历新年这几天,学了一下状态压缩动态规划,现在先总结一下.   状态压缩其实是一种并没有改变dp本质的优化方法,阶段还是要照分,状态还是老样子,决策依旧要做,转移方程还是得列,最优还是最优, ...

  8. Spring重温(三)--Spring依赖注入(DI)

    前言:在Spring框架中,DI(依赖注入)是用来定义对象彼此间的依赖,主要有set方法注入和构造器注入两种方式.另外,当一个类包含多个构造函数带的参数相同,它总是会造成构造函数注入参数类型歧义的问题 ...

  9. 【转载】双调排序Bitonic Sort,适合并行计算的排序算法

    双调排序是data-independent的排序, 即比较顺序与数据无关的排序方法, 特别适合做并行计算,例如用GPU.fpga来计算. 1.双调序列 在了解双调排序算法之前,我们先来看看什么是双调序 ...

  10. 和类相关的BIF

    issubclass(class,classinfo),判断第一个参数是第二个参数的子类,这个判断是比较宽松的判断.因为第二个参数也可以是元组,并且只要参数1是元组内任意一个元素的子元素,就会返回Tr ...