logstash增量同步mysql数据至kafka实践

本文详细介绍了如何在Windows和Linux环境下使用Logstash安装和配置插件,实现从MySQL同步数据到Kafka的过程。包括安装步骤、插件配置、数据源设置及输出目标设定。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、windows环境

  1. 安装logstash:https://artifacts.elastic.co/downloads/logstash/logstash-5.5.0.zip 解压即可
  2. 测试安装是否成功:logstash -e 'input { stdin { } } output { stdout {} }' (在解压目录bin下)
  3. 安装logstash-input-jdbc插件 :
  1. 、修改Gemfile文件下镜像地址为https://gems.ruby-china.org或者https://ruby.taobao.org
  2. 、进入bin目录下,执行logstash-plugin install logstash-input-jdbc(若出现错误则执行logstash-plugin install --no-verify logstash-input-jdbc)
  1. 同步mysql数据到kafka:
  1. 、新建配置文件XXX.conf
  2. 、添加配置(详情见附件)
  3. 运行logstash -f xxx.conf启动

 

 

  • Linux环境

 

  1. 安装logstash:wget https://artifacts.elastic.co/downloads/logstash/logstash-5.5.0.zip
  2. 下载完之后:unzip logstash-5.5.0.zip 之后将文件移动到自己存放的目录即可。
  3. 测试一下是否安装成功:cd bin ./logstash -e 'input { stdin { } } output { stdout {} }' 如图

4、安装logstash-input-jdbc插件 :

(1)、修改Gemfile文件下镜像地址为https://gems.ruby-china.org/或者https://ruby.taobao.org/

(2)、进入bin目录下,执行logstash-plugin install logstash-input-jdbc(若出现错误则执行logstash-plugin install --no-verify logstash-input-jdbc)

5、同步mysql数据到kafka:

(1)、新建配置文件XXX.conf

(2)、添加配置(详情见附件)

(3)运行./logstash -f xxx.conf启动,如下图:

 

logstash对于数据对接很强大 ,比如集群日志集中存储方便管理以及查问题,我用到的业务场景是用户的操作记录日志分析,因为分析这边是大数据的范围,涉及到流式计算等问题,相较于分库分表的mysql,kafka显然更为切合场景,以下为配置文件详情:

input {
    jdbc {
      jdbc_connection_string => "jdbc:mysql://172.0.0.1:3306/test"
      jdbc_user => "shen"
      jdbc_password => "shenyanwei"
      jdbc_driver_library => "/data/logstash/mysql-connector-java-5.1.6.jar"
      jdbc_driver_class => "com.mysql.jdbc.Driver"
      statement => "SELECT tab1.*,tab2.action,tab2.chname,tab2.flag,tab2.relation_page,tab2.system,tab2.type,tab2.uri,tab3.cnName,tab3.email,tab3.orgCode from BEHAVIOR_RECORD tab1 LEFT JOIN BEHAVIOR_MAPPING tab2 ON  tab1.action_id=tab2.id LEFT JOIN USER tab3 ON tab1.ops_user=tab3.name where tab1.id > :sql_last_value  order by tab1.id"
	  use_column_value => true
      tracking_column => "id"        
      tracking_column_type => "numeric"
      record_last_run => true
    #此配置指定上面cloumn增量条件列值存放位置,记得给初始值如:--- 0
      last_run_metadata_path => "/data/logstash/number.log"
	  schedule => "* * * * *"
	  type => "jdbc"
        

    }
 此处多数据源省略。。。。
}

filter {
  date {
    match => [ "start_time", "yyyy-MM-dd HH:mm:ss" ]
    timezone => "Asia/Shanghai"
  }
  date {
    match => [ "end_time", "yyyy-MM-dd HH:mm:ss" ]
    timezone => "Asia/Shanghai"
  }
}

 output {
     stdout {
        codec => json_lines
    }
	file {
            path => "/data/logstash/file.log"
    }
   kafka {
        kafka topic
        topic_id => "test"
        #kafka地址
       bootstrap_servers => "localhost:9092"
        #json交互
        codec => "json"
        client.id
        client_id => "test2"
	}
 }

