MySQL同步数据到Elasticsearch

为了解决基于数据库的全文搜索查询速度慢的问题,本文介绍了两种将MySQL数据同步到Elasticsearch的方法:1) 使用Logstash,优点是组件少、配置简单,但可能在大数据量下成为性能瓶颈;2) 使用canal,通过Kafka进行中间数据传输,优点是高效且不需要全量更新,但配置较为复杂。详细步骤包括Logstash和canal的配置、启动以及Elasticsearch索引的创建和测试。

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

背景

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

解决方案

基于Logstash同步数据

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同步数据流程图:
Logstash同步数据流程图
优点:
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/Desktop/dockerData/canal
docker cp canal:/home/admin/canal-server/conf/canal.properties /Users/Desktop/dockerData/canal

// 挂载配置文件启动canal-server
docker run --name canal -p 11111:11111 -d -v /Users/Desktop/dockerData/canal/instance.properties:/home/admin/canal-server/conf/example/instance.properties -v /Users/Desktop/dockerData/canal/canal.properties:/home/admin/canal-server/conf/canal.properties canal/canal-server:v1.1.5

// 进入容器内部
docker exec -it canal /bin/bash

// 查看canal-server 日志
tail -500 /home/admin/canal-server/logs/canal/canal.log
tail -500 /home/admin/canal-server/logs/example/example.log

2、修改配置文件

instance.properties:

#################################################
## mysql serverId , v1.0.26+ will autoGen
canal.instance.mysql.slaveId=123

# enable gtid use true/false
canal.instance.gtidon=false

# position info
canal.instance.master.address=192.168.0.107:3306
canal.instance.master.journal.name=
canal.instance.master.position=
canal.instance.master.timestamp=
canal.instance.master.gtid
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值