Backup và Restore Elasticsearch snapshot với AWS S3 trong Kubernetes

Tram Ho

Ở công ty mình vừa có mấy task devops liên quan đến scaling, clustering Elasticsearch nên viết lại đề phòng sau này cần dùng. Có một task là chuyển dữ liệu từ single-node Elasticsearch cũ lên cluster mới. Single-node Elasticsearch cũ nằm trên một máy chủ ảo (VM) riêng và deploy bằng docker-compose. Cluster Elasticsearch mới thì được deploy với Helm trong Kubernetes và trên một cụm VM khác.

Có một cách tương đối đơn giản để thực hiện việc này đó là tạo snapshot backup trên single-node cũ và restore snapshot đó trên cluster mới. Sau một hồi google thì mình cũng đã chốt lại được các bước cơ bản sử dụng Kibana:

  1. Cài đặt plugin repository-s3
  2. Cấu hình AWS S3 credentials cho Elasticsearch
  3. Register một repository với type S3 trên single-node Elasticsearch cũ
  4. Tạo snapshot policy để tự động hóa việc chụp snapshot và đẩy lên S3 bucket từ Elasticsearch cũ
  5. Register một repository tương tự trên cluster Elasticsearch mới và restore snapshot

Sau đây chúng ta đi vào chi tiết.

1. Cài đặt plugin repository-s3 cho Elasticsearch

1.1. Rebuild Elasticsearch docker image

Việc cài đặt và kích hoạt plugin đòi hỏi phải khởi động lại cluster Elasticsearch. Do đó, ta không thể cài đặt trực tiếp mà cần phải chỉnh sửa Elasticsearch image. Cụ thể là cần viết một Dockerfile mới để build một image mới từ image elasticsearch mặc định:

Gõ lệnh build image như sau:

Nếu quá trình build image diễn ra tốt đẹp thì ta có thể thấy output như sau:

Sau khi build image thành công thì push image đó lên đâu đó mà Kubernetes cluster của bạn có thể kéo về được, VD: docker hub, AWS ECR… Nếu bạn đẩy image lên một private registry thì cần chú ý cấu hình imagePullSecrets.

1.2. Deploy lại single-node Elasticsearch cũ với image vừa tạo

Thường thì Elasticsearch cũ sẽ khởi chạy lại thành công, nếu phát sinh lỗi gì thì xem log rồi cố gắng google xem vì sao… lol…

2. Cấu hình AWS S3 credentials

Để thực hiện bước này thì cần phải docker exec (chui) vào trong container của Elasticsearch cũ và gõ:

2 lệnh trên sẽ yêu cầu bạn nhập (prompt) thông tin nhưng khi nhập sẽ không nhìn thấy gì đâu, cứ copy paste rồi enter. Đại loại bạn sẽ nhìn thấy màn hình hiển thị như sau:

Để có access_keysecret_key từ một IAM user có quyền đọc ghi S3 bucket, truy cập AWS IAM Users > chọn user có quyền trên dịch vụ S3 > Security credentials > Create access key. Nhập credentials xong thì khởi động lại single-node Elasticsearch. Sau khi khởi động lại thành công thì mở Kibana Dev Tools để reload_secure_settings:

3. Register một repository với type S3

3.1. Nhập tên và chọn kiểu là S3 –> nhấn Next

nhap-ten

3.2. Nhập tên bucket –> nhấn Register

Bucket cần được khởi tạo trước trên AWS S3 console.
nhap-ten-bucket

3.3. (optional) Verify repo

Sau khi register thành công, màn hình sẽ hiển thị thông tin repo vừa được tạo. Bạn sẽ nhìn thấy nút “Verify repository” ở panel chi tiết phía bên phải, sau khi nhấn nút này thì Kibana sẽ hiển thị “Verification status” là connected.
verify-repo
Nếu status là “Not connected” thì thông tin lỗi cũng sẽ được hiển thị trong mục Details.

4. Tạo Policy để tự động hóa tạo và xóa snapshot

Ta chỉ cần chuyển sang tab policy, nằm ngay bên cạnh repository. Nhấn “Create a policy”.
tao-policy

Các bước tạo policy khá đơn giản và trực quan trên giao diện của Kibana. Bạn có thể tham khảo tài liệu chính hãng tại đây: https://www.elastic.co/guide/en/kibana/current/snapshot-repositories.html#kib-snapshot-policy.
tao-policy-simple

5. Restore snapshot trên cluster Elasticsearch mới

5.1. Lặp lại các bước từ 1.2 đến 3.3 với cluster Elasticsearch mới

Trong scope của bài viết này thì ta chỉ cần restore snapshot trên cluster mới nên không cần tạo policy để backup.

5.2. Restore snapshot

Vào tab Snapshots, chọn snapshot mới nhất và nhấn Restore.
restore-snapshot

Sau khi quá trình restore bắt đầu thì bạn có thể theo dõi trạng thái tại tab “Restore Status”.
restore-status

Thế là xong rồi. Cảm ơn bạn đã đọc đến đây!

Chia sẻ bài viết ngay

Nguồn bài viết : Viblo