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.
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
gunakan admin_password dari konfigurasi centrifugo diatas
Testing Scala Centrifugo
Untuk testing centrifugo bisa menggunakan cara disini. Untuk percobaan testing secara besar-besaran bisa menggunakan k6 ataupun Artillery.