Elastic Stack梳理: 生产环境部署与性能优化深度指南之从集群配置到读写调优实战

第十阶段【Elasticsearch基础及运维】04:Elasticsearch集群的部署 Elasticsearch集群的部署 阅读详情

生产环境部署关键配置


操作系统与Elasticsearch静态参数优化,在生产环境部署Elasticsearch集群时,系统级配置是首要任务

官方文档(Setup Elasticsearch)明确要求以下操作:

1 ) 禁用Swap内存:

  • 原因:Swap基于磁盘,触发时性能急剧下降
  • 操作:
    # 永久禁用Swap
    sudo swapoff -a 
    sudo sed -i '/swap/s/^\(.*\)$/#\1/g' /etc/fstab 
    # 在elasticsearch.yml中启用内存锁 
    bootstrap.memory_lock: true 
    

2 ) 调整文件描述符限制:

  • Elasticsearch需处理大量Segment文件,默认值不足
  • 操作:
    # 修改系统限制
    echo "* hard nofile 65536" >> /etc/security/limits.conf
    

3 ) 虚拟内存优化:

  • Elasticsearch使用mmap映射索引文件,需增大vm.max_map_count:
    sysctl -w vm.max_map_count=262144
    

4 )JVM内存优化:

  • 堆内存不超过31GB:避免指针压缩失效
  • 内存分配比例:OS内存 ≈ 50% JVM内存,保障文件缓存效率
  • 计算公式:节点内存 = max(30GB, 总数据量/(节点数×比例系数))
    • 搜索场景比例系数:16
    • 日志场景比例系数:48-96

5 ) 线程数配置:

  • 确保/etc/security/limits.d中设置线程数≥4096

6 ) 网络参数优化

  • 修改net.core.somaxconn和net.ipv4.tcp_max_syn_backlog提升连接处理能力

  • 网络配置安全:

    • 显式设置network.host为内网IP,禁止使用0.0.0.0
    • 使用代理访问公网,避免直接暴露无认证的ES集群
  • 关键配置示例(/etc/sysctl.conf):

    vm.swappiness = 1 
    vm.max_map_count = 262144
    net.core.somaxconn = 1024
    net.ipv4.tcp_max_syn_backlog = 4096
    

Elasticsearch静态配置原则:


  • 配置精简:elasticsearch.yml仅保留必要参数(如集群发现、网络主机),动态参数通过API调整:
    # 示例配置
    cluster.name: production-cluster
    node.name: node-1
    network.host: 192.168.1.10  # 必须用内网IP,禁用0.0.0.0
    discovery.seed_hosts: ["node-1-ip", "node-2-ip"]  # Master节点IP列表
    cluster.initial_master_nodes: ["node-1", "node-2"]
    
  • JVM内存设定:
    • ≤31GB原则:避免JVM因大堆内存降低压缩指针效率。
    • 50%内存预留:确保操作系统缓存索引文件(mmap依赖)。
    • 计算公式(经验值):
      • 搜索场景:内存/数据量 ≤ 1:16(1GB内存支持16GB数据)。
      • 日志场景:内存/数据量 ≤ 1:48~1:96。

写性能优化策略


目标:提升EPS(Events Per Second),降低I/O开销

索引刷新、Translog与分片设计的黄金法则
写性能核心指标为EPS(Events Per Second),优化需聚焦三环节:

1 ) 客户端优化:

  • 多线程并发 + Bulk API(批量写入)
  • 单次请求量建议10–20MB(过大引发GC,过小降低吞吐)

2 ) ES服务端优化:

机制优化方案
Refresh增大间隔(默认1s → 30s)或关闭(index.refresh_interval=-1),减少Segment生成
Translog异步刷盘(index.translog.durability=async)+ 调整刷盘间隔(index.translog.sync_interval=30s)
Flush调高触发阈值(index.translog.flush_threshold_size=1gb),避免频繁落盘
副本写入时关闭副本(index.number_of_replicas=0),完成后动态恢复

2.1 Refresh机制调优:

  • 默认1秒刷新生成新Segment,频繁操作降低吞吐量。
  • 优化方案:
    • 增大刷新间隔:index.refresh_interval: 30s(日志场景示例)。
    • 关闭自动刷新(批量导入时):index.refresh_interval: -1。
  • 调整Index Buffer:默认10%堆内存,可静态提升:
    indices.memory.index_buffer_size: 20%  # 需重启生效
    

2.2 Translog异步化:

  • 默认每次写请求同步落盘(request模式),改为异步提升性能:
index.translog.durability: async
index.translog.sync_interval: 120s  # 每120秒刷盘
index.translog.flush_threshold_size: 1gb  # 超过1GB触发flush
  • 风险:异步模式可能丢失120秒数据(需权衡可靠性)。

2.3 分片与副本设计:

  • 临时禁用副本:写入完成后再启用。
  • 分片均衡分配:避免单节点热点,通过index.routing.allocation.total_shards_per_node控制:
    # 示例:5节点集群,10主分片+1副本 
    index.routing.allocation.total_shards_per_node: 5  # 每个节点最多5分片
    
    • 计算公式:(主分片数 + 副本数) / 节点数 + 1(预留故障转移空间)

