Masalah Saat Ingin Connect ke Replica Set dengan IP Public

Masalah ini diakibatkan config Replica Set dengan menggunakan private IP.

Tapi ada case tertentu yang mengharuskan, kita bisa mengkoneksikan Replica Set lewat public IP, misal lagi debug masalah, atau konek beda VPS cloud provider.

Kalau kamu ingin mengkoneksikan menggunakan domain (FQDN), jangan lupa point domain ke server dan beri nama host sesuai dengan domain yang diberikan


Solusi

Setup koneksi menggunakan hostname

Misal,

  1. Replica Set 1, dengan hostname “rs-1” dengan private IP 192.168.1.11 dan public IP 172.16.1.11
  2. Replica Set 2, hostname “rs-2” dengan private IP 192.168.1.12 dan public IP 172.16.1.12
  3. Replica Set 3, hostname “rs-3” dengan private IP 192.168.1.13 dan public IP 172.16.1.13
  4. Replica Set dengan nama “replica-dong”

Selanjutnya

  1. Tambahkan di file /etc/hosts masing-masing server
192.168.1.11 rs-1
192.168.1.12 rs-2
192.168.1.13 rs-3
  1. Re-config replica set, masuk ke primary dengan mongosh

rs.reconfig({
  _id: "replica-dong",
  members: [
    {_id: 0, host: "rs-3:27017", priority: 2},  // Internal IP for primary
    {_id: 1, host: "rs-1:27017", priority: 1},  // Internal IP for secondary
    {_id: 2, host: "rs-2:27017", priority: 1}   // Internal IP for secondary
  ]
}, {force: true})
  1. Cek kembali dengan rs.status() harusnya di bagian name sudah menjadi name: 'rs-1:27017', dst

  2. Agar bisa terkoneksi dengan Replica Set menggunakan public IP, update juga file /etc/hosts di laptop kamu

172.16.1.11 rs-1
172.16.1.12 rs-2
172.16.1.13 rs-3
  1. Untuk app kamu yang menggunakan docker-compose
services:
  app:
    image: my-app:latest
    ports:
      - "8080:80"
    extra_hosts:
      - "rs-1:192.168.1.11"
      - "rs-2:192.168.1.12"
      - "rs-3:192.168.1.13"
  1. Untuk file yaml Kubernetes
apiVersion: apps/v1
kind: Deployment
metadata:
  name: my-app
spec:
  replicas: 1
  selector:
    matchLabels:
      app: my-app
  template:
    metadata:
      labels:
        app: my-app
    spec:
      containers:
        - name: app
          image: my-app:latest
      hostAliases:
        - ip: "192.168.1.11"
          hostnames:
            - "rs-1"
        - ip: "192.168.1.12"
          hostnames:
            - "rs-2"
        - ip: "192.168.1.13"
          hostnames:
            - "rs-3"