Phân đoạn và bản sao trong Elaticsearch


303

Tôi đang cố gắng hiểu shard và bản sao là gì trong Elaticsearch, nhưng tôi đã không quản lý để hiểu nó. Nếu tôi tải xuống Elaticsearch và chạy tập lệnh, thì từ những gì tôi biết tôi đã bắt đầu một cụm với một nút duy nhất. Bây giờ nút này (PC của tôi) có 5 phân đoạn (?) Và một số bản sao (?).

Chúng là gì, tôi có 5 bản sao của chỉ mục không? Nếu vậy tại sao? Tôi có thể cần một số lời giải thích.


1
Có một cái nhìn ở đây: stackoverflow.com/questions/12409438/
Khăn

Nhưng câu hỏi vẫn chưa được trả lời.
LuckyLuke

Tôi nghĩ rằng câu trả lời bạn nhận được và câu trả lời được liên kết ở trên sẽ làm rõ mọi thứ. Có gì không rõ ràng?
javanna

Tôi không hiểu rõ những gì một mảnh vỡ và bản sao. Tôi không hiểu tại sao có nhiều phân đoạn và bản sao trên một nút.
LuckyLuke

1
Mỗi chỉ mục có thể được chia thành các mảnh để có thể phân phối dữ liệu. Phân đoạn là phần nguyên tử của một chỉ mục, có thể được phân phối trên cụm nếu bạn thêm nhiều nút.
javanna

Câu trả lời:


966

Tôi sẽ cố gắng giải thích bằng một ví dụ thực tế vì câu trả lời và câu trả lời bạn nhận được dường như không giúp ích gì cho bạn.

Khi bạn tải xuống elaticsearch và khởi động nó, bạn tạo một nút elaticsearch cố gắng tham gia một cụm hiện có nếu có hoặc tạo một nút mới. Giả sử bạn đã tạo cụm mới của riêng mình với một nút duy nhất, cụm mà bạn mới bắt đầu. Chúng tôi không có dữ liệu, do đó chúng tôi cần tạo một chỉ mục.

Khi bạn tạo một chỉ mục (một chỉ mục cũng được tạo tự động khi bạn lập chỉ mục cho tài liệu đầu tiên), bạn có thể xác định bao nhiêu phân đoạn sẽ được tạo thành. Nếu bạn không chỉ định một số, nó sẽ có số lượng phân đoạn mặc định: 5 nguyên tắc. Nó có nghĩa là gì?

Điều đó có nghĩa là elaticsearch sẽ tạo ra 5 phân đoạn chính sẽ chứa dữ liệu của bạn:

 ____    ____    ____    ____    ____
| 1  |  | 2  |  | 3  |  | 4  |  | 5  |
|____|  |____|  |____|  |____|  |____|

Mỗi khi bạn lập chỉ mục cho một tài liệu, elaticsearch sẽ quyết định phân đoạn chính nào được cho là giữ tài liệu đó và sẽ lập chỉ mục ở đó. Các phân đoạn chính không phải là bản sao của dữ liệu, chúng là dữ liệu! Có nhiều phân đoạn giúp tận dụng xử lý song song trên một máy, nhưng toàn bộ vấn đề là nếu chúng ta bắt đầu một trường hợp tìm kiếm khác trên cùng một cụm, các phân đoạn sẽ được phân phối theo cách đều trên cụm.

Nút 1 sau đó sẽ giữ ví dụ chỉ có ba phân đoạn:

 ____    ____    ____ 
| 1  |  | 2  |  | 3  |
|____|  |____|  |____|

Vì hai phân đoạn còn lại đã được chuyển đến nút mới bắt đầu:

 ____    ____
| 4  |  | 5  |
|____|  |____|

Lý do tại sao điều này xảy ra? Bởi vì elaticsearch là một công cụ tìm kiếm phân tán và theo cách này bạn có thể sử dụng nhiều nút / máy để quản lý lượng lớn dữ liệu.

Mỗi chỉ số tìm kiếm được bao gồm ít nhất một phân đoạn chính vì đó là nơi lưu trữ dữ liệu. Tuy nhiên, mọi phân đoạn đều có chi phí, do đó, nếu bạn có một nút duy nhất và không có sự tăng trưởng có thể thấy trước, chỉ cần gắn với một phân đoạn chính duy nhất.

