elastic8.4.0搜索+logstash<=>mysql实时同步+kibana可视化操作+netcore代码笔记
做全文搜索,es比较好用,安装可能有点费时费力。mysql安装就不说了。主要是elastic8.4.0+kibana8.4.0+logstash-8.16.1,可视化操作及少了netcore查询代码。
安装elastic8.4.0+kibana8.4.0使用docker-desktop,logstash-8.16.1是线程解压执行文件。
- 1. docker-compose.yml 如下: 首先使用docker network创建一个es-net内部通讯网络,这样kibana连接es可以通过容器名ELASTICSEARCH_HOSTS=http://elasticsearch:9200,此作为单机测试使用单机的es.
services: elasticsearch:
container_name: elasticsearch
image: docker.elastic.co/elasticsearch/elasticsearch:8.4.0
environment:
- discovery.type=single-node
ulimits:
memlock:
soft: -1
hard: -1
cap_add:
- IPC_LOCK
ports:
- "9200:9200"
networks:
- es-net kibana:
container_name: kibana
image: docker.elastic.co/kibana/kibana:8.4.0
environment:
- ELASTICSEARCH_HOSTS=http://elasticsearch:9200
ports:
- "5601:5601"
networks:
- es-net networks:
es-net:
driver: bridge
作为es的8以上版本是有账号密码和crt证书的,需要做如下配置:
安装好es后默认给一个elastic账号,需要重置一下密码,进入es容器执行重置密码命令,会给你一个密码。
docker exec -it -u root elasticsearch /bin/bash
bin/elasticsearch-reset-password -u elastic

这里登录的其实是https带证书的,但是kibana使用的是http的,所以在容器内部,config/elasticsearch.yml中需要把下面的两个参数置为false ,生产环境不建议这么操作。

因为es带账号密码,所以kibana连接es也需要账号密码信息,但是默认的elastic是超级管理员,kibana默认是不支持的,需要自己新建账号。但是es默认是给了账号的,用他的就行。自己新建es账号给一个超级管理员角色依然没有重建所应权限,导致kibana起不来,用kibana_system就行。

进入es容器内部给kibana_system重置一个密码,用下面的命令在内部调用也行,我设置的elastic和kibana_system的密码一样,方便使用。
curl -u elastic:DiVnR2F6OGYmP+Ms+n2o -X POST "http://localhost:9200/_security/user/kibana_system/_password" -H 'Content-Type: application/json' -d'
{
"password": "DiVnR2F6OGYmP+Ms+n2o"
}
'

- 2. 然后在kibana容器中,加上账号密码信息即可,重启。还有最后一行加上i18n.locale: zh-CN ,改变ui为中文。

然后通过开发工具就可以做es的调试了,这里注意下需要中文分词的可以去 https://github.com/infinilabs/analysis-ik/releases 下载对应版本8.4.0的中文分词器 ,改个名放到es容器内plugins中去。也可以自定义分词文件丢进去


- 3. 下面就是logstash安装跟mysql的同步了,测试数据如下:

首先去logstash官网下载对应的包,我选的版本是8.16.1,目录如下是可以通过控制台执行的。

这里只需要配置好mysql-connector的驱动和链接信息即可。

