Nguyên nhân gây sự cố máy chủ cho các startup, phải làm thế nào để ngăn chặn?
Mục tiêu duy nhất và lớn nhất của một startup là phát triển với tốc độ nhanh nhất có thể. Để đạt được mục tiêu đó, nhiệm vụ khó khăn nhất thường là làm thế nào để thu hút và giữ chân khách hàng. Và do đó, khi một startup đang phát triển, việc cung cấp một dịch vụ ổn định và đáng tin cậy là vô cùng quan trọng.
Tuy nhiên, không phải hệ thống nào cũng có khả năng phát triển và vận hành trơn tru. Đó là lý do vì sao chúng ta cần tìm hiểu những phương thức giúp tăng hiệu suất hiện tại lên 1000X và thậm chí hơn thế nữa. Bài viết này, Bizfly Cloud sẽ đề cập rõ hơn vấn đề này.
Single point of failure
"Sức mạnh của cả một sợi dây cũng chỉ ngang bằng với mắt xích yếu nhất." Cũng tương tự như vậy, đối với một trang web, sẽ có những yếu điểm chí mạng có thể khiến web đó ngưng hoạt động khi lưu lượng truy cập tăng đột biến. Những yếu điểm này có thể là:
- Lưu lượng truy cập/thoát mạng
- CPU load
- Tốc độ xử lý của RAM
- Khả năng truy cập cơ sở dữ liệu (cục bộ hoặc từ xa)
- IOPS của ổ cứng (liên quan chặt chẽ tới truy cập cơ sở dữ liệu)
- Các dịch vụ bên ngoài
Cùng phân tích từng yếu tố một và xác định những cải tiến nào có thể được thực hiện đối với mỗi yếu tố này.
Tối ưu hóa mạng network
Dung lượng mạng rất có thể nhanh chóng đạt tới điểm tới hạn nếu các dịch vụ đòi hỏi lượng băng thông cao như phần mềm, video hoặc âm thanh. Có 2 loại kỹ thuật có thể để cải thiện vấn đề hiệu suất này.
Kỹ thuật đầu tiên được sử dụng là CDN (Mạng phân phối nội dung). Hệ thống phân phối nội dung là một dịch vụ có thể được triển khai giữa máy chủ và toàn bộ máy tính của khách hàng. Thông qua việc quản lý DNS ẩn danh, CDN cho phép gửi nội dung từ máy chủ cache, chứ không chỉ từ máy chủ gốc. Giải pháp này cũng giúp giảm độ trễ đáng kể vì hệ thống CDN sẽ định vị địa lý khách hàng và gửi nội dung từ máy chủ gần nhất cho người đó.
Thông thường các nhà cung cấp CDN triển khai hàng chục máy chủ trên toàn thế giới. Giải pháp này thực sự có tính hiệu quả trong thế giới máy tính hiện đại vì nó cho phép gửi tất cả nội dung tĩnh như javascript, hình ảnh, phông chữ, vv mà không gây ra quá tải máy chủ.
Cách thứ hai, là sử dụng dịch vụ lưu trữ tĩnh cho phép thả các big content (nội dung chủ đạo) vào các cluster lớn và phân phối các nội dung cho khách hàng từ đó. Việc tích hợp loại dịch vụ này vào ứng dụng cũng tương đối đơn giản khi API SDK thường được cấp sẵn. Nguyên tắc khá đơn giản, thay vì gửi nội dung (video, âm thanh hoặc bất cứ thứ gì) đến máy chủ của bạn, máy chủ của bạn sẽ tạo một tệp trống trên hệ thống lưu nội dung tĩnh và cung cấp url POST để cho phép người dùng cuối (trình duyệt, ứng dụng di động…) phát nội dung trực tiếp mà không cần phải thông qua máy chủ của bạn.
Tối ưu hóa CPU
CPU là yếu tố hiệu năng có thể cải thiện tốt nhất vì việc cấu hình máy chủ cũng khá dễ dàng. Tuy nhiên, với website hoặc API server, không nên để tải CPU ở mức lớn. Web server hoặc API server được tạo ra để thiết lập và nhận giá trị đến hoặc đi từ cơ sở dữ liệu, thay đổi một số giá trị và gửi lại cho khách hàng. Việc tạo PDF lớn, sao chép video, chuyển đổi tập tin không nên do web server thực hiện mà thay vào đó sử dụng một máy chủ ứng dụng chuyên dụng. Đây là một trường hợp khá kinh điển và thường xảy ra rất nhiều trong các startup đang phát triển.
Ban đầu, việc xây dựng một ứng dụng với tốc độ nhanh nhất là một ưu tiên rất bình thường, vì chỉ cần ghép code vào web server là đủ. Nhưng đến một thời điểm, khi lưu lượng truy cập tăng, chẳng hạn, nếu CPU load 100% truyền một file mất 10 giây, với tỷ lệ chuyển đổi song song là 10, vậy máy chủ sẽ mất 100 giây để truyền tải nội dung và thời gian này sẽ lớn hơn timeout mặc định 60s. Các vấn đề bắt đầu từ đây.
Có 2 cách để tránh những vấn đề này
Giảm tải CPU bằng cách chuyển việc xử lý cho một máy chủ bổ sung. Mỗi khi bạn nhận được một file mới cần chuyển đổi, file đó sẽ đi vào vùng chờ xử lý bởi một máy chủ khác. Sau đó, khi vùng lưu tạm này nhận được các mục mới, một ứng dụng chuyên dụng sẽ xử lý nội dung và gửi thông báo cho khách hàng ngay khi tệp sẵn sàng. Các thao tác này cũng giống hệt như khi bạn chuyển đổi video trên youtube hoặc các dịch vụ video khác.
Chia sẻ tải CPU trên một số máy chủ. Về mặt kỹ thuật mà nói, đây là một kỹ thuật hết sức thú vị. Hầu hết các nhà cung cấp cơ sở hạ tầng hoặc cloud đều cung cấp tính năng cân bằng tải, cho phép chia kết nối tới một số máy chủ. Trên thực tế, có một số cách để thực hiện cân bằng tải, có thể dùng DNS - còn được gọi là (Round Robin DNS) hoặc cân bằng tải theo mạng - Load balancer.
Lưu ý: Trước khi bắt đầu chia sẻ tải giữa các máy chủ, bạn cần đảm bảo có một hệ thống chia sẻ theo session, nếu không khách hàng sẽ liên tục bị ngắt kết nối ngay khi có kết nối chuyển từ máy chủ này sang máy chủ khác. Cách tốt nhất là lưu các session này vào một cơ sở dữ liệu. Có thể sử dụng bất kỳ loại cơ sở dữ liệu nào, tuy nhiên, hệ cơ sở dữ liệu NoSQL hoặc cơ sở dữ liệu tạm thời như Redis sẽ dễ dàng để ứng dụng hơn.
Tối ưu hóa cho RAM
Mức tiêu thụ của RAM cũng khá giống với CPU. Trên thực tế, một tiến trình sẽ chiếm dụng một lượng CPU và RAM nhất định. Nếu máy chủ của bạn không có đủ RAM, giống như đối với sự cố CPU, bạn nên chia sẻ lượng công việc giữa các máy chủ và có thể cân nhắc việc phân bổ các tiến trình tiêu thụ lượng RAM lớn cho một server chuyên dụng.
Truy cập database và IOPS
Đây là phần được đánh giá là khó nhất. Cơ sở dữ liệu thường là trung tâm của bất kỳ hệ thống công nghệ thông tin nào, nơi duy nhất chúng ta lưu trữ dữ liệu. Do đó, hệ thống cơ sở dữ liệu phức tạp hơn rất nhiều khi được chia sẻ trên nhiều máy chủ, vì dữ liệu bằng 0 hoặc 1 và khó cập nhật trong thời gian thực lên nhiều máy chủ. Vì vậy, điều đầu tiên khi cần mở rộng ứng dụng là xác định những yêu cầu nào được sử dụng nhiều nhất và cho tính năng / chức năng nào.
Như đã thảo luận trước đó, các session không nên cùng lưu trữ trên cùng một cơ sở dữ liệu với ứng dụng chính. Session được tạo ra trên hầu hết các yêu cầu của người dùng và bản thân session là dữ liệu lớn. Ngoài ra, nếu ứng dụng chủ yếu chỉ quản lý một lượng lớn các thông tin đơn giản như các liên kết http://goo.gl, thì bạn không nên lưu trữ chúng trên cơ sở dữ liệu chính, thay vào đó, hãy sử dụng một cơ sở dữ liệu chuyên dụng trong đó sử dụng NoSQL. Một cách khác là sử dụng cơ sở dữ liệu cache như Redis cho session, nếu ứng dụng của bạn cần lưu trữ nhiều thông tin tạm thời, thì Redis là lựa chọn tuyệt vời để giảm khối lượng công việc cho cơ sở dữ liệu chính.
Nguồn: Bizfly Cloud chia sẻ