利用logstash同步100万MySQL数据到es

news/2025/1/13 0:54:14 标签: mysql, elasticsearch, 数据库

安装logstash和es这些看之前的一篇文章

第一步修改logstash.conf文件

input {
    jdbc {
    	jdbc_driver_library => "/usr/share/logstash/lib/mysql-connector-j-8.0.33.jar"
    	jdbc_driver_class => "com.mysql.cj.jdbc.Driver"
        jdbc_connection_string => "jdbc:mysql://192.168.150.7:3306/data-synchronism"
        jdbc_user => "root"
        jdbc_password => "root"
        
        #启用追踪,如果为true,则需要指定tracking_column
    	use_column_value => true
    	#指定追踪的字段,
    	tracking_column => "update_time"
        #追踪字段的类型,目前只有数字(numeric)和时间类型(timestamp),默认是数字类型
    	tracking_column_type => "timestamp"
        # 记录最后一次运行的结果
    	record_last_run => true
    	# 上面运行结果的保存位置  这个文件中保存着最后一次查询,update_time字段的值,下一次查询就可以用这个值来做where条件
    	last_run_metadata_path => "jdbc-position.txt"
        
        # 因为我上面使用的是timestamp追踪字段类型,sql_last_value这里开始的值是1970-01-01 00:00:00
        # 之后sql_last_value 的值就是最后一次查询 追踪字段的值,这个值保存在上方定义的 jdbc-position.txt文件中
        statement => "SELECT * from demo where update_time >:sql_last_value"
        # cron 定时  每秒执行一次
        schedule => " * * * * * *"
    }
}
# filter {
#   # 添加同步前的时间戳(这里用事件进入filter阶段的时间作为示例)
#   ruby {
#     code => "event.set('sync_before_time', Time.now.utc.iso8601)"
#   }
  
#   # ... 其他filter插件和代码 ...
  
#   # 在filter阶段末尾或适当位置添加同步完的时间戳(这里为了示例简单,仍然用当前时间)
#   # 注意:在实际应用中,这里的时间可能并不完全代表数据真正写入目标数据源的时间,
#   # 因为output阶段还可能存在延迟。因此,这个字段更多是作为逻辑上的“同步完”时间。
#   ruby {
#     code => "event.set('sync_after_time', Time.now.utc.iso8601)"
#   }
# }
output {
	elasticsearch {
        hosts => ["http://es1:9200", "http://es2:9200", "http://es3:9200"]
        # 索引:等于数据的名称
        index => "demo"
        # 文档id
        document_id => "%{id}"		# 指定文档id, %{}取字段中的值  id为字段名
        user => "elastic"
     	password => "elastic"
    }
    # 控制台也输出看看
 	stdout {
 		codec => rubydebug 
        # { metadata => true }
 	}		
}

上面配置自己的MySQL数据库地址

第二步创建数据库并造100万数据

create database `data-synchronism`;
use `data-synchronism`;
CREATE TABLE demo (
  id INT AUTO_INCREMENT PRIMARY KEY,
  username VARCHAR(50) NOT NULL,
  email VARCHAR(100) NOT NULL,
  create_time datetime,
  update_time datetime
);
DELIMITER $$
 
CREATE PROCEDURE generate_sample_data()
BEGIN
  DECLARE v_counter INT DEFAULT 0;
  WHILE v_counter < 1000000 DO
    INSERT INTO demo (username, email, create_time, update_time) VALUES (
      CONCAT('user', v_counter),
      CONCAT('user', v_counter, '@example.com'),
      NOW(),
      NOW()
    );
    SET v_counter = v_counter + 1;
  END WHILE;
END$$
 
DELIMITER ;
CALL generate_sample_data();

导入的时间会很长耐心等待

mysqlconnectorj8033jarmy_elklogstashlib_97">第三步将mysql-connector-j-8.0.33.jar上传到/my_elk/logstash/lib中

第四步通过docker-compose启动容器

docker-compose -f es.yml up -d

启动后马上把MySQL的驱动包复制到容器中

docker cp /my_elk/logstash/lib/mysql-connector-j-8.0.33.jar logstash:/usr/share/logstash/lib

