Scale Socket.IO với Redis và HAProxy – Bài 2: HAProxy load balancing

Bài trước mình đã giới thiệu Socket.IO và chạy một một instance Socket.IO trên PORT 3000. Nhưng một thằng thì chỉ phục vụ được một số lượng client nhất định thôi. Giờ muốn tăng tải lên hàng triệu kết nối thì phải thêm nhiều thằng Socket.IO vào, rồi phải cần một thằng trung gian đứng trước để phân tải tới cho những thằng Socket.IO nhàn rỗi hơn bằng một thuật toán nào đó. Bài này sẽ xài HAProxy load balancing để giải quyết vụ phân tải này.

HAProxy

1. Giới thiệu

HAProxy is a free, very fast and reliable solution offering high availability, load balancing, and proxying for TCP and HTTP-based applications. It is particularly suited for very high traffic websites and powers quite a number of the world’s most visited ones.

HAProxy có rất nhiều chức năng, bài này là ứng dụng tính năng load balancing.

2. Các thuật toán cân bằng tải

roundrobin

Nếu bạn có 3 node Socket.IO, bạn request 3 lần thì 3 request đó sẽ được phân tán tới lần lượt node1, node2, node3.

leastconn

Chọn node có ít connection nhất.

source

2 request từ cùng IP sẽ được route vào cùng 1 node

Sticky Sessions

Mỗi node có mỗi sticky key khác nhau, khi connect vào node nào bạn sẽ nhận được sticky key của node đó, những request sau bạn đưa sticky key lên lại để được route tới đúng node.

Redis đóng vai trò gì?

Ai cũng biết Redismemcache nhưng ngoài ra nó còn có chức năng pubsub rất kinh.
Tại sao lại có Redis pubsub ở đây nữa? Chẳng phải Socket.IOpubsub rồi sao?
Giả sử client A được HAProxy route tới node1, client B node2. A không thể gửi message cho B được vì không có gì kết nối node1 và node2. Để giải quyết ta cho node1, node2 sẽ là pubsub client của Redis. Message từ A gửi tới node1, node1 gửi message vào Redis channel, node2 nhận được publish từ Redis rồi tiếp tục publish message đó cho B.

Các bước setup cả bọn

haproxy load balancing

Mình mapping IP như thế này trong /etc/hosts

1. Cài đặt HAProxy

Mình sẽ cài đặt trên ubuntu server 16.04. Những môi trường khác tương tự thôi.

Start HAProxy service

Kiểm tra thử service thấy trạng thái active là được

Xong rồi để đó, chút quay lại configure sau :v

2. Cài Redis

Redis active rồi, next step.

3. Kết nối Socket.IO vào Redis

index.js

Tải source code mới nhất về chạy thôi :v https://github.com/havenvo/appconus-socket.io-chat.git

4. Run Socket.IO nodes

Mở 2 terminal để chạy 2 nodes Socket.IO
Terminal 1

Terminal 2

Ngon, có 2 nodes rồi. Giờ tạo 2 thằng client từ Chrome bằng URLs

Gửi message từ thằng A, B phải nhận được, chứng tỏ node1 đã thông với node2 qua Redis rồi.

5. Cài đặt tải từ HAProxy tới nodes

Thêm đoạn này vào cuối

HAProxy sẽ handle request trên PORT 8000 và gửi đến 2 nodes socketio.appconus.com:3000 và socketio.appconus.com:3001.
Nhớ maping socketio.appconus.com tới IP server trong /etc/hosts nhé. Mình làm vậy cho dễ nhìn, khỏi cần nhớ IP, nếu không thích thì cứ để thẳng IP address vào, không vấn đề gì cả.

Đoạn này để bật chức năng report của HAProxy, khi vào http://socketio.appconus.com:8000/?stats, account admin, password admin bạn sẽ thấy một trang thông báo trạng thái của mấy con server.

Xong restart lại HAProxy service

Vào http://socketio.appconus.com:8000/ để tận hưởng thành quả.

Kết: Setup như thế này chỉ giúp bạn tăng tải chứ chưa thể làm dịch vụ của bạn uptime 99.99% được, vì nếu thằng HAProxy mà die thì không còn đường vào nữa(Single point of failure). Vậy phải làm sao? Hẹn bài sau.

Happy coding!

Tham khảo

https://www.digitalocean.com/community/tutorials/an-introduction-to-haproxy-and-load-balancing-concepts
https://kemptechnologies.com/load-balancing/round-robin-load-balancing/
http://blog.appconus.com/2017/03/17/redis-high-availibility-voi-sentinel-va-replication-2/
https://devops.profitbricks.com/tutorials/install-and-configure-haproxy-load-balancer-on-ubuntu-1604/
https://www.digitalocean.com/community/tutorials/how-to-install-and-configure-redis-on-ubuntu-16-04
https://x-team.com/blog/socket-io-haproxy-aws/

Spread the love
  •  
  •  
  •  
  •  
  •  

Leave a Reply

9 Comments on "Scale Socket.IO với Redis và HAProxy – Bài 2: HAProxy load balancing"

Notify of
avatar
Sort by:   newest | oldest | most voted
Cao Quảng Bình
Guest

Vậy thằng redis mà nó tạch phát thì cả hệ thống cũng ngồi khóc luôn.

Ngoài thằng socket.io-redis thì còn 1 ứng cử viên đối trọng khác là ioredis với những support tốt hơn cho HA-redis.

NguoiLa
Guest

redis là bộ nhớ đệm thì làm sao mà tạch đc, chỉ có chết hẳn server đó thôi.

NguoiLa
Guest

Mình đang làm dự án này ( game online ) nên ngóng bài viết tiếp theo, hy vọng bạn có thể ra nhanh thiệt nhanh @@”