10 khái niệm Elasticsearch bạn cần biết

10 khái niệm Elasticsearch bạn cần biết

Làm quen với ELK Stack là một trong những điều đầu tiên bạn sẽ phải làm khi bắt đầu với ngăn xếp. Cũng giống như với bất kỳ ngôn ngữ lập trình nào, có một số khái cơ bản của Elasticsearch – một khi bạn nắm được chúng sẽ giúp quá trình học tập bớt vất vả hơn.

Chúng tôi đã tổng hợp 10 khái niệm quan trọng nhất mà bạn sẽ cần. Mặc dù các khái niệm áp dụng cụ thể cho Elasticsearch, nhưng chúng cũng rất quan trọng khi vận hành tổng thể ngăn xếp. Và để dễ hiểu hơn – chúng tôi sẽ so sánh các khái niệm này với các thuật ngữ tương ứng trong cơ sở dữ liệu quan hệ.

1. Field

Trường (Field) là đơn vị dữ liệu riêng lẻ nhỏ nhất trong Elasticsearch. Chúng có thể tùy chỉnh và có thể bao gồm, ví dụ: title, author, date, summary, team, score, v.v.

Mỗi trường có một kiểu dữ liệu xác định và chứa một phần dữ liệu. Các kiểu dữ liệu đó bao gồm kiểu dữ liệu cốt lõi (string, number, date, boolean), kiểu dữ liệu phức tạp (đối tượng và lồng nhau ), kiểu dữ liệu địa lý (get_point và geo_shape) và các kiểu dữ liệu chuyên biệt (số lượng mã thông báo, join, tính năng xếp hạng, vectơ dày đặc, flattened, v.v. .)

Có nhiều kiểu trường và cách khác nhau để quản lý chúng. Trường là một trong những cơ chế để ánh xạ Elasticsearch.

Multi-fields

Các trường này có thể (và nên) được lập chỉ mục theo nhiều cách để tạo ra nhiều kết quả tìm kiếm hơn.

Trường này có sẵn dễ dàng thông qua tùy chọn multi-fields, cho phép các trường được lập chỉ mục theo nhiều cách. Ví dụ: một cái gì đó có thể được lập chỉ mục dưới dạng free text hoặc một keyword cụ thể.

Meta-fields

Meta-fields xử lý siêu dữ liệu của tài liệu. Sự đa dạng của các trường này sẽ được trình bày kỹ hơn ở phần Mapping.

2. Document

Tài liệu (Document) là các đối tượng JSON được lưu trữ trong index Elasticsearch và được coi là đơn vị lưu trữ cơ sở. Trong thế giới của cơ sở dữ liệu quan hệ, tài liệu có thể được so sánh với một hàng trong bảng.

Ví dụ: giả sử rằng bạn đang chạy một ứng dụng thương mại điện tử. Bạn có thể có một tài liệu cho mỗi sản phẩm hoặc một tài liệu cho mỗi đơn đặt hàng. Không có giới hạn về số lượng tài liệu bạn có thể lưu trữ trong một index cụ thể.

Dữ liệu trong tài liệu được xác định với các trường bao gồm các khóa và giá trị. Khóa là tên của trường và giá trị có thể thuộc nhiều kiểu dữ liệu khác nhau, chẳng hạn như một chuỗi, một số, một biểu thức boolean, một đối tượng khác hoặc một mảng giá trị.

Tài liệu cũng chứa các trường dành riêng tạo thành siêu dữ liệu tài liệu như:

  • _index – nơi lưu trữ tài liệu
  • _type – kiểu tài liệu đại diện.
  • _id – số nhận dạng duy nhất cho tài liệu.

Ví dụ về một tài liệu:

{
    "_id": 3,
    "_type": ["your index type"],
    "_index": ["your index name"],
    "_source":
    {
        "age": 28,
        "name": ["daniel"],
        "year":1989,
    }
}

3. Mapping

Về phần ánh xạ (mapping), hãy nhớ rằng kể từ Elasticsearch 7.0, index type đã không còn được dùng nữa. Phần sau vẫn có liên quan đến các phiên bản cũ của Elasticsearch. Kiểu dữ liệu vẫn đang hoạt động.

