Ana içeriğe geç

Ubuntu'da MongoDB Kurulumu

Kuruluma Başlamadan Önce Yapılması Gereken Kontroller

uyarı

Çok Önemli

Kurulumlara başlamadan önce mutlaka sunucunun hostname'nin localhost.localdomain olmadığından ve her birinin eşsiz olduğundan (hostname komutu ile) emin olun. Eğer bu şekilde ise mutlaka işlemlere başlamadan önce değiştirin.

#(Gerekirse) Hostname değiştirme
hostnamectl set-hostname your-new-hostname

/etc/hosts dosyasında 127.0.1.1 şeklinde bir hostname tanımlı olmamalıdır.

/etc/resolv.conf dosyasında nameserver 127.0.1.1 şeklinde bir girdi olmamalıdır.

bilgi
bilgi

Önemli

Ubuntu paketleri güncellerken Türkiye lokasyonundaki sunucudan çekmeye çalışır. Ancak zaman zaman tr.archive.ubuntu.com adresinde sorun olabilmektedir. Bu durumda aşağıdaki değişikliği yapmak gerekir.

sudo vi /etc/apt/sources.list

#İçinde tr. olan adreslerin hepsini "Replace All" ile değiştirin.

#Örnek:

Eski: http://tr.archive.ubuntu.com/ubuntu

Yeni: http://archive.ubuntu.com/ubuntu

İşletim Sistemi Konfigürasyonları

not

Bu adımlar tüm MongoDB sunucularında gerçekleştirilmelidir.

# Apinizer kullanıcısı oluşturulur ve yetkilendirilir
sudo adduser apinizer
sudo usermod -aG sudo apinizer

# Kullanıcıya geçilerek işlemlere devam edilir
sudo su - apinizer

# Gerekli araçların kurulumu
sudo apt update
sudo apt install -y curl wget net-tools gnupg2 software-properties-common apt-transport-https ca-certificates lsb-release jq

# Güvenlik duvarı kapatılır
sudo systemctl stop ufw
sudo systemctl disable ufw

# Swap kapatılır ve yeniden başlamasının önlenmesi için /etc/fstab dosyası içindeki swap satırı silinir
sudo swapoff -a
sudo vi /etc/fstab
# Daha sonra vi dosyasını kapatılır (:wq)

MongoDB Kurulumu

MongoDB Uygulamasının Kurulması

not

Bu adımlar tüm MongoDB sunucularında gerçekleştirilmelidir.

wget http://archive.ubuntu.com/ubuntu/pool/main/o/openssl/libssl1.1_1.1.1f-1ubuntu2_amd64.deb
sudo dpkg -i ./libssl1.1_1.1.1f-1ubuntu2_amd64.deb

curl -fsSL https://www.mongodb.org/static/pgp/server-8.0.asc | sudo gpg --dearmor -o /etc/apt/trusted.gpg.d/mongodb-8.gpg

echo "deb [ arch=amd64,arm64 ] https://repo.mongodb.org/apt/ubuntu focal/mongodb-org/8.0 multiverse" | sudo tee /etc/apt/sources.list.d/mongodb-org-8.0.list

sudo apt update
sudo apt install -y mongodb-org=8.0.17
sudo apt-mark hold mongodb-org*

MongoDB Konfigürasyonları

not

Bu adımlar tüm MongoDB sunucularında gerçekleştirilmelidir.

Key oluşturma:

sudo mkdir -p /etc/mongodb/keys/
sudo chown -Rf apinizer:apinizer /etc/mongodb/keys
sudo chmod -Rf 700 /etc/mongodb/keys
sudo openssl rand -base64 756 > /etc/mongodb/keys/mongo-key
sudo chmod -Rf 400 /etc/mongodb/keys/mongo-key
sudo chown -Rf mongodb:mongodb /etc/mongodb

Aşağıdaki parametreleri /etc/mongod.conf dosyasına kendi ortamınıza uygun olarak ayarlayarak eklemeniz gerekmektedir:

  • storage / wiredTiger
  • replication
  • security
  • setParameter
  • processManagement

İlgili konfigürasyon dosyasının olması gereken hali:

storage:
dbPath: /var/lib/mongodb
wiredTiger:
engineConfig:
cacheSizeGB: 2

systemLog:
destination: file
logAppend: true
path: /var/log/mongodb/mongod.log

net:
port: 25080
bindIp: 0.0.0.0

replication:
replSetName: apinizer-replicaset

security:
authorization: enabled
keyFile: /etc/mongodb/keys/mongo-key

setParameter:
transactionLifetimeLimitSeconds: 300

processManagement:
timeZoneInfo: /usr/share/zoneinfo

Sonrasında MongoDB uygulaması başlatılır:

sudo systemctl enable mongod
sudo systemctl start mongod
bilgi

MongoDB kurulumu eğer birden çok sunucu üzerinde yapılacaksa Primary node'da oluşturulmuş olan anahtarlar tüm node'lara taşınır ve aynı yetkiler verilir.

#Primary sunucudan anahtar dosyası bütün Seconder sunuculara kopyalanır
scp -r /etc/mongodb/keys/ apinizer@mongoDb2:/tmp
#aynı işlem mongoDb3 için ayrıca yapılmalıdır

#Secondary sunucularda key olması gerektiği yere taşınır
sudo mv /tmp/keys/ /etc/mongodb/keys/

#Yetkiler kontrol edilir, düzeltilir
chmod -Rf 400 /etc/mongodb/keys
chown -Rf mongodb:mongodb /etc/mongodb

ReplicaSet Konfigürasyonu ve Yetkili Kullanıcı Tanımı

not

Bu adımlar sadece MongoDB Primary sunucusunda gerçekleştirilmelidir.