中途值得注意的是logstash不同版本对于jdk版本有不同要求,高版本的需要jdk1.8才行,另外高版本的logstash貌似已经集成logstash-input-jdbc插件,故而安装步骤高版本可以省略

以上为本人实践记录,大家可以在有困难时参考一二,有不对的地方也欢迎指正交流,共同进步

 

 

### 关于 MySQL 和 Elasticsearch 数据同步的方法 #### 方法一:基于 Logstash数据同步 Logstash 是一种广泛使用的工具,能够从多种来源收集并处理数据,最终将其传输至目标存储库。通过配置 Logstash 插件,可以从 MySQL 中提取增量全量数据,并实时加载到 Elasticsearch 中[^2]。 以下是使用 Logstash 进行 MySQL 到 Elasticsearch 同步的一个基本配置示例: ```yaml input { jdbc { jdbc_driver_library => "/path/to/mysql-connector-java.jar" jdbc_driver_class => "com.mysql.cj.jdbc.Driver" jdbc_connection_string => "jdbc:mysql://localhost:3306/your_database" jdbc_user => "root" statement => "SELECT * FROM your_table WHERE updated_at > :sql_last_value" use_column_value => true tracking_column => "updated_at" schedule => "* * * * *" # 每分钟执行一次 } } output { elasticsearch { hosts => ["http://localhost:9200"] index => "your_index_name" document_id => "%{id}" } } ``` 此方法适合中小规模的应用场景,但对于高并发环境可能需要额外优化性能[^2]。 --- #### 方法二:利用 Binlog 实现实时同步 Binlog 是 MySQL 提供的一种日志功能,记录了数据库中的每一项变更操作。通过解析这些日志文件,可以捕获所有的更新事件并将它们转发给 Elasticsearch。这种方法通常依赖第三方工具如 **Maxwell** 或 **Canal** 来完成。 ##### Maxwell 配置实例: 安装并运行 Maxwell 后,可以通过以下命令启动服务,将 MySQL 的变更流式推送到 Kafka 或其他消息队列中,再由消费者程序写入 Elasticsearch[^1]。 ```bash maxwell --user='maxwell' \ --password='password' \ --host='127.0.0.1' \ --producer=kafka \ --kafka.bootstrap.servers=localhost:9092 ``` 随后,在消费端编写逻辑来监听 Kafka 主题,并将接收到的消息索引到 Elasticsearch 中。 --- #### 方法三:双写模式 (Dual Writing) 在这种方式下,应用程序在向 MySQL 执行写入的同时也直接调用 Elasticsearch API 更新对应的文档内容。虽然实现起来较为简单直观,但它存在一定的风险——如果两者的状态未能保持一致,则可能导致不一致性问题发生[^1]。 为了缓解这一隐患,建议引入事务机制或者幂等设计原则以增强系统的可靠性。 --- #### 方法四:借助 ETL 工具(例如 Apache Nifi) Apache NiFi 是一款强大的分布式、可靠且易扩展的系统集成框架,支持复杂的工作流程编排以及异构数据源间的交互。它内置了许多处理器节点用于连接不同的技术栈,比如读取关系型数据库表并通过 HTTP 请求提交 JSON 负载至 RESTful 接口等动作均可轻松定义出来[^1]。 下面展示了一个简单的 NiFi 流程片段截图说明如何设置此类任务。(由于无法嵌入图片,请自行查阅官方文档获取更多细节) ![nifi-flow](https://example.com/nifi_flow_diagram) --- 综上所述,每种策略都有各自适用范围及其局限性,具体选择哪一种取决于实际业务需求和技术条件等因素综合考量之后决定最为合适的方式。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值