Một loại shard khác là một bản sao. Mặc định là 1, có nghĩa là mọi phân đoạn chính sẽ được sao chép sang phân đoạn khác sẽ chứa cùng một dữ liệu. Bản sao được sử dụng để tăng hiệu suất tìm kiếm và cho sự cố. Một phân đoạn bản sao sẽ không bao giờ được phân bổ trên cùng một nút có chính là liên quan (nó sẽ giống như đặt một bản sao lưu trên cùng một đĩa với dữ liệu gốc).

Quay lại ví dụ của chúng tôi, với 1 bản sao, chúng tôi sẽ có toàn bộ chỉ mục trên mỗi nút, vì 2 phân đoạn sao chép sẽ được phân bổ trên nút đầu tiên và chúng sẽ chứa chính xác dữ liệu giống như các phân đoạn chính trên nút thứ hai:

 ____    ____    ____    ____    ____
| 1  |  | 2  |  | 3  |  | 4R |  | 5R |
|____|  |____|  |____|  |____|  |____|

Tương tự cho nút thứ hai, sẽ chứa một bản sao của các phân đoạn chính trên nút đầu tiên:

 ____    ____    ____    ____    ____
| 1R |  | 2R |  | 3R |  | 4  |  | 5  |
|____|  |____|  |____|  |____|  |____|

Với một thiết lập như thế này, nếu một nút bị hỏng, bạn vẫn có toàn bộ chỉ mục. Các bản sao sẽ tự động trở thành nguyên tắc và cụm sẽ hoạt động bình thường mặc dù lỗi nút, như sau:

 ____    ____    ____    ____    ____
| 1  |  | 2  |  | 3  |  | 4  |  | 5  |
|____|  |____|  |____|  |____|  |____|

Vì bạn có "number_of_replicas":1, các bản sao không thể được chỉ định nữa vì chúng không bao giờ được phân bổ trên cùng một nút nơi chính của chúng. Đó là lý do tại sao bạn sẽ có 5 phân đoạn chưa được gán, các bản sao và trạng thái cụm sẽ được YELLOWthay thế GREEN. Không mất dữ liệu, nhưng có thể tốt hơn vì một số phân đoạn không thể được chỉ định.

Ngay sau khi nút còn lại được sao lưu, nó sẽ tham gia lại cụm và các bản sao sẽ được chỉ định lại. Phân đoạn hiện có trên nút thứ hai có thể được tải nhưng chúng cần được đồng bộ hóa với các phân đoạn khác, vì các hoạt động ghi rất có thể đã xảy ra trong khi nút bị hỏng. Khi kết thúc thao tác này, trạng thái cụm sẽ trở thành GREEN.

Hy vọng điều này làm rõ mọi thứ cho bạn.


57
Giải thích tuyệt vời, cảm ơn vì đã dành thời gian của bạn để đặt nó lại với nhau! :)
LuckyLuke

6
Đó là lời giải thích tốt nhất về khái niệm shard / bản sao. Cảm ơn rất nhiều :)
Frank Förster

1
@javanna Giải thích tuyệt vời, có thể nói một chút về nhiều cụm và cách chúng hoạt động không?
raffian

3
Tôi có thể đề nghị giải thích thêm về những gì sẽ xảy ra khi nút bị hỏng trở lại không?
c0dem4g

1
Có phải bạn dạy không? Nếu bạn hoàn toàn nên. Bạn đá. Nhưng như @Animesh Pandey đã hỏi, tôi cũng tò mò muốn biết điều gì xảy ra với hai bản sao hoặc 1 bản sao với 3 nút.
frostymarvelous 14/07/2015

24

Một chỉ số được chia thành các mảnh để phân phối chúng và quy mô.

Bản sao là bản sao của các phân đoạn và cung cấp độ tin cậy nếu một nút bị mất. Con số này thường có sự nhầm lẫn bởi vì số lượng bản sao == 1 có nghĩa là cụm phải có bản sao chính và bản sao của phân đoạn có sẵn ở trạng thái màu xanh lá cây.

Để các bản sao được tạo, bạn phải có ít nhất 2 nút trong cụm của mình.

Bạn có thể tìm thấy các định nghĩa ở đây dễ hiểu hơn: http://www.elSTERearch.org/guide/reference/glossary/

Trân trọng, Paul


Đây là những gì mọi tài liệu nói - chỉ mục được chia thành các mảnh, nhưng chỉ số thực sự chứa gì?
Alex Pryiomka

@AlexPryiomka, Index chứa dữ liệu
Gaurav

