làm thế nào để đổi tên một chỉ mục trong một cụm?


110

Tôi cần đổi tên một số chỉ mục trong một cụm (tên của chúng phải được thay đổi, tôi không thể sử dụng bí danh ).

Tôi thấy rằng không có cách nào được hỗ trợ để làm điều đó, cách gần nhất tôi tìm thấy là đổi tên thư mục của chỉ mục , tôi đã thử điều này trong một cụm.

Cụm có 3 máy A, BCvà các mảnh vỡ được nhân rộng trên mỗi trong số họ. Tôi tắt tính năng tìm kiếm trên đàn hồi A, đã đổi tên/var/lib/elasticsearch/security/nodes/0/indices/oldindexname để /var/lib/elasticsearch/security/nodes/0/indices/newindexnamevà khởi động lại A.

Trạng thái của cụm là màu vàng và tìm kiếm đàn hồi đang thực hiện một số phép thuật để khôi phục lại trạng thái chính xác. Sau một thời gian, tôi đã kết thúc với

  • oldindexname có sẵn và được sao chép đầy đủ (phục hồi từ BCtôi đoán vậy)
  • newindexname đang có sẵn (tôi có thể tìm kiếm nó) nhưng plugin head cho thấy rằng các phân đoạn của nó ở trạng thái "Chưa được chỉ định" và chúng chuyển sang màu xám (không được sao chép)

Trong quá trình khôi phục, security.loghiển thị thông báo sau:

[2015-02-20 11:02:33,461][INFO ][gateway.local.state.meta ] [A.example.com] dangled index directory name is [newindexname], state name is [oldindexname], renaming to directory name

Trong khi newindexname có thể tìm kiếm được, nhưng nó chắc chắn không ở trạng thái bình thường.

Tôi đã quay trở lại trạng thái trước đó bằng cách xóa newindexname . Cụm trở lại màu xanh lục mà không có bất kỳ mục "Chưa được chỉ định" nào.

Do đó, làm cách nào để tôi có thể đổi tên oldindexnamethànhnewindexname trong một cụm?

Lưu ý: giải pháp cuối cùng tôi nghĩ đến là cuộn-sao chép oldindexvào newindexvà xóa oldindexsau đó. Điều này sẽ mất thời gian nên nếu có một giải pháp trực tiếp hơn thì sẽ rất tuyệt.

Câu trả lời:


19

Bắt đầu với ElasticSearch 7.4, phương pháp tốt nhất để đổi tên chỉ mục là sao chép chỉ mục bằng cách sử dụng API chỉ mục nhân bản mới được giới thiệu , sau đó xóa chỉ mục gốc bằng cách sử dụng API xóa chỉ mục .

Ưu điểm chính của API chỉ mục nhân bản so với việc sử dụng API ảnh chụp nhanh hoặc API lập chỉ mục cho cùng mục đích là tốc độ, vì API chỉ mục nhân bản liên kết các phân đoạn từ chỉ mục nguồn đến chỉ mục đích mà không cần xử lý lại bất kỳ nội dung nào của nó (trên rõ ràng là hệ thống tệp hỗ trợ liên kết cứng; mặt khác, tệp được sao chép ở cấp hệ thống tệp, vẫn hiệu quả hơn nhiều so với các lựa chọn thay thế). Clone Index cũng đảm bảo rằng chỉ mục đích giống hệt nhau ở mọi điểm đối với chỉ mục nguồn (nghĩa là không cần sao chép các cài đặt và ánh xạ theo cách thủ công, trái với cách tiếp cận Reindex) và không yêu cầu cấu hình thư mục ảnh chụp nhanh cục bộ .

Lưu ý phụ: mặc dù quy trình này nhanh hơn nhiều so với các giải pháp trước đó, nhưng nó vẫn có nghĩa là thời gian giảm. Có những trường hợp sử dụng thực tế biện minh cho việc đổi tên chỉ số (ví dụ: như một bước trong quy trình công việc tách, thu nhỏ hoặc sao lưu), nhưng việc đổi tên chỉ số không nên là một phần của hoạt động hàng ngày. Nếu quy trình làm việc của bạn yêu cầu đổi tên chỉ mục thường xuyên, thì bạn nên cân nhắc sử dụng Bí danh chỉ mục để thay thế.

Đây là một ví dụ về một chuỗi hoàn chỉnh các hoạt động để đổi tên chỉ mục source_indexthành target_index. Nó có thể được thực thi bằng một số bảng điều khiển cụ thể của ElasticSearch, chẳng hạn như bảng điều khiển được tích hợp trong Kibana . Xem ý chính này để biết phiên bản thay thế của ví dụ này, sử dụng curlthay vì Bảng điều khiển tìm kiếm đàn hồi.

# Make sure the source index is actually open
POST /source_index/_open

