MySQL同步数据到Elasticsearch

为了提高全文搜索性能,本文介绍了两种从MySQL同步数据到Elasticsearch的方法:使用Logstash和基于canal。Logstash方案简洁但可能在大数据量下成为瓶颈;canal方案涉及多个组件,包括canal-server、Kafka和canal-adapter,适用于复杂场景。文中详细阐述了每个方案的步骤和配置文件示例。

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

背景

随着平台的业务日益增多,基于数据库的全文搜索查询速度较慢,已经无法满足需求。所以,决定基于Elasticsearch 做一个全文搜索平台,支持业务相关的搜索需求。那么第一个问题就是:如何从MySQL同步数据到Elasticsearch?

解决方案一:基于Logstash同步数据

该方案上次有详细说明过,这里就简单描述一下。

Logstash同步数据流程图:

优点: 1、组件少,只需要Logstash就可以实现; 2、配置简单,配置Logstash文件就可以。

缺点: 在数据量很大的情况下,Logstash可能会成为性能瓶颈

流程步骤

docker 启动Logstash

// docker启动logstash
docker run --name logstash -d -p 5044:5044 -v D:\work\iio\dockerFile\logstash\data:\usr\share\logstash logstash:7.11.2
复制代码

修改配置文件

进入logstash容器中修改配置文件

1)修改/config/logstash.yml 中的es地址
2)修改/pipeline/logstash.conf 中的相关配置(input、output、filler)
复制代码

logstash.conf 配置文件(仅供参考):

jdbc {
        jdbc_connection_string => "jdbc:mysql://127.0.0.1:3306/dedao"
        jdbc_user => "root"
        jdbc_password => "****"
        jdbc_driver_library => "/usr/share/logstash/driver/mysql-connector-java-8.0.23.jar"
        jdbc_driver_class => "com.mysql.jdbc.Driver"
        jdbc_paging_enabled => "true"
        jdbc_page_size => "50000"
        lowercase_column_names => false
        # statement_filepath => "filename.sql"
        statement => "SELECT id, name FROM a"
        schedule => "* * * * *"
        type => "product"
    }

output {

        if[type]=="product"{
        elasticsearch {
            hosts => ["127.0.0.1:9200"]
            #manage_template => false
            #template_name => "myik"
            #template => "/usr/share/logstash/template/test_template.json"
            #template_overwrite => true
            document_id => "%{salesNo}"
            index => "logstash-dedao"
        }

        }
}
复制代码

解决方案二:基于canal同步数据

canal同步数据流程图:

优点:

    1、canal是同步MySQL的binlog日志,不需要全量更新数据;

    2、Kafka是一个高吞吐量的分布式发布订阅消息系统,性能高速度快。
复制代码

缺点:

    1、组件较多,有canal-server、Kafka 和canal-adapter 三个组件;

    2、配置相对复杂。
复制代码

流程步骤

修改MySQL配置

1、修改/etc/mysql/my.cnf 配置文件,开启binlog日志

[mysqld]
# 打开binlog
log-bin=mysql-bin
# # 选择ROW(行)模式
binlog-format=ROW
# # 配置MySQL replaction需要定义,不要和canal的slaveId重复
server_id=1
pid-file  = /var/run/mysqld/mysqld.pid
socket    = /var/run/mysqld/mysqld.sock
datadir    = /var/lib/mysql
#log-error  = /var/log/mysql/error.log
# By default we only accept connections from localhost
#bind-address  = 127.0.0.1
# Disabling symbolic-links is recommended to prevent assorted security risks
symbolic-links=0
character-set-server=utf8mb4
lower_case_table_names=1
sql-mode=STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION
复制代码

2、在Navicat或DataGrip等终端执行命令,配置canal账号

grant SELECT, REPLICATION SLAVE, REPLICATION CLIENT on *.* to 'canal'@'%' identified by "canal";

flush privileges;
复制代码

docker 启动canal-server

1、启动canal-server

// 启动canal-server
docker run -p 11111:11111 --name canal -d canal/canal-server:v1.1.5

// 拷贝配置文件到本都路径
docker cp canal:/home/admin/canal-server/conf/example/instance.properties /Users/
### 数据同步方法 为了实现从MySQLElasticsearch数据同步,可以采用多种工具和技术来完成这一目标。其中一种流行的方式是使用Logstash作为中间件来进行数据传输和处理[^1]。 #### 使用 Logstash 进行 MySQLElasticsearch数据同步 Logstash 是一款开源服务器端数据处理管道,能够接收来自不同来源的数据并将其发送给指定的目标存储系统,在这里即为Elasticsearch。它支持丰富的插件机制,允许用户轻松定义输入源以及输出目的地。对于本场景而言: - **输入(Input)**: 可以设置JDBC输入插件连接至MySQL数据库读取所需记录; - **过滤(Filter)** (可选): 如果有需要转换或者清洗数据的需求,则可以在该阶段加入相应逻辑; - **输出(Output)**: 配置Elasticsearch输出插件指向目的ES集群实例; 具体操作上,需先下载安装好Logstash软件包,并编辑其配置文件`logstash.conf`来描述上述流程细节。例如下面给出了一段简单的配置片段用于演示如何加载MySQL表单条目并通过HTTP协议推送到远端运行着的Elasticsearch节点中去[^4]: ```ruby input { jdbc { jdbc_connection_string => "jdbc:mysql://localhost:3306/testdb" jdbc_user => "root" jdbc_password => "" statement_filepath => "/path/to/your/sqlfile.sql" } } output { elasticsearch { hosts => ["http://172.xx.xx.xx:9200"] index => "%{[@metadata][index]}" } } ``` 另外值得注意的是当涉及到增量更新而非全量迁移时,通常会借助于MySQL自身的二进制日志(binlog),以此捕获发生在源库上的任何更改事件再转发出去。这种方式能有效减少不必要的重复劳动同时也提高了整体效率[^2]。 #### Spring Boot 整合方案 除了基于ELK栈外另一种可行的选择就是依托Spring框架生态体系构建微服务应用,内部集成了诸如BBoss这样的第三方组件辅助完成异构平台间的信息交换工作流。开发者只需遵循官方文档指导创建工程结构即可快速启动开发环境进而开展后续业务编码活动[^3]. ```java @SpringBootApplication public class EsApplication { public static void main(String[] args) { SpringApplication.run(EsApplication.class, args); } @Bean RestHighLevelClient restHighLevelClient() { return new RestHighLevelClient( RestClient.builder(new HttpHost("localhost", 9200, "http"))); } } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值