rabbit-slide-kou-postgresql-conference-japan-2023 2023.11.24.0 → 2023.11.24.1
Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 155a7faaa21e9b829749a0d4d767d2396edb504b579c5664590f3f990873f9b5
|
4
|
+
data.tar.gz: c6cdb92e3bf87097eb70846af38d0038140caedafe06cdbb63347372411df764
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 7a17ae84a76db0cc1a98d16cee4c46d5a2987d9d92cd412144917e239c75d414bddec8b210a1ea44621c822b99fabb73bf76a99fd24a171de2c7dae10944aa00
|
7
|
+
data.tar.gz: 36ab05bfb7c0d903dc266747f1154fe0ef14a4d5e46b6843a337510eedae9e6b4bebf67b9680b6e94d3e3c1055ce2759df1ca804038626d261ad16633cb5c957
|
@@ -18,8 +18,8 @@
|
|
18
18
|
= 対象ユースケース
|
19
19
|
|
20
20
|
* ETL/ELT (Extract, Transform, Load)
|
21
|
-
* PostgreSQL
|
22
|
-
* PostgreSQL
|
21
|
+
* PostgreSQL((*から*))の大量データの((*読み*))込み
|
22
|
+
* PostgreSQL((*へ*))の大量データの((*書き*))込み
|
23
23
|
* 探索的データ分析
|
24
24
|
* PostgreSQL内のデータを理解
|
25
25
|
* サブセットをローカルにダウンロードし、\n
|
@@ -57,10 +57,7 @@
|
|
57
57
|
# relative_height = 100
|
58
58
|
# draw0 = [rectangle, false, 0.075, 0.25, 0.34, 0.105, {color: "#0041ab", line_width: 3, dash: [[1, 6], 0]}]
|
59
59
|
# draw1 = [rectangle, false, 0.125, 0.69, 0.29, 0.105, {color: "#0041ab", line_width: 3, dash: [[1, 6], 0]}]
|
60
|
-
# draw2 = [text,
|
61
|
-
# draw3 = [rectangle, false, 0.43, 0.36, 0.49, 0.17, {color: "#458cff", line_width: 3, dash: [[1, 12], 0]}]
|
62
|
-
# draw4 = [rectangle, false, 0.43, 0.63, 0.27, 0.1, {color: "#458cff", line_width: 3, dash: [[1, 12], 0]}]
|
63
|
-
# draw5 = [text, 速い, 0.77, 0.63, {color: "#458cff", size: 50}]
|
60
|
+
# draw2 = [text, データ変換処理, 0.1, 0.5, {color: "#0041ab", size: 40}]
|
64
61
|
|
65
62
|
sequenceDiagram
|
66
63
|
participant L as ローカル
|
@@ -79,26 +76,31 @@
|
|
79
76
|
: enable-title-on-image
|
80
77
|
false
|
81
78
|
|
82
|
-
=
|
79
|
+
= なぜデータ変換処理に注目するのか
|
83
80
|
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
81
|
+
(('tag:center'))
|
82
|
+
(('tag:large'))
|
83
|
+
データ量に比例する処理だから
|
84
|
+
|
85
|
+
(('wait'))
|
86
|
+
(('tag:center'))
|
87
|
+
(('tag:large'))
|
88
|
+
↓\n
|
89
|
+
大量データだと影響が大きい
|
89
90
|
|
90
91
|
= 高速化アプローチ
|
91
92
|
|
92
93
|
(('tag:center'))
|
93
|
-
(('tag:
|
94
|
+
(('tag:large'))
|
94
95
|
低データ変換コストの\n
|
95
96
|
フォーマットを使う
|
96
97
|
|
97
98
|
(('wait'))
|
98
99
|
(('tag:center'))
|
99
|
-
(('tag:
|
100
|
+
(('tag:large'))
|
100
101
|
↓\n
|
101
|
-
((*Apache Arrow*))
|
102
|
+
((*Apache Arrow*))\n
|
103
|
+
フォーマット
|
102
104
|
|
103
105
|
= 自己紹介
|
104
106
|
|
@@ -116,11 +118,14 @@
|
|
116
118
|
# relative-margin-bottom = 0.5
|
117
119
|
# caption-font-size = 1
|
118
120
|
|
119
|
-
= Apache Arrow
|
121
|
+
= Apache Arrowフォーマット
|
120
122
|
|
121
|
-
*
|
123
|
+
* データ交換に最適化
|
122
124
|
* パースコストほぼ0
|
123
125
|
* データ転送コストのみで交換できる
|
126
|
+
* インメモリーのデータ分析に最適化
|
127
|
+
* ローカルデータの表現としても優秀
|
128
|
+
* 受け取ったデータをそのまま使える
|
124
129
|
|
125
130
|
= 高速化ポイント
|
126
131
|
|
@@ -173,13 +178,13 @@
|
|
173
178
|
= 選んだ方法
|
174
179
|
|
175
180
|
(('tag:center'))
|
176
|
-
(('tag:
|
181
|
+
(('tag:large'))
|
177
182
|
Apache Arrow対応の\n
|
178
183
|
別プロトコル
|
179
184
|
|
180
185
|
(('wait'))
|
181
186
|
(('tag:center'))
|
182
|
-
(('tag:
|
187
|
+
(('tag:large'))
|
183
188
|
↓\n
|
184
189
|
((*Apache Arrow\nFlight SQL*))
|
185
190
|
|
@@ -197,7 +202,8 @@ Apache Arrow対応の\n
|
|
197
202
|
= 別プロトコルを選んだ理由
|
198
203
|
|
199
204
|
* Apache Arrowでこの問題を解決できるか\n
|
200
|
-
|
205
|
+
広く検証したい
|
206
|
+
* PostgreSQLの変更だと試してくれる人が少なそう
|
201
207
|
* PostgreSQL開発者と相談するには\n
|
202
208
|
Apache Arrowでどのくらい改善するかの\n
|
203
209
|
データが必要
|
@@ -208,13 +214,11 @@ Apache Arrow対応の\n
|
|
208
214
|
|
209
215
|
* PostgreSQLの拡張機能として実装
|
210
216
|
* Apache Arrow Flight SQL adapter for PostgreSQL\n
|
217
|
+
(('note:((<URL:https://arrow.apache.org/flight-sql-postgresql/>))'))\n
|
211
218
|
(('note:(プロジェクト名が長い!以後AFSと省略)'))
|
212
|
-
*
|
213
|
-
* PostgreSQL
|
214
|
-
|
215
|
-
* Apache Arrow Flight SQLのライブラリーは\n
|
216
|
-
プロセスベースではなくスレッドベース\n
|
217
|
-
(('note:(PostgreSQLはプロセスベース)'))
|
219
|
+
* 別の実現方法
|
220
|
+
* PostgreSQLのリバースプロキシとして実装\n
|
221
|
+
例:PostgREST
|
218
222
|
|
219
223
|
= 新プロトコル対応方法:PostgREST
|
220
224
|
|
@@ -253,26 +257,458 @@ Apache Arrow対応の\n
|
|
253
257
|
: enable-title-on-image
|
254
258
|
false
|
255
259
|
|
256
|
-
=
|
260
|
+
= Apache Arrowで速くなるのか?
|
261
|
+
|
262
|
+
* 検証1:(({integer}))の(({SELECT}))
|
263
|
+
* 検証2:(({string}))の(({SELECT}))
|
264
|
+
* 検証3:(({integer}))の(({INSERT}))
|
265
|
+
* 検証4:(({string}))の(({INSERT}))
|
266
|
+
|
267
|
+
= 検証1:(({integer}))の(({SELECT}))
|
268
|
+
|
269
|
+
* 1カラムのみN件のランダムデータ
|
270
|
+
* N: 10万、100万、1000万
|
271
|
+
* 比較対象
|
272
|
+
* libpqで(({SELECT}))して結果をパース:ベースライン
|
273
|
+
* AFS:提案方法
|
274
|
+
* libpqで(({COPY}))して結果をパース:既存の高速な方法
|
275
|
+
* PostgreSQL:17(未リリース)
|
276
|
+
|
277
|
+
= 検証1:(({integer}))の(({SELECT})):結果
|
278
|
+
|
279
|
+
* バーが短いほど速い
|
280
|
+
* 10万レコードでは\n
|
281
|
+
どれも変わらない
|
282
|
+
* ✓AFSが速い
|
283
|
+
* 参考:カラム数が\n
|
284
|
+
増えるほど差は開く
|
285
|
+
|
286
|
+
# charty
|
287
|
+
# backend = pyplot
|
288
|
+
# align = right
|
289
|
+
# vertical-align = top
|
290
|
+
# relative-margin-right = -10
|
291
|
+
# relative_height = 90
|
292
|
+
# font-family = MotoyaLMaru
|
293
|
+
# type = bar
|
294
|
+
# x = レコード数
|
295
|
+
# y = 実行時間(秒)
|
296
|
+
# color = 方法
|
297
|
+
方法,レコード数,実行時間(秒)
|
298
|
+
SELECT,10万,0.015
|
299
|
+
AFS,10万,0.014
|
300
|
+
COPY,10万,0.011
|
301
|
+
SELECT,100万,0.140
|
302
|
+
AFS,100万,0.082
|
303
|
+
COPY,100万,0.112
|
304
|
+
SELECT,1000万,1.463
|
305
|
+
AFS,1000万,0.691
|
306
|
+
COPY,1000万,1.108
|
307
|
+
|
308
|
+
= 検証2:(({string}))の(({SELECT}))
|
309
|
+
|
310
|
+
* 1カラムのみN件の64バイトランダムデータ
|
311
|
+
* N: 10万、100万、1000万
|
312
|
+
* 比較対象
|
313
|
+
* libpqで(({SELECT}))して結果をパース:ベースライン
|
314
|
+
* AFS:提案方法
|
315
|
+
* libpqで(({COPY}))して結果をパース:既存の高速な方法
|
316
|
+
* PostgreSQL:17(未リリース)
|
317
|
+
|
318
|
+
= 検証2:(({string}))の(({SELECT})):結果
|
319
|
+
|
320
|
+
* バーが短いほど速い
|
321
|
+
* ✕AFSが遅い
|
322
|
+
* 参考:カラム数が\n
|
323
|
+
増えるほど差は開く
|
324
|
+
|
325
|
+
# charty
|
326
|
+
# backend = pyplot
|
327
|
+
# align = right
|
328
|
+
# vertical-align = top
|
329
|
+
# relative-margin-right = -10
|
330
|
+
# relative_height = 90
|
331
|
+
# font-family = MotoyaLMaru
|
332
|
+
# type = bar
|
333
|
+
# x = レコード数
|
334
|
+
# y = 実行時間(秒)
|
335
|
+
# color = 方法
|
336
|
+
方法,レコード数,実行時間(秒)
|
337
|
+
SELECT,10万,0.017
|
338
|
+
AFS,10万,0.040
|
339
|
+
COPY,10万,0.016
|
340
|
+
SELECT,100万,0.162
|
341
|
+
AFS,100万,0.364
|
342
|
+
COPY,100万,0.152
|
343
|
+
SELECT,1000万,1.706
|
344
|
+
AFS,1000万,2.053
|
345
|
+
COPY,1000万,1.603
|
346
|
+
|
347
|
+
= AFSがなぜ遅いか
|
348
|
+
|
349
|
+
* そもそも(({SELECT}))/(({COPY}))が速い
|
350
|
+
* データをそのまま送っているのでパースコスト0
|
351
|
+
* 数値は文字列表現→数値の変換が必要
|
352
|
+
* 無駄なデータコピーがある?
|
353
|
+
* (({SPI_getbinval()}))が遅い?
|
354
|
+
|
355
|
+
= 検証3:(({integer}))の(({INSERT}))
|
356
|
+
|
357
|
+
* 1カラムのみN件のランダムデータ
|
358
|
+
* N: 10万、100万、1000万
|
359
|
+
* 比較対象
|
360
|
+
* (({INSERT}))を作ってlibpqで実行:ベースライン
|
361
|
+
* AFS:提案方法
|
362
|
+
* (({COPY}))用データを作って実行:既存の高速な方法
|
363
|
+
* PostgreSQL:17(未リリース)
|
364
|
+
|
365
|
+
= 検証3:(({integer}))の(({INSERT})):結果
|
366
|
+
|
367
|
+
* バーが短いほど速い
|
368
|
+
* ✕AFSが遅い
|
369
|
+
* COPYが速い
|
370
|
+
|
371
|
+
# charty
|
372
|
+
# backend = pyplot
|
373
|
+
# align = right
|
374
|
+
# vertical-align = top
|
375
|
+
# relative-margin-right = -10
|
376
|
+
# relative_height = 90
|
377
|
+
# font-family = MotoyaLMaru
|
378
|
+
# type = bar
|
379
|
+
# x = レコード数
|
380
|
+
# y = 実行時間(秒)
|
381
|
+
# color = 方法
|
382
|
+
方法,レコード数,実行時間(秒)
|
383
|
+
INSERT,10万,0.310
|
384
|
+
AFS,10万,0.497
|
385
|
+
COPY,10万,0.068
|
386
|
+
INSERT,100万,5.410
|
387
|
+
AFS,100万,7.013
|
388
|
+
COPY,100万,0.637
|
389
|
+
INSERT,1000万,37.522
|
390
|
+
AFS,1000万,55.064
|
391
|
+
COPY,1000万,6.720
|
392
|
+
|
393
|
+
= AFSがなぜ遅いか
|
394
|
+
|
395
|
+
* N回(({SPI_execute("INSERT")}))しているから
|
396
|
+
* 現在はFlight SQLにバルクインサート用APIがない
|
397
|
+
* PREPARE + パラメーターバインドで実現
|
398
|
+
* 今後:
|
399
|
+
* バルクインサート用APIを設計中\n
|
400
|
+
(('note:((<URL:https://github.com/apache/arrow/issues/38255>))'))
|
401
|
+
* より効率的な内部実装にできる予定\n
|
402
|
+
(('note:(でもSPIで(({COPY FROM STDIN}))を使えないんだよな…)'))\n
|
403
|
+
(('note:((({SPI_register_relation()}))は速いのかな?)'))
|
404
|
+
|
405
|
+
= 検証4:(({string}))の(({INSERT}))
|
406
|
+
|
407
|
+
* 1カラムのみN件の64バイトランダムデータ
|
408
|
+
* N: 10万、100万、1000万
|
409
|
+
* 比較対象
|
410
|
+
* (({INSERT}))を作ってlibpqで実行:ベースライン
|
411
|
+
* AFS:提案方法
|
412
|
+
* (({COPY}))用データを作って実行:既存の高速な方法
|
413
|
+
* PostgreSQL:17(未リリース)
|
414
|
+
|
415
|
+
= 検証4:(({string}))の(({INSERT})):結果
|
416
|
+
|
417
|
+
* バーが短いほど速い
|
418
|
+
* (({integer}))と同じ傾向
|
419
|
+
|
420
|
+
# charty
|
421
|
+
# backend = pyplot
|
422
|
+
# align = right
|
423
|
+
# vertical-align = top
|
424
|
+
# relative-margin-right = -10
|
425
|
+
# relative_height = 90
|
426
|
+
# font-family = MotoyaLMaru
|
427
|
+
# type = bar
|
428
|
+
# x = レコード数
|
429
|
+
# y = 実行時間(秒)
|
430
|
+
# color = 方法
|
431
|
+
方法,レコード数,実行時間(秒)
|
432
|
+
INSERT,10万,0.662
|
433
|
+
AFS,10万,0.662
|
434
|
+
COPY,10万,0.265
|
435
|
+
INSERT,100万,5.956
|
436
|
+
AFS,100万,7.028
|
437
|
+
COPY,100万,2.915
|
438
|
+
INSERT,1000万,86.678
|
439
|
+
AFS,1000万,97.898
|
440
|
+
COPY,1000万,50.889
|
441
|
+
|
442
|
+
= ユーザー向けの話のまとめ
|
443
|
+
|
444
|
+
* 課題:大量データの読み書きが遅い
|
445
|
+
* 解決方法:
|
446
|
+
* Apache Arrowフォーマット/Flight SQL
|
447
|
+
* 現状:
|
448
|
+
* ✓数値の読み込みは速い→今すぐ体験できる!
|
449
|
+
* ✕文字列の読み込みは遅い→今後に期待!
|
450
|
+
* ✕書き込みは遅い→今後に期待!
|
451
|
+
|
452
|
+
= 開発者向けの話
|
453
|
+
|
454
|
+
* Apache Arrow Flight SQL
|
455
|
+
* 認証
|
456
|
+
* 追加プロトコル対応
|
457
|
+
|
458
|
+
= Apache Arrow Flight SQL
|
459
|
+
|
460
|
+
* プロトコル
|
461
|
+
* Apache Arrow(列指向)データに最適化
|
462
|
+
* すでにArrowベースなデータ処理システムになじむ
|
463
|
+
* 例:Polars, pandas, PG-Strom, ...
|
464
|
+
* 複数ノードから並列ダウンロード可
|
465
|
+
* postgres_fdwを使ったPostgreSQLクラスターから\n
|
466
|
+
並列ダウンロードとか?
|
467
|
+
|
468
|
+
= (({SELECT}))
|
469
|
+
|
470
|
+
# mermaid
|
471
|
+
# relative_height = 100
|
472
|
+
|
473
|
+
sequenceDiagram
|
474
|
+
participant C as クライアント
|
475
|
+
participant S as サーバー
|
476
|
+
C->>S: GetFlightInfo("SELECT ...")
|
477
|
+
S->>C: FlightInfo(データ取得のための情報)
|
478
|
+
C->>S: DoGet(FlightInfo)
|
479
|
+
S->>C: Apache Arrowデータ(ストリームで送信)
|
480
|
+
|
481
|
+
== Slide properties
|
482
|
+
|
483
|
+
: enable-title-on-image
|
484
|
+
false
|
485
|
+
|
486
|
+
= (({SELECT})):並列ダウンロード
|
257
487
|
|
258
|
-
|
259
|
-
|
260
|
-
|
261
|
-
|
262
|
-
|
263
|
-
|
264
|
-
|
265
|
-
|
488
|
+
# mermaid
|
489
|
+
# relative_height = 100
|
490
|
+
|
491
|
+
sequenceDiagram
|
492
|
+
participant C as クライアント
|
493
|
+
participant S as サーバー
|
494
|
+
participant N1 as ノード1
|
495
|
+
participant N2 as ノード2
|
496
|
+
C->>S: GetFlightInfo("SELECT ...")
|
497
|
+
S->>C: FlightInfo1, FlightInfo2
|
498
|
+
par ノード1からデータ取得
|
499
|
+
C->>N1: DoGet(FlightInfo1)
|
500
|
+
N1->>C: Apache Arrowデータ
|
501
|
+
and ノード2からデータ取得
|
502
|
+
C->>N2: DoGet(FlightInfo2)
|
503
|
+
N2->>C: Apache Arrowデータ
|
504
|
+
end
|
505
|
+
|
506
|
+
== Slide properties
|
507
|
+
|
508
|
+
: enable-title-on-image
|
509
|
+
false
|
266
510
|
|
267
|
-
=
|
511
|
+
= (({INSERT}))
|
268
512
|
|
269
513
|
# mermaid
|
270
514
|
# relative_height = 100
|
271
|
-
|
272
|
-
|
273
|
-
|
274
|
-
|
275
|
-
|
515
|
+
|
516
|
+
sequenceDiagram
|
517
|
+
participant C as クライアント
|
518
|
+
participant S as サーバー
|
519
|
+
C->>S: DoAction("CreatePreparedStatement", "INSERT ... VALUES (?)")
|
520
|
+
S->>C: ハンドル(プリペアドステートメントのID)
|
521
|
+
C->>S: DoPut(ハンドル, Apache Arrowデータ)(ストリームで送信)
|
522
|
+
S->>C: 変更したレコード数
|
523
|
+
|
524
|
+
== Slide properties
|
525
|
+
|
526
|
+
: enable-title-on-image
|
527
|
+
false
|
528
|
+
|
529
|
+
= (({INSERT})):今後
|
530
|
+
|
531
|
+
# mermaid
|
532
|
+
# relative_height = 100
|
533
|
+
|
534
|
+
sequenceDiagram
|
535
|
+
participant C as クライアント
|
536
|
+
participant S as サーバー
|
537
|
+
note left of S: これで速くなるといいな!
|
538
|
+
C->>S: DoPut(テーブル, Apache Arrowデータ)
|
539
|
+
S->>C: 変更したレコード数
|
540
|
+
|
541
|
+
== Slide properties
|
542
|
+
|
543
|
+
: enable-title-on-image
|
544
|
+
false
|
545
|
+
|
546
|
+
= 開発者向けの話:認証
|
547
|
+
|
548
|
+
* Apache Arrow Flight SQL
|
549
|
+
* ((*認証*))
|
550
|
+
* 追加プロトコル対応
|
551
|
+
|
552
|
+
= 認証
|
553
|
+
|
554
|
+
* PGプロトコルを使わない→自前実装が必要
|
555
|
+
* PGの認証実装はPGプロトコルと蜜結合
|
556
|
+
* でも、認証情報の二重管理はしたくない!
|
557
|
+
* →PostgreSQLの認証情報で認証
|
558
|
+
|
559
|
+
= PostgreSQLの認証情報
|
560
|
+
|
561
|
+
* (({pg_hba.conf}))
|
562
|
+
* ホストベースの認証情報
|
563
|
+
* 接続可の接続元は?SSLは必須?とか
|
564
|
+
* (({CREATE ROLE}))
|
565
|
+
* PostgreSQL内にユーザーを作成
|
566
|
+
* パスワードはPostgreSQLで管理または別途管理
|
567
|
+
|
568
|
+
= 対応済み認証方法
|
569
|
+
|
570
|
+
* trust認証
|
571
|
+
* 接続可のホストから接続されればOK
|
572
|
+
* 本番環境では使わないこと!
|
573
|
+
* パスワード認証
|
574
|
+
* PostgreSQL内のパスワードを使って認証
|
575
|
+
* SSLを有効にすること!
|
576
|
+
|
577
|
+
= その他の認証方法
|
578
|
+
|
579
|
+
* scram-sha-256
|
580
|
+
* チャレンジレスポンスが必要なので未対応
|
581
|
+
* 今はHTTP/2のauthorization: Basicを使っている
|
582
|
+
* 証明書認証(mTLS)\n
|
583
|
+
(('note:(Mutual Transport Layer Security・相互TLS)'))
|
584
|
+
* サーバーがクライアントの証明書を検証
|
585
|
+
* 簡単に実装できるはずなので実装予定\n
|
586
|
+
(('note:(実装にはSSL対応が必須)'))
|
587
|
+
|
588
|
+
= SSL対応
|
589
|
+
|
590
|
+
* 実装済み
|
591
|
+
* Apache Arrow Flight SQLはSSL対応
|
592
|
+
* mTLSにも対応
|
593
|
+
* SSL対応に必要なもの
|
594
|
+
* 証明書・証明書の秘密鍵・認証局
|
595
|
+
* すべてPostgreSQLで設定可
|
596
|
+
* →AFSは↑を使っている\n
|
597
|
+
(('note:(二重管理を避ける!)'))
|
598
|
+
|
599
|
+
= 開発者向けの話:認証
|
600
|
+
|
601
|
+
* Apache Arrow Flight SQL
|
602
|
+
* 認証
|
603
|
+
* ((*追加プロトコル対応*))
|
604
|
+
|
605
|
+
= 追加プロトコル対応
|
606
|
+
|
607
|
+
* PostgreSQLは別プロトコルでの\n
|
608
|
+
接続を想定していない
|
609
|
+
* 拡張ポイントがたくさんあるPostgreSQLだが\n
|
610
|
+
プロトコル追加用の拡張ポイントはない
|
611
|
+
* ソケットをlistenしないといけない
|
612
|
+
* PostgreSQLはシングルスレッドなので\n
|
613
|
+
既存プロセスでやるとブロックする
|
614
|
+
|
615
|
+
= バックグランドワーカー
|
616
|
+
|
617
|
+
* PG管理の別プロセスを\n
|
618
|
+
起動する仕組み
|
619
|
+
* ここでlistenすれば\n
|
620
|
+
既存処理をブロックしない
|
621
|
+
|
622
|
+
# mermaid
|
623
|
+
# align = right
|
624
|
+
# vertical-align = bottom
|
625
|
+
# relative-width = 45
|
626
|
+
# relative-margin-right = -10
|
627
|
+
|
628
|
+
sequenceDiagram
|
629
|
+
actor U as ユーザー
|
630
|
+
participant P as PostgreSQL
|
631
|
+
participant AFS as AFS
|
632
|
+
P->>AFS: 起動
|
633
|
+
U->>AFS: Apache Arrow Flight SQL
|
634
|
+
AFS->>U: Apache Arrow Flight SQL
|
635
|
+
|
636
|
+
= 接続
|
637
|
+
|
638
|
+
* ✕listenするプロセスでSQL実行
|
639
|
+
* listenするプロセスはマルチスレッド
|
640
|
+
* PGはマルチスレッド非対応→PGのAPIを呼べない
|
641
|
+
* プロセスを分離:
|
642
|
+
* listenするプロセス:\n
|
643
|
+
server
|
644
|
+
* 各接続を処理するプロセス:\n
|
645
|
+
executor(('note:(シングルスレッド)'))
|
646
|
+
|
647
|
+
# mermaid
|
648
|
+
# align = right
|
649
|
+
# vertical-align = bottom
|
650
|
+
# relative-width = 45
|
651
|
+
# relative-margin-top = 10
|
652
|
+
# relative-margin-right = -10
|
653
|
+
# draw0 = [text, マルチスレッド, 0.47, 0.15, {color: "#0041ab", size: 15}]
|
654
|
+
# draw1 = [text, シングルスレッド, 0.67, 0.15, {color: "#0041ab", size: 15}]
|
655
|
+
|
656
|
+
sequenceDiagram
|
657
|
+
actor U as ユーザー
|
658
|
+
participant P as PostgreSQL
|
659
|
+
participant AFSs as AFS server
|
660
|
+
participant AFSe as AFS executor
|
661
|
+
P->>AFSs: 起動
|
662
|
+
U->>AFSs: Apache Arrow Flight SQL
|
663
|
+
AFSs->>AFSe: 起動
|
664
|
+
AFSs->>AFSe: 実行依頼
|
665
|
+
note right of AFSe: 実行
|
666
|
+
AFSe->>AFSs: 結果返却
|
667
|
+
AFSs->>U: Apache Arrow Flight SQL
|
668
|
+
|
669
|
+
= executorの起動方法
|
670
|
+
|
671
|
+
* ✕マルチスレッド下でfork
|
672
|
+
* serverはマルチスレッド
|
673
|
+
* ✕serverからexecutorを起動
|
674
|
+
* この構成は危険
|
675
|
+
|
676
|
+
# mermaid
|
677
|
+
# align = right
|
678
|
+
# vertical-align = bottom
|
679
|
+
# relative-width = 45
|
680
|
+
# relative-margin-top = 10
|
681
|
+
# relative-margin-right = -10
|
682
|
+
# draw0 = [text, マルチスレッド, 0.47, 0.15, {color: "#0041ab", size: 15}]
|
683
|
+
|
684
|
+
sequenceDiagram
|
685
|
+
actor U as ユーザー
|
686
|
+
participant P as PostgreSQL
|
687
|
+
participant AFSs as AFS server
|
688
|
+
participant AFSe as AFS executor
|
689
|
+
P->>AFSs: 起動
|
690
|
+
U->>AFSs: Apache Arrow Flight SQL
|
691
|
+
AFSs->>AFSe: 起動
|
692
|
+
note right of AFSe: だめ!!!
|
693
|
+
AFSs->>AFSe: 実行依頼
|
694
|
+
AFSe->>AFSs: 結果返却
|
695
|
+
AFSs->>U: Apache Arrow Flight SQL
|
696
|
+
|
697
|
+
= 安全なexecutorの起動方法
|
698
|
+
|
699
|
+
* executor起動用プロセスを追加
|
700
|
+
* main:シングルスレッド
|
701
|
+
* serverはmainに起動依頼
|
702
|
+
* mainからexecutorを起動
|
703
|
+
|
704
|
+
# mermaid
|
705
|
+
# align = right
|
706
|
+
# vertical-align = bottom
|
707
|
+
# relative-width = 45
|
708
|
+
# relative-margin-top = 10
|
709
|
+
# relative-margin-right = -10
|
710
|
+
# draw0 = [text, シングルスレッド, 0.39, 0.13, {color: "#0041ab", size: 10}]
|
711
|
+
# draw1 = [text, マルチスレッド, 0.57, 0.13, {color: "#0041ab", size: 10}]
|
276
712
|
|
277
713
|
sequenceDiagram
|
278
714
|
actor U as ユーザー
|
@@ -290,22 +726,90 @@ Apache Arrow対応の\n
|
|
290
726
|
AFSe->>AFSs: 結果返却
|
291
727
|
AFSs->>U: Apache Arrow Flight SQL
|
292
728
|
|
293
|
-
|
729
|
+
= executorでの実行
|
294
730
|
|
295
|
-
|
296
|
-
|
731
|
+
* やり方は2つ
|
732
|
+
* libpq:PostgreSQLに\n
|
733
|
+
接続して実行
|
734
|
+
* SPI:プロセス内で実行\n
|
735
|
+
(('note:(Server Programming Interface)'))
|
736
|
+
* AFSはSPI
|
737
|
+
* libpqだと意味がない\n
|
738
|
+
(('note:(PostgreSQLプロトコルを使ってしまう)'))
|
297
739
|
|
298
|
-
#
|
740
|
+
# mermaid
|
741
|
+
# align = right
|
742
|
+
# vertical-align = bottom
|
743
|
+
# relative-width = 45
|
744
|
+
# relative-margin-top = 10
|
745
|
+
# relative-margin-right = -10
|
299
746
|
|
300
|
-
|
747
|
+
sequenceDiagram
|
748
|
+
participant P as PostgreSQL
|
749
|
+
participant AFSe as AFS executor
|
750
|
+
alt libpq
|
751
|
+
AFSe->>P: PostgreSQLプロトコルで接続
|
752
|
+
AFSe->>P: 実行依頼
|
753
|
+
note left of P: 別プロセスを立ち上げて実行するけど省略
|
754
|
+
P->>AFSe: 結果返却
|
755
|
+
else SPI
|
756
|
+
AFSe->>AFSe: 自分で実行
|
757
|
+
end
|
758
|
+
|
759
|
+
= プロセス間通信
|
301
760
|
|
302
|
-
|
761
|
+
* serverとexecutorで\n
|
762
|
+
Apache Arrowデータのやりとりが必要
|
763
|
+
* 通信方法
|
764
|
+
* 共有メモリーで\n
|
765
|
+
リングバッファー
|
766
|
+
* ナイーブな自前実装\n
|
767
|
+
(('note:(高速化の余地あり)'))\n
|
768
|
+
* (({shm_mq}))でいいかも…
|
303
769
|
|
304
|
-
|
305
|
-
|
770
|
+
# mermaid
|
771
|
+
# align = right
|
772
|
+
# vertical-align = bottom
|
773
|
+
# relative-width = 50
|
774
|
+
# relative-margin-top = 10
|
775
|
+
# relative-margin-right = -10
|
776
|
+
|
777
|
+
sequenceDiagram
|
778
|
+
actor U as ユーザー
|
779
|
+
participant P as PostgreSQL
|
780
|
+
participant AFSm as AFS main
|
781
|
+
participant AFSs as AFS server
|
782
|
+
participant AFSe as AFS executor
|
783
|
+
P->>AFSm: 起動
|
784
|
+
AFSm->>AFSs: 起動
|
785
|
+
U->>AFSs: Apache Arrow Flight SQL
|
786
|
+
AFSs->>AFSm: executor起動依頼
|
787
|
+
AFSm->>AFSe: 起動
|
788
|
+
AFSs->>AFSe: 実行依頼
|
789
|
+
note left of AFSe: 共有メモリーでリングバッファー
|
790
|
+
AFSe->>AFSs: 結果返却
|
791
|
+
AFSs->>U: Apache Arrow Flight SQL
|
792
|
+
|
793
|
+
= 開発者向けの話のまとめ
|
794
|
+
|
795
|
+
* 設計判断も含めて全体の構成を紹介
|
796
|
+
* 改良案も含めて課題も紹介
|
797
|
+
|
798
|
+
(('wait'))
|
799
|
+
(('tag:center'))
|
800
|
+
(('tag:x-large'))
|
801
|
+
↓\n
|
802
|
+
一緒に開発しよう!
|
803
|
+
|
804
|
+
= 全体のまとめ
|
805
|
+
|
806
|
+
* 課題:大量データの読み書きが遅い
|
306
807
|
* 解決方法:
|
307
|
-
* Apache Arrow
|
308
|
-
|
808
|
+
* Apache Arrowフォーマット/Flight SQL
|
809
|
+
* 現状:✓数値の読み込みは速い
|
810
|
+
* 今後:
|
811
|
+
* このアプローチの改良
|
812
|
+
* (({COPY}))のApache Arrowフォーマット対応
|
309
813
|
|
310
814
|
= サポート
|
311
815
|
|
@@ -316,4 +820,3 @@ Apache Arrow対応の\n
|
|
316
820
|
* (('note:((<URL:https://www.clear-code.com/contact/>))'))
|
317
821
|
* PGroongaのサポートも可\n
|
318
822
|
(('note:PGroonga:PostgreSQLに高速日本語全文検索機能を追加'))
|
319
|
-
|
data/config.yaml
CHANGED
Binary file
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: rabbit-slide-kou-postgresql-conference-japan-2023
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 2023.11.24.
|
4
|
+
version: 2023.11.24.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- 須藤功平
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2023-
|
11
|
+
date: 2023-11-23 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rabbit
|