3 ) 分片均衡配置:

避免单节点热点:index.routing.allocation.total_shards_per_node=5(N节点时设为(总分片数/N)+1)
日志场景配置示例:

PUT /logs-index  
{  
  "settings": {  
    "refresh_interval": "30s",  
    "number_of_replicas": 0,  
    "routing.allocation.total_shards_per_node": 3,  
    "translog": {  
      "durability": "async",  
      "sync_interval": "30s"  
    }  
  },  
  "mappings": {  
    "dynamic": false,  // 关闭冗余字段  
    "properties": { ... }  
  }  
}  

写入机制核心原理

Elasticsearch写入流程涉及三大关键操作:

  1. Refresh:默认1秒将内存buffer转为可查询segment
  2. Translog:保障数据安全的预写日志
  3. Flush:将segment持久化到磁盘并清理translog

1 ) 优化策略与实践

客户端优化:

  • 使用bulk接口批量写入(推荐10-20MB/批次)
  • 多线程并发写入
  • 零副本写入:写入完成后调整副本数

服务端优化:

配置项默认值优化值影响
refresh_interval1s30s-120s减少segment生成频率
index.memory.index_buffer_size10%20-30%增大写入缓冲区
index.translog.durabilityrequestasync异步写入translog
index.translog.sync_interval5s30s降低磁盘同步频率
index.translog.flush_threshold_size512mb1gb减少flush触发

2 ) 日志场景优化模板:

PUT /logs-2023-11 
{
  "settings": {
    "index": {
      "number_of_shards": 10,
      "number_of_replicas": 0,
      "refresh_interval": "30s",
      "translog": {
        "durability": "async",
        "sync_interval": "30s",
        "flush_threshold_size": "1gb"
      },
      "routing": {
        "allocation": {
          "total_shards_per_node": 3
        }
      }
    },
    "mappings": {
      "properties": {
        "@timestamp": {"type": "date"},
        "message": {"type": "text"},
        "severity": {"type": "keyword"},
        "host": {
          "type": "object",
          "properties": {
            "name": {"type": "keyword"}
          }
        }
      }
    }
  }
}

读性能优化方法论


数据建模、查询语句与分片规模的协同优化,读性能取决于四维度:

1 ) 数据建模贴合业务:

  • 业务模型与数据模型对齐
  • 避免Script计算:实时脚本(如Painless)无法利用倒排索引,性能极差
    • 优化:预计算字段(如将price * discount存为final_price)
  • 禁用非必要特性(如_source、doc_values)
    • 字段类型精简:关闭无用特性(如doc_values: false)
  • 合理使用嵌套类型(nested)和父子文档(join)

2 ) 分片规模与副本:

  • 冷热数据分离(Hot-Warm架构)
  • 索引生命周期管理(ILM)
  • 分片大小经验值:
    场景单分片最大容量
    搜索15GB
    日志50GB
  • 副本数设定:通常=节点数-1(确保高可用,避免过多副本拖累写性能)

3 ) 索引配置优化:

  • 分片数:通过压测确定
  • 副本数:按读请求量设定(非越多越好),建议replicas = ceil(读QPS/单分片承载QPS)
# 禁用不需要的功能 
PUT /products 
{
  "settings": {
    "index": {
      "codec": "best_compression",
      "store": {
        "preload": ["nvd", "dvd"]
      }
    }
  },
  "mappings": {
    "dynamic": "strict",
    "_source": {"enabled": true},
    "properties": {
      "name": {"type": "text", "index": true},
      "price": {"type": "scaled_float", "scaling_factor": 100}
    }
  }
}

4 ) 查询语句优化:

  • 优先Filter上下文:利用缓存,跳过算分

    {
      "query": {
        "bool": {
          "filter": [{"term": {"status": "active"}}]  // 无算分,可缓存
        }
      }
    }  
    
  • 查询语句优化:

    • 优先使用filter上下文
    • 禁用script、正则表达式等昂贵操作
    • 避免通配符查询开头模糊匹配
    • 索引分区路由(routing)
    • 使用异步搜索(async search)处理复杂查询
  • 诊断工具:

    • Profile API:定位慢查询阶段
    • Explain API:分析评分逻辑
  • 诊断慢查询:

    • 使用Profile API分析耗时阶段:
      # 查询性能分析
      GET /products/_search
      {
        "profile": true,
        "query": {...}
      }
       
      # 执行计划解释
      GET /products/_validate/query?explain
      {
        "query": {...}
      }
      

分片数设定科学方法


分片数量计算公式

  • 总分片数 = max(ceil(总数据量/分片容量), ceil(总吞吐量/单分片吞吐))

容量维度:

  • 搜索场景:分片容量 ≈ 15GB
  • 日志场景:分片容量 ≈ 30-50GB