Giống như một lược đồ trong thế giới cơ sở dữ liệu quan hệ, ánh xạ xác định các kiểu dữ liệu khác nhau nằm trong một index (mặc dù đối với phiên bản 6.0 cho đến khi nó không còn được sử dụng trong phiên bản 7.0, chỉ một kiểu dữ liệu có thể tồn tại trong một index).

Nó xác định các trường cho các tài liệu thuộc một kiểu dữ liệu cụ thể (chẳng hạn như keyword và số nguyên) và cách các trường nên được lập chỉ mục và lưu trữ trong Elasticsearch. Điều này bao gồm các trường meta, chẳng hạn như _index, _type_id.

Ví dụ:

curl -XPUT localhost:9200/example -d '{
  "mappings": {
    "mytype": {
      "properties": {
        "name": {
          "type": "string"
        },
        "age": {
          "type": "long"
        }
      }
    }
  }
}'

4. Mapping Type

Không nên nhầm lẫn với data type, mapping type bây giờ là một khía cạnh di sản của Elasticsearch, liên quan đến tất cả các phiên bản phát hành trước Elasticsearch 7.0.0.

Các kiểu Elasticsearch đã được sử dụng trong các tài liệu để chia nhỏ các kiểu dữ liệu tương tự, trong đó mỗi kiểu đại diện cho một kiểu tài liệu duy nhất. Kiểu bao gồm tên và ánh xạ (xem bên dưới) và được sử dụng bằng cách thêm trường type. Sau đó, trường này có thể được sử dụng để lọc khi truy vấn một kiểu cụ thể.

Một index có thể có bất kỳ kiểu nào và bạn có thể lưu trữ các tài liệu thuộc các kiểu này trong cùng một index.

5. Index

Index – đơn vị dữ liệu lớn nhất trong Elasticsearch, là các phân vùng logic của tài liệu và có thể được so sánh với một cơ sở dữ liệu trong thế giới cơ sở dữ liệu quan hệ.

Tiếp tục ví dụ về ứng dụng thương mại điện tử của chúng tôi, bạn có thể có một index chứa tất cả dữ liệu liên quan đến sản phẩm và một index khác chứa tất cả dữ liệu liên quan đến khách hàng.

Bạn có thể có bao nhiêu index được xác định trong Elasticsearch tùy thích.

Các index được xác định bằng tên viết thường liên quan đến các hành động được thực hiện (chẳng hạn như tìm kiếm và xóa) trên các tài liệu bên trong mỗi index.

Để biết danh sách các phương pháp hay nhất để làm việc với index, hãy xem bài viết Quản lý index Elasticsearch.

Một yếu tố quan trọng khác để nắm được cách các index của Elasticsearch hoạt động là xử lý các phân đoạn (shard).

6. Shard

Nói một cách đơn giản, các phân đoạn (shard) là một một index Lucene duy nhất. Chúng là các khối xây dựng của Elasticsearch và giúp cho Elasticsearch có khả năng mở rộng.

Kích thước của index là nguyên nhân phổ biến của các sự cố Elasticsearch. Vì không có giới hạn về số lượng tài liệu bạn có thể lưu trữ trên mỗi index, một index có thể chiếm dung lượng đĩa vượt quá giới hạn của máy chủ lưu trữ. Ngay sau khi một index đạt đến giới hạn này, việc lập chỉ mục sẽ bắt đầu không thành công.

Một cách để đối phó với vấn đề này là chia index theo chiều ngang thành từng miếng gọi là phân đoạn (shard). Điều này cho phép bạn phân phối các hoạt động trên các phân đoạn các nút để cải thiện hiệu suất.

Khi bạn tạo một index, bạn có thể xác định số lượng phân đoạn bạn muốn. Mỗi phân đoạn là một index Lucene độc ​​lập có thể được lưu trữ ở bất kỳ đâu trong cụm của bạn:

Ví dụ:

curl -XPUT localhost:9200/example -d '{
  "settings" : {
    "index" : {
      "number_of_shards" : 2, 
      "number_of_replicas" : 1 
    }
  }
}'

7. Replica

