Ana içeriğe atla

CentOS 7 üzerinde MongoDB kurulumunda hata alınırsa

Sebep/Neden: warning: /var/cache/yum/x86_64/7/MongoDB/packages/mongodb-org-mongos-4.2.13-1.el7.x86_64.rpm: Header V3 RSA/SHA1 Signature, key ID 058f8b6b: NOKEY

Retrieving key from https://www.mongodb.org/static/pgp/server-4.2.asc

Çözüm

Aşağıdaki dosyada gpgcheck=0 yapmak
sudo vi /etc/yum.repos.d/mongodb.repo
[MongoDB]
name=MongoDB Repository
baseurl=http://repo.mongodb.org/yum/redhat/$releasever/mongodb-org/4.2/$basearch/
gpgcheck=0
enabled=1
gpgkey=https://www.mongodb.org/static/pgp/server-4.2.asc

CentOS 8 üzerinde MongoDB kurulumunda hata alınırsa

Sebep/Neden

Eğer “systemctl status mongodb.service -l” komutunda aşağıdaki gibi bir çıktı görüyorsanız:
SELinux is preventing /usr/bin/mongod from read access on the file snmp.

Çözüm

Aşağıdaki komutları çalıştırın ve mongodb.service durumunu hatalar kaybolana kadar kontrol edin:
grep mongod /var/log/audit/audit.log | audit2allow -M mypol
semodule -i mypol.pp
grep ftdc /var/log/audit/audit.log | audit2allow -M mypol
semodule -i mypol.pp

/var/lib/mongodb yolunun çok fazla miktarda yer kaplaması

Sebep/Neden

Bu bir problem olmamakla birlikte bazı durumlarda yetersiz disk ve dolayısıyla sistem işleyişine etki edebilmektedir. Özellikle journaling açıksa ve replicaset’te çok node’lu yapı kullanılıyorsa bu durum görülebilir.

Çözüm

Çoklu Node kullanımlarda: Çalışan mongod servislerinden biri kapatılarak primary’nin bir başka sunucudaki mongo’ya geçmesi beklenir. Sonrasında /var/lib/mongodb yolundaki tüm dosyalar silinir. Mongod servisi baştan başlatıldığında otomatik senkronizasyon ile sadece gerekli dosyalar oluşturulacaktır. Operasyonlarda kesintiye yol açmaz.

Tek Node kullanımlarda: Operasyonlarda kesinti yapılarak gerçekleştirilebilir. Mevcut veritabanının yedeği alınır, çalışan manager durdurulur, veritabanı drop edilir, /var/lib/mongodb yolu temizlenir, mongo geri yüklenir, manager tekrar çalıştırılır.


Bir projenin ve içindeki proxy’lerin manuel olarak silinme ihtiyacı olursa

Sebep/Neden

Bu bir problem olmamakla birlikte bunlar manuel olarak silinmek istenirse uygulanabilir.

Çözüm

Çözüm için sırasıyla aşağıdaki adımlar izlenebilir:

1. Mevcut projelerdeki id’leri al ve string’e çevir:

var validProjectIds = db.project.find({}, {_id: 1}).toArray().map(function(item){ return item._id.toString(); });

2. API proxy’ler üzerinde gezerek karşılığı mevcut olmayan proje id’lerini bul:

var invalidProjectIds = [];
db.api_proxy.find({}).forEach(function(doc) {
    if( doc.projectId && doc.projectId!=='admin' && !validProjectIds.includes(doc.projectId.toString())) {
        if( !invalidProjectIds.includes(doc.projectId.toString())) {
            invalidProjectIds.push(doc.projectId);
        }
    }
});

3. İlişkisi olmayan api_proxy’ları sil:

invalidProjectIds.forEach(function(invalidProjectId) {
    db.api_proxy.deleteMany({projectId: invalidProjectId});
});

Bir projeye admin kullanıcısını proje sahibi olarak eklemek

