# Dokumen Teknis: Implementasi Dedicated Redis Server (Cache-Aside)
**Status:** Rekomendasi Arsitektur Produksi  
**Target OS:** AlmaLinux 8 (Redis 7.2 LTS)  
**Target Aplikasi:** Multi-App (10 Aplikasi) - CodeIgniter 3  

---

## 1. Latar Belakang & Analisis Keputusan

Berdasarkan spesifikasi server database saat ini (**RAM 377GB, DB 800GB, High Concurrency / 10 Aplikasi**), fitur bawaan **Query Cache MariaDB dinonaktifkan (`query_cache_type = 0`)**. 

### Alasan Teknis Penolakan Query Cache MariaDB:
1. **Global Lock Contention:** Query Cache MariaDB menggunakan mekanisme *single global lock*. Setiap kali terjadi operasi tulis (`INSERT/UPDATE/DELETE`), seluruh cache yang terkait dengan tabel tersebut akan dihapus (*invalidation*). Pada arsitektur multi-aplikasi dengan trafik tinggi, hal ini memicu antrean proses (*lock contention*) yang dapat membuat database macet (*freeze*).
2. **Skalabilitas Multi-Core:** Query Cache tidak dirancang untuk arsitektur modern banyak core CPU. Core CPU akan saling memperebutkan lock cache yang sama.
3. **Optimasi Berjalan Eksis:** Konfigurasi `innodb_buffer_pool_size = 160G` dengan `16 instances` saat ini sudah sangat optimal untuk membaca data dan indeks langsung dari RAM tanpa risiko *global lock*.

### Solusi Modern: Centralized Caching dengan Redis
Untuk memangkas query berat (seperti agregasi data, report, JOIN kompleks) tanpa membebani MariaDB, diimplementasikan **Dedicated Redis Server** terpisah menggunakan metode **Cache-Aside (Lazy Loading)**.

---

## 2. Spesifikasi Infrastruktur Dedicated Redis Server

*   **Sistem Operasi:** AlmaLinux 8
*   **Versi Redis:** 7.2 LTS (Long-Term Support - EOL Desember 2029)
*   **RAM Server:** 80 GB
*   **CPU:** Intel(R) Xeon(R) CPU E5-2620 @ 2.00GHz (24 Cores)
*   **Penyimpanan:** Harddisk SAS (Mekanis)
*   **Jaringan:** Private LAN (Latensi < 1ms dari Server Utama)

---

## 3. Panduan Instalasi & Optimasi Sistem (Di Server Redis)

### Langkah 1: Instalasi Redis 7.2 LTS via Remi Repo
```bash
# Update sistem
sudo dnf update -y

# Reset modul dnf redis bawaan
sudo dnf module reset redis -y

# Aktifkan stream 7.2 LTS dari Remi Repository
sudo dnf module enable redis:remi-7.2 -y

# Jalankan instalasi
sudo dnf install redis -y
```

### Langkah 2: Optimasi Kernel OS Linux
Redis membutuhkan penyesuaian kernel agar performa alokasi memori berjalan maksimal di server multi-core.

1. **Overcommit Memory:**
   Buka file `/etc/sysctl.conf` dan tambahkan baris berikut di paling bawah:
   ```ini
   vm.overcommit_memory = 1
   ```
   Terapkan perubahan: `sudo sysctl -p`

2. **Disable Transparent Huge Pages (THP):**
   ```bash
   sudo echo never > /sys/kernel/mm/transparent_hugepage/enabled
   ```
   Agar permanen setelah reboot, tambahkan baris di atas ke dalam file `/etc/rc.local` dan pastikan file tersebut memiliki izin eksekusi (`sudo chmod +x /etc/rc.local`).

---

## 4. Konfigurasi Produksi: `/etc/redis/redis.conf`

Berikut adalah file konfigurasi yang telah dibersihkan dan dioptimasi khusus untuk **RAM 80GB (Alokasi Redis 30GB untuk tahap awal)**, **CPU 24 Core**, dan **Aman untuk Harddisk SAS** (Mematikan fitur AOF dan melonggarkan RDB agar disk tidak *overhead*).