Vì vậy, về cơ bản nó giống như sao chép phân vùng trong thế giới kafka?
beatrice

19

Nếu bạn thực sự không thích nhìn thấy nó màu vàng. bạn có thể đặt số lượng bản sao bằng 0:

curl -XPUT 'localhost:9200/_settings' -d '
{
    "index" : {
        "number_of_replicas" : 0
    }
}
'

Lưu ý rằng bạn chỉ nên làm điều này trên hộp phát triển cục bộ của bạn.


10

Phân đoạn:

  1. Là máy chủ tìm kiếm phân tán, ElasticSearchsử dụng khái niệm được gọi Shardđể phân phối tài liệu chỉ mục trên tất cả các nút.
  2. An indexcó khả năng lưu trữ một lượng lớn dữ liệu có thể vượt quá giới hạn phần cứng củasingle node
  3. Ví dụ: một chỉ mục của một tỷ tài liệu chiếm 1TB dung lượng ổ đĩa có thể không vừa với đĩa của một nút hoặc có thể quá chậm để phục vụ các yêu cầu tìm kiếm từ một nút duy nhất.
  4. Để giải quyết vấn đề này, Elasticsearchcung cấp khả năng chia nhỏ chỉ mục của bạn thành nhiều phần được gọi shards.
  5. Khi bạn tạo một chỉ mục, bạn có thể chỉ cần xác định số lượng shards mà bạn muốn.
  6. Documentsđược lưu trữ trong shardsvà phân đoạn được phân bổ nodestrongcluster
  7. Khi bạn clustertăng hoặc thu nhỏ, Elasticsearchsẽ tự động di chuyển các mảnh giữa nodesđể phần clustercòn lại cân bằng.
  8. Một mảnh vỡ có thể là một primary shardhoặc a replica shard.
  9. Mỗi tài liệu trong chỉ mục của bạn thuộc về một single primary shard, vì vậy số lượng phân đoạn chính mà bạn đã xác định lượng dữ liệu tối đa mà chỉ mục của bạn có thể chứa
  10. A replica shardchỉ là một bản sao của mảnh vỡ chính.

Bản sao:

  1. Replica shardlà bản sao của primary Shard, để ngăn ngừa mất dữ liệu trong trường hợp lỗi phần cứng.
  2. Elasticsearchcho phép bạn tạo một hoặc nhiều bản sao của phân đoạn chỉ mục của bạn thành cái được gọi là phân đoạn bản sao hoặc replicasviết tắt.
  3. An indexcũng có thể được sao chép bằng 0 (có nghĩa là không có bản sao) hoặc nhiều lần hơn.
  4. Các number of shardsbản sao và bản sao có thể được xác định cho mỗi chỉ mục tại thời điểm chỉ mục được tạo.
  5. Sau khi chỉ mục được tạo, bạn có thể thay đổi số lượng bản sao một cách linh hoạt bất cứ lúc nào nhưng cannot change the number of shards sau thực tế.
  6. Theo mặc định, mỗi chỉ mục Elasticsearchđược phân bổ 5 Phân đoạn chính và 1 replicađiều đó có nghĩa là nếu bạn có ít nhất hai nút trong cụm của mình, chỉ mục của bạn sẽ có 5 phân đoạn chính và 5 phân đoạn sao chép khác (1 bản sao hoàn chỉnh) cho tổng số 10 phân đoạn trên mỗi mục lục.

6

Một chỉ số được chia thành các mảnh để phân phối chúng và quy mô.

Bản sao là bản sao của các mảnh.

Một nút là một phiên bản đang chạy của tìm kiếm đàn hồi thuộc về một cụm.

Một cụm bao gồm một hoặc nhiều nút chia sẻ cùng một tên cụm. Mỗi cụm có một nút chủ duy nhất được chọn tự động bởi cụm và có thể được thay thế nếu nút chủ hiện tại không thành công.


Tôi có ba AWS ec2ví dụ, mỗi cái có cài đặt elaticsearch trên đó. Có nghĩa là chúng ta có ba nút ở đây? Nếu tất cả các nút này có cùng một cluster.name: testtập thuộc tính, nó sẽ tạo một tên Cụm testcó ba nút?
TheCoder

5

