haproxy: làm thế nào để chuẩn bị bảo trì máy chủ mà không cần khởi động các phiên ứng dụng?


13

Vấn đề

Tôi đang sử dụng haproxy để tải các máy chủ web cân bằng. Tôi sử dụng tính bền vững của phiên với các cookie bổ sung vì một số ứng dụng sử dụng tệp phiên và chúng không được đồng bộ hóa giữa các máy chủ.

Tôi muốn vô hiệu hóa một máy chủ để bảo trì, nhưng không phá vỡ các phiên. Vì vậy, tôi muốn cho phép các khách hàng hiện tại tiếp tục phiên ứng dụng của họ, nhưng không chấp nhận các khách hàng mới.

hành vi haproxy

  • Tôi đặt một máy chủ để "bảo trì"
  • nếu khách hàng có bộ cookie, hãy sử dụng máy chủ ngay cả khi được đánh dấu là "đang bảo trì"
  • nếu một máy khách mới (không có cookie) đến, nó sẽ được chuyển đến một máy chủ khác
  • sau khi tất cả khách hàng kết thúc phiên ứng dụng của họ, sẽ không có khách hàng nào đặt cookie vào máy chủ cụ thể này nữa và tôi sẽ tắt nó đi mà không bị gián đoạn người dùng.

Bạn có nghĩ rằng điều này là có thể đạt được với một số cấu hình haproxy? Hoặc có một cách thông minh để làm điều đó?

Những cách khác

Danh sách không đầy đủ các cách khác để đạt được nhu cầu này:

  • đồng bộ hóa các tệp phiên giữa các máy chủ (cần một cách để đồng bộ hóa các tệp giữa một số máy chủ hoặc một điểm gắn kết chung)
  • sử dụng cơ sở dữ liệu để lưu trữ thông tin phiên (cần thay đổi hành vi ứng dụng)

Thêm chi tiết

Tôi sử dụng loại cấu hình này:

frontend https-in
   bind xxx.xxx.xxx.xxx:443 ssl crt /etc/haproxy/ssl/_default.pem crt /etc/haproxy/ssl
   reqadd X-Forwarded-Proto:\ https

   acl APP1 hdr(host) -i APP1.atac.local
   use_backend APP1 if APP1

   default_backend _default

backend APP1
   redirect scheme https if !{ ssl_fc }
   mode http
   balance roundrobin
   cookie HAPROXY_SESSION insert indirect
   option httpchk HEAD /haproxy_test_page.php HTTP/1.0\nUser-Agent:\ HAProxy
   server SRV1 SRV1_IP:PORT cookie SRV1 check
   server SRV2 SRV2_IP:PORT cookie SRV2 check

Nếu tôi chỉ tắt SRV1 (bằng lệnh haproxy cli), tôi nghĩ tất cả các phiên ứng dụng được mở trên SRV1 sẽ bị hỏng sau khi kết thúc "phiên" HTTP hiện tại. Có đúng không?


Máy chủ của bạn đang chạy ở chế độ HTTP hay chế độ TCP?
austinian

1
@austinian; Chế độ http có thể giống như cách anh ấy nói về việc cân bằng và kiên trì dựa trên cookie (chế độ TCP không cung cấp các tính năng như vậy).
GregL

@Christophe, bạn đã thực sự thử cấu hình được mô tả trong phần 'hành vi haproxy' của mình chưa, vì nó sẽ hoạt động.
GregL

@GregL, đúng rồi, đó cũng là điều tôi đang nghĩ. Nếu anh ta đang sử dụng chế độ HTTP và chỉ đặt máy chủ ở chế độ bảo trì, thì nó sẽ ngừng chấp nhận các phiên mới nhưng vẫn duy trì các phiên hợp lệ cho đến khi hết hạn. Bạn vẫn có thể có cookie, v.v. trong chế độ TCP, nhưng sau đó nó sẽ không có ý nghĩa gì với HAProxy.
austinian

@Christophe, bạn đang cố gắng sử dụng "một cách thông minh hơn" để rút ngắn thời gian bảo trì của bạn hay chỉ tìm cách để các phiên kết thúc một cách duyên dáng trong khi bạn chờ đợi để bảo trì?
austinian

Câu trả lời:


6

Đặt máy chủ ở chế độ thoát bằng giao diện quản lý web. Điều đó cung cấp các chức năng chính xác mà bạn đang tìm kiếm.


3
Nếu bạn đặt nó thành Duy trì, nó sẽ ngừng gửi bất kỳ lưu lượng truy cập nào đến nó, như được nêu ở đây . Thay vào đó, anh ta muốn đưa nó vào chế độ Drain và sử dụng stick-tablehết hạn để cung cấp sự bền bỉ.
GregL 16/07/2015

@GregL, ôi, sửa ngay bây giờ
austinian 16/07/2015

Cảm ơn câu trả lời của bạn, austinian và @GredL. Tôi sẽ thử xem. Phần cứng sẽ là với cái bàn, tôi nghĩ vậy. Tôi sẽ phải tìm cách lưu trữ mọi máy khách với cookie được đặt thành máy chủ chế độ thoát nước trong bảng dính này.
Barshe Drevet-Droguet

Chà, có vẻ như chế độ thoát là đủ trong trường hợp của tôi, các phiên đã có bộ cookie vẫn sử dụng máy chủ thoát nước và các phiên mới được chuyển đến các máy chủ khác.
Barshe Drevet-Droguet

1
Làm thế nào để bạn thay đổi chế độ trong giao diện web? Có vẻ như chỉ là thông tin.
kagronick

9

Nếu bạn sử dụng socat để liên lạc với các cấu hình haproxy của mình, bạn có thể đặt máy chủ ở trạng thái thoát theo cách sau:

echo "set server backend/serv state drain" | sudo socat stdio /etc/haproxy/haproxysock

Thêm lệnh ở đây ! Để cài đặt socat trong Ubuntu, hãy vào câu trả lời này

Tôi kiểm tra điều đó với phiên bản haproxy 1.6.3 :)


1

Những cách khác

đồng bộ hóa các tệp phiên giữa các máy chủ (cần một cách để đồng bộ hóa các tệp giữa một số máy chủ hoặc một điểm gắn kết chung)

Nếu máy chủ phụ trợ của bạn sử dụng PHP cho (các) ứng dụng, bạn có thể sử dụng Memcache để đồng bộ hóa các phiên giữa chúng.

Ngoài ra Couchbase-Server có thể sao chép memcache ra khỏi hộp.
Tất nhiên, đó là loại quá mức cần thiết để sử dụng máy chủ couchbase chỉ để sao chép phiên :)


Mặc dù nó sẽ là một cách tốt hơn, nó cần thay đổi mã, tôi nghĩ vậy. Vì vậy, tôi sẽ sử dụng austinian và GregL, trả lời cho các ứng dụng hiện tại của chúng tôi không đồng bộ hóa các phiên.
Barshe Drevet-Droguet

Nếu mã của bạn không đặt trình xử lý phiên tùy chỉnh, thì bạn không cần thay đổi bất kỳ mã nào cho PHP để sử dụng memcache cho phiên. Tất cả đều được cấu hình trong php.ini, không phải trong mã.
Cha0s

OK, Cha0s, tôi sẽ xem xét điều đó.
Barshe Drevet-Droguet
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.