# Put the source index in read-only mode
PUT /source_index/_settings
{
  "settings": {
    "index.blocks.write": "true"
  }
}

# Clone the source index to the target name, and set the target to read-write mode
POST /source_index/_clone/target_index
{
  "settings": {
    "index.blocks.write": null 
  }
}

# Wait until the target index is green;
# it should usually be fast (assuming your filesystem supports hard links).
GET /_cluster/health/target_index?wait_for_status=green&timeout=30s

# If it appears to be taking too much time for the cluster to get back to green,
# the following requests might help you identify eventual outstanding issues (if any)
GET /_cat/indices/target_index
GET /_cat/recovery/target_index
GET /_cluster/allocation/explain

# Delete the source index
DELETE /source_index

163

Bạn có thể sử dụng REINDEX để làm điều đó.

Reindex không cố gắng thiết lập chỉ mục đích. Nó không sao chép cài đặt của chỉ mục nguồn. Bạn nên thiết lập chỉ mục đích trước khi chạy hành động _reindex, bao gồm thiết lập ánh xạ, số phân đoạn, bản sao, v.v.

  1. Đầu tiên sao chép chỉ mục sang một tên mới
POST /_reindex
{
  "source": {
    "index": "twitter"
  },
  "dest": {
    "index": "new_twitter"
  }
}
  1. Bây giờ hãy xóa Chỉ mục
DELETE /twitter

Mặc dù điều này yêu cầu phải có không gian cho cả hai chỉ mục (tạm thời), điều này đơn giản và hoàn toàn trên máy chủ - vì vậy đây có vẻ là giải pháp tốt nhất cho đến nay (mặc dù tài liệu cảnh báo về trạng thái 'thử nghiệm'). Cảm ơn bạn.
WoJ

2
Điều này có hoạt động nếu ánh xạ có _source: {enabled: false}?
Harald

2
@Harald Không, _reindexsử dụng _sourcelàm dữ liệu tài liệu gốc.
Agop

6
Điều này sẽ không sao chép các bản đồ của twitterđể new_twitternhư xa như tôi biết.
Nick

3
Tôi đồng ý về giải pháp của _reindex, nhưng câu hỏi nên được thay đổi. Reindexing không chỉ đơn giản là đổi tên. Nó thậm chí có thể thay đổi cách dữ liệu được lập chỉ mục.
lucabelluccini

62

Để đổi tên chỉ mục của bạn, bạn có thể sử dụng mô-đun Elasticsearch Snapshot.

Trước tiên, bạn phải chụp nhanh chỉ mục của mình. Trong khi khôi phục nó, bạn có thể đổi tên chỉ mục của mình.

    POST /_snapshot/my_backup/snapshot_1/_restore
    {
     "indices": "jal",
     "ignore_unavailable": "true",
     "include_global_state": false,
     "rename_pattern": "jal",
     "rename_replacement": "jal1"
     }

rename_replacement: -Tên chỉ mục mới mà bạn muốn sao lưu dữ liệu của mình.


4
Holycrap, điều đó thật hữu ích. Cảm ơn bạn!
Chris Cogdon

1
Tốt hơn nhiều so với giải pháp được chấp nhận! Đây thực sự là một bản sao nhị phân của chỉ mục, vì vậy không có nguy cơ bị mất bất cứ thứ gì và không yêu cầu _sourcephải được bật trong chỉ mục. Tôi đã đổi tên một số chỉ số đa TB theo cách này mà không gặp vấn đề gì.
Áo khoác

2
@Jacket - Tôi rất vui khi biết rằng câu trả lời của tôi thực sự giúp ích cho bạn.
krishna kumar

1
Tôi đồng ý, nhiều giải pháp tốt hơn, không có vấn đề mất dữ liệu, FASTER nhiều càng tốt cho chỉ số lớn hơn reindexing
Romain hautefeuille

1
nó có giữ lại ánh xạ không?
Amogh Mishra

5

Vì vậy, không có phương pháp trực tiếp nào để sao chép hoặc đổi tên chỉ mục trong ES (tôi đã tìm kiếm rộng rãi cho dự án của riêng mình)

Tuy nhiên, một lựa chọn rất dễ dàng là sử dụng một công cụ di chuyển phổ biến [Elastic-Exporter].

http://www.retailmenot.com/corp/eng/posts/2014/12/02/elasticsearch-cluster-migration/

[Tái bút: đây không phải là blog của tôi, chỉ tình cờ xem và thấy hay]

Qua đó bạn có thể sao chép chỉ mục / loại và sau đó xóa cái cũ.


Liên kết không hoạt động nữa. Bất kỳ nơi nào khác mà chúng tôi có thể tìm thấy nó hoặc có thông tin này?
elachell

5

Nếu bạn không thể REINDEX, giải pháp thay thế là sử dụng bí danh . Từ tài liệu chính thức :

