Hướng dẫn Elasticsearch cho người mới bắt đầu

Hướng dẫn Elasticsearch cho người mới bắt đầu

Lưu ý: Elastic gần đây đã thông báo rằng họ sẽ triển khai cấp phép nguồn đóng cho các phiên bản mới của Elasticsearch và Kibana từ Phiên bản 7.9.

Elasticsearch là trung tâm của nền tảng phân tích log phổ biến nhất hiện nay – ELK Stack (Elasticsearch, Logstash và Kibana). Vai trò của Elasticsearch là trung tâm đến mức nó đã trở thành đồng nghĩa với tên của chính ngăn xếp.

Chủ yếu để tìm kiếm và phân tích log, Elasticsearch ngày nay là một trong những hệ thống cơ sở dữ liệu phổ biến nhất hiện nay.

Hướng dẫn Elasticsearch này cung cấp cho người dùng mới kiến ​​thức và công cụ để bắt đầu sử dụng Elasticsearch. Nó bao gồm hướng dẫn cài đặt, lập chỉ mục ban đầu và hướng dẫn xử lý dữ liệu.

Elasticsearch là gì?

Được phát hành lần đầu vào năm 2010, Elasticsearch (đôi khi được gọi là ES) là một công cụ phân tích và tìm kiếm hiện đại dựa trên Apache Lucene. Hoàn toàn mã nguồn mở và được xây dựng bằng Java, Elasticsearch là một cơ sở dữ liệu NoSQL. Điều đó có nghĩa là nó lưu trữ dữ liệu bán cấu trúc hoặc phi cấu trúc.

Hướng dẫn Elasticsearch này cũng có thể được coi là một hướng dẫn NoSQL. Tuy nhiên, không giống như hầu hết các cơ sở dữ liệu NoSQL, Elasticsearch tập trung mạnh vào các khả năng và tính năng tìm kiếm – trên thực tế, cách dễ nhất để lấy dữ liệu từ ES là tìm kiếm nó bằng cách sử dụng API Elasticsearch mở rộng.

Trong bối cảnh phân tích dữ liệu, Elasticsearch được sử dụng cùng với các thành phần khác trong ELK Stack, Logstash và Kibana, đồng thời đóng vai trò lập chỉ mục và lưu trữ dữ liệu.

Cài đặt Elasticsearch

Yêu cầu đối với Elasticsearch rất đơn giản: Java 8 (phiên bản cụ thể được khuyến nghị: Oracle JDK phiên bản 1.8.0_131). Ngoài ra, bạn sẽ muốn đảm bảo hệ điều hành của mình được Elastic hỗ trợ, nếu không, bạn có thể gặp phải các vấn đề lạ và không thể đoán trước. Sau khi hoàn tất, bạn có thể bắt đầu bằng cách cài đặt Elasticsearch.

Bạn có thể tải xuống Elasticsearch dưới dạng bản phân phối độc lập hoặc cài đặt nó bằng cách sử dụng kho aptyum. Chúng tôi sẽ cài đặt Elasticsearch trên máy Ubuntu 16.04 chạy trên AWS EC2 bằng cách sử dụng apt.

Trước tiên, bạn cần thêm signing key của Elastic để có thể xác minh gói đã tải xuống (bỏ qua bước này nếu bạn đã cài đặt các gói từ Elastic):

wget -qO - https://artifacts.elastic.co/GPG-KEY-elasticsearch | sudo apt-key add -

Đối với Debian, sau đó chúng ta cần cài đặt gói apt-transport-https:

sudo apt-get install apt-transport-https

Bước tiếp theo là thêm định nghĩa kho lưu trữ vào hệ thống của bạn:

echo "deb https://artifacts.elastic.co/packages/6.x/apt stable main" | sudo tee -a /etc/apt/sources.list.d/elastic-6.x.list

Tất cả những gì còn lại cần làm là cập nhật kho lưu trữ của bạn và cài đặt Elasticsearch:

sudo apt-get update
sudo apt-get install elasticsearch

Cấu hình Elasticsearch

Cấu hình Elasticsearch được thực hiện bằng cách sử dụng tệp cấu hình có vị trí phụ thuộc vào hệ điều hành của bạn. Trong tệp này, bạn có thể cấu hình cài đặt chung (ví dụ: tên nút), cũng như cài đặt mạng (ví dụ: máy chủ và cổng), nơi dữ liệu được lưu trữ, bộ nhớ, tệp nhật ký, v.v.

