W a i k ı ˉ k ı ˉ , H I , U n i t e d S t a t e s Waikīkī, HI, United States Waikıˉkıˉ,HI,UnitedStates
每日语录: “Investing in yourself is the most important investment you’ll ever make in your life.”
如果公司需要对于 ES
进行调优,这个时候你该怎么办呢,不妨提前学习,到时候用到的时候,也可以让大家对你…
如果文章哪里有问题,还望指出。
最后有相关的学习群,有兴趣可以加入。
1. 硬件配置的黄金法则
我们曾因盲目堆配置吃过大亏——128核CPU、1TB内存的豪华机器,性能竟不如32核+256GB的中配集群。关键经验:
# elasticsearch.yml
-Xms30g
-Xmx30g
2. 节点角色的精细化分配
初期我们混用节点角色,导致master节点OOM。现采用分层架构:
# 专用master节点(3/5/7奇数台)
node.master: true
node.data: false
# 数据节点(高配)
node.master: false
node.data: true
search.remote.connect: false
# Coordinating节点(横向扩展)
node.master: false
node.data: false
避坑要点:
1. 分片大小的科学计算
我们曾因默认5个分片导致400万个小分片,引发集群元数据爆炸。现采用公式:
理想分片数 = 总数据量(GB) / 目标分片大小(GB)
目标分片大小 = 50GB(日志类)~ 100GB(搜索类)
真实案例:
2. 动态模板的智能管理
通过动态模板避免字段爆炸:
PUT _template/business_logs
{
"mappings": {
"dynamic_templates": [
{
"strings_as_keyword": {
"match_mapping_type": "string",
"mapping": {
"type": "keyword",
"ignore_above": 256
}
}
}
]
}
}
该配置将超过256字符的字符串自动丢弃,防止无限制的text分析。
3. 时序数据的冷热分层
PUT logs-2024-08
{
"settings": {
"index.routing.allocation.require.box_type": "hot",
"index.lifecycle.name": "logs_policy"
}
}
# 滚动到冷节点
POST logs-2024-08/_rollover
{
"conditions": { "max_age": "7d" },
"settings": {
"index.routing.allocation.require.box_type": "cold"
}
}
配合ILM策略,热数据用SSD,冷数据迁移到HDD,存储成本降低40%。
1. 慢查询分析三板斧
PUT /_settings
{
"index.search.slowlog.threshold.query.warn": "10s",
"index.search.slowlog.threshold.query.info": "5s"
}
GET /my_index/_search?explain
{
"query": { ... }
}
GET /my_index/_search?preference=_shards:2
2. 聚合查询的加速秘籍
我们曾因一个terms聚合拖垮整个集群:
"properties": {
"user_id": {
"type": "keyword",
"doc_values": true # 默认开启但需确认
}
}
"aggs": {
"popular_items": {
"terms": {
"field": "product_id",
"size": 100,
"shard_size": 10000 # 分片级预聚合
}
}
}
3. 索引预热的黑科技
针对高频查询提前加载:
PUT /hot_index/_settings
{
"index.search.idle.after": "30s",
"index.search.warmup": {
"queries": [
{"term": {"status": "active"}},
{"range": {"timestamp": {"gte": "now-7d/d"}}}
]
}
}
2. 自动化运维脚本
#!/bin/bash
# 自动清理旧索引
cur_date=$(date +%Y.%m.%d)
keep_days=30
indices=$(curl -sXGET http://localhost:9200/_cat/indices?h=index | grep -E "logstash-.*")
for index in $indices; do
index_date=$(echo $index | awk -F '-' '{print $2}')
if [[ "$index_date" < $(date -d "$keep_days days ago" +%Y.%m.%d) ]]; then
curl -XDELETE "http://localhost:9200/$index"
fi
done
3. 灾备恢复策略
PUT /_ccr/follow/logs-follower
{
"remote_cluster": "backup_cluster",
"leader_index": "logs-leader"
}
# 注册仓库
PUT /_snapshot/my_s3_repository
{
"type": "s3",
"settings": {
"bucket": "my-es-backup",
"region": "us-west-2"
}
}
# 定时快照
PUT /_slm/policy/nightly-snapshots
{
"schedule": "0 30 1 * * ?",
"name": "" ,
"repository": "my_s3_repository"
}
我们使用esrally进行的对比测试:
优化项 | QPS提升 | 延迟下降 | 资源消耗下降 |
---|---|---|---|
分片大小调整 | +35% | 42% | 28% |
JVM参数调优 | +18% | 25% | 15% |
查询路由优化 | +52% | 61% | - |
冷热数据分离 | - | - | 40% |
测试环境:
*:*
会导致全索引扫描POST /my_index/_forcemerge?max_num_segments=1
优化永无止境:Elasticsearch集群如同精密的瑞士手表,每个参数都是相互关联的齿轮。本文的方案来自日均百亿级查询的实战锤炼,但具体实施仍需结合业务场景。记住:最好的优化,是在设计阶段就避免问题。
以上就是我们今天的内容,希望可以帮助到大家。
教科书不会告诉你:进程和线程的本质区别是资源博弈
90%人没理清的 iptables 核心:七表五链实战指北
别被 ‘云原生’ 忽悠了:接地气的 K8s 生产落地长这样
手搓 K8s 还是 kubeadm 开箱即用?聊聊企业级部署的真实选择
面试官:说说四层和七层代理的本质区别?——从 OSI 模型到千万级集群的拆解指南