Giới thiệu
Tôi làm việc trong một công ty mà chúng tôi chạy nhiều công việc hàng loạt chế biến hàng triệu bản ghi dữ liệu mỗi ngày và tôi đã suy nghĩ gần đây về tất cả các máy ngồi xung quanh mỗi ngày và không làm gì trong vài giờ. Nó sẽ không tốt nếu chúng ta có thể sử dụng những máy móc để tăng cường sức mạnh xử lý của hệ thống của chúng tôi? Trong tập hợp các bài viết này, tôi sẽ xem xét các lợi ích tiềm năng của việc sử dụng một văn phòng lưới điện bằng cách sử dụng môi trường ảo hóa.
Trong phần 1, tôi đã đưa ra một cái nhìn tổng quan của hệ thống và công nghệ sẽ được sử dụng cũng như thảo luận một số trong những lý do tiềm năng, tại sao bạn sẽ muốn tạo ra một mạng lưới văn phòng.
Công việc kiểm soát
Nếu bạn đang chạy công việc sau đó bạn sẽ cần một số cách để quản lý chúng. Hệ thống (trên máy chủ công việc của bạn) kiểm soát công việc của bạn cần được thực sự cũng nghĩ ra ngay cả trước khi cố gắng chạy một mạng lưới văn phòng. Vì vậy, trước hết, nhiệm vụ cho một hệ thống kiểm soát công việc là gì:
- Đưa ra công việc theo yêu cầu của người lao động
- Yêu cầu người lao động những gì loại của công việc để chạy
- Theo dõi công việc
- Đảm bảo rằng công việc chỉ chạy một lần
- Cung cấp dữ liệu việc làm cho người lao động, hoặc ít nhất là nói với họ để có được nó
Hệ thống này cũng cần phải được mở rộng, một giải pháp mà làm việc cho một trường hợp duy nhất có thể được mở rộng để chạy một số loại công việc khi doanh nghiệp nhìn thấy giá trị trong một giải pháp lưới. Ví dụ, công việc có thể đạt được ưu tiên, nhiều hơn một loại hình làm việc có thể tồn tại (tức là một số cơ sở mã), cuối cùng bạn thậm chí có thể chạy một số máy công nhân khác nhau được tối ưu hóa cho từng loại công việc (mặc dù điều đó không di chuyển ra khỏi người lao động chung chung ' 'ý tưởng). Luôn luôn cố gắng để suy nghĩ về tương lai khi phát triển hệ thống, một tầm nhìn ngắn hạn có thể dẫn đến thất vọng dài hạn và tăng thời gian phát triển.
Công việc máy chủ
Chúng tôi sẽ cần một nơi nào đó để kiểm soát công việc của chúng tôi, điều này sẽ là hệ thống duy nhất trong mạng lưới của bạn có một bộ định vị tài nguyên cố định, là một địa chỉ IP, tên máy, URL (bằng cách sử dụng nội bộ DNS), ... Điều này là do người lao động cần phải biết nơi để tìm việc làm, công nhân cần phải tìm ra hệ thống kiểm soát công việc (không hệ thống điều khiển công việc tìm thấy những công nhân).
Các máy chủ bản thân công việc không thực sự có một nhiệm vụ phức tạp (trong một hệ thống cơ bản dù sao đi nữa), nó cần để lưu trữ một danh sách việc làm, bàn tay ra việc làm, nhận kết quả, và sau đó lưu trữ chúng để thu hồi sau. Làm thế nào các bộ phận này (chẳng hạn như 'tay ra công ăn việc làm ") được định nghĩa có thể là rất cơ bản. Sau đó, chúng tôi có thể mở rộng hệ thống để bao gồm một giao diện quản trị để thêm, chỉnh sửa, xóa, đình chỉ công việc nhưng điều này vượt ra ngoài tập thể dục này.
Có là không có lí do gì sau đó là máy chủ công việc của bạn không có thể là một máy ảo đang chạy trong máy chủ xử lý chính của bạn cung cấp nó không thoát nước quá nhiều tài nguyên từ nó. Tuy nhiên, các máy chủ công việc không cần sẵn sàng cao, nếu nó đi vào một buổi tối bạn sẽ mất cả một ngày cuối tuần chế biến, có khả năng chi phí cho bạn một vài tuần giá trị của thời gian xử lý (khi so sánh với máy chủ xử lý chính của bạn một mình) . Bạn có thể muốn xem xét việc đặt máy chủ công việc của bạn trên một môi trường cân bằng tải cho sẵn sàng cao.
Cơ bản cài đặt
Thiết lập cơ bản cho máy chủ công việc của chúng tôi sẽ bao gồm những gì tôi đang kêu gọi một trong các máy chủ khập khiễng của tôi (đó là Li nux, m ySql, P HP). Đang chạy trên công nhân Thea thực sự sẽ làm việc ra những công việc nó có thể chạy bằng cách tương tác với với cơ sở dữ liệu hệ thống điều khiển công việc. Sau đó chúng ta có thể tạo ra một dịch vụ web và bàn tay thực sự ra công ăn việc làm hơn là có người lao động làm các công việc khó khăn, bản thân, nhưng bây giờ chúng tôi sẽ tiếp tục sử dụng các nguyên tắc KISS (Hãy giữ nó đơn giản, Stupid).
Vì vậy, cho phép tạo ra ba bảng mySQL để đối phó với công việc. Đây sẽ là công việc `,` jobRecords `, và` jobResults `.
Ở đây tôi đang sử dụng SQL Buddy một chút thay thế tuyệt vời để phpMyAdmin chỉ vì nó dễ dàng hơn để cài đặt trên CentOS (đối với những người khác nhìn thấy: 10 Đại lựa chọn thay thế để phpMyAdmin )
Bảng này bao gồm 5 lĩnh vực đơn giản,
- id: Độc đáo xác định các công việc
- name: có thể là một tài liệu tham khảo khách hàng, hoặc bất kỳ số nào của định danh khác
- Tình trạng: Bạn cần phải biết công việc, ví dụ như
- 0: Không bắt đầu
- 1: chọn
- 2: Đã hoàn thành
- started_by: Ai bắt đầu làm công việc? Điều này không hoàn toàn bắt buộc nhưng là một tốt đẹp để có. Tôi muốn đề nghị nhân viên theo dõi địa chỉ IP của họ trên mạng của bạn
- started_at: Khi nào công nhân bắt đầu công việc? Bằng cách theo dõi các công việc không hoàn tất trong vòng X số lượng thời gian chúng ta biết chúng ta cần nhận công việc một lần nữa và bắt đầu chế biến bằng cách công nhân khác. Người lao động có thể ngăn chặn xử lý / đi offline cho bất kỳ số lý do mất điện, tai nạn, mất mạng.
Nó rất dễ dàng bảng này có thể được mở rộng với một vài trường bổ sung cho phép theo dõi số liệu thống kê, kết thúc cột một thời gian để xem bao lâu công việc, một truy cập để xem có bao nhiêu công nhân được các công việc (rõ ràng điều này cần phải có xu hướng 1), công việc ưu tiên, danh sách có thể đi và về. Trong kịch bản công việc phức tạp hơn, nó sẽ có thể xác định bao nhiêu bộ nhớ người lao động sẽ cần truy cập vào (và do đó chỉ sử dụng lao động thích hợp), hoặc thậm chí của người lao động sẽ được yêu cầu.
Cho phép thêm một số công việc ví dụ:
Bảng tiếp theo lại là khá đơn giản để hiểu, đây là hồ sơ công việc của chúng tôi. Họ được liên kết với bảng công việc chính của một cột jobs_id `. Làm cho bảng này phụ thuộc rất nhiều vào dữ liệu mà bạn cần phải cung cấp cho công nhân của bạn, cho phép thực hiện một ví dụ rất đơn giản, nơi chúng tôi có bốn cột:
- id: ID của các hồ sơ
- tên: tên của Người
- địa chỉ: địa chỉ của Người
- jobs_id: ID công việc mà hồ sơ này được liên kết với
Bảng thứ ba và cuối cùng bao gồm một bảng kết quả, nó có nhiều giống như là bảng hồ sơ của chúng tôi, và với việc bổ sung một số cột có thể là một phần của bảng hồ sơ:
- job_record_id: Liên kết kết quả các bảng công việc
- Kết quả: dữ liệu kết quả
... Và đó là tất cả những gì bạn cần để kiểm soát công việc! (Mặc dù ở một mức độ rất cơ bản) Trong trường hợp của tôi tôi chỉ ra một bảng dữ liệu của tôi để xử lý được đặt, nhưng điều này có thể chỉ là một cách dễ dàng là một tập tin, các thông số để chạy mã mô phỏng, bạn đặt tên cho nó.
Lựa chọn một công việc
Như đã nêu trước đây, các công nhân sẽ làm quản lý công việc của chúng tôi cho chúng ta bây giờ, vì vậy tất cả chúng ta cần phải thực sự làm là tìm một công việc cần xử lý và có được thông tin. Làm thế nào chúng tôi sẽ làm điều này? Cũng chọn tiêu chí lựa chọn công việc của chúng tôi và tìm kiếm công việc, trong SQL tôi đã làm như sau:
- Đi bất kỳ công việc không được đánh dấu đầy đủ nhưng từ nhân viên của chúng tôi và đặt lại (thay thế ME__ __ với một định danh, đơn giản nhất sẽ là địa chỉ IP):
CẬP NHẬT `công việc` SET `tình trạng` = 0 ở đâu `tình trạng` = 1 AND `started_by` = __ ME__;
- Sử dụng các tiêu chí lựa chọn công việc của chúng tôi, chọn một công việc và cho biết hệ thống kiểm soát mà công nhân này là đối phó với nó:
CẬP NHẬT `công việc` SET `tình trạng` = 1, `started_by` = __ ME__, `started_at` = NOW () WHERE `tình trạng` = 0 OR
(`Tình trạng` = 1 VÀ `started_at`> DATE_SUB (NOW (), INTERVAL X Giờ)) ORDER BY `id` ASC;
Bởi việc làm lấy mà không trả lại kết quả trong X số lượng thời gian chúng tôi đảm bảo rằng tất cả các công việc được chạy trong trường hợp của một công nhân bị rơi hoặc đi AWOL.
- Tiếp theo lấy các chi tiết công việc tiếp theo là các hồ sơ tự:
SELECT * FROM `công việc` WHERE `started_by` = __ ME__ LIMIT 1;
Chọn * FROM `job_records NƠI` id `= __ JOBID__;
Sau khi hoàn thành công việc, chúng tôi ghi chèn kết quả của chúng tôi và đánh dấu công việc là hoàn thành. Hãy nhớ là việc làm có thể tạm dừng / tiếp tục bất cứ lúc nào cho phép một số mạnh mẽ trong kịch bản của bạn. Nó có thể là công việc đình chỉ một nửa thông qua cập nhật hệ thống kiểm soát công việc, do đó, kiểm tra số lượng hồ sơ trong một công việc và số lượng các kết quả được lưu lại hệ thống kiểm soát công việc sẽ là một động thái khôn ngoan.
Ngoài ra, trong khi điều này chứng minh làm thế nào công việc có thể được lựa chọn và quản lý từ một khung truy vấn SQL bạn thực sự cần được trừu tượng hóa kiểm soát công việc của bạn rằng nếu bạn quyết định chuyển sang sử dụng một dịch vụ web, tập tin dựa trên hệ thống, XML , hoặc bất kỳ khác số hệ thống, nó sẽ không ảnh hưởng đến các mã trên nó.
Công việc cấu hình
Các khía cạnh tiếp theo để xem xét là việc làm kích thước và cấu hình. Bằng cách chơi với cấu hình việc làm, chúng ta có thể tấn công một sự cân bằng tuyệt vời giữa tốc độ, quá trình sao chép, và độ tin cậy. Đi một vài kịch bản OFA:
- Việc làm mất 1 ngày để chạy: Điều này có nghĩa rằng các nhân viên của bạn cần 15 ngày, kể từ ngày xử lý từng công việc (nhớ 10% năng lượng cho 2/3rds trong thời gian). Điều này rõ ràng không phải là một cấu hình khôn ngoan, quy mô công việc của bạn là cách quá lớn! Nó sẽ mất ít nhất là gấp đôi thời gian để có được một công việc xử lý các nhân viên ban đầu nên đi AWOL (thời gian nhận rằng nó đã không trở về một kết quả cộng với thời gian tái chế). In an ideal you'd have at least one full job easily cleared by the end of each long idle period, that way you keep the jobs ticking over and at worst case a job would take two days to process should the first go missing.
- Jobs take 1 minute to run: This means that your workers take about 15 minutes to run each job. Whilst this may initially seem ideal, you gain additional work processing during lunch time, coffee breaks, meetings, etc this scenario puts strain on other areas of your system and introduces its own problems. For example, firstly your setup/processing time ratio is going to go right down, therefore losing system efficiency. Your network is going to be constantly streaming job information to the various workers frustrating staff who are dong their day to day work. You're also going to put more strain on your job processing server as it has to dish out lots and lots of small pieces of work on a regular basis. Lastly, in this situation if your job server goes down you're going to create a huge back log of uncompleted work whereas bigger jobs could of continued processing blissfully unaware that the job server was experiencing difficulties.
In reality there will be no one ideal configuration for your grid setup, much depends on the available resources, types of job, job turnaround time requirements, network capability, and so on. However some guidelines would be:
- Size jobs so that each worker can get through at least 3-4 jobs in a period of 15 hours (the longest likely idle time period)
- Play with the job size so that setup time becomes fairly insignificant compared to the processing time (bearing in mind the above point).
- If a job doesn't complete in double the amount of time (maybe less) you expect it to complete it assume that its gone AWOL and start processing it with another worker. This means you may have to wait up to three times the normal length of a job for it to complete (possibly longer if the subsequent job fails). You may want to reduce this time, but be careful not to reduce it too much as you may start duplicating processing tasks on a regular basis.
- Jobs should be independent of outside requirements as much as possible. The job server, for example, should only be contacted at the start and end of every job.
- Don't saturate your network, this will have two negative effects, your daytime staff will find using the network frustrating and problems may be experienced with connections timing out a problem that will only get worse as you scale your grid.
- Ensure jobs can run on your workers. If jobs become too memory intensive or disk space intensive jobs will start aborting and the only thing you'll notice is a drop in number of jobs processed with no real reason why.
Submitting Results of a Job
When submitting the results of a job it is important to check that results have not been submitted by another worker, especially if the current worker has been dormant for some time.
When results are submitted ensure that the number of results matches the number of records within the job.
As stated previously, and can not be over emphasised, build fault tolerance into job retrieval and results submission. The workers can (and most likely will) go into suspend mode at the most inconvenient of times and this needs to be catered for. Also once again abstracting away your results submission will help cater for future changes to your job control system much easier to deal with.
Tóm tắt thông tin
In this section we have looked at what a job control server needs to do and how to get a very basic system set up. We discussed how to retrieve a job from the control system and how best to configure jobs to get the most our of your office grid system. To finish, a paragraph or two on submitting results back to the job control server was presented.
- A job control server manages jobs and ensures that all work units are completed
- By abstracting your job select/results submission we can change the technology of the control server without much problems
- Configure your jobs to ensure that they are run quickly and efficiently without putting too much pressure on your network infrastructure, and without duplicating processing tasks on a regular basis.
- Ensure that you build fault tolerance and error checking into your routines, workers can suspend and resume and the most inconvenient of times. Remember to check if results have already been submitted by another worker.
Next time
In part 3 we'll create our virtual processing machine and set up our windows machines to become idle-time workers.