
Cân bằng tải Web-Proxy Client với ISA Server 2004 Standard Edition phần 1
Ngu
ồ
n:quantrimang.com
Trong bài này chúng ta sẽ chỉnh sửa cấu hình script do ISA Server 2004
Standard Edition cung cấp và triển khai nó cho các máy khách trình duyệt.
Cân bằng tải các Web-proxy thường được hiểu là một trong số những chức
năng do ISA Server Enterprise Edition cung cấp. Nhưng với nhiều người, chi phí
phụ của Enterprise Edition (phiên bản doanh nghiệp) khiến họ phải lưỡng lự,
mặc dù mong muốn của các tổ chức hay công ty là luôn cần dư để dự trữ và cân
bằng tải. Cho đến giờ phiên bản doanh nghiệp Standard Edition đã cung cấp một
số thủ thuật, bí quyết cho phép cân bằng tải. Nếu bạn có ý định sở hữu hai hoặc
ba ISA Server làm việc hiệu quả với nhau cùng một lúc, bài này có thể giúp bạn.
Giới thiệu
Với ISA Server 2004 (và cả 2000), nếu bạn muốn có nhiều hơn một server Web-
proxy cho tổ chức của mình và để chúng hoạt động hiệu quả cùng với nhau, bạn
nên ra ngoài và mua phiên bản Enterprise dành cho doanh nghiệp. Enterprise
Edition hỗ trợ Cache Array Routing Protocol (hay CARP) và cung cấp cơ chế liên
kết các proxy lại với nhau. Nhưng có thực sự rõ ràng? Nếu bạn chỉ có vài trăm
người dùng và phải chuẩn bị một lượng dư dự trữ Web-proxy lớn, bạn có thực
sự cần phải mất khoản chi phí thêm đáng kể cho cặp đôi bản quyền Enterprise?
Sự thật, người ta quan tâm đến CARP nhiều hơn là đọc về Enterprise Edition.
Một số khía cạnh của CARP vẫn còn được ẩn giấu trong Standard Edition chờ
bạn khám phá. Với hai hay ba server proxy trong "mảng", có thể bạn sẽ thấy
rằng mình tiết kiệm được nhiều khoản chi phí hiệu quả khi dùng Standard
Edition. Nếu nhiều hơn ba và giao thức không phải là CARP, bạn cần đến
Enterprise Edition. Phiên bản này quản lý trung tâm hơn và các thành phần
"Enterprise" khác được hỗ trợ.
Vậy, khi quyết định dùng hai Proxy để dự trữ, bạn muốn cả hai chia sẻ hoạt động
tải và tránh các khoản phụ phí, tính phức tạp của Enterprise Edition thì: các tuỳ
chọn là gì?
DNS Round-Robin và Network Load Balancing (NLB)
Cả hai cơ chế này có thể được dùng để cung cấp một số chức năng như khả
năng chịu sai sót (fault-tolerance) và cân bằng tải. Chắc chắn nhiều người sẽ
muốn thử chúng. Trong cả hai trường hợp bạn sẽ phải cấu hình một tên chung,
(như với NLB là một IP phổ biến) để trỏ tới tất cả server ISA. Trước Standard
Simpo PDF Merge and Split Unregistered Version - http://www.simpopdf.com