吞吐维度:

  1. 测试单分片性能基准:
    # 测试集群配置
    PUT /benchmark
    {
      "settings": {
        "index.number_of_shards": 1,
        "index.number_of_replicas": 0
      }
    }
    
  2. 使用esrally压测工具获取单分片TPS/QPS

节点均衡公式:

  • 单节点最大分片数 = (总分片数 × (副本数 + 1)) / 节点数 + 冗余因子
# 配置示例(5节点集群,10主分片+1副本)
cluster.routing.allocation.total_shards_per_node: 5 

压测驱动与经验公式的双重验证
分片数 = 总数据量 / 单分片容量,需通过压测验证:

1 ) 压测流程:

  • 搭建单节点集群,创建1主分片+0副本索引。
  • 使用真实数据,逐步增加并发与批量大小(建议10-20MB/批次)。
  • 工具推荐:Elasticsearch Rally(官方基准测试框架)。

2 ) 经验公式:

  • 搜索场景:总数据量500GB → 分片数 = 500GB / 15GB ≈ 34(向上取整)
  • 日志场景:总数据量2TB → 分片数 = 2048GB / 50GB ≈ 41

X-Pack监控实战指南


集群健康、节点负载与索引指标的全面监控
X-Pack Monitoring是官方免费插件,部署步骤:

# 安装插件
bin/elasticsearch-plugin install x-pack
bin/kibana-plugin install x-pack

# 禁用安全模块(可选)  
echo "xpack.security.enabled: false" >> config/elasticsearch.yml  

核心监控指标:

仪表盘关键指标异常处理参考
ClusterQuery EPS / Index EPS / LatencyEPS骤降 → 检查线程池拒绝(rejections)
NodesJVM Heap / CPU / Segment CountHeap持续≥75% → 扩容或内存优化
IndicesDocument Count / Indexing RateSegment过多 → 触发Force Merge
AdvancedGC Duration / Indexing MemoryGC时长>1s → 调整JVM或排查内存泄漏

关键诊断场景:

  • 线程池拒绝 → 扩容节点或优化写入逻辑。
  • Segment爆炸 → 合并(_forcemerge)或调整refresh_interval。
  • 磁盘I/O瓶颈 → 分片均衡或升级SSD

关键监控指标:

  • 集群级:

    • 查询速率(search rate) (QPS)
    • 索引速率(indexing rate) (EPS)
    • 延迟指标(latency)
    • 分片状态分布
    • Cluster Status(Green/Yellow/Red)
  • 节点级:

    • Heap Memory:持续高位需扩容
    • GC Duration:>1秒预示内存不足
    • Thread Pool Rejections:队列满时拒绝请求(需扩容节点)
      {
        "jvm": {
          "mem": {"heap_used_percent": 65},
          "gc": {
            "collectors": {
              "young": {"collection_time_in_millis": 500},
              "old": {"collection_time_in_millis": 2000}
            }
          }
        },
        "thread_pool": {
          "write": {
            "threads": 16,
            "queue": 10,
            "rejected": 0
          }
        }
      }
      
  • 索引级:

    • 文档计数(document count)
    • 存储大小(store size)
    • Disk Usage:超85%触发只读模式
    • Segment数量(Segment Count)与内存占用 过多时合并(_forcemerge)
  • 告警阈值建议

    指标警告阈值严重阈值
    JVM堆内存>75%>90%
    CPU使用率>80%>95%
    磁盘空间<30%<10%
    线程池拒绝数>10/分钟>100/分钟
    GC时间占比>30%>50%

工程示例:1


1 ) 方案1:日志采集场景优化

Elasticsearch配置:

PUT /app-logs 
{
  "settings": {
    "index.refresh_interval": "60s",
    "index.translog.durability": "async",
    "index.translog.sync_interval": "60s",
    "index.number_of_replicas": 1,
    "index.routing.allocation.total_shards_per_node": 5,
    "analysis": {
      "analyzer": {
        "log_analyzer": {
          "type": "pattern",
          "pattern": "[\\W]+"
        }
      }
    }
  },
  "mappings": {
    "dynamic": false,
    "properties": {
      "@timestamp": {"type": "date"},
      "level": {"type": "keyword"},
      "message": {
        "type": "text",
        "analyzer": "log_analyzer",
        "fields": {"raw": {"type": "keyword"}}
      }
    }
  }
}

2 ) 方案2:电商搜索场景优化

Elasticsearch配置:

PUT /ecommerce-products 
{
  "settings": {
    "index": {
      "number_of_shards": 15,
      "number_of_replicas": 2,
      "refresh_interval": "5s",
      "analysis": {
        "filter": {
          "autocomplete_filter": {
            "type": "edge_ngram",
            "min_gram": 2,
            "max_gram": 20
          }
        },
        "analyzer": {
          "autocomplete": {
            "type": "custom",
            "tokenizer": "standard",
            "filter": ["lowercase", "autocomplete_filter"]
          }
        }
      }
    }
  },
  "mappings": {
    "dynamic_templates": [...],
    "properties": {
      "name": {
        "type": "text",
        "analyzer": "autocomplete",
        "search_analyzer": "standard"
      },
      "attributes": {"type": "nested"}
    }
  }
}