Các API trongasticsearch chấp nhận một tên chỉ mục khi làm việc với một chỉ mục cụ thể và một số chỉ số khi có thể áp dụng. API bí danh chỉ mục cho phép đặt bí danh cho một chỉ mục có tên, với tất cả các API sẽ tự động chuyển đổi tên bí danh thành tên chỉ mục thực tế. Một bí danh cũng có thể được ánh xạ tới nhiều chỉ mục và khi chỉ định nó, bí danh đó sẽ tự động mở rộng thành các chỉ số bí danh. Bí danh cũng có thể được liên kết với một bộ lọc sẽ tự động được áp dụng khi tìm kiếm và định tuyến các giá trị. Bí danh không được trùng tên với chỉ mục.

Lưu ý rằng giải pháp này không hoạt động nếu bạn đang sử dụng tính năng Thêm Thích này. https://github.com/elastic/elasticsearch/issues/16560


1
I need to rename several indexes in a cluster (their name must be changed I cannot use aliases).Bởi @WoJ
Thales P

Bí danh lý do sẽ không hoạt động : Việc sử dụng alias đòi hỏi bạn phải lập kế hoạch trước và tạo tên chỉ mục ban đầu as an aliasthành một chỉ mục thực. Sau đó, bạn có thể tạo một tên bí danh mới và sử dụng lại tên bí danh cũ cho một thứ khác. Nhưng bạn mất quyền truy cập vào old_data nếu bạn chỉ có real_index, hãy tạo bí danh cho nó, xóa real_index cũ. Bí danh bây giờ chỉ ra không có gì.
Jesse Chisholm

@JesseChrisholm Tôi nghĩ rằng một người không thể có một "bí danh chỉ ra không có gì". Hãy thử xóa real_index, bạn sẽ thấy rằng bí danh "a alias to it" cũng sẽ bị xóa.
mgaert

5

Một cách khác để đổi tên hoặc thay đổi ánh xạ cho một chỉ mục là lập chỉ mục lại bằng logstash. Đây là một mẫu cấu hình logstash 2.1:

input {
  elasticsearch {
   hosts => ["es01.example.com", "es02.example.com"]
   index => "old-index-name"
   size => 500
   scroll => "5m"
  }
}
filter {

 mutate {
  remove_field => [ "@version" ]
 }

 date {
   "match" => [ "custom_timestamp", "MM/dd/YYYY HH:mm:ss" ]
   target => "@timestamp"
 }

}
output {
 elasticsearch {
   hosts => ["es01.example.com", "es02.example.com" ]
   manage_template => false
   index => "new-index-name"
 }
}

4
Vì vậy, bạn đang nói rằng cách tốt nhất để lập chỉ mục lại một chỉ mục Elasticsearch là cài đặt Logstash và sau đó sử dụng nó để lập chỉ mục? Có vẻ hơi quá mức cần thiết, đặc biệt nếu bạn không thực sự muốn / sử dụng Logstash ...
M. Justin

Vấn đề duy nhất trong câu trả lời là phần "The best". Tôi sẽ nói "Một cách khác". Ngoài ra, đó là một câu trả lời hay.
Robert


-5

Chỉ trong trường hợp ai đó vẫn cần nó. Cách thành công, không chính thức, để đổi tên các chỉ mục là:

  1. Đóng các chỉ mục cần được đổi tên
  2. Đổi tên các thư mục của chỉ mục trong tất cả các thư mục dữ liệu của nút chính và nút dữ liệu.
  3. Mở lại các chỉ mục cũ đã đóng (tôi sử dụng plugin kofp). Các chỉ mục cũ sẽ được mở lại nhưng vẫn chưa được gán. Các chỉ mục mới sẽ xuất hiện ở trạng thái đóng
  4. Mở lại các chỉ mục mới
  5. Xóa các chỉ mục cũ

Nếu bạn tình cờ gặp lỗi này "tên thư mục chỉ mục bị treo là", hãy xóa thư mục chỉ mục trong tất cả các nút chính (không phải nút dữ liệu) và khởi động lại một trong các nút dữ liệu.


2
Rất nản với Elastic. Đảm bảo có bản sao lưu nếu bạn làm như vậy.
lucabelluccini

Tôi không hiểu tên của chỉ mục xuất hiện ở đâu trong thư mục dữ liệu. Khi tôi nhìn vào / var / lib /asticsearch / node / 0 / indices /, tên của các thư mục được tạo ngẫu nhiên, như "1aS4RusHSYWLdt-Wx7NnBw" (Elasticsearch phiên bản 5.6.3)
Johan Boulé

1
@ JohanBoulé, phương pháp này không còn hợp lệ kể từ phiên bản 5 của Elasticsearch.
Anh Le

@lucabelluccini, đã đồng ý. Tốt hơn là cứ để nguyên và sử dụng bí danh.
Anh Lê
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.