PHP -> Nhóm kết nối liên tục Mysql KHÔNG CÓ mysql_pconnect - Có thể?


12

Tôi đã cố gắng tìm ra một cách tốt đẹp để làm điều này bây giờ. Nhưng đã có một thời gian khó khăn để tìm ra những mảnh phù hợp để làm điều này. Tôi đoán điều này phải có thể.

Nói một cách đơn giản, đây là những gì tôi muốn thực hiện:

PHP / Other front end -> [SOCKET] ->

Locally hosted 'pooler' -> [Pool of persistent TCP/IP connection(s)]->

Externally hosted MySQLD

Có một công cụ / cách làm việc như vậy tồn tại?

Về cơ bản, chúng tôi muốn triển khai các kết nối mysql liên tục mà KHÔNG sử dụng mysql_pconnect.

Tôi trân trọng yêu cầu chúng ta không bắt đầu thảo luận về việc không cần kết nối liên tục như thế nào, v.v. Chúng tôi đang sử dụng hết các cổng TIME_WAIT và đang có các vấn đề khác sẽ được giải quyết nếu loại hệ thống này được triển khai.

Vì vậy, để tóm tắt ... Chúng tôi sẽ triển khai một nhóm kết nối mysql là ổ cắm dựa trên đầu cuối cục bộ và duy trì các kết nối được thực hiện với một máy chủ mysql được lưu trữ bên ngoài (LAN).

Chúng tôi không sử dụng các giao dịch hoặc bất cứ điều gì khác sẽ bị ảnh hưởng từ các kết nối mysql đang được tái chế.

Chúng tôi đang chạy linux ở mặt trước với cụm master + master percona 5.5.

Cảm ơn!

Câu trả lời:


12

Sau nhiều tìm kiếm, cuối cùng tôi đã tìm ra giải pháp.

Tôi không phải là một nhà văn, vì vậy tôi sẽ cố gắng hết sức để làm cho điều này ngắn gọn nhất có thể.

Theo như tôi có thể tìm thấy, có 2 giải pháp khả thi:

Rơle SQL

http://sqlrelay.sourceforge.net/

Điều này thực hiện chính xác những gì câu hỏi yêu cầu, và một loạt hơn. Tôi sẽ không đi sâu vào chi tiết về những gì tôi có thể tìm hiểu về điều này nhưng sẽ đề cập rằng đó không phải là một giải pháp khả thi vì nó không minh bạch. Có nghĩa là dòng chảy như sau:

PHP -> Queries -> SQL Relay Extension -> SQL Relay -> Externally hosted MySQL

Vì vậy, điều này sẽ liên quan đến việc viết lại tất cả các mã của chúng tôi từ mysql sang sql Relay. Không phải là một lựa chọn trong trường hợp của chúng tôi.

Tất cả những gì đang được nói, nếu ai đó đang lên kế hoạch cho một dự án quy mô lớn mới đòi hỏi bất kỳ tính năng nào trong số nhiều tính năng mà SQL Relay có, thì nghe có vẻ hay.

Mys Proxy Proxy

http://forge.mysql.com/wiki/MySQL_Proxy

Đây là giải pháp chúng tôi đã sử dụng.

Chìa khóa để thực hiện điều này làm những gì chúng tôi muốn nó là tập lệnh LUA gộp cho proxy mysql.

Phần mở rộng LUA này có thể được tìm thấy tại:

https://github.com/cwarden/mysql-proxy/blob/315ab806bb95b8223f5afd3d238eff2a40af03d8/lib/ro-pooling.lua

Không cần đi sâu vào chi tiết, đây là một số thống kê cơ bản ... Xin lưu ý, điều này được thử nghiệm ở thời gian sử dụng THẤP:

[root@HOSTNAME etc]# netstat -na | grep ":3306 " | grep TIME_WAIT | wc
   6433   38598  572537

Sau khi chuyển sang mysql-proxy và để mọi thứ ổn định:

[root@HOSTNAME etc]# netstat -na | grep ":3306 " | grep TIME_WAIT | wc
     32     192    2848

Như bạn có thể thấy rõ, các cổng TIME_WAIT tới mysql đã giảm xuống gần như không có.

Các kết nối hiện tại thực tế vẫn tồn tại mà KHÔNG sử dụng mysql_pconnect / mysqli_connect (... p: tên máy chủ ...).

Đáng nói là dường như có một vài cài đặt cấu hình ở gần đầu tập lệnh lua pooler.

min_idle_connections cục bộ

max_idle_connections cục bộ

Chúng có vẻ khá tự giải thích. Ngoại trừ điều đó: Dường như mỗi kết hợp tên người dùng (và mật khẩu? Chưa được kiểm tra ... rất có thể không phải là tho.) Tạo ra tập hợp các kết nối liên tục của riêng nó.

