
社区日报 第1422期 (2022-06-14)
1. 我想优化索引速度该怎么做?(需要梯子)
https://medium.com/trendyol-te ... 041dc
2. 用Elasticsearch的向量能力帮忙构建搜索引擎(需要梯子)
https://medium.com/carousell-i ... 155fc
3. 在SOC我们是怎么用ES的(需要梯子)
https://blog.devgenius.io/soc- ... 19f0c
编辑:斯蒂文
归档:https://ela.st/cn-daily-all
订阅:https://ela.st/cn-daily-sub
沙龙:https://ela.st/cn-meetup
B站:https://ela.st/bilibili
1. 我想优化索引速度该怎么做?(需要梯子)
https://medium.com/trendyol-te ... 041dc
2. 用Elasticsearch的向量能力帮忙构建搜索引擎(需要梯子)
https://medium.com/carousell-i ... 155fc
3. 在SOC我们是怎么用ES的(需要梯子)
https://blog.devgenius.io/soc- ... 19f0c
编辑:斯蒂文
归档:https://ela.st/cn-daily-all
订阅:https://ela.st/cn-daily-sub
沙龙:https://ela.st/cn-meetup
B站:https://ela.st/bilibili 收起阅读 »

社区日报 第1420期 (2022-06-12)
https://www.51cto.com/article/709633.html
2. 来自蚂蚁的Elasticsearch 容量评估
https://tech.antfin.com/docs/2/72660
3. Elastic 社区资深布道师,分享也是一种快乐
https://blog.csdn.net/ubuntuto ... 11543
编辑:cyberdak
归档:https://ela.st/cn-daily-all
订阅:https://ela.st/cn-daily-sub
沙龙:https://ela.st/cn-meetup
B站:https://ela.st/bilibili
https://www.51cto.com/article/709633.html
2. 来自蚂蚁的Elasticsearch 容量评估
https://tech.antfin.com/docs/2/72660
3. Elastic 社区资深布道师,分享也是一种快乐
https://blog.csdn.net/ubuntuto ... 11543
编辑:cyberdak
归档:https://ela.st/cn-daily-all
订阅:https://ela.st/cn-daily-sub
沙龙:https://ela.st/cn-meetup
B站:https://ela.st/bilibili 收起阅读 »

社区日报 第1421期 (2022-06-13)
https://cloud.tencent.com/deve ... 91540
2. Elasticsearch 向量搜索的工程化实战
https://ost.51cto.com/posts/11594
3. 京东:商品搜索系统架构设计
https://www.infoq.cn/article/j ... q.com
编辑:yuebancanghai
归档:https://ela.st/cn-daily-all
订阅:https://ela.st/cn-daily-sub
沙龙:https://ela.st/cn-meetup
B站:https://ela.st/bilibili
https://cloud.tencent.com/deve ... 91540
2. Elasticsearch 向量搜索的工程化实战
https://ost.51cto.com/posts/11594
3. 京东:商品搜索系统架构设计
https://www.infoq.cn/article/j ... q.com
编辑:yuebancanghai
归档:https://ela.st/cn-daily-all
订阅:https://ela.st/cn-daily-sub
沙龙:https://ela.st/cn-meetup
B站:https://ela.st/bilibili 收起阅读 »

社区日报 第1419期 (2022-06-11)
https://juejin.cn/post/7104138567479197703
2、如何搭建 ELK(Elasticsearch, Logstash, and Kibana) 系统
https://zijiancode.cn/archives/elkmd
3、elasticsearch 聚合查询如何在 java client 中实现
https://juejin.cn/post/7105199846608338957
编辑:李静
归档:https://ela.st/cn-daily-all
订阅:https://ela.st/cn-daily-sub
沙龙:https://ela.st/cn-meetup
B站:https://ela.st/bilibili
https://juejin.cn/post/7104138567479197703
2、如何搭建 ELK(Elasticsearch, Logstash, and Kibana) 系统
https://zijiancode.cn/archives/elkmd
3、elasticsearch 聚合查询如何在 java client 中实现
https://juejin.cn/post/7105199846608338957
编辑:李静
归档:https://ela.st/cn-daily-all
订阅:https://ela.st/cn-daily-sub
沙龙:https://ela.st/cn-meetup
B站:https://ela.st/bilibili 收起阅读 »

社区日报 第1418期 (2022-06-10)
https://medium.com/%40demianch ... 42e61
2、Django + Elasticsearch 实战
https://testdriven.io/blog/dja ... arch/
3、Kafka Connect Elasticsearch Sink Connector实现
https://www.kloia.com/blog/kaf ... 31736
编辑:铭毅天下
归档:https://ela.st/cn-daily-all
订阅:https://ela.st/cn-daily-sub
沙龙:https://ela.st/cn-meetup
B站: https://ela.st/bilibili
https://medium.com/%40demianch ... 42e61
2、Django + Elasticsearch 实战
https://testdriven.io/blog/dja ... arch/
3、Kafka Connect Elasticsearch Sink Connector实现
https://www.kloia.com/blog/kaf ... 31736
编辑:铭毅天下
归档:https://ela.st/cn-daily-all
订阅:https://ela.st/cn-daily-sub
沙龙:https://ela.st/cn-meetup
B站: https://ela.st/bilibili
收起阅读 »

