# Replication & Yüksek Erişilebilirlik (HA) — Yönetici Kılavuzu

> **Phase 3** özelliği. Cluster düğümlerinin önceden tanımlanmış ve `active` durumda olması gerekir.

---

## Genel Bakış

Onoxsoft Panel, üç servis için master-slave replikasyonunu destekler:

| Servis    | Topoloji         | Mekanizma                           |
|-----------|------------------|-------------------------------------|
| MariaDB   | master-slave     | Binary log (ROW formatı)            |
| PowerDNS  | master-slave     | AXFR + gmysql replication           |
| Redis     | sentinel         | REPLICAOF + Sentinel quorum         |

---

## MariaDB Master-Slave Kurulumu

### Ön Gereksinimler

- Master ve slave düğümlerinde `mariadb-server` kurulu ve çalışır olmalı.
- Düğümler arası 3306/TCP erişimi açık olmalı.
- `mariabackup` komutu slave'de kurulu olmalı (rebuild için).

### Kurulum Adımları (UI)

1. Admin → **Replication (HA)** → **Yeni Replication Kur**
2. Servis: **MariaDB** seç
3. Master düğümünü seç
4. Slave düğümlerini seç (birden fazla olabilir)
5. **Kur** butonuna tıkla

### Arka Planda Ne Olur?

1. `onx-mariadb-master-setup` çalışır:
   - `/etc/my.cnf.d/onox.cnf` güncellenir: `server-id=1`, `log_bin=mysql-bin`, `binlog_format=ROW`, `expire_logs_days=7`
   - Replication kullanıcısı oluşturulur: `CREATE USER 'replicator'@'%' ... GRANT REPLICATION SLAVE`
   - MariaDB yeniden başlatılır
   - `SHOW MASTER STATUS` çıktısından `log_file` ve `log_pos` alınır

2. Her slave için `onx-mariadb-slave-setup` çalışır:
   - `server-id` ve `relay_log` yapılandırması
   - `read_only=1` ayarlanır
   - `CHANGE MASTER TO ... ; START SLAVE` çalıştırılır
   - 5 saniye beklenerek `SHOW SLAVE STATUS` doğrulaması yapılır

### Lag İzleme

`onox:replication-health` komutu her dakika çalışır ve `Seconds_Behind_Master` değerini kaydeder.
30 saniyenin üzerinde lag tespit edildiğinde `replication_failover_events` tablosuna `lag_detected` kaydı eklenir ve `ReplicationLagDetected` event'i tetiklenir.

---

## Manuel Failover (Promote)

> **Uyarı:** Bu işlem geri alınamaz. Eski master'ın replikasyonu durur.

1. Admin → **Replication** → ilgili kurulumu seç → **Show** sayfası
2. Slave kartındaki **Promote** butonuna tıkla
3. Onay sorusunu kabul et

### Arka Planda Ne Olur?

`onx-mariadb-promote` çalışır:
1. `STOP SLAVE`
2. `RESET SLAVE ALL`
3. `SET GLOBAL read_only = 0`
4. `RESET MASTER` (yeni binlog başlatır)

`replication_failover_events` tablosuna `manual_failover` kaydı eklenir.

**Not:** Eski master'ın yeni slave olarak yapılandırılması Manuel olarak yapılmalıdır (Phase 3.5 kapsamına alınacak).

---

## Slave Rebuild (Tam Senkronizasyon)

Slave replikasyonu bozulmuşsa veya long-running transaction nedeniyle lag artmışsa:

1. **Show** sayfasında slave kartına git → **Rebuild Slave**
2. İşlem tamamlanana kadar bekle (büyük veritabanlarında uzun sürebilir)

### Arka Planda Ne Olur?

`onx-mariadb-rebuild` çalışır:
1. `STOP SLAVE` + `systemctl stop mariadb`
2. Master'dan `mariabackup --backup` alınır
3. `mariabackup --prepare` + `--copy-back`
4. `systemctl start mariadb`
5. Replikasyon yeniden başlatılır

---

## PowerDNS Slave Kurulumu

### Kurulum Adımları

