| Elasticsearch | PostgreSQL | MongoDB |
|---|---|---|
| Индекс | База данных | База данных |
| Маппинг(mapping)/тип | Таблица | Коллекция |
| Поле | Колонка | Поле |
| Объект (JSON) | JSONB | Объект (BSON) |
JSX
{
"_index": "index-2024.06.06",
"_type": "_doc",
"_id": "yvNZcWwBygdfsdsdss",
"_version": 1,
"_score": null,
"_source": {
"user_uuids": [
"dae7f01c-4c98-db35-a643-bfbb8fcf40f0",
"db6e3718-cf2f-4ae0-8681-529cb75be9a6"
]
}
} integer, long, float и double. Выбор между ними зависит от того, нужно вам точное число или диапазон значений.index.number_of_shards: 1 JSX
GET _cat/shards?v=true&h=index,prirep,shard,store&s=prirep,store&bytes=gb max_primary_shard_size, max_age, max_docs, max_size.YAML
version: "3"
services:
elasticsearch:
image: elasticsearch:8.14.3
volumes:
- ./conf/elasticsearch/conf.yml:/usr/share/elasticsearch/config/elasticsearch.yml:ro
- ./elasticsearch/data:/usr/share/elasticsearch/data
environment:
ES_JAVA_OPTS: "-Xmx1G"
ELASTIC_USERNAME: "elastic"
ELASTIC_PASSWORD: "sampleELK"
discovery.type: single-node
networks:
- elknet
ports:
- "9200:9200"
- "9300:9300"
logstash:
image: logstash:8.14.3
volumes:
- ./conf/logstash/conf.yml:/usr/share/logstash/config/logstash.yml:ro
environment:
LS_JAVA_OPTS: "-Xmx512m -Xms512m"
ports:
- "5044:5044"
- "5010:5000"
- "9600:9600"
networks:
- elknet
depends_on:
- elasticsearch
kibana:
image: kibana:8.14.3
depends_on:
- elasticsearch
volumes:
- ./conf/kibana/conf.yml:/usr/share/kibana/config/kibana.yml:ro
networks:
- elknet
ports:
- "5601:5601"
networks:
elknet:
driver: bridge
conf/elasticsearch/conf.yml:YAML
cluster.name: "sample-elk"
network.host: 0.0.0.0
xpack.security.enabled: false # Отключить аутентификацию
xpack.license.self_generated.type: basic # Тип лицензии "basic"
xpack.security. Не всегда они пригодятся, особенно если у вашей организации есть собственная система аутентификации.conf/kibana/conf.yml:YAML
server.name: kibana
server.host: 0.0.0.0
server.publicBaseUrl: "http://localhost:5601"
monitoring.ui.container.elasticsearch.enabled: true
elasticsearch.hosts: ["http://elasticsearch:9200"]
conf/logstash/conf.yml:YAML
http.host: "0.0.0.0"
BASH
docker-compose up -d
docker-compose down и начните заново.YAML
nginx:
image: nginx:latest
volumes:
- ./conf/nginx/nginx.conf:/etc/nginx/nginx.conf
- ./var/log/nginx:/var/log/nginx
networks:
- elknet
ports:
- 80:80
/conf/nginx/nginx.conf:JSON
user nginx; # Установить системного пользователя для сервиса nginx
worker_processes 1;
error_log /var/log/nginx/error.log warn; # Логи ошибок nginx
pid /var/run/nginx.pid; # PID nginx для запуска
events {
worker_connections 1024; # Максимальное количество разрешённых соединений в процессе
}
http { # Конфигурация HTTP-запросов, НТТP может содержать несколько серверов
# Определение Content-Type
include /etc/nginx/mime.types;
default_type application/octet-stream;
log_format json '{"@timestamp":"$time_iso8601",'
'"host":"$server_addr",'
'"ipaddr":"$remote_addr",'
'"login_user":"$remote_user",'
'"size":$body_bytes_sent,'
'"responsetime":$request_time,'
'"upstreamtime":"$upstream_response_time",'
'"upstreamhost":"$upstream_addr",'
'"http_host":"$host",'
'"url":"$uri",'
'"domain":"$host",'
'"xff":"$http_x_forwarded_for",'
'"referer":"$http_referer",'
'"status":"$status"}';
access_log /var/log/nginx/access.json json;
sendfile on;
keepalive_timeout 65;
gzip on;
server { # Сервер может иметь несколько настроенных локаций
listen 80;
server_name localhost; # Имя хоста, доменное имя
location / {
root /usr/share/nginx/html;
index index.html index.htm; # Страница по умолчанию
}
# Перенаправлять ошибки 500, 502, 503, 504 на страницу /50x.html
error_page 500 502 503 504 /50x.html;
location = /50x.html { # Установить путь к странице, которая определена в error_page
root /usr/share/nginx/html;
}
}
include /etc/nginx/conf.d/*.conf;
} /conf/logstash/pipelines.yml:JSON
- pipeline.id: nginx_logs
pipeline.workers: 1
pipeline.batch.size: 1
path.config: "/usr/share/logstash/config/pipelines/nginx.conf"
/conf/logstash/pipelines/nginx.conf:JSON
input {
beats {
port => 5044
}
}
filter {
json {
source => "message"
}
mutate {
add_field => { "sample" => "Hello world, from %{host}" }
}
}
output {
stdout { codec => json }
elasticsearch {
hosts => ["http://elasticsearch:9200"]
index => "%{[@metadata][beat]}-%{+YYYY.MM.dd}"
}
}
/conf/filebeat/conf.yml:YAML
filebeat.inputs:
- type: log
enabled: true
paths:
- /var/log/nginx/*.json
json.keys_under_root: true
json.overwrite_keys: false
json.add_error_key: true
output.logstash:
enabled: true
hosts: ["logstash:5044"]
setup.kibana:
host: "http://kibana:5601" YAML
logstash:
image: logstash:8.14.3
volumes:
- ./conf/logstash/conf.yml:/usr/share/logstash/config/logstash.yml:ro
- ./conf/logstash/pipelines.yml:/usr/share/logstash/config/pipelines.yml:ro
- ./conf/logstash/pipelines:/usr/share/logstash/config/pipelines:ro
environment:
LS_JAVA_OPTS: "-Xmx512m -Xms512m"
ports:
- "5044:5044"
- "5010:5000"
- "9600:9600"
networks:
- elknet
depends_on:
- elasticsearch YAML
beats:
image: elastic/filebeat:8.14.3
volumes:
- ./conf/filebeat/conf.yml:/usr/share/filebeat/filebeat.yml:ro
- ./var/log/nginx:/var/log/nginx
networks:
- elknet
depends_on:
- nginx
- elasticsearch BASH
docker-compose up elasticsearch -d
docker-compose up nginx -d
docker-compose up kibana -d JSON
log_format json '{"@timestamp":"$time_iso8601",'
'"host":"$server_addr",'
'"ipaddr":"$remote_addr",'
'"login_user":"$remote_user",'
'"size":$body_bytes_sent,'
'"responsetime":$request_time,'
'"upstreamtime":"$upstream_response_time",'
'"upstreamhost":"$upstream_addr",'
'"http_host":"$host",'
'"url":"$uri",'
'"domain":"$host",'
'"xff":"$http_x_forwarded_for",'
'"referer":"$http_referer",'
'"status":"$status"}' BASH
docker-compose up logstash -d
docker-compose up beats -d docker ps -a. При необходимости посмотрите логи docker logs -f id_контейнера.