社区日报 第1417期 (2022-06-09)
https://dzone.com/articles/23- ... eries
2. 大规模分析您的 Prometheus 指标: Prometheus + Elasticsearch
https://cloud.tencent.com/deve ... 16282
3. 字段太多, 在 Elasticsearch 中防止映射爆炸的 3 种方法
https://blog.csdn.net/UbuntuTo ... .5501
编辑:Se7en
归档:https://ela.st/cn-daily-all
订阅:https://ela.st/cn-daily-sub
沙龙:https://ela.st/cn-meetup
B站: https://ela.st/bilibili
https://dzone.com/articles/23- ... eries
2. 大规模分析您的 Prometheus 指标: Prometheus + Elasticsearch
https://cloud.tencent.com/deve ... 16282
3. 字段太多, 在 Elasticsearch 中防止映射爆炸的 3 种方法
https://blog.csdn.net/UbuntuTo ... .5501
编辑:Se7en
归档:https://ela.st/cn-daily-all
订阅:https://ela.st/cn-daily-sub
沙龙:https://ela.st/cn-meetup
B站: https://ela.st/bilibili
收起阅读 »

社区日报 第1416期 (2022-06-08)
https://elasticstack.blog.csdn ... 44885
2. 几分钟把Twitter数据流化并可视化到 Elasticsearch(需要梯子)
https://medium.com/%40sean1223 ... 09f3d
3. Elastic APM 和 OpenTelemetry 集成
https://cloud.tencent.com/deve ... 13362
编辑:kin122
归档:https://ela.st/cn-daily-all
订阅:https://ela.st/cn-daily-sub
沙龙:https://ela.st/cn-meetup
B站:https://ela.st/bilibili
https://elasticstack.blog.csdn ... 44885
2. 几分钟把Twitter数据流化并可视化到 Elasticsearch(需要梯子)
https://medium.com/%40sean1223 ... 09f3d
3. Elastic APM 和 OpenTelemetry 集成
https://cloud.tencent.com/deve ... 13362
编辑:kin122
归档:https://ela.st/cn-daily-all
订阅:https://ela.st/cn-daily-sub
沙龙:https://ela.st/cn-meetup
B站:https://ela.st/bilibili 收起阅读 »

Elasticsearch:字段太多, 在 Elasticsearch 中防止映射爆炸的 3 种方法
在本文中,我们将深入探讨开发人员可以用来通过 Elasticsearch 管理日志的三种有效策略。
[相关文章:利用 Elastic 改善云中的数据管理和可观察性]
让 Elasticsearch 为你的数据工作
有时我们无法控制我们在集群中收到的日志类型。 想想一个日志分析提供商,它有一个特定的预算来存储其客户的日志,并且需要保持存储空间(Elastic 在咨询中处理了许多类似的案例)。
通常情况下,我们有客户索引字段 “以防万一” 他们需要用于搜索。 如果你是这种情况,那么以下技术在帮助你降低成本并将集群性能集中在真正重要的事情上应该被证明是有价值的。
让我们首先概述问题。 考虑以下具有三个字段的 JSON 文档:message、transaction.user、transaction.amount:
{
"message": "2023-06-01T01:02:03.000Z|TT|Bob|3.14|hello",
"transaction": {
"user": "bob",
"amount": 3.14
}
}
将保存此类文档的索引的映射可能类似于以下内容:
PUT dynamic-mapping-test
{
"mappings": {
"properties": {
"message": {
"type": "text"
},
"transaction": {
"properties": {
"user": {
"type": "keyword"
},
"amount": {
"type": "long"
}
}
}
}
}
}
但是,Elasticsearch 允许我们为新字段编制索引,而不必事先指定映射,这也是 Elasticsearch 易于使用的部分原因:我们可以轻松载入新数据。 因此,可以对偏离原始映射的内容进行索引,
更多阅读 https://elasticstack.blog.csdn ... 59151
在本文中,我们将深入探讨开发人员可以用来通过 Elasticsearch 管理日志的三种有效策略。
[相关文章:利用 Elastic 改善云中的数据管理和可观察性]
让 Elasticsearch 为你的数据工作
有时我们无法控制我们在集群中收到的日志类型。 想想一个日志分析提供商,它有一个特定的预算来存储其客户的日志,并且需要保持存储空间(Elastic 在咨询中处理了许多类似的案例)。
通常情况下,我们有客户索引字段 “以防万一” 他们需要用于搜索。 如果你是这种情况,那么以下技术在帮助你降低成本并将集群性能集中在真正重要的事情上应该被证明是有价值的。
让我们首先概述问题。 考虑以下具有三个字段的 JSON 文档:message、transaction.user、transaction.amount:
{
"message": "2023-06-01T01:02:03.000Z|TT|Bob|3.14|hello",
"transaction": {
"user": "bob",
"amount": 3.14
}
}
将保存此类文档的索引的映射可能类似于以下内容:
PUT dynamic-mapping-test
{
"mappings": {
"properties": {
"message": {
"type": "text"
},
"transaction": {
"properties": {
"user": {
"type": "keyword"
},
"amount": {
"type": "long"
}
}
}
}
}
}
但是,Elasticsearch 允许我们为新字段编制索引,而不必事先指定映射,这也是 Elasticsearch 易于使用的部分原因:我们可以轻松载入新数据。 因此,可以对偏离原始映射的内容进行索引,
更多阅读 https://elasticstack.blog.csdn ... 59151 收起阅读 »

