Làm thế nào bạn có thể làm cho một cụm chỉ chạy một nhiệm vụ?


13

Nếu bạn có một nhiệm vụ mà bạn chỉ muốn chạy một lần trên một cụm máy chủ, thì trong một khoảng thời gian đều đặn, cách tốt nhất để đạt được điều này là gì? Định nghĩa của cụm trong trường hợp này là 2 hoặc nhiều máy chủ giống hệt nhau với các phiên phân tán nằm phía sau bộ cân bằng tải.

Ca sử dụng: Bạn có một nhiệm vụ tốn kém khi chạy mà chỉ nên chạy một lần mỗi X giờ. Công việc này có thể lặp đi lặp lại qua một loạt các hồ sơ và cập nhật trạng thái của họ.

  • Trường hợp xấu nhất là việc chạy hai lần làm mất hiệu lực dữ liệu của bạn.
  • Trường hợp tốt nhất là công việc sử dụng tài nguyên trên tất cả các máy chủ của bạn.

Tóm tắt yêu cầu:

  1. Công việc vẫn phải chạy ngay cả khi một trong các nút bị hỏng.
  2. Công việc chỉ phải được chạy một lần mỗi lịch trình.
  3. Nếu nhiều công việc được lên lịch cùng một lúc hoặc tại các thời điểm chồng chéo thì số lượng công việc đang chạy được phân bổ đều giữa các máy chủ.
  4. Các máy phải có cùng cơ sở mã và được đồng bộ hóa thông qua NTP.
  5. Cấu hình có thể khác nhau giữa nút và nút, bởi các biến môi trường.
  6. Công việc phải bắt đầu đúng giờ hoặc trong một khoảng thời gian nhất định của thời gian được giao. (nói 5 phút chẳng hạn)

Phương pháp khả thi

  • Đặt một nút làm nút chính, điều này không hoạt động vì nó vi phạm 1 ở trên.
  • Đưa ra yêu cầu rằng bộ cân bằng tải cân bằng để khởi động công việc. Thật không may, điều này có tác dụng phụ là nếu bạn có nhiều công việc đang chạy cùng một lúc thì tất cả chúng có thể được chạy bởi cùng một máy.

Điều này sẽ phải chạy trong Java, trong một thùng chứa servlet. Tuy nhiên nó không mã hóa các công việc tôi đang tìm kiếm.

Chắc chắn đây là một vấn đề được giải quyết với giải pháp tốt nhất được biết đến.


Câu hỏi liên quan. /programming/5949038/schedule-job-executes-twice-on-cluster

Đây không phải là một bản sao vì giải pháp là không đủ theo 5 yêu cầu được đưa ra ở trên. Giải pháp nâng cao nhất gặp phải vấn đề về chủng tộc và giải pháp thứ hai vi phạm yêu cầu 3

Câu trả lời:


16

Bạn có một cơ sở dữ liệu chia sẻ? Tôi đã làm điều này bằng cách sử dụng một cơ sở dữ liệu như là trọng tài trong quá khứ.

Về cơ bản, mỗi "công việc" được biểu diễn dưới dạng một hàng trong cơ sở dữ liệu. Bạn lên lịch công việc bằng cách thêm một hàng vào cơ sở dữ liệu với thời gian bạn muốn nó chạy sau đó mỗi máy chủ thực hiện:

SELECT TOP 1 *
FROM jobs
WHERE state = 'NotRun'
ORDER BY run_time ASC

Bằng cách đó, tất cả họ sẽ chọn công việc được lên kế hoạch để chạy tiếp theo . Tất cả đều ngủ để họ thức dậy khi công việc thực sự phải chạy. Sau đó, tất cả họ làm điều này:

UPDATE jobs
SET state = 'Running'
WHERE job_id = :id
  AND state = 'NotRun'

Đâu :idlà định danh của công việc bạn có trong bước trên. Vì bản cập nhật là nguyên tử, nên chỉ có một trong các máy chủ thực sự cập nhật hàng, bạn có thể kiểm tra mã trạng thái "số lượng cập nhật hàng" của cơ sở dữ liệu để xác định xem bạn có phải là máy chủ thực sự cập nhật hàng hay không và do đó bạn có phải là máy chủ không Điều đó được điều hành công việc.

Nếu bạn không "chiến thắng" và bạn không điều hành công việc, chỉ cần quay lại bước 1 ngay lập tức. Nếu bạn đã "giành chiến thắng", hãy lên lịch cho công việc để thực hiện trong một luồng khác, sau đó đợi vài giây trước khi quay lại bước 1. Bằng cách đó, các máy chủ không nhận được công việc lần này có nhiều khả năng nhận công việc hơn đó là lịch trình để chạy ngay lập tức.


1
Cấp độ isloation bạn đang sử dụng ở đây là gì? Đọc cam kết hay tuần tự hóa?
Maverick Riz

2

Một số máy chủ ứng dụng có một tính năng cho "dịch vụ đơn cụm rộng".

Ví dụ: Weblogic có tính năng Dịch vụ Singleton được định cấu hình qua bảng điều khiển quản trị web.

Bạn phải viết một lớp thực hiện weblogic.cluster.singleton.SingletonService và sử dụng nó để khai báo dịch vụ trong bảng điều khiển quản trị. Cụm này đảm nhiệm việc khởi tạo lớp và thông báo cho bạn khi dịch vụ được bắt đầu hoặc dừng. Giao diện SingletonService có phương thức kích hoạt () và hủy kích hoạt ().

Các cuộc gọi Weblogic kích hoạt () khi lần đầu tiên đưa dịch vụ lên một trong các nút của cụm. Nếu nút được chọn không hoạt động, máy chủ quản trị sẽ "di chuyển" dịch vụ trên một máy chủ khác, gọi activ () ở đó.

http://docs.oracle.com/cd/E12839_01/apirefs.1111/e13952/taskhelp/cl cluster/ConfigureSingletonService.html

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.