Vì vậy, nhân max_idle_connections với số lượng người dùng mysql duy nhất sẽ kết nối với cơ sở dữ liệu. Và điều đó sẽ cho bạn ý tưởng về việc bạn sẽ có bao nhiêu kết nối nhàn rỗi.

Vì vậy, hãy để tôi nhắc lại để cái blurb nhỏ này đánh vào một số từ khóa cho những người tìm kiếm thông qua google:

Khi sử dụng PHP, có thể có các kết nối mysql liên tục mà KHÔNG CÓ mysql_pconnect không?

Có, điều này có thể được thực hiện thông qua SQL Relay nếu bạn không ngại xây dựng lại hầu hết mã của mình để chuyển các truy vấn của mình thông qua phần mở rộng của chúng HOẶC sử dụng proxy mysql trong suốt với tập lệnh ro-pooling.lua.

Chúng tôi đã muốn một cái gì đó như thế này trong khoảng một năm nay.

THƯỞNG THỨC!


Tại sao không chỉ đơn giản là sử dụng chức năng dọn dẹp (như được nêu trong câu trả lời dưới đây) được cung cấp bởi chức năng liên tục của mysqli ? Nếu bạn không có quyền truy cập vào mysqli, Tại sao không sử dụng mysql_pconnectvà bắt đầu mỗi kết nối với một số "chức năng dọn dẹp"?
Pacerier

4
  1. Hỗ trợ kết nối liên tục được giới thiệu trong PHP 5.3 cho mysqliphần mở rộng. Hỗ trợ đã có mặt trong PDO MYSQL và ext / mysql. Ý tưởng đằng sau các kết nối liên tục là kết nối giữa quy trình khách và cơ sở dữ liệu có thể được sử dụng lại bởi quy trình khách, thay vì được tạo và hủy nhiều lần. Điều này làm giảm chi phí tạo kết nối mới mỗi khi cần, vì các kết nối không sử dụng được lưu trữ và sẵn sàng để được sử dụng lại.

  2. Không giống như phần mở rộng mysql, mysqlikhông cung cấp một chức năng riêng để mở các kết nối liên tục. Để mở một kết nối liên tục, bạn phải thêm p: vào tên máy chủ khi kết nối.

  3. Vấn đề với các kết nối liên tục là chúng có thể bị bỏ lại ở các trạng thái không thể đoán trước bởi các khách hàng. Ví dụ, khóa bảng có thể được kích hoạt trước khi khách hàng chấm dứt bất ngờ. Một quy trình khách hàng mới sử dụng lại kết nối liên tục này sẽ có được kết nối "như hiện tại". Bất kỳ quá trình dọn dẹp nào cũng cần được thực hiện bởi quy trình khách hàng mới trước khi nó có thể sử dụng tốt kết nối liên tục, làm tăng gánh nặng cho lập trình viên.

Tuy nhiên, kết nối liên tục của tiện ích mở rộng mysqli cung cấp mã xử lý dọn dẹp tích hợp. Việc dọn dẹp được thực hiện bởi mysqli bao gồm:

Rollback active transactions

Close and drop temporary tables

Unlock tables

Reset session variables

Close prepared statements (always happens with PHP)

Close handler

Release locks acquired with `GET_LOCK()`

Điều này đảm bảo rằng các kết nối liên tục ở trạng thái sạch khi trả về từ nhóm kết nối, trước khi quy trình khách sử dụng chúng.

Tiện ích mở rộng mysqli thực hiện việc dọn dẹp này bằng cách tự động gọi hàm C-API mysql_change_user().

Tính năng dọn dẹp tự động có những ưu điểm và nhược điểm. Ưu điểm là lập trình viên không còn phải lo lắng về việc thêm mã dọn dẹp, vì nó được gọi tự động. Tuy nhiên, nhược điểm là mã có khả năng chậm hơn một chút, vì mã để thực hiện việc dọn dẹp cần phải chạy mỗi khi kết nối được trả về từ nhóm kết nối.

Có thể tắt mã dọn dẹp tự động, bằng cách biên dịch PHP với MYSQLI_NO_CHANGE_USER_ON_PCONNECTđịnh nghĩa.

Ghi chú:

Tiện ích mở rộng mysqli hỗ trợ các kết nối liên tục khi sử dụng Trình điều khiển gốc MySQL hoặc Thư viện máy khách MySQL.

Ngoài ra, bạn có thể tham khảo các liên kết sau: http://www.mysqlperformanceblog.com/2006/11/12/are-php-persistent-connections-evil/

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.