社区日报 第1415期 (2022-06-07)
1. 拿vue.js和django可以和ES配合吗?(需要梯子)
https://levelup.gitconnected.c ... 27e0e
2. nomad 配合 ES 怎么玩?(需要梯子)
https://itnext.io/elasticsearc ... 62779
3. 老师,我的pipeline报错了怎么破?(需要梯子)
https://medium.zenika.com/how- ... a1c1f
编辑:斯蒂文
归档:https://ela.st/cn-daily-all
订阅:https://ela.st/cn-daily-sub
沙龙:https://ela.st/cn-meetup
B站:https://ela.st/bilibili
1. 拿vue.js和django可以和ES配合吗?(需要梯子)
https://levelup.gitconnected.c ... 27e0e
2. nomad 配合 ES 怎么玩?(需要梯子)
https://itnext.io/elasticsearc ... 62779
3. 老师,我的pipeline报错了怎么破?(需要梯子)
https://medium.zenika.com/how- ... a1c1f
编辑:斯蒂文
归档:https://ela.st/cn-daily-all
订阅:https://ela.st/cn-daily-sub
沙龙:https://ela.st/cn-meetup
B站:https://ela.st/bilibili 收起阅读 »

社区日报 第1414期 (2022-06-06)
https://blog.csdn.net/laoyang3 ... 17385
2. Elasticsearch 一文搞懂match、match_phrase与match_phrase_prefix的检索过程
https://zhuanlan.zhihu.com/p/142641300
3. Elasticsearch snapshot 备份使用方法
https://developer.aliyun.com/article/767043
编辑:yuebancanghai
归档:https://ela.st/cn-daily-all
订阅:https://ela.st/cn-daily-sub
沙龙:https://ela.st/cn-meetup
B站:https://ela.st/bilibili
https://blog.csdn.net/laoyang3 ... 17385
2. Elasticsearch 一文搞懂match、match_phrase与match_phrase_prefix的检索过程
https://zhuanlan.zhihu.com/p/142641300
3. Elasticsearch snapshot 备份使用方法
https://developer.aliyun.com/article/767043
编辑:yuebancanghai
归档:https://ela.st/cn-daily-all
订阅:https://ela.st/cn-daily-sub
沙龙:https://ela.st/cn-meetup
B站:https://ela.st/bilibili 收起阅读 »

以有源之水,引万物生长
一棵枝繁叶茂的大树都是从米粒大小的种子生长而来。它的成长需要经过三个阶段: 选种、培育、繁衍 。
首先得先选择一个好的种子,确保能顺利发芽;其次还要用心培育,捉虫、浇灌、松土等;待开枝散叶之际,为了明年的收成还得未雨绸缪,继续传播繁衍。
今天,我们迎来了 Gitee 9 周年。
数字 9 是个位数中最大的一位,对于企业的生命周期而言,9 只是一个开始。走过 9 年,向 10 前行,意味着我们即将开启首次进位,踏入下一个新台阶。
过去的 9 年,Gitee 见证了开源活水的力量,经历了国内开源的飞速生长。数字只是一种表象,数字背后却是一个个开源项目、一名名开发者、一行行代码。
今天,Gitee 9 周年庆典正式开幕。我们决定把舞台交给开源之水的引流者,从他们的眼里望向万物生长的开源世界,望向更远的未来。
这趟庆典列车已经开出,快来看看路途中会有哪些精彩亮点吧。
庆典传送门:https://gitee.com/activity/9th/
一棵枝繁叶茂的大树都是从米粒大小的种子生长而来。它的成长需要经过三个阶段: 选种、培育、繁衍 。
首先得先选择一个好的种子,确保能顺利发芽;其次还要用心培育,捉虫、浇灌、松土等;待开枝散叶之际,为了明年的收成还得未雨绸缪,继续传播繁衍。
今天,我们迎来了 Gitee 9 周年。
数字 9 是个位数中最大的一位,对于企业的生命周期而言,9 只是一个开始。走过 9 年,向 10 前行,意味着我们即将开启首次进位,踏入下一个新台阶。
过去的 9 年,Gitee 见证了开源活水的力量,经历了国内开源的飞速生长。数字只是一种表象,数字背后却是一个个开源项目、一名名开发者、一行行代码。
今天,Gitee 9 周年庆典正式开幕。我们决定把舞台交给开源之水的引流者,从他们的眼里望向万物生长的开源世界,望向更远的未来。
这趟庆典列车已经开出,快来看看路途中会有哪些精彩亮点吧。
庆典传送门:https://gitee.com/activity/9th/ 收起阅读 »

