Làm cách nào để tôi (an toàn) tiêu diệt các hoạt động chạy dài trong MongoDB?


11

Đôi khi các hoạt động vượt khỏi tầm kiểm soát trong MongoDB và có thể sẽ chạy hàng trăm giây và tác động đến hiệu suất cho đến khi chúng bị giết hoặc hoàn thành.

Khi điều đó xảy ra, tôi biết tôi đã có killOp()sẵn cho tôi nhưng làm thế nào để tôi chỉ giết các hoạt động chạy dài được nhắm mục tiêu mà không giết (ví dụ) các hoạt động chạy dài liên quan đến sao chép (có thể nguy hiểm)?

Câu trả lời:


15

Điều này có thể hơi khó khăn, nhưng thực tế là trình bao MongoDB về cơ bản là một trình thông dịch Javascript cung cấp cho chúng ta các tùy chọn hợp lý về mặt lọc. Đây là chức năng tôi sử dụng để thực hiện điều này:

// kills long running ops in MongoDB (taking seconds as an arg to define "long")
// attempts to be a bit safer than killing all by excluding replication related operations
// and only targeting queries as opposed to commands etc.
killLongRunningOps = function(maxSecsRunning) {
    currOp = db.currentOp();
    for (oper in currOp.inprog) {
        op = currOp.inprog[oper-0];
        if (op.secs_running > maxSecsRunning && op.op == "query" && !op.ns.startsWith("local")) {
            print("Killing opId: " + op.opid
            + " running over for secs: "
            + op.secs_running);
            db.killOp(op.opid);
        }
    }
};

Điều này sẽ chỉ giết các truy vấn trên maxSecsRunningngưỡng và sẽ không chạm vào bất cứ thứ gì chạy trên localcơ sở dữ liệu, đó là nơi oplogtồn tại (và do đó là cơ sở dữ liệu có liên quan đến các bản sao hoạt động dài. Nó tương đối dễ dàng để thêm tiêu chí vào ifđiều kiện bên trong để chính xác hơn hoạt động mục tiêu khi cần dựa trên nhu cầu cụ thể.

Mã này cũng có sẵn như là một ý chính (nơi tôi sẽ nhớ để cập nhật nó trên cơ sở liên tục).


Tôi đã thấy một số kịch bản cho cái này. Tuy nhiên, để kiểm tra xem hoạt động có chạy với cơ sở dữ liệu cục bộ hay không là một cải tiến tốt.
Joao

vâng - Tôi đã đưa ra điều này nhiều lần và thấy một bài đăng trên blog với một kịch bản rất nguy hiểm để giết ops, vì vậy tôi nghĩ rằng tôi sẽ cho mình một phiên bản đẹp và dễ liên kết
Adam C

3
Tôi tin rằng đây là một kịch bản nguy hiểm ít nhất là khi sử dụng bản sao. Chạy db.currentOp()trên cơ sở dữ liệu phân đoạn của chúng tôi trả về các hoạt động trong không gian tên "" (còn gọi là ns: "") chạy rất lâu với một mô tả "thay thế worker worker n" (trong đó n là một số nguyên). Tôi sẽ đề xuất danh sách trắng các không gian tên cho cơ sở dữ liệu thực tế của bạn với các truy vấn mà bạn có thể muốn giết. Một cái gì đó như && (['users', 'analytics'].indexOf(op.ns) != -1)thay vì !op.ns.startsWithđiều kiện.
runamok

Điểm hay và hoàn toàn có thể là không gian tên trống xảy ra thường xuyên hơn trong các phiên bản mới hơn - ban đầu tôi dự định sẽ giữ cho tập lệnh được cập nhật, nhưng bây giờ tôi đã rời MongoDB, vì vậy điều đó không chắc là tôi sợ. Nếu bạn gửi mã được cập nhật của mình (với một lưu ý rằng nó áp dụng cho các phiên bản mới hơn) ở đây như một câu trả lời tôi sẽ vui vẻ bỏ phiếu cho bạn :)
Adam C
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.