Пожалуйста, нажмите ссылку для получения дополнительной информации.
SpringBoot 2.0 версия: https://gitee.com/52itstyle/spring-boot-elasticsearch/tree/spring-boot2-elasticsearch/
На самом деле цель этого демонстрационного проекта — показать, как можно построить систему обработки веб-логов на основе Elasticsearch. Для этого используются некоторые открытые компоненты, такие как инструменты синхронизации данных и другие, чтобы быстро создать систему логирования. Проект находится в стадии разработки.
Демонстрационный сайт для просмотра логов: http://es.52itstyle.vip (данные не сохраняются, демонстрация приостановлена).
Демонстрация логов по регионам: http://es.52itstyle.vip/area/index (данные не сохраняются, демонстрация приостановлена).
Конечно, функциональность проекта будет постепенно расширяться, и в итоге будет создан полноценный демонстрационный пример.
JDK 1.8, Maven, Eclipse, SpringBoot 1.5.9, elasticsearch 2.4.6, Dubbo 2.6.2, zookeeper 3.4.13, Redis, Kafka, Vue, Iview.
spring-boot-starter-parent-1.5.9.RELEASE, spring-data-elasticsearch-2.1.9.RELEAS, elasticsearch-2.4.6 (для версий выше 5.0 требуется JDK 8).
По состоянию на 22 января 2018 года последняя версия ElasticSearch — 6.1.2, но скорость обновления Spring-Boot значительно отстаёт от скорости обновления ElasticSearch, и на данный момент последней версией, поддерживаемой Spring-Boot, является elasticsearch-2.4.6.
В Spring-Boot используется spring-data-elasticsearch, который предоставляет два встроенных клиента для подключения:
Клиент узла (node client): в файле конфигурации устанавливается значение local: false, клиент узла присоединяется к кластеру в качестве узла без данных (node-master или node-client), то есть он не хранит никаких данных, но знает расположение данных в кластере и может напрямую пересылать запросы соответствующему узлу.
Транспортный клиент (Transport client): в файле конфигурации устанавливается значение local: true, этот более лёгкий транспортный клиент может отправлять запросы удалённому кластеру. Он не присоединяется к кластеру, а просто пересылает запросы удаленному кластеру. Оба Java-клиента взаимодействуют с кластером через порт 9300, используя протокол передачи ElasticSearch (Elasticsearch Transport Protocol). Узлы в кластере также обмениваются данными через порт 9300. Если этот порт не открыт, ваши узлы не смогут сформировать кластер.
spring.data.elasticsearch.cluster-name=elasticsearch
# По умолчанию это локальный хост, если вы хотите использовать удалённый сервер или сервер в локальной сети, вам необходимо настроить IP: порт; вы можете настроить несколько, разделяя их запятыми, что эквивалентно кластеру.
# Java-клиент: взаимодействует с кластером через порт 9300
# Все остальные языки программирования: могут использовать RESTful API через порт 9200 для связи с ElasticSearch.
# spring.data.elasticsearch.cluster-nodes=192.168.1.180:9300
Необходимо самостоятельно установить ElasticSearch и убедиться, что версия соответствует версии JAR-файла.
Ссылка для скачивания: https://www.elastic.co/downloads/past-releases/elasticsearch-2-4-6
Инструкции по установке: http://www.52itstyle.com/thread-20114-1-1.html
Не рекомендуется использовать root-пользователя для запуска новой версии, необходимо создать отдельного пользователя ElasticSearch или использовать следующую команду для запуска elasticsearch -Des.insecure.allow.root=true -d или добавить ES_JAVA_OPTS="-Des.insecure.allow.root=true" в elasticsearch.
├─src
│ ├─main
│ │ ├─java
│ │ │ └─com
│ │ │ └─itstyle
│ │ │ └─es
│ │ │ │ Application.java
│ │ │ │
│ │ │ ├─common
│ │ │ │ ├─constant
│ │ │ │ │ PageConstant.java
│ │ │ │ │
│ │ │ │ └─interceptor
│ │ │ │ MyAdapter.java
│ │ │ │
│ │ │ └─log
│ │ │ ├─controller
│ │ │ │ LogController.java
│ │ │ │
│ │ │ ├─entity
│ │ │ │ Pages.java
│ │ │ │ SysLogs.java
│ │ │ │
│ │ │ ├─repository
│ │ │ │ ElasticLogRepository.java
│ │ │ │
│ │ │ └─service
│ │ │ │ LogService.java
│ │ │ │
│ | | └─impl
│ │ | LogServiceImpl.java
│ │ |
│ │ ├─resources
│ │ │ │ application-dev.properties
│ │ │ │ application-prod.properties
│ │ │ │ application-test.properties
``` **application.yml**
│ │ │ │
│ │ │ ├─static
│ │ │ │ ├─iview
│ │ │ │ │ │ iview.css
│ │ │ │ │ │ iview.min.js
│ │ │ │ │ │
│ │ │ │ │ └─fonts
│ │ │ │ │ ionicons.eot
│ │ │ │ │ ionicons.svg
│ │ │ │ │ ionicons.ttf
│ │ │ │ │ ionicons.woff
│ │ │ │ │
│ │ │ │ ├─jquery
│ │ │ │ │ jquery-3.2.1.min.js
│ │ │ │ │
│ │ │ │ └─vue
│ │ │ │ vue.min.js
│ | │ │
│ │ │ └─templates
│ │ │ └─log
│ │ │ index.html
│ │ │
│ │ └─webapp
│ │ │ index.jsp
│ │ │
│ │ └─WEB-INF
│ │ web.xml
│ │
│ └─test
│ └─java
│ └─com
│ └─itstyle
│ └─es
│ └─test
│ Logs.java
**Проект демонстрации**
#### Демонстрация веб-сайта: http://es.52itstyle.com
#### Снимки экрана проекта

#### Разбиение на страницы
Используя ElasticsearchTemplate, было вставлено 200 000 записей данных, и это заняло около 60 секунд на локальном внешнем сервере (1 ядро, 1 ГБ), что составляет примерно 1 минуту. Хотя размер индекса увеличился, для поиска потребовалось около 10 минут.
При достижении 10 000+ страниц в разбиении на страницы система выдаёт ошибку «Result window is too large». Чтобы исправить это, добавьте следующий код в config/elasticsearch.yml:
index.max_result_window : '10000000'
Ссылка: https://www.elastic.co/guide/en/elasticsearch/reference/current/index-modules.html
**Java API**
Elasticsearch предоставляет два встроенных клиента для пользователей Java:
- Клиент узла (node client):
Клиент узла, как следует из названия, сам по себе является частью кластера Elasticsearch. Он присоединяется к кластеру как узел без данных (none data node), то есть он не хранит никаких данных, но знает точное местоположение данных в кластере и может напрямую пересылать запросы соответствующему узлу.
- Транспортный клиент (Transport client):
Этот более лёгкий транспортный клиент может отправлять запросы удалённому кластеру. Сам он не присоединяется к кластеру, а просто пересылает запросы на узлы кластера. Оба клиента Java взаимодействуют с кластером через порт 9300, используя протокол передачи Elasticsearch (Elasticsearch Transport Protocol). Узлы в кластере также общаются друг с другом через порт 9300. Если этот порт не открыт, ваши узлы не смогут сформировать кластер.
**Установка Elasticsearch-Head**
elasticsearch-head — это графический инструмент для управления и администрирования кластеров, который позволяет выполнять операции с кластерами в режиме «всё в одном». Вы можете интегрировать его в es (предпочтительный способ) или установить как отдельный веб-приложение.
Основные функции elasticsearch-head включают:
* Отображение топологии кластера и возможность выполнения операций на уровне индекса и узла.
* Возможность поиска в кластере исходных данных JSON или данных в табличном формате.
* Быстрый доступ и отображение состояния кластера.
Способ установки плагина:
- Для Elasticsearch 5.x: плагины сайтов не поддерживаются. Запустите как отдельный сервер.
- Для Elasticsearch 2.x: sudo elasticsearch/bin/plugin install mobz/elasticsearch-head
- Для Elasticsearch 1.x: sudo elasticsearch/bin/plugin -install mobz/elasticsearch-head/1.x
- Для Elasticsearch 0.x: sudo elasticsearch/bin/plugin -install mobz/elasticsearch-head/0.9
После успешной установки в каталоге plugins появится каталог head, указывающий на успешную установку.
Просмотр снимков экрана:

**x-pack мониторинг**
С выпуском Elastic 6.1, Elasticsearch, Logstash и Kibana были обновлены с версии 2.4 до версии 5.0. Версия ELK 5.x требует относительно высоких требований к совместимости версий, больше не поддерживает смешивание 5.x и 2.x, и Elastic объединил marvel, watch и alert в пакет под названием x-pack.
Установка: https://www.elastic.co/guide/en/elasticsearch/reference/6.1/installing-xpack-es.html
Управление пользователями
После установки x-pack существует суперпользователь с именем elastic, пароль по умолчанию — changeme, у него есть права администратора для всех индексов и данных, вы можете использовать этого пользователя для создания и изменения других пользователей, конечно, вы также можете управлять пользователями и группами через веб-интерфейс kibana.
Изменить пароль пользователя elastic:
curl -XPUT -u elastic 'localhost:9200/_xpack/security/user/elastic/_password' -d '{ "password" : "123456" }'
**IK Analysis для Elasticsearch**
Скачать и установить:
- Способ 1 — скачать готовый пакет с здесь: https://github.com/medcl/elasticsearch-analysis-ik/releases
Распакуйте плагин в папку your-es-root/plugins/
- Способ 2 — используйте elasticsearch-plugin для установки (версия > v5.5.1):
./bin/elasticsearch-plugin install https://github.com/medcl/elasticsearch-analysis-ik/releases/download/v6.0.0/elasticsearch-analysis-ik-6.0.0.zip
Поскольку версия Elasticsearch — 2.4.6, здесь выбрана версия IK — 1.10.6
После распаковки файла в файле конфигурации Elasticsearch elasticsearch.yml в разделе index добавьте следующий код (для версии 2.0 и выше можно не устанавливать).
index:
analysis:
analyzer:
ik:
alias: [ik_analyzer]
type: org.elasticsearch.index.analysis.IkAnalyzerProvider
ik_max_word:
type: ik
use_smart: false
ik_smart:
type: ik
use_smart: true
Или **Анализ текста с помощью Elasticsearch**
**Установка**:
http://192.168.1.180:9200/_analyze?analyzer=standard&pretty=true&text=я люблю тебя китай { "tokens": [ { "token": "я", "start_offset": 0, "end_offset": 1, "type": "", "position": 0 }, { "token": "люблю", "start_offset": 1, "end_offset": 2, "type": "", "position": 1 }, { "token": "тебя", "start_offset": 2, "end_offset": 3, "type": "", "position": 2 }, { "token": "китай", "start_offset": 3, "end_offset": 5, "type": "", "position": 3 } ] }
**После установки**:
http://121.42.155.213:9200/_analyze?analyzer=ik&pretty=true&text=я люблю тебя китай { "tokens": [ { "token": "я люблю тебя", "start_offset": 0, "end_offset": 3, "type": "CN_WORD", "position": 0 }, { "token": "люблю тебя", "start_offse": 1, "end_offset": 3, "type": "CN_WORD", "position": 1 }, { "token": "китай", "start_offset": 3, "end_offset": 5, "type": "CN_WORD", "position": 2 } ] }
Для синхронизации MySQL и Elasticsearch используется сторонняя библиотека elasticsearch-jdbc.
centos7.5, JDK8, elasticsearch-jdbc-2.3.2.0.
Скачать библиотеку:
wget http://xbib.org/repository/org/xbib/elasticsearch/importer/elasticsearch-jdbc/2.3.2.0/elasticsearch-jdbc-2.3.2.0-dist.zip
Распаковать архив:
unzip elasticsearch-jdbc-2.3.2.0-dist.zip
Настроить скрипт mysql_import_es.sh:
#!/bin/sh
bin=/home/elasticsearch-jdbc-2.3.2.0/bin
lib=/home/elasticsearch-jdbc-2.3.2.0/lib
echo '{
"type" : "jdbc",
"jdbc": {
# 如果数据库中存在Json文件 这里设置成false,否则会同步出错
"detect_json":false,
"url":"jdbc:mysql://127.0.0.1:3306/itstyle_log??useUnicode=true&characterEncoding=utf-8&useSSL=false&allowMultiQueries=true",
"user":"root",
"password":"root",
# 如果想自动生成_id,去掉第一个获取字段即可;如果想Id作为主键,把id设置为_id即可
"sql":"SELECT id AS _id,id,user_id AS userId ,username,operation,time,method,params,ip,device_type AS deviceType,log_type AS logType,exception_detail AS exceptionDetail,
gmt_create AS gmtCreate,plat_from AS platFrom FROM sys_log",
"elasticsearch" : {
"host" : "127.0.0.1",#elasticsearch服务地址
"port" : "9300" #远程elasticsearch服务 此端口一定要开放
},
"index" : "elasticsearch",# 索引名相当于库
"type" : "sysLog" # 类型名相当于表
}
}' | java
-cp "${lib}/*"
-Dlog4j.configurationFile=${bin}/log4j2.xml
org.xbib.tools.Runner
org.xbib.tools.JDBCImporter
4. Выполнить скрипт:
chmod +x mysql_import_es.sh ./mysql_import_es.sh
## ElasticSearchRepository и ElasticSearchTemplate
Spring-data-elasticsearch — это слой данных для работы с Elasticsearch от Spring. Он предоставляет множество базовых операций, которые упрощают работу с Elasticsearch.
#### Основные операции ElasticSearchRepository
/**
@param
@param
@author Rizwan Idrees
@author Mohsin Husen */ @NoRepositoryBean public interface ElasticsearchRepository<T, ID extends Serializable> extends ElasticsearchCrudRepository<T, ID> {
S index(S entity);
Iterable search(QueryBuilder query);
Page search(QueryBuilder query, Pageable pageable);
Page search(SearchQuery searchQuery);
Page searchSimilar(T entity, String[] fields, Pageable pageable);
void refresh();
Class getEntityClass(); }
ElasticSearchTemplate в большей степени является дополнением к ESRepository и предоставляет некоторые более низкоуровневые методы.
Здесь мы в основном реализуем функцию быстрого чтения и пакетной вставки данных. Вставляем 200 000 записей, на локальном внешнем сервере (1 ядро, 1 ГБ), время выполнения составляет около 60 секунд, то есть примерно одну минуту. Хотя объём индексного хранилища увеличивается, для поиска требуется примерно 10 минут.
// Пакетная синхронизация или вставка данных
public void bulkIndex(List logList) {
long start = System.currentTimeMillis();
int counter = 0;
try {
List queries = new ArrayList<>();
for (SysLogs log : logList) {
IndexQuery indexQuery = new IndexQuery();
indexQuery.setId(log.getId()+ "");
indexQuery.setObject(log);
indexQuery.setIndexName("elasticsearch");
indexQuery.setType("sysLog");
// Также можно использовать IndexQueryBuilder для построения
// IndexQuery index = new IndexQueryBuilder().withId(person.getId() + "").withObject(person).build();
queries.add(indexQuery);
if (counter % 1000 == 0) {
elasticSearchTemplate.bulkIndex(queries);
queries.clear();
System.out.println("bulkIndex counter : " + counter);
}
counter++;
}
if (queries.size() > 0) {
elasticSearchTemplate.bulkIndex(queries);
}
long end = System.currentTimeMillis();
System.out.println("bulkIndex completed use time:"+ (end-start));
} catch (Exception e) {
System.out.println("IndexerService.bulkIndex e;" + e.getMessage());
throw e;
}
}
**Redis журнал очереди**
См. пакет: com.itstyle.es.common.redis
Конфигурация слушателя RedisListener:
@Component public class RedisListener { private static final Logger LOGGER = LoggerFactory.getLogger(RedisListener.class); @Bean RedisMessageListenerContainer container( RedisConnectionFactory connectionFactory, MessageListenerAdapter listenerAdapter) { LOGGER.info("Запуск прослушивания"); RedisMessageListenerContainer container = new RedisMessageListenerContainer(); container.setConnectionFactory(connectionFactory); container.addMessageListener(listenerAdapter, new PatternTopic("itstyle_log")); return container; }
@Bean
MessageListenerAdapter listenerAdapter(Receiver receiver) {
return new MessageListenerAdapter(receiver, "receiveMessage");
}
@Bean
Receiver receiver(CountDownLatch latch) {
return new Receiver(latch);
}
@Bean
CountDownLatch latch() {
return new CountDownLatch(1);
}
@Bean
StringRedisTemplate template(RedisConnectionFactory connectionFactory) {
return new StringRedisTemplate(connectionFactory);
}
}
Приёмник журнала Receiver:
public class Receiver { private static final Logger LOGGER = LoggerFactory.getLogger(Receiver.class); @Autowired private ElasticLogRepository elasticLogRepository; private CountDownLatch latch;
@Autowired
public Receiver(CountDownLatch latch) {
this.latch = latch;
}
public void receiveMessage(String message) {
LOGGER.info("Получение сообщения журнала <{}>",message);
if(message == null){
LOGGER.info("Получено сообщение журнала <" + null + ">");
}else {
ObjectMapper mapper = new ObjectMapper();
try {
SysLogs log = mapper.readValue(message, SysLogs.class);
elasticLogRepository.save(log);
LOGGER.info("Содержание сообщения журнала <{}>",log.getOperation());
} catch (JsonParseException e) {
e.printStackTrace();
} catch (JsonMappingException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
}
}
latch.countDown();
}
}
Тестирование LogController: http://lip:port/redisLog
**Kafka журнал очереди**
См. пакет: com.itstyle.es.common.kafka
## Рекомендуемые материалы для чтения **Архитектура JavaWeb-проектов: система обработки журналов Elasticsearch**
**Архитектура JavaWeb-проектов: распределённая система очередей журналов Redis**
**Архитектура JavaWeb-проектов: распределённая система очередей журналов Kafka**
Автор: 小柒2012
Подписывайтесь: https://blog.52itstyle.vip/
Вы можете оставить комментарий после Вход в систему
Неприемлемый контент может быть отображен здесь и не будет показан на странице. Вы можете проверить и изменить его с помощью соответствующей функции редактирования.
Если вы подтверждаете, что содержание не содержит непристойной лексики/перенаправления на рекламу/насилия/вульгарной порнографии/нарушений/пиратства/ложного/незначительного или незаконного контента, связанного с национальными законами и предписаниями, вы можете нажать «Отправить» для подачи апелляции, и мы обработаем ее как можно скорее.
Комментарии ( 0 )