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 接続でキープアライブ パラメータを設定するために使用されます。