Kali ini kita akan bahas cara scaling websocket centrifugo, anggap kita akan memiliki 30000 (30 ribu) aktif user yang menggunakan service ini untuk chatting, notifikasi dan lain sebagainya. Agar bisa scaling centrifugo dibutuhkan redis terpisah, untuk percobaan ini kita akan menggunakan 5 server dengan spesifikasi yang sama
1 CPU
1 GB Memory
20 GB Disk

Pembagian server sebagai berikut
1 Redis
3 Centrifugo
1 HAProxy

Daftar IP Address yang digunakan, simpan juga baris dibawah ini ke masing-masing server di file /etc/hosts

10.10.0.193 centrifugo-1
10.10.17.251 centrifugo-2
10.10.18.150 centrifugo-3
10.10.18.205 redis
10.10.19.72 haproxy
# 95.111.xxx.xxx (Public IP) haproxy

Sengaja hanya haproxy yang menggunakan Public IP, karena semua user akan terhubung dari sini, karena HAProxy bekerja sebagai load balancer. Bila VM anda hanya memiliki Public IP tidak masalah, gunakan IP tersebut tetapi ingat untuk membatasinya hanya dari kelima IP diatas.

scaling centrifugo dengan redis

Disemua server jalankan update dan upgrade

sudo apt update; sudo apt upgrade -y
sudo apt install wget curl -y

bila ada update kernel, sebaiknya VPS di restart.

Instalasi Redis

Di server redis kita akan menginstall service redis

apt update && apt install redis -y

Sangat tidak direkomendasikan menggunakan redis dengan IP Publik, disini saya menggunakan UpCloud Singapore, yang kebetulan memiliki private IP yang bisa digunakan untuk koneksi private antar server, jadi saya akan menggunakannya. Bila tidak ada pilihan tersebut alternativenya menggunakan VPN.

Cek private IP VM anda

ip addr
#output
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
    link/ether 4e:c2:56:a3:5c:b8 brd ff:ff:ff:ff:ff:ff
    altname enp0s3
    altname ens3
    inet 95.111.xx.xx/22 brd 95.111.195.255 scope global dynamic eth0
       valid_lft 81886sec preferred_lft 81886sec
    inet6 fe80::4cc2:56ff:fea3:5cb8/64 scope link 
       valid_lft forever preferred_lft forever
3: eth1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
    link/ether 4e:c2:56:a3:e7:2b brd ff:ff:ff:ff:ff:ff
    altname enp0s4
    altname ens4
    inet 10.10.18.205/22 brd 10.10.19.255 scope global dynamic eth1
       valid_lft 2391sec preferred_lft 2391sec
    inet6 fe80::4cc2:56ff:fea3:e72b/64 scope link 
       valid_lft forever preferred_lft forever

pada eth1 tersebut adalah private LAN, disini saya akan menggunakan 10.10.18.205 sebagai IP redis. Buka konfigurasi redis di /etc/redis/redis.conf

bind 10.10.18.205
requirepass 7M7gw9iVqoVwoLkpMmgn

ganti 7M7gw9iVqoVwoLkpMmgn dengan password pilihan anda, terakhir di server redis ini, restart service redis

# aktifkan waktu booting
systemctl enable redis-server
# restart
systemctl restart redis-server

Instalasi Centrifugo

Instalasi dibawah ini dijalankan di ketiga server, dengan konfigurasi dan file config.json yang sama.

Di ketiga server centrifugo jalankan perintah berikut ini

mkdir /etc/centrifugo
useradd --system -U -M centrifugo -s /bin/false -d /etc/centrifugo

folder /etc/centrifugo digunakan untuk menyimpan file konfigurasi dari centrifugo itu sendiri.
Buat file /etc/centrifugo/config.json yang berisi

{
  "v3_use_offset": true,
  "token_hmac_secret_key": "914b5fd2-0dde-4ec6-ab14-d3bbd8011cc7",
  "admin_password": "d759c200-6b83-43f6-8853-820bd1c22947",
  "admin_secret": "ef934cfb-a76d-4675-aa8a-cb94e9da2fe2",
  "api_key": "0121509f-a21f-4e5e-ad22-16ae541b63ae",
  "admin": true,
  "health": true,
  "engine": "redis",
  "redis_host": "10.10.18.205",
  "redis_port": "6379",
  "redis_password": "7M7gw9iVqoVwoLkpMmgn"
}

bagian token_hmac_secret_key, admin_password, admin_secret bisa digenerate di salah satu server centrifugo dengan perintah

centrifugo genconfig

pada konfigurasi diatas kita mengaktifkan admin UI dan healthcheck.

Download centrifugo dari github

wget https://github.com/centrifugal/centrifugo/releases/download/v2.8.5/centrifugo_2.8.5_linux_amd64.tar.gz

ekstrak folder yang baru di download, lalu copy file centrifugo ke /usr/local/bin

tar zxvf centrifugo_2.8.5_linux_amd64.tar.gz
cp centrifugo /usr/local/bin/centrifugo

Buat systemd untuk menjalankan service centrifugo

cat >/lib/systemd/system/centrifugo.service <<'EOL'
[Unit]
Description=Centrifugo services
After=network.target syslog.target
 
[Service]
User=centrifugo
Group=centrifugo
LimitNOFILE=40000
 
Environment="CONFIG=/etc/centrifugo/config.json"
ExecStartPre=/usr/local/bin/centrifugo checkconfig -c $CONFIG
ExecStart=/usr/local/bin/centrifugo -c $CONFIG
ExecReload=/bin/kill -HUP $MAINPID
ExecStop=/bin/kill -SIGTERM $MAINPID
TimeoutStopSec=10
KillMode=control-group
RestartSec=1
Restart=always
StandardOutput=syslog
StandardError=syslog
SyslogIdentifier=centrifugo
 
[Install]
WantedBy=multi-user.target
Alias=centrifugo.service
EOL

Jalankan centrifugo

# aktifkan waktu booting
systemctl enable centrifugo
# restart centrifugo
systemctl restart centrifugo

Untuk melihat proses centrifugo cek dengan

systemctl status centrifugo
# pastikan port 800 bisa diakses
curl localhost:8000
# cek port 8000
ss -tunlp | grep 8000
# output
tcp     LISTEN   0        4096                   *:8000                *:*       users:(("centrifugo",pid=2448,fd=3))

Ambil dan catat masing-masing private IP server centrifugo, bila anda tidak memiliki private IP, bisa menggunakan public IP.

ip addr
ifconfig
ip route
hostname -I

bisa dengan salah satu cara diatas ;)

Instalasi HAProxy

Install HAProxy dengan paket manager

sudo apt install haproxy -y

saat ini versi yang tersedia adalah 2.0.13.

Pada konfigurasi HAProxy tambahkan baris

listen centrifugo
    bind *:80
    balance source
    mode tcp
    server centrifugo-1 centrifugo-1:8000 check weight 1
    server centrifugo-2 centrifugo-2:8000 check weight 1
    server centrifugo-3 centrifugo-3:8000 check weight 1

jalankan service haproxy dan aktifkan saat booting

sudo systemctl enable haproxy
sudo systemctl restart haproxy

Buka public IP haproxy, seharusnya muncul halaman admin yang meminta login
halaman admin cluster centrifugo
gunakan admin_password dari konfigurasi centrifugo diatas
centrifugo 3 cluster

Testing Scala Centrifugo

Untuk testing centrifugo bisa menggunakan cara disini. Untuk percobaan testing secara besar-besaran bisa menggunakan k6 ataupun Artillery.

Leave a comment

Your email address will not be published. Required fields are marked *