Edition, Microsoft không hỗ trợ hệ thống NLB phức tạp hơn.
Bạn có thể cấu hình trình duyệt của mình sử dụng tên proxy chung một cách
trực tiếp, hoặc cấu hình "dò tìm tự động", "kịch bản cấu hình tự động". Các tuỳ
chọn "tự động" này có một số cải tiến khác biệt so với phương thức tĩnh, trong
đó bạn có thể mô tả đường định tuyến sao lưu khi mọi thứ trở thành pear-
shaped.
Hãy thận trọng vì nếu bạn dùng các phương thức "tự động", trình duyệt sẽ
download file cấu hình từ một trong các Server ISA (được quyết định bởi NLB
hoặc round-robin) và file này sẽ nói với trình duyệt chỉ dùng proxy đó trong suốt
quá trình. Đây có thể không phải là cơ chế cân bằng tải mà bạn mong muốn! Để
vượt qua các lỗi nhanh hơn khi dùng phương thức "tự động", bạn có thể cấu
hình các thiết lập trên từng Server ISA, sử dụng Server ISA khác như một cách
thức sao lưu. ISA Server sau đó sẽ bổ sung thông tin này vào file cấu hình các
trình duyệt nhận về.
Điểm hạn chế lớn của các phương thức này là mỗi ISA Server đều xây dựng
một cache riêng chứa thông tin vốn có trên ISA Server khác. Đây không phải là
một cách sử dụng tài nguyên hiệu quả.
Các file cấu hình tự động proxy (Proxy Automatic Configuration - PAC)
Nếu bạn cấu hình "dò tìm tự động" hoặc "kịch bản cấu hình tự động" trong trình
duyệt, file cấu hình không phải đến từ ISA Server. Nó có thể được trỏ tới vị trí
khác chứa "kịch bản" cấu hình tuỳ biến do bạn cung cấp mà không phải là ISA
Server. Phương thức này mở ra toàn bộ thế giới có thể cho khả năng cân bằng
tải và khả năng chịu sai sót.
Các kịch bản (script) cấu hình này là gì? Gần như mọi trình duyệt hiện nay đều
hỗ trợ một cách không bắt buộc việc sử dụng các script cấu hình tự động. Chúng
được viết trong JavaScript. Trình duyệt chạy chúng sẽ gọi các hàm cụ thể trong
script mỗi khi có đường dẫn URL tìm đến. Hàm sẽ trả lại Web-proxy cho trình
duyệt sắp gửi yêu cầu URL tới.
Vậy các script này cân bằng tải như thế nào? Phương thức phổ biến là script
chạy một thuật toán "hash" (thuật toán băm) trên URL được yêu cầu và dùng kết
quả có được từ hàm băm đó để xác định Web-proxy nào sẽ gửi yêu cầu tới
(thuật toán trả ra xâu URL là một số duy nhất, gọi là số băm). Cải tiến tuyệt vời
của phương thức này là mỗi trình duyệt đều chạy cùng một hàm băm và xác
định cùng một Web-proxy cho đường dẫn URL được cung cấp một cách hoàn
chỉnh, tuỳ thuộc vào Web-proxy server. Điều này có nghĩa là các Web-proxy xây
dựng một cache duy nhất cho các "bạn" Web-proxy khác của nó. Vì thế, tài
Simpo PDF Merge and Split Unregistered Version - http://www.simpopdf.com

nguyên được khai thác một cách hiệu quả.
Số lượng thuật toán băm được dùng không bị giới hạn. Đã có chuyên gia phát
triển mô hình "Super Proxy Script" từ hồi năm 1996, bạn có thể tham khảo thêm
tại địa chỉ: http://naragw.sharp.co.jp/sps/. Nhưng với hầu hết mọi người, công
nghệ này thường được kết hợp với CARP.
Trong bài này chúng tôi sẽ khảo sát tỉ mỉ các script cấu hình tuỳ chọn dùng
CARP. Nghe có vẻ đáng sợ, nhưng bạn đừng lo, bất kỳ định kiến nào trước đó
về Enterprise Edition hỗ trợ CARP và Standard Edition note, tức ISA Server
Standard Edition sẽ được thay thế. Tất cả mọi việc 'đáng sợ' đều sẽ được thực
hiện tự động.
Cache Array Routing Protocol (CARP)
Như đã đề cập tới ở trên, người ta thường nói về CARP hơn là nhắc đến việc
bán phiên bản doanh nghiệp Enterprise Edition có chạy không. CARP gồm hai
kiểu: client-side CARP (trên máy khách) mà chúng ta đã thảo luận và server-side
CARP (trên máy chủ).
Server-side CARP
CARP này sử dụng cơ chế hàm băm tương tự (nếu không muốn nói là hoàn
toàn giống) với kiểu đã nói ở trên. Nhưng ở đây là dành cho máy chủ để xác
định xem liệu nó có URL yêu cầu nào trong bộ nhớ phụ cache không, nếu không
thì "bạn" nào của nó có không? Điều này khá tuyệt vời cho máy khách nào yêu
cầu URL mà không hoặc sẽ không hỗ trợ client-side CARP (tức các client
"Secure NAT" trong bộ nói ISA Server), hay nếu server có các mảng proxy theo
hướng ngược lại và phải quyết định proxy lớn nhất để gửi yêu cầu tới.
Simpo PDF Merge and Split Unregistered Version - http://www.simpopdf.com

