MongoDB'de uzun süren operasyonları (güvenli bir şekilde) nasıl öldürebilirim?


11

Bazen MongoDB'de işlemler kontrolden çıkar ve yüzlerce saniye boyunca çalışmaya devam edebilir ve öldürülünceye veya tamamlanana kadar performansı etkileyebilir.

Bu olduğunda, benim için killOp()uygun olduğumu biliyorum, ancak çoğaltma ile ilgili uzun süreli operasyonları (örneğin tehlikeli) de öldürmeden (örneğin) sadece hedeflenen uzun koşu operasyonlarını nasıl öldürebilirim?

Yanıtlar:


15

Bu biraz zor olabilir, ancak MongoDB kabuğunun temelde bir Javascript yorumlayıcısı olması, filtreleme açısından bize iyi seçenekler sunar. İşte bunu gerçekleştirmek için kullandığım işlev:

// 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);
        }
    }
};

Bu, yalnızca maxSecsRunningeşiğin üzerindeki sorguları öldürür ve localveritabanına karşı çalışan hiçbir şeye dokunmaz , bu da oplogyaşamların olduğu yerdir (ve bu nedenle uzun süren çoğaltma işlemlerinde yer alan veritabanıdır. İç ifkoşullara kriter eklemek nispeten kolaydır. belirli ihtiyaçlara göre operasyonları gerektiği gibi daha hassas bir şekilde hedeflemek.

Kod aynı zamanda bir gist olarak da mevcuttur (burada sürekli olarak güncellemeyi hatırlayacağım).


Bunun için birkaç senaryo gördüm. Yine de, işlemin yerel veritabanına karşı çalışıp çalışmadığını kontrol etmek hoş bir gelişmedir.
joao

Evet - Bunu defalarca verdim ve op'ları öldürmek için çok tehlikeli bir senaryo içeren bir blog yazısı gördüm, bu yüzden kendime güzel ve kolayca bağlanabilir bir versiyon vereceğimi düşündüm
Adam C

3
En azından kopyaları kullanırken bunun tehlikeli bir komut dosyası olduğuna inanıyorum. Koşu db.currentOp()"(ns aka ad: "")" bizim kanatlı bir veritabanı döner operasyonlarda çok uzun bir desc ile çalıştıran "repl yazar işçi n" (burada n bir tam sayıdır). Öldürmek isteyebileceğiniz sorgularla ad alanlarını gerçek veritabanlarınıza beyaz listeye eklemenizi öneririm. Durum && (['users', 'analytics'].indexOf(op.ns) != -1)yerine benzer bir şey !op.ns.startsWith.
runamok

İyi bir nokta, ve boş ad alanının yeni sürümlerde daha sık gerçekleşmesi tamamen mümkündür - başlangıçta komut dosyasını güncel tutmayı amaçladım, ancak şimdi MongoDB'den ayrıldım, bu yüzden korkmuyorum. Güncellenmiş kodunuzu (daha sonraki sürümler için geçerli olduğunu belirten bir notla) buraya bir yanıt olarak gönderirseniz, sizi memnuniyetle oylayacağım :)
Adam C
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.