Windows环境利用Elasticsearch+Kibana+Logstash搭建搜索引擎并实现实时同步MySQL数据,超详细步骤

本文详述了在Windows环境中配置JAVA环境,然后逐步安装Elasticsearch、Kibana和Logstash,实现与MySQL数据库的实时同步。通过Logstash的JDBC输入插件连接MySQL,将数据导入Elasticsearch,并通过Kibana进行管理和调试。最后,文章指出,Kibana的Dev Tools是学习和调试ES请求的好地方。

背景:博主在做的一个项目是wamp环境下的电商平台,其搜索方式为sql查询,效率低下,准确率也非常感人,所以就尝试着在Windows环境下搭建一套搜索引擎,经过多方查阅,发现Elasticsearch(简称ES)是一个比较好的搜索引擎,也支持JDBC与MYSQL对接,并可以利用RESTful API CURL方式提供搜索服务,独立性强,扩展性好,于是就决定用它来做开发了。

Step 1:Windows下的JAVA环境配置

首先:下载JDK
然后,按照自己的系统环境安装JDK,网上很多教程,这里就略过了。顺便说一句Elasticsearch至少需要java8,官方建议高于1.8.0_131。这里也不建议安装java10,不然你有可能会遇到这样的bug。

Unrecognized VM option 'UseParNewGC' 
Error: Could not create the Java Virtual Machine.
Error: A fatal exception has occurred. Program will exit.

博主装的是jdk-8u181-windows-x64.exe
安装的时候还有两个坑

### 使用 Canal 全家桶结合 MySQL、Kafka、ElasticsearchKibana 实现全量与实时增量数据同步 #### 1. 方案概述 Canal 是一种高效的数据库 Binlog 解析工具,支持将 MySQL 的变更数据以消息的形式发送到 Kafka 等消息队列中。通过结合 Kafka、ElasticsearchKibana,可以构建一个高性能、可扩展的数据同步管道,满足全量和实时增量数据同步的需求。 - **MySQL**: 数据源。 - **Canal**: 捕获 MySQL 的 Binlog 日志将其转换为消息流。 - **Kafka**: 作为消息中间件存储和分发数据变更事件。 - **Elasticsearch**: 存储和查询最终的同步数据。 - **Kibana**: 提供可视化界面展示 Elasticsearch 中的数据。 --- #### 2. 技术选型理由 相比其他方案,如 Debezium,虽然它也可以实现类似的 CDC 功能,但由于其需要集成 Kafka 手动编写消费者代码,增加了系统的复杂性[^1]。而 Canal 提供了更简洁的接口和更高的易用性,适合快速搭建数据同步系统。 --- #### 3. 架构设计 整体架构分为以下几个部分: 1. **全量数据初始化**: 使用 LogstashMySQL 的存量数据导入到 Elasticsearch。 2. **增量数据同步**: 借助 Canal 捕获 MySQL 的 Binlog 变更,通过 Kafka 发送至 Elasticsearch。 3. **可视化展示**: 利用 Kibana 查询和展示 Elasticsearch 中的数据。 --- #### 4. 配置步骤 ##### 4.1 开启 MySQL 的 Binlog 功能 确保 MySQL 已经开启了 Binlog 功能,设置了合适的模式(推荐 ROW 模式)。编辑 `my.cnf` 文件: ```ini [mysqld] server-id=1 log-bin=mysql-bin binlog-format=ROW ``` 验证配置是否生效: ```sql SHOW VARIABLES LIKE 'log_bin'; SHOW MASTER STATUS; ``` 如果返回结果显示 `ON` 或具体的文件名,则说明配置成功[^1]。 --- ##### 4.2 配置 Canal Server 下载解压 Canal Server 至指定目录,修改核心配置文件 `instance.properties` 来适配您的 MySQL 数据环境: ```properties canal.instance.master.address=127.0.0.1:3306 canal.instance.dbUsername=canal_user canal.instance.dbPassword=your_password canal.instance.connectionCharset=UTF-8 canal.instance.filter.regex=my_database\\.my_table.* ``` 创建专门的 MySQL 用户赋予权限: ```sql CREATE USER 'canal_user'@'%' IDENTIFIED BY 'your_password'; GRANT SELECT, REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'canal_user'@'%'; FLUSH PRIVILEGES; ``` 启动 Canal Server 确认服务状态正常。 --- ##### 4.3 配置 Canal Adapter Canal Adapter 负责将 Canal 捕获的 Binlog 数据转发到 Kafka。编辑 `application.yml` 文件,添加以下内容: ```yaml spring: cloud: stream: bindings: input: destination: mysql_changes_topic canal: server: tcp://localhost:11111 kafka: bootstrapServers: localhost:9092 ``` 同时,还需定义好表结构与 Kafka Topic 的映射关系。可以在同级目录下找到 `mapping.json` 文件进行配置[^4]。 --- ##### 4.4 配置 Kafka Consumer 在 Kafka 上消费来自 Canal 的数据将其实时写入 Elasticsearch。可以通过编写简单的 Java 应用程序或者使用现有的工具(如 Confluent Kafka Connect 插件)来完成这一任务。 示例 Kafka Consumer 代码如下: ```java import org.apache.kafka.clients.consumer.ConsumerRecord; public class KafkaToEsConsumer { public static void main(String[] args) { Properties props = new Properties(); props.put("bootstrap.servers", "localhost:9092"); props.put("group.id", "es-group"); props.put("key.deserializer", "org.apache.kafka.common.serialization.StringDeserializer"); props.put("value.deserializer", "org.apache.kafka.common.serialization.StringDeserializer"); try (KafkaConsumer<String, String> consumer = new KafkaConsumer<>(props)) { consumer.subscribe(Collections.singletonList("mysql_changes_topic")); while (true) { ConsumerRecords<String, String> records = consumer.poll(Duration.ofMillis(100)); for (ConsumerRecord<String, String> record : records) { System.out.printf("Offset = %d, Key = %s, Value = %s%n", record.offset(), record.key(), record.value()); // 将记录写入 Elasticsearch writeToElasticsearch(record.value()); } } } } private static void writeToElasticsearch(String data) { RestHighLevelClient client = new RestHighLevelClient( RestClient.builder(new HttpHost("localhost", 9200, "http")) ); IndexRequest request = new IndexRequest("my_index"); request.source(data, XContentType.JSON); try { IndexResponse response = client.index(request, RequestOptions.DEFAULT); System.out.println(response.status().toString()); } catch (Exception e) { e.printStackTrace(); } finally { try { client.close(); } catch (IOException ignored) {} } } } ``` --- ##### 4.5 使用 Logstash 执行全量数据迁移 编写 Logstash 配置文件以从 MySQL 导入全量数据Elasticsearch: ```conf input { jdbc { jdbc_driver_library => "/path/to/mysql-connector-java.jar" jdbc_driver_class => "com.mysql.cj.jdbc.Driver" jdbc_connection_string => "jdbc:mysql://localhost:3306/mydb?useSSL=false&serverTimezone=UTC" jdbc_user => "root" statement => "SELECT id, name, age FROM users" } } output { elasticsearch { hosts => ["http://localhost:9200"] index => "users-index" } } ``` 执行命令加载此流程描述符即可触发一次性传输操作[^2]。 --- ##### 4.6 整合 Kibana 展现分析成果 最后一步是在 Kibana 中创建新的仪表盘项目,绑定先前设定好的索引名称 (`users-index`),从而直观查看效果变化趋势图谱等形式呈现出来[^3]。 --- ###
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值