MongoDB
 sql >> Cơ Sở Dữ Liệu >  >> NoSQL >> MongoDB

Cách di chuyển dữ liệu trong MongoDB

Mục tiêu của bài đăng này là tìm hiểu về các cách di chuyển dữ liệu khác nhau trong MongoDB có thể giúp chúng tôi viết các tập lệnh thay đổi cơ sở dữ liệu của bạn bằng cách thêm tài liệu mới, sửa đổi tài liệu hiện có.

Nếu bạn đến đây lần đầu tiên, hãy xem MongoDB tự lưu trữ tiền truyện.

Được rồi, chọn từ nơi chúng ta đã dừng lại, hãy bắt đầu với việc di chuyển dữ liệu trong MongoDB.

Bây giờ, các bước cơ bản để di chuyển dữ liệu từ MongoDB này sang MongoDB khác sẽ là:

  1. Tạo một bản sao lưu đã nén của dữ liệu hiện có
  2. Kết xuất dữ liệu trong một DB mới

Điều này rất dễ xảy ra khi cơ sở dữ liệu nguồn không trực tuyến vì chúng tôi biết rằng sẽ không có bất kỳ tài liệu mới nào được tạo / cập nhật trong quá trình di chuyển.

Di chuyển từ cơ sở dữ liệu ngoại tuyến trong MongoDB

Tạo bản sao lưu

Chúng tôi sẽ sử dụng mongodump chương trình tiện ích hiện có để tạo bản sao lưu cơ sở dữ liệu.

Chạy lệnh này trong máy chủ cơ sở dữ liệu nguồn

mongodump --host="hostname:port" \
  --username="username" --password="password" \
  --authenticationDatabase "admin" \
  --db="db name" --collection="collection name" --query='json' \
  --forceTableScan -v --gzip --out ./dump

--host :Tên máy chủ MongoDB nguồn cùng với cổng. Nó mặc định là localhost:27017 . Nếu đó là một chuỗi kết nối, bạn có thể sử dụng tùy chọn này —-uri="mongodb://username:password@host1[:port1]..."

--username :Chỉ định tên người dùng để xác thực cơ sở dữ liệu MongoDB sử dụng xác thực.

--password :Chỉ định mật khẩu để xác thực cơ sở dữ liệu MongoDB sử dụng xác thực.

--authenticationDatabase :Chỉ định cơ sở dữ liệu xác thực nơi --username được chỉ định đã được tạo.

Nếu bạn không chỉ định cơ sở dữ liệu xác thực hoặc cơ sở dữ liệu để xuất, mongodump giả sử cơ sở dữ liệu quản trị giữ thông tin đăng nhập của người dùng.

--db :Chỉ định cơ sở dữ liệu để sao lưu từ đó. Nếu bạn không chỉ định cơ sở dữ liệu, mongodump sẽ thu thập từ tất cả các cơ sở dữ liệu trong trường hợp này.

Ngoài ra, bạn cũng có thể chỉ định cơ sở dữ liệu trực tiếp trong chuỗi kết nối URI, tức là mongodb://username:password@uri/dbname .
Cung cấp chuỗi kết nối đồng thời sử dụng --db và chỉ định thông tin xung đột sẽ dẫn đến lỗi .

--collection :Chỉ định một bộ sưu tập để sao lưu. Nếu bạn không chỉ định một tập hợp, tùy chọn này sẽ sao chép tất cả các tập hợp trong cơ sở dữ liệu hoặc phiên bản được chỉ định vào các tệp kết xuất.

--query :Cung cấp tài liệu JSON dưới dạng truy vấn có giới hạn tùy chọn các tài liệu được đưa vào đầu ra của mongodump.
Bạn phải đặt tài liệu truy vấn trong dấu ngoặc kép ('{ ... }') để đảm bảo rằng nó không tương tác với môi trường của bạn.
Truy vấn phải ở định dạng JSON mở rộng v2 (chế độ thư giãn hoặc chính tắc / nghiêm ngặt), bao gồm việc đặt tên trường và toán tử trong dấu ngoặc kép, ví dụ:'{ "created_at": { "\$gte": ISODate(...) } }' .

Để sử dụng --query , bạn cũng phải chỉ định --collection tùy chọn.

--forceTableScan :Buộc mongodump quét trực tiếp kho dữ liệu. Thông thường, mongodump lưu các mục nhập khi chúng xuất hiện trong chỉ mục của _id đồng ruộng.

Nếu bạn chỉ định một truy vấn --query , mongodump sẽ sử dụng chỉ mục thích hợp nhất để hỗ trợ truy vấn đó.
Do đó, bạn không thể sử dụng --forceTableScan với --query tùy chọn .

--gzip :Nén đầu ra. Nếu mongodump xuất ra thư mục kết xuất, tính năng mới sẽ nén các tệp riêng lẻ. Các tệp có hậu tố .gz .

