Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

MariaDB ColumnStore 始めませんか?

1,467 views

Published on

MariaDB ColumnStore の基本アーキテクチャを解説。
初心者が躓きやすい導入から検証までの注意事項をまとめました。

Published in: Technology
  • Be the first to comment

MariaDB ColumnStore 始めませんか?

  1. 1. MariaDB ColumnStore はじめませんか? JPMUG 代表 カワノ
  2. 2. ColumnStoreとは?
  3. 3. ColumnStoreの歴史
  4. 4. ColumnStoreとは? チューニングレスで⾼い検索パフォーマ ンスを実現するDWH特化型データベース
  5. 5. ColumnStoreとは? • 分析/集計処理に最適なカラムストアエンジン • MySQLとの互換性 • 専⽤HD不要 • リニアにスケールアウト
  6. 6. ColumnStoreとは? パフォーマンス改善の切り札
  7. 7. アーキテクチャ • ⼤規模並列処理(Massively Parallel Processing)
  8. 8. アーキテクチャ ⼤規模並列処理 Clients User Module Performance Module ColumnStore Distributed Data Storage User sessions MariaDB SQL Front End Query Engine Local Storage, SAN EBS,HDFS…
  9. 9. アーキテクチャ 対称型マルチプロセッシング(SMP) Clients User Module Performance Module ColumnStore Distributed Data Storage User sessions MariaDB SQL Front End Query Engine Local Storage, SAN EBS,HDFS…
  10. 10. アーキテクチャ ⼤規模並列処理 • ユーザーモジュール • MariaDB Serverインスタンスと並⾏スケーリングを扱うためのプロセス
  11. 11. アーキテクチャ ⼤規模並列処理 • パフォーマンスモジュール • パフォーマンスモジュールはデータの保存、検索、管理を受け持ち、クエ リー操作に対するブロックへのリクエストを処理し、クエリーに応えるプ ロセス。
  12. 12. アーキテクチャ ⼤規模並列処理 • ストレージ • オンプレミスで動作するときは、ローカルストレージや、SANなどの共通 ストレージを使⽤可能 • Amazon EC2環境では、ephemeralまたはElastic Block Store (EBS)を使⽤可能 • シェアードナッシング環境でデータの冗⻑化が必要な場合、GlusterFSや Apache Hadoop Distributed File System (HDFS)を使⽤可能
  13. 13. アーキテクチャ システムデータベース • calpontsys : • ColumnStoreテーブルのメタデータを管理 • infinidb_querystats : • クエリパフォーマンス情報を管理 • infinidb_vtable : • クエリ実⾏の⼀部である⼀時テーブルの作成に使⽤されます。 ColumnStoreクエリを実⾏するすべてのユーザーは、このデータベース 上で、⼀時テーブルオプションを作成する必要があります。
  14. 14. アーキテクチャ Extent Map • 物理的なセグメントファイル内 に存在する論理ブロック • エクステント及び対応するブ ロックを管理 • データの抽出と配置は、エクス テントマップにより⾼速で処理 される • リアルタイム解凍と圧縮 • バージョンバッファーファイル (UNDO)
  15. 15. アーキテクチャ Extent Map SELECT COL – D FROM TABLE WHERE COL - D BETWEEN 110 AND 180 ;
  16. 16. アーキテクチャ Extent Map SELECT COL – D FROM TABLE WHERE COL - D BETWEEN 110 AND 180 ;
  17. 17. リニアにスケールアウト 17
  18. 18. おまけ Transaction Engine Transactions XA Columnstore YES NO MyISAM NO NO InnoDB YES YES
  19. 19. Transaction ColumnStore vs InnoDB sysbench # sysbench --test=oltp --db-driver=mysql --mysql-socket=/usr/local/mariadb/columnstore/mysql/lib/mysql/mysql.sock --num-threads=1 --max-requests=500 --max-time=0 --oltp-test-mode=complex --mysql-user=sbtest --mysql-password=sbtest --oltp-test-mode=nontrx --oltp-nontrx-mode=insert run ※ columnstoreは並列度が1じゃないとlockエラーするのでnum-threads=1で⽐較
  20. 20. Columnstore Install
  21. 21. Install Preparing for ColumnStore Installation https://mariadb.com/kb/en/the-mariadb-library/preparing-for-columnstore-installation/ • 上記サイトを参考にCentOS 7.2 にSingle Server構成でインストール Item Description Physical Server 8 core Intel / AMD, 32GB Memory Storage Local disk with appropriate RAID redundancy or network attached storage Minimum Hardware Specification
  22. 22. Install ColumnStore関連パッケージインストール # yum -y install boost expect perl perl-DBI openssl zlib file sudo libaio rsync snappy net-tools perl-DBD-MySQL RPMパッケージ取得 & 解凍 # wget https://downloads.mariadb.com/ColumnStore/1.0.9/centos/x86_64/7/mariadb- columnstore-1.0.9-1-centos7.x86_64.rpm.tar.gz # tar zxvf mariadb-columnstore-1.0.9-1-centos7.x86_64.rpm.tar.gz # rpm -ivh *.rpm
  23. 23. Install RPMパッケージインストール # rpm -ivh *.rpm RPMパッケージ確認 # rpm -qa | grep mariadb mariadb-columnstore-libs-1.0.9-1.x86_64 mariadb-columnstore-platform-1.0.9-1.x86_64 mariadb-columnstore-common-1.0.9-1.el7.centos.x86_64 mariadb-columnstore-client-1.0.9-1.el7.centos.x86_64 …
  24. 24. Install ColumnStore初期設定 # /usr/local/mariadb/columnstore/bin/postConfigure Select the type of System Server install [1=single, 2=multi] (2) > 1 Enter System Name (columnstore-1) > columnstore-1 Select the type of Data Storage [1=internal, 2=external] (1) > 1 Enter the list (Nx,Ny,Nz) or range (Nx-Nz) of DBRoot IDs assigned to module 'pm1' (1) > 1 ===== Performing Configuration Setup and MariaDB ColumnStore Startup ===== ... Enter 'mcsmysql' to access the MariaDB ColumnStore SQL console Enter 'mcsadmin' to access the MariaDB ColumnStore Admin console
  25. 25. Console
  26. 26. SQLコンソール mcsmysql • MariaDB CoumnStore ⽤コンソール • mysql コンソールと使⽤⽅法は同⼀
  27. 27. 管理コンソール mcsadmin • ColumnStore Administrative Console • 起動/停⽌ • UM/PM構成管理 • 統計情報取得
  28. 28. 管理 mcsadmin Command [myuser@srv1~]# mcsadmin MariaDB Columnstore Admin Console enter 'help' for list of commands enter 'exit' to exit the MariaDB Columnstore Command Console use up/down arrows to recall commandsActive Alarm Counts: Critical = 0, Major = 0, Minor = 0, Warning = 0, Info = 0Critical Active Alarms: mcsadmin> quit
  29. 29. 管理 System operation 停⽌ [myuser@srv1~]# mcsadmin stopSystem [y] 起動 [myuser@srv1~]# mcsadmin startSystem 再起動 [myuser@srv1~]# mcsadmin restartSystem [y]
  30. 30. 管理 Viewing system status [myuser@srv1~]# mcsadmin getSystemStatus getsystemstatus Wed Aug 30 14:27:23 2017 System columnstore-1 System and Module statuses Component Status Last Status Change ------------------ ------------------------- -------------------------------------- System ACTIVE Fri Jun 10 01:50:46 2016 Module pm1 ACTIVE Fri Jun 10 01:50:43 2016
  31. 31. 管理 Viewing process status [myuser@srv1~]# mcsadmin getProcessStatus getprocessstatus Wed Aug 30 14:27:23 2017 System columnstore-1 MariaDB Columnstore Process statuses Process Module Status Last Status Change ProcessID --------------------- ----------- ----------- ---------------------------------- ------------- ProcessMonitor pm1 ACTIVE Fri Jun 10 01:50:04 2016 2487 ProcessManager pm1 ACTIVE Fri Jun 10 01:50:10 2016 2673 …
  32. 32. 管理 Viewing network configuration [myuser@srv1~]# mcsadmin getSystemNetworkConfig getsystemstatus Wed Aug 30 14:27:23 2017 System columnstore-1 System and Module statuses Component Status Last Status Change ------------------ ------------------------- -------------------------------------- System ACTIVE Fri Jun 10 01:50:46 2016 Module pm1 ACTIVE Fri Jun 10 01:50:43 2016
  33. 33. 管理 Viewing module configuration [myuser@srv1~]# mcsadmin getModuleConfig getmoduleconfig Wed Aug 30 14:27:23 2017 Module Name Configuration Module 'um1' Configuration information ModuleType = um ModuleDesc = User Module #1 ModuleIPAdd NIC ID 1 = 10.100.7.80 ModuleHostName NIC ID 1 = srvhst2 …
  34. 34. 管理 Command repeat option [myuser@srv1~]# mcsadmin getProcessStatus -r2 repeating the command 'getProcessStatus' every 2 seconds, enter CTRL-D to stop …
  35. 35. Data import
  36. 36. インポート • cpimport インポート専⽤コマンド • ⾼速にデータロード可能 • LOAD DATA INFILE , INSERT INTO SELECT FROM もサポート • 内部的にはcpimportコマンドで実⾏
  37. 37. cpimport
  38. 38. インポート cpimport 読み込み対象ファイル • 区切り⽂字は ” | ” がデフォルト • -s オプションで区切り⽂字指定 • テーブルカラムとデータの並び順を⼀致させる • ⼀致しない場合は別途 job file を作成する必要がある • ⽇付フォーマットは” yyyy-mm-dd “にしておく • フォーマット違いは全て 0000-00-00 00:00:00 になる
  39. 39. インポート cpimport • データロード中でもテーブル参照可能 • ロード完了後に追加分の参照ができるようになる • トランザクションログへの出⼒はされない
  40. 40. インポート cpimport 実⾏例 [myuser@srv1~]# cpimport sample table1 /tmp/table1.csv –s ‘,’ –E ‘”’ Locale is : C Column delimiter : , Enclosed by Character : ” Using table OID 3278 as the default JOB ID Input file(s) will be read from : /root/tmp … 2017-08-31 16:16:37 (18403) INFO : For table sample.table1: 10000 rows processed and 10000 rows inserted. … 2017-08-31 16:16:37 (18403) INFO : Bulk load completed, total run time : 1.22974 seconds DB TABLE File path option
  41. 41. INSERT SELECT LOAD DATA INFILE
  42. 42. インポート INSERT SELECT使⽤時の注意点 • デフォルトの区切り⽂字が ’ 7 ‘ • データに 7 が含まれる場合 infinidb_import_for_batchinsert_delimiter変数の値を 任意のascii_valueに変更する必要がある
  43. 43. インポート INSERT SELECT, LOAD DATA INFILE 共通の注意点 • ロードするデータファイルサイズが⼤きい場合 バッファサイズ不⾜でロードに失敗する • ERROR 1815 (HY000) at line 1 in file: ’table1.sql': Internal error: CAL0006: IDB- 2008: The version buffer overflowed. Increase VersionBufferFileSize or limit the rows to be processed.
  44. 44. インポート INSERT SELECT, LOAD DATA INFILE 共通の注意点 • VersionBufferFileSizeの変更⼿順は2つ • Columnstore.xml を編集 • configxml.sh スクリプトでColumnstore.xmlを編集 • Columnstore.xml とは? • ColumnStore 専⽤の設定ファイルを記述したXMLファイル
  45. 45. インポート VersionBufferFileSize確認/変更 [myuser@srv1~]# cd /usr/local/mariadb/columnstore/etc/ [myuser@srv1~]# vi Columnstore.xml … <VersionBuffer> <!-- VersionBufferFileSize must be a multiple of 8192. One version buffer file will be put on each DB root. --> <VersionBufferFileSize>1GB</VersionBufferFileSize> </VersionBuffer> …
  46. 46. インポート VersionBufferFileSize確認/変更 [myuser@srv1~]# cd /usr/local/mariadb/columnstore/bin/ [myuser@srv1~]# configxml.sh getconfig VersionBuffer VersionBufferFileSize Current value of VersionBuffer / VersionBufferFileSize is 1GB [myuser@srv1~]# configxml.sh setconfig VersionBuffer VersionBufferFileSize 10GB Old value of VersionBuffer / VersionBufferFileSize is 1GB VersionBuffer / VersionBufferFileSize now set to 10GB section variablecommand
  47. 47. インポート cpimport vs LOAD DATA INFILE CSV 10,000,000件 約1GB
  48. 48. データサイズの確認
  49. 49. データサイズの確認 • columnstore_info Stored Procedure • total_usage() • table_usage() ColumnStore Information Schema Tables https://mariadb.com/kb/en/the-mariadb-library/columnstore-information- schema-tables/#columnstore_extents
  50. 50. データサイズの確認 全体の使⽤サイズ MariaDB [(none)]> call columnstore_info.total_usage(); +-------------------------+----------------------------+ | TOTAL_DATA_SIZE | TOTAL_DISK_USAGE | +-------------------------+----------------------------+ | 1.49 GB | 1.58 GB | +-------------------------+----------------------------+
  51. 51. データサイズの確認 Table毎の使⽤サイズ MariaDB [(none)]> call columnstore_info.table_usage(NULL,NULL); +-----------------------+---------------------+---------------------------+-------------------------+---------------------+ | TABLE_SCHEMA | TABLE_NAME | DATA_DISK_USAGE | DICT_DISK_USAGE | TOTAL_USAGE | +-----------------------+---------------------+---------------------------+-------------------------+---------------------+ | loadtest | load_cpimport | 638.90 MB | 140.08 MB | 778.98 MB | | loadtest | load_infile | 638.89 MB | 140.08 MB | 778.97 MB | +-----------------------+---------------------+---------------------------+-------------------------+---------------------+
  52. 52. Cross-Engine Joins setting
  53. 53. クロス・エンジン結合設定 • ColumnStoreテーブルと⾮ColumnStoreテーブルを結合する場合 別途設定が必要 • Columnstore.xml 定義変更 • ColumnStore 再起動 ColumnStoreクロス・エンジン結合の構成 https://mariadb.com/kb/ja/configuring-columnstore-cross-engine-joins/
  54. 54. クロス・エンジン結合設定 CrossEngineSupport変更 [myuser@srv1~]# cd /usr/local/mariadb/columnstore/etc/ [myuser@srv1~]# vi Columnstore.xml … <CrossEngineSupport> <Host>127.0.0.1</Host> <Port>3306</Port> <User>mydbuser</User> <Password>pwd</Password> </CrossEngineSupport> …
  55. 55. Execution plan
  56. 56. 実⾏計画及び統計情報の取得 • EXPLAINでは有益な情報を得られない • 専⽤関数 calSetTrace(), calGetTrace() を使⽤する
  57. 57. 実⾏計画及び統計情報の取得 calSetTrace(), calGetTrace() MariaDB [test]> select calSetTrace(1); MariaDB [test]> select item,name from snmp.raw_201607 limit 1000; MariaDB [test]> select calGetTrace(); Desc Mode Table TableOID ReferencedColumns PIO LIO PBE Elapsed Rows BPS PM raw_201607 3000 (item,time) 0 2287 34078 0.014 1915 TNS UM - - - - - - 0.006 1000 MariaDB [test]> select calSetTrace(0);
  58. 58. 実⾏計画及び統計情報の取得 実⾏計画の⾒⽅ Desc Mode Table TableOID ReferencedColumns PIO LIO PBE Elapsed Rows BPS PM raw_201607 3000 (item,time) 0 2287 34078 0.014 1915 TNS UM 0.005 1000
  59. 59. 実⾏計画及び統計情報の取得 実⾏計画の⾒⽅ Desc Mode Table TableOID ReferencedColumns PIO LIO PBE Elapsed Rows BPS PM raw_201607 3000 (item,time) 0 2287 34078 0.014 1915 TNS UM 0.005 1000 BPS Batch Primitive Step 列ブロック⾛査及びデータ取得 CES Cross Engine Step クロスエンジンJoinの実⾏ DSS Dictionary Structure Step 特定の可変⻑⽂字列値に対するディクショナリスキャン HJS Hash Join Step Hash join の実⾏ HVS Having Step 実⾏結果に対するHavingの実⾏ SQS Sub Query Step サブクエリ実⾏ TAS Tuple Aggregation step PMノードからUMで中間集約結果受信 TNS Tuple Annexation Step 結果作成(filter, order by, limit…) TUS Tuple Union step サブクエリ結果結合 TCS Tuple Constant Step 定数処理 WFS Window Function Step Window function実⾏
  60. 60. 実⾏計画及び統計情報の取得 実⾏計画の⾒⽅ Desc Mode Table TableOID ReferencedColumns PIO LIO PBE Elapsed Rows BPS PM raw_201607 3000 (item,time) 0 2287 34078 0.014 1915 TNS UM 0.005 1000 Partition Blocks Eliminated • エクステントマップにより読み⾶ばしたブロックサイズ • この値が0の場合、エクステントマップの恩恵を得られていない
  61. 61. 実⾏計画及び統計情報の取得 キャッシュクリア MariaDB [test]> select calFlushCache(); MariaDB [test]> select item,name from snmp.raw_201607 limit 1000; MariaDB [test]> select calGetTrace(); Desc Mode Table TableOID ReferencedColumns PIO LIO PBE Elapsed Rows BPS PM raw_201607 3000 (item,time) 37341 2287 34078 0.014 1915 TNS UM - - - - - - 0.006 1000 MariaDB [test]> select calSetTrace(0);
  62. 62. 実⾏計画及び統計情報の取得 select calGetStats(); MariaDB [test]> select count(*) from wide2; … 1 row in set (0.22 sec) MariaDB [test]> select calGetStats(); Query Stats: MaxMemPct-0;NumTempFiles-0;TempFileSpace-0B;ApproxPhyI/O-1931; CacheI/O-2446;BlocksTouched-2443; PartitionBlocksEliminated-0;MsgBytesIn-73KB; MsgBytesOut-1KB;Mode-Distributed
  63. 63. Extent Map
  64. 64. エクステントマップ確認 • 調査対象のカラムOID取得 • editemプロセスからエクステントマップ情報を取得 • 引数にカラムID必須
  65. 65. エクステントマップ確認 カラムOID取得 Select `schema`, `tablename`, `columnname`, `objectid` From calpontsys.syscolumn Where `schema` = ‘対象スキーマ名’ and `tablename` = ‘対象テーブル名’ and `tablename` = ‘対象カラム名’ ;
  66. 66. エクステントマップ確認 editemプロセスから情報取得 [myuser@srv1~]# /usr/local/mariadb/columnstore/bin/editem -o 3019 Col OID = 3019, NumExtents = 1, width = 4 234496 - 238591 (4096) min: 0, max: 3, seqNum: 10, state: valid, fbo: 0, DBRoot: 1, part#: 0, seg#: 0, HWM: 0; status: avail …
  67. 67. エクステントマップ確認 editemプロセスから情報取得 [myuser@srv1~]# /usr/local/mariadb/columnstore/bin/editem -o 3298 Col OID = 3298, NumExtents = 2, width = 8 1311744 - 1319935 (8192) min: notset, max: notset, seqNum: 0, state: valid, fbo: 0, DBRoot: 1, part#: 0, seg#: 0, HWM: 8191; status: avail 1418240 - 1426431 (8192) min: notset, max: notset, seqNum: 0, state: invalid, fbo: 0, DBRoot: 1, part#: 0, seg#: 1, HWM: 1575; status: avail
  68. 68. エクステントマップが 機能しない(使えない)パターン Datatypes Colmun Size Enable TINYINT - ● SMALLINT - ● INTEGER / INT - ● BIGINT - ● DECIMAL / NUMERIC - ● DOUBLE / REAL - × FLOAT - × DATE - ● DATETIME - ● CHAR 8バイト以下 ● 9バイト以上 × VARCHAR 7バイト以下 ● 8バイト以上 × • その他 • ⽇本語(UTF-8)の場合 1⽂字あたり3バイトなので注意 • Min/Max値に差が無い場合
  69. 69. 制限 • primary keyの指定ができない • Indexの作成ができない • レプリケーション⾮対応 • 対応カラム型に制限あり
  70. 70. Datatypes Column Size Description BIGINT 8-bytes A large integer. Numeric value with scale 0. Signed: -9,223,372,036,854,775,806 to+9,223,372,036,854,775,807 Unsigned: 0 to +18,446,744,073,709,551,613 CHAR 1, 2, 4, or 8 bytes Holds letters and special characters of fixed length. Max length is 255. Default and minimum size is 1 byte. DATE 4-bytes Date has year, month, and day. The internal representation of a date is a string of 4 bytes. The first 2 bytes represent the year, .5 bytes the month, and .75 bytes the day in the following format: YYYY-MM-DD. Supported range is 1000-01-01 to 9999-12-31. DATETIME 8-bytes A date and time combination. Supported range is 1000-01-01 00:00:00 to 9999-12-31 23:59:59. DECIMAL/NUMERIC 2, 4, or 8 bytes A packed fixed-point number that can have a specific total number of digits and with a set number of digits after a decimal. The maximum precision (total number of digits) that can be specified is 18. DOUBLE/REAL 8 bytes Stored in 64-bit IEEE-754 floating point format. As such, the number of significant digits is about 15 and the range of values is approximately +/-1e308. The MySQL extension to specify precision and scale is not supported. “REAL” is a synonym for “DOUBLE”. FLOAT 4 bytes Stored in 32-bit IEEE-754 floating point format. As such, the number of significant digits is about 6and the range of values is approximately +/- 1e38.The MySQL extension to specify precision and scale is not supported. INTEGER/INT 4-bytes A normal-size integer. Numeric value with scale 0. Signed: -2,147,483,646 to 2,147,483,647. Unsigned: 0 to 4,294,967,293 SMALLINT 2-bytes A small integer. Signed: -32,766 to 32,767. Unsigned: 0 to 65,533. TINYINT 1-byte A very small integer. Numeric value with scale 0. Signed: -126 to +127. Unsigned: 0 to 253. VARCHAR 1, 2, 4, or 8 bytes or 8-byte token Holds letters, numbers, and special characters of variable length. Max length = 8000 bytes or characters and minimum length = 1 byte or character.
  71. 71. まとめ
  72. 72. ColumnStoreとは? チューニングレスで⾼い検索パフォーマ ンスを実現するDWH特化型データベース
  73. 73. ColumnStoreとは? •コア数,ノード数を増やすことで リニアにスケールアウト •エクステントマップによるI/Oコスト削減
  74. 74. ColumnStoreとは? 要件をきちんと把握した上であれば 使えます!
  75. 75. ColumnStore始めませんか?
  76. 76. ColumnStore 1.1
  77. 77. ColumnStore 1.1 • 1.1ではいくつかのエキサイティングな新機能が追加 • Column StoreエンジンとMariaDBサーバーはGPLライセンス • ⼀部の新しいコンポーネントはLGPLとBSLのライセンス
  78. 78. ColumnStore1.1 Features Data engine MariaDB 10.2 base Streaming/API バルクインポートAPI High Availability GlusterFSサポート(HA) Analytics ユーザー定義集計関数, Window Functions Data Types TEXT型, Blob型のサポート Ease of Use バックアップ&リストアツールの提供 Performance クエリ&メモリ処理改善 Security MariaDB Audit pluginと統合 Certifications
  79. 79. ColumnStore1.1 Data Streaming : ColumnStore Data API •ストリーミングバルクインサート • 直接PMノードへ書き込み要求を⾏う • ⼀括インポートのために巨⼤なCSVファイルを作成する必要が ない • C++ • LGPL licensed ColumnStore Bulk Write SDK https://mariadb.com/kb/en/library/columnstore-bulk-write-sdk/
  80. 80. Thank you so, so much!

×