Đối với mục đích phát triển và thử nghiệm, cài đặt mặc định là đủ nhưng bạn nên thực hiện một số nghiên cứu về cài đặt nào bạn nên xác định theo cách thủ công trước khi đi vào sản xuất.

Ví dụ: và đặc biệt nếu cài đặt Elasticsearch trên đám mây, cách tốt nhất là liên kết Elasticsearch với IP riêng hoặc localhost:

sudo vim /etc/elasticsearch/elasticsearch.yml

Rồi cập nhật hai dòng sau:

network.host: "localhost"
http.port:9200

Khởi động Elasticsearch

Elasticsearch sẽ không tự động chạy sau khi cài đặt và bạn sẽ cần phải khởi động nó theo cách thủ công. Cách bạn chạy Elasticsearch sẽ phụ thuộc vào hệ thống cụ thể của bạn. Trên hầu hết các hệ thống dựa trên Linux và Unix, bạn có thể sử dụng lệnh này:

sudo service elasticsearch start

Để xác nhận rằng mọi thứ đang hoạt động tốt, chỉ cần trỏ curl hoặc trình duyệt của bạn đến http://localhost:9200 và bạn sẽ thấy một cái gì đó giống như kết quả sau:

{
  "name" : "33QdmXw",
  "cluster_name" : "elasticsearch",
  "cluster_uuid" : "mTkBe_AlSZGbX-vDIe_vZQ",
  "version" : {
    "number" : "6.1.2",
    "build_hash" : "5b1fea5",
    "build_date" : "2018-01-10T02:35:59.208Z",
    "build_snapshot" : false,
    "lucene_version" : "7.1.0",
    "minimum_wire_compatibility_version" : "5.6.0",
    "minimum_index_compatibility_version" : "5.0.0"
  },
  "tagline" : "You Know, for Search"
}

Để gỡ lỗi quá trình chạy Elasticsearch, hãy sử dụng tệp nhật ký Elasticsearch nằm (trên Deb) trong thư mục /var/log/elasticsearch/.

Tạo index Elasticsearch

Lập chỉ mục là quá trình thêm dữ liệu vào Elasticsearch. Điều này là do khi bạn cấp dữ liệu vào Elasticsearch, dữ liệu được đặt vào các index Apache Lucene.

Điều này có ý nghĩa vì Elasticsearch sử dụng các index Lucene để lưu trữ và truy xuất dữ liệu của nó. Mặc dù bạn không cần phải biết nhiều về Lucene, nhưng nó sẽ giúp bạn biết cách hoạt động của nó khi bạn bắt đầu nghiêm túc với Elasticsearch.

Elasticsearch hoạt động giống như một REST API, vì vậy bạn có thể sử dụng phương thức POST hoặc PUT để thêm dữ liệu vào nó. Sử dụng POST nếu bạn muốn Elasticsearch tạo một id mới cho dữ liệu:

curl -XPOST 'localhost:9200/logs/my_app' -H 'Content-Type: application/json' -d'
{
    "timestamp": "2018-01-24 12:34:56",
    "message": "User logged in",
    "user_id": 4,
    "admin": false
}
'

Kết quả:

{
  "_index": "logs",
  "_type": "my_app",
  "_id": "ZsWdJ2EBir6MIbMWSMyF",
  "_version": 1,
  "result": "created",
  "_shards": {
    "total": 2,
    "successful": 1,
    "failed": 0
  },
  "_seq_no": 0,
  "_primary_term": 1
}

Bạn sử dụng PUT khi bạn biết hoặc muốn chỉ định id dữ liệu:

curl -X PUT 'localhost:9200/app/users/4' -H 'Content-Type: application/json' -d '
{
    "id": 4,
    "username": "john",
    "last_login": "2018-01-25 12:34:56"
}
'

Kết quả:

{
  "_index": "app",
  "_type": "users",
  "_id": "4",
  "_version": 1,
  "result": "created",
  "_shards": {
    "total": 2,
    "successful": 1,
    "failed": 0
  },
  "_seq_no": 0,
  "_primary_term": 1
}

