12/08/2018, 17:11

10 Elasticsearch Concepts You Need to Learn

Làm quen với ELK là một trong những điều đầu tiên mà bạn phải làm khi bắt đầu với stack. Cũng giống như với bất kỳ ngôn ngữ nào khác, sẽ có một số nội dung cơ bản mà chúng ta cần nhớ để quá trình học trở nên dễ dàng hơn. Mình đã tập hợp 10 khái niệm quan trọng nhất mà có thể bạn sẽ hứng thú. ...

Làm quen với ELK là một trong những điều đầu tiên mà bạn phải làm khi bắt đầu với stack. Cũng giống như với bất kỳ ngôn ngữ nào khác, sẽ có một số nội dung cơ bản mà chúng ta cần nhớ để quá trình học trở nên dễ dàng hơn.

Mình đã tập hợp 10 khái niệm quan trọng nhất mà có thể bạn sẽ hứng thú. Trong khi các khái niệm áp dụng cho Elasticsearch theo một cách cụ thể, thì chúng cũng rất quan trọng để hiểu cách nó vận hành stack như một tập hợp. Khi có thể - và để làm cho nó dễ hiểu hơn - chúng ta sẽ so sánh các khái niệm với các thuật ngữ song song trong hệ cơ sở dữ liệu quan hệ.

1. Fields

Fields là đơn vị dữ liệu nhỏ nhất trong Elasticsearch. Mỗi field có một type xác định và chứa một mẩu dữ liệu duy nhất có thể là, ví dụ như một biểu thức boolean, string hoặc array. Một tập các field lại với nhau là Elasticsearch document.

Bắt đầu với phiên bản Elasticsearch 2.X, tên field không thể bắt đầu bằng ký tự đặc biệt và không thể chứa dấu chấm.

2. Documents

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

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

Dữ liệu trong documents được định nghĩa bằng các field bao gồm các keys và value. Key chính là tên của trường và value có thể là một đối tượng trong các types khác nhau như string, number, biểu thức boolean, đối tượng khác hoặc array.

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

  • _index - index nơi documents cư trú
  • _type - loại mà documents biểu diễn
  • _id - định danh duy nhất cho documents

1 ví dụ về documents