社区日报 第1413期 (2022-06-02)
https://elasticstack.blog.csdn ... 75260
2.esctl 命令行工具
https://github.com/jeromepin/esctl#developing
3.极限网关配置模板的使用
https://www.bilibili.com/video ... 3.788
编辑:Se7en
归档:https://ela.st/cn-daily-all
订阅:https://ela.st/cn-daily-sub
沙龙:https://ela.st/cn-meetup
B站: https://ela.st/bilibili
https://elasticstack.blog.csdn ... 75260
2.esctl 命令行工具
https://github.com/jeromepin/esctl#developing
3.极限网关配置模板的使用
https://www.bilibili.com/video ... 3.788
编辑:Se7en
归档:https://ela.st/cn-daily-all
订阅:https://ela.st/cn-daily-sub
沙龙:https://ela.st/cn-meetup
B站: https://ela.st/bilibili 收起阅读 »

发布一个轻量级的 Elasticsearch 压测工具 - Loadgen
你是否遇到过新搭建一个 Elasticsearch 集群,但是却无法评估该集群的最大吞吐是多少,或者使用一些压测工具,比如 esrally,需要花费很大力气准备,但是却无法压测到极限速度,服务器资源跑不满,或者测试产生的数据和实际的业务有很多出入,又或者测试的请求太简单,比如查询,就是对单个固定的搜索请求进行查询,不仅测不准还可能浪费时间没有参考意义,so,有没有一个简单的工具可以支持灵活的自定义压测,并且足够快,答案是 Loadgen。
Loadgen
Elasticsearch 压测工具 Loadgen
,由极限实验室出品,基于 Elasticsearch 的开发运维需求而开发,久经实际客户环境的真实考验,简单好用速度快。
一个没有经过压测的 Elasticsearch 不是一个完整的 Elasticsearch。
Loadgen 具有以下主要特点:
- 性能强劲
- 轻量级无依赖
- 支持模板化参数随机
- 支持高并发
- 支持压测端均衡流量控制
只有模拟自己真实业务数据场景的压测才有意义,通过使用 Loadgen 定义写入文档或者查询模板,同时将里面的变量词典化,确保每次请求都是足够随机,变量可以灵活复用,支持多个请求混合压测,最大程度模拟真实环境。
Loadgen
Loadgen 使用非常简单,下载解压之后会得到两个文件,一个可执行程序和一个配置文件 loadgen.yml
,配置文件样例如下:
variables:
- name: ip
type: file
path: test/ip.txt
- name: user
type: file
path: test/user.txt
- name: id
type: sequence
- name: uuid
type: uuid
- name: now_local
type: now_local
- name: now_utc
type: now_utc
- name: now_unix
type: now_unix
requests:
- request:
method: GET
basic_auth:
username: elastic
password: pass
url: http://localhost:8000/medcl/_search
body: '{ "query": {"match": { "name": "$[[user]]" }}}'
变量的使用
上面的配置中,variables
用来定义变量参数,根据 name
来设置变量标识,在构造请求的使用 $[[变量名]]
即可访问该变量的值,变量目前支持的类型有:
类型 | 说明 |
---|---|
file | 文件型外部变量参数 |
sequence | 自增数字类型的变量 |
range | 数字范围类型的变量,支持参数 from 和 to 来限制范围 |
uuid | UUID 字符类型的变量 |
now_local | 当前时间、本地时区 |
now_utc | 当前时间、UTC 时区 |
now_unix | 当前时间、Unix 时间戳 |
file
类型变量参数加载自外部文本文件,每行一个变量参数,访问该变量时每次随机取其中一个,变量里面的定义格式举例如下:
➜ loadgen git:(master) ✗ cat test/user.txt
medcl
elastic
请求的定义
配置节点 requests
用来设置 Loadgen 将依次执行的请求,支持固定参数的请求,也可支持模板变量参数化构造请求,以下是一个普通的查询请求:
requests:
- request:
method: GET
basic_auth:
username: elastic
password: pass
url: http://localhost:8000/medcl/_search?q=name:$[[user]]
上面的查询对 medcl
索引进行了查询,并对 name
字段执行一个查询,每次请求的值来自随机变量 user
。
命令行参数
Loadgen 会循环执行配置文件里面定义的请求,默认 Loadgen 只会运行 5s
就自动退出了,如果希望延长运行时间或者加大并发可以通过启动的时候设置参数来控制,通过查看帮助命令如下:
➜ loadgen git:(master) ✗ ./bin/loadgen --help
Usage of ./bin/loadgen:
-c int
Number of concurrent threads (default 1)
-compress
Compress requests with gzip
-config string
the location of config file, default: loadgen.yml (default "loadgen.yml")
-d int
Duration of tests in seconds (default 5)
-debug
run in debug mode, loadgen will quit with panic error
-l int
Limit total requests (default -1)
-log string
the log level,options:trace,debug,info,warn,error (default "info")
-r int
Max requests per second (fixed QPS) (default -1)
-v version
执行压测
执行 Loadgen 程序即可执行压测,如下:
➜ loadgen git:(master) ✗ ./bin/loadgen -d 30 -c 100 -compress
__ ___ _ ___ ___ __ __
/ / /___\/_\ / \/ _ \ /__\/\ \ \
/ / // ///_\\ / /\ / /_\//_\ / \/ /
/ /__/ \_// _ \/ /_// /_\\//__/ /\ /
\____|___/\_/ \_/___,'\____/\__/\_\ \/
[LOADGEN] A http load generator and testing suit.
[LOADGEN] 1.0.0_SNAPSHOT, 83f2cb9, Sun Jul 4 13:52:42 2021 +0800, medcl, support single item in dict files
[07-19 16:15:00] [INF] [instance.go:24] workspace: data/loadgen/nodes/0
[07-19 16:15:00] [INF] [loader.go:312] warmup started
[07-19 16:15:00] [INF] [app.go:306] loadgen now started.
[07-19 16:15:00] [INF] [loader.go:316] [GET] http://localhost:8000/medcl/_search
[07-19 16:15:00] [INF] [loader.go:317] status: 200,<nil>,{"took":1,"timed_out":false,"_shards":{"total":1,"successful":1,"skipped":0,"failed":0},"hits":{"total":{"value":0,"relation":"eq"},"max_score":null,"hits":[]}}
[07-19 16:15:00] [INF] [loader.go:316] [GET] http://localhost:8000/medcl/_search?q=name:medcl
[07-19 16:15:00] [INF] [loader.go:317] status: 200,<nil>,{"took":1,"timed_out":false,"_shards":{"total":1,"successful":1,"skipped":0,"failed":0},"hits":{"total":{"value":0,"relation":"eq"},"max_score":null,"hits":[]}}
[07-19 16:15:01] [INF] [loader.go:316] [POST] http://localhost:8000/_bulk
[07-19 16:15:01] [INF] [loader.go:317] status: 200,<nil>,{"took":120,"errors":false,"items":[{"index":{"_index":"medcl-y4","_type":"doc","_id":"c3qj9123r0okahraiej0","_version":1,"result":"created","_shards":{"total":2,"successful":1,"failed":0},"_seq_no":5735852,"_primary_term":3,"status":201}}]}
[07-19 16:15:01] [INF] [loader.go:325] warmup finished
5253 requests in 32.756483336s, 524.61KB sent, 2.49MB received
[Loadgen Client Metrics]
Requests/sec: 175.10
Request Traffic/sec: 17.49KB
Total Transfer/sec: 102.34KB
Avg Req Time: 5.711022ms
Fastest Request: 440.448µs
Slowest Request: 3.624302658s
Number of Errors: 0
Number of Invalid: 0
Status 200: 5253
[Estimated Server Metrics]
Requests/sec: 160.37
Transfer/sec: 93.73KB
Avg Req Time: 623.576686ms
Loadgen 在正式压测之前会将所有的请求执行一次来进行预热,如果出现错误会提示是否继续,预热的请求结果也会输出到终端,执行完成之后会输出执行的摘要信息。
因为 Loadgen 最后的结果是所有请求全部执行完成之后的累计统计,可能存在不准的问题,建议通过打开 Kibana 或者 INFINI Console 的监控仪表板来实时查看 Elasticsearch 的各项运行指标。
模拟批量写入
使用 Loadgen 来模拟 bulk 批量写入也非常简单,在请求体里面配置一条索引操作,然后使用 body_repeat_times
参数来随机参数化复制若干条请求即可完成一批请求的准备,如下:
- request:
method: POST
basic_auth:
username: test
password: testtest
url: http://localhost:8000/_bulk
body_repeat_times: 1000
body: "{ \"index\" : { \"_index\" : \"medcl-y4\",\"_type\":\"doc\", \"_id\" : \"$[[uuid]]\" } }\n{ \"id\" : \"$[[id]]\",\"field1\" : \"$[[user]]\",\"ip\" : \"$[[ip]]\",\"now_local\" : \"$[[now_local]]\",\"now_unix\" : \"$[[now_unix]]\" }\n"
限制客户端压力
使用 Loadgen 并设置命令行参数 -r
可以限制客户端发送的每秒请求数,从而评估固定压力下 Elasticsearch 的响应时间和负载情况,如下:
➜ loadgen git:(master) ✗ ./bin/loadgen -d 30 -c 100 -r 100
注意,在大量并发下,此客户端吞吐限制可能不完全准确。
限制请求的总条数
通过设置参数 -l
可以控制客户端发送的请求总数,从而制造固定的文档,修改配置如下:
requests:
- request:
method: POST
basic_auth:
username: test
password: testtest
url: http://localhost:8000/medcl-test/doc2/_bulk
body_repeat_times: 1
body: "{ \"index\" : { \"_index\" : \"medcl-test\", \"_id\" : \"$[[uuid]]\" } }\n{ \"id\" : \"$[[id]]\",\"field1\" : \"$[[user]]\",\"ip\" : \"$[[ip]]\" }\n"
每次请求只有一个文档,然后执行 loadgen
./bin/loadgen -config loadgen-gw.yml -d 600 -c 100 -l 50000
执行完成之后,Elasticsearch 的索引 medcl-test
将增加 50000
条记录。
使用自增 ID 来确保文档的顺序性
如果希望生成的文档编号自增有规律,方便进行对比,可以使用 sequence
类型的自增 ID 来作为主键,内容也不要用随机数,如下:
requests:
- request:
method: POST
basic_auth:
username: test
password: testtest
url: http://localhost:8000/medcl-test/doc2/_bulk
body_repeat_times: 1
body: "{ \"index\" : { \"_index\" : \"medcl-test\", \"_id\" : \"$[[id]]\" } }\n{ \"id\" : \"$[[id]]\" }\n"
上下文复用变量
在一个请求中,我们可能希望有相同的参数出现,比如 routing
参数用来控制分片的路由,同时我们又希望该参数也保存在文档的 JSON 里面,
可以使用 runtime_variables
来设置请求级别的变量,或者 runtime_body_line_variables
定义请求体级别的变量,如果请求体复制 N 份,每份的参数是不同的,举例如下:
variables:
- name: id
type: sequence
- name: uuid
type: uuid
- name: now_local
type: now_local
- name: now_utc
type: now_utc
- name: now_unix
type: now_unix
- name: suffix
type: range
from: 10
to: 15
requests:
- request:
method: POST
runtime_variables:
batch_no: id
runtime_body_line_variables:
routing_no: uuid
basic_auth:
username: ingest
password: password
#url: http://localhost:8000/_search?q=$[[id]]
url: http://192.168.3.188:9206/_bulk
body_repeat_times: 10
body: "{ \"create\" : { \"_index\" : \"test-$[[suffix]]\",\"_type\":\"doc\", \"_id\" : \"$[[uuid]]\" , \"routing\" : \"$[[routing_no]]\" } }\n{ \"id\" : \"$[[uuid]]\",\"routing_no\" : \"$[[routing_no]]\",\"batch_number\" : \"$[[batch_no]]\", \"random_no\" : \"$[[suffix]]\",\"ip\" : \"$[[ip]]\",\"now_local\" : \"$[[now_local]]\",\"now_unix\" : \"$[[now_unix]]\" }\n"
我们定义了 batch_no
变量来代表一批文档里面的相同批次号,同时又定义了 routing_no
变量来代表每个文档级别的 routing 值。
最后,欢迎大家反馈使用过程遇到的任何问题。
你是否遇到过新搭建一个 Elasticsearch 集群,但是却无法评估该集群的最大吞吐是多少,或者使用一些压测工具,比如 esrally,需要花费很大力气准备,但是却无法压测到极限速度,服务器资源跑不满,或者测试产生的数据和实际的业务有很多出入,又或者测试的请求太简单,比如查询,就是对单个固定的搜索请求进行查询,不仅测不准还可能浪费时间没有参考意义,so,有没有一个简单的工具可以支持灵活的自定义压测,并且足够快,答案是 Loadgen。
Loadgen
Elasticsearch 压测工具 Loadgen
,由极限实验室出品,基于 Elasticsearch 的开发运维需求而开发,久经实际客户环境的真实考验,简单好用速度快。
一个没有经过压测的 Elasticsearch 不是一个完整的 Elasticsearch。
Loadgen 具有以下主要特点:
- 性能强劲
- 轻量级无依赖
- 支持模板化参数随机
- 支持高并发
- 支持压测端均衡流量控制
只有模拟自己真实业务数据场景的压测才有意义,通过使用 Loadgen 定义写入文档或者查询模板,同时将里面的变量词典化,确保每次请求都是足够随机,变量可以灵活复用,支持多个请求混合压测,最大程度模拟真实环境。
Loadgen
Loadgen 使用非常简单,下载解压之后会得到两个文件,一个可执行程序和一个配置文件 loadgen.yml
,配置文件样例如下:
variables:
- name: ip
type: file
path: test/ip.txt
- name: user
type: file
path: test/user.txt
- name: id
type: sequence
- name: uuid
type: uuid
- name: now_local
type: now_local
- name: now_utc
type: now_utc
- name: now_unix
type: now_unix
requests:
- request:
method: GET
basic_auth:
username: elastic
password: pass
url: http://localhost:8000/medcl/_search
body: '{ "query": {"match": { "name": "$[[user]]" }}}'
变量的使用
上面的配置中,variables
用来定义变量参数,根据 name
来设置变量标识,在构造请求的使用 $[[变量名]]
即可访问该变量的值,变量目前支持的类型有:
类型 | 说明 |
---|---|
file | 文件型外部变量参数 |
sequence | 自增数字类型的变量 |
range | 数字范围类型的变量,支持参数 from 和 to 来限制范围 |
uuid | UUID 字符类型的变量 |
now_local | 当前时间、本地时区 |
now_utc | 当前时间、UTC 时区 |
now_unix | 当前时间、Unix 时间戳 |
file
类型变量参数加载自外部文本文件,每行一个变量参数,访问该变量时每次随机取其中一个,变量里面的定义格式举例如下:
➜ loadgen git:(master) ✗ cat test/user.txt
medcl
elastic
请求的定义
配置节点 requests
用来设置 Loadgen 将依次执行的请求,支持固定参数的请求,也可支持模板变量参数化构造请求,以下是一个普通的查询请求:
requests:
- request:
method: GET
basic_auth:
username: elastic
password: pass
url: http://localhost:8000/medcl/_search?q=name:$[[user]]
上面的查询对 medcl
索引进行了查询,并对 name
字段执行一个查询,每次请求的值来自随机变量 user
。
命令行参数
Loadgen 会循环执行配置文件里面定义的请求,默认 Loadgen 只会运行 5s
就自动退出了,如果希望延长运行时间或者加大并发可以通过启动的时候设置参数来控制,通过查看帮助命令如下:
➜ loadgen git:(master) ✗ ./bin/loadgen --help
Usage of ./bin/loadgen:
-c int
Number of concurrent threads (default 1)
-compress
Compress requests with gzip
-config string
the location of config file, default: loadgen.yml (default "loadgen.yml")
-d int
Duration of tests in seconds (default 5)
-debug
run in debug mode, loadgen will quit with panic error
-l int
Limit total requests (default -1)
-log string
the log level,options:trace,debug,info,warn,error (default "info")
-r int
Max requests per second (fixed QPS) (default -1)
-v version
执行压测
执行 Loadgen 程序即可执行压测,如下:
➜ loadgen git:(master) ✗ ./bin/loadgen -d 30 -c 100 -compress
__ ___ _ ___ ___ __ __
/ / /___\/_\ / \/ _ \ /__\/\ \ \
/ / // ///_\\ / /\ / /_\//_\ / \/ /
/ /__/ \_// _ \/ /_// /_\\//__/ /\ /
\____|___/\_/ \_/___,'\____/\__/\_\ \/
[LOADGEN] A http load generator and testing suit.
[LOADGEN] 1.0.0_SNAPSHOT, 83f2cb9, Sun Jul 4 13:52:42 2021 +0800, medcl, support single item in dict files
[07-19 16:15:00] [INF] [instance.go:24] workspace: data/loadgen/nodes/0
[07-19 16:15:00] [INF] [loader.go:312] warmup started
[07-19 16:15:00] [INF] [app.go:306] loadgen now started.
[07-19 16:15:00] [INF] [loader.go:316] [GET] http://localhost:8000/medcl/_search
[07-19 16:15:00] [INF] [loader.go:317] status: 200,<nil>,{"took":1,"timed_out":false,"_shards":{"total":1,"successful":1,"skipped":0,"failed":0},"hits":{"total":{"value":0,"relation":"eq"},"max_score":null,"hits":[]}}
[07-19 16:15:00] [INF] [loader.go:316] [GET] http://localhost:8000/medcl/_search?q=name:medcl
[07-19 16:15:00] [INF] [loader.go:317] status: 200,<nil>,{"took":1,"timed_out":false,"_shards":{"total":1,"successful":1,"skipped":0,"failed":0},"hits":{"total":{"value":0,"relation":"eq"},"max_score":null,"hits":[]}}
[07-19 16:15:01] [INF] [loader.go:316] [POST] http://localhost:8000/_bulk
[07-19 16:15:01] [INF] [loader.go:317] status: 200,<nil>,{"took":120,"errors":false,"items":[{"index":{"_index":"medcl-y4","_type":"doc","_id":"c3qj9123r0okahraiej0","_version":1,"result":"created","_shards":{"total":2,"successful":1,"failed":0},"_seq_no":5735852,"_primary_term":3,"status":201}}]}
[07-19 16:15:01] [INF] [loader.go:325] warmup finished
5253 requests in 32.756483336s, 524.61KB sent, 2.49MB received
[Loadgen Client Metrics]
Requests/sec: 175.10
Request Traffic/sec: 17.49KB
Total Transfer/sec: 102.34KB
Avg Req Time: 5.711022ms
Fastest Request: 440.448µs
Slowest Request: 3.624302658s
Number of Errors: 0
Number of Invalid: 0
Status 200: 5253
[Estimated Server Metrics]
Requests/sec: 160.37
Transfer/sec: 93.73KB
Avg Req Time: 623.576686ms
Loadgen 在正式压测之前会将所有的请求执行一次来进行预热,如果出现错误会提示是否继续,预热的请求结果也会输出到终端,执行完成之后会输出执行的摘要信息。
因为 Loadgen 最后的结果是所有请求全部执行完成之后的累计统计,可能存在不准的问题,建议通过打开 Kibana 或者 INFINI Console 的监控仪表板来实时查看 Elasticsearch 的各项运行指标。
模拟批量写入
使用 Loadgen 来模拟 bulk 批量写入也非常简单,在请求体里面配置一条索引操作,然后使用 body_repeat_times
参数来随机参数化复制若干条请求即可完成一批请求的准备,如下:
- request:
method: POST
basic_auth:
username: test
password: testtest
url: http://localhost:8000/_bulk
body_repeat_times: 1000
body: "{ \"index\" : { \"_index\" : \"medcl-y4\",\"_type\":\"doc\", \"_id\" : \"$[[uuid]]\" } }\n{ \"id\" : \"$[[id]]\",\"field1\" : \"$[[user]]\",\"ip\" : \"$[[ip]]\",\"now_local\" : \"$[[now_local]]\",\"now_unix\" : \"$[[now_unix]]\" }\n"
限制客户端压力
使用 Loadgen 并设置命令行参数 -r
可以限制客户端发送的每秒请求数,从而评估固定压力下 Elasticsearch 的响应时间和负载情况,如下:
➜ loadgen git:(master) ✗ ./bin/loadgen -d 30 -c 100 -r 100
注意,在大量并发下,此客户端吞吐限制可能不完全准确。
限制请求的总条数
通过设置参数 -l
可以控制客户端发送的请求总数,从而制造固定的文档,修改配置如下:
requests:
- request:
method: POST
basic_auth:
username: test
password: testtest
url: http://localhost:8000/medcl-test/doc2/_bulk
body_repeat_times: 1
body: "{ \"index\" : { \"_index\" : \"medcl-test\", \"_id\" : \"$[[uuid]]\" } }\n{ \"id\" : \"$[[id]]\",\"field1\" : \"$[[user]]\",\"ip\" : \"$[[ip]]\" }\n"
每次请求只有一个文档,然后执行 loadgen
./bin/loadgen -config loadgen-gw.yml -d 600 -c 100 -l 50000
执行完成之后,Elasticsearch 的索引 medcl-test
将增加 50000
条记录。
使用自增 ID 来确保文档的顺序性
如果希望生成的文档编号自增有规律,方便进行对比,可以使用 sequence
类型的自增 ID 来作为主键,内容也不要用随机数,如下:
requests:
- request:
method: POST
basic_auth:
username: test
password: testtest
url: http://localhost:8000/medcl-test/doc2/_bulk
body_repeat_times: 1
body: "{ \"index\" : { \"_index\" : \"medcl-test\", \"_id\" : \"$[[id]]\" } }\n{ \"id\" : \"$[[id]]\" }\n"
上下文复用变量
在一个请求中,我们可能希望有相同的参数出现,比如 routing
参数用来控制分片的路由,同时我们又希望该参数也保存在文档的 JSON 里面,
可以使用 runtime_variables
来设置请求级别的变量,或者 runtime_body_line_variables
定义请求体级别的变量,如果请求体复制 N 份,每份的参数是不同的,举例如下:
variables:
- name: id
type: sequence
- name: uuid
type: uuid
- name: now_local
type: now_local
- name: now_utc
type: now_utc
- name: now_unix
type: now_unix
- name: suffix
type: range
from: 10
to: 15
requests:
- request:
method: POST
runtime_variables:
batch_no: id
runtime_body_line_variables:
routing_no: uuid
basic_auth:
username: ingest
password: password
#url: http://localhost:8000/_search?q=$[[id]]
url: http://192.168.3.188:9206/_bulk
body_repeat_times: 10
body: "{ \"create\" : { \"_index\" : \"test-$[[suffix]]\",\"_type\":\"doc\", \"_id\" : \"$[[uuid]]\" , \"routing\" : \"$[[routing_no]]\" } }\n{ \"id\" : \"$[[uuid]]\",\"routing_no\" : \"$[[routing_no]]\",\"batch_number\" : \"$[[batch_no]]\", \"random_no\" : \"$[[suffix]]\",\"ip\" : \"$[[ip]]\",\"now_local\" : \"$[[now_local]]\",\"now_unix\" : \"$[[now_unix]]\" }\n"
我们定义了 batch_no
变量来代表一批文档里面的相同批次号,同时又定义了 routing_no
变量来代表每个文档级别的 routing 值。
最后,欢迎大家反馈使用过程遇到的任何问题。
收起阅读 »
社区日报 第1412期 (2022-06-01)
https://blog.csdn.net/qq330983 ... 57930
2. match 查询中 minimum_should_match 的使用方式(需要梯子)
https://medium.com/%40sean1223 ... 09f3d
3. ES 中 disjunction max 查询的使用(需要梯子)
https://medium.com/%40sean1223 ... d9ac9
编辑:kin122
归档:https://ela.st/cn-daily-all
订阅:https://ela.st/cn-daily-sub
沙龙:https://ela.st/cn-meetup
B站:https://ela.st/bilibili
https://blog.csdn.net/qq330983 ... 57930
2. match 查询中 minimum_should_match 的使用方式(需要梯子)
https://medium.com/%40sean1223 ... 09f3d
3. ES 中 disjunction max 查询的使用(需要梯子)
https://medium.com/%40sean1223 ... d9ac9
编辑:kin122
归档:https://ela.st/cn-daily-all
订阅:https://ela.st/cn-daily-sub
沙龙:https://ela.st/cn-meetup
B站:https://ela.st/bilibili 收起阅读 »

社区日报 第1411期 (2022-05-31)
1. 保姆级ES dsl 教学(需要梯子)
https://medium.com/geekculture ... 10c0e
2. 谁会是Kibana的planB?(需要梯子)
https://medium.com/geekculture ... 14e00
3. 我可以在k8s上部署ES吗(需要梯子)
https://medium.com/99dotco/a-d ... 60466
编辑:斯蒂文
归档:https://ela.st/cn-daily-all
订阅:https://ela.st/cn-daily-sub
沙龙:https://ela.st/cn-meetup
B站:https://ela.st/bilibili
1. 保姆级ES dsl 教学(需要梯子)
https://medium.com/geekculture ... 10c0e
2. 谁会是Kibana的planB?(需要梯子)
https://medium.com/geekculture ... 14e00
3. 我可以在k8s上部署ES吗(需要梯子)
https://medium.com/99dotco/a-d ... 60466
编辑:斯蒂文
归档:https://ela.st/cn-daily-all
订阅:https://ela.st/cn-daily-sub
沙龙:https://ela.st/cn-meetup
B站:https://ela.st/bilibili 收起阅读 »