Dữ liệu cho document được gửi dưới dạng đối tượng JSON. Bạn có thể tự hỏi làm thế nào Elasticsearch có thể lập chỉ mục dữ liệu mà không cần xác định cấu trúc của dữ liệu. Vâng, với Elasticsearch, giống như với bất kỳ cơ sở dữ liệu NoSQL nào khác, không cần phải xác định trước cấu trúc của dữ liệu.

Tuy nhiên, để đảm bảo hiệu suất tối ưu, bạn có thể xác định ánh xạ Elasticsearch theo kiểu dữ liệu. Bạn có thể tìm hiểu thêm về điều này ở những bài viết sau.

Nếu bạn đang sử dụng bất kỳ shipper nào của Beats (ví dụ: Filebeat hoặc Metricbeat) hoặc Logstash, những thành phần đó của ELK Stack sẽ tự động tạo index.

Để xem danh sách các index Elasticsearch của bạn, hãy sử dụng lệnh:

curl -XGET 'localhost:9200/_cat/indices?v&pretty'

Kết quả:

health status index               uuid                   pri rep docs.count docs.deleted store.size pri.store.size
yellow open   logstash-2018.01.23 y_-PguqyQ02qOqKiO6mkfA   5   1      17279            0      9.9mb          9.9mb
yellow open   app                 GhzBirb-TKSUFLCZTCy-xg   5   1          1            0      5.2kb          5.2kb
yellow open   .kibana             Vne6TTWgTVeAHCSgSboa7Q   1   1          2            0      8.8kb          8.8kb
yellow open   logs                T9E6EdbMSxa8S_B7SDabTA   5   1          1            0      5.7kb          5.7kb

Danh sách trong trường hợp này bao gồm các index chúng tôi đã tạo ở trên, một index Kibana và một index được tạo bởi một đường ống Logstash.

Truy vấn Elasticsearch

Sau khi lập chỉ mục dữ liệu của mình vào Elasticsearch, bạn có thể bắt đầu tìm kiếm và phân tích dữ liệu đó. Truy vấn đơn giản nhất mà bạn có thể làm là tìm nạp một phần tử duy nhất. Đọc bài viết của chúng tôi chỉ tập trung vào các truy vấn Elasticsearch.

Một lần nữa, chúng tôi sử dụng Elasticsearch REST API:

curl -XGET 'localhost:9200/app/users/4?pretty'

Kết quả:

{
  "_index" : "app",
  "_type" : "users",
  "_id" : "4",
  "_version" : 1,
  "found" : true,
  "_source" : {
    "id" : 4,
    "username" : "john",
    "last_login" : "2018-01-25 12:34:56"
  }
}

Các trường bắt đầu bằng dấu gạch dưới là trường meta của kết quả. Đối tượng _source là tài liệu gốc đã được lập chỉ mục.

Chúng tôi cũng thực hiện tìm kiếm bằng cách gọi endpoint _search:

curl -XGET 'localhost:9200/_search?q=logged'

Kết quả:

{
  "took": 173,
  "timed_out": false,
  "_shards": {
    "total": 16,
    "successful": 16,
    "skipped": 0,
    "failed": 0
  },
  "hits": {
    "total": 1,
    "max_score": 0.2876821,
    "hits": [
      {
        "_index": "logs",
        "_type": "my_app",
        "_id": "ZsWdJ2EBir6MIbMWSMyF",
        "_score": 0.2876821,
        "_source": {
          "timestamp": "2018-01-24 12:34:56",
          "message": "User logged in",
          "user_id": 4,
          "admin": false
        }
      }
    ]
  }
}

Kết quả chứa một số trường bổ sung mô tả cả tìm kiếm và kết quả. Dưới đây là tóm tắt nhanh:

  • took: Thời gian tính bằng mili giây mà tìm kiếm đã diễn ra.
  • timed_out: Nếu quá trình tìm kiếm đã hết thời gian.
  • _shards: Số lượng các phân đoạn Lucene được tìm kiếm và tỷ lệ thành công và thất bại của chúng.
  • hits: Kết quả thực tế, cùng với thông tin meta cho kết quả.

