Hiện tại, mình đang phụ trách việc chuyển Server từ Linode sang sử dụng hệ sinh thái của AWS, đồng thời thiết lập cân bằng tải nhằm tránh tình trạng quá tải vào lúc cao điểm như giai đoạn vừa qua.
Multiple Load Balancer
Dự phòng khi 1 Server Load Balancer bị sập hoặc quá tải - chưa cần thiết.
Setup CDN for Assets
OK (Đang dùng S3 nhưng S3 không có chức năng của một CDN, có thể chuyển sang Cloudfront)
http://thachpham.com/hosting-domain/cdn-la-gi-va-khi-nao-nen-dung-cdn-cho-website.html
Application Server
Unicorn vs Puma vs Passenger
Quyết định vẫn dùng Passenger (Và tiếp tục dùng bản OSS).
Web Server (Nginx 1.9.x )
TODO: Tìm hiểu các thủ thuật để Improve Performance của Nginx.
Cân bằng tải
Load Balancing bằng Nginx hay dùng Haproxy, hay dịch vụ Load Balancer của Amazon
http://cloudacademy.com/blog/aws-elb-vs-haproxy/
Quyết định dùng Dịch vụ Load Balancing của AWS (Vì tuy không thể cấu hình linh hoạt, cũng không có nhiều lựa chọn về thuật toán như HaProxy nhưng rất tiện lợi).
Database Server
-
Theo mô hình một Database Server riêng và tập trung, hay là replicate theo Master-Slave, và để chung với Web Server?
-
Tách ra một Database Server riêng thì có nên Replicate thêm một Server để dự phòng hay không?
-
Dùng Amazon RDS hay tự cài Postgres trên Amazon EC2.
Dùng dịch vụ của Amazon RDS (và Replication + Multiple A-Z nếu cầu thiết để phòng rủi ro)
http://www.laurencegellert.com/2013/05/pros-and-cons-of-rds-vs-ec2-for-mysql-with-aws/
Redis Server
- Có nên tách Redis ra riêng một Server chuyên dùng để Caching hay không?
Tách ra một Server riêng và dùng dịch vụ của AWS.
Caching
https://github.com/Shopify/identity_cache để cache ActiveRecord (cụ thể là Course, Unit, Lesson, Exam…)
https://devcenter.heroku.com/articles/caching-strategies#fragment-caching
http://guides.rubyonrails.org/caching_with_rails.html
Action Controller Caching - https://github.com/rails/actionpack-action_caching
Fragment Cache? - Không dùng, Vì UBrand sẽ cache trên Front-End (AngularJS)
Deployment Progress
Mina, Capistrano, CodeDeploy của AWS
Automated Server Configuration
Chef, Puppet…
Chưa có thời gian tìm hiểu, tạm thời cài đặt thủ công và dùng chức năng Clone Server của AWS
Background Jobs Processing Framework
- Chỉ cho một Server chạy Sidekiq để tránh xung đột, dùng Data ở Redis nên không lo vấn đề phân tán.
Sử dụng Redis làm Sessions Store
http://www.justinweiss.com/articles/how-rails-sessions-work/
https://www.happybearsoftware.com/almost-protect-yourself-from-cookie-session-store.html
http://blog.togo.io/introducing/redis-store/
Lợi ích?
ElasticSearch
Hiện tại, chắc vẫn để ElasticSearch ở một con có cấu hình cao thay vì tách riêng (sử dụng dịch vụ của AWS) vì chưa có nhu cầu dùng nhiều.
Slow SQL Query
(>100ms), Viết lại Query khác hoặc bí lắm là Caching Results.
References
http://www.slideshare.net/kigster/12step-program-for-scaling-web-applications-on-postgresql
http://www.slideshare.net/kigster/from-obvious-to-ingenius-incrementally-scaling-web-apps-on-postgresql
http://www.slideshare.net/pgconf/five-steps-perform2009
http://www.slideshare.net/kigster/scaling-wanelocom-100x-in-six-months
http://nickcraver.com/blog/2016/02/17/stack-overflow-the-architecture-2016-edition/?utm_source=twitterfeed&utm_medium=facebook