Я использую Elasticsearch 6.8.10 с Spring Boot 2.2.7 и Spring Data Elasticsearch.
У меня есть потоки данных статистики и тенденций, которые хранятся в темах Kafka. Эти темы читаются с помощью Spring Kafka и сохраняются в MongoDB и Elasticsearch для анализа и составления отчетов. Проблема, с которой я сталкиваюсь, заключается в том, что когда очереди обрабатываются и данные записываются в Elasticsearch, потребление ЦП Elasticsearch постоянно составляет около 250%. Это приводит к спорадическим ошибкам тайм-аута в приложении. Я понимаю, что индексация — это интенсивная операция, но я пытаюсь понять, что я могу сделать, чтобы уменьшить использование ЦП.
Данные:
- Приблизительная статистика элементов очереди (1,2 млн)
- Размер документа статистики (220 байт)
Детали конфигурации виртуальной машины:
- 4 ЦП, 16 ГБ памяти, 20 ГБ диск (SSD)
- Запуск на виртуальной машине в Google Cloud Platform.
- ВМ используется только для Elasticsearch
Детали конфигурации Docker Elasticsearch:
- Я использую один узел (на данный момент)
version: '2.4'
services:
elasticsearch:
container_name: elasticsearch
image: 'docker.elastic.co/elasticsearch/elasticsearch:6.8.10'
ports:
- '9200:9200'
- '9300:9300'
mem_limit: 16GB
environment:
- discovery.type=single-node
- cluster.name=docker-cluster
- bootstrap.memory_lock=true
- "ES_JAVA_OPTS=-Xms8g -Xmx8g"
ulimits:
memlock:
soft: -1
hard: -1
nofile:
soft: 65536
hard: 65536
volumes:
- 'esdata1:/usr/share/elasticsearch/data'
restart: always
volumes:
esdata1:
driver: local
Пример документа Spring Stat:
- Осколки = 1, реплики = 0
@Document(indexName = "stats_test", type = "stat", shards = 1, replicas = 0)
public class EsStat {
@Id
@Field(type = FieldType.Keyword)
private String id;
@Field(type = FieldType.Keyword)
private String entityOrRelationshipId;
@Field(type = FieldType.Keyword)
private String articleId;
@Field(type = FieldType.Keyword)
private String status;
@Field(type = FieldType.Keyword)
private String type;
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd'T'HH:mm:ss.SSSZ")
@Field(type = FieldType.Date, format = DateFormat.custom, pattern = "yyyy-MM-dd'T'HH:mm:ss.SSSZ")
private ZonedDateTime date;
@JsonProperty("type")
@Field(type = FieldType.Keyword)
private String dataSource;
// getter and setters
}
Репозиторий Stats Spring:
- Индексация выполняется через репозиторий Spring Data Elasticsearch:
public interface StatElasticsearchRepository extends ElasticsearchRepository<EsStat, String> {
}
Отображение статистики:
{
"stats": {
"mappings": {
"stat": {
"properties": {
"_class": {
"type": "text",
"fields": {
"keyword": {
"type": "keyword",
"ignore_above": 256
}
}
},
"articleId": {
"type": "keyword"
},
"dataSource": {
"type": "keyword"
},
"date": {
"type": "date",
"format": "yyyy-MM-dd'T'HH:mm:ss.SSSZ"
},
"entityOrRelationshipId": {
"type": "keyword"
},
"id": {
"type": "keyword"
},
"status": {
"type": "keyword"
},
"type": {
"type": "keyword"
}
}
}
}
}
}
Что я могу сделать, чтобы определить, почему загрузка ЦП так высока, и что я могу сделать, чтобы уменьшить ее?
Любые советы или рекомендации будут высоко оценены. Я рад добавить больше конфигурации/вывода, если это необходимо.
"ES_JAVA_OPTS=-Xms8g -Xmx8g"
? Как вы записываете свои записи в Elasticsearch с помощью Spring Data Elasticsearch? Используете ли вы репозитории или шаблон Elasticsearch, делаете ли вы одиночные или пакетные вставки? - person P.J.Meisch   schedule 26.06.2020