Bản sao (Replica), như tên của nó, là các cơ chế an toàn của Elasticsearch và về cơ bản là bản sao của các phân đoạn index của bạn. Đây là một hệ thống sao lưu hữu ích khi một nút gặp sự cố. Bản sao cũng phục vụ các yêu cầu đọc, vì vậy việc thêm bản sao có thể giúp tăng hiệu suất tìm kiếm.

Để đảm bảo tính khả dụng cao (High Availability – HA), các bản sao không được đặt trên cùng một nút với các phân đoạn gốc (được gọi là phân đoạn “chính”) mà từ đó chúng được sao chép. Ví dụ: Shard 1 có thể chia sẻ Node A với Replica Shard 2, trong khi Node B lưu trữ Shard 2 và Replica Shard 1. Trong trường hợp sử dụng thực sự, sẽ có thêm một số phân đoạn.

Giống như với các phân đoạn, số lượng bản sao có thể được xác định trên mỗi index khi index được tạo. Tuy nhiên, không giống như các phân đoạn, bạn có thể thay đổi số lượng bản sao bất cứ lúc nào sau khi index được tạo.

Nói cách khác, bạn có thể có nhiều bản sao cho mỗi phân đoạn, nhưng cần phải cân bằng giữa việc có quá ít và quá nhiều phân đoạn. Nhiều phân đoạn hơn dẫn đến việc sử dụng nhiều tài nguyên và chi phí hơn, cũng như có thể ảnh hưởng đến hiệu suất và tốc độ.

8. Analyzer

Trình phân tích (Analyzer) được sử dụng trong quá trình lập chỉ mục để chia nhỏ – hoặc phân tích cú pháp – các cụm từ và biểu thức thành các thuật ngữ cấu thành của chúng.

Được xác định trong một index, một trình phân tích bao gồm một tokenizer đơn lẻ và bất kỳ số lượng token filter nào. Ví dụ: một tokenizer có thể chia một chuỗi thành các thuật ngữ được xác định cụ thể khi gặp một biểu thức cụ thể.

Các trình phân tích phổ biến nhất bao gồm Trình phân tích chuẩn (Standard Analyzer) và Trình phân tích đơn giản (Simple Analyzer), cũng như một số trình phân tích theo ngôn ngữ cụ thể.

Theo mặc định, Elasticsearch sẽ áp dụng Trình phân tích chuẩn, có chứa trình phân tích dựa trên ngữ pháp để loại bỏ các từ tiếng Anh thông dụng và áp dụng các bộ lọc bổ sung. Elasticsearch cũng đi kèm với một số tokenizer tích hợp sẵn và bạn cũng có thể sử dụng tokenizer tùy chỉnh.

Token filter được sử dụng để lọc hoặc sửa đổi một số token. Ví dụ, một bộ lọc ASCII sẽ chuyển đổi các ký tự như ê, é, è thành e.

Ví dụ:

curl -XPUT localhost:9200/example -d '{
  "mappings": {
    "mytype": {
      "properties": {
        "name": {
          "type": "string",
          "analyzer": "whitespace"
        }
      }
    }
  }
}'

9. Instance và Node

Trung tâm của bất kỳ thiết lập ELK nào là phiên bản (instance) Elasticsearch, có nhiệm vụ quan trọng là lưu trữ và lập chỉ mục dữ liệu.

Trong một cụm (cluster), các trách nhiệm khác nhau được chỉ định cho các loại nút (node) khác nhau:

  • Data node – lưu trữ dữ liệu và thực hiện các hoạt động liên quan đến dữ liệu như tìm kiếm và tổng hợp.
  • Master node – phụ trách các hành động cấu hình và quản lý toàn cụm như thêm và xóa các nút.
  • Client node – chuyển tiếp các yêu cầu cụm đến master node và các yêu cầu liên quan đến dữ liệu đến các data node.
  • Tribe node – hoạt động như một client node, thực hiện các thao tác đọc và ghi đối với tất cả các nút trong cụm.
  • Ingestion node (đây là tính năng mới trong Elasticsearch 5.0) – để xử lý tài liệu trước khi lập chỉ mục.
  • Machine Learning node (Giấy phép Cơ bản) – Đây là các nút có sẵn theo Giấy phép Cơ bản của Elastic cho phép các tác vụ học máy. Các nút học máy có xpack.ml.enablednode.ml được đặt thành true.