Tìm kiếm chúng tôi đã thực hiện ở trên được gọi là Tìm kiếm URI và là cách đơn giản nhất để truy vấn Elasticsearch. Bằng cách chỉ cung cấp một từ, ES sẽ tìm kiếm tất cả các trường của tất cả các document cho từ đó. Bạn có thể tạo các tìm kiếm cụ thể hơn bằng cách sử dụng các truy vấn Lucene:

  • username:johnb – Tìm kiếm các tài liệu có trường tên người dùng bằng “johnb”
  • john* – Tìm kiếm các tài liệu chứa các thuật ngữ bắt đầu bằng john và theo sau là không hoặc nhiều ký tự như “john”, “johnb” và “johnson”
  • john? – Tìm kiếm các tài liệu chứa các thuật ngữ bắt đầu bằng john theo sau chỉ một ký tự. Khớp với “johnb” và “johns” nhưng không khớp với “john”.

Có nhiều cách khác để tìm kiếm bao gồm sử dụng logic boolean, tăng cường các thuật ngữ, sử dụng tìm kiếm mờ và gần, và sử dụng các biểu thức chính quy.

Truy vấn DSL trong Elasticsearch

Tìm kiếm URI chỉ là bước khởi đầu. Elasticsearch cũng cung cấp tìm kiếm nội dung yêu cầu với truy vấn DSL cho các tìm kiếm nâng cao hơn. Có một loạt các tùy chọn có sẵn trong các loại tìm kiếm này và bạn có thể kết hợp các tùy chọn khác nhau để nhận được kết quả mà bạn yêu cầu.

Nó chứa hai loại mệnh đề:

  • Mệnh đề leaf query – tìm kiếm giá trị trong một trường cụ thể .
  • Mệnh đề compound query – có thể chứa một hoặc một số mệnh đề leaf query.

Các loại truy vấn Elasticsearch

Có rất nhiều tùy chọn có sẵn trong các loại tìm kiếm này và bạn có thể kết hợp các tùy chọn khác nhau để nhận được kết quả mà bạn yêu cầu. Các loại truy vấn bao gồm:

  1. Geo queries,
  2. “More like this” queries
  3. Scripted queries
  4. Full text queries
  5. Shape queries
  6. Span queries
  7. Term-level queries
  8. Specialized queries

Kể từ Elasticsearch 6.8, ELK Stack đã hợp nhất các truy vấn Elasticsearch và bộ lọc Elasticsearch, nhưng ES vẫn phân biệt chúng theo ngữ cảnh. DSL phân biệt giữa ngữ cảnh bộ lọcngữ cảnh truy vấn cho các mệnh đề truy vấn.

Các điều khoản trong tài liệu kiểm tra ngữ cảnh bộ lọc theo kiểu boolean: Tài liệu có khớp với bộ lọc, “có” hay “không?” Các bộ lọc nói chung cũng nhanh hơn các truy vấn, nhưng các truy vấn cũng có thể tính điểm phù hợp tùy theo mức độ liên quan của một tài liệu đối với truy vấn. Bộ lọc không sử dụng điểm phù hợp. Điều này xác định thứ tự và bao gồm các tài liệu:

curl -XGET 'localhost:9200/logs/_search?pretty' -H 'Content-Type: application/json' -d'
{
  "query": {
    "match_phrase": {
      "message": "User logged in"
    }
  }
}
'

Kết quả:

{
  "took" : 28,
  "timed_out" : false,
  "_shards" : {
    "total" : 5,
    "successful" : 5,
    "skipped" : 0,
    "failed" : 0
  },
  "hits" : {
    "total" : 1,
    "max_score" : 0.8630463,
    "hits" : [
      {
        "_index" : "logs",
        "_type" : "my_app",
        "_id" : "ZsWdJ2EBir6MIbMWSMyF",
        "_score" : 0.8630463,
        "_source" : {
          "timestamp" : "2018-01-24 12:34:56",
          "message" : "User logged in",
          "user_id" : 4,
          "admin" : false
        }
      }
    ]
  }
}

Tạo một cụm Elasticsearch

Việc duy trì một cụm Elasticsearch có thể tốn nhiều thời gian, đặc biệt nếu bạn đang tự làm ELK. Tuy nhiên, với khả năng tìm kiếm và phân tích mạnh mẽ của Elasticsearch, các cụm như vậy là không thể thiếu. Chúng tôi đã đi sâu hơn về chủ đề này với hướng dẫn cụm Elasticsearch của chúng tôi, vì vậy chúng tôi sẽ sử dụng điều này làm bàn đạp cho quá trình tìm hiểu kỹ lưỡng hơn.