最后重启一下logstash

docker restart logstash

最后验证同步数据

通过日志查看正在同步的数据

在这里插入图片描述

通过kibana查询es中的数据

在这里插入图片描述

同步100万数据的时间

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
容器创建的时间跟系统时间差了八小时,通过测试可以得出结果,因容器启动也需要时间,所以同步100万数据的大概时间是20分钟左右。

由于是本地测试,网络波动不是很大,如果是远程服务器测试,需要的时间大约是30分钟左右

同步500多万数据的时间

在这里插入图片描述
在这里插入图片描述
上面同步100万数据容器是冷启动的,这次500多万数据容器是热启动时间快了很多


http://www.niftyadmin.cn/n/5821362.html

相关文章

RS-232串口和普通串口介绍

RS-232串口和普通串口的区别主要体现在标准和信号电平的不同,虽然“串口”通常指的是基于串行通信的接口,但不同的串口标准在硬件实现和使用场景上有些不同。 RS-232串口 vs 普通串口的区别 RS-232 是一种具体的串行通信协议标准,而“普通串口”这个词通常是指没有明确标准定…

计算机网络之---TCP报文段

TCP报文段 TCP报文段是TCP协议中传输数据的基本单位。TCP协议基于流控制、顺序控制和错误校验等机制&#xff0c;以确保数据的可靠传输。TCP报文段结构由多个字段组成&#xff0c;每个字段在TCP的工作中都有特定的作用 一个典型的TCP报文段由两部分组成&#xff1a; TCP头部&a…

基于多Agent串联与大模型理解能力的智能背单词系统

基于多Agent串联与大模型理解能力的智能背单词系统 摘要 传统的背单词软件往往采用机械重复的记忆方式,缺乏个性化和趣味性,导致用户学习效率低下。本文将介绍一种基于多Agent串联与大模型理解能力的智能背单词系统。该系统通过多个具备思考、记忆和决策能力的Agent协同工作…

安装yarn时显示npm使用淘宝镜像安装报错

问题描述&#xff1a; npm使用淘宝镜像安装报错 错误原因&#xff1a; 淘宝原镜像域名&#xff08;registry.npm.taobao.org&#xff09;的 HTTPS 证书正式到期&#xff0c;npm 淘宝镜像已经从 registry.npm.taobao.org 切换到了 registry.npmmirror.com。解决方案&#xff1a;…

【JAVA面试】java权限修饰符

在 Java 中&#xff0c;访问权限&#xff08;Access Modifiers&#xff09;用于控制类、方法、成员变量等的访问范围。合理使用访问权限能够增强代码的安全性、封装性以及可维护性。 Java 的访问权限修饰符 Java 提供了以下四种访问权限修饰符&#xff0c;分别是&#xff1a; …

2024机器学习前沿:从大型语言模型到高效计算的技术创新与发展趋势

大型语言模型在多个领域的应用潜力及其推动的技术发展与创新 大型语言模型&#xff08;Large Language Models, LLMs&#xff09;如GPT-4、BERT等&#xff0c;凭借其强大的自然语言理解和生成能力&#xff0c;正在多个领域展现出广泛的应用潜力&#xff0c;推动相关技术的快速…

【赵渝强老师】什么是NoSQL数据库?

随着大数据技术的兴起&#xff0c;NoSQL数据库得到了广泛的应用。NoSQL的全称是Not Only SQL&#xff0c;中文含义是不仅仅是SQL。它泛指所有的非关系型数据库&#xff0c;即&#xff1a;在NoSQL数据库中存储数据的模型可能不是二维表的行和列。NoSQL数据库不遵循关系型数据库范…

盛最多水的容器(java解法)

给定一个长度为 n 的整数数组 height 。有 n 条垂线&#xff0c;第 i 条线的两个端点是 (i, 0) 和 (i, height[i]) 。 找出其中的两条线&#xff0c;使得它们与 x 轴共同构成的容器可以容纳最多的水。 返回容器可以储存的最大水量。 说明&#xff1a;你不能倾斜容器。 class…