Tôi sẽ giải thích điều này bằng cách sử dụng một kịch bản từ thực sự. Hãy tưởng tượng bạn là một trang web thương mại điện tử. Khi bạn trở nên phổ biến hơn, nhiều người bán và sản phẩm thêm vào trang web của bạn. Bạn sẽ nhận ra số lượng sản phẩm bạn có thể cần lập chỉ mục đã tăng lên và nó quá lớn để phù hợp với một đĩa cứng của một nút. Ngay cả khi nó vừa với đĩa cứng, việc thực hiện tìm kiếm tuyến tính thông qua tất cả các tài liệu trong một máy là cực kỳ chậm. một chỉ mục trên một nút sẽ không tận dụng được cấu hình cụm phân tán mà trên đó công cụ tìm kiếm linh hoạt hoạt động.

Vì vậy, elaticsearch phân chia các tài liệu trong chỉ mục trên nhiều nút trong cụm. Mỗi phân chia tài liệu được gọi là phân đoạn. Mỗi nút mang phân đoạn của tài liệu sẽ chỉ có một tập hợp con của tài liệu. Giả sử bạn có 100 sản phẩm và 5 phân đoạn, mỗi phân đoạn sẽ có 20 sản phẩm. Việc bảo vệ dữ liệu này là những gì làm cho tìm kiếm độ trễ thấp có thể có trong elaticsearch. tìm kiếm được tiến hành song song trên nhiều nút. Kết quả được tổng hợp và trả lại. Tuy nhiên, các mảnh vỡ không cung cấp khả năng chịu lỗi. Có nghĩa là nếu bất kỳ nút nào chứa phân đoạn bị hỏng, sức khỏe của cụm sẽ chuyển sang màu vàng. Có nghĩa là một số dữ liệu không có sẵn.

Để tăng các bản sao khả năng chịu lỗi đi vào hình ảnh. Bằng cách tìm kiếm đàn hồi deault tạo ra một bản sao duy nhất của mỗi mảnh vỡ. Những bản sao này luôn được tạo trên một nút khác nơi phân đoạn chính không cư trú. Vì vậy, để làm cho hệ thống có khả năng chịu lỗi, bạn có thể phải tăng số lượng nút trong cụm của mình và nó cũng phụ thuộc vào số lượng phân đoạn của chỉ mục của bạn. Công thức chung để tính toán số lượng nút cần thiết dựa trên bản sao và phân đoạn là "số nút = số phân đoạn * (số lượng bản sao + 1)". Thực tiễn tiêu chuẩn là có ít nhất một bản sao để chịu lỗi.

Thiết lập số lượng phân đoạn là một hoạt động tĩnh, có nghĩa là bạn phải chỉ định nó khi bạn đang tạo một chỉ mục. Bất kỳ thay đổi nào sau woulf đó đều yêu cầu reindexing hoàn toàn dữ liệu và sẽ mất thời gian. Nhưng, thiết lập số lượng bản sao là một hoạt động năng động và có thể được thực hiện bất cứ lúc nào sau khi tạo chỉ mục.

bạn có thể thiết lập số lượng phân đoạn và bản sao cho chỉ mục của mình bằng lệnh bên dưới.

curl -XPUT 'localhost:9200/sampleindex?pretty' -H 'Content-Type: application/json' -d '
{
  "settings":{
    "number_of_shards":2,
    "number_of_replicas":1
  }
}'

3

Không phải là một câu trả lời mà là một tài liệu tham khảo khác cho các khái niệm cốt lõi cho ElasticSearch và tôi nghĩ rằng chúng khá rõ ràng như lời khen cho câu trả lời của @ javanna.

Mảnh vỡ

Một chỉ mục có khả năng lưu trữ một lượng lớn dữ liệu có thể vượt quá giới hạn phần cứng của một nút. Ví dụ: một chỉ mục của một tỷ tài liệu chiếm 1TB dung lượng ổ đĩa có thể không vừa với đĩa của một nút hoặc có thể quá chậm để phục vụ các yêu cầu tìm kiếm từ một nút duy nhất.

Để giải quyết vấn đề này, Elaticsearch cung cấp khả năng chia nhỏ chỉ mục của bạn thành nhiều phần được gọi là phân đoạn. Khi bạn tạo một chỉ mục, bạn có thể chỉ cần xác định số lượng phân đoạn mà bạn muốn. Mỗi phân đoạn tự nó là một "chỉ mục" độc lập và đầy đủ chức năng có thể được lưu trữ trên bất kỳ nút nào trong cụm.