3 ) 方案3:时序数据处理场景

Elasticsearch配置:

PUT /metrics-2023
{
  "settings": {
    "index": {
      "number_of_shards": 20,
      "number_of_replicas": 1,
      "refresh_interval": "30s",
      "codec": "best_compression",
      "routing": {
        "allocation": {
          "require": {
            "data_type": "hot"
          }
        }
      }
    }
  },
  "mappings": {
    "_source": {"enabled": false},
    "properties": {
      "@timestamp": {"type": "date"},
      "metric_name": {"type": "keyword"},
      "value": {
        "type": "float",
        "index": false,
        "doc_values": true
      }
    }
  }
}

工程示例:2


1 )核心模块实现

// elasticsearch.module.ts
import { Module } from '@nestjs/common';
import { ElasticsearchModule } from '@nestjs/elasticsearch';
import { ConfigService } from '@nestjs/config';
 
@Module({
  imports: [
    ElasticsearchModule.registerAsync({
      useFactory: async (config: ConfigService) => ({
        node: config.get('ES_NODE'),
        auth: {
          username: config.get('ES_USER'),
          password: config.get('ES_PASSWORD')
        },
        tls: {
          ca: config.get('ES_CA_CERT'),
          rejectUnauthorized: false 
        },
        maxRetries: 5,
        requestTimeout: 60000,
        pingTimeout: 30000 
      }),
      inject: [ConfigService]
    })
  ],
  exports: [ElasticsearchModule]
})
export class SearchModule {}

2 ) 高级查询服务

// product.service.ts 
import { Injectable } from '@nestjs/common';
import { ElasticsearchService } from '@nestjs/elasticsearch';
import { SearchResponse } from '@elastic/elasticsearch/lib/api/types';
 
@Injectable()
export class ProductService {
  constructor(private readonly es: ElasticsearchService) {}
 
  async searchProducts(query: string, filters: any): Promise<SearchResponse> {
    return this.es.search({
      index: 'ecommerce-products',
      size: 100,
      track_total_hits: true,
      query: {
        bool: {
          must: [{
            multi_match: {
              query,
              fields: ['name^3', 'description'],
              type: 'cross_fields'
            }
          }],
          filter: this.buildFilters(filters)
        }
      },
      aggs: this.buildAggregations(),
      highlight: {
        fields: {
          name: {},
          description: {}
        }
      }
    });
  }
 
  private buildFilters(filters) {
    const filterArray = [];
    
    if (filters.category) {
      filterArray.push({ term: { category: filters.category } });
    }
    
    if (filters.priceRange) {
      filterArray.push({
        range: {
          price: {
            gte: filters.priceRange.min,
            lte: filters.priceRange.max
          }
        }
      });
    }
    
    return filterArray;
  }
 
  private buildAggregations() {
    return {
      categories: {
        terms: { field: 'category.keyword', size: 10 }
      },
      price_stats: {
        stats: { field: 'price' }
      }
    };
  }
}

3 )集群健康监控

// cluster-monitor.service.ts
import { Injectable } from '@nestjs/common';
import { ElasticsearchService } from '@nestjs/elasticsearch';
 
@Injectable()
export class ClusterMonitorService {
  constructor(private readonly es: ElasticsearchService) {}
  
  async getClusterHealth() {
    return this.es.cluster.health();
  }
  
  async getNodeStats() {
    return this.es.nodes.stats({
      metric: [
        'os', 'jvm', 'fs', 'process', 'indices', 'thread_pool'
      ],
      human: true 
    });
  }
  
  async getIndexStats(indices: string[]) {
    return this.es.indices.stats({
      index: indices.join(','),
      metric: ['docs', 'store', 'indexing', 'search']
    });
  }
  
  async createIndexLifecyclePolicy() {
    return this.es.ilm.putLifecycle({
      policy: 'hot_warm_policy',
      body: {
        policy: {
          phases: {
            hot: {
              min_age: '0ms',
              actions: {
                rollover: {
                  max_size: '50gb',
                  max_age: '30d'
                },
                set_priority: {
                  priority: 100
                }
              }
            },
            warm: {
              min_age: '60d',
              actions: {
                set_priority: {
                  priority: 50
                },
                allocate: {
                  number_of_replicas: 1,
                  require: {
                    data_type: 'warm'
                  }
                }
              }
            }
          }
        }
      }
    });
  }
}

工程示例:3


三种全链路实现:写入优化、查询封装、监控告警

1 ) 批量写入与Translog异步化

import { Controller, Post } from '@nestjs/common';
import { Client } from '@elastic/elasticsearch';
import { BulkOperationContainer } from '@elastic/elasticsearch/lib/api/types';
 
@Controller('data')
export class DataIngestController {
  private readonly esClient = new Client({ node: 'http://localhost:9200' });
 