Sebep/Neden

Bu bir problem olmamakla birlikte projeye hızlı erişim gerektiği durumlarda uygulanabilir.

Çözüm

// Apinizer veritabanına geçilir
use apinizerdb

// Aşağıdaki komut çalıştırılır ve gelen ObjectId değerinin içeriği alınır
db.role.find({name:"Project Owner"}, {_id:1})

// Alınan değer aşağıdaki komutta <OBJECT_ID> alanına yazılır ve <PROJECT_NAME> alanına istenilen proje adı yazılarak komut çalıştırılır
db.project.updateOne(
    { name:"<PROJECT_NAME>" },
    {
        $push: {
            "projectMember.teamMemberList": {
                userId: "admin",
                roleList: [
                    {
                        $ref: "role",
                        $id: ObjectId("<OBJECT_ID>")
                    }
                ]
            }
        }
    }
)

MongoDB Cluster’ındaki Node’un Hostname’i Değişecekse

  • Bu işlemler MongoDB replicaset’indeki hata tolerasyonuna dikkat edilerek yapılmalıdır aksi takdirde kesintiler yaşanabilmektedir (MongoDB (n-1)/2 tolerasyonu)
  • Bu tür bir işlem öncesinde tam bir sistem yedeği alınması önerilmektedir.

Sebep/Neden

MongoDB cluster’da hali hazırda çalışan bir node’un hostname’i değiştirildiğinde, bazı yapılandırmalar ve kimlik bilgileri eski hostname ile çakışabilmektedir. Bu yüzden bu işlemi yaparken replicaset’te hostname’i değiştirilecek node çıkartılıp hostname bilgisi değiştikten sonra eklenmelidir.

Çözüm

1. Çalışma Öncesi MongoDB Backup Alınır

Primary node’a bağlanılır ve Apinizer’ın MongoDB veritabanı yedeği alınır.
mongosh mongodb://localhost:25080 --authenticationDatabase "admin" -u "apinizer" -p
show dbs
use apinizerdb

# Veritabanındaki yüksek boyutlu koleksiyonlar kontrol edilir
db.getCollectionNames().map(name => ({storageSizeMB: (db.getCollection.stats().storageSize / (1024*1024)).toFixed(2), name: name})).sort((a,b) => a.storageSizeMB - b.storageSizeMB).forEach(printjson);

# Eğer yüksek boyutlu koleksiyon var ise ve yedek alınmak istemiyorsa --excludeCollection <Collection_Name> parametresi kullanılabilir
sudo mongodump --host localhost --port=25080 --username=apinizer --password=passwd -d apinizerdb --authenticationDatabase=admin --gzip --archive=/home/apinizer/mongodump/apinizer-backup-v<Apinizer Version>-<Date>--1.archive

2. Hostname’in Değişeceği Node MongoDB Replicaset’ten Çıkarılır

mongosh mongodb://localhost:25080 --authenticationDatabase "admin" -u "apinizer" -p
rs.status()

# Eğer sunucu primary node ise önce secondary'e çevrilir ve yeni primary'e bağlanılır (rs.stepDown())
rs.remove("<NODES_OLD_HOSTNAME>")
rs.status()

# Hostname'i değiştirilecek sunucuya bağlanılır mongodb servisi durdurulur
sudo systemctl stop mongod
sudo hostnamectl set-hostname <NODES_NEW_HOSTNAME>
sudo reboot

hostname
# /etc/hosts üzerinde 127.0.0.1 ip'sine karşılık eski hostname duruyorsa bu kısım yeni hostname ile değiştirilmelidir
sudo vi /etc/hosts
sudo systemctl start mongod

# Primary sunucuya bağlanılır ve hostname'i değişen node replica set'e dahil edilir
rs.add("<NODES_NEW_HOSTNAME>")

# Veri senkronizasyonunun tamamlanması beklenilir
rs.status()