Chính xác thì cụm Elasticsearch là gì? Cụm Elasticsearch nhóm nhiều nút và / hoặc bản sao Elasticsearch lại với nhau. Tất nhiên, bạn luôn có thể chọn duy trì một phiên bản hoặc nút Elasticsearch bên trong một cụm nhất định. Điểm chính của việc phân nhóm như vậy nằm ở việc phân phối các nhiệm vụ, tìm kiếm và lập chỉ mục của cụm trên các nút của nó. Các tùy chọn nút bao gồm data node, master node, client node và ingest node.

Việc cài đặt các nút có thể liên quan đến rất nhiều cấu hình, mà hướng dẫn đã đề cập ở trên của chúng tôi bao gồm. Nhưng đây là cài đặt nút cụm Elasticsearch cơ bản:

Đầu tiên và quan trọng nhất, hãy cài đặt Java:

sudo apt-get install default-jre

Tiếp theo, thêm sign-in key của Elasticsearch:

wget -qO - https://artifacts.elastic.co/GPG-KEY-elasticsearch | sudo apt-key add -

Tiếp theo, cài đặt phiên bản mới của Elasticsearch:

sudo apt-get update && apt-get install elasticsearch

Bạn sẽ phải tạo và / hoặc thiết lập tệp cấu hình elasticsearch.yml riêng của từng nút Elasticsearch (sudo vim /etc/elasticsearch/elasticsearch.yml). Từ đó, khởi động Elasticsearch và sau đó kiểm tra trạng thái cụm Elasticsearch của bạn. Kết quả sẽ giống như sau:

{
  "cluster_name" : "elasticsearch-cluster-demo",
  "compressed_size_in_bytes" : 255,
  "version" : 7,
  "state_uuid" : "50m3ranD0m54a531D",
  "master_node" : "IwEK2o1-Ss6mtx50MripkA",
  "blocks" : { },
  "nodes" : {
    "m4-aw350m3-n0D3" : {
      "name" : "es-node-1",
      "ephemeral_id" : "x50m33F3mr--A11DnuM83r",
      "transport_address" : "172.31.50.123:9200",
      "attributes" : { }
    },
  },
}

Tình trạng cụm Elasticsearch sẽ nằm tiếp theo trong checklist của bạn. Kiểm tra định kỳ tình trạng cụm của bạn bằng lệnh sau:

curl -X GET "localhost:9200/_cluster/health?wait_for_status=yellow&local=false&level=shards&pretty"

Ví dụ này hiển thị tham số localfalse, (thực tế là theo mặc định). Điều này sẽ hiển thị cho bạn trạng thái của master node. Để kiểm tra nút cục bộ, hãy thay đổi local thành true.

Thông số level, theo mặc định sẽ hiển thị cho bạn tình trạng của cụm, bao gồm indicesshards (như trong ví dụ trên).

Có các thông số tùy chọn bổ sung cho thời gian chờ như:

timeout
master_timeout

Hoặc, để đợi các sự kiện nhất định xảy ra:

wait_for_active_shards
wait_for_events
wait_for_no_initializing_shards
wait_for_no_relocating_shards
wait_for_nodes
wait_for_status

Xóa dữ liệu Elasticsearch

Xóa các phần tử khỏi Elasticsearch cũng dễ dàng như thêm dữ liệu vào Elasticsearch. Gọi lệnh sau để xóa dữ liệu:

curl -XDELETE 'localhost:9200/app/users/4?pretty'

Kết quả:

{
  "_index" : "app",
  "_type" : "users",
  "_id" : "4",
  "_version" : 2,
  "result" : "deleted",
  "_shards" : {
    "total" : 2,
    "successful" : 1,
    "failed" : 0
  },
  "_seq_no" : 1,
  "_primary_term" : 1
}

Để xóa một index, hãy sử dụng lệnh:

curl -XDELETE 'localhost:9200/logs?pretty'

Để xóa tất cả các index (sử dụng hết sức thận trọng), hãy sử dụng lệnh:

curl -XDELETE 'localhost:9200/_all?pretty'$

Kết quả trong cả hai lệnh trên là:

{
    "acknowledged" : true
}

Để xóa một document:

curl -XDELETE 'localhost:9200/index/type/document'

Trả lời

Email của bạn sẽ không được hiển thị công khai. Các trường bắt buộc được đánh dấu *