10 Elasticsearch Concepts You Need to Learn
Bài đăng này đã không được cập nhật trong 6 năm
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
đếnmaster node
và các yêu cầu liên quan đến dữ liệu đến cácnodes
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ácnodes
trongcluster
. - Ingestion nodes - cho các
documents
chuẩn bị trước khi lậpindex
.
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
All rights reserved