Chương 1: Tổng quan về thiết kế hệ thống 1. Thiết kế trong các hệ thống nhỏ và trong các hệ thống lớn Đối với các hệ thống nhỏ không quá phức tạp thì ứng dụng của chúng ta sẽ sử dụng kiến trúc Client - Server như hình dưới: Luồng hoạt động của một ứng dụng đơn giản sử dụng kiến trúc Client - Server sẽ như sau: 1. Người dùng sử dụng trình duyệt web hoặc app mobile truy cập vào website của chúng ta thông qua tên miền api. Địa chỉ IP của website sẽ được trả về trình duyệt web hoặc app mobile mà người dùng truy cập.
Sau khi có được địa chỉ IP của website, HTTP request từ người dùng sẽ được gửi trực tiếp tới web server của chúng ta. Web server trả về các trang HTML hoặc dữ liệu JSON và hiển thị các thông tin mà người dùng mong muốn ở chính thiết bị của người dùng. Tuy nhiên, khi hệ thống có nhiều chức năng phức tạp hay số lượng người dùng truy cập hệ thống ngày càng nhiều và phải phục vụ cùng một lúc một số lượng lớn user thì hệ thống đơn giản trên sẽ không đủ khả năng để phục vụ. Như vậy, chúng ta cần phải áp dụng cách thiết kế khác để đáp ứng nhu cầu trên.
Bằng cách sử dụng đồng thời nhiều server thay vì một server lưu trữ toàn bộ như trước thì giờ đây chúng ta sẽ phân tách ra độc lập Web server và Database server chạy riêng biệt hoàn toàn. Công việc lúc này của chúng ta sẽ phải thiết lập nhiều server chạy đồng thời song song và đảm bảo chi khi tối ưu khi vận hành. Các nguyên lý thiết kế hệ thống 1. Scalability Scalability là khả năng mở rộng của hệ thống.
Có 2 cách để scale hệ thống: Vertical scaling và Horizontal scaling. Vertical scaling (scale up): chúng ta nâng cấp phần cứng (CPU, RAM, ổ cứng…) cho server. Đây là một cách đơn giản để cải thiện hiệu suất của hệ thống nhưng chúng ta không thể nâng cấp phần cứng liên tục, không giới hạn CPU, RAM vào server được vì giới hạn của phần cứng. Đây là nhược điểm lớn nhất của Vertical scaling.
Horizontal scaling (scale out): chúng ta mở rộng, thêm nhiều server khác vào hệ thống. Cách này sẽ khắc phục giới hạn của Vertical scaling và là lựa chọn tối ưu nhất để thiết kế trong các hệ thống lớn. Availability Availability là khả năng sẵn sàng của hệ thống để xử lý các yêu cầu liên tục trong một khoảng thời gian. Dưới đây là các chỉ số được áp dụng để đánh giá mức độ Availability của hệ thống: Như vậy, với mức độ sẵn sàng càng cao thì thời gian sập của hệ thống phải càng ngày càng được rút ngắn và gần như không để hiện tượng sập xảy ra.
Consistency Consistency là tính nhất quán của hệ thống. Tại cùng một thời điểm, tất cả người dùng phải đảm bảo thấy được dữ liệu như nhau, đồng nhất ngay cả khi thực hiện các thao tác cập nhật dữ liệu. Các khái niệm về fault tolerance Failure: cả hệ thống bị gián đoạn, không hoạt động. Fault: một phần của hệ thống không hoạt động.
Fault tolerance: khả năng chống fault - hệ thống vẫn tiếp tục hoạt động khi có fault (khi số lượng fault dưới một ngưỡng tối đa). Byzantine fault Byzantine fault hay còn được biết đến với Bài toán các vị tướng Byzantine, mô tả việc một nhóm các vị tướng Byzantine gặp các vấn đề về liên lạc khi cố gắng đạt sự đồng thuận về bước đi tiếp theo. Bài toán giả định rằng mỗi tướng có quân đội riêng và mỗi tướng đóng quân ở các địa điểm khác nhau xung quanh thành phố mà họ dự định tấn công. Các tướng phải đồng thuận về việc tấn công hoặc rút lui.
Vấn đề tấn công hay rút lui không quan trọng mà là sự đồng thuận của tất cả các tướng, tức là, đồng thuận về một quyết định chung để cùng phối hợp thực hiện. Do đó, chúng ta có thể xem xét kỹ càng các mục tiêu sau để đưa ra quyết định: ● Mỗi tướng phải quyết định: tấn công hoặc rút lui (có hay không). ● Không thể thay đổi quyết định sau khi đưa ra. ● Tất cả tướng phải nhất trí về một quyết định giống nhau và tiến hành đồng bộ với nhau.
Chương 2: Load balancer 2. Load balancer Load balancer (cân bằng tải) để phân phối đồng đều lưu lượng truy cập giữa các web servers. Đây là một thành phần cực kỳ quan trọng cho hệ thống sử dụng đồng thời nhiều server. Ưu điểm của Load balancer: ● Phân phối khối lượng công việc trên nhiều server, giảm tải cho hệ thống.
● Cải thiện hiệu suất và độ tin cậy cho website. Hardware & Software Hardware load balancer: là các thiết bị phần cứng máy tính chạy trên các phần mềm mã nguồn đóng, được xây dựng đặc biệt để có thể vận hành trên các bộ xử lý tùy chỉnh. Với càng nhiều lưu lượng truy cập, số lượng các thiết bị cân bằng tải phải tăng lên theo tỷ lệ thuận để có thể đáp ứng nhu cầu dịch vụ của khách hàng. Software load balancer: là giải pháp tiết kiệm chi phí nhưng mang lại hiệu suất vận hành tối ưu cho doanh nghiệp.
Chúng ta chỉ cần cài đặt phần mềm cân bằng tải vào trong hệ thống của mình, vẫn đảm bảo lưu lượng truy cập mà hệ thống chịu tải trong khi không cần bỏ một mức chi phí rất lớn cho việc sử dụng và vận hành các hệ thống cân bằng tải vật lý. Tầng xử lý Layer 7 load balancer: hoạt động ở tầng application - tầng cao nhất trong mô hình OSI, nó đưa ra quyết định định tuyến dựa trên các thông tin chi tiết về đặc điểm của các HTTP/HTTPS header, loại URL hoặc dữ liệu cookie… Layer 3/4 load balancer: hoạt động ở tầng network và tầng transport trong mô hình OSI, sử dụng thông tin về địa chỉ IP và cổng TCP/UDP để đưa ra quyết định định tuyến. Layer 3/4 load balancer thường không kiểm tra nội dung gói tin và chỉ chuyển tiếp các gói tin TCP/UDP đến các máy chủ backend. Global server load balancer: phân phối lưu lượng truy cập trên các server ở nhiều nơi trên toàn thế giới.
Sử dụng DNS và các thông tin về tài nguyên dịch vụ để đưa ra quyết định định tuyến. Thuật toán Các thuật toán thường được dùng để Load balancer quyết định điều hướng: ● Round Robin: phân phối lưu lượng truy cập đến các máy chủ theo lượt. ● Weighted Round Robin: tương tự như Round Robin, nhưng cho phép gán trọng số cho các máy chủ để ưu tiên một số máy chủ hơn. ● Least Connections: chuyển hướng lưu lượng truy cập đến các máy chủ có ít kết nối nhất.
● Weighted Least Connections: tương tự như Least Connections, nhưng cho phép gán trọng số cho các máy chủ để ưu tiên một số máy chủ hơn. ● IP Hash: sử dụng địa chỉ IP nguồn và đích của lưu lượng truy cập để tính toán một giá trị băm và gán kết nối đến một máy chủ cụ thể dựa trên giá trị băm này. Patterns Server-side load balancing: cung cấp các dịch vụ mạng và phân phối nội dung bằng cách sử dụng một loạt thuật toán cân bằng tải. Nó ưu tiên phản hồi các yêu cầu cụ thể từ khách hàng qua mạng.
Điều này nhằm đảm bảo phân phối ứng dụng nhất quán, hiệu suất cao. Client-side load balancing: là phương pháp trong đó việc phân phối lưu lượng mạng được thực hiện ở phía client. Client sẽ nhận thông tin về các máy chủ backend từ một dịch vụ danh mục (registry service) và sử dụng một thuật toán để chọn một máy chủ backend để gửi yêu cầu. Sau đó, client sẽ gửi yêu cầu trực tiếp đến máy chủ backend được chọn và nhận kết quả trả về.
Tăng availability của hệ thống Về cơ bản sẽ có 5 giải pháp để tăng availability cho hệ thống: ● Replication: với giải pháp này thì dữ liệu gốc sẽ được sao chép đến điểm đích thông qua những tác vụ sao chép (agent/job). ● Log Shipping: thông qua những tác vụ sao lưu Transaction Log, dữ liệu gốc sẽ được tiến hành sao chép đến điểm đích. ● Mirroring: thiết lập High availability dành cho database trong MS SQL Server bằng cách sao chép dữ liệu sơ cấp sang dạng thứ cấp thông qua các network transactions, nhờ sự hỗ trợ của các connection point cùng với port number. ● Clustering: giải pháp này sử dụng dữ liệu đã lưu trữ ở những địa điểm thường xuyên được truy cập, sử dụng cho máy chủ thứ cấp và sơ cấp.
Giải pháp này cần phải thiết lập Windows Clustering ở những nơi có sự chia sẻ dữ liệu chung. ● AlwaysON Availability Groups: dữ liệu sơ cấp sẽ được chuyển sang dạng thứ cấp bằng các network transactions. Với giải pháp này thì chúng ta không cần phải thiết lập Windows Clustering. Chương 3: Caching 3.
Tổng quan về caching Caching là phương pháp lưu trữ tạm thời kết quả của các phép tính hoặc phản hồi thường xuyên vào một vùng nhớ cache, giúp các yêu cầu tiếp theo của cùng phép tính hoặc phản hồi được truy cập và xử lý nhanh hơn. Các pattern trong caching 3. Local cache Ưu điểm của Local cache: ● Đơn giản, dễ sử dụng. Nhược điểm của Local cache: ● Khả năng scale không tốt.
Distributed cache Ưu điểm của Distributed cache: ● Sử dụng các thuật toán hash để phân mảnh data và lưu chúng trên nhiều node khác nhau. ● Tận dụng Redis, Memcache… làm backing data store. ● Khả năng scale, chịu lỗi và khả năng phục hồi tốt. Nhược điểm của Distributed cache: ● Độ trễ lớn hơn so với Local cache.
Reverse proxy cache Ưu điểm của Reverse proxy cache: ● Giảm tải cho server. ● Cache HTTP request khi Client thực hiện các request lặp lại nhiều lần, tăng hiệu suất truy cập. Nhược điểm của Reverse proxy cache: ● Không có khả năng chịu lỗi và phục hồi. ● Phụ thuộc vào API Gateway dẫn đến mức độ availability không cao.
Sidecar cache Sidecar là một container khác nằm trong một container chính để hỗ trợ chức năng cho service chạy trong container chính. Ưu điểm của Reverse proxy cache: ● Độ trễ thấp vì sidecar cache hoạt động như local cache. ● Dữ liệu cache không chiếm nhiều bộ nhớ cho ứng dụng đang hoạt động. Nhược điểm của Reverse proxy cache: ● Chỉ có thể triển khai khi dùng các nền tảng hỗ trợ containerized như Kubernetes.
● Nếu Pod phải khởi động lại khi gặp sự cố nào đó thì cả container sẽ phải khởi động lại và dữ liệu cache sẽ bị xóa. Reverse proxy sidecar cache Đây là sự kết hợp giữa Reverse-proxy và Sidecar cache, được tạo bằng cách chạy Reverse-proxy container và cache data container trên cùng một Pod. Trong cơ chế này thì chỉ có các phản hồi API mới được lưu vào Sidecar cache nhằm phục vụ cho các yêu cầu lặp đi lặp lại.