1. Lý thuyết xây dựng bộ cân bằng tải cho web-servers
1.3.2. Các phương pháp cân bằng tải cho Cache:
Cân bằng tải cho cache và cân bằng tải cho server là rất khác nhau. Đối với cân bằng tải cho server, bộ cân bằng tải tìm cách để tìm ra server đang có tải nhẹ nhất, và đẩy request về đó. Trong cân bằng tải cache, điều này phụ thuộc vào content đang có trong cache, nhằm đạt được tỉ lệ cache-hit cao nhất. Khi yêu cầu đầu tiên được gửi đến chưa có trong cache, dữ liệu từ server sẽ được đẩy xuống cache 1, nếu như cùng một yêu cầu đó từ phía người dùng đến lần thứ hai, sẽ là không cần thiết nếu như dữ liệu từ server lại được đẩy xuống cache 2, vì dữ liệu đã có sẵn ở cache 1. Do đó cần phải có cơ chế để nhận biết rằng, dữ liệu đã tồn tại trong cache nào đó, chỉ cần lấy ở đó trả về cho người dùng. Như vậy sẽ tăng tỉ lệ cache-hit và tốc độ trả về cho người dùng.
Tuy khác nhau về nguyên lý, nhưng cũng có nhiều phương pháp để cân bằng tải cho cache khá giống với cân bằng tải server. Sau đây là một số phương pháp cân bằng tải cache thường được dùng:
Sử dụng hàm băm đơn giản (Simple Hashing)
Bộ cân bằng tải sẽ tính toán một giá trị bằng cách sử dụng một hàm băm dựa trên một tập các nhân tố như giá trị địa chỉ IP nguồn, giá trị địa chỉ IP đích, giá trị
cổng TCP/UDP nguồn và giá trị cổng TCP/UDP đích. Sau đó sử dụng giá trị này để tính toán xem cache nào là cache sẽ nhận được yêu cầu.
Một phương pháp để thực hiện việc này đó là sử dụng hàm băm đơn giản. Một phép toán số học giống như phép cộng bytes trên các nhân tố được chọn sẽ cho ra kết quả là giá trị 1 byte X nằm trong khoảng (0 – 255). Lấy X chia cho N (với N là số cache hiện có) sẽ được số dư nằm trong khoảng (0 – N-1), và số dư này sẽ chỉ định là cache nào sẽ được chọn để gửi yêu cầu. Một số điểm cần lưu ý trong phương pháp này là:
- Nếu sử dụng địa chỉ IP đích làm giá trị băm, tất cả các yêu cầu tới cùng một web server sẽ được cho vào 1 cache duy nhất, vì địa chỉ IP đích không thay đổi nên giá trị băm luôn không đổi.
- Cần phải cân bằng trong việc chọn nhân tố cho hàm băm, nếu như chỉ chọn địa chỉ IP đích làm giá trị băm sẽ dẫn đến mất cân bằng. Thực vậy, giả sử 80% yêu cầu đều vào cùng 1 server, 20% vào các server khác, trong khi đó chúng ta có 3 cache, như vậy 80% số yêu cầu sẽ vào cùng một cache do cùng IP đích. Như vậy sẽ cân bằng cache sẽ không hiệu quả.
- Khi một cache bị hỏng, sẽ có một phép tính toán lại với N-1 cache còn lại, nhằm đảo bảo cho yêu cầu không bị đẩy vào một cache không tồn tại.
Trong phương pháp simple hasing, chúng ta không quan tâm đến trạng thái cache, do đó nó còn được gọi là stateless load balancing, và chắc chắn sẽ có phương pháp stateful load balancing hoạt động hiệu quả hơn nhiều. Phương pháp này quan tâm đến tải hiện thời đang có của cache, từ đó tính toán nhằm đưa ra cache phù hợp nhất để nhận yêu cầu, tuy nhiên nó sẽ không tránh được sẽ bị lặp dữ liệu trong các bộ cache. Có 2 phương pháp thực hiện cân bằng tải stateful, đó là Hash Buckets và URL Hashing.
Hash Buckets
Phương pháp này sẽ giúp chúng ta loại bỏ được các điểm yếu của simple hashing. Hàm băm sẽ vẫn tính toán một giá trị băm dựa trên một số các nhân tố chẳng hạn như giá trị địa chỉ đích. Điểm khác ở đây là thuật toán băm sẽ được dùng để tính ra một giá trị băm giữa (0 – H), trong đó H là số xô băm (buckets). Nếu như
như H = 255, như vậy sẽ cần một giá trị 1 bytes giữa (0 – 255), chúng ta sẽ có simple hashing. Nếu như giá trị H càng cao, thuật toán phân tải sẽ càng chính xác, H =1024 sẽ hoạt động tốt hơn H = 255.
Khi khởi tạo, các buckets không được chỉ định cache, giống như trong hình dưới đây. Tại thời điểm nhận được kết nối đầu tiên (TCP SYN packet), giá trị hash sẽ rơi vào một bucket chưa được chỉ định, bộ cân bằng tải sẽ sử dụng một trong các thuật toán cân bằng tải để chỉ định một cache cho server này, chẳng hạn như sử dụng thuật toán “least connections” chỉ định cache đang chịu tải nhẹ nhất trong cụm cache cho bucket (bucket 4 cache c3). Tất cả các phiên và các gói dữ liệu sau này có giá trị hash 4 này sẽ đều được chuyển đến cache c3. Phương pháp này đòi hỏi bộ cân bằng tải phải theo dõi được tải của các cache để chuyển có thể chỉ định chúng cho bucket nào tại thời nhận đươc một giá trị băm mới.
H.2.1-16 Phương pháp hash buckets dùng trong caching
Nếu như một cache bị hỏng, hoặc được gỡ ra khỏi cụm để bảo trì, các hash bucket đã được chỉ định cho cache này sẽ được chỉ định lại, trong khi đó các cache khác sẽ không bị ảnh hưởng. Bộ cân bằng tải sẽ chỉ định cache mới cho các hash bucket này dựa trên tải của các cache tại thời điểm đó. Kết quả là tải của cache bị
hỏng sẽ được chia ra cho các cache đang hoạt động mà không ảnh hưởng đến hoạt động của toàn bộ hệ thống.
Vì hàm băm hoạt động dựa trên địa chỉ IP và các cổng nên phương pháp này chỉ có thể giảm thiểu được việc lặp lại dữ liệu ở một phần nào đó. Tuy nhiên phương pháp này sẽ giúp phân tải tốt hơn simple hashing. Trong simple hashing, nếu một cache không hoạt động, bộ cân bằng tải cần phải phân chia tải ở cache này vào trong các cache còn lại, nó sẽ làm ngắt quãng toàn bộ việc phân tải ở tất cả các cache. Trong khi đó sử dụng hash buckets, bộ cân bằng tải chỉ cần chỉ định lại cache cho những bucket đã được chỉ định cho cache không hoạt động, vì vậy không làm ngắt quãng hoạt động của các bucket khác.
URL Hashing
Phương pháp này nhằm loại bỏ hoàn toàn việc lặp dữ liệu ở trong các cache, tất cả các hàm băm đều sẽ sử dụng URL của đối tượng được yêu cầu. Điều này sẽ đảm bảo là tất cả các yêu cầu “con” của một yêu cầu ban đầu sẽ được chuyển đến cùng một cache, do đó sẽ tăng tỉ lệ cache-hit và tăng hiệu năng hoạt động của cache. Tại thời điểm ban đầu, khi người dùng khởi tạo kết nối TCP với một gói TCP SYN (gói dữ liệu được gửi đi để cho biết kết nối đã được thiết lập), bộ cân bằng tải chưa có URL của yêu cầu để thực hiện hàm băm. Do đó bộ cân bằng tải gửi đi một tín hiệu SYN ACK (tín hiệu cập nhập người dùng với những thay đổi của kích thước cửa sổ khi có rất nhiều gói dữ liệu nhận được không được trả lời) và chờ tín hiệu ACK trả về từ phía người dùng. Khi người dùng đã thiết lập xong kết nối, trình duyệt của họ sẽ gửi lệnh HTTP lấy được URL hoàn chỉnh và thực hiện hàm băm. Tuy vậy, bộ cân bằng tải cũng có thể chỉ cần hạn chế ở một số packet đầu tiên và thực hiện hằm băm trên đó.
URL hashing có thể được dùng với hash-buckets nhằm đạt được khả năng cân bằng tải cao. URL hashing sẽ khắc phục được nhược điểm của hash-buckets và ngược lại.