Shending rất quan trọng vì hai lý do chính:

  • Nó cho phép bạn phân chia theo chiều ngang / chia tỷ lệ khối lượng nội dung của bạn.
  • Nó cho phép bạn phân phối và song song hóa các hoạt động trên các phân đoạn (có khả năng trên nhiều nút), do đó làm tăng hiệu suất / thông lượng .

Bản sao

Trong môi trường mạng / đám mây nơi có thể xảy ra lỗi bất kỳ lúc nào, rất hữu ích và rất nên có cơ chế chuyển đổi dự phòng trong trường hợp một phân đoạn / nút nào đó bị gián đoạn hoặc biến mất vì bất kỳ lý do gì. Để kết thúc này, Elaticsearch cho phép bạn tạo một hoặc nhiều bản sao các chỉ mục của bạn thành các phần được gọi là phân đoạn bản sao hoặc viết tắt là bản sao.

Nhân rộng là quan trọng vì hai lý do chính:

  • Nó cung cấp tính sẵn sàng cao trong trường hợp shard / nút bị lỗi. Vì lý do này, điều quan trọng cần lưu ý là phân đoạn bản sao không bao giờ được phân bổ trên cùng một nút với phân đoạn gốc / phân đoạn chính mà nó được sao chép từ đó.
  • Nó cho phép bạn mở rộng quy mô / thông lượng tìm kiếm của mình vì các tìm kiếm có thể được thực hiện song song trên tất cả các bản sao.

1

Trong ElasticSearch, ở cấp cao nhất, chúng tôi lập chỉ mục các tài liệu thành các chỉ mục. Mỗi chỉ mục có số lượng phân đoạn bên trong phân phối dữ liệu và bên trong phân đoạn tồn tại các phân đoạn Lucene là nơi lưu trữ cốt lõi của dữ liệu. Vì vậy, nếu chỉ mục có 5 phân đoạn, điều đó có nghĩa là dữ liệu đã được phân phối trên các phân đoạn và không có cùng dữ liệu tồn tại trong các phân đoạn.

Xem ra video giải thích cốt lõi của ES https://www.youtube.com/watch?v=PpX7J-G2PEo

Bài viết về nhiều chỉ số hoặc nhiều phân đoạn Tìm kiếm đàn hồi, nhiều chỉ mục so với một chỉ mục và loại cho các tập dữ liệu khác nhau?


1

Elaticsearch có khả năng mở rộng tuyệt vời với tất cả tín dụng dành cho kiến ​​trúc phân tán của nó. Nó được thực hiện có thể do Shending. Bây giờ, trước khi tiếp tục đi sâu vào nó, chúng ta hãy xem xét một trường hợp sử dụng đơn giản và rất phổ biến. Giả sử, bạn có một chỉ mục chứa rất nhiều tài liệu và để đơn giản, hãy xem xét rằng kích thước của chỉ mục đó là 1 TB (nghĩa là Tổng kích thước của mỗi và mọi tài liệu trong chỉ mục đó là 1 TB ). Ngoài ra, giả sử rằng bạn có hai Nút mỗi nút có dung lượng 512 GB để lưu trữ dữ liệu. Như có thể thấy rõ, toàn bộ chỉ mục của chúng tôi không thể được lưu trữ trong bất kỳ hai nút nào có sẵn và do đó chúng tôi cần phân phối chỉ mục của chúng tôi giữa các Nút này.

Trong trường hợp như thế này khi kích thước của một chỉ mục vượt quá giới hạn phần cứng của một nút, Shending sẽ giải cứu. Shending giải quyết vấn đề này bằng cách chia các chỉ số thành các phần nhỏ hơn và các phần này được đặt tên là Mảnh.


0

Theo cách hiểu đơn giản nhất, shardnó không là gì ngoài một phần của chỉ mục được lưu trữ trên đĩa trong một thư mục riêng biệt:

Phân đoạn Elaticsearch

Ảnh chụp màn hình này hiển thị toàn bộ thư mục Elaticsearch.

Như bạn có thể thấy, tất cả các dữ liệu đi vào datathư mục.

Bằng cách kiểm tra chỉ mục, C-mAfLltQzuas72iMiIXNwchúng ta thấy rằng nó có năm phân đoạn (thư mục 0đến 4).

Mặt khác, JH_A8PgCRj-GK0GeQ0limwchỉ mục chỉ có một phân đoạn ( 0thư mục).

Phân đoạn Elaticsearch

Các prilượt xem tổng số mảnh.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.