【線上】SQLAlchemyデータベースがフル接続されていることによる問題


目次
  • 原因と現象回顧
  • この問題は当時整理され、再現された
  • である.
  • 今回のオンライン問題をまとめた知識
  • これはSupersetプロジェクトをしたばかりの時に出会ったオンライン問題で、振り返って整理します.
    原因と現象の回顧
    アクセスピークqpsが増加し、データベース接続がSQLAlchemy設定のデフォルトの最大数を超え、タイムアウト時間に達したため、オンライン上の多くのユーザーが次のエラーを表示しました.
    2018-11-04 11:27:50,370 /var/www/html/superset/views/base.py base.py[line:56] : ERROR  QueuePool limit of size 10 overflow 10 reached, connection timed out, timeout 30
        (self.size(), self.overflow(), self._timeout))
        (self.size(), self.overflow(), self._timeout))
    TimeoutError: QueuePool limit of size 10 overflow 10 reached, connection timed out, timeout 30
    TimeoutError: QueuePool limit of size 10 overflow 10 reached, connection timed out, timeout 30
    TimeoutError: QueuePool limit of size 10 overflow 10 reached, connection timed out, timeout 30
    TimeoutError: QueuePool limit of size 10 overflow 10 reached, connection timed out, timeout 30
        (self.size(), self.overflow(), self._timeout))
    

    この問題は当時整理して再現した.
    これを以下の問題と呼ぶことができて、ネット上にも多くの類似の文章があって、しかし自分で出会って実践しないで、いつも体得できません;githubにまとめてpythonの基礎知識を復習します
    QueuePool limit of size overflow reached,connection timed out,timeout問題
    今回のオンライン上の問題をまとめた知識
    主にMySQLデータベースに関する知識
  • データベースのいくつかのシステム変数
  • show variables like '%connect%';
    

    接続のタイムアウトのいくつかについて、最大の制限が表示される可能性があります.接続数などもDBAモニタに必ずあるアイテムです
    +-----------------------------------------------+-----------------+
    | Variable_name                                 | Value           |
    +-----------------------------------------------+-----------------+
    | character_set_connection                      | utf8            |
    | collation_connection                          | utf8_general_ci |
    | connect_timeout                               | 10              |
    | disconnect_on_expired_password                | ON              |
    | extra_max_connections                         | 1               |
    | init_connect                                  |                 |
    | max_connect_errors                            | 999999999       |
    | max_connections                               | 10240           |
    | max_user_connections                          | 0               |
    | performance_schema_session_connect_attrs_size | -1              |
    +-----------------------------------------------+-----------------+
    10 rows in set
    
  • データベース自体もtcp接続されており、接続情報を表示できます.一般的にDBAはこれらの監視アラーム
  • を構成します.
    mysql> show full processlist;
    +----+------+-----------------+------+---------+-------+-------+-----------------------+
    | Id | User | Host            | db   | Command | Time  | State | Info                  |
    +----+------+-----------------+------+---------+-------+-------+-----------------------+
    |  2 | root | localhost       | test | Query   |     0 | init  | show full processlist |
    |  8 | root | localhost:59270 | test | Sleep   | 38068 |       | NULL                  |
    |  9 | root | localhost:59272 | test | Sleep   | 37914 |       | NULL                  |
    | 10 | root | localhost:59288 | test | Sleep   | 37914 |       | NULL                  |
    | 11 | root | localhost:59289 | test | Sleep   |   708 |       | NULL                  |
    | 12 | root | localhost:59290 | test | Sleep   |   650 |       | NULL                  |
    +----+------+-----------------+------+---------+-------+-------+-----------------------+
    6 rows in set (0.00 sec)
    
    mysql>
    

    これらの意味はすべてmysqlの公式ドキュメントで見つけることができます.例えば、次のようになります.
    次に問題を解決する構想であるべきです:やはり本質を理解しなければならなくて、再現することができて、整理してまとめます.