jdbc.conf文件内容如下:
input {
stdin {}
jdbc {
type => "jdbc"
# 数据库连接地址
jdbc_connection_string => "jdbc:mysql://192.168.200.2:3306/bbs?characterEncoding=UTF-8&autoReconnect=true"
# 数据库连接账号密码;
jdbc_user => "admin"
jdbc_password => "这是密码"
# MySQL依赖包路径;
jdbc_driver_library => "D:\software\logstash-8.16.1\mysql\mysql-connector-j-8.0.32.jar"
# the name of the driver class for mysql
jdbc_driver_class => "com.mysql.jdbc.Driver"
# 数据库重连尝试次数
connection_retry_attempts => "3"
# 判断数据库连接是否可用,默认false不开启
jdbc_validate_connection => "true"
# 数据库连接可用校验超时时间,默认3600S
jdbc_validation_timeout => "3600"
# 开启分页查询(默认false不开启);
jdbc_paging_enabled => "true"
# 单次分页查询条数(默认100000,若字段较多且更新频率较高,建议调低此值);
jdbc_page_size => "500"
# statement为查询数据sql,如果sql较复杂,建议配通过statement_filepath配置sql文件的存放路径;
# sql_last_value为内置的变量,存放上次查询结果中最后一条数据tracking_column的值,此处即为ModifyTime;
# statement_filepath => "mysql/jdbc.sql"
statement => "SELECT ArticleID,UserID,ArticleTitle,ArticleContent,ImageAddress,StandPoint,PublishTime,`Status`,Likes, Shares,Comments,Reports, Sort,PublishingMode,SourceType,Reply,IsTop,TopEndTime,Hot,EditUserId,CreatedTime,EditTime,UserType,UserNickname,ForbiddenState,PublishDateTime,TopArea,SubscribeType,CollectionCount,Articletype,NewsID,CommentUserCount,TopStartTime,`View`,ViewDuration,Forwardings,ForwardingFId,Freshness,Shelf_Reason,AuditTime FROM bbs_articles"
# 是否将字段名转换为小写,默认true(如果有数据序列化、反序列化需求,建议改为false);
lowercase_column_names => false
# Value can be any of: fatal,error,warn,info,debug,默认info;
sql_log_level => warn
#
# 是否记录上次执行结果,true表示会将上次执行结果的tracking_column字段的值保存到last_run_metadata_path指定的文件中;
record_last_run => true
# 需要记录查询结果某字段的值时,此字段为true,否则默认tracking_column为timestamp的值;
use_column_value => true
# 需要记录的字段,用于增量同步,需是数据库字段
tracking_column => "PublishTime"
# Value can be any of: numeric,timestamp,Default value is "numeric"
tracking_column_type => timestamp
# record_last_run上次数据存放位置;
last_run_metadata_path => "mysql/last_id.txt"
# 是否清除last_run_metadata_path的记录,需要增量同步时此字段必须为false;
clean_run => false
#
# 同步频率(分 时 天 月 年),默认每分钟同步一次;
schedule => "* * * * *"
}
}
filter {
json {
source => "message"
remove_field => ["message"]
}
# convert 字段类型转换,将字段TotalMoney数据类型改为float;
mutate {
convert => {
# "TotalMoney" => "float"
}
}
}
output {
elasticsearch {
# host => "127.0.0.1"
# port => "9200"
# 配置ES集群地址
# hosts => ["192.168.1.1:9200", "192.168.1.2:9200", "192.168.1.3:9200"]
hosts => ["127.0.0.1:9200"]
user => "elastic"
password => "DiVnR2F6OGYmP+Ms+n2o"
ssl => false
# 索引名字,必须小写
index => "bbs_act"
# 数据唯一索引(建议使用数据库KeyID)
document_id => "%{ArticleID}"
}
stdout {
codec => json_lines
}
}
配置文成后执行该命令,数据实时同步开始
bin\logstash.bat -f mysql\jdbc.conf

可以通过kibana的discover查看数据,也可以通过开发工具查询,elk日志就是这么玩。


- 4. 下面就是代码,这里的实体没给全,注意实体需要给Text的Name属性,否则会解析不到数据的:
public class ArticleEsContext : EsBase<ArticleDto>
{
public ArticleEsContext(EsConfig esConfig) : base(esConfig)
{
} public override string IndexName => "bbs_act"; public async Task<List<ArticleDto>> GetArticles(ArticleParameter parameter)
{
var client = _esConfig.GetClient(IndexName); // 计算分页的起始位置
var from = (parameter.PageNumber - 1) * parameter.PageSize; var searchResponse = await client.SearchAsync<ArticleDto>(s => s
.Index(IndexName)
.Query(q => q
.Bool(b => b
.Should(
sh => sh.Match(m => m
.Field(f => f.ArticleTitle) // 查询 ArticleTitle
.Query(parameter.KeyWords)
.Fuzziness(Fuzziness.Auto) // 启用模糊查询
),
sh => sh.Match(m => m
.Field(f => f.ArticleContent) // 查询 ArticleContent
.Query(parameter.KeyWords)
.Fuzziness(Fuzziness.Auto) // 启用模糊查询
)
)
.MinimumShouldMatch(1) // 至少一个条件必须匹配
)
)
.From(from) // 设置分页的起始位置
.Size(parameter.PageSize) // 设置每页大小
); if (!searchResponse.IsValid)
{
Console.WriteLine(searchResponse.DebugInformation);
return new List<ArticleDto>();
} return searchResponse.Documents.ToList();
}
} public class ArticleDto
{
[Text(Name = "ArticleID")]
public int ArticleId { get; set; }
[Text(Name = "ArticleTitle")]
public string ArticleTitle { get; set; }
[Text(Name = "ArticleContent")]
public string ArticleContent { get; set; }
[Date(Name = "CreatedTime")]
public DateTime CreatedTime { get; set; }
}
代码调用结果如下:


