Mysql
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Mysql

Cách quản lý các quy trình phía máy chủ bằng MySQL

Có vẻ như bạn đang cố gắng khởi chạy các quy trình chạy dài từ một máy chủ web và sau đó theo dõi các quy trình đó trong cơ sở dữ liệu. Điều đó không phải là không thể, nhưng không phải là một phương pháp được khuyến khích.

Vấn đề chính là một yêu cầu HTTP hiện cần được xử lý trong máy chủ web của bạn vì bạn thực sự làm bất cứ thứ gì (bao gồm theo dõi các quy trình đang chạy trên hệ thống) - bạn cần một thứ có thể chạy mọi lúc ...

Thay vào đó, một ý tưởng tốt hơn sẽ là có một quy trình "quản lý" được daemonized khác (như bạn đề cập đến perl, đó sẽ là một ngôn ngữ tốt để viết nó vào) sinh ra và theo dõi các tác vụ đang chạy lâu dài (bằng PID và tín hiệu) và cho điều đó quy trình cập nhật cơ sở dữ liệu SQL của bạn.

Sau đó, bạn có thể yêu cầu quy trình "người quản lý" lắng nghe các yêu cầu bắt đầu một quy trình mới từ máy chủ web của bạn. Có nhiều cơ chế IPC khác nhau mà bạn có thể sử dụng. (ví dụ:tín hiệu, SysV shm, ổ cắm miền unix, hàng đợi trong quá trình như ZeroMQ, v.v.).

Điều này có nhiều lợi ích:

  • Nếu các tập lệnh được tạo ra của bạn cần chạy với sự cách ly dựa trên người dùng / nhóm (với hệ thống hoặc lẫn nhau), thì máy chủ web của bạn không cần phải chạy dưới dạng root, cũng như không được setgid.
  • Nếu một quy trình được tạo ra "gặp sự cố", một tín hiệu sẽ được gửi đến quy trình "người quản lý", vì vậy, quy trình này có thể theo dõi những hành vi sai trái mà không gặp sự cố.
  • Nếu bạn sử dụng hàng đợi trong quy trình (ví dụ:ZeroMQ) để gửi yêu cầu đến quy trình "người quản lý", nó có thể "điều chỉnh" các yêu cầu từ máy chủ web (để người dùng không thể cố ý hoặc vô tình gây ra D.O.S).
  • Cho dù quá trình sinh sản có kết thúc tốt đẹp hay không, bạn không cần yêu cầu HTTP 'hoạt động' đối với máy chủ web để cập nhật cơ sở dữ liệu theo dõi của mình.

Về việc liệu điều gì đó nên đang chạy đang chạy, điều đó thực sự tùy thuộc vào ngữ nghĩa của bạn. (tức là:nó có dựa trên thời gian chạy đã biết không? dựa trên dữ liệu được tiêu thụ? v.v.).

Kiểm tra xem nó có chạy có thể gấp hai lần:

  1. Quy trình "người quản lý" cập nhật cơ sở dữ liệu nếu thích hợp, bao gồm cả PID đã tạo.
  2. Mã được lưu trữ trên máy chủ web của bạn thực sự có thể liệt kê các quy trình để xác định xem PID trong cơ sở dữ liệu có thực sự là đang chạy và thậm chí còn bao nhiêu thời gian để làm việc gì đó hữu ích!

Kiểm tra xem nó có không chạy sẽ phải dựa trên quy ước:

  1. Đặt tên cho các quá trình sinh sản mà bạn có thể dự đoán.
  2. Nhận danh sách quy trình để xác định điều gì vẫn đang chạy (không còn tồn tại?) không nên chạy.

Trong cả hai trường hợp, bạn có thể thông báo cho những người dùng yêu cầu các quy trình được tạo ra và / hoặc thực sự làm điều gì đó về nó.

Một cách tiếp cận có thể là có một công việc CRON đọc từ cơ sở dữ liệu SQL và thực hiện ps để xác định quy trình đã tạo nào cần được khởi động lại và sau đó yêu cầu lại quy trình "người quản lý" làm như vậy bằng cách sử dụng cùng một cơ chế IPC được sử dụng bởi máy chủ web. Bạn phân biệt cách bắt đầu với khởi động lại như thế nào trong theo dõi / giám sát / ghi nhật ký là tùy thuộc vào bạn.

Nếu bản thân máy chủ bị mất điện hoặc gặp sự cố, thì bạn có thể yêu cầu quy trình "người quản lý" thực hiện dọn dẹp khi nó chạy lần đầu, ví dụ:

  1. Tìm kiếm các mục nhập trong cơ sở dữ liệu để biết các quy trình sinh sản đã được chạy trước khi máy chủ ngừng hoạt động.
  2. Kiểm tra các quy trình đó bằng PID và thời gian chạy (điều này quan trọng).
  3. Tạo lại các quy trình đã tạo chưa hoàn thành hoặc lưu trữ nội dung nào đó trong cơ sở dữ liệu để cho máy chủ web biết rằng đây là trường hợp.

Cập nhật # 1

Theo nhận xét của bạn, đây là một số gợi ý để bắt đầu:

Bạn đã đề cập đến perl, vì vậy, có thể bạn có một số thông thạo ở đó - đây là một số mô-đun perl để giúp bạn trên đường viết tập lệnh quy trình "trình quản lý":

Nếu bạn chưa quen với nó, CPAN là kho lưu trữ cho các mô-đun perl về cơ bản làm mọi thứ.

Daemon ::Daemonize - Để daemonize hóa quá trình để nó tiếp tục chạy sau khi bạn đăng xuất. Cũng cung cấp các phương thức viết script để bắt đầu / dừng / khởi động lại daemon.

Proc ::Spawn - Giúp 'sinh sản' các tập lệnh con. Về cơ bản thì fork() sau đó exec() mà còn xử lý STDIN / STDOUT / STDERR (hoặc thậm chí tty) của tiến trình con. Bạn có thể sử dụng điều này để khởi chạy các tập lệnh perl đang chạy lâu dài của mình.

Nếu mã giao diện người dùng của máy chủ web của bạn chưa được viết bằng perl, bạn sẽ cần một thứ gì đó khá di động để chuyển và xếp hàng giữa các quy trình; Tôi có thể muốn tạo giao diện người dùng cho máy chủ web của bạn bằng một thứ gì đó dễ triển khai (như PHP).

Đây là hai khả năng (có nhiều thêm):

Proc ::ProcessTable - Bạn có thể sử dụng kiểm tra này trên các quy trình đang chạy (và nhận tất cả các loại thống kê như đã thảo luận ở trên).

Thời gian ::HiRes - Sử dụng các chức năng thời gian chi tiết cao từ gói này để triển khai khuôn khổ 'điều chỉnh' của bạn. Về cơ bản, chỉ giới hạn số lượng yêu cầu bạn bỏ hàng đợi trên một đơn vị thời gian.

DBI (với mysql ) - Cập nhật cơ sở dữ liệu MySQL của bạn từ quy trình "quản lý".




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Lỗi MySQL khi cố gắng cắt ngắn bảng

  2. Số lượng bản ghi tối đa trong bảng cơ sở dữ liệu MySQL

  3. Khôi phục cơ sở dữ liệu MySQl từ .frm, ibdata và ib_logfile

  4. Loại dữ liệu Ecto hoặc Elixir ánh xạ tới MySql BIGINT

  5. Nhóm MySQL theo giờ