Cách backup MongoDB bằng cách sử dụng snapshots server
Backup database thường xuyên là một bước quan trọng trong việc bảo vệ chống lại các sự kiện mất dữ liệu ngoài ý muốn. Nói chung, có hai loại backup lớn: backup cấp hệ thống file (“vật lý”) và backup lôgic. Backup cấp hệ thống file liên quan đến việc chụp nhanh các file dữ liệu bên dưới tại một thời điểm và cho phép database tự khôi phục một cách rõ ràng bằng cách sử dụng trạng thái được chụp trong các file được chụp nhanh. Backup logic liên quan đến việc sử dụng một công cụ (ví dụ:mongodump
hoặc pg_dump
) để xuất dữ liệu từ database thành các file backup , sau đó được khôi phục bằng công cụ khôi phục tương ứng (ví dụ: mongorestore
hoặc psql <
). Trong hướng dẫn này, ta sẽ trình bày cách thực hiện backup cấp hệ thống file của bản cài đặt MongoDB đang chạy bằng cách sử dụng Ảnh chụp nhanh Server . Ngoài ra, ta sẽ trình bày cách thực hiện khôi phục từ hình ảnh chụp nhanh.
Lưu ý: Như đã nêu chi tiết trong hướng dẫn backup DigitalOcean, có một số tác động đến hiệu suất khi sử dụng ảnh chụp nhanh Server, đặc biệt là trên database được tải nhiều. Trước tiên, bạn nên kiểm tra quy trình này bằng cách sử dụng database phi production với tải mô phỏng để xác minh phương pháp này sẽ hoạt động trong quá trình triển khai production của bạn.
Yêu cầu
Trước khi bắt đầu với hướng dẫn này, hãy đảm bảo bạn đã hoàn thành các bước yêu cầu sau:
- Một server Ubuntu 16.04 với user không phải root có quyền sudo, như được nêu chi tiết trong Cài đặt server ban đầu với Ubuntu 16.04
- Đã cài đặt và cấu hình MongoDB, như chi tiết trong Cách cài đặt MongoDB trên Ubuntu 16.04
Hướng dẫn này sẽ giả sử bạn đã cài đặt MongoDB 3.2+, sử dụng công cụ lưu trữ WiredTiger mặc định có bật tính năng ghi log . Ngoài ra, để sử dụng hướng dẫn này, điều quan trọng là folder dbpath
(thư mục chứa các file dữ liệu, theo mặc định /var/lib/mongodb
) được ánh xạ tới một ổ đĩa duy nhất. Nếu bạn chưa đính kèm dung lượng lưu trữ khối bổ sung vào Server của bạn , bạn có thể làm theo hướng dẫn này.
Khi bạn đã đăng nhập vào Server của bạn và đã cài đặt và chạy MongoDB, bạn đã sẵn sàng bắt đầu.
Bước 1 - Xác minh cài đặt MongoDB của bạn
Đầu tiên ta sẽ kiểm tra xem tính năng ghi log đã được bật chưa.
Ghi log là một tính năng của MongoDB cung cấp độ bền trong trường hợp database bị lỗi bằng cách ghi các thao tác vào file log . Để tìm hiểu thêm về cách viết log trong MongoDB, hãy tham khảo Hướng dẫn sử dụng MongoDB .
Nếu bạn làm theo hướng dẫn trên, tính năng ghi log sẽ được bật theo mặc định. Để xác nhận đúng như vậy, ta có thể kiểm tra file cấu hình MongoDB.
Mở /etc/mongod.conf
bằng editor yêu thích của bạn, chẳng hạn như nano:
- nano /etc/mongod.conf
Bạn sẽ thấy khối sau:
- # Where and how to store data.
- storage:
- dbPath: /var/lib/mongodb
- journal:
- enabled: true
- # engine:
- # mmapv1:
- # wiredTiger:
Điều này cho thấy rằng tính năng ghi log đã được bật. Nếu bạn đang sử dụng MongoDB 3.2+, công cụ lưu trữ mặc định là WiredTiger (MMAPv1 là công cụ lưu trữ ban đầu của MongoDB).
Bây giờ ta sẽ chèn một số dữ liệu giả để kiểm tra quy trình backup và khôi phục.
Bước 2 - Chèn dữ liệu thử nghiệm
Nếu bạn đã bắt đầu với một server sạch và chưa có bất kỳ dữ liệu nào, ta có thể chèn một số dữ liệu mẫu vào bộ sưu tập nhà hàng giả cho mục đích demo . Nếu bạn đã có một số bộ sưu tập và tài liệu được lưu trữ trong database của bạn , vui lòng bỏ qua bước này.
Đầu tiên, kết nối với database đang chạy bằng cách sử dụng MongoDB shell:
- mongo
Bạn sẽ thấy dấu nhắc Mongo shell sau:
- MongoDB shell version: 3.2.19
- connecting to: test
- Server has startup warnings:
- 2018-02-16T02:40:13.071+0000 I CONTROL [initandlisten]
- 2018-02-16T02:40:13.071+0000 I CONTROL [initandlisten] ** WARNING: /sys/kernel/mm/transparent_hugepage/enabled is 'always'.
- 2018-02-16T02:40:13.071+0000 I CONTROL [initandlisten] ** We suggest setting it to 'never'
- 2018-02-16T02:40:13.071+0000 I CONTROL [initandlisten]
- 2018-02-16T02:40:13.071+0000 I CONTROL [initandlisten] ** WARNING: /sys/kernel/mm/transparent_hugepage/defrag is 'always'.
- 2018-02-16T02:40:13.071+0000 I CONTROL [initandlisten] ** We suggest setting it to 'never'
- 2018-02-16T02:40:13.071+0000 I CONTROL [initandlisten]
- >
Database mặc định mà shell sử dụng là database thử nghiệm .
Hãy liệt kê các bộ sưu tập có trong database thử nghiệm :
- show collections
Vì ta chưa chèn bất kỳ thứ gì vào database nên không có bộ sưu tập nào và ta được đưa trở lại dấu nhắc mà không có kết quả .
Hãy chèn một tài liệu vào bộ sưu tập nhà hàng giả, ta sẽ tạo cùng lúc:
- db.restaurants.insert({'name': 'Sammy's Pizzeria'})
Bạn sẽ thấy kết quả sau:
- WriteResult({ "nInserted" : 1 })
Điều này cho thấy rằng thao tác chèn đã thành công. Vì bộ sưu tập nhà hàng trước đây không tồn tại, nó đã được tạo ra cùng lúc.
Hãy liệt kê các bộ sưu tập :
- show collections
Bây giờ ta thấy bộ sưu tập nhà hàng mới được tạo của bạn :
- restaurants
Bây giờ ta đã lưu trữ một số dữ liệu mẫu trong database , ta đã sẵn sàng backup nó.
Bước 3 - Chụp nhanh server MongoDB
Để thực hiện backup , ta sẽ tận dụng Ảnh chụp nhanh server DigitalOcean. Ảnh chụp nhanh Server cho phép ta tạo hình ảnh của Server tại thời điểm bắt đầu chụp nhanh. Sau đó, hình ảnh này có thể được khôi phục thành Server mới, nơi các hoạt động khôi phục tiếp theo có thể diễn ra.
Vì ta đang sử dụng MongoDB 3.2+ (với WiredTiger và tính năng ghi log được bật), ta không cần phải tạm dừng ghi vào hệ thống file trong khi xảy ra ảnh chụp nhanh. Khi ta khôi phục hình ảnh và khởi động database , MongoDB sẽ tự khôi phục từ một trạm kiểm soát, sau đó phát lại các hoạt động từ các file log cho đến khi đạt đến thời điểm xảy ra ảnh chụp nhanh. Nếu bạn muốn khám phá thêm về cách viết log , hãy tham khảo Hướng dẫn sử dụng MongoDB ),
Để bắt đầu quá trình chụp nhanh, hãy đăng nhập vào account DigitalOcean của bạn , chuyển đến MongoDB Server và nhấp vào liên kết Ảnh chụp nhanh trong thanh bên.
Bạn sẽ thấy dấu nhắc sau:
Lưu ý: Mặc dù bạn nên tắt Server trước khi chụp nhanh, nhưng trong triển khai production , điều này có thể không phải lúc nào cũng khả thi. Tính năng ghi log của MongoDB cho phép các ảnh chụp nhanh nhất quán và hợp lệ, ngay cả khi database và Server đang chạy.
Đặt tên mô tả cho ảnh chụp nhanh của bạn và nhấp vào nút Chụp nhanh Trực tiếp để bắt đầu quá trình chụp nhanh.
Bạn sẽ thấy chỉ báo tiến trình chụp nhanh sau:
Sau khi hoàn tất quá trình chụp nhanh, bạn có thể tạo một Server mới từ hình ảnh hoặc khôi phục Server đang chạy về trạng thái được chụp trong hình ảnh chụp nhanh của bạn.
Bây giờ ta đã sẵn sàng thực hiện khôi phục và xác nhận quy trình backup .
Bước 4 - Khôi phục MongoDB Server
Bây giờ ta sẽ tạo một server mới sẽ được khôi phục từ hình ảnh ta vừa tạo. Dữ liệu có sẵn trong database MongoDB của ta sẽ giống như dữ liệu có sẵn tại thời điểm chụp nhanh được chụp.
Điều hướng trở lại Ảnh chụp nhanh bằng cách sử dụng thanh bên và tìm ảnh chụp nhanh Server hoàn chỉnh của bạn.
Nhấp vào Thêm và chọn Tạo server .
Bạn sẽ được đưa đến menu Create Server , nơi bạn có thể tạo ra một Server mới từ ảnh chụp nhanh của bạn .
Chọn hình ảnh tương ứng với ảnh bạn đã chụp trước đó. Trong trường hợp này, ta sẽ sử dụng hình ảnh mongo-backup-test .
Hoàn tất cấu hình Server khôi phục của bạn và nhấp vào Tạo . Sau khi Server khôi phục của bạn được cài đặt và chạy, hãy đăng nhập vào nó.
Nếu bạn đã cấu hình MongoDB để bắt đầu khi server khởi động Server, thì bây giờ nó sẽ chạy. Bạn có thể kiểm tra bằng cách sử dụng systemctl
:
- sudo systemctl status mongod
Bạn sẽ thấy kết quả sau:
Output● mongod.service - High-performance, schema-free document-oriented database Loaded: loaded (/lib/systemd/system/mongod.service; enabled; vendor preset: enabled) Active: active (running) since Wed 2018-02-14 21:14:40 UTC; 4min 53s ago Docs: https://docs.mongodb.org/manual Main PID: 1302 (mongod) Tasks: 19 Memory: 87.2M CPU: 1.802s CGroup: /system.slice/mongod.service └─1302 /usr/bin/mongod --quiet --config /etc/mongod.conf
Cho biết rằng tất cả đều ổn và MongoDB đã khởi động chính xác.
Nếu MongoDB không chạy, trước tiên ta cần xóa file khóa, sau đó khởi động dịch vụ:
- rm /var/lib/mongodb/mongod.lock
- sudo systemctl start mongod
Xác minh MongoDB đã khởi động chính xác bằng systemctl status
.
Khi MongoDB bắt đầu và đang chạy, nó sẽ bắt đầu tự dọn dẹp và khôi phục trạng thái của nó vào thời điểm xảy ra ảnh chụp nhanh. Quá trình này có thể mất vài phút và vỏ mongo
có thể không khả dụng cho đến khi quá trình này hoàn tất.
Khi server khả dụng, ta có thể đăng nhập bằng lệnh mongo
:
- mongo
Đến đây bạn sẽ nhận được dấu nhắc shell mongo:
OutputMongoDB shell version: 3.2.19 connecting to: test Server has startup warnings: 2018-02-14T21:14:41.923+0000 I CONTROL [initandlisten] 2018-02-14T21:14:41.923+0000 I CONTROL [initandlisten] ** WARNING: /sys/kernel/mm/transparent_hugepage/enabled is 'always'. 2018-02-14T21:14:41.923+0000 I CONTROL [initandlisten] ** We suggest setting it to 'never' 2018-02-14T21:14:41.923+0000 I CONTROL [initandlisten] 2018-02-14T21:14:41.923+0000 I CONTROL [initandlisten] ** WARNING: /sys/kernel/mm/transparent_hugepage/defrag is 'always'. 2018-02-14T21:14:41.923+0000 I CONTROL [initandlisten] ** We suggest setting it to 'never' 2018-02-14T21:14:41.923+0000 I CONTROL [initandlisten] >
Nếu bạn đã làm được đến thời điểm này, xin chúc mừng! Bạn đã thực hiện thành công backup và khôi phục database MongoDB của bạn .
Như một biện pháp phòng ngừa bổ sung, ta có thể kiểm tra tính toàn vẹn của các bộ sưu tập của bạn .
Bước 5 - Kiểm tra tính toàn vẹn của dữ liệu
Trước khi sử dụng production dữ liệu backup này, bạn nên kiểm tra các bộ sưu tập đã khôi phục để tìm các đối tượng BSON không hợp lệ.
Lưu ý: Lệnh validate
có thể chậm trên các bộ sưu tập rất lớn. Ngoài ra, tất cả các lần đọc và ghi sẽ bị chặn trên bộ sưu tập cho đến khi lệnh validate
trả về.
Trong ví dụ này, ta có một bộ sưu tập có tên là nhà hàng mà ta muốn chạy lệnh validate
.
Từ shell mongo, chạy lệnh xác thực:
- db.restaurants.validate({full:true})
Bạn sẽ thấy kết quả tương tự như sau:
- {
- "ns" : "test.restaurants",
- "nrecords" : 1,
- "nIndexes" : 1,
- "keysPerIndex" : {
- "test.restaurants.$_id_" : 1
- },
- "indexDetails" : {
- "test.restaurants.$_id_" : {
- "valid" : true
- }
- },
- "valid" : true,
- "errors" : [ ],
- "ok" : 1
- }
Nếu bạn thấy valid: true
, tất cả các khía cạnh của bộ sưu tập của bạn đều hợp lệ và bạn có thể sử dụng an toàn dữ liệu từ bộ sưu tập này trong quá trình production .
Kết luận
Trong hướng dẫn này, ta đã học cách hoàn thành backup cấp hệ thống file vật lý của server database MongoDB đang chạy.
Để tìm hiểu thêm về các phương pháp backup database MongoDB khác nhau, hãy tham khảo hướng dẫn sử dụng MongoDB .
Kỹ thuật backup cụ thể này được thực hiện nhờ tính năng Ảnh chụp nhanh server tiện lợi của DigitalOcean. Để tìm hiểu thêm về Ảnh chụp nhanh server , hãy tham khảo tài liệu Ảnh chụp nhanh .
Ngoài ra, bạn có thể lên lịch để các ảnh chụp nhanh này tự động diễn ra bằng cách sử dụng tính năng Backup . Để tìm hiểu thêm về Backup server , hãy tham khảo Giới thiệu về Bản backup .
Các tin liên quan