```ini
################################## JARINGAN ###################################
bind 0.0.0.0
protected-mode yes
port 6379
tcp-backlog 511
timeout 0
tcp-keepalive 300

################################# UMUM / OS ##################################
daemonize yes
pidfile /run/redis/redis.pid
loglevel notice
logfile /var/log/redis/redis.log
databases 16

########################## SNAPSHOT / BACKUP (OPTIMASI SAS) ###################
# Jembatan penyelamat harddisk SAS agar tidak kelebihan beban tulis (I/O)
save 900 1
save 3600 10000
stop-writes-on-bgsave-error no
rdbcompression yes
rdbchecksum yes
dbfilename dump.rdb
dir /var/lib/redis

################################## REPLIKASI ##################################
replica-serve-stale-data yes
replica-read-only yes
repl-diskless-sync yes
repl-diskless-sync-delay 5
repl-disable-tcp-nodelay no
replica-priority 100

################################## KEAMANAN ###################################
# WAJIB DIUBAH dengan password produksi yang kuat
requirepass PasswordRahasiaRedisAnda123!

########################### MANAJEMEN MEMORI / RAM ############################
# Batasan RAM dikunci ke 30GB untuk pemantauan tahap awal
maxmemory 30gb
maxmemory-policy allkeys-lru

############################# OPTIMASI HARDDISK SAS ###########################
# Mematikan AOF karena penulisan per detik sangat merusak performa piringan SAS
appendonly no
no-appendfsync-on-rewrite yes

############################## KINERJA THREADING ##############################
lazyfree-lazy-eviction yes
lazyfree-lazy-expire yes
lazyfree-lazy-server-del yes
replica-lazy-flush yes

# Optimasi Multi-Thread I/O untuk memanfaatkan core prosesor Xeon Anda
io-threads 6
io-threads-do-reads yes
```

Setelah konfigurasi di atas disimpan, restart service:  
`sudo systemctl enable redis && sudo systemctl restart redis`

---

## 5. Konfigurasi Firewall (Firewalld di AlmaLinux)

Demi keamanan, port `6379` **WAJIB** diisolasi agar hanya bisa diakses oleh IP Private Server Utama (Server Aplikasi).
```bash
# Ganti 10.0.0.4 dengan IP Private Server Utama / PHP-FPM Anda
sudo firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="10.0.0.4" port port="6379" protocol="tcp" accept'

# Reload aturan firewall
sudo firewall-cmd --reload
```

---

## 6. Implementasi Tingkat Aplikasi (CodeIgniter 3)

Untuk menjamin **High Availability**, tim developer **WAJIB** menerapkan mekanisme *Failover/Backup Adapter*. Jika Redis Server terpisah ini *down*, aplikasi **TIDAK BOLEH** crash atau *timeout*, melainkan harus otomatis dialihkan (*graceful degradation*) langsung ke MariaDB.

### Langkah 1: Pengaturan `application/config/redis.php`
```php
<?php
defined('BASEPATH') OR exit('No direct script access allowed');

$config['socket_type'] = 'tcp';
$config['host']        = '10.0.0.5'; // IP Private Server Redis Baru
$config['password']    = 'PasswordRahasiaRedisAnda123!';
$config['port']        = 6379;
$config['timeout']     = 1.5; // Batas toleransi tunggu koneksi sebelum failover (1.5 detik)
```

### Langkah 2: Implementasi Safe-Caching di Controller / Model CI3
Gunakan kombinasi adapter `redis` dengan backup adapter `dummy`. Jika Redis mati, adapter `dummy` bertindak sebagai bypass aman yang selalu menghasilkan nilai `FALSE` (sehingga aplikasi terpaksa membaca MariaDB tanpa memicu error sistem).

```php
<?php
defined('BASEPATH') OR exit('No direct script access allowed');

class Laporan extends CI_Controller {

    public function omset_2026()
    {
        // PENTING: Wajib deklarasikan backup ke driver 'dummy' demi penanganan failover
        $this->load->driver('cache', array(
            'adapter' => 'redis',
            'backup'  => 'dummy'
        ));

        $cacheKey = 'key_query_laporan_omset_2026';

        // 1. Mencoba mengambil data dari cache Redis
        if ( ! $data = $this->cache->get($cacheKey)) {
            
            // 2. JIKA CACHE MISS ATAU REDIS SERVER DOWN:
            // Ambil data langsung dari MariaDB Lokal
            $this->db->select('user_id, SUM(total) as total_omset');
            $this->db->from('orders');
            $this->db->group_by('user_id');
            $data = $this->db->get()->result_array();

            // 3. Simpan kembali hasil query ke Redis selama 3600 detik (1 Jam)
            // Jika Redis sedang down, baris ini diabaikan secara aman oleh driver dummy
            $this->cache->save($cacheKey, $data, 3600);
            
            log_message('debug', 'Cache Miss / Redis Down. Mengambil data dari MariaDB.');
        } else {
            log_message('debug', 'Cache Hit. Mengambil data dari Redis.');
        }

        // Output atau kirim data ke view
        $this->output
             ->set_content_type('application/json')
             ->set_output(json_encode($data));
    }
}
```
***

Jika tim teknis Anda memerlukan bantuan tambahan, seperti **panduan memperbesar nilai kernel `somaxconn`** di server aplikasi atau **perintah monitoring memori (`redis-cli info memory`)**, beri tahu saya agar dapat segera ditambahkan ke dalam dokumen ini!



notes tambahan wajib diinstall di server aplikasi
#sudo yum install php56-php-pecl-redis -y
