Merhabalar,
“Linux Öğreniyorum”, “Kubernetes Öğreniyorum” serileri devam ederken, bu serilere “MongoDB Öğreniyorum” serisini de eklemeye karar verdim.
Veritabanı, bilgiyi anlamlı bir yapıda düzenleyen, ihtiyaç duyulduğunda saniyeler içinde erişim sağlayan dijital bir mekanizmadır. Bu, günümüzde sağlık, bankacılık ve e-ticaret gibi her sektörde vazgeçilmez bir rol oynar.
Günümüz dünyasında veri çeşitliliği ve büyüklüğü arttıkça, modern veritabanlarının esnekliği ve performansı daha da önemli hale geliyor. MongoDB, bu ihtiyaçlara yanıt verebilecek güçlü bir araçtır. Bu seride, temel kavramlardan başlayarak MongoDB’nin sunduğu avantajları ve kullanım alanlarını detaylı bir şekilde ele alacağız.
Daha önceden yazdığım kapsamlı Veritabanı makalelerin linklerini de aşağıda paylaşıyorum. Gerçekten çok faydalı bilgiler içeriyor. En Temel yapı taşlarından başlayarak detaylı bir anlatım yaptığım bu makaleleri okumanızı şiddetle öneriyorum.
Bu yazımda yine giriş niteliğinde Veritabanı nedir? Neden önemlidir? Ne için kullanmamız gerekiyor sorularına cevap bulacağız.
Veritabanı Nedir ve Neden Önemlidir?
Bir veritabanı (database), bilgilerin sistematik bir şekilde depolanmasını ve erişilmesini sağlayan dijital bir mekanizmadır. Temel amacı, verilerin anlamlı bir yapıda tutulmasını, gerektiğinde hızlı ve güvenilir bir şekilde erişilmesini sağlamaktır. Veri, bugün dünyanın en değerli kaynağı olarak kabul edilir ve veritabanları, bu kaynağı yönetmek için geliştirilmiş araçlardır.
Neden Önemlidir?
Bilginin Yönetimi ve Organizasyonu:
Modern dünyada veriler, işletmelerin, devletlerin ve bireylerin karar alma süreçlerinin merkezindedir. Veritabanları, bu bilginin yönetimi için vazgeçilmezdir.
Örneğin, sağlık sektörü, hasta kayıtlarından ilaç üretimine kadar her alanda veritabanlarına bağımlıdır. COVID-19 aşısının geliştirilmesi ve dağıtımı sırasında, milyarlarca dozun izlenmesi veritabanları sayesinde mümkün oldu. Aşı lojistiği, üretim verileri ve klinik test süreçlerinin izlenmesi, RDBMS ve NoSQL veritabanlarının hibrit bir yaklaşımıyla mümkün olmuştur.
Bir hastane sisteminin milyarlarca hasta kaydını hızlı ve güvenilir bir şekilde saklamalıdır. İşte burada veritabanları devreye girer.
Amazon’un öneri sisteminin saniyeler içinde size doğru ürünü önerebilmesi için, veri türüne göre birden fazla farklı veritabanlarını kullanır.
Verinin Erişilebilirliği:
Veritabanları, ihtiyaç duyulan bilginin saniyeler içinde erişilmesini sağlar. Geleneksel dosya sistemlerinin aksine, büyük miktarda veriyi düzenlemek ve aramak için optimize edilmiştir.
Mesela, Amazon gibi e-ticaret devleri, milyarlarca ürünün detaylarını bir araya getirerek, kullanıcıların saniyeler içinde doğru ürüne ulaşmasını sağlar. Amazon’un ürün tavsiye motoru, kullanıcı verilerini analiz etmek için hem RDBMS hem de NoSQL çözümlerini birlikte kullanır. NoSQL, büyük hacimli kullanıcı etkileşim verilerini işlerken RDBMS, envanter gibi yapılandırılmış veriler için tercih edilir.
Tutarlılık ve Doğruluk:
Veritabanları, verilerin güncel ve doğru olmasını sağlar. Bankacılık sistemlerinde, aynı anda birden fazla işlem gerçekleştiğinde bile tutarlılık korunur.
Örneğin, bir banka ATM’sinden para çekerken, hesabınızdaki tutar anında güncellenir ve bu bilgi tüm sistemle eşzamanlı olarak paylaşılır. Örneğin, bankalar, MongoDB’yi ATM işlemlerinde müşteri doğrulama verilerini hızlıca çekmek için kullanırken, işlemlerin kaydı için RDBMS’ten faydalanır. Bu kombinasyon, hem hız hem de veri tutarlılığı sağlar.
Veritabanlarının Evrimi:
1960’lar: Dosya Tabanlı Sistemler
İlk veri yönetimi sistemleri, dosya tabanlıydı. Ancak bu sistemlerde veriler düz dosyalarda tutulduğu için:
Arama, düzenleme ve güncelleme işlemleri zordu.
Veri tekrarı yaygındı ve tutarsızlık sorunları sıklıkla yaşanıyordu.
Bir dosya tabanlı sistemde, müşteri adlarının listesi ve sipariş detayları ayrı dosyalarda tutuluyordu. Bu yaklaşım, bir müşteriyle ilgili siparişleri bulmayı karmaşık hale getiriyordu. Ayrıca, veri tekrarı ve tutarsızlık çok yaygındı.
1970’ler: İlişkisel Modelin Doğuşu (RDBMS)
Edgar F. Codd’un 1970’te önerdiği ilişkisel model, veri yönetiminde devrim yarattı. Bu model, verilerin tablolar (sütunlar ve satırlar) şeklinde düzenlenmesine olanak tanıdı. İlişkisel veritabanları (RDBMS), verilerin kolayca erişilmesini, düzenlenmesini ve analiz edilmesini sağladı.
Örneğin, Oracle, MySQL, PostgreSQL gibi RDBMS’ler, bu dönemde ortaya çıktı. Oracle gibi devlerin başarısının temelinde bu model yer aldı.
2000’ler: Büyük Veri ve NoSQL’in Yükselişi
İnternetin yaygınlaşması ve dijitalleşme, geleneksel RDBMS sistemlerinin ölçeklenebilirlik ve esneklik açısından yetersiz kalmasına neden oldu. Bu, NoSQL (Not Only SQL) veritabanlarının yükselişiyle sonuçlandı. NoSQL, esnek yapısı ve yatayda kolayca ölçeklenebilir olmasıyla büyük veri ve modern uygulamalar için ideal hale geldi.
MongoDB, Cassandra, Couchbase gibi sistemler bu ihtiyacı karşılamak için geliştirildi.
Günümüzde, Netflix, YouTube ve Instagram gibi şirketler, kullanıcıların videolarını, beğenilerini, yorumlarını ve kişisel profillerini saklamak için NoSQL çözümleri kullanıyor. Bu, hem büyük veriyle başa çıkmalarını hem de kullanıcı deneyimini iyileştirmelerini sağlıyor.
RDBMS’den NoSQL’e Geçiş: Neden?
Veri Çeşitliliği:
Geleneksel RDBMS’ler, genellikle yapılandırılmış (structured) verilerle çalışmaya uygundur. Ancak modern uygulamalar, yapılandırılmamış (unstructured) veya yarı yapılandırılmış (semi-structured) verilerle sıkça çalışır.
Örneğin, sosyal medya gönderileri, videolar, IoT cihazlarından gelen sensör verileri gibi.
Şema Esnekliği:
RDBMS sistemlerinde, tablo yapısında herhangi bir değişiklik yapmak zahmetlidir ve tüm veri yapısını etkileyebilir. NoSQL ise şema esnekliği sunar.
Örneğin, bir e-ticaret uygulamasında, farklı ürün kategorileri için farklı veri yapıları gerektiğinde NoSQL daha uygundur.
Yatay Ölçeklenebilirlik:
RDBMS’ler genelde dikeyde ölçeklenir (daha güçlü bir sunucuya geçmek). NoSQL ise yatayda ölçeklenebilir; yani, birden fazla sunucuya veri dağıtarak kapasite artırılabilir.
Örneğin, Amazon gibi devasa sistemlerde, veri taleplerini karşılamak için yatay ölçeklenebilirlik bir zorunluluktur.
MongoDB’nin Öne Çıkan Özellikleri:
Esnek Veri Modeli:
MongoDB, JSON benzeri belgelerle (documents) çalışır. Bu, birbirinden farklı veri türlerini aynı koleksiyonda tutmayı kolaylaştırır.
Bir müşterinin temel bilgileri, adresleri ve satın alma geçmişi aynı belgede saklanabilir.
Hız ve Performans:
Yüksek hacimli okuma ve yazma işlemleri için optimize edilmiştir.
Örneğin, Uber, dinamik fiyatlandırma ve sürücü eşleştirme sistemlerinde MongoDB kullanıyor.
Küresel Ölçeklenebilirlik:
MongoDB, birden fazla veri merkezine yayılabilir ve küresel kullanıcı tabanlarına hizmet verebilir.
Örneğin Facebook, mesajlaşma altyapısında MongoDB kullanarak milyonlarca kullanıcıya eşzamanlı hizmet sunar.
Kolay Entegrasyon:
Modern programlama dilleri ve mikro hizmet mimarileriyle kolayca entegre olabilir. Geliştiricilerin hızlı prototip oluşturmasına ve esnek uygulamalar geliştirmesine olanak tanır.
Şimdi bu kadar sözden sonra sistemimiz üzerinde MongoDB kurulum adımlarımıza geçebiliriz. Yapacağımız “standalone” kurulum, temel bilgileri üzerinde öğrenmemiz için başlangıçta yeterli olacaktır.
[rocky@instance-20241019-1038 ~]$ su – asiye
Password:
Last login: Sat Nov 23 12:49:35 UTC 2024 on pts/0
[asiye@instance-20241019-1038 ~]$ sudo -l
Matching Defaults entries for asiye on instance-20241019-1038:
!visiblepw, always_set_home, match_group_by_gid, always_query_group_plugin, env_reset, env_keep=”COLORS DISPLAY HOSTNAME
HISTSIZE KDEDIR LS_COLORS”, env_keep+=”MAIL PS1 PS2 QTDIR USERNAME LANG LC_ADDRESS LC_CTYPE”, env_keep+=”LC_COLLATE
LC_IDENTIFICATION LC_MEASUREMENT LC_MESSAGES”, env_keep+=”LC_MONETARY LC_NAME LC_NUMERIC LC_PAPER LC_TELEPHONE”,
env_keep+=”LC_TIME LC_ALL LANGUAGE LINGUAS _XKB_CHARSET XAUTHORITY”, secure_path=/sbin\:/bin\:/usr/sbin\:/usr/bin
User asiye may run the following commands on instance-20241019-1038:
(ALL) NOPASSWD: ALL
[asiye@instance-20241019-1038 ~]$
Yukarda olan komutlarla Sistemimize “asiye” kullanıcısı ile giriş yaptık ve “sudo” yetkimizi kontrol ettik.
[asiye@instance-20241019-1038 ~]$ sudo dnf update -y
Last metadata expiration check: 2:06:36 ago on Sat Nov 23 11:08:42 2024.
Dependencies resolved.
====================================================================================================================================
Package Architecture Version Repository Size
====================================================================================================================================
Installing:
kernel x86_64 5.14.0-503.14.1.el9_5 baseos 2.0 M
Upgrading:
NetworkManager x86_64 1:1.48.10-2.el9_5 baseos 2.3 M
…
kernel-core-5.14.0-503.14.1.el9_5.x86_64 kernel-modules-5.14.0-503.14.1.el9_5.x86_64
kernel-modules-core-5.14.0-503.14.1.el9_5.x86_64 libatomic-11.5.0-2.el9.x86_64
liburing-2.5-1.el9.x86_64 oniguruma-6.9.6-1.el9.6.x86_64
python3-file-magic-5.39-16.el9.noarch systemd-boot-unsigned-252-46.el9_5.2.0.1.x86_64
Complete!
[asiye@instance-20241019-1038 ~]$
[asiye@instance-20241019-1038 ~]$ sudo mkdir -p /usr/share/keyrings
[asiye@instance-20241019-1038 ~]$ curl -fsSL https://pgp.mongodb.com/server-6.0.asc -o mongodb-server-6.0.asc
[asiye@instance-20241019-1038 ~]$ sudo gpg –dearmor -o /usr/share/keyrings/mongodb-server-6.0.gpg mongodb-server-6.0.asc
[asiye@instance-20241019-1038 ~]$ ls -l /usr/share/keyrings/mongodb-server-6.0.gpg
-rw-r–r–. 1 root root 1162 Nov 23 13:33 /usr/share/keyrings/mongodb-server-6.0.gpg
[asiye@instance-20241019-1038 ~]$ echo “[mongodb-org-6.0]
name=MongoDB Repository
baseurl=https://repo.mongodb.org/yum/redhat/8/mongodb-org/6.0/x86_64/
gpgcheck=1
enabled=1
gpgkey=file:///usr/share/keyrings/mongodb-server-6.0.gpg” | sudo tee /etc/yum.repos.d/mongodb-org-6.0.repo
[mongodb-org-6.0]
name=MongoDB Repository
baseurl=https://repo.mongodb.org/yum/redhat/8/mongodb-org/6.0/x86_64/
gpgcheck=1
enabled=1
gpgkey=file:///usr/share/keyrings/mongodb-server-6.0.gpg
[asiye@instance-20241019-1038 ~]$
[asiye@instance-20241019-1038 ~]$ sudo dnf install -y mongodb-org
MongoDB Repository 152 kB/s | 73 kB 00:00
Dependencies resolved.
====================================================================================================================================
Package Architecture Version Repository Size
====================================================================================================================================
Installing:
mongodb-org x86_64 6.0.19-1.el8 mongodb-org-6.0 9.5 k
Installing dependencies:
compat-openssl11 x86_64 1:1.1.1k-4.el9_0 appstream 1.5 M
mongodb-database-tools x86_64 100.10.0-1 mongodb-org-6.0 25 M
mongodb-mongosh x86_64 2.3.3-1.el8 mongodb-org-6.0 56 M
mongodb-org-database x86_64 6.0.19-1.el8 mongodb-org-6.0 9.6 k
mongodb-org-database-tools-extra x86_64 6.0.19-1.el8 mongodb-org-6.0 15 k
mongodb-org-mongos x86_64 6.0.19-1.el8 mongodb-org-6.0 22 M
mongodb-org-server x86_64 6.0.19-1.el8 mongodb-org-6.0 31 M
mongodb-org-tools x86_64 6.0.19-1.el8 mongodb-org-6.0 9.5 k
Transaction Summary
====================================================================================================================================
Install 9 Packages
Total download size: 136 M
Installed size: 571 M
Downloading Packages:
(1/9): mongodb-database-tools-100.10.0-1.x86_64.rpm 57 MB/s | 25 MB 00:00
(2/9): mongodb-org-6.0.19-1.el8.x86_64.rpm 21 kB/s | 9.5 kB 00:00
(3/9): mongodb-org-database-6.0.19-1.el8.x86_64.rpm 88 kB/s | 9.6 kB 00:00
(4/9): mongodb-org-database-tools-extra-6.0.19-1.el8.x86_64.rpm 128 kB/s | 15 kB 00:00
(5/9): mongodb-org-mongos-6.0.19-1.el8.x86_64.rpm 46 MB/s | 22 MB 00:00
(6/9): mongodb-org-server-6.0.19-1.el8.x86_64.rpm 40 MB/s | 31 MB 00:00
(7/9): mongodb-org-tools-6.0.19-1.el8.x86_64.rpm 31 kB/s | 9.5 kB 00:00
(8/9): mongodb-mongosh-2.3.3.x86_64.rpm 30 MB/s | 56 MB 00:01
(9/9): compat-openssl11-1.1.1k-4.el9_0.x86_64.rpm 2.3 MB/s | 1.5 MB 00:00
————————————————————————————————————————————
Total 64 MB/s | 136 MB 00:02
MongoDB Repository 1.1 MB/s | 1.1 kB 00:00
Importing GPG key 0x64C3C388:
Userid : “MongoDB 6.0 Release Signing Key <packaging@mongodb.com>”
Fingerprint: 39BD 841E 4BE5 FB19 5A65 400E 6A26 B1AE 64C3 C388
From : /usr/share/keyrings/mongodb-server-6.0.gpg
Key imported successfully
Running transaction check
Transaction check succeeded.
Running transaction test
Transaction test succeeded.
Running transaction
Preparing : 1/1
Installing : compat-openssl11-1:1.1.1k-4.el9_0.x86_64 1/9
Installing : mongodb-org-database-tools-extra-6.0.19-1.el8.x86_64 2/9
Installing : mongodb-org-mongos-6.0.19-1.el8.x86_64 3/9
Running scriptlet: mongodb-org-server-6.0.19-1.el8.x86_64 4/9
Installing : mongodb-org-server-6.0.19-1.el8.x86_64 4/9
Running scriptlet: mongodb-org-server-6.0.19-1.el8.x86_64 4/9
Created symlink /etc/systemd/system/multi-user.target.wants/mongod.service → /usr/lib/systemd/system/mongod.service.
Installing : mongodb-org-database-6.0.19-1.el8.x86_64 5/9
Installing : mongodb-mongosh-2.3.3-1.el8.x86_64 6/9
Running scriptlet: mongodb-database-tools-100.10.0-1.x86_64 7/9
Installing : mongodb-database-tools-100.10.0-1.x86_64 7/9
Running scriptlet: mongodb-database-tools-100.10.0-1.x86_64 7/9
Installing : mongodb-org-tools-6.0.19-1.el8.x86_64 8/9
Installing : mongodb-org-6.0.19-1.el8.x86_64 9/9
Running scriptlet: mongodb-org-6.0.19-1.el8.x86_64 9/9
Verifying : mongodb-database-tools-100.10.0-1.x86_64 1/9
Verifying : mongodb-mongosh-2.3.3-1.el8.x86_64 2/9
Verifying : mongodb-org-6.0.19-1.el8.x86_64 3/9
Verifying : mongodb-org-database-6.0.19-1.el8.x86_64 4/9
Verifying : mongodb-org-database-tools-extra-6.0.19-1.el8.x86_64 5/9
Verifying : mongodb-org-mongos-6.0.19-1.el8.x86_64 6/9
Verifying : mongodb-org-server-6.0.19-1.el8.x86_64 7/9
Verifying : mongodb-org-tools-6.0.19-1.el8.x86_64 8/9
Verifying : compat-openssl11-1:1.1.1k-4.el9_0.x86_64 9/9
Installed:
compat-openssl11-1:1.1.1k-4.el9_0.x86_64 mongodb-database-tools-100.10.0-1.x86_64
mongodb-mongosh-2.3.3-1.el8.x86_64 mongodb-org-6.0.19-1.el8.x86_64
mongodb-org-database-6.0.19-1.el8.x86_64 mongodb-org-database-tools-extra-6.0.19-1.el8.x86_64
mongodb-org-mongos-6.0.19-1.el8.x86_64 mongodb-org-server-6.0.19-1.el8.x86_64
mongodb-org-tools-6.0.19-1.el8.x86_64
Complete!
[asiye@instance-20241019-1038 ~]$
[asiye@instance-20241019-1038 ~]$ sudo systemctl start mongod
[asiye@instance-20241019-1038 ~]$ sudo systemctl enable mongod
[asiye@instance-20241019-1038 ~]$ sudo systemctl status mongod
- mongod.service – MongoDB Database Server
Loaded: loaded (/usr/lib/systemd/system/mongod.service; enabled; preset: disabled)
Active: active (running) since Sat 2024-11-23 13:36:23 UTC; 1min 11s ago
Docs: https://docs.mongodb.org/manual
Main PID: 67775 (mongod)
Memory: 65.4M
CPU: 464ms
CGroup: /system.slice/mongod.service
└─67775 /usr/bin/mongod -f /etc/mongod.conf
Nov 23 13:36:23 instance-20241019-1038 systemd[1]: Started MongoDB Database Server.
Nov 23 13:36:23 instance-20241019-1038 mongod[67775]: {“t”:{“$date”:”2024-11-23T13:36:23.048Z”},”s”:”I”, “c”:”CONTROL”, “id”:7484>
[asiye@instance-20241019-1038 ~]$
Buraya kadar yapılanları özetlemek istiyorum.
MongoDB’nin Rocky Linux üzerine kurulumu için ilk olarak sistemdeki mevcut paketlerin güncel olduğundan emin olmak amacıyla sudo dnf update -y komutunu kullandık. Bu adım, herhangi bir bağımlılık sorununu önlemek için önemlidir. Daha sonra MongoDB’nin resmi GPG anahtarını eklemek için /usr/share/keyrings dizinini sudo mkdir -p /usr/share/keyrings komutuyla oluşturduk. MongoDB’nin GPG anahtarını curl -fsSL https://pgp.mongodb.com/server-6.0.asc -o mongodb-server-6.0.asc komutuyla indirip, sudo gpg –dearmor -o /usr/share/keyrings/mongodb-server-6.0.gpg mongodb-server-6.0.asc komutuyla uygun bir formatta dönüştürerek güvenilir bir şekilde kaydettik.
Sonraki adımda, MongoDB’nin deposunu tanımlamak için /etc/yum.repos.d/mongodb-org-6.0.repo dosyasını oluşturduk ve şu yapılandırmayı ekledik:
[mongodb-org-6.0]
name=MongoDB Repository
baseurl=https://repo.mongodb.org/yum/redhat/8/mongodb-org/6.0/x86_64/
gpgcheck=1
enabled=1
gpgkey=file:///usr/share/keyrings/mongodb-server-6.0.gpg
Bu yapılandırma, sistemin MongoDB paketlerini doğru bir şekilde tanıyıp yükleyebilmesini sağladı. Ardından sudo dnf install -y mongodb-org komutunu kullanarak MongoDB’nin tüm bileşenlerini başarıyla yükledik. Bu süreçte MongoDB Server, Mongo Shell, veri tabanı araçları ve ek bileşenlerin sistemime kurulduğunu doğruladık.
Kurulum tamamlandıktan sonra MongoDB hizmetini sudo systemctl start mongod komutuyla başlattık ve sudo systemctl enable mongod komutuyla sistem açıldığında otomatik olarak çalışacak şekilde etkinleştirdik. MongoDB’nin başarılı bir şekilde çalıştığını doğrulamak için sudo systemctl status mongod komutunu kullandık ve hizmetin “active (running)” durumunda olduğunu gördük. Böylece MongoDB, Rocky Linux üzerinde sorunsuz bir şekilde kurulmuş ve kullanıma hazır hale gelmiş oldu.
[asiye@instance-20241019-1038 ~]$ grep bin /etc/mongod.conf
bindIp: 127.0.0.1 # Enter 0.0.0.0,:: to bind to all IPv4 and IPv6 addresses or, alternatively, use the net.bindIpAll setting.
[asiye@instance-20241019-1038 ~]$
[asiye@instance-20241019-1038 ~]$ grep bin /etc/mongod.conf
bindIp: 0.0.0.0 # Enter 0.0.0.0,:: to bind to all IPv4 and IPv6 addresses or, alternatively, use the net.bindIpAll setting.
[asiye@instance-20241019-1038 ~]$
[asiye@instance-20241019-1038 ~]$ sudo systemctl restart mongod
[asiye@instance-20241019-1038 ~]$ sudo systemctl status mongod
- mongod.service – MongoDB Database Server
Loaded: loaded (/usr/lib/systemd/system/mongod.service; enabled; preset: disabled)
Active: active (running) since Sat 2024-11-23 14:09:43 UTC; 14s ago
Docs: https://docs.mongodb.org/manual
Main PID: 72580 (mongod)
Memory: 164.8M
CPU: 374ms
CGroup: /system.slice/mongod.service
└─72580 /usr/bin/mongod -f /etc/mongod.conf
Nov 23 14:09:43 instance-20241019-1038 systemd[1]: Started MongoDB Database Server.
Nov 23 14:09:43 instance-20241019-1038 mongod[72580]: {“t”:{“$date”:”2024-11-23T14:09:43.873Z”},”s”:”I”, “c”:”CONTROL”, “id”:7484>
[asiye@instance-20241019-1038 ~]$
[asiye@instance-20241019-1038 ~]$ sudo dnf install -y firewalld
Last metadata expiration check: 0:35:59 ago on Sat Nov 23 13:35:18 2024.
Dependencies resolved.
====================================================================================================================================
Package Architecture Version Repository Size
====================================================================================================================================
Installing:
firewalld noarch 1.3.4-7.el9 baseos 453 k
Installing dependencies:
firewalld-filesystem noarch 1.3.4-7.el9 baseos 8.7 k
ipset x86_64 7.11-8.el9 baseos 42 k
ipset-libs x86_64 7.11-8.el9 baseos 69 k
iptables-nft x86_64 1.8.10-4.el9_4 baseos 186 k
libnftnl x86_64 1.2.6-4.el9_4 baseos 87 k
nftables x86_64 1:1.0.9-3.el9 baseos 421 k
python3-firewall noarch 1.3.4-7.el9 baseos 355 k
python3-nftables x86_64 1:1.0.9-3.el9 baseos 21 k
Installing weak dependencies:
libcap-ng-python3 x86_64 0.8.2-7.el9 appstream 29 k
Transaction Summary
====================================================================================================================================
Install 10 Packages
Total download size: 1.6 M
Installed size: 6.4 M
Downloading Packages:
(1/10): firewalld-filesystem-1.3.4-7.el9.noarch.rpm 104 kB/s | 8.7 kB 00:00
(2/10): python3-firewall-1.3.4-7.el9.noarch.rpm 3.0 MB/s | 355 kB 00:00
(3/10): firewalld-1.3.4-7.el9.noarch.rpm 3.7 MB/s | 453 kB 00:00
(4/10): iptables-nft-1.8.10-4.el9_4.x86_64.rpm 3.7 MB/s | 186 kB 00:00
(5/10): ipset-libs-7.11-8.el9.x86_64.rpm 1.7 MB/s | 69 kB 00:00
(6/10): libnftnl-1.2.6-4.el9_4.x86_64.rpm 1.8 MB/s | 87 kB 00:00
(7/10): ipset-7.11-8.el9.x86_64.rpm 1.1 MB/s | 42 kB 00:00
(8/10): libcap-ng-python3-0.8.2-7.el9.x86_64.rpm 1.7 MB/s | 29 kB 00:00
(9/10): python3-nftables-1.0.9-3.el9.x86_64.rpm 475 kB/s | 21 kB 00:00
(10/10): nftables-1.0.9-3.el9.x86_64.rpm 9.0 MB/s | 421 kB 00:00
————————————————————————————————————————————
Total 3.0 MB/s | 1.6 MB 00:00
Running transaction check
Transaction check succeeded.
Running transaction test
Transaction test succeeded.
Running transaction
Running scriptlet: firewalld-1.3.4-7.el9.noarch 1/1
Preparing : 1/1
Installing : libnftnl-1.2.6-4.el9_4.x86_64 1/10
Installing : iptables-nft-1.8.10-4.el9_4.x86_64 2/10
Running scriptlet: iptables-nft-1.8.10-4.el9_4.x86_64 2/10
Installing : nftables-1:1.0.9-3.el9.x86_64 3/10
Running scriptlet: nftables-1:1.0.9-3.el9.x86_64 3/10
Installing : python3-nftables-1:1.0.9-3.el9.x86_64 4/10
Installing : python3-firewall-1.3.4-7.el9.noarch 5/10
Installing : libcap-ng-python3-0.8.2-7.el9.x86_64 6/10
Installing : ipset-libs-7.11-8.el9.x86_64 7/10
Installing : ipset-7.11-8.el9.x86_64 8/10
Installing : firewalld-filesystem-1.3.4-7.el9.noarch 9/10
Installing : firewalld-1.3.4-7.el9.noarch 10/10
Running scriptlet: firewalld-1.3.4-7.el9.noarch 10/10
Created symlink /etc/systemd/system/dbus-org.fedoraproject.FirewallD1.service → /usr/lib/systemd/system/firewalld.service.
Created symlink /etc/systemd/system/multi-user.target.wants/firewalld.service → /usr/lib/systemd/system/firewalld.service.
Verifying : python3-firewall-1.3.4-7.el9.noarch 1/10
Verifying : firewalld-filesystem-1.3.4-7.el9.noarch 2/10
Verifying : firewalld-1.3.4-7.el9.noarch 3/10
Verifying : iptables-nft-1.8.10-4.el9_4.x86_64 4/10
Verifying : libnftnl-1.2.6-4.el9_4.x86_64 5/10
Verifying : ipset-libs-7.11-8.el9.x86_64 6/10
Verifying : ipset-7.11-8.el9.x86_64 7/10
Verifying : python3-nftables-1:1.0.9-3.el9.x86_64 8/10
Verifying : nftables-1:1.0.9-3.el9.x86_64 9/10
Verifying : libcap-ng-python3-0.8.2-7.el9.x86_64 10/10
Installed:
firewalld-1.3.4-7.el9.noarch firewalld-filesystem-1.3.4-7.el9.noarch ipset-7.11-8.el9.x86_64
ipset-libs-7.11-8.el9.x86_64 iptables-nft-1.8.10-4.el9_4.x86_64 libcap-ng-python3-0.8.2-7.el9.x86_64
libnftnl-1.2.6-4.el9_4.x86_64 nftables-1:1.0.9-3.el9.x86_64 python3-firewall-1.3.4-7.el9.noarch
python3-nftables-1:1.0.9-3.el9.x86_64
Complete!
[asiye@instance-20241019-1038 ~]$
[asiye@instance-20241019-1038 ~]$ sudo systemctl start firewalld
[asiye@instance-20241019-1038 ~]$
[asiye@instance-20241019-1038 ~]$
[asiye@instance-20241019-1038 ~]$ sudo systemctl enable firewalld
[asiye@instance-20241019-1038 ~]$ sudo systemctl status firewalld
- firewalld.service – firewalld – dynamic firewall daemon
Loaded: loaded (/usr/lib/systemd/system/firewalld.service; enabled; preset: enabled)
Active: active (running) since Sat 2024-11-23 14:11:55 UTC; 25s ago
Docs: man:firewalld(1)
Main PID: 73362 (firewalld)
Tasks: 2 (limit: 48626)
Memory: 22.3M
CPU: 263ms
CGroup: /system.slice/firewalld.service
└─73362 /usr/bin/python3 -s /usr/sbin/firewalld –nofork –nopid
Nov 23 14:11:55 instance-20241019-1038 systemd[1]: Starting firewalld – dynamic firewall daemon…
Nov 23 14:11:55 instance-20241019-1038 systemd[1]: Started firewalld – dynamic firewall daemon.
[asiye@instance-20241019-1038 ~]$
[asiye@instance-20241019-1038 ~]$ sudo firewall-cmd –zone=public –add-port=27017/tcp –permanent
success
[asiye@instance-20241019-1038 ~]$ sudo firewall-cmd –reload
success
[asiye@instance-20241019-1038 ~]$
[asiye@instance-20241019-1038 ~]$ sudo firewall-cmd –list-all
public (active)
target: default
icmp-block-inversion: no
interfaces: eth0
sources:
services: cockpit dhcpv6-client ssh
ports: 27017/tcp
protocols:
forward: yes
masquerade: no
forward-ports:
source-ports:
icmp-blocks:
rich rules:
[asiye@instance-20241019-1038 ~]$
[asiye@instance-20241019-1038 ~]$ ip addr show
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 9000 qdisc fq_codel state UP group default qlen 1000
link/ether 02:00:17:01:27:4e brd ff:ff:ff:ff:ff:ff
altname enp0s3
altname ens3
inet 10.0.0.218/24 brd 10.0.0.255 scope global dynamic noprefixroute eth0
valid_lft 71073sec preferred_lft 71073sec
inet6 fe80::17ff:fe01:274e/64 scope link noprefixroute
valid_lft forever preferred_lft forever
[asiye@instance-20241019-1038 ~]$ mongosh –host 10.0.0.218 –port 27017
Current Mongosh Log ID: 6741e455c36170137bc1c18b
Connecting to: mongodb://10.0.0.218:27017/?directConnection=true&appName=mongosh+2.3.3
Using MongoDB: 6.0.19
Using Mongosh: 2.3.3
For mongosh info see: https://www.mongodb.com/docs/mongodb-shell/
To help improve our products, anonymous usage data is collected and sent to MongoDB periodically (https://www.mongodb.com/legal/privacy-policy).
You can opt-out by running the disableTelemetry() command.
——
The server generated these startup warnings when booting
2024-11-23T14:09:44.196+00:00: Access control is not enabled for the database. Read and write access to data and configuration is unrestricted
2024-11-23T14:09:44.197+00:00: vm.max_map_count is too low
——
test>
“vm.max_map_count is too low” uyarısını ortadan kaldıralım. Bu uyarı, MongoDB’nin çalışması için önerilen sistem yapılandırma ayarlarının eksik olduğunu gösterir. vm.max_map_count ayarı, MongoDB’nin sanal bellek haritalarını yönetmek için kullandığı bir çekirdek parametresidir. Bu değeri uygun bir seviyeye ayarlayın. MongoDB için önerilen minimum değer 262144’tür.
[asiye@instance-20241019-1038 ~]$ sudo sysctl -w vm.max_map_count=262144
vm.max_map_count = 262144
[asiye@instance-20241019-1038 ~]$
[asiye@instance-20241019-1038 ~]$ cat /etc/sysctl.conf
# sysctl settings are defined through files in
# /usr/lib/sysctl.d/, /run/sysctl.d/, and /etc/sysctl.d/.
#
# Vendors settings live in /usr/lib/sysctl.d/.
# To override a whole file, create a new file with the same in
# /etc/sysctl.d/ and put new settings there. To override
# only specific settings, add a file with a lexically later
# name in /etc/sysctl.d/ and put new settings there.
#
# For more information, see sysctl.conf(5) and sysctl.d(5).
[asiye@instance-20241019-1038 ~]$
[asiye@instance-20241019-1038 ~]$ sudo vi /etc/sysctl.conf
[asiye@instance-20241019-1038 ~]$ cat /etc/sysctl.conf
# sysctl settings are defined through files in
# /usr/lib/sysctl.d/, /run/sysctl.d/, and /etc/sysctl.d/.
#
# Vendors settings live in /usr/lib/sysctl.d/.
# To override a whole file, create a new file with the same in
# /etc/sysctl.d/ and put new settings there. To override
# only specific settings, add a file with a lexically later
# name in /etc/sysctl.d/ and put new settings there.
#
# For more information, see sysctl.conf(5) and sysctl.d(5).
#The parameter is added for MongoDB
#start
vm.max_map_count=262144
#stop
[asiye@instance-20241019-1038 ~]$
[asiye@instance-20241019-1038 ~]$ sudo sysctl -p
vm.max_map_count = 262144
[asiye@instance-20241019-1038 ~]$
MongoDB’nin sağlıklı çalışması için gereken vm.max_map_count parametresini uygun bir değere ayarladık. Öncelikle, mevcut oturum için geçici bir çözüm olarak sudo sysctl -w vm.max_map_count=262144 komutuyla bu parametreyi güncelledik. Ancak bu ayarın kalıcı olması için /etc/sysctl.conf dosyasını düzenledik ve dosyanın sonuna vm.max_map_count=262144 satırını ekledik. Değişikliklerin anında etkili olması için sudo sysctl -p komutunu çalıştırarak sistem yapılandırmasını yeniden yükledik. Bu işlemlerle birlikte MongoDB, önerilen parametre değeriyle çalışacak şekilde yapılandırılmış oldu.
“Access control is not enabled for the database” uyarısının anlamı MongoDB’de şu anda kimlik doğrulama (authentication) devre dışı. Bu, herkesin şifre gerekmeksizin veritabanınıza bağlanabileceği anlamına gelir.
MongoDB’de kimlik doğrulamayı etkinleştirerek yalnızca yetkili kullanıcıların veritabanına erişebilmesini sağlayabilirsiniz.
[asiye@instance-20241019-1038 ~]$ grep security /etc/mongod.conf
#security:
[asiye@instance-20241019-1038 ~]$
[asiye@instance-20241019-1038 ~]$ sudo vi /etc/mongod.conf
[asiye@instance-20241019-1038 ~]$
[asiye@instance-20241019-1038 ~]$ grep -v “#” /etc/mongod.conf
systemLog:
destination: file
logAppend: true
path: /var/log/mongodb/mongod.log
storage:
dbPath: /var/lib/mongo
journal:
enabled: true
processManagement:
timeZoneInfo: /usr/share/zoneinfo
net:
port: 27017
security:
authorization: enabled
[asiye@instance-20241019-1038 ~]$
[asiye@instance-20241019-1038 ~]$ sudo systemctl restart mongod
[asiye@instance-20241019-1038 ~]$
[asiye@instance-20241019-1038 ~]$ mongosh –host 10.0.0.218 –port 27017
Current Mongosh Log ID: 6741ee24b64fd0c08ac1c18b
Connecting to: mongodb://10.0.0.218:27017/?directConnection=true&appName=mongosh+2.3.3
Using MongoDB: 6.0.19
Using Mongosh: 2.3.3
For mongosh info see: https://www.mongodb.com/docs/mongodb-shell/
test>
MongoDB’nin güvenliğini artırmak amacıyla kimlik doğrulama özelliğini etkinleştirdik. Bunun için ilk olarak, /etc/mongod.conf dosyasını düzenleyerek güvenlik ayarlarını etkinleştirdik. Dosyada bulunan #security: satırını aktif hale getirdik ve altına authorization: enabled satırını ekledik. Bu değişiklik, veritabanına erişim sağlamak için kullanıcı adı ve şifre doğrulaması yapılmasını zorunlu hale getirir. Değişiklikten sonra yapılandırmanın etkili olabilmesi için MongoDB hizmetini yeniden başlattık. Bu işlem için sudo systemctl restart mongod komutunu kullandık. Ardından, kimlik doğrulamanın etkili olup olmadığını test etmek amacıyla mongosh –host 10.0.0.218 –port 27017 komutuyla MongoDB’ye bağlandık. Bağlantı sırasında herhangi bir uyarı almadık, bu da kimlik doğrulamanın başarıyla devreye girdiğini gösterdi. Bu ayarlar, MongoDB’nin güvenliğini artırarak yalnızca yetkili kullanıcıların veritabanına erişimini sağlar.
[asiye@instance-20241019-1038 ~]$ mongosh
Current Mongosh Log ID: 6741f0efd54816a18cc1c18b
Connecting to: mongodb://127.0.0.1:27017/?directConnection=true&serverSelectionTimeoutMS=2000&appName=mongosh+2.3.3
Using MongoDB: 6.0.19
Using Mongosh: 2.3.3
For mongosh info see: https://www.mongodb.com/docs/mongodb-shell/
test> use admin
switched to db admin
admin>
admin> use admin
already on db admin
admin> db.createUser({
… user: “admin”,
… pwd: “securepassword”,
… roles: [ { role: “root”, db: “admin” } ]
… })
{ ok: 1 }
admin>
MongoDB kurulumunun ardından kimlik doğrulama etkin olduğunda (authorization: enabled) ve kullanıcı tanımlı olmadığında, MongoDB’nin localhost exception (yerel istisna) özelliği devreye girer. Bu özellik, localhost üzerinden yapılan bağlantılara, kimlik doğrulama etkin olsa bile, geçici olarak erişim sağlar. Bu durum, yönetici kullanıcının oluşturulmasına olanak tanımak için tasarlanmıştır.
Yukarıdaki komutlarda, mongosh komutuyla MongoDB’ye localhost (127.0.0.1) üzerinden bağlanılmış ve ardından use admin komutuyla admin veritabanına geçilmiştir. MongoDB, tüm kullanıcı ve yetki tanımlamalarını genellikle admin veritabanında yönetir.
Bu komut, adı admin, şifresi securepassword olan bir kullanıcı oluşturmuş ve bu kullanıcıya root rolü atanmıştır. root rolü, MongoDB’nin sunduğu en geniş kapsamlı yönetici yetkilerini içerir ve tüm veritabanlarında tam erişim sağlar. Komutun ardından { ok: 1 } çıktısı, işlemin başarıyla tamamlandığını doğrular.
Artık, MongoDB’nin kimlik doğrulama sistemi tam anlamıyla devreye girmiştir ve tüm işlemler için bu yönetici kullanıcıya (veya daha sonra oluşturulacak diğer yetkilendirilmiş kullanıcılara) ihtiyaç duyulacaktır. Bu süreç, MongoDB’nin güvenliğini sağlamak ve yetkisiz erişimi engellemek için önemli bir adımdır.
[asiye@instance-20241019-1038 ~]$ mongosh –host 127.0.0.1 –port 27017 -u “admin” -p “securepassword” –authenticationDatabase “admin”
Current Mongosh Log ID: 6741f443d5981e12c6c1c18b
Connecting to: mongodb://<credentials>@127.0.0.1:27017/?directConnection=true&serverSelectionTimeoutMS=2000&authSource=admin&appName=mongosh+2.3.3
Using MongoDB: 6.0.19
Using Mongosh: 2.3.3
For mongosh info see: https://www.mongodb.com/docs/mongodb-shell/
test> use admin
switched to db admin
admin> db.system.users.find()
[
{
_id: ‘admin.admin’,
userId: UUID(‘cf49a5eb-c708-4d61-b571-9c44b4e7de86’),
user: ‘admin’,
db: ‘admin’,
credentials: {
‘SCRAM-SHA-1’: {
iterationCount: 10000,
salt: ‘hxnsQYhNKQVMz5zlGHrp+A==’,
storedKey: ‘zEHohy/afooogOyYMtIBIt6Lcpo=’,
serverKey: ‘begTexsI8b+jKn9QzbhkJ8fKW/0=’
},
‘SCRAM-SHA-256’: {
iterationCount: 15000,
salt: ‘CBqZzzXcaYFoI+NXc0afgwP6PE07sgiLx2F0Pw==’,
storedKey: ‘clQ2+N1QeMELI8Rm7mbMutqOo41NRO8PxDoc1bttKY0=’,
serverKey: ‘/cCWQHWNPjoxkCjh0HZLPOtjI94yb3XsI6FlSqnRzmA=’
}
},
roles: [ { role: ‘root’, db: ‘admin’ } ]
}
]
admin>
Şimdi başarıyla admin kullanıcı ile kimlik doğrulama yaparak MongoDB’ye bağlandık ve db.system.users.find() komutuyla sistemde tanımlı kullanıcıları görüntüledik. Çıktıdaki bilgiler, admin kullanıcımızın başarıyla oluşturulduğunu ve tüm yetkilere (root rolü) sahip olduğunu gösteriyor.
Admin kullanıcı ile MongoDB’ye bağlandık. Kimlik doğrulama sonrasında yetkili bir kullanıcı olarak işlemleri gerçekleştirdik. db.system.users.find() komutuyla mevcut kullanıcıyı ve detaylarını görüntüledik.
Buraya kadar yaptıklarımızı takip açısından özetleyelim. MongoDB’nin kurulumu ve temel yapılandırmasını tamamlamak için, sistemdeki mevcut paketleri güncelleme ile başladık ve MongoDB’nin resmi GPG anahtarını ekleyerek, depo ayarlarını yapılandırdık. Ardından, MongoDB’nin bileşenlerini sistemimize başarıyla yükledik ve servisi başlatarak otomatik başlatma özelliğini etkinleştirdik. Güvenlik açısından önemli bir adım olan kimlik doğrulama özelliğini, authorization: enabled ayarını etkinleştirerek devreye aldık. Ancak, MongoDB’nin localhost exception özelliği sayesinde, kimlik doğrulama etkin olmasına rağmen, bir yönetici kullanıcı (admin) oluşturabildik. Bu kullanıcıya root rolü atayarak tüm yönetim yetkilerini sağladık. Ardından, admin kullanıcımızla kimlik doğrulama yaparak MongoDB’ye bağlandık ve db.system.users.find() komutuyla kullanıcı bilgilerimizi doğruladık. Ek olarak, MongoDB’nin sağlıklı çalışabilmesi için vm.max_map_count ayarını güncelledik ve bu değişikliği kalıcı hale getirdik. Böylece, MongoDB’yi hem güvenli hem de performans açısından optimal bir şekilde yapılandırarak kullanıma hazır hale getirdik.
Şimdi, MongoDB kavramlarına geçebiliriz.
MongoDB’de veritabanı (database), bilgilerin toplandığı en üst düzey yapıdır. Bir veritabanı içinde birden fazla koleksiyon (collection) bulunabilir. Koleksiyonlar, yapılandırılmış veya yarı yapılandırılmış belgelerin (JSON formatında) bir arada tutulduğu mantıksal gruplardır.
Veritabanı (database), tüm verilerimizi organize ettiğimiz büyük bir kap gibi düşünebiliriz. Her farklı proje veya uygulama için ayrı bir veritabanı oluşturabiliriz. Diyelim ki bir üniversite yönetim sistemi geliştiriyoruz. Bu sistemde öğrenci, öğretmen, ders bilgileri gibi verileri tutmamız gerekiyor. “university” adında bir veritabanı oluşturuyoruz. Bu veritabanı, üniversiteyle ilgili tüm bilgileri depolayan en üst düzey yapı olacak.
Koleksiyon (collection), bir veritabanındaki verilerin kategorilere ayrılmış hali gibidir. Koleksiyonlar, aslında klasörler gibi düşünülebilir. Her koleksiyon, benzer özelliklere sahip belgeleri (documents) bir arada tutar.
Örneğin, “university” veritabanında şu koleksiyonlar olabilir: “students”: Öğrenci bilgilerini saklayan koleksiyon. “teachers”: Öğretmen bilgilerini saklayan koleksiyon. “courses”: Ders bilgilerini saklayan koleksiyon. Koleksiyonlar, veritabanını daha düzenli hale getirir.
Doküman (document), koleksiyon içindeki bireysel verilerdir. Dokümanlar, JSON benzeri bir formatta saklanır ve her biri bir nesne gibi davranır. Bir doküman, belirli bir kaydı ifade eder. “students” koleksiyonunda, her öğrenci bilgisi bir dokümandır.
Örnek bir öğrenci dokümanı aşağıdaki gibi olabilir.
{
“student_id”: 101,
“name”: “Ahmet Yılmaz”,
“age”: 20,
“department”: “Computer Science”,
“courses”: [“Math”, “Physics”, “Programming”]
}
Örneğin, bir koleksiyondaki dokümanlar aşağıdaki gibi olabilir.
[
{
“student_id”: 101,
“name”: “Ahmet Yılmaz”,
“age”: 20,
“department”: “Computer Science”
},
{
“student_id”: 102,
“name”: “Ayşe Kaya”,
“age”: 21,
“department”: “Electrical Engineering”
}
]
Bu, “students” koleksiyonundaki iki farklı dokümandır.
Veritabanı: Tüm verilerimizin saklandığı en üst düzey yapı, (Örneğin, “university”).
Koleksiyon: Benzer türdeki verileri gruplandırır, (Örneğin, “students”, “teachers”).
Doküman: Koleksiyon içindeki bireysel kayıtlar, (Örneğin, Ahmet Yılmaz’ın öğrenci bilgileri).
Gelin şimdi bunları veritabanımızda gösterelim.
admin> use university
switched to db university
university>
university> db.students.insertOne({
… “student_id”: 101,
… “name”: “Ahmet Yılmaz”,
… “age”: 20,
… “department”: “Computer Science”,
… “courses”: [“Math”, “Physics”, “Programming”]
… })
{
acknowledged: true,
insertedId: ObjectId(‘6741fd30d5981e12c6c1c18c’)
}
university>
university> db.students.find()
[
{
_id: ObjectId(‘6741fd30d5981e12c6c1c18c’),
student_id: 101,
name: ‘Ahmet Yılmaz’,
age: 20,
department: ‘Computer Science’,
courses: [ ‘Math’, ‘Physics’, ‘Programming’ ]
}
]
university>
university> db.students.insertOne({
… “student_id”: 102,
… “name”: “Ayşe Kaya”,
… “age”: 21,
… “department”: “Electrical Engineering”
… })
{
acknowledged: true,
insertedId: ObjectId(‘6741fda9d5981e12c6c1c18d’)
}
university>
university> db.students.find()
[
{
_id: ObjectId(‘6741fd30d5981e12c6c1c18c’),
student_id: 101,
name: ‘Ahmet Yılmaz’,
age: 20,
department: ‘Computer Science’,
courses: [ ‘Math’, ‘Physics’, ‘Programming’ ]
},
{
_id: ObjectId(‘6741fda9d5981e12c6c1c18d’),
student_id: 102,
name: ‘Ayşe Kaya’,
age: 21,
department: ‘Electrical Engineering’
}
]
university>
Bu komutlarla, MongoDB üzerinde veri ekleme ve listeleme işlemlerimizi gerçekleştirdik. Öncelikle, “university” adında bir veritabanı oluşturduk ve aktif hale getirdik. Bu veritabanında, öğrenci bilgilerini saklamak için “students” adlı bir koleksiyon oluşturduk. Daha sonra, bu koleksiyona ilk öğrenci verimizi ekledik. Eklediğimiz veri, “Ahmet Yılmaz” adlı öğrencinin bilgilerini içeriyordu. Ahmet Yılmaz’ın öğrenci numarası 101, yaşı 20, bölümü “Bilgisayar Mühendisliği” (Computer Science) ve aldığı dersler “Matematik”, “Fizik” ve “Programlama” olarak tanımlandı. Bu işlem sonrasında, koleksiyondaki tüm verileri listelemek için db.students.find() komutunu kullandık ve eklediğimiz öğrencinin verilerini başarıyla gördük.
Devamında, ikinci bir öğrenci olarak “Ayşe Kaya” adlı öğrenciyi ekledik. Ayşe’nin öğrenci numarası 102, yaşı 21 ve bölümü “Elektrik Mühendisliği” (Electrical Engineering) olarak kaydedildi. Bu işlemden sonra, db.students.find() komutunu tekrar çalıştırarak koleksiyonda bulunan tüm öğrencileri listeledik ve hem Ahmet Yılmaz’ın hem de Ayşe Kaya’nın bilgilerini görüntüledik. Her iki öğrencinin verileri, MongoDB’nin otomatik olarak atadığı benzersiz _id alanıyla birlikte başarıyla kayıt altına alınmış oldu. Bu süreçte, verilerimizi MongoDB koleksiyonlarına ekleme ve bu verileri okuma işlemlerini adım adım gerçekleştirmiş olduk.
CRUD, veritabanındaki temel işlemleri ifade eden bir kısaltmadır:
C: Create (Oluştur), R: Read (Okuma), U: Update (Güncelleme), D: Delete (Silme)
Gelin, CRUD işlemlerle örnekler yapalım.
CREATE (Oluşturma)
Yeni bir öğrenci eklemek için insertOne() veya insertMany() yöntemlerini kullanabiliriz.
university> db.students.insertOne({
… “student_id”: 103,
… “name”: “Mehmet Demir”,
… “age”: 22,
… “department”: “Mechanical Engineering”,
… “courses”: [“Thermodynamics”, “Mechanics”]
… })
{
acknowledged: true,
insertedId: ObjectId(‘6741fff4d5981e12c6c1c18e’)
}
university>
Bu komut, koleksiyona yeni bir öğrenci ekler. MongoDB, her yeni dokümana otomatik olarak benzersiz bir _id değeri atar.
READ (Okuma)
university> db.students.find()
[
{
_id: ObjectId(‘6741fd30d5981e12c6c1c18c’),
student_id: 101,
name: ‘Ahmet Yılmaz’,
age: 20,
department: ‘Computer Science’,
courses: [ ‘Math’, ‘Physics’, ‘Programming’ ]
},
{
_id: ObjectId(‘6741fda9d5981e12c6c1c18d’),
student_id: 102,
name: ‘Ayşe Kaya’,
age: 21,
department: ‘Electrical Engineering’
},
{
_id: ObjectId(‘6741fff4d5981e12c6c1c18e’),
student_id: 103,
name: ‘Mehmet Demir’,
age: 22,
department: ‘Mechanical Engineering’,
courses: [ ‘Thermodynamics’, ‘Mechanics’ ]
}
]
university> db.students.find({ “student_id”: 103 })
[
{
_id: ObjectId(‘6741fff4d5981e12c6c1c18e’),
student_id: 103,
name: ‘Mehmet Demir’,
age: 22,
department: ‘Mechanical Engineering’,
courses: [ ‘Thermodynamics’, ‘Mechanics’ ]
}
]
university>
Koleksiyondan veri okuduk. Bu, “READ” işlemini temsil eder ve veritabanından bilgi almayı sağlar.
UPDATE (Güncelleme)
Bir öğrencinin bilgilerini değiştirmek için updateOne() veya updateMany() yöntemlerini kullanabiliriz.
university> db.students.updateOne(
… { “student_id”: 103 },
… { $set: { “department”: “Civil Engineering” } }
… )
{
acknowledged: true,
insertedId: null,
matchedCount: 1,
modifiedCount: 1,
upsertedCount: 0
}
university>
university> db.students.updateMany(
… { “age”: { $gt: 20 } },
… { $set: { “status”: “Graduated” } }
… )
{
acknowledged: true,
insertedId: null,
matchedCount: 2,
modifiedCount: 2,
upsertedCount: 0
}
university>
Veritabanındaki mevcut verileri güncelledik. Bu, “UPDATE” işlemini temsil eder ve veritabanındaki veriler üzerinde değişiklik yapmayı sağlar.
DELETE (Silme)
university> db.students.deleteOne({ “student_id”: 103 })
{ acknowledged: true, deletedCount: 1 }
university>
university> db.students.deleteMany({ “status”: “Graduated” })
{ acknowledged: true, deletedCount: 1 }
university>
Koleksiyondaki verileri kaldırdık. Bu, “DELETE” işlemini temsil eder ve artık ihtiyaç duyulmayan verileri kaldırmak için kullanılır.
MongoDB üzerinde “CREATE” işlemi kapsamında, koleksiyona yeni bir veri ekleme işlemi gerçekleştirdik. Bu işlem, veritabanına yeni bilgilerin kaydedilmesini sağlar. Örneğin, db.students.insertOne() komutunu kullanarak “students” koleksiyonuna yeni bir öğrenci ekledik. Bu öğrenci, Mehmet Demir adında bir bireydi. Mehmet’in öğrenci numarası 103, yaşı 22, bölümü “Mechanical Engineering” (Makine Mühendisliği) ve aldığı dersler arasında “Thermodynamics” (Termodinamik) ve “Mechanics” (Mekanik) bulunuyordu.
Bu işlem sonucunda MongoDB, veri ekleme işleminin başarılı olduğunu belirten bir çıktı döndürdü ve bu yeni kayıt için otomatik olarak benzersiz bir ObjectId oluşturdu. Bu adım, MongoDB’de “CREATE” işleminin, yeni verilerin koleksiyonlara nasıl eklenebileceğini göstermektedir.
MongoDB üzerinde “READ” işlemi kapsamında, koleksiyondan veri okuma işlemleri gerçekleştirdik. İlk olarak db.students.find() komutunu kullanarak koleksiyondaki tüm öğrenci bilgilerini listeledik. Bu işlem sonucunda, Ahmet Yılmaz, Ayşe Kaya ve Mehmet Demir’in bilgileri dahil olmak üzere tüm öğrenciler görüntülendi. Ardından, student_id değeri 103 olan öğrenciyi özel olarak sorgulamak için db.students.find({ “student_id”: 103 }) komutunu kullandık. Bu işlem, yalnızca Mehmet Demir’in bilgilerini içeren bir sonuç döndürdü. Bu örnekler, MongoDB’de “READ” işlemi sayesinde veritabanındaki bilgilerin nasıl erişilebilir hale geldiğini gösterdi.
“UPDATE” işlemi kapsamında, var olan veriler üzerinde değişiklikler yaptık. İlk olarak db.students.updateOne() komutunu kullanarak student_id değeri 103 olan öğrencinin bölüm bilgisini “Civil Engineering” olarak güncelledik. Güncelleme işlemi başarıyla tamamlandı ve değişikliklerin ilgili kayıt üzerinde etkili olduğu doğrulandı. Daha sonra db.students.updateMany() komutunu kullanarak, yaşı 20’den büyük olan tüm öğrencilerin “status” alanını “Graduated” olarak belirledik. Bu işlem sonucunda iki kayıt başarıyla güncellendi ve yaşı belirtilen kriterlere uyan öğrencilerin durumları güncellenmiş oldu. Bu adımlar, MongoDB’de “UPDATE” işleminin, veriler üzerinde değişiklik yapmak için nasıl kullanıldığını göstermektedir.
Son olarak, “DELETE” işlemi ile veritabanından veri kaldırma işlemleri gerçekleştirdik. db.students.deleteOne() komutuyla student_id değeri 103 olan öğrenciyi koleksiyondan sildik. Bu işlem sonucunda yalnızca belirtilen kayıt başarıyla kaldırıldı. Daha sonra, “status” alanı “Graduated” olan tüm öğrencileri kaldırmak için db.students.deleteMany() komutunu kullandık ve bu işlem sonucunda bir kayıt daha silindi. Bu adımlar, MongoDB’de artık ihtiyaç duyulmayan verilerin nasıl kaldırılabileceğini ve “DELETE” işleminin bu süreci nasıl yönettiğini net bir şekilde ortaya koydu.
[asiye@instance-20241019-1038 ~]$ mongoexport –uri “mongodb://admin:securepassword@127.0.0.1:27017/?authSource=admin” –db university –collection students –type=csv –fields student_id,name,age,department,courses –out students.csv
2024-11-23T16:36:53.492+0000 connected to: mongodb://[**REDACTED**]@127.0.0.1:27017/?authSource=admin
2024-11-23T16:36:53.496+0000 exported 1 record
[asiye@instance-20241019-1038 ~]$
[asiye@instance-20241019-1038 ~]$ ls -l
total 12
drwxr-xr-x. 4 asiye asiye 37 Oct 19 08:13 belgeler
drwxr-xr-x. 2 asiye asiye 6 Oct 28 15:22 dizin1
drwx——. 2 asiye asiye 6 Oct 28 16:49 dizin2
-rw-r–r–. 1 asiye asiye 0 Oct 28 15:22 file1.txt
-rw——-. 1 asiye asiye 0 Oct 28 16:49 file2.txt
-rw-r–r–. 1 asiye asiye 432 Nov 23 12:50 logout.txt
-rw-r–r–. 1 asiye asiye 1691 Nov 23 13:33 mongodb-server-6.0.asc
drwxrwxrwt. 2 asiye asiye 31 Nov 10 15:16 paylasim_dizini
drwxrws—. 2 asiye proje_grubu 56 Nov 10 14:39 proje_dizini
drwxr-xr-x. 3 asiye asiye 20 Oct 19 08:14 projeler
drwxr-xr-x. 2 asiye asiye 23 Oct 19 08:16 resimler
-rw-r–r–. 1 sarav sarav 0 Oct 28 19:38 saravtestfile2.txt
-rw-r–r–. 1 asiye asiye 118 Nov 23 16:36 students.csv
drwxr-xr-x. 2 asiye asiye 24 Oct 19 08:50 test_dizin
[asiye@instance-20241019-1038 ~]$ more students.csv
student_id,name,age,department,courses
101,Ahmet Yılmaz,20,Computer Science,”[“”Math””,””Physics””,””Programming””]”
[asiye@instance-20241019-1038 ~]$
MongoDB’deki verilerin farklı platformlarda analiz edilmesi veya paylaşılması gerektiğinde, verileri JSON veya CSV gibi yaygın formatlara dönüştürmek oldukça kullanışlıdır. Bu işlem için kullanılan mongoexport aracı, MongoDB koleksiyonlarındaki verileri dışa aktarmak için etkili bir yöntem sunar. Örneğin students koleksiyonunu CSV formatına dönüştürmek için mongoexport komutunu kullanarak bir dosya oluşturduk. Oluşturulan CSV dosyası, sütun başlıklarıyla birlikte verileri düzenli bir şekilde tablo halinde sunar. Bu yöntem, özellikle büyük veri kümelerinin işlenmesi, tablo bazlı analizler yapılması ve diğer sistemlere veri entegrasyonu sağlanması gereken durumlarda oldukça kullanışlıdır. MongoDB’nin güçlü veri işleme yeteneklerini daha geniş bir ekosistemle entegre etmek için bu tür araçların nasıl kullanılacağını bilmek, veri yönetimi süreçlerini daha verimli hale getirir.
MongoDB ile çalışmaya yönelik bu başlangıç rehberi, kurulumdan temel veri işleme işlemlerine (CRUD) kadar olan adımları detaylı bir şekilde açıklamaktadır. Bu seride öğrendiklerimiz sayesinde, MongoDB’nin esnek ve modern veri yapıları ile nasıl etkili bir şekilde çalıştığını deneyimledik. Özetle, MongoDB’nin kolay kurulumu, kullanıcı dostu komutları ve güçlü veri yönetimi yetenekleri, modern uygulamalar için ideal bir veritabanı çözümü olmasını sağlıyor. İlerleyen bölümlerde, MongoDB’nin daha ileri seviye özelliklerini, performans optimizasyonlarını ve kullanım senaryolarını ele alarak bilgi birikimimizi derinleştireceğiz. Bu yazı dizisinin, veritabanı yönetimine ilgi duyan herkes için faydalı bir kaynak olmasını diliyorum.
Sarav Asiye Yiğit – 23 Kasım 2024
#MongoDB #Veritabanı #DatabaseManagement #DataExport #JSONtoCSV #VeriAnalizi #DatabaseTutorial #BigData #NoSQL #KullanıcıDostuVeriler #Eğitim #TeknolojiEğitimi #TeknikMakale
Leave A Comment