10

Python を使用して大量のデータを処理し、MySQL で処理ステータスを維持しようとしています。しかし、python-mysql (Java の HikariCP のような) の標準接続プールがないことに驚いています。

私は最初に PyMySQL から始めました。プログラムが最初の数時間実行されるまで、物事は素晴らしかったです。数時間後、物事は失敗し始めました。次のような多くのエラーが発生していました。

pymysql.err.OperationalError: (2003, "Can't connect to MySQL server on '127.0.0.1' ([Errno 99] Cannot assign requested address)")

さらに、接続プールがないために頻繁に接続を開いたり閉じたりしているため、多くのポートが TIME_WAIT 状態でスタックしていました。

/d/p/950 ❯❯❯ netstat -nt | wc -l
84752

thisthisに従って、 tcp_fin_timeoutと ip_local_port_range を設定しようとしましたが、ほとんど何も改善されませんでした。

echo 30 > /proc/sys/net/ipv4/tcp_fin_timeout
echo 15000 65000 > /proc/sys/net/ipv4/ip_local_port_range

その後、MySQL がプーリング機能を備えた mysql.connector を提供していることを知りました。そのすべてを実行した後、パフォーマンスは実際に低下しました。より多くのプロセスが失敗し始めました。私はPythonのマルチプロセッシングモジュールを使用して、24コアのマシンで29個のプロセスを同時に実行しています(マルチプロセッシング.プールはデフォルトでこれを選択しませんでした)。以下はコードです。もちろん、 .my.cnf を使用してすべての資格情報を渡し、 git へのコミットを回避していました。

    import mysql.connector
    from mysql.connector import pooling
    conn_pool = pooling.MySQLConnectionPool(pool_name="mypool1",
                                              pool_size=pooling.CNX_POOL_MAXSIZE,
                                              option_files=MYSQL_CONFIG,
                                              option_groups=MYSQL_GROUP_NODE1,
                                              allow_local_infile=True)
conn = conn_pool.get_connection()

最後に、古いコードに戻しました。まだ PyMySQL を使用しており、エラーはそれほど頻繁ではありませんが、依然として大きな問題を引き起こしています。私は SQLAlchemy を調べましたが、プーリングに関するドキュメントはあまり見つかりませんでした。

mysql-python 接続プーリングの問題を他の人はどのように扱っているのでしょうか? 車輪を再発明する必要がないように、そこには何かがあるべきだと本当に信じています.

どんなポインタでも大歓迎です。

4

1 に答える 1

4

DBUtilsは、MySQL を実装します (そして一般的に、独自の DB-API 2 準拠のデータベース インターフェイスをサポートすると主張しています)、ユーザー サイズの接続プールPooledDB、広告マップ プールPersistentDB、およびSteadyDB(機能セクションを参照)。後者はmultiprocessing.Pool、管理された永続的なデータベース接続を持つワーカー プロセスを作成するケースに適合するはずです。次のように説明されています。

DBUtils.SteadyDB は、DB-API 2 データベース モジュールによって行われる通常の接続に基づいて、データベースへの「強化された」接続を実装するモジュールです。「強化された」接続は、閉じられた場合、データベース接続が失われた場合、またはオプションの使用制限を超えて頻繁に使用された場合に、アクセス時に透過的に再開されます。

次のように PyMySQL で使用できます。

import pymysql
from DBUtils.SteadyDB import connect

db = connect(
  creator = pymysql, # the rest keyword arguments belong to pymysql
  user = 'guest', password = '', database = 'name', 
  autocommit = True, charset = 'utf8mb4', 
  cursorclass = pymysql.cursors.DictCursor)

他の例については、この関連する質問も参照してください。

于 2018-03-31T19:28:08.843 に答える