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

Cách ngăn xây dựng chỉ mục chạy trốn trong MongoDB

Các bản dựng chỉ mục trong MongoDB có thể có tác động tiêu cực đến tính khả dụng của cụm MongoDB của bạn. Nếu bạn kích hoạt xây dựng chỉ mục nền trước trên một bộ sưu tập lớn trên máy chủ sản xuất của mình, bạn có thể thấy rằng cụm của mình không phản hồi cho đến khi xây dựng chỉ mục hoàn tất. Trên một bộ sưu tập lớn, quá trình này có thể mất vài giờ hoặc vài ngày, như được mô tả trong phần rủi ro của việc xây dựng chỉ mục trong MongoDB.

Phương pháp hay nhất được khuyến nghị là kích hoạt tạo chỉ mục trong nền, tuy nhiên, trên các chỉ mục tập hợp lớn, chúng tôi đã thấy nhiều vấn đề với phương pháp này. Trong trường hợp có một cụm ba nút, cả hai tổ chức phụ bắt đầu xây dựng chỉ mục và ngừng phản hồi bất kỳ yêu cầu nào. Do đó, nhóm chính không có túc số và chuyển sang trạng thái thứ cấp, loại bỏ cụm của bạn. Ngoài ra, các bản dựng chỉ mục mặc định được kích hoạt từ dòng lệnh là các bản dựng chỉ mục nền trước - khiến điều này trở thành một vấn đề phổ biến hiện nay. Trong các bản phát hành trong tương lai, chúng tôi hy vọng rằng điều này sẽ trở thành nền theo mặc định.

Sau khi bạn đã kích hoạt chỉ mục, chỉ cần khởi động lại máy chủ không giải quyết được vấn đề của chúng tôi; MongoDB sẽ tiếp tục xây dựng chỉ mục từ nơi nó đã dừng lại. Nếu trước đây bạn đang chạy một bản dựng chỉ mục nền sau khi khởi động lại, thì bây giờ nó trở thành một bản dựng chỉ mục nền trước, vì vậy trong trường hợp này, việc khởi động lại có thể làm cho sự cố trở nên tồi tệ hơn.

Nếu bạn đã kích hoạt xây dựng chỉ mục, bạn làm cách nào để ngăn chặn nó? May mắn thay, việc dừng xây dựng chỉ mục tương đối dễ dàng.

Tùy chọn 1:Hủy quá trình xây dựng chỉ mục

Định vị quá trình xây dựng chỉ mục bằng db.currentOp () và sau đó hủy hoạt động bằng db.killOp (). Thao tác lập chỉ mục sẽ trông giống như sau:

{
"opid" : 820659355,
"active" : true,
"lockType" : "write",
....
"op" : "insert",
"ns" : "xxxx",
"query" : {
},
"client" : "xxxx",
"desc" : "conn",
"msg" : "index: (2/3) btree bottom up 292168587/398486401 64%"
}

Nếu nút mà chỉ mục đang xây dựng không phản hồi với các kết nối mới hoặc killOp không hoạt động, hãy sử dụng Tùy chọn 2 bên dưới:

Tùy chọn 2:Định cấu hình “noIndexBuildRetry” và khởi động lại

MongoDB cung cấp tùy chọn “–noIndexBuildRetry” hướng dẫn MongoDB ngừng tạo các chỉ mục chưa hoàn chỉnh khi khởi động lại.

Thông số này dường như không được hỗ trợ từ tệp cấu hình, chỉ là một tham số cho quy trình mongod. Chúng tôi không muốn chạy mongod theo cách thủ công với tùy chọn này vì nếu bạn vô tình chạy quy trình mongod với tư cách là người dùng được nâng cao (ví dụ:root), nó sẽ thay đổi quyền của tất cả các tệp. Ngoài ra, sau khi chạy dưới dạng "root", chúng tôi đã gặp sự cố không liên tục khi chạy lại quá trình dưới dạng mongod.

Một tùy chọn đơn giản hơn là chỉnh sửa tệp /etc/init.d/mongod. Tìm kiếm dòng này:

OPTIONS=" -f $CONFIGFILE"

Thay thế bằng dòng này:

OPTIONS=" -f $CONFIGFILE --noIndexBuildRetry"

Các bước chi tiết

Vì mục đích của cuộc thảo luận này, chúng tôi đang cung cấp hướng dẫn cho CentOS / RedHat / Amazon Linux.

  1. Định cấu hình “–noIndexBuildRetry”

    Thêm tùy chọn “–noIndexBuildRetry” vào tất cả các nút dữ liệu của bạn như đã giải thích ở trên.

  2. Khởi động lại tất cả các nút đang xây dựng chỉ mục

    Xem tệp nhật ký mongod cho từng máy chủ dữ liệu và xác định xem máy chủ đó có đang xây dựng chỉ mục hay không. Nếu đúng như vậy, hãy khởi động lại máy chủ “khởi động lại mongod dịch vụ”.

  3. Bỏ chỉ mục chưa hoàn chỉnh

    Sau khi tất cả các nút có liên quan được khởi động lại, hãy xem danh sách chỉ mục và bỏ chỉ mục chưa hoàn chỉnh nếu bạn thấy nó trên danh sách.

  4. Xóa “–noIndexBuildRetry”

    Chỉnh sửa tệp /etc/init.d/mongod để xóa tùy chọn –noIndexBuildRetry mà bạn đã thêm ở bước 1 để chúng tôi có thể hoàn nguyên về hành vi mặc định tiếp tục xây dựng chỉ mục.

Nếu có thêm bất kỳ câu hỏi nào, hãy liên hệ với chúng tôi theo địa chỉ [email protected].

Chúc bạn lập chỉ mục vui vẻ!


  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Làm cách nào để lấy id đối tượng trong PyMongo sau khi chèn?

  2. Làm cách nào để tìm kiếm một đối tượng bằng ObjectId của nó trong bảng điều khiển mongo?

  3. Giao điểm chỉ số MongoDB

  4. Tải lên và truy xuất tệp bằng MongoDB và Spring Boot

  5. MongoDB $ stdDevPop