0

sqlalchemy を使用して postgresql との接続を作成し、簡単なコマンドを実行しています。

>>> from sqlalchemy import create_engine
>>> c = create_engine('postgres://myuser@myremoteserver/mydb?keepalives_idle=4&keepalives_interval=1&keepalives_count=5')
>>> c.execute('select 1').scalar()
1

その正常に動作します。

クエリを実行するときに接続を作成した後、この例では postgres サーバーへのソケットを作成し、へのソケットを作成しますmyremoteserver。unixssコマンドでソケットを確認できます。( も使用できますnetstat)。

[root@myclient ~]# ss -torp | grep python
ESTAB      0      0            192.168.1.15:43471       myremoteserver:postgres  timer:(keepalive,1.319ms,0) users:(("python",4074,3))

接続の作成後にネットワークがダウンしたり、postgres サーバー マシンがクラッシュした場合。

>>> c = create_engine('postgres://myuser@myremoteserver/mydb?keepalives_idle=4&keepalives_interval=1&keepalives_count=5')

(ネットワークダウンの場合はifdown eth0オンにできます)myremoteserver

次に、サーバーへの接続を 5 回試行した後、接続を閉じます。

[root@myclient ~]# ss -torp | grep python
ESTAB      0      0            192.168.1.15:43471       myremoteserver:postgres  timer:(keepalive,1.319ms,0) users:(("python",4074,3))
[root@myclient ~]# ss -torp | grep python
ESTAB      0      0            192.168.1.15:43471       myremoteserver:postgres  timer:(keepalive,738ms,0) users:(("python",4074,3))
[root@myclient ~]# ss -torp | grep python
ESTAB      0      0            192.168.1.15:43471       myremoteserver:postgres  timer:(keepalive,2.720ms,0) users:(("python",4074,3))
[root@myclient ~]# ss -torp | grep python
ESTAB      0      0            192.168.1.15:43471       myremoteserver:postgres  timer:(keepalive,788ms,2) users:(("python",4074,3))
[root@myclient ~]# ss -torp | grep python
ESTAB      0      0            192.168.1.15:43471       myremoteserver:postgres  timer:(keepalive,191ms,4) users:(("python",4074,3))
[root@myclient ~]# ss -torp | grep python
[root@myclient ~]# ss -torp | grep python

これは、接続文字列で設定した接続の動作です。

ソケットが閉じてサーバーがダウンする前にクエリを実行すると、問題が発生します。

# do ifdown eth0 on postgres server to break the network connection.
# execute query before socket close.
>>> c.execute('select 1').scalar()

ソケットをチェックすると

[root@myclient ~]# ss -torp | grep python
ESTAB      0      74           192.168.1.15:43471       myremoteserver:postgres  timer:(on,1.602ms,3) users:(("python",3098,7))
[root@myclient ~]# ss -torp | grep python
ESTAB      0      74           192.168.1.15:43471       myremoteserver:postgres  timer:(on,585ms,3) users:(("python",3098,7))
[root@myclient ~]# ss -torp | grep python
ESTAB      0      74           192.168.1.15:43471       myremoteserver:postgres  timer:(on,2.833ms,4) users:(("python",3098,7))
[root@myclient ~]# ss -torp | grep python
ESTAB      0      74           192.168.1.15:43471       myremoteserver:postgres  timer:(on,1.851ms,4) users:(("python",3098,7))
[root@myclient ~]# ss -torp | grep python
ESTAB      0      74           192.168.1.15:43471       myremoteserver:postgres  timer:(on,808ms,4) users:(("python",3098,7))
[root@myclient ~]# ss -torp | grep python
ESTAB      0      74           192.168.1.15:43471       myremoteserver:postgres  timer:(on,5.393ms,5) users:(("python",3098,7))
[root@myclient ~]# ss -torp | grep python
ESTAB      0      74           192.168.1.15:43471       myremoteserver:postgres  timer:(on,3.846ms,5) users:(("python",3098,7))
.................
.................
.................
[root@myclient ~]# ss -torp | grep python
ESTAB      0      74           192.168.1.15:43471       myremoteserver:postgres  timer:(on,5.268ms,72) users:(("python",3098,7))
[root@myclient ~]# ss -torp | grep python
ESTAB      0      74           192.168.1.15:43471       myremoteserver:postgres  timer:(on,4.804ms,254) users:(("python",3098,7))

接続文字列に従って、ソケットは 5 回の試行後に閉じる必要があります。しかし、5 回以上試行して 254 回に達するかどうかはわかりません。

サーバーのクラッシュとクライアントからのソケットのクローズの間にクエリを実行しても、5回の試行後にソケットを閉じるために設定する必要があるもの。

注 : keepalives_idle、keepalives_interval、および keepalives_count は、TCP 接続でキープアライブ パラメータを設定するために使用されます。

4

1 に答える 1

1

PostgreSQL ドキュメントから:

クライアントのサーバーへの接続が切断されたと見なされる前に失われる可能性のある TCP キープアライブの数を制御します。ゼロの値は、システムのデフォルトを使用します。このパラメーターは、Unix ドメイン ソケット経由で確立された接続の場合、またはキープアライブが無効になっている場合は無視されます。これは、TCP_KEEPCNT ソケット オプションが使用可能なシステムでのみサポートされます。他のシステムでは効果がありません。

言い換えると。システムがサポートしていない場合は効果がなく、通常のタイムアウト ルールが適用されます。

于 2013-04-30T08:51:33.427 に答える