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.

Veritabanları Bölüm 4

Veritabanları Bölüm 3

Veritabanları Bölüm 2

Veritabanları

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