Thứ sáu, 15/04/2016 | 00:00 GMT+7

Cách sao lưu, khôi phục và di chuyển cơ sở dữ liệu MongoDB trên Ubuntu 14.04

MongoDB is one of the most popular NoSQL database engines. It is famous for being scalable, powerful, reliable and easy to use. In this article we'll show you how to back up, restore, and migrate your MongoDB databases.

MongoDB là một trong những công cụ database NoSQL phổ biến nhất. Nó nổi tiếng vì có khả năng mở rộng, mạnh mẽ, tin cậy và dễ sử dụng. Trong bài viết này, ta sẽ hướng dẫn bạn cách sao lưu, khôi phục và di chuyển database MongoDB của bạn.

Nhập và xuất database nghĩa là xử lý dữ liệu ở định dạng con người có thể đọc được, tương thích với các sản phẩm phần mềm khác. Ngược lại, các thao tác sao lưu và khôi phục tạo hoặc sử dụng dữ liệu binary dành riêng cho MongoDB, dữ liệu này không chỉ bảo toàn tính nhất quán và toàn vẹn của dữ liệu mà còn bảo tồn các thuộc tính MongoDB cụ thể của nó. Do đó, đối với việc di chuyển, thường ưu tiên sử dụng sao lưu và khôi phục miễn là hệ thống nguồn và hệ thống đích tương thích.

Yêu cầu

Trước khi làm theo hướng dẫn này, hãy đảm bảo bạn hoàn thành các yêu cầu sau:

Trừ khi có lưu ý khác, tất cả các lệnh yêu cầu quyền root trong hướng dẫn này phải được chạy với quyền user không phải root có quyền sudo.

Hiểu kiến thức cơ bản

Trước khi tiếp tục bài viết này, một số hiểu biết cơ bản về vấn đề này là cần thiết. Nếu bạn có kinh nghiệm với các hệ thống database quan hệ phổ biến như MySQL, bạn có thể tìm thấy một số điểm tương đồng khi làm việc với MongoDB.

Điều đầu tiên bạn nên biết là MongoDB sử dụng các định dạng json và bson (json binary ) để lưu trữ thông tin của nó. Json là định dạng con người có thể đọc được, hoàn hảo để xuất và cuối cùng là nhập dữ liệu . Bạn có thể quản lý thêm dữ liệu đã xuất của bạn bằng bất kỳ công cụ nào hỗ trợ json, bao gồm một editor đơn giản.

Một tài liệu json mẫu trông như thế này:

Ví dụ về Định dạng json
{"address":[
    {"building":"1007", "street":"Park Ave"},
    {"building":"1008", "street":"New Ave"},
]}

Json rất thuận tiện để làm việc, nhưng nó không hỗ trợ tất cả các kiểu dữ liệu có sẵn trong bson. Điều này nghĩa là sẽ có cái gọi là 'mất độ trung thực' của thông tin nếu bạn sử dụng json. Để sao lưu và khôi phục, tốt hơn là sử dụng bson binary .

Thứ hai, bạn không phải lo lắng về việc tạo database MongoDB một cách rõ ràng. Nếu database bạn chỉ định để nhập chưa tồn tại, nó sẽ tự động được tạo. Thậm chí tốt hơn là trường hợp với cấu trúc bộ sưu tập (bảng database ). Trái ngược với các công cụ database khác, trong MongoDB, cấu trúc lại được tạo tự động khi chèn tài liệu đầu tiên (hàng database ).

Thứ ba, trong MongoDB, việc đọc hoặc chèn một lượng lớn dữ liệu, chẳng hạn như cho các việc của bài viết này, có thể tốn nhiều tài nguyên và tiêu tốn nhiều dung lượng CPU, bộ nhớ và ổ đĩa. Đây là điều quan trọng khi xem xét rằng MongoDB thường được sử dụng cho database lớn và Dữ liệu lớn. Giải pháp đơn giản nhất cho vấn đề này là chạy xuất và sao lưu vào ban đêm hoặc trong giờ không phải cao điểm.

Thứ tư, tính nhất quán thông tin có thể có vấn đề nếu bạn có server MongoDB bận, nơi thông tin thay đổi trong quá trình xuất hoặc sao lưu database . Không có giải pháp đơn giản nào cho vấn đề này, nhưng ở cuối bài viết này, bạn sẽ thấy các khuyến nghị để đọc thêm về nhân rộng.

Mặc dù bạn có thể sử dụng các chức năng nhập và xuất để sao lưu và khôi phục dữ liệu của bạn , nhưng có nhiều cách tốt hơn đảm bảo tính toàn vẹn đầy đủ của database MongoDB của bạn. Để sao lưu dữ liệu , bạn nên sử dụng lệnh mongodump . Để khôi phục, hãy sử dụng mongorestore . Hãy xem chúng hoạt động như thế nào.

Sao lưu database MongoDB

Trước tiên, hãy đề cập đến việc sao lưu database MongoDB của bạn.

Đối số quan trọng đối với mongodump--db , chỉ định tên của database mà bạn muốn sao lưu. Nếu bạn không chỉ định tên database , mongodump sao lưu tất cả database của bạn. Đối số quan trọng thứ hai là --out chỉ định folder mà dữ liệu sẽ được kết xuất. Hãy lấy một ví dụ với việc sao lưu database newdb và lưu trữ nó trong folder /var/backups/mongobackups . Tốt nhất, ta sẽ có từng bản sao lưu của bạn trong một folder có ngày hiện tại như /var/backups/mongobackups/01-20-16 (20 tháng 1 năm 2016). Đầu tiên, hãy tạo folder /var/backups/mongobackups bằng lệnh:

  • sudo mkdir /var/backups/mongobackups

Sau đó, lệnh sao lưu của ta sẽ giống như sau:

  • sudo mongodump --db newdb --out /var/backups/mongobackups/`date +"%m-%d-%y"`

Một bản sao lưu được thực hiện thành công sẽ có một kết quả như:

Đầu ra của mongodump
2016-01-20T10:11:57.685-0500    writing newdb.restaurants to /var/backups/mongobackups/01-20-16/newdb/restaurants.bson
2016-01-20T10:11:57.907-0500    writing newdb.restaurants metadata to /var/backups/mongobackups/01-20-16/newdb/restaurants.metadata.json
2016-01-20T10:11:57.911-0500    done dumping newdb.restaurants (25359 documents)
2016-01-20T10:11:57.911-0500    writing newdb.system.indexes to /var/backups/mongobackups/01-20-16/newdb/system.indexes.bson

Lưu ý trong đường dẫn folder trên, ta đã sử dụng date +"%m-%d-%y" để lấy ngày hiện tại tự động. Điều này sẽ cho phép ta có các bản sao lưu bên trong folder /var/backups/ 01-20-16 / . Điều này đặc biệt thuận tiện khi ta tự động hóa các bản sao lưu.

Đến đây, bạn đã có một bản sao lưu hoàn chỉnh của database newdb trong folder /var/backups/mongobackups/ 01-20-16 /newdb/ . Bản sao lưu này có mọi thứ để khôi phục newdb đúng cách và bảo vệ cái gọi là "độ trung thực" của nó.

Theo nguyên tắc chung, bạn nên sao lưu thường xuyên, chẳng hạn như hàng ngày và tốt nhất là trong thời gian server ít tải nhất. Do đó, bạn có thể đặt lệnh mongodump như một công việc cron để nó chạy thường xuyên, ví dụ: hàng ngày lúc 03:03 sáng. Để thực hiện crontab mở này, trình soạn thảo của cron như thế này:

  • sudo crontab -e

Lưu ý khi bạn chạy sudo crontab bạn sẽ chỉnh sửa các công việc cron cho user root. Điều này được khuyến khích bởi vì nếu bạn đặt crons cho user của bạn , chúng có thể không được thực thi đúng cách, đặc biệt nếu profile sudo của bạn yêu cầu xác minh password .

Bên trong dấu nhắc crontab, chèn lệnh mongodump sau:

Cửa sổ Crontab
3 3 * * * mongodump --out /var/backups/mongobackups/`date +"%m-%d-%y"`

Trong lệnh trên, ta cố ý bỏ qua đối số --db vì thông thường bạn cần sao lưu tất cả các database của bạn .

Tùy thuộc vào kích thước database MongoDB của bạn, bạn có thể sớm hết dung lượng đĩa với quá nhiều bản sao lưu. Đó là lý do tại sao bạn nên dọn dẹp các bản sao lưu cũ thường xuyên hoặc nén chúng. Ví dụ: để xóa tất cả các bản sao lưu cũ hơn 7 ngày, bạn có thể sử dụng lệnh bash sau:

  • find /var/backups/mongobackups/ -mtime +7 -exec rm -rf {} \;

Tương tự như lệnh mongodump trước đó, lệnh này cũng có thể được thêm vào dưới dạng cron job. Nó sẽ chạy ngay trước khi bạn bắt đầu sao lưu tiếp theo, ví dụ lúc 03:01 sáng. Vì mục đích này, hãy mở lại crontab:

  • sudo crontab -e

Sau đó, chèn dòng sau:

Cửa sổ Crontab
3 1 * * * find /var/backups/mongobackups/ -mtime +7 -exec rm -rf {} \;

