Ubuntu MongoDB kurulumu ve Uzaktan Erişim Ayarları

MongoDB ile ilgilenmeye yeni yeni başladım. Bu yazımda Ubuntu için uzaktan erişim destekli Robo 3T ile bağlanabileceğimiz bir MongoDB kurulumu yapacağız. Hazır apt paketlerinden yararlanmadan resmi siteden tarball yani tar.gz olarak indirip veritabanının dosya sistemindeki konumuna ve yapılandırma dosyasına tam hakimiyet sağlamaya çalışacağız.

MongoDB test sunucusu oluşturma

Öncelikle favori cloud sağlayıcı servisimizden bir adet test sunucusu açalım. Ben vultr üzerinden 1gb ram içeren bir paket açtım. tarball kullanacağımız için ubuntu versionu servis oluşturma aşaması hariç önemli değil, hatta komple farklı bir dağıtım kullanım ona ait paketleri de resmi siteden indirebilirsiniz.

Temel güncellemeler ve araçların kurulması

apt-get update
apt-get install curl nano -y

ile temel araçlarımızı kuralım. ardından mongodb’nin sitesinden dağıtımızı uygun paketi indireceğiz. MongoDB resmi indirme sayfasına gidiyoruz. Kendi dağıtımızı ve versionu seçiyoruz ve çıkan adresi adresi wget veya curl ile indiriyoruz:

https://www.mongodb.com/download-center#community

Ubuntu 18 için şu şekilde:

çıkan adresi wget ile indiriyoruz:

wget https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-ubuntu1804-4.0.2.tgz

ardından tar ile açıyoruz:

tar -zxvf mongodb-linux-x86_64-ubuntu1804-4.0.2.tgz

Mongodb çalıştırma ve temel ayarlar

Şu aşamada mongodb çalıştırabilir olarak /root/mongodb-linux-x86_64-ubuntu1804-4.0.2/bin/dizininde bulunuyor. test için aşağıdaki komutu çalıştırabiliriz:

./mongodb-linux-x86_64-ubuntu1804-4.0.2/bin/mongod

Bu komutla mongo deamon’u yani sunucunu çalıştırmayı deniyoruz. ekran çıktısında ise /data/db dizinine erişemediğini söylüyor. Bizde böyle bir dizin yok ve mongo varsayılan olarak bu dizini kullanmaya çalışıyor. Bunu şu satırlardan anlayabiliriz:

2018-09-12T14:13:30.463+0000 I CONTROL  [initandlisten] MongoDB starting : pid=1798 port=27017 dbpath=/data/db 64-bit host=mongotest
...
2018-09-12T14:13:30.466+0000 .... Data directory /data/db not found., terminating

Çıktından da anlaşılacağı gibi veritabanı dosyalarının tutulacağı yeri --dbpath parametresi ile veriyoruz. Bu dizini kendimiz oluşturup mongodb’ye parametre olarak verelim. Kolaylık olması için root kullanıcısı için işlemleri yaptığımızdan /root/data şeklinde bir klasör oluşturup mongodb başlangıcında parametre olarak kullanalım:

mkdir /root/data
./mongodb-linux-x86_64-ubuntu1804-4.0.2/bin/mongod --dbpath /root/data

Şu aşamada mongod sunucusunun otomatik olarak sonlanmadığını ve çalışmakta olduğunu görebiliriz. Ayrı bir shell bağlantısı ile ./mongodb-linux-x86_64-ubuntu1804-4.0.2/bin/mongokomutu çalıştırarak mongo komut satırı aracına erişebiliriz. Bu aşamada show databases; gibi komutlar ile default olarak yüklü gelen mongodb veritabanlarını listeyebiliriz:

Şu aşamada iki sorun var. İlki mongod ekranında göreceğimiz gibi sunucunun uzaktan erişime kapalı olması:

İkincisi ile bağlantıyı herhangi bir kullanıcı adı şifre belirtmeden yapmış olmamız. Uzaktan erişimi açmadan önce tabi ki öncelikle veritabanının güvenliğini sağlamamız gerekiyor. Mongodb varsayılan olarak dışarıya kapalı olduğu için kendi içinde bir varsayılan kullanıcı adı şifre bulundurmuyor. Bunu admin veritabanını kullanarak kendimiz ekliyoruz.

MongoDB kullanıcı adı şifre oluşturma

Sunucuyu uzaktan erişime açmadan önce kullanıcı adı ve şifremizi belirleyelim. Bunun için admin veritabanına use ile erişip db.createUser komutunu kullanarak tam erişim yetkisi veriyoruz.

use admin;
db.createUser({ user: "admin" , pwd: "SIFRENIZ", roles: ["userAdminAnyDatabase", "dbAdminAnyDatabase", "readWriteAnyDatabase"]})

Ardından kullanıcının başarı ile oluşturulduğunu söyleyen bir mesaj alacağız.:

Var olan kullanıcı güncellemek için ise alttaki komutu kullanabiliriz:

db.updateUser("admin", { user: "admin" , pwd: "p2mezz", roles: ["userAdminAnyDatabase", "dbAdminAnyDatabase", "readWriteAnyDatabase"]})

Şu aşamada çok önemli bir nokta var. Kullanıcı adı şifreyi belirlemiş olsak bile mongodb varsayılan olarak bunları kullanmıyor. Yani şu aşamada hala kullanıcı adı şifre kullanmadan sunucuya bağlanabiliyoruz. Kullanıcı adı şifre ile denetimin sağlanması için mongodb yi –auth parametresi ile başlatmamız gerekiyor. mongod’u sonlandırıp aşağıdaki gibi başlatalım:

./mongodb-linux-x86_64-ubuntu1804-4.0.2/bin/mongod --dbpath /root/data --auth

Artık sunucuda sorgu çalıştırmak için kullanıcı adı şifre belirtmemiz gerecek. Tekrar bağlanıp deneyelim:

Şifre yazmadan komut çalıştırmayı denediğimizde Unauthorized hatası aldık. Bu güvenlik adına büyük bir ilerleme 🙂 . Peki nasıl giriş yapacağız. Eğer sunucuya bağlantıktan sonra komut satırından giriş yapmak istersek admin veritabanı üzerinde auth komutunu kullanmamız gerekiyor. Örneğin:

use admin
db.auth("admin", "123123" )

Bu aşamadan sonra başta hata aldığımız bağlantıda artık komutları sorunsuzca çalıştırabiliyoruz:

Tabi bunu her seferinde komut çalıştırarak yapmak uzun bir işlem bunun yerine bağlanırken gerekli ayarları vererek bu işlemlerin otomatik yapılmasını sağlayabiliriz:

./mongodb-linux-x86_64-ubuntu1804-4.0.2/bin/mongo localhost -u "admin" -p "123123" --authenticationDatabase "admin"

mongo localhost/admin -u admin -p 123123

Şu aşamada kullanıcı adı şifre ile güvenliği sağladık. Artık sunucuyu uzaktan erişime yani remote bağlantıya açabiliriz. Bunun için tek yapmamız gereken sunucunun 127.0.0.1 üzerinden değil 0.0.0.0 üzerinden açılmasını sağlamak.

Mongodb uzak bağlantı ve remote connection açma

Uzak bağlantı yani remote connection için sunucunun yayın yaptığı ip adresini 127.0.0.1 den 0.0.0.0 a çekmemiz gerekiyor. Bunun için –bind_ip parametresini kullanıyoruz. Sunucuyu alttaki gibi başlatarak uzak bağlantılara açık hale getirebiliriz:

./mongodb-linux-x86_64-ubuntu1804-4.0.2/bin/mongod --dbpath /root/data --auth --bind_ip 0.0.0.0

Artık Robo 3T gibi yazılımlarla sunucu bilgilerimizi girerek masaüstü sistemimizden uzak erişim sağlayabiliriz:

Şu aşamada hem uzak bağlantıyı hem de kullanıcı adı şifre güvenliğini sağlayarak kullanabilir bir mongodb veritabanı kurulumu yaptık. Tabi hala yapmamız gerekenler var. Şu an mongo’yu komut satırından doğrudan çalıştırıyoruz. Bunu bir servis yaparak sistem başlangıcına yerleştirmemiz gerekiyor. Bununla beraber şu an ayarları parametre olarak elle veriyoruz. Bunun yerine tüm ayarları tek bir config dosyasında toplayarak daha sağlıklı bir yapılandırma yapabiliriz. 

Mongodb örnek config dosyası

nano /root/mongo.conf ile örnek ayar dosyamızı oluşturup alttaki gibi yapılandıralım.

systemLog:
   destination: file
   path: "/var/log/mongod.log"
logAppend: true
storage:
dbPath: "/root/data"
journal:
enabled: false
processManagement:
fork: false

net:
bindIp: 0.0.0.0
port: 27017
setParameter:
enableLocalhostAuthBypass: false
cloud:
monitoring:
free:
state: on
security:
authorization: enabled

Mongo’yu bu ayar dosyasını kullanarak başlatmak için ise

./mongodb-linux-x86_64-ubuntu1804-4.0.2/bin/mongod --config /root/mongo.conf

komutunu kullanacağız.

Linux komut kısayolu oluşturma

Bu aşamada mongo ve mongod komutlarını uzun uzun dizin adıyla yazmaktansa symlink oluşturarak kolayca çalıştırabiliriz.

ln -s /root/mongodb-linux-x86_64-ubuntu1804-4.0.2/bin/mongo /usr/bin/mongo

Bu komuttan sonra sadece mongo yazarak komut satırına erişebiliriz.

Mongo Free Monitoring ile uzaktan sunucu izleme

Mongo’nun –enableFreeMonitoring parametresi ile açılan uzaktan cloud üzerinden sunucunuzun performansını ve durumunu izleme özelliği var. Size bir url veriyor ve o adresten performansı görüntüleyebiliyorsunuz. Bu parametre ile başlattığınızda doğrudan adresi alabiliyorsunuz. Hazırladığımız config doyasında da bu ayar açık durumda. db.getFreeMonitoringStatus()  ve db.serverStatus() komutlarıyla bu url’ye ulaşabilirsiniz.

Systemd servisi ile mongodb’yi sistem başlangıcına yerleştirme

Son aşama artık mongodb’yi sistem başlangıcına servis olarak eklemek oluyor. Bunun için alttaki gibi bir systemd servisi oluşturabiliriz. 

nano /etc/systemd/system/mongo.service

ayarları alttaki gibi yapabiliriz:

[Unit]
Description=mongo
Requires=local-fs.target network-online.target
After=local-fs.target network-online.target

[Service]
Type=simple
ExecStart= /root/mongodb-linux-x86_64-ubuntu1804-4.0.2/bin/mongod --config /root/mongo.conf
WorkingDirectory=/root/mongodb-linux-x86_64-ubuntu1804-4.0.2/bin/
Restart=always
RestartSec=10
[Install]
WantedBy=multi-user.target

Ardından systemctl enable mongo ile servisi başlangıca alıp systemctl start mongo ile başlatabiliriz.

mongodb ile aggregation – aggregate örnek sorgu

MongoDB elimizdeki veriler ile gruplandırma ve bu gruplar üzerinde işlem yapıp sonuçları projeksiyon etme özelliğine de sahip. Neredeyse SQL’de yaptığımız her şeyi yapabiliyoruz. Hatta JSON ve BSON dökümanların yapısını düşünürsek iç içe veriler için çok daha karmaşık sorgular gerekiyor. Alttaki örnekte domains koleksiyonundaki array olarak tutulan keywords alanını açıyoruz ve tüm sonuçları döndürüyoruz.

db.getCollection('domains').aggregate([
{$unwind:"$keywords"},
{$group:{_id:null, keywords: {$push : "$keywords"} }},
{$project:{_id:0, keywords: "$keywords"}}
])

Bir cevap yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir