blob: 836bbf4b0012fb450b508dddde2d58b6957357c2 (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
|
$Header$
TODO項目
-o 自動テーブルロックしてSERIAL型の同期を保証する(2.6).
o SSLのサポート
o もしSQLをパースできれば,テーブル単位のレプリケーションも可能?
o セッションレベルのロードバランスを指示できる機能を追加
/* BEGIN SESSION LEVEL LOAD BALANCE */とか.
-o /*NO STRICT*/ とか /*PARALLEL*/ といった指示子があってもよいのかも
(pgsql-jp 35304)->2.6で/*NO STRICT*/を実装
-o parameter statusの値が一致していなくてもエラーにならないようにした
(USとNZでレプリケーションしている例があった!).(v2.5.4)
o load balanceの比率をSQL文単位でコメントで指定できるようにする.
- o STRICTモードであっても,SELECTならばnon strictにしていいはず.
2.5.2で実装.でも問題発生.[pgsql-jp: 35294]参照.
o バグ.master/slave mode&load balance modeのときに,reset queryがマス
タ側にしか出ない.master_slave modeでなければこの問題は起きない->しょ
うがない?
-o pgpoolスタート時にログを出力(v2.5.1)
o セッション開始時に発行する問い合わせをpgpool.confで設定可能にする
-o セッション終了時に発行する問い合わせをpgpool.confで設定可能にする(v2.4).
-o Slony-I対応(v2.5b2)
- マスタ側はすべてを通し,セカンダリ側はSELECTのみ通す.
- トランザクションブロックはマスタ側にのみ通す.
- replication modeでなくてもload balanceするmode追加
-o no connection pooling mode(v2.5b2)
-o schedule failover/縮退(v2.5b1)
- 単にシグナルを送るだけ
- o fail back/switch backの実装(pgpool-IIで実装)
-o 3台以上のサーバに対応(pgpool-IIで実装)
-o タイムスタンプの印字機能(v2.5b2)
- o query cache(regex で問い合わせのパターンやキャッシュinvalidation時間
の設定ができる)(とりあえずのキャッシュはpgpool-IIで実装)
o 監査機能
-o heart beat(v2.5b2)
o シーケンスをreplicationする
- シーケンス処理関数を入れ替え,中でロックするようにすればOKか?駄目.
要は,masterのロックがsecondaryのnextval()が終わるまで待つようにし
なければならないので,トランザクションブロックの中にいなければなら
ない.->自動的にトランザクションを開始すればよい?どの問い合わせの
ときにトランザクションを開始するか判断する必要がある.->パースツリー
を取ってくるか?->そこまでやりたくないが.DMLだったら自動スタート?
でもSELECT nextval();などはどうする?->明示的にシーケンスを扱って
いることを指示させるしかないか?
o OIDをreplicationする
o 一時テーブルを削除する関数を作る
o 無停止リカバリ
1) rsync
2) 問い合わせ処理中でなければ,単純SELECT以外は一時的に問い合わせを
待たせるモードに移行->これでよいか?XIDカウンタが同期しなくなる
が.open transactionがあったらアボートさせる->このケースではセッ
ションを終了させる必要あり?
3) CHECKPOINT発行
4) rsync
5) 停止側postmaster restart
6) 通常モードに移行
- マスタとセカンダリが入れ替わるケースでは完全restartが必要?->そ
んなこともないだろう.
- 既存のコネクションを引き継げるか?そうだとしたらSETで設定した値はどうするか?
7) 複数のWebサーバで動いているpgpoolを一斉に再起動するにはどうしたら
よいか?また,どのpgpoolが無停止リカバリを管理するか?別のリカバ
リ用管理サーバを立てた方がよいか?->単なる管理ツールで良いのでは?
各pgpoolにshow statusを送信し,状態を定期的に把握する程度でも充分
便利.
o 無停止リカバリ V2
1) rsync
2) オープントランザクションがあったら待つ.
3) オープントランザクションがいなくなったらReadyForQueryの時点で待ち
状態に入る
4) CHECKPOINT発行
5) rsync
6) 停止側postmaster restart
7) 通常モードに移行
- マスタとセカンダリが入れ替わるケースでは完全restartが必要?->そ
んなこともないだろう.
8) 複数のWebサーバで動いているpgpoolを一斉に再起動するにはどうしたら
よいか?また,どのpgpoolが無停止リカバリを管理するか?別のリカバ
リ用管理サーバを立てた方がよいか?->単なる管理ツールで良いのでは?
各pgpoolにshow statusを送信し,状態を定期的に把握する程度でも充分
便利.
参考:
PGClusterの動作
1) オープントランザクションがある場合は,それがクローズするまでリカ
バリプロセスは待ち続ける
2) たまたまマスタクラスタにつながっていたセッションはどうなるか?->
どんなSQLを投げてもエラー状態になる.
3) リカバリ中に新規につながったセッションはどうなるか?マスタ/リカバ
リ中クラスタ以外に接続.更新はレプリケーションサーバの中でキュー
イングされる.
-o コマンド引数の処理
-f config_file (default は /usr/local/etc/pgpool.conf)
-o UNIX domain/INET domain両方の socketに対応する
デフォルトは Unix domain のみ受付.config の inetdomain が true なら
ば,INET domain 経由の接続も受け付ける.
-o サーバのデーモン化
-o signal のブロック処理
-o SIGCHLD のハンドラ
-o child 数の管理アルゴリズム
child 数が num_min_children を下回ったら num_init_children になるまで
fork する
-o child のtimeout処理
o child は暇なときに accept しておく(LRU キューを作る).
o クライアントが quit したら,LRUキューから次のクライアントを取り出す
->childがexitするとキューの中身が失われるが,それでよいか?
-o TRUST認証以外への対応
-o バックエンドへのコネクションに timeout を付ける
-o fail over
-o replication
-o load balancing
-o フロントエンドがコミットしないままexitすると,それに対応するバックエ
ンドがトランザクション完了待ち(:ERROR: current transaction is
aborted, queries ignored until end of transaction block)になってしま
う.
-o 起動する前にpidファイルのチェックを行う
-o configureでPostgreSQL includeディレクトリを指定できるようにする.とい
うか,PostgreSQLのincludeファイルに頼らないようにすべき?->とりあえ
ず --with-pgsqlで指定できるようにした(6/24)
-o template0, template1データベースへのコネクションをキャッシュしない(createdbが
ERROR: CREATE DATABASE: source database "template1" is being accessed
by other usersになる).また,regressionデータベースへのコネクション
もキャッシュしない(set authorization関係のテストが通らないため).
-o 以下のプロトコルの実装
- AuthenticationCleartextPassword
- AuthenticationCryptPassword
- AuthenticationMD5Password
- BinaryRow
- NotificationResponse
- PasswordPacket
- FunctionCall
- FunctionResultResponse
-o コンフィグファイルが見つからないときは内部で持っているデフォルト値を
使う.
-o regression testを通す
- o プロトコル3(PostgreSQL 7.4)に対応する->とりあえずV3 requestが来たら
V2にfallback要求をフロントエンドに送るように改良した.V3プロトコルへ
のnative対応はまだ.
フロントエンドがV2->バックエンドにV2でネゴ
- V2バックエンド->接続成功
- V3バックエンド->接続成功
フロントエンドがV3->バックエンドにV3でネゴ
- V2バックエンド->接続失敗(ここで更にフロントエ
ンドにV2をネゴし,そのあとV2でバックエンドに接
続に行くこともできる)->実装した
- V3バックエンド->接続成功
結局,フロントエンドのofferしたプロトコルバージョンを覚えておき,そ
れを使ってバックエンドに接続すればOK
-o Unixドメインソケットのパスをpgpool.confで変更可能にする(debian対策)
-o cancel requestへの対応
|