• MySQL同步数据到Elasticsearch


    背景

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

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

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

    Logstash同步数据流程图

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

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

    流程步骤

    docker 启动Logstash

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

    修改配置文件

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

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

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

    1. jdbc {
    2. jdbc_connection_string => "jdbc:mysql://127.0.0.1:3306/dedao"
    3. jdbc_user => "root"
    4. jdbc_password => "****"
    5. jdbc_driver_library => "/usr/share/logstash/driver/mysql-connector-java-8.0.23.jar"
    6. jdbc_driver_class => "com.mysql.jdbc.Driver"
    7. jdbc_paging_enabled => "true"
    8. jdbc_page_size => "50000"
    9. lowercase_column_names => false
    10. # statement_filepath => "filename.sql"
    11. statement => "SELECT id, name FROM a"
    12. schedule => "* * * * *"
    13. type => "product"
    14. }
    15. output {
    16. if[type]=="product"{
    17. elasticsearch {
    18. hosts => ["127.0.0.1:9200"]
    19. #manage_template => false
    20. #template_name => "myik"
    21. #template => "/usr/share/logstash/template/test_template.json"
    22. #template_overwrite => true
    23. document_id => "%{salesNo}"
    24. index => "logstash-dedao"
    25. }
    26. }
    27. }
    28. 复制代码

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

    canal同步数据流程图:

    优点:

    1. 1、canal是同步MySQL的binlog日志,不需要全量更新数据;
    2. 2、Kafka是一个高吞吐量的分布式发布订阅消息系统,性能高速度快。
    3. 复制代码

    缺点:

    1. 1、组件较多,有canal-server、Kafka 和canal-adapter 三个组件;
    2. 2、配置相对复杂。
    3. 复制代码

    流程步骤

    修改MySQL配置

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

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

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

    1. grant SELECT, REPLICATION SLAVE, REPLICATION CLIENT on *.* to 'canal'@'%' identified by "canal";
    2. flush privileges;
    3. 复制代码

    docker 启动canal-server

    1、启动canal-server

    1. // 启动canal-server
    2. docker run -p 11111:11111 --name canal -d canal/canal-server:v1.1.5
    3. // 拷贝配置文件到本都路径
    4. docker cp canal:/home/admin/canal-server/con
  • 相关阅读:
    全志A33使用主线U-Boot方法
    windwos安装vcpkg(包含grpc)
    Squid服务
    大模型ReAct:思考与工具协同完成复杂任务推理
    chatGPT培训老师AIGC培训讲师叶梓:大模型这么火,我们在使用时应该关注些什么?-6
    python实现五子棋游戏(pygame版)(附零基础学习资料)
    linux系统nginx常用命令
    LabVIEW实现变风量VAV终端干预PID控制
    linux基本操作之gvim
    Rust借用几种变化情况分析
  • 原文地址:https://blog.csdn.net/java_beautiful/article/details/128160409