  @Post('bulk')
  async bulkInsert() {
    const operations: BulkOperationContainer[] = [];
    const dataset = [...]; // 10-20MB数据 
 
    dataset.forEach(doc => {
      operations.push({ index: { _index: 'logs' } });
      operations.push(doc);
    });
 
    await this.esClient.bulk({ body: operations });
    
    // 异步Translog配置
    await this.esClient.indices.putSettings({
      index: 'logs',
      body: {
        translog: { durability: 'async', sync_interval: '120s' }
      }
    });
  }
}

2 ) 查询优化与缓存机制

import { Controller, Get, Query } from '@nestjs/common';
import { Client } from '@elastic/elasticsearch';
 
@Controller('search')
export class SearchController {
  private readonly esClient = new Client({ node: 'http://localhost:9200' });
 
  @Get()
  async search(@Query('keyword') keyword: string) {
    const response = await this.esClient.search({
      index: 'products',
      body: {
        query: {
          bool: {
            filter: [  // Filter上下文优先
              { term: { in_stock: true } },
              { match: { name: keyword } }
            ]
          }
        },
        size: 10 
      }
    });
    return response.hits.hits;
  }
}

3 ) X-Pack监控集成与告警

import { Injectable } from '@nestjs/common';
import { Client } from '@elastic/elasticsearch';
 
@Injectable()
export class MonitoringService {
  private readonly esClient = new Client({ node: 'http://localhost:9200' });
 
  async checkClusterHealth() {
    const health = await this.esClient.cluster.health();
    if (health.status === 'red') {
      this.triggerAlert('集群故障!');
    }
  }
 
  async trackPerformance() {
    const stats = await this.esClient.nodes.stats();
    const heapUsed = stats.nodes[process.env.NODE_ID].jvm.mem.heap_used_percent;
    if (heapUsed > 85) {
      this.triggerAlert(`堆内存使用率 ${heapUsed}%!`);
    }
  }
 
  private triggerAlert(message: string) {
    // 集成短信/邮件告警(如Twilio、Nodemailer)
  }
}

配置补充:

  • Elasticsearch周边配置:
    • 索引模板:自动应用分片策略
    • ILM策略:自动滚动索引(日志场景)
  • NestJS最佳实践:
    • 依赖注入ElasticsearchModule(需安装@nestjs/elasticsearch)
    • 环境变量管理(ConfigModule)

工程示例:4


1 ) 方案1:原生客户端直连(高灵活度)

import { Module } from '@nestjs/common';  
import { ElasticsearchModule } from '@nestjs/elasticsearch';  
 
@Module({  
  imports: [  
    ElasticsearchModule.register({  
      node: 'http://192.168.1.10:9200',  
      maxRetries: 3,  
      requestTimeout: 30000,  
      sniffOnStart: true,  
    }),  
  ],  
})  
export class SearchModule {}  
 
// 服务层调用示例  
import { Injectable } from '@nestjs/common';  
import { ElasticsearchService } from '@nestjs/elasticsearch';  
 
@Injectable()  
export class SearchService {  
  constructor(private readonly esService: ElasticsearchService) {}  
 
  async indexDocument(index: string, body: any) {  
    return this.esService.index({ index, body });  
  }  
 
  async search(index: string, query: any) {  
    return this.esService.search({ index, body: { query } });  
  }  
}  

2 ) 方案2:Alias切换(零停机重建索引)

// 步骤1:创建新索引  
await esService.indices.create({ index: 'logs-2023-v2' });  
 
// 步骤2:数据迁移(使用Reindex API)  
await esService.reindex({  
  body: {  
    source: { index: 'logs-2023' },  
    dest: { index: 'logs-2023-v2' }  
  },  
  wait_for_completion: true  
});  
 
// 步骤3:Alias切换  
await esService.indices.updateAliases({  
  body: {  
    actions: [  
      { remove: { index: 'logs-2023', alias: 'current-logs' } },  
      { add: { index: 'logs-2023-v2', alias: 'current-logs' } }  
    ]  
  }  
});  

3 ) 方案3:动态模板(自动适配字段类型)

PUT /logs-dynamic  
{  
  "mappings": {  
    "dynamic_templates": [  
      {  
        "strings_as_keyword": {  
          "match_mapping_type": "string",  
          "mapping": {  
            "type": "keyword",  
            "ignore_above": 256  
          }  
        }  
      },  
      {  
        "numbers_as_scaled_float": {  
          "match_mapping_type": "long",  
          "mapping": {  
            "type": "scaled_float",  
            "scaling_factor": 100  
          }  
        }  
      }  
    ]  
  }  
}  

ES周边配置最佳实践


  1. 冷热架构:
    • 热节点(SSD):高频读写索引(node.attr.temperature=hot)
    • 冷节点(HDD):归档数据(index.routing.allocation.require.temperature=cold)
  2. 生命周期管理(ILM):
    PUT _ilm/policy/logs_policy  
    {  
      "policy": {  
        "phases": {  
          "hot": {  
            "actions": { "rollover": { "max_size": "50gb" } }  
          },  
          "delete": {  
            "min_age": "365d",  
            "actions": { "delete": {} }  
          }  
        }  
      }  
    }  
    
  3. 安全加固:
    • 启用TLS传输加密:xpack.security.transport.ssl.enabled=true
    • 角色权限控制(RBAC):定义最小权限角色