uyarı

Replicaset aktifleştirme işlemi sadece Primary sunucu üzerinde yapılmalıdır.

Replicaset'i aktifleştirme:

mongosh mongodb://localhost:25080
#Bu aşamada eğer bağlantı hatası verirse /etc/hosts altına server adresi ile sunucu adı eklenmeli ve 127.0.0.1 ifadesinin değerlerinden biri de localhost mu diye bakılmalı

rs.initiate()
rs.status()

Apinizer uygulaması için yetkili kullanıcı oluşturma:

use admin
db.createUser(
{
user: 'apinizer',
pwd: '<YOUR_PASSWORD>',
roles: [ { role: 'root', db: 'admin' } ],
mechanisms:[ "SCRAM-SHA-1"] }
);

exit;
bilgi

Eğer MongoDB'nin yerel yönetimi tarafınızdan gerçekleştirilecekse, aşağıdaki role sahip bir kullanıcının oluşturulması gerekmektedir.

roles: [ { role: "readWrite", db: "apinizerdb" } ]
bilgi

İhtiyaç Duyulabilecek Değişiklikler

Daha önce oluşturulmuş olan MongoDB üzerinde bir kullanıcıya aşağıdaki komut satırlarını kullanarak yetki verin.

mongosh mongodb://localhost:25080
use admin;
db.grantRolesToUser('admin', [{ role: 'root', db: 'admin' }])

Hostname veya IP adresi değiştirilmek istenirse:

mongosh mongodb://localhost:25080 --authenticationDatabase "admin" -u "apinizer" -p
cfg = rs.conf()
cfg.members[0].host = "<MONGO_IP_ADDRESS>:25080"
rs.reconfig(cfg)
rs.status()

Bir kullanıcı şifresi değiştirilmek istenirse:

use admin
db.changeUserPassword("apinizer", passwordPrompt())

MongoDB'ye arbiter eklenmek isteniyorsa:

db.adminCommand({ setDefaultRWConcern: 1, defaultWriteConcern: { w: "majority" } })
rs.addArb("<MONGO_IP_ADDRESS>:25080")

Birden Çok Sunucu Üzerinde MongoDB ReplicaSet Kurulumu

not

Bu adımlar sadece MongoDB Primary sunucusunda gerçekleştirilmelidir.

bilgi

Apinizer, MongoDB'nin yüksek kullanılabilirlik özelliğini önermektedir. Yüksek kullanılabilirlik, Primary Node'un başarısız olması durumunda Secondary Node'ların devreye girmesini sağlar.

Yüksek kullanılabilirlik için MongoDB de en az 3 sunucu (1 Primary ve 2 Secondary) gerekmektedir. Eğer Primary node bir sorunla karşılaşırsa, bir Secondary node otomatik olarak Primary olur, böylece sistem kesintisiz çalışır. Primary node tekrar aktif hale döndüğünde, Secondary node olarak kalır. Fakat, 3 sunucudan daha az aktif sunucu olduğu durumda bu işlev görülemez.

Yüksek kullanılabilirlik, sadece 3 sunucuyla sınırlı değildir; Arbiter veya daha fazla sunucu ile de uygulanabilir. Sistem devamlılığını artırmak için sunucular farklı yerlere konumlandırılabilir.

Daha fazla bilgi için https://www.mongodb.com/docs/manual/core/replica-set-architectures/ bağlantısına göz atabilirsiniz.

Mongod servislerini yeniden başlattığınızda, aşağıdaki komutları kullanarak Primary node üzerinde Secondary node'ları replica set mimarisiyle yapılandırabilirsiniz.

mongosh mongodb://<PRIMARY_NODE>:25080 --authenticationDatabase "admin" -u "apinizer" -p
rs.add("mongoDb02:25080")
rs.add("mongoDb03:25080")
rs.status()
exit;

Bu adımla, biri Primary ve diğer ikisi Secondary olmak üzere toplam üç sunucudan oluşan bir yapı kurulmuştur.

Yüksek kullanılabilirlik durumunda, Primary sunucunun bağlantısı kesilirse veya çalışmazsa, bir Secondary sunucu otomatik olarak ana sunucu rolünü üstlenmelidir. Bu durumu ayarlamak için, Primary node üzerinde tüm node'lar için şu adımları uygulanmalıdır.

mongosh mongodb://<PRIMARY_NODE>:25080 --authenticationDatabase "admin" -u "apinizer" -p
cfg = rs.conf()
cfg.members[0].priority = 1
cfg.members[0].votes = 1
cfg.members[1].priority = 1
cfg.members[1].votes = 1
cfg.members[2].priority = 1
cfg.members[2].votes = 1
rs.reconfig(cfg)
rs.conf()
rs.status()
exit;
bilgi

Priority, node'un yeni Primary olarak seçilme önceliğini belirtir ve bu değer 0 ile 1 arasında ölçeklendirilebilir. 0 değeri hiç bir zaman Primary node olamayacağını belirtirken, diğer değerlerin 1'e yakınlığına göre Primary olma önceliği bulunur.

Votes, bir node'un yeni bir Primary seçiminde oy kullanıp kullanamayacağını belirtir ve 0 ya da 1 değerini alır. Bu değer node'un seçimde oy verip vermeyeceğini gösterir.

not

Bu kurulum "mongoDb01, mongoDb02, mongoDb03, k8sWorkerIP" şeklindeki dns'lerin sistem tarafından çözülebildiği varsayılarak hazırlanmıştır. Sunucuların bu dns'leri çözemedikleri durumlarda ya bu durum düzeltilmedilir ya da tüm dns'ler ip olarak düzeltilmelidir.