elastic8.4.0搜索+logstash<=>mysql实时同步+kibana可视化操作+netcore代码笔记的更多相关文章
- 使用Logstash来实时同步MySQL数据到ES
上篇讲到了ES和Head插件的环境搭建和配置,也简单模拟了数据作测试 本篇我们来实战从MYSQL里直接同步数据 一.首先下载和你的ES对应的logstash版本,本篇我们使用的都是6.1.1 下载后使 ...
- zabbix3.0.4监控mysql主从同步
zabbix3.0.4监控mysql主从同步 1.监控mysql主从同步原理: 执行一个命令 mysql -u zabbix -pzabbix -e 'show slave status\G' 我们在 ...
- mysql实时同步到mssql的解决方案
数据库在应用程序中是必不可少的部分,mysql是开源的,所以很多人它,mssql是微软的,用在windows平台上是非常方便的,所以也有很多人用它.现在问题来了,如何将这两个数据库同步,即数据内容保持 ...
- Elasticsearch搜索常用API(利用Kibana来操作)
上面我们已经介绍了Elasticsearch的一些基本操作,这篇文章属于进阶篇,我们一起来学习. 前面我们创建了sdb和user文档,现在我们来看如何查询user中所有的文档呢? GET /sdb/u ...
- mysql数据实时同步到Elasticsearch
业务需要把mysql的数据实时同步到ES,实现低延迟的检索到ES中的数据或者进行其它数据分析处理.本文给出以同步mysql binlog的方式实时同步数据到ES的思路, 实践并验证该方式的可行性,以供 ...
- elasticsearch+logstash_jdbc 实现mysql数据实时同步至es
jdk安装1.8版本,es.ls.ik.kibana版本一致我这里使用的6.6.2版本 安装es tar xf elasticsearch-6.6.2.tar.gz mv elasticsearch- ...
- ClickHouse和他的朋友们(9)MySQL实时复制与实现
本文转自我司大神 BohuTANG的博客 . 很多人看到标题还以为自己走错了夜场,其实没有. ClickHouse 可以挂载为 MySQL 的一个从库 ,先全量再增量的实时同步 MySQL 数据,这个 ...
- rsync+inotify实现实时同步案例--转
转自:http://chocolee.blog.51cto.com/8158455/1400596 随着应用系统规模的不断扩大,对数据的安全性和可靠性也提出的更好的要求,rsync在高端业务系统中也逐 ...
- Rsync+inotify实现实时同步
1.1 inotify介绍 inotify是一种强大的.细粒度的.异步的文件系统事件控制机制.linux内核从2.6.13起,加入了inotify支持,通过inotify可以监控文件系统中添加.删除. ...
- MySQL半同步复制搭建
默认情况下,MySQL 5.5/5.6/5.7和MariaDB 10.0/10.1的复制是异步的,异步复制可以提供最佳性能,主库把binlog日志发送给从库,这一动作就结束了,并不会验证从库是否接收完 ...
随机推荐
- python之re库,正则表达
一.前言 为什么要学re库呢?这里主要学他的正则表达,在编写安全脚本的时候肯定要遇到一些不规则的匹配规则,当然编写爬虫也少不了正则匹配去找到一些具有特殊特征的字符串.因此这是十分必要的,然而.re库使 ...
- RxJS 系列 – Join Creation Operators
前言 我们一样从简单和常用的入手. 第一篇介绍了 Creation Operators 上一篇介绍了 Filter Operators 这一篇来到 Join Creation Operators. 参 ...
- c# 常用反射和表达式树整理
更新: 2021-06-19 反射 local function https://stackoverflow.com/questions/43348128/reflection-how-do-i-fi ...
- vue-i18n 8.28.2(完成)
https://kazupon.github.io/vue-i18n/zh/introduction.html 开始 如果使用模块系统 (例如通过 vue-cli),则需要导入 Vue 和 VueI1 ...
- Log4j2—漏洞分析(CVE-2021-44228)
目录 Log4j2漏洞原理 漏洞根因 调用链源码分析 调用链总结 漏洞复现 dns rmi Log4j2漏洞原理 前排提醒:本篇文章基于我另外一篇总结的JNDI注入后写的,建议先看该文章进行简单了解J ...
- JavaScript —— 简介-引入方式
什么是JavaScript? JavaScript的引入方式:
- Android USB 整条通知链分析
以Android13 为例:在Android 13中,USB插入拔出事件的通知链从硬件层到应用层,依次经过硬件.内核.HAL.Framework.以及应用广播等多个模块,整个流程涉及的具体文件和逻辑如 ...
- 导入员工 excel 批量上传
1. 安装 包 npm i xlsx yarn add xlsx 2. 封装一个上传的组件 src/components/UploadExcel/index.vue code : <te ...
- centos7安装python3.12
centos7 安装升级 python3.12 centos7 默认的 gcc 和 g++ 版本都很低,在有 --enable-optimizations 选项时会编译报错,因此要在 scl 环境下编 ...
- Idea启动多服务时的Dashboard展示
1.提换.idea/workspace.xml文件中的RunDashboard标签 <component name="RunDashboard"> <option ...