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: e429e96e5e854ece58487584d15f14649784ff7b60c3621ba5c6e8495a07edb8
4
- data.tar.gz: 34dd70d21add731e051a540beb16b82dc9bb2c1036bbb338c80718817c24aed7
3
+ metadata.gz: 155a7faaa21e9b829749a0d4d767d2396edb504b579c5664590f3f990873f9b5
4
+ data.tar.gz: c6cdb92e3bf87097eb70846af38d0038140caedafe06cdbb63347372411df764
5
5
  SHA512:
6
- metadata.gz: 7d2179d1724b3fdfce237aa4a6797c5dd22b429ac4971ae2408d264d2f922ee4b2299f04544ef63cf1d6045814d6d8e104deaa03e4c403333d1f2985982d72ee
7
- data.tar.gz: 067f0eb55c225d98c014dd9f4af9e5393026172224d7c6136c59541628db8d727bd87c6ead1db42a248db51286d74b6787d895f5e3c10c1968172d2ef73b58c0
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, 遅い, 0.2, 0.5, {color: "#0041ab", size: 50}]
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
- * (({INSERT}))/(({COPY}))用に((*データ変換*))
87
- * 抽出:
88
- * PostgreSQL独自フォーマットの((*パース*))
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:x-large'))
94
+ (('tag:large'))
94
95
  低データ変換コストの\n
95
96
  フォーマットを使う
96
97
 
97
98
  (('wait'))
98
99
  (('tag:center'))
99
- (('tag:x-large'))
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:x-large'))
181
+ (('tag:large'))
177
182
  Apache Arrow対応の\n
178
183
  別プロトコル
179
184
 
180
185
  (('wait'))
181
186
  (('tag:center'))
182
- (('tag:x-large'))
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にはプロトコルを拡張する仕組みはない\n
214
- (('note:(MySQLにはある)'))
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
- * PostgreSQL:プロセスベース
259
- * 同時実行は別プロセスとして実行
260
- * Apache Arrow Flight SQL:スレッドベース
261
- * 同時実行は別スレッドとして実行
262
- * マルチプロセス×マルチスレッド
263
- * 混ぜるな危険!
264
- * 対策:マルチスレッドのプロセスを分離して\n
265
- そのプロセスはPostgreSQLのAPIを使わない
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
- = 並列方法:AFS
511
+ = (({INSERT}))
268
512
 
269
513
  # mermaid
270
514
  # relative_height = 100
271
- # draw0 = [text, マルチスレッド, 0.54, 0.15, {color: "#0041ab", size: 30}]
272
- # draw1 = [text, PGのAPIを使わない, 0.54, 0.2, {color: "#0041ab", size: 30}]
273
- # draw2 = [text, Apache Arrowフォーマット, 0.57, 0.75, {color: "#0041ab", size: 30}]
274
- # draw3 = [text, 低コスト!, 0.66, 0.82, {color: "#0041ab", size: 30}]
275
- # draw4 = [text, 低コスト!, 0.06, 0.82, {color: "#0041ab", size: 30}]
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
- == Slide properties
729
+ = executorでの実行
294
730
 
295
- : enable-title-on-image
296
- false
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
- # = Apache Arrow Flight SQL
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
- * Apache Arrow Flight SQLの使用
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
@@ -6,7 +6,7 @@ tags:
6
6
  - arrow
7
7
  - postgresql
8
8
  presentation_date: 2023-11-24
9
- version: 2023.11.24.0
9
+ version: 2023.11.24.1
10
10
  licenses:
11
11
  - CC-BY-SA-4.0
12
12
  slideshare_id:
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.0
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-10-31 00:00:00.000000000 Z
11
+ date: 2023-11-23 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rabbit