1. **Yeni Replication Kur** → Servis: **PowerDNS**
2. Master DNS sunucusunu seç
3. Slave DNS sunucularını seç
4. **Kur**

### Arka Planda Ne Olur?

`onx-pdns-setup-slave` çalışır:
- `/etc/pdns/pdns.conf` güncellenir: `slave=yes`, `master=no`, `superslave=yes`, `allow-axfr-ips=<master_ip>/32`
- PowerDNS yeniden başlatılır

### Zone Notify

Belirli bir zone için NOTIFY göndermek:

```bash
# Panel üzerinden: Show sayfasında "Kontrol Et" butonu
# veya CLI:
pdns_control notify example.com
```

---

## Redis Sentinel Kurulumu

### Topoloji

```
          ┌─────────────┐
          │   MASTER    │
          │  (Redis)    │
          └──────┬──────┘
                 │ REPLICAOF
       ┌─────────┴──────────┐
   ┌───┴───┐           ┌────┴────┐
   │ SLAVE │           │  SLAVE  │
   └───────┘           └─────────┘

   ┌──────────┐  ┌──────────┐  ┌──────────┐
   │SENTINEL 1│  │SENTINEL 2│  │SENTINEL 3│
   └──────────┘  └──────────┘  └──────────┘
   quorum = 2 (floor(3/2)+1)
```

### Kurulum Adımları

1. **Yeni Replication Kur** → Servis: **Redis**
2. Master düğümünü seç
3. Slave düğümlerini seç
4. Her slave için "**Sentinel**" rozetini aç (en az 3 önerilir)
5. **Kur**

### Arka Planda Ne Olur?

- Her slave için `onx-redis-replicaof` çalışır: `REPLICAOF <master_ip> 6379`
- Her sentinel için `onx-redis-sentinel-setup` çalışır: `/etc/redis/sentinel.conf` yazılır, servis başlatılır

### Sentinel Konfigürasyon

```conf
port 26379
daemonize yes
logfile /var/log/redis/sentinel.log

sentinel monitor onox-master <MASTER_IP> 6379 <QUORUM>
sentinel down-after-milliseconds onox-master 5000
sentinel failover-timeout onox-master 60000
sentinel parallel-syncs onox-master 1
```

---

## Health Check

`onox:replication-health` scheduler her dakika çalışır ve şunları kontrol eder:

- MariaDB: `Slave_IO_Running`, `Slave_SQL_Running`, `Seconds_Behind_Master`
- PowerDNS: Zone listesi ve serial senkronizasyonu
- Redis: `INFO replication` çıktısı

**Eşikler:**
- Lag > 30 saniye → `lag_detected` event kaydı
- IO/SQL thread durmuşsa → setup `degraded` durumuna alınır

---

## Phase 3.5 — Otomatik Failover (Gelecek)

Şu an kapsam dışı. Planlandığında şunlar eklenecek:

- Master down tespit edildiğinde (`master_down` event)
- Sentinel quorum kararı ile yeni master belirleme
- Diğer slave'lerin yeni master'a yönlendirilmesi
- Admin onayı olmadan işlem yapılmayacak (notification → approve → execute)

---

## Sorun Giderme

### `SHOW SLAVE STATUS` hata mesajları

| Hata | Çözüm |
|------|-------|
| `Slave_IO_Running: No` | Master erişim kontrolü, firewall, replication kullanıcısı şifresi |
| `Slave_SQL_Running: No` | `SHOW SLAVE STATUS\G` → `Last_SQL_Error` bak, `STOP SLAVE; SET GLOBAL SQL_SLAVE_SKIP_COUNTER=1; START SLAVE;` |
| Yüksek lag | `SHOW PROCESSLIST` ile master yüküne bak, slave donanımını kontrol et |

### Redis Sentinel bağlanmıyor

```bash
redis-cli -p 26379 sentinel masters
```

### Loglar

```bash
tail -f /var/log/onox/sysapi.log   # Sysapi script logları
journalctl -u mariadb -f           # MariaDB logları
journalctl -u redis-sentinel -f    # Sentinel logları
```
