Tôi đã luôn sử dụng DNS Round-Robin, với TTL dài, làm bộ cân bằng tải. Nó hoạt động thực sự tốt cho các dịch vụ HTTP / HTTPS với trình duyệt .
Tôi thực sự căng thẳng với các trình duyệt vì hầu hết các trình duyệt đều thực hiện một số «thử lại trên một IP khác», nhưng tôi không biết các thư viện hoặc phần mềm khác sẽ xử lý nhiều giải pháp IP như thế nào.
Khi trình duyệt không nhận được phản hồi từ một máy chủ, nó sẽ tự động gọi IP tiếp theo, rồi gắn bó với nó (cho đến khi nó ngừng hoạt động ... và sau đó thử một máy chủ khác).
Quay trở lại năm 2007, tôi đã thực hiện bài kiểm tra sau:
- thêm iframe trên trang web của tôi, chỉ vào một mục Round-Robin, chẳng hạn như
http://roundrobin.test:10080/ping.php
- trang được phục vụ bởi 3 socket PHP, nghe trên 3 IP khác nhau, tất cả trên cổng 10080 (tôi không đủ khả năng để kiểm tra trên cổng 80, vì trang web của tôi đang chạy trên đó)
- một ổ cắm (giả sử A ) đã ở đó để kiểm tra xem trình duyệt có thể kết nối trên cổng 10080 (vì nhiều công ty chỉ cho phép các cổng tiêu chuẩn)
- hai ổ cắm khác (giả sử B và C ) có thể được bật hoặc tắt khi đang di chuyển.
Tôi để nó chạy một giờ, có rất nhiều dữ liệu. Kết quả là trong 99,5% số lần truy cập vào ổ cắm A , tôi đã có một lần truy cập vào một trong hai ổ cắm B hoặc C (dĩ nhiên tôi không vô hiệu hóa cả hai lần này). Các trình duyệt là: iPhone, Chrome, Opera, MSIE 6/7/8, BlackBerry, Firefox 3 / 3.5 ... Vì vậy, ngay cả các trình duyệt không tuân thủ cũng đã xử lý đúng!
Cho đến ngày hôm nay, tôi chưa bao giờ thử nghiệm lại, nhưng có lẽ tôi sẽ thiết lập một thử nghiệm mới vào một ngày hoặc phát hành mã trên github để những người khác có thể kiểm tra nó.
Lưu ý quan trọng: ngay cả khi nó hoạt động hầu hết thời gian, nó sẽ không loại bỏ thực tế là một số yêu cầu sẽ thất bại. Tôi cũng sử dụng nó cho các yêu cầu POST, vì ứng dụng của tôi sẽ trả về một thông báo lỗi trong trường hợp nó không hoạt động, để người dùng có thể gửi lại dữ liệu và rất có thể trình duyệt sẽ sử dụng IP khác trong trường hợp này và lưu sẽ hoạt động . Và đối với nội dung tĩnh, nó hoạt động thực sự tuyệt vời.
Vì vậy, nếu bạn đang làm việc với các trình duyệt, hãy sử dụng DNS Round-Robin, cho nội dung tĩnh hoặc động, bạn sẽ ổn. Máy chủ cũng có thể đi xuống giữa giao dịch và ngay cả với bộ cân bằng tải tốt nhất bạn cũng không thể xử lý trường hợp như vậy. Đối với nội dung động, bạn phải làm cho các phiên / cơ sở dữ liệu / tệp của mình được đồng bộ hóa, nếu không bạn sẽ không thể xử lý việc này (nhưng điều đó cũng đúng với bộ cân bằng tải thực).
Lưu ý thêm: bạn có thể kiểm tra hành vi trên IP của chính mình bằng cách sử dụng iptables
. Ví dụ: trước quy tắc tường lửa của bạn cho lưu lượng HTTP, hãy thêm:
iptables -A INPUT -p tcp --dport 80 --source 12.34.56.78 -j REJECT
(nơi 12.34.56.78
rõ ràng là IP của bạn)
Không sử dụng DROP
, vì nó để cổng được lọc và trình duyệt của bạn sẽ đợi cho đến khi hết thời gian. Vì vậy, bây giờ, bạn có thể kích hoạt hoặc vô hiệu hóa một máy chủ này hoặc máy chủ khác. Thử nghiệm rõ ràng nhất là vô hiệu hóa máy chủ A, tải trang, sau đó kích hoạt máy chủ A và vô hiệu hóa máy chủ B. Khi bạn tải lại trang, bạn sẽ thấy một chút chờ đợi từ trình duyệt, sau đó nó sẽ tải từ máy chủ Một lần nữa. Trong Chrome, bạn có thể xác nhận IP của máy chủ bằng cách xem yêu cầu trong bảng điều khiển mạng. Trong General
tab của Headers
, bạn sẽ thấy một tiêu đề giả có tên Remote Address:
. Đây là IP từ nơi bạn nhận được câu trả lời.
Vì vậy, nếu bạn cần chuyển sang chế độ bảo trì trên một máy chủ, chỉ cần vô hiệu hóa lưu lượng HTTP / HTTPS theo một iptables
REJECT
quy tắc, tất cả các yêu cầu sẽ chuyển đến các máy chủ khác (với một chút chờ đợi, hầu như không thể nhận thấy đối với người dùng).