集群监控与运维体系


监控指标分级体系

核心级指标(必须监控):

  • 节点存活状态
  • 集群健康状态(Green/Yellow/Red)
  • JVM堆内存使用率
  • 磁盘使用率
  • CPU负载

业务级指标:

  • 索引延迟(Indexing Latency)
  • 查询延迟(Search Latency)
  • 拒绝请求数(Rejected Requests)
  • 线程池队列大小

容量规划指标:

  • 分片分布均衡度
  • Segment内存占用
  • 磁盘空间增长率
  • 文档增长率

自动化运维脚本

分片均衡检查:

#!/bin/bash 
 
获取分片分布不均衡率 
IMBALANCE=$(curl -s -XGET 'http://localhost:9200/_cat/allocation?h=disk.percent,node' | 
  awk '{total+=$1; count++} END {print total/count}' | 
  xargs -I {} echo "scale=2; {} * 0.2" | bc)
 
if (( $(echo "$IMBALANCE > 20" | bc -l) )); then
  # 触发分片重分配 
  curl -XPUT 'http://localhost:9200/_cluster/settings' -H 'Content-Type: application/json' -d'
  {
    "transient": {
      "cluster.routing.rebalance.enable": "all",
      "cluster.routing.allocation.balance.shard": 0.45,
      "cluster.routing.allocation.balance.index": 0.55
    }
  }'
fi 

冷数据迁移:

将30天前的索引迁移到冷节点
curl -XPUT "http://localhost:9200/*-2023.*/_settings" -H 'Content-Type: application/json' -d'
{
  "index.routing.allocation.require.data_type": "cold"
}'

最佳实践总结


  1. 容量规划先行:基于数据量和吞吐需求精确计算分片数和节点配置
  2. 安全配置加固:网络隔离、TLS加密、RBAC权限控制缺一不可
  3. 写入优化原则:
    • 批量写入(Bulk API)
    • 适当增大refresh_interval
    • 异步translog写入
    • 写入期禁用副本
  4. 查询优化核心:
    • Filter上下文优先
    • 预计算代替脚本
    • 路由优化减少分片扫描
  5. 监控体系完善:X-Pack基础监控配合自定义指标采集
  6. 生命周期管理:基于ILM实现自动化索引管理

关键提醒:所有优化必须基于实际场景验证,避免盲目复制配置模板。建议在预生产环境中进行72小时连续压力测试,验证优化效果后再上线实施。

通过本文系统化的配置指导和工程实践,能够帮助您构建高性能、高可用的Elasticsearch生产环境集群。随着数据规模增长,持续监控和定期优化是保障集群健康的关键。

结语


性能调优的本质认知:Elasticsearch性能优化是数据规模、硬件资源、业务需求的动态平衡过程:

  • 警惕经验主义陷阱:拒绝盲目复制网络配置(尤其ES 6.x+版本参数巨变)
  • 监控驱动决策:依托X-Pack指标建立基线(Baseline),识别瓶颈再优化
  • 预见性设计:
    • 分片数预留20%冗余应对数据增长
    • 定期执行_forcemerge(合并Segment) + _cache/clear(清理缓存)

通过工程规范性(如Alias机制、ILM策略)和资源可观测性(X-Pack监控)构建高性能、易维护的ES集群

本文全面梳理Elasticsearch生产级部署与调优,覆盖系统配置、读写性能、分片设计、监控集成四大核心领域,并提供NestJS工程化示例

关键原则:

  1. 写入优化:平衡Translog可靠性 vs 性能
  2. 查询效率:数据建模 > 查询语句 > 硬件扩容
  3. 分片设计:压测验证 > 经验公式

注:所有方案需结合业务场景调整,监控数据是优化决策的核心依据

【信息科学与工程学】【云计算】计算机科学与自动化——第十五篇 云计算10 云计算领域架构 ​:作为前端请求的统一入口,负载均衡器基于预设算法(如轮询、最小连接数)动态分配流量至后端服务器集群。​:通过IP哈希或Cookie绑定,保障同一用户请求由同一服务器处理(如电商购物车场景)。​:Nginx(HTTP/HTTPS反向代理)、HAProxy(TCP层负载均衡)。​:实时监控服务器状态(如响应时间、连接数),自动剔除故障节点,确保服务连续性。​:本地资源满载时,将流量分流至公有云(如AWS + 私有云混合架构)。​:LSTM预测流量峰值,强化学习动态调整权重(如阿里云智能负载均衡)。 阅读详情

相关推荐

【信息科学与工程学】【数据中心】第三十五篇 云计算数据中心的学科知识04