{
   "_id": 3,
   “_type”: [“user”],
   "age": 28,
   "name": ["daniel”],
   "year":1989, 
}

3. Types

Elasticsearch Types được sử dụng trong các documens để phân chia các loại dữ liệu tương tự nhau trong đó mỗi loại đại diện cho một loại tài liệu duy nhất. Các loại bao gồm name và mapping (xem bên dưới) và được sử dụng bằng cách thêm trường _type. Type này sau đó có thể được sử dụng để lọc khi truy vấn một loại cụ thể.

Một index có thể có nhiều types, và bạn có thể lưu các documents thuộc các loại này vào cùng một index.

4. Mapping

Giống như một lược đồ trong cơ sở dữ liệu quan hệ, mapping xác định các types khác nhau nằm trong một index. Nó xác định các fields cho các documents của một type cụ thể - kiểu dữ liệu (chẳng hạn như string và integer) và cách các fields nên được lập index và lưu trữ trong Elasticsearch.

Một mapping có thể được xác định rõ ràng hoặc tạo ra tự động khi một document được lập index bằng cách sử dụng các templates. (Templates bao gồm settings và mapping có thể được áp dụng tự động cho một index mới.)

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

5. Index

Index, đơn vị dữ liệu lớn nhất trong Elasticsearch, là các phân vùng hợp lý của các documents và có thể được so sánh với cơ sở dữ liệu trong các 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 ta, bạn có thể có một index chứa tất cả dữ liệu có liên quan đến products và các products khác cùng với tất cả dữ liệu có liên quan đến customers.

Bạn có thể có nhiều index được xác định trong Elasticsearch như bạn muốn. Điều này lần lượt sẽ giữ các documents là duy nhất cho mỗi index.

Các index được xác định bằng các tên thường đề cập đến các hành động được thực hiện (như tìm kiếm và xóa) dựa vào các documents nằm trong mỗi index.

6. Shards

Đặt đơn giản,shards là một Lucene index. Chúng là những khối xây dựng của Elasticsearch và tạo điều kiện cho khả năng mở rộng.

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

Một cách để chống lại vấn đề này là phân chia các index theo chiều ngang thành các mảnh được gọi là shards. Điều này cho phép bạn phân phối các hoạt động trên các mảnh và 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 có bao nhiêu shards mà bạn muốn. Mỗi shard là một Lucene index độc lập có thể được lưu trữ ở bất cứ đâu trong cluster của bạn:

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

7. Replicas

Các replicas, như tên của nó, là các cơ chế không an toàn của Elasticsearch và về cơ bản là các bản sao của các index’s shards. Đây là một hệ thống sao lưu hữu ích cho một ngày mưa - hay nói cách khác, khi một nút gặp sự cố. Các replicas cũng phục vụ yêu cầu đọc, vì vậy việc thêm replicas có thể giúp tăng hiệu suất tìm kiếm.

Để đảm bảo tính sẵn sàng cao, các replicas không được đặt trên cùng một nút như các shards ban đầu (được gọi là primary shard) mà từ đó chúng được sao chép lại.

Giống như các shards, số lượng các replicas có thể được định nghĩa cho mỗi index khi index được tạo ra. Không giống như các shards, tuy nhiên, bạn có thể thay đổi số lượng relicas bất cứ lúc nào sau khi index được tạo ra.

Xem ví dụ trong phần "shards" ở trên.

8. Analyzers

Analyzers được sử dụng trong quá trình lập index để phân chia các cụm từ hoặc biểu thức thành các thuật ngữ. Được xác định trong một index, một Analyzers bao gồm một tokenizer đơn và bất kỳ số lượng các bộ lọc token. 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ể.

Theo mặc định, Elasticsearch sẽ áp dụng bộ phân tích "chuẩn", chứa một grammar-based tokenizer để loại bỏ các từ tiếng Anh phổ biến và áp dụng các bộ lọc bổ sung. Elasticsearch đi kèm với một loạt các tokenizers được tích hợp sẵn, và bạn cũng có thể sử dụng một tokenizer tùy chỉnh.

Bộ lọc mã thông báo được sử dụng để lọc hoặc sửa đổi một số mã thông báo. Ví dụ: bộ lọc gấp ASCII sẽ chuyển đổi các ký tự như ê, é, è thành e.

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

9. Nodes

Trái tim của bất kỳ thiết lập ELK nào, là Elasticsearch instance, có nhiệm vụ quan trọng trong việc lưu trữ và lập chỉ mục dữ liệu.

Trong một cluster, các trách nhiệm khác nhau được gán cho các nodes khác nhau:

  • Data nodes - 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ập hợp.
  • Master nodes - phụ trách quản lý nhóm và các hành động cấu hình như thêm và gỡ bỏ các nút.
  • Client nodes - chuyển tiếp yêu cầu cluster đến master node và các yêu cầu liên quan đến dữ liệu đến các nodes dữ liệu.
  • Tribe nodes - hoạt động như một client node, thực hiện các thao tác đọc và ghi với tất cả các nodes trong cluster.
  • Ingestion nodes - cho các documents chuẩn bị trước khi lập index.

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

Khi được cài đặt, một node duy nhất sẽ tạo thành một cụm node đơn mới có tên elasticsearch, nhưng nó cũng có thể được cấu hình để kết hợp một cluster hiện có (xem bên dưới) sử dụng tên cluster. Không cần phải nói, các nodes này cần phải có khả năng xác định lẫn 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 nodes trên một máy chủ duy nhất. Tuy nhiên, trong sản xuất, do lượng tài nguyên mà Elasticsearch node tiêu thụ. bạn nên để mỗi cá thể Elasticsearch chạy trên một máy chủ riêng biệt.

10. Cluster

Elasticsearch cluster bao gồm một hoặc nhiều Elasticsearch node. Giống như các nodes, mỗi cluster có một định danh duy nhất phải được sử dụng bởi bất kỳ nodes nào cố gắng tham gia cluster. Theo mặc định, tên cluster là elasticsearch, nhưng tên này có thể được thay đổi, tất nhiên.

Một node trong cluster là master node, nó phụ trách các hành động quản lý và cấu hình cluster (như thêm và gỡ bỏ các node). Node này được chọn tự động bởi cluster, nhưng nó có thể được thay đổi nếu nó không thành công.

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

Khi một cluster phát triển, nó sẽ tự tổ chức lại để truyền bá dữ liệu.

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

Ví dụ: API cluster health API hiển thị báo cáo trạng thái sức khoẻ của "green" (tất cả các shards được phân bổ), "yellow" (primary shard được phân bổ nhưng replicas thì không), hoặc "red" (shard không được phân bổ trong cluster). Thông tin thêm về các API nhóm là ở đây.

# Output Example
{
  "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
}

A Final Note

Đâ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ó các thành phần và thuật ngữ khác. Mình không thể cover tất cả, vì vậy bạn nên tham khảo Elasticsearch để biết thêm thông tin.

Source

https://logz.io/blog/10-elasticsearch-concepts/

0