--out :Chỉ định thư mục nơi mongodump sẽ ghi BSON các tệp cho cơ sở dữ liệu đã kết xuất. Theo mặc định, mongodump lưu các tệp đầu ra trong một thư mục có tên là kết xuất trong thư mục làm việc hiện tại.

Khôi phục bản sao lưu

Chúng tôi sẽ sử dụng một chương trình tiện ích có tên là mongorestore để khôi phục bản sao lưu cơ sở dữ liệu.

Sao chép kết xuất thư mục sao lưu vào phiên bản Cơ sở dữ liệu mới và chạy lệnh sau:

mongorestore --uri="mongodb://user:password@host:port/?authSource=admin" \
  --drop --noIndexRestore --gzip -v ./dump

Thay thế thông tin xác thực bằng thông tin xác thực cơ sở dữ liệu mới. Bỏ dòng ở bước trước, --authenticationDatabase tùy chọn được chỉ định trong chuỗi URI.

Ngoài ra, hãy sử dụng --gzip nếu được sử dụng trong khi tạo bản sao lưu.

--drop :Trước khi khôi phục các bộ sưu tập từ bản sao lưu đã kết xuất, hãy loại bỏ các bộ sưu tập khỏi cơ sở dữ liệu đích. Nó không làm rơi các bộ sưu tập không có trong bản sao lưu. --noIndexRestore :Ngăn mongorestore khôi phục và xây dựng các chỉ mục như được chỉ định trong đầu ra mongodump tương ứng.

Nếu bạn muốn thay đổi tên của cơ sở dữ liệu trong khi khôi phục, bạn có thể thực hiện việc này bằng cách sử dụng
--nsFrom="old_name.*" --nsTo="new_name.*" tùy chọn.

Tuy nhiên, nó sẽ không hoạt động nếu bạn di chuyển bằng oplogs đó là một yêu cầu khi di chuyển từ phiên bản trực tuyến.

Di chuyển từ cơ sở dữ liệu trực tuyến trong MongoDB

Thách thức duy nhất với việc di chuyển từ cơ sở dữ liệu trực tuyến là không thể tạm dừng các bản cập nhật trong quá trình di chuyển. Đây là tổng quan về các bước,

  1. Chạy quá trình di chuyển hàng loạt ban đầu với oplogs chụp
  2. Chạy công việc đồng bộ hóa để giảm thiểu độ trễ của công tắc kết nối cơ sở dữ liệu

Bây giờ, để nắm bắt oplogs , một tập hợp bản sao phải được khởi tạo trong cơ sở dữ liệu nguồn và đích. Điều này là do oplogs được lấy từ local.oplog.rs không gian tên, được tạo sau khi khởi tạo một tập hợp bản sao.

Bạn có thể làm theo hướng dẫn này để định cấu hình tập hợp bản sao.

Di chuyển ban đầu với Oplog Capture

Oplog, nói một cách đơn giản, là nhật ký hoạt động được tạo cho mỗi hoạt động trong cơ sở dữ liệu. Chúng thể hiện một trạng thái tài liệu một phần hay nói cách khác là trạng thái cơ sở dữ liệu. Vì vậy, chúng tôi sẽ nắm bắt mọi bản cập nhật trong cơ sở dữ liệu cũ của chúng tôi trong quá trình di chuyển bằng cách sử dụng các oplogs này .

Chạy chương trình mongodump với các tùy chọn sau,

mongodump --uri=".../?authSource=admin" \
  --forceTableScan --oplog \
  --gzip -v --out ./dump

--oplog :Tạo một tệp có tên oplog.bson như một phần của mongodump đầu ra. oplog.bson tệp, nằm ở cấp cao nhất của thư mục đầu ra, chứa oplogs các mục nhập xảy ra trong hoạt động mongodump. Tệp này cung cấp ảnh chụp nhanh tại thời điểm hiệu quả về trạng thái của phiên bản cơ sở dữ liệu của chúng tôi.

Khôi phục dữ liệu bằng oplog replay

Để phát lại các oplog, cần phải có một vai trò đặc biệt. Hãy tạo và gán vai trò cho người dùng cơ sở dữ liệu đang được sử dụng để di chuyển.

Tạo vai trò

db.createRole({
  role: "interalUseOnlyOplogRestore",
  privileges: [
    {
      resource: { anyResource: true },
      actions: [ "anyAction" ] 
    }
  ],
  roles: []
})

Chỉ định vai trò

db.grantRolesToUser(
  "admin",
  [{ role:"interalUseOnlyOplogRestore", db:"admin" }]
);

Bây giờ bạn có thể khôi phục bằng chương trình mongorestore với các tùy chọn sau,

mongorestore --uri="mongodb://admin:.../?authSource=admin" \
  --oplogReplay 
  --gzip -v ./dump

Trong lệnh trên, sử dụng cùng một người dùng admin vai trò được liên kết với ai.

