ElastiCache untuk Redis
Begitu ada kontainer kedua, cache dan session harus tinggal di luar aplikasi. ElastiCache menyediakannya tanpa node yang perlu kamu tambal — dengan beberapa keputusan yang lebih baik diambil sekarang daripada nanti.
Intisari
- Pilih antara cluster mode disabled (satu shard, sederhana) dan enabled (banyak shard, lebih rumit).
- Selalu nyalakan Multi-AZ dengan replica untuk produksi — node tunggal berarti sesi hilang saat gagal.
- Enkripsi saat transit dan saat disimpan, plus AUTH token — semuanya perlu penyesuaian di sisi Laravel.
maxmemory-policy:allkeys-lruuntuk cache, bukan untuk antrean.- Alternatif serverless menghapus keputusan ukuran node, dengan model biaya yang berbeda.
Memilih bentuk klaster
| Cluster mode disabled | Cluster mode enabled | |
|---|---|---|
| Shard | Satu | Banyak |
| Batas memori | Ukuran satu node | Bisa jauh lebih besar |
| Perintah multi-kunci | Bebas | Hanya dalam satu slot hash |
| Konfigurasi Laravel | Sederhana | Perlu klien cluster-aware |
| Pilih kalau | Hampir selalu ini | Data cache melebihi kapasitas satu node |
Mulai dari cluster mode disabled. Node besar sekalipun menampung sangat banyak cache, dan cluster mode membawa batasan yang merepotkan: perintah yang menyentuh beberapa kunci sekaligus hanya bekerja kalau kunci-kunci itu berada di slot hash yang sama. Beberapa fitur Laravel — terutama cache tag — menjadi lebih rumit. Pindah ke cluster mode saat memang terbukti perlu, bukan sebagai persiapan.
Konfigurasi Laravel
REDIS_CLIENT=phpredis
REDIS_HOST=portal-cache.abc123.ng.0001.apse1.cache.amazonaws.com
REDIS_PORT=6379
REDIS_PASSWORD= # AUTH token, kalau diaktifkan
CACHE_STORE=redis
SESSION_DRIVER=redis
// config/database.php — untuk enkripsi saat transit
'redis' => [
'client' => 'phpredis',
'options' => [
'prefix' => env('REDIS_PREFIX', 'portal:'),
'scheme' => env('REDIS_SCHEME', 'tls'), // wajib kalau in-transit encryption aktif
],
'default' => ['host' => env('REDIS_HOST'), 'database' => 0],
'cache' => ['host' => env('REDIS_HOST'), 'database' => 1],
'session' => ['host' => env('REDIS_HOST'), 'database' => 2],
],
Kalau enkripsi saat transit aktif, scheme harus tls. Tanpa itu, klien
mencoba koneksi biasa dan gagal dengan pesan yang tidak menyebut TLS sama sekali — biasanya sekadar
"connection refused" atau timeout. Ini satu baris yang menyebabkan banyak jam terbuang.
Ketersediaan
| Konfigurasi | Kalau node gagal |
|---|---|
| Node tunggal | Semua sesi hilang, semua pengguna ter-logout |
| Primary + replica, Multi-AZ | Failover otomatis dalam puluhan detik |
| Serverless | Dikelola sepenuhnya oleh AWS |
Pertimbangkan konsekuensi kehilangan Redis, bukan hanya biayanya. Kalau Redis memegang session, kehilangannya berarti setiap pengguna yang sedang login terlempar keluar sekaligus. Kalau ia juga memegang cache, seluruh beban jatuh ke database pada saat yang sama — dan database yang tadinya santai bisa ikut tumbang. Replica di AZ berbeda adalah biaya yang murah dibandingkan skenario itu.
Kebijakan memori
maxmemory-policy = allkeys-lru # untuk klaster cache
maxmemory-policy = noeviction # kalau klaster ini juga memegang antrean
Ini setelan yang dipasang lewat parameter group. Kalau kamu memakai satu klaster untuk cache dan
antrean sekaligus, allkeys-lru akan membuang job saat memori penuh — kehilangan pekerjaan tanpa
satu pun error di log. Pilihan yang lebih aman untuk situs konten: cache di Redis, antrean di SQS.
Jaringan dan keamanan
- Klaster di subnet privat; tidak ada akses publik.
- Security group hanya menerima port 6379 dari security group task ECS.
- Nyalakan enkripsi saat transit dan saat disimpan.
- AUTH token disimpan di Secrets Manager, disuntikkan sebagai
secrets. - Beri prefiks kunci per lingkungan supaya staging tidak pernah menyentuh data produksi.
Memilih ukuran
| Yang disimpan | Perkiraan |
|---|---|
| Session per pengguna aktif | 1–10 KB |
| Halaman ter-cache | 10–100 KB |
| Hasil query ter-cache | 1–50 KB |
| Sisakan untuk operasi Redis | 25% dari total memori |
Jangan mengisi Redis sampai penuh. Redis butuh ruang kosong untuk operasi internal seperti penyimpanan snapshot dan pengelolaan memori. Melewati sekitar 75% pemakaian akan meningkatkan latensi dan memicu pembuangan kunci yang tidak kamu inginkan. Alarm pada 75%, bukan pada 95%.
Metrik
| Metrik | Alarm saat |
|---|---|
DatabaseMemoryUsagePercentage | > 75% |
Evictions | Bukan nol, kalau bukan cache murni |
CacheHitRate | < 80% |
CurrConnections | Mendekati batas node |
EngineCPUUtilization | > 70% — Redis satu utas; ini yang penting, bukan CPU node |
ReplicationLag | > 1 detik |
Latihan: buat klaster Redis dengan satu replica di AZ berbeda, arahkan cache dan session ke sana dengan database terpisah, lalu picu failover manual dari konsol. Ukur berapa lama aplikasimu gagal, dan periksa apakah pengguna yang login tetap login setelahnya.
Rangkuman ini sengaja dipangkas ke bagian yang dipakai di roadmap. Buka sumber aslinya saat kamu butuh detail lengkap atau referensi parameter.