Theo mặc định, mỗi nút được tự động gán một id hoặc tên duy nhất – được sử dụng cho mục đích quản lý và thậm chí còn trở nên quan trọng hơn trong môi trường nhiều nút hoặc cụm.

Theo mặc định, tất cả các nút cũng có khả năng trở thành master node, data node, ingest node hoặc machine learning node. Bạn nên phân biệt từng nút theo một loại duy nhất, đặc biệt là khi các cụm phát triển lớn hơn.

Khi được cài đặt, một nút duy nhất sẽ tạo thành một cụm nút đơn mới có tên “elasticsearch”, nhưng nó cũng có thể được cấu hình để tham gia một cụm hiện có (xem bên dưới) bằng cách sử dụng tên cụm. Không cần phải nói, các nút này cần phải có khả năng xác định nhau để có thể kết nối.

Trong môi trường phát triển hoặc thử nghiệm, bạn có thể thiết lập nhiều nút trên một máy chủ. Tuy nhiên, trong môi trường sản xuất (production), do số lượng tài nguyên mà một nút Elasticsearch sử dụng, bạn nên chạy mỗi phiên bản Elasticsearch trên một máy chủ riêng biệt.

10. Cluster

Một cụm (cluster) Elasticsearch bao gồm một hoặc nhiều nút Elasticsearch. Như với các nút, mỗi cụm có một id duy nhất phải được sử dụng bởi bất kỳ nút nào đang cố gắng tham gia vào cụm.

Theo mặc định, tên cụm là “elasticsearch”, nhưng tên này có thể (và nên) được thay đổi. Đảm bảo không sử dụng cùng một tên cho cụm trong các môi trường khác nhau, nếu không các nút có thể được gom nhóm sai cụm.

Một nút trong cụm là master node, chịu trách nhiệm quản lý toàn bộ cụm và các hành động cấu hình (chẳng hạn như thêm và xóa các nút). Nút này được chọn tự động bởi cụm, nhưng nó có thể được thay đổi nếu nó không thành công. (Xem ở trên về các loại nút khác trong một cụm.)

Bất kỳ nút nào trong cụm đều có thể được truy vấn, bao gồm cả master node. Nhưng các nút cũng chuyển tiếp các truy vấn tới nút chứa dữ liệu đang được truy vấn.

Khi một cụm phát triển, nó sẽ tự tổ chức lại để lan truyền dữ liệu. Mặc dù các cụm được thiết kế để lưu trữ nhiều nút, bạn chỉ có thể chỉ định nút cho một cụm nếu muốn.

Có một số Cluster API hữu ích có thể truy vấn trạng thái chung của cụm.

Ví dụ: API Health trả về báo cáo tình trạng sức khỏe của cụm.

  • green – tất cả các phân đoạn được phân bổ.
  • yellow – phân đoạn chính được phân bổ nhưng các bản sao thì không.
  • red – phân đoạn không được phân bổ trong cụm.

Đọc thêm về API cụm tại đây.

{
  "cluster_name" : "elasticsearch",
  "status" : "yellow",
  "timed_out" : false,
  "number_of_nodes" : 1,
  "number_of_data_nodes" : 1,
  "active_primary_shards" : 5,
  "active_shards" : 5,
  "relocating_shards" : 0,
  "initializing_shards" : 0,
  "unassigned_shards" : 5,
  "delayed_unassigned_shards" : 0,
  "number_of_pending_tasks" : 0,
  "number_of_in_flight_fetch" : 0,
  "task_max_waiting_in_queue_millis" : 0,
  "active_shards_percent_as_number" : 50.0
}

Lưu ý cuối cùng

Đây là những khái niệm chính bạn nên hiểu khi bắt đầu với ELK, nhưng cũng có những thành phần và thuật ngữ khác. Chúng tôi không thể bao gồm tất cả chúng, vì vậy tôi khuyên bạn nên tham khảo Elastic để biết thêm thông tin.

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 *