ISA Server Enterprise Edition hỗ trợ server-side CARP nhưng bạn phải enable
sử dụng thành phần này. Phiên bản Standard Edition không hỗ trợ CARP server-
side.
Client-side CARP
Nếu một trình duyệt hỗ trợ client-side CARP thì bạn không phải vấn đề gì cho dù
Web proxy là Enterprise hay Standard Edition (hay thậm chí là ISA Server). Tuy
nhiên Enterprise Edition tạo các file cấu hình tự động với tất cả thành phần
client-sile CARP cần thiết đúng chỗ. Thậm chí nó làm việc này ngay cả khi bạn
không cho phép CARP trong cấu hình. Standard Edition cũng như vậy. Lỗi xuất
hiện trong Standard Edition là do nó không hiểu có 'đối tác' hay không, vì thế
không thể cấu hình thông tin cần thiết này trong script đã chuẩn bị.
Vì sao Microsoft không để cho phiên bản Standard Edition tạo mã client-side
CARP không chức năng trong các script cấu hình. Có nghĩa là, chỉ cần giúp đỡ
một chút, bạn có thể tạo được script đầy đủ chức năng.
Chúng ta hãy cùng xem xét script do ISA Server Standard Edition tạo ra này. Chỉ
cần mở trình duyệt, gõ: http://myISAServer:8080/wpad.dat (dùng tên server
của bạn). Ghi file khi được yêu cầu, sau đó mở nó trong một trình soạn thảo text
như Notepad.
Hãy xem các đoạn mã trong hộp thoại dưới đây:
//Copyright (c) 1997-2004 Microsoft Corporation
BackupRoute="DIRECT";
UseDirectForLocal=true;
function MakeIPs(){
}
DirectIPs=new MakeIPs();
cDirectIPs=0;
function MakeNames(){
}
DirectNames=new MakeNames();
cDirectNames=0;
HttpPort="8080";
cNodes=1;
function MakeProxies(){
this[0]=new Node("10.245.10.254",0,1.000000);
}
Simpo PDF Merge and Split Unregistered Version - http://www.simpopdf.com

Proxies = new MakeProxies();
function Node(name, hash, load){
this.name = name;
this.hash = hash;
this.load = load;
this.score = 0;
return this;
}
function FindProxyForURL(url, host){
var urlhash, urllower, ibest, bestscore, list, i, j,
port=HttpPort;
urllower = url.toLowerCase();
if((urllower.substring(0,5)=="rtsp:") ||
(urllower.substring(0,6)=="rtspt:") ||
(urllower.substring(0,6)=="rtspu:") ||
(urllower.substring(0,4)=="mms:") ||
(urllower.substring(0,5)=="mmst:") ||
(urllower.substring(0,5)=="mmsu:"))
return "DIRECT";
if (UseDirectForLocal && isPlainHostName(host))
return "DIRECT";
if (cDirectNames > 0)
for (i = 0; i < cDirectNames; i++)
if (shExpMatch(host, DirectNames[i]))
return "DIRECT";
if (cDirectIPs > 0)
for (i = 0; i < cDirectIPs; i += 2)
if (isInNet(host, DirectIPs[i], DirectIPs[i+1]))
return "DIRECT";
urlhash = HashString(url);
for (i = 0; i < cNodes; i++)
Proxies[i].score = Proxies[i].load *
Scramble(MakeInt(urlhash ^ Proxies[i].hash));
list = "";
for (j = 0; j < cNodes; j++) {
for (bestscore = -1, i = 0; i < cNodes; i++) {
if (Proxies[i].score > bestscore) {
bestscore = Proxies[i].score;
ibest = i;
}
}
Proxies[ibest].score = -1;
list = list + "PROXY " + Proxies[ibest].name + ":" +
Simpo PDF Merge and Split Unregistered Version - http://www.simpopdf.com