--oplogReplay :Sau khi khôi phục kết xuất cơ sở dữ liệu, hãy phát lại các mục oplog từ tệp bson và khôi phục cơ sở dữ liệu về bản sao lưu tại thời điểm được chụp bằng mongodump --oplog lệnh.

Giảm thiểu độ trễ của công tắc kết nối cơ sở dữ liệu

Được rồi, cho đến nay chúng ta đã hoàn thành hầu hết các công việc nặng nhọc. Điều duy nhất còn lại là duy trì tính nhất quán giữa các cơ sở dữ liệu trong quá trình chuyển đổi kết nối trong các máy chủ ứng dụng của chúng tôi.

Nếu bạn đang chạy MongoDB phiên bản 3.6+, tốt hơn nên sử dụng phương pháp Dòng thay đổi, đây là một cơ chế dựa trên sự kiện được giới thiệu để nắm bắt các thay đổi trong cơ sở dữ liệu của bạn theo cách được tối ưu hóa. Đây là một bài viết bao gồm nó https://www.mongodb.com/blog/post/an-introduction-to-change-streams

Kiểm tra tập lệnh đồng bộ hóa chung mà bạn có thể chạy như một công việc CRON mỗi phút.

Cập nhật các biến trong tập lệnh này và chạy dưới dạng

$ ./delta-sync.sh from_epoch_in_milliseconds

# from_epoch_in_milliseconds is automatically picked with every iteration if not supplied

Hoặc bạn có thể thiết lập cron job để chạy nó mỗi phút.

* * * * * ~/delta-sync.sh

Đầu ra có thể được giám sát bằng lệnh sau (Tôi đang chạy RHEL 8, hãy tham khảo hướng dẫn hệ điều hành của bạn để biết đầu ra cron)

$ tail -f /var/log/cron | grep CRON

Đây là nhật ký đồng bộ hóa mẫu.

CMD (~/cron/dsync.sh)
CMDOUT (INFO: Updated log registry to use new timestamp on next run.)
CMDOUT (INFO: Created sync directory: /home/ec2-user/cron/dump/2020-11-03T19:01:01Z)
CMDOUT (Fetching oplog in range [2020-11-03T19:00:01Z - 2020-11-03T19:01:01Z])
CMDOUT (2020-11-03T19:01:02.319+0000#011dumping up to 1 collections in parallel)
CMDOUT (2020-11-03T19:01:02.334+0000#011writing local.oplog.rs to /home/ec2-user/cron/dump/2020-11-03T19:01:01Z/local/oplog.rs.bson.gz)
CMDOUT (2020-11-03T19:01:04.943+0000#011local.oplog.rs  0)
CMDOUT (2020-11-03T19:01:04.964+0000#011local.oplog.rs  0)
CMDOUT (2020-11-03T19:01:04.964+0000#011done dumping local.oplog.rs (0 documents))
CMDOUT (INFO: Dump success!)
CMDOUT (INFO: Replaying oplogs...)
CMDOUT (2020-11-03T19:01:05.030+0000#011using write concern: &{majority false 0})
CMDOUT (2020-11-03T19:01:05.054+0000#011will listen for SIGTERM, SIGINT, and SIGKILL)
CMDOUT (2020-11-03T19:01:05.055+0000#011connected to node type: standalone)
CMDOUT (2020-11-03T19:01:05.055+0000#011mongorestore target is a directory, not a file)
CMDOUT (2020-11-03T19:01:05.055+0000#011preparing collections to restore from)
CMDOUT (2020-11-03T19:01:05.055+0000#011found collection local.oplog.rs bson to restore to local.oplog.rs)
CMDOUT (2020-11-03T19:01:05.055+0000#011found collection metadata from local.oplog.rs to restore to local.oplog.rs)
CMDOUT (2020-11-03T19:01:05.055+0000#011restoring up to 4 collections in parallel)
CMDOUT (2020-11-03T19:01:05.055+0000#011replaying oplog)
CMDOUT (2020-11-03T19:01:05.055+0000#011applied 0 oplog entries)
CMDOUT (2020-11-03T19:01:05.055+0000#0110 document(s) restored successfully. 0 document(s) failed to restore.)
CMDOUT (INFO: Restore success!)

Bạn có thể dừng tập lệnh này sau khi xác minh rằng không còn oplogs đang được tạo, tức là khi nguồn DB ngoại tuyến.

Phần này kết thúc hướng dẫn di chuyển dữ liệu MongoDB tự lưu trữ đầy đủ. Nếu bạn muốn tìm hiểu thêm về MongoDB, đây là một tài nguyên hữu ích về cách sử dụng MongoDB làm nguồn dữ liệu trong goLang.


  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Bảo mật MongoDB khỏi các cuộc tấn công từ bên ngoài

  2. SQL COALESCE () Giải thích

  3. Chuyển đổi MongoDB BsonDocument thành JSON hợp lệ trong C #

  4. lưu địa chỉ IP trong mongoDB

  5. Sắp xếp Mongodb với cách phân biệt chữ hoa chữ thường