编号学科(课程)核心知识点在云计算/云存储/云网络/云安全/云MaaS中的作用代表教材/资料/论文 + 数学方程式列表工业界应用D1421​云原生数据库:TiDB​HTAP(混合事务/分析处理)、分布式SQL、水平扩展、强一致(Raft)、自动故障恢复、与MySQL兼容、TiFlash列式引擎提供弹性扩展的分布式数据库;支撑高并发在线交易与实时分析教材:《TiDB in Action》PingCAP(2020) 论文:《TiDB: A Raft-based HTAP Database》(2017)

weixin_49199313的博客 411

ElasticSearch集群部署

Cerebro是Elasticsearch插件 Elasticsearch Kopf 的演变,可以通过图形界面查看分片分配和执行常见的索引操作。因为ES的数据大量都是常驻内存的,一旦使用了虚拟内存就会导致查询速度下降,一般需要关闭swap,但是要保证有足够的内存。到官网下载, Kibana安装包, 与之对应7.10.2版本, 选择Linux 64位版本下载,并进行解压。如果出现启动失败的情况, 要检查集群各节点的日志, 确保服务正常运行状态。启动,注意不要使用root用户启动。安装方式同上,修改配置文件。

用生命研发技术 2780

【Matlab深度学习】GPU加速实战:从环境配置到性能优化

本文详细介绍了如何在Matlab中为深度学习任务配置GPU加速环境并进行性能优化。文章从GPU加速的必要性讲起,手把手指导安装NVIDIA驱动、CUDA和cuDNN核心三件套,并验证环境。重点讲解了如何利用gpuArray将数据和模型迁移至GPU,以及通过内存优化、计算优化和多GPU并行等策略充分释放GPU算力,大幅缩短深度学习模型的训练时间。

weixin_29061465的博客 492

Elasticsearch集群部署

授权,更改/elasticsearch-7.15.0文件夹所属用户及用户组为elasticsearch:elasticsearch。# 修改 network.host 为 0.0.0.0,表示对外开放,如对特定ip开放则改为指定ip。# 修改 network.host 为 0.0.0.0,表示对外开放,如对特定ip开放则改为指定ip。# 修改 network.host 为 0.0.0.0,表示对外开放,如对特定ip开放则改为指定ip。# 设置对外服务http端口,默认为9200,可更改端口不为9200。

LinuxKBG的博客 2396

应用处理器(AP)、系统级芯片(SoC)与微控制器(MCU)的区别与联系

应用处理器(AP)、系统级芯片(SoC)与微控制器(MCU)的区别与联系

a_zxswer的博客 1696

HTB Attacking GraphQL Skills Assessment

通过枚举应用,利用GraphQL API,发现sql注入点,然后利用找到flag。

qq_33522010的博客 454

ElasticSearch 的集群部署环境搭建

ElasticSearch 的集群部署环境搭建

javaMov的专栏 2630

【IIC通信】Chap.1(I2C)IIC通信原理、IIC读写时序详解

IIC通信以两根连线SDA、SCL实现了完善的全双工同步数据传送, 可以方便地构成多机系统和外围器件扩展系统。

Jie_MSD的博客 2万+

Elasticsearch基础篇(三):Elasticsearch7.x的集群部署

本文将深入探讨Elasticsearch集群的架构和部署,包括主节点、数据节点、客户端节点、分片以及节点间的通信方式。当新的数据被索引时,数据节点会将数据分配给相应的分片,并将分片存储在本地磁盘上。如果数据节点发生故障,集群中的其他节点会接管该节点的工作,确保数据的可用性和冗余备份。当Elasticsearch集群中的节点发生故障时,主节点会自动将故障节点从集群中移除,并将分配给该节点的分片重新分配给其他节点。其中,host是节点所在的主机名,uuid是一个唯一的标识符,用于确保节点名称的唯一性。

后端开发 3727

Tomcat启动过程中cmd窗口(控制台)中文乱码的问题

tomcat启动时,启动过程日志中文乱码的处理方法。

寻码启示 1946

企业数字化转型解决方案架构设计:一个五维全景视角

本文系统探讨了企业数字化转型的架构设计框架,提出五维协同模型:企业架构作为战略罗盘,业务架构聚焦价值创造,应用架构实现能力载体,数据架构提供智能燃料,技术架构奠定基础支撑。文章深入分析了各架构域的核心要素、设计原则及相互关系,并指出数字化转型需通过渐进路径,结合战略引领、技术赋能和组织变革,构建有机统一的架构体系。该框架为企业应对数字化复杂性提供了系统性方法论,强调从整体视角实现技术与业务的深度融合。

金牌架构师 1257

01-Docker入门与核心概念

要真正理解Docker,我们不能仅仅停留在"它是一个工具"的层面。任何一项技术的诞生都不是凭空而来的,它是对前人智慧的继承与发展,是对现实问题的回应。容器化技术同样如此——它有着超过四十年的技术积淀,经历了从chroot到LXC,再到Docker和Kubernetes的漫长演进。本章将带你穿越时光,梳理容器化技术的发展脉络,让你明白Docker为什么会出现在这个时代,以及它解决了前人没有解决好的哪些问题。软件交付方式的演进,本质上是人类对计算资源利用率和管理效率不断追求的过程。我们可以将这个过程分为三个主要

Na2SiO3Glue的博客 690

小梅哥Xilinx FPGA学习笔记11——亚稳态

亚稳态就是D触发器输入信号在其数据窗口期内发生变化,导致D触发器的输出进入一段时间的不稳定状态,有可能发生振荡,并最终随机稳定在高电平或者低电平。

m0_51430584的博客 631

Elasticsearch 环境

Elasticsearch 环境 相关概念 单机 & 集群 单台 Elasticsearch 服务器提供服务,往往都有最大的负载能力,超过这个阈值,服务器性能就会大大降低甚至不可用,所以生产环境中,一般都是运行在指定服务器集群中。 除了负载能力,单点服务器也存在其他问题: 单台机器存储容量有限 单服务器容易出现单点故障,无法实现高可用 单服务的并发处理能力有限 配置服务器集群时,集群中节点数量没有限制,大于等于 2 个节点就可以看做是集群了。一般出于高性能及高可用方面来考虑集群中节点数量都是 3

@小刘同学nice 282

嵌入式模拟电路面试题大全及参考答案(持续更新)

高输入阻抗:由于晶体管的基极-发射极(BJT)或栅极-源极(MOSFET)电压很低,跨导放大器具有很高的输入阻抗。低输出阻抗:晶体管的集电极-发射极或漏极-源极电阻较低,提供较低的输出阻抗。电压控制:输入信号控制晶体管的跨导,从而控制输出电流。晶体管:作为放大器的核心,可以是BJT或MOSFET。偏置电路:为晶体管提供稳定的工作点,确保其在放大区域内工作。负载电阻:与晶体管的集电极或漏极连接,将电流转换为电压。晶体管的选择:根据所需的增益、速度和功率消耗选择合适的晶体管。偏置稳定性。

大模型大数据攻城狮的专栏 989

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

Elasticsearch集群部署详解

目录: 1、Elasticsearch 特性 2、Elasticsearch 单节点安装部署 3、Elasticsearch 集群安装部署 4、附件&&问题集合 Elasticsearch功能与特性: (1)分布式搜索和分析引擎 (2)全文检索,结构化检索,数据分析 (3)对海量数据进行近实时的处理 分布式:ES自动可以将海量数据分散到多台服务器上存储和检索 海量数据的处理:分布式后,可采用大量的服务器存储和检索数据,从而实现海量数据的处理 近实时:在秒级别对数据进行搜索和分析 软件获取链

qq_43279371的博客 2425

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

【Elasticsearch】集群部署

本文主要从三个角度讲述了ES的集群部署

al6nlee的博客 1842

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

Elasticsearch 集群部署

Elasticsearch 是一个分布式的搜索和分析引擎,广泛应用于日志分析、全文搜索、实时数据分析等场景。它以其高性能、高可用性和易用性而著称。本文档将引导您完成一个基本的 Elasticsearch 集群配置,包括节点间的通信、客户端访问、安全设置等关键步骤。我们将通过三个节点(node1、node2、node3)来搭建一个高可用的 Elasticsearch 集群,以确保您的数据能够在多个节点之间高效地存储和检索。

kersixy的博客 2323

Elasticsearch集群部署及使用

关键词 —> 文档的映射 把正向索引的结果重新构造成倒排索引。通过_update API方式单独更新对应的字段。文档 —> 关键词的映射过程(正向索引)根据单词集合和文档集合,得到一张表。通过_source获取指定的字段。创建索引library。

wuxingge的博客 3328

ES集群的部署

实验目的:验证ES集群的容错性、扩展性数据分布与查询性能优化。环境准备​​。

2301_79868845的博客 2927

elasticsearch集群部署、配置

elasticsearch集群部署、配置

u012433915的专栏 4490

ES的集群部署

ES的集群部署

weixin_42666548的博客 7165

保姆级Elasticsearch集群部署指导

2. 创建非root用户(重要!) Elasticsearch禁止以用户启动,需创建专用用户: 三、集群部署步骤(以3节点为例) 1. 解压与重命名 2. 配置文件详解(3节点需分别修改) 路径:通用配置(所有节点相同): 节点差异化配置(每个节点唯一):关键参数说明:设置文件权限: 修改系统限制(所有节点执行): 添加以下内容(提升文件句柄和进程数限制): 修改虚拟内存限制: 添加: 应用修改: 四、启动集群 1. 切换至es用户 2. 启动单节点(3个节点分别执行) 3.

huanhuanzhou blog 2293

通过 Docker 部署 Elasticsearch 集群

通过容器部署的方式快速搭建ES集群。

运维-晓柏的博客 1656

ES集群部署(保姆级,一篇足够)

ElasticSearch集群部署及验证学习

weixin_68033186的博客 8778
上一篇: Elastic Stack梳理: 数据重建建模与集群优化终极指南
下一篇: Elastic Stack梳理:Logstash持久化队列与高可靠数据处理架构深度解析
Wang's Blog
博客等级 码龄12年 7434粉丝 2421原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Wang's Blog

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值