随着平台的业务日益增多,基于数据库的全文搜索查询速度较慢,已经无法满足需求。所以,决定基于Elasticsearch 做一个全文搜索平台,支持业务相关的搜索需求。那么第一个问题就是:如何从MySQL同步数据到Elasticsearch?
该方案上次有详细说明过,这里就简单描述一下。
Logstash同步数据流程图:

优点: 1、组件少,只需要Logstash就可以实现; 2、配置简单,配置Logstash文件就可以。
缺点: 在数据量很大的情况下,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同步数据流程图:

优点:
- 1、canal是同步MySQL的binlog日志,不需要全量更新数据;
-
- 2、Kafka是一个高吞吐量的分布式发布订阅消息系统,性能高速度快。
- 复制代码
缺点:
- 1、组件较多,有canal-server、Kafka 和canal-adapter 三个组件;
-
- 2、配置相对复杂。
- 复制代码
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;
- 复制代码
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/con