> ## Documentation Index
> Fetch the complete documentation index at: https://docs.apinizer.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Red Hat'te MongoDB Kurulumu

> Red Hat Enterprise Linux veya Rocky Linux işletim sistemine sahip sunucularda MongoDB Replicaset 8.0 kurulumunu gerçekleştirebilir. Red Hat 8.x veya 9.x işletim sistemi kullanılması önerilir. Kurulum sürecinde işletim sistemi konfigürasyonları, MongoDB uygulamasının kurulması, replicaset yapılandırması ve yüksek kullanılabilirlik ayarları yapılabilir.

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

<Warning>
  **Çok Önemli**

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

  ```bash theme={null}
  #(Gerekirse) Hostname değiştirme
  hostnamectl set-hostname your-new-hostname
  ```

  `/etc/hosts` dosyasında **127.0.1.1** gibi ip'li blok hostname assign olmasın.

  `/etc/resolv.conf` dosyasında **nameserver 127.0.1.1** şeklinde bir girdi olmamalıdır.
</Warning>

<Info>
  **Önemli**

  Kurulumun sağlıklı olması için sunucularının aşağıdaki adreslere erişmesi gerekmektedir.

  **MongoDB:**

  * [https://www.mongodb.org/static/pgp/server-8.0.asc](https://www.mongodb.org/static/pgp/server-8.0.asc)
  * [https://repo.mongodb.org/yum/redhat/](https://repo.mongodb.org/yum/redhat/)
</Info>

## İşletim Sistemi Konfigürasyonları

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

```bash theme={null}
# Apinizer kullanıcısı oluşturulur ve yetkilendirilir.
sudo adduser apinizer
sudo passwd apinizer
sudo usermod -aG wheel apinizer

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

# Aşağıdaki araçların tüm sunucular üzerinde kurulu olması tavsiye edilmektedir
sudo yum install -y net-tools yum-utils bind-utils device-mapper-persistent-data lvm2 telnet wget zip curl lsof jq

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

# Sunuculardaki iletişim sorunlarını önlemek için SELinux'u devre dışı bırakılır
sudo setenforce 0
sudo sed -i 's/^SELINUX=enforcing$/SELINUX=disabled/' /etc/selinux/config

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

## MongoDB Kurulumu

### MongoDB Uygulamasının Kurulması

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

```bash theme={null}
sudo vi /etc/yum.repos.d/mongodb-org-8.0.repo
```

```ini theme={null}
[mongodb-org-8.0]
name=MongoDB Repository
baseurl=https://repo.mongodb.org/yum/redhat/$releasever/mongodb-org/8.0/x86_64/
gpgcheck=1
enabled=1
gpgkey=https://www.mongodb.org/static/pgp/server-8.0.asc
```

```bash theme={null}
sudo yum install -y mongodb-org-8.0.17
```

### MongoDB Konfigürasyonları

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

**Key oluşturma:**

```bash theme={null}
sudo mkdir -p /etc/mongodb/keys/
sudo chown -Rf apinizer:apinizer /etc/mongodb/keys
sudo chmod -Rf 700 /etc/mongodb/keys
sudo openssl rand -base64 756 > /etc/mongodb/keys/mongo-key
sudo chmod -Rf 400 /etc/mongodb/keys/mongo-key
sudo chown -Rf mongod:mongod /etc/mongodb
```

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

* storage / wiredTiger
* replication
* security
* setParameter
* processManagement

Diğer satırlar değiştirilmeden aşağıdakiler düzenlenir ve eklenir.

```yaml theme={null}
storage:
  dbPath: /var/lib/mongo
  wiredTiger:
    engineConfig:
      cacheSizeGB: 2

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

net:
  port: 25080
  bindIp: 0.0.0.0

replication:
  replSetName: apinizer-replicaset

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

setParameter:
  transactionLifetimeLimitSeconds: 300

processManagement:
  fork: true
  pidFilePath: /var/run/mongodb/mongod.pid # location of pidfile
  timeZoneInfo: /usr/share/zoneinfo
```

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

```bash theme={null}
sudo systemctl start mongod
sudo systemctl enable mongod
```

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

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

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

  # Yetkiler kontrol edilir, düzeltilir
  chmod -Rf 400 /etc/mongodb/keys
  chown -Rf mongod:mongod /etc/mongodb
  ```
</Info>

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

<Note>
  Bu adımlar sadece MongoDB Primary sunucusunda gerçekleştirilmelidir.
</Note>

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

**Replicaset'i aktifleştirme:**

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

rs.initiate()
rs.status()
```

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

```javascript theme={null}
use admin
db.createUser(
  {
    user: 'apinizer',
    pwd: '<YOUR_PASSWORD>',
    roles: [ { role: 'root', db: 'admin' } ]
  }
);
exit;
```

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

  ```javascript theme={null}
  roles: [ { role: "readWrite", db: "apinizerdb" } ]
  ```
</Info>

<Info>
  **Şifre değiştirilmek istenirse**

  ```javascript theme={null}
  use admin
  db.changeUserPassword("apinizer", passwordPrompt())
  ```
</Info>

Replicaset ayarları yapılır.

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

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

  ```javascript theme={null}
  use admin;
  db.grantRolesToUser('admin', [{ role: 'root', db: 'admin' }])
  ```
</Info>

<Info>
  **MongoDB'ye arbiter eklenmek isteniyorsa:**

  ```javascript theme={null}
  db.adminCommand({ setDefaultRWConcern: 1, defaultWriteConcern: { w: "majority" } })
  rs.addArb("<MONGO_IP_ADDRESS>:25080")
  ```
</Info>

### Birden Çok Sunucu Üzerinde MongoDB ReplicaSet Kurulumu

<Note>
  Bu adımlar sadece MongoDB Primary sunucusunda gerçekleştirilmelidir.
</Note>

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

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

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

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

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

```bash theme={null}
mongosh mongodb://<PRIMARY_NODE>:25080 --authenticationDatabase "admin" -u "apinizer" -p
rs.add("mongoDb02:25080")
rs.add("mongoDb03:25080")
rs.status()
exit;
```

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

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

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

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

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

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