Hoàn thành tất cả các việc trong bước này sẽ đảm bảo một giải pháp sao lưu tốt cho database MongoDB của bạn.

Khôi phục và di chuyển database MongoDB

Bằng cách khôi phục database MongoDB của bạn từ một bản sao lưu trước (chẳng hạn như một bản sao lưu ở bước trước), bạn có thể có bản sao chính xác của thông tin MongoDB của bạn được lấy vào một thời điểm nhất định, bao gồm tất cả các index và kiểu dữ liệu. Điều này đặc biệt hữu ích khi bạn muốn di chuyển database MongoDB của bạn . Để khôi phục MongoDB, ta sẽ sử dụng lệnh mongorestore hoạt động với bản sao lưu binary do mongodump tạo ra.

Hãy tiếp tục các ví dụ của ta với database newdb và xem cách ta có thể khôi phục nó từ bản sao lưu đã chụp trước đó. Là các đối số, trước tiên, ta sẽ chỉ định tên của database với đối số --db . Sau đó, với --drop ta sẽ đảm bảo database đích sẽ bị loại bỏ trước tiên để bản sao lưu được khôi phục trong một database sạch. Đối số cuối cùng, ta sẽ chỉ định folder của bản sao lưu cuối cùng /var/backups/mongobackups/ 01-20-16 /newdb/ . Vì vậy, toàn bộ lệnh sẽ trông như thế này (thay thế bằng ngày của bản sao lưu bạn muốn khôi phục):

  • sudo mongorestore --db newdb --drop /var/backups/mongobackups/01-20-16/newdb/

Thực hiện thành công sẽ hiển thị kết quả sau:

Đầu ra của mongorestore
2016-01-20T10:44:47.876-0500    building a list of collections to restore from /var/backups/mongobackups/01-20-16/newdb/ dir
2016-01-20T10:44:47.908-0500    reading metadata file from /var/backups/mongobackups/01-20-16/newdb/restaurants.metadata.json
2016-01-20T10:44:47.909-0500    restoring newdb.restaurants from file /var/backups/mongobackups/01-20-16/newdb/restaurants.bson
2016-01-20T10:44:48.591-0500    restoring indexes for collection newdb.restaurants from metadata
2016-01-20T10:44:48.592-0500    finished restoring newdb.restaurants (25359 documents)
2016-01-20T10:44:48.592-0500    done

Trong trường hợp trên, ta đang khôi phục dữ liệu trên cùng một server mà bản sao lưu đã được tạo. Nếu bạn muốn di chuyển dữ liệu sang server khác và sử dụng kỹ thuật tương tự, bạn chỉ nên sao chép folder sao lưu, là /var/backups/mongobackups/ 01-20-16 /newdb/ trong trường hợp của ta , sang server khác.

Kết luận

Bài viết này đã giới thiệu cho bạn các yếu tố cần thiết để quản lý dữ liệu MongoDB của bạn về sao lưu, khôi phục và di chuyển database . Bạn có thể tiếp tục đọc thêm về Cách cài đặt database MongoDB có thể mở rộng, trong đó giải thích sao chép MongoDB.

Nhân rộng không chỉ hữu ích cho khả năng mở rộng, mà nó còn quan trọng đối với các chủ đề hiện tại. Nhân rộng cho phép bạn tiếp tục chạy dịch vụ MongoDB của bạn mà không bị gián đoạn từ server MongoDB slaver trong khi bạn đang khôi phục server sau khi bị lỗi. Một phần của bản sao cũng là nhật ký hoạt động (oplog) , ghi lại tất cả các hoạt động sửa đổi dữ liệu . Bạn có thể sử dụng log này, giống như sử dụng log binary trong MySQL, để khôi phục dữ liệu của bạn sau khi lần sao lưu cuối cùng diễn ra. Nhớ lại rằng quá trình sao lưu thường diễn ra vào ban đêm và nếu bạn quyết định khôi phục một bản sao lưu vào buổi tối, bạn sẽ thiếu tất cả các bản cập nhật kể từ lần sao lưu cuối cùng.


Tags:

Các tin trước

Cách nhập và xuất cơ sở dữ liệu MongoDB trên Ubuntu 14.04 2016-04-15
Cách chạy cơ sở dữ liệu cụm đa node với Cassandra trên Ubuntu 14.04 2016-03-31
Cách nhập và xuất cơ sở dữ liệu OrientDB trên Ubuntu 14.04 2016-01-06
Cách thiết lập cơ sở dữ liệu từ xa để tối ưu hóa hiệu suất trang web với MySQL 2014-04-17
Cách kết nối Node.js với Cơ sở dữ liệu MongoDB trên VPS 2013-10-09
Cách thiết lập cơ sở dữ liệu MongoDB có thể mở rộng 2013-02-26