mariadb columnstore 始めませんか?
TRANSCRIPT
MariaDB ColumnStoreはじめませんか?JPMUG 代表 カワノ
ColumnStoreとは?
ColumnStoreの歴史
ColumnStoreとは?
チューニングレスで⾼い検索パフォーマンスを実現するDWH特化型データベース
ColumnStoreとは?
•分析/集計処理に最適なカラムストアエンジン•MySQLとの互換性•専⽤HD不要•リニアにスケールアウト
ColumnStoreとは?
パフォーマンス改善の切り札
アーキテクチャ
•⼤規模並列処理(MassivelyParallelProcessing)
アーキテクチャ
⼤規模並列処理
Clients
UserModule
PerformanceModule
ColumnStore DistributedDataStorage
Usersessions
MariaDBSQLFrontEnd
QueryEngine
LocalStorage,SANEBS,HDFS…
アーキテクチャ
対称型マルチプロセッシング(SMP)
Clients
UserModule
PerformanceModule
ColumnStore DistributedDataStorage
Usersessions
MariaDBSQLFrontEnd
QueryEngine
LocalStorage,SANEBS,HDFS…
アーキテクチャ
⼤規模並列処理
• ユーザーモジュール• MariaDB Serverインスタンスと並⾏スケーリングを扱うためのプロセス
アーキテクチャ
⼤規模並列処理
• パフォーマンスモジュール• パフォーマンスモジュールはデータの保存、検索、管理を受け持ち、クエ
リー操作に対するブロックへのリクエストを処理し、クエリーに応えるプロセス。
アーキテクチャ
⼤規模並列処理
• ストレージ• オンプレミスで動作するときは、ローカルストレージや、SANなどの共通
ストレージを使⽤可能• AmazonEC2環境では、ephemeralまたはElasticBlockStore(EBS)を使⽤可能• シェアードナッシング環境でデータの冗⻑化が必要な場合、GlusterFSや
ApacheHadoopDistributedFileSystem(HDFS)を使⽤可能
アーキテクチャ
システムデータベース
• calpontsys :• ColumnStoreテーブルのメタデータを管理
• infinidb_querystats :• クエリパフォーマンス情報を管理
• infinidb_vtable :• クエリ実⾏の⼀部である⼀時テーブルの作成に使⽤されます。ColumnStoreクエリを実⾏するすべてのユーザーは、このデータベース上で、⼀時テーブルオプションを作成する必要があります。
アーキテクチャ
ExtentMap
• 物理的なセグメントファイル内に存在する論理ブロック
• エクステント及び対応するブロックを管理
• データの抽出と配置は、エクステントマップにより⾼速で処理される
• リアルタイム解凍と圧縮• バージョンバッファーファイル
(UNDO)
アーキテクチャ
ExtentMap
SELECTCOL– D
FROMTABLE
WHERECOL- D BETWEEN110 AND180
;
アーキテクチャ
ExtentMap
SELECTCOL– D
FROMTABLE
WHERECOL- D BETWEEN110 AND180
;
リニアにスケールアウト
17
おまけ
Transaction
Engine Transactions XAColumnstore YES NOMyISAM NO NOInnoDB YES YES
Transaction
ColumnStore vsInnoDB
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で⽐較
Columnstore Install
Install
Preparing for ColumnStore Installationhttps://mariadb.com/kb/en/the-mariadb-library/preparing-for-columnstore-installation/
• 上記サイトを参考にCentOS 7.2 にSingle Server構成でインストール
Item DescriptionPhysicalServer 8coreIntel/AMD,32GBMemory
Storage LocaldiskwithappropriateRAIDredundancyornetworkattachedstorage
MinimumHardwareSpecification
Install
ColumnStore関連パッケージインストール#yum-yinstallboostexpectperl perl-DBIopenssl zlib filesudo libaio rsync snappynet-toolsperl-DBD-MySQL
RPMパッケージ取得 &解凍#wgethttps://downloads.mariadb.com/ColumnStore/1.0.9/centos/x86_64/7/mariadb-columnstore-1.0.9-1-centos7.x86_64.rpm.tar.gz#tarzxvf mariadb-columnstore-1.0.9-1-centos7.x86_64.rpm.tar.gz#rpm-ivh *.rpm
Install
RPMパッケージインストール#rpm-ivh *.rpm
RPMパッケージ確認#rpm-qa |grepmariadbmariadb-columnstore-libs-1.0.9-1.x86_64mariadb-columnstore-platform-1.0.9-1.x86_64mariadb-columnstore-common-1.0.9-1.el7.centos.x86_64mariadb-columnstore-client-1.0.9-1.el7.centos.x86_64…
Install
ColumnStore初期設定#/usr/local/mariadb/columnstore/bin/postConfigureSelectthetypeofSystemServerinstall[1=single,2=multi](2)>1EnterSystemName(columnstore-1)>columnstore-1SelectthetypeofDataStorage[1=internal,2=external](1)>1Enterthelist(Nx,Ny,Nz)orrange(Nx-Nz)ofDBRoot IDsassignedtomodule'pm1'(1)>1=====PerformingConfigurationSetupandMariaDB ColumnStore Startup=====...Enter'mcsmysql'toaccesstheMariaDB ColumnStore SQLconsoleEnter'mcsadmin'toaccesstheMariaDB ColumnStore Adminconsole
Console
SQLコンソール mcsmysql
•MariaDB CoumnStore ⽤コンソール• mysql コンソールと使⽤⽅法は同⼀
管理コンソール mcsadmin
• ColumnStore Administrative Console• 起動/停⽌• UM/PM構成管理• 統計情報取得
管理
mcsadmin Command
[myuser@srv1~]#mcsadminMariaDB Columnstore AdminConsoleenter'help'forlistofcommandsenter'exit'toexittheMariaDB Columnstore CommandConsoleuseup/downarrowstorecallcommandsActive AlarmCounts:Critical=0,Major=0,Minor=0,Warning=0,Info=0CriticalActiveAlarms:mcsadmin>quit
管理
Systemoperation
停⽌[myuser@srv1~]#mcsadmin stopSystem [y]起動[myuser@srv1~]#mcsadmin startSystem再起動[myuser@srv1~]#mcsadmin restartSystem [y]
管理
Viewingsystemstatus
[myuser@srv1~]#mcsadmin getSystemStatusgetsystemstatus Wed Aug3014:27:232017Systemcolumnstore-1Systemand ModulestatusesComponent StatusLastStatusChange------------------ ------------------------- --------------------------------------System ACTIVEFri Jun 10 01:50:46 2016Module pm1ACTIVE Fri Jun 10 01:50:43 2016
管理
Viewingprocessstatus
[myuser@srv1~]#mcsadmin getProcessStatusgetprocessstatus Wed Aug3014:27:232017Systemcolumnstore-1MariaDB Columnstore Process statusesProcess ModuleStatusLastStatusChange ProcessID--------------------- ----------- ----------- ---------------------------------- -------------ProcessMonitor pm1ACTIVEFriJun1001:50:042016 2487ProcessManager pm1 ACTIVEFriJun1001:50:102016 2673…
管理
Viewingnetworkconfiguration
[myuser@srv1~]#mcsadmin getSystemNetworkConfiggetsystemstatus Wed Aug3014:27:232017Systemcolumnstore-1Systemand ModulestatusesComponent StatusLastStatusChange------------------ ------------------------- --------------------------------------System ACTIVEFri Jun 10 01:50:46 2016Module pm1ACTIVE Fri Jun 10 01:50:43 2016
管理
Viewingmoduleconfiguration
[myuser@srv1~]#mcsadmin getModuleConfiggetmoduleconfig Wed Aug3014:27:232017ModuleNameConfiguration
Module'um1'Configuration informationModuleType =umModuleDesc =UserModule#1ModuleIPAdd NICID1=10.100.7.80ModuleHostName NICID1=srvhst2…
管理
Commandrepeatoption
[myuser@srv1~]#mcsadmin getProcessStatus -r2repeatingthecommand'getProcessStatus'every2seconds,enterCTRL-Dtostop…
Dataimport
インポート
• cpimport インポート専⽤コマンド• ⾼速にデータロード可能
• LOADDATAINFILE,INSERTINTOSELECTFROMもサポート• 内部的にはcpimportコマンドで実⾏
cpimport
インポート
cpimport 読み込み対象ファイル
• 区切り⽂字は ”|”がデフォルト• -sオプションで区切り⽂字指定
• テーブルカラムとデータの並び順を⼀致させる• ⼀致しない場合は別途 jobfileを作成する必要がある
• ⽇付フォーマットは”yyyy-mm-dd “にしておく• フォーマット違いは全て 0000-00-0000:00:00 になる
インポート
cpimport
• データロード中でもテーブル参照可能• ロード完了後に追加分の参照ができるようになる
• トランザクションログへの出⼒はされない
インポート
cpimport 実⾏例
[myuser@srv1~]# cpimport sampletable1/tmp/table1.csv–s ‘,’–E ‘”’Localeis:CColumndelimiter:,EnclosedbyCharacter:”
UsingtableOID3278asthedefaultJOBIDInputfile(s)willbereadfrom:/root/tmp…2017-08-3116:16:37(18403)INFO:Fortablesample.table1:10000rowsprocessedand10000rowsinserted.…2017-08-3116:16:37(18403)INFO:Bulkloadcompleted,totalruntime:1.22974seconds
DB TABLE Filepath option
INSERTSELECTLOADDATAINFILE
インポート
INSERTSELECT使⽤時の注意点
• デフォルトの区切り⽂字が ’7 ‘•データに 7が含まれる場合infinidb_import_for_batchinsert_delimiter変数の値を任意のascii_valueに変更する必要がある
インポート
INSERTSELECT,LOADDATAINFILE共通の注意点
•ロードするデータファイルサイズが⼤きい場合バッファサイズ不⾜でロードに失敗する• ERROR1815(HY000)atline1infile:’table1.sql':Internalerror:CAL0006:IDB-2008:Theversionbufferoverflowed.IncreaseVersionBufferFileSize orlimittherowstobeprocessed.
インポート
INSERTSELECT,LOADDATAINFILE共通の注意点
•VersionBufferFileSizeの変更⼿順は2つ• Columnstore.xml を編集• configxml.sh スクリプトでColumnstore.xmlを編集
•Columnstore.xml とは?• ColumnStore 専⽤の設定ファイルを記述したXMLファイル
インポート
VersionBufferFileSize確認/変更
[myuser@srv1~]# cd/usr/local/mariadb/columnstore/etc/[myuser@srv1~]# viColumnstore.xml…<VersionBuffer>
<!-- VersionBufferFileSize mustbeamultipleof8192.OneversionbufferfilewillbeputoneachDBroot.--><VersionBufferFileSize>1GB</VersionBufferFileSize>
</VersionBuffer>…
インポート
VersionBufferFileSize確認/変更
[myuser@srv1~]# cd/usr/local/mariadb/columnstore/bin/
[myuser@srv1~]# configxml.sh getconfig VersionBuffer VersionBufferFileSizeCurrentvalueofVersionBuffer /VersionBufferFileSize is1GB
[myuser@srv1~]# configxml.sh setconfig VersionBuffer VersionBufferFileSize 10GBOldvalueofVersionBuffer /VersionBufferFileSize is1GBVersionBuffer /VersionBufferFileSize nowsetto10GB
section variablecommand
インポート
cpimport vsLOADDATAINFILE
CSV 10,000,000件 約1GB
データサイズの確認
データサイズの確認
• columnstore_info StoredProcedure• total_usage()• table_usage()
ColumnStore InformationSchemaTableshttps://mariadb.com/kb/en/the-mariadb-library/columnstore-information-schema-tables/#columnstore_extents
データサイズの確認
全体の使⽤サイズ
MariaDB [(none)]> callcolumnstore_info.total_usage();+-------------------------+----------------------------+|TOTAL_DATA_SIZE|TOTAL_DISK_USAGE|+-------------------------+----------------------------+|1.49GB |1.58GB |+-------------------------+----------------------------+
データサイズの確認
Table毎の使⽤サイズ
MariaDB [(none)]> callcolumnstore_info.table_usage(NULL,NULL);+-----------------------+---------------------+---------------------------+-------------------------+---------------------+|TABLE_SCHEMA|TABLE_NAME|DATA_DISK_USAGE|DICT_DISK_USAGE|TOTAL_USAGE|+-----------------------+---------------------+---------------------------+-------------------------+---------------------+|loadtest |load_cpimport |638.90MB |140.08MB |778.98MB||loadtest |load_infile |638.89MB |140.08MB |778.97MB |+-----------------------+---------------------+---------------------------+-------------------------+---------------------+
Cross-EngineJoinssetting
クロス・エンジン結合設定
• ColumnStoreテーブルと⾮ColumnStoreテーブルを結合する場合別途設定が必要• Columnstore.xml 定義変更• ColumnStore 再起動
ColumnStoreクロス・エンジン結合の構成https://mariadb.com/kb/ja/configuring-columnstore-cross-engine-joins/
クロス・エンジン結合設定
CrossEngineSupport変更
[myuser@srv1~]# cd/usr/local/mariadb/columnstore/etc/[myuser@srv1~]# viColumnstore.xml…<CrossEngineSupport>
<Host>127.0.0.1</Host><Port>3306</Port><User>mydbuser</User><Password>pwd</Password>
</CrossEngineSupport>…
Executionplan
実⾏計画及び統計情報の取得
• EXPLAINでは有益な情報を得られない•専⽤関数 calSetTrace(),calGetTrace()を使⽤する
実⾏計画及び統計情報の取得
calSetTrace(),calGetTrace()
MariaDB [test]> select calSetTrace(1);MariaDB [test]> select item,name from snmp.raw_201607limit 1000;MariaDB [test]> select calGetTrace();
Desc Mode Table TableOID ReferencedColumns PIOLIOPBEElapsed RowsBPSPM raw_201607 3000 (item,time) 0 2287 34078 0.014 1915TNSUM - - - - - - 0.006 1000
MariaDB [test]> select calSetTrace(0);
実⾏計画及び統計情報の取得
実⾏計画の⾒⽅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
実⾏計画及び統計情報の取得
実⾏計画の⾒⽅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 BatchPrimitiveStep 列ブロック⾛査及びデータ取得CES CrossEngineStep クロスエンジンJoinの実⾏DSS DictionaryStructureStep 特定の可変⻑⽂字列値に対するディクショナリスキャンHJS HashJoinStep Hashjoinの実⾏HVS HavingStep 実⾏結果に対するHavingの実⾏SQS SubQueryStep サブクエリ実⾏TAS TupleAggregationstep PMノードからUMで中間集約結果受信TNS TupleAnnexationStep 結果作成(filter,orderby,limit…)TUS TupleUnionstep サブクエリ結果結合TCS TupleConstantStep 定数処理WFS WindowFunctionStep Window function実⾏
実⾏計画及び統計情報の取得
実⾏計画の⾒⽅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の場合、エクステントマップの恩恵を得られていない
実⾏計画及び統計情報の取得
キャッシュクリア
MariaDB [test]> selectcalFlushCache();MariaDB [test]> select item,name from snmp.raw_201607limit 1000;MariaDB [test]> select calGetTrace();
Desc Mode Table TableOID ReferencedColumns PIO LIOPBEElapsed RowsBPSPM raw_201607 3000 (item,time) 37341 2287 34078 0.014 1915TNSUM - - - - - - 0.006 1000
MariaDB [test]> select calSetTrace(0);
実⾏計画及び統計情報の取得
selectcalGetStats();
MariaDB [test]> selectcount(*)fromwide2;…1rowinset(0.22sec)
MariaDB [test]> selectcalGetStats();QueryStats:MaxMemPct-0;NumTempFiles-0;TempFileSpace-0B;ApproxPhyI/O-1931;CacheI/O-2446;BlocksTouched-2443;PartitionBlocksEliminated-0;MsgBytesIn-73KB;MsgBytesOut-1KB;Mode-Distributed
ExtentMap
エクステントマップ確認
•調査対象のカラムOID取得• editemプロセスからエクステントマップ情報を取得• 引数にカラムID必須
エクステントマップ確認
カラムOID取得
Select`schema`,`tablename`,`columnname`,`objectid`
Fromcalpontsys.syscolumn
Where`schema` =‘対象スキーマ名’and`tablename`=‘対象テーブル名’and`tablename`=‘対象カラム名’
;
エクステントマップ確認
editemプロセスから情報取得
[myuser@srv1~]# /usr/local/mariadb/columnstore/bin/editem -o3019ColOID=3019,NumExtents =1,width=4234496- 238591(4096)min:0,max:3,seqNum:10,state:valid,fbo:0,DBRoot:1,part#:0,seg#:0,HWM:0;status:avail…
エクステントマップ確認
editemプロセスから情報取得
[myuser@srv1~]# /usr/local/mariadb/columnstore/bin/editem -o3298ColOID=3298,NumExtents =2,width=81311744- 1319935(8192)min:notset,max:notset,seqNum:0,state:valid,fbo:0,DBRoot:1,part#:0,seg#:0,HWM:8191;status:avail1418240- 1426431(8192)min:notset,max:notset,seqNum:0,state:invalid,fbo:0,DBRoot:1,part#:0,seg#:1,HWM:1575;status:avail
エクステントマップが機能しない(使えない)パターン
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値に差が無い場合
制限
• primarykeyの指定ができない• Indexの作成ができない•レプリケーション⾮対応•対応カラム型に制限あり
Datatypes ColumnSize Description
BIGINT 8-bytes Alargeinteger.Numericvaluewithscale0.Signed:-9,223,372,036,854,775,806to+9,223,372,036,854,775,807Unsigned:0to+18,446,744,073,709,551,613
CHAR 1,2,4,or8bytes Holdslettersandspecialcharactersoffixedlength.Maxlengthis255.Defaultandminimumsizeis1byte.
DATE 4-bytesDatehasyear,month,andday.Theinternalrepresentationofadateisastringof4bytes.Thefirst2bytesrepresenttheyear,.5bytesthemonth,and.75bytesthedayinthefollowingformat:YYYY-MM-DD.Supportedrangeis1000-01-01to9999-12-31.
DATETIME 8-bytes Adateandtimecombination.Supportedrangeis1000-01-0100:00:00to9999-12-3123:59:59.
DECIMAL/NUMERIC 2,4,or8bytes Apackedfixed-pointnumberthatcanhaveaspecifictotalnumberofdigitsandwithasetnumberofdigitsafteradecimal.Themaximumprecision(totalnumberofdigits)thatcanbespecifiedis18.
DOUBLE/REAL 8bytesStoredin64-bitIEEE-754floatingpointformat.Assuch,thenumberofsignificantdigitsisabout15andtherangeofvaluesisapproximately+/-1e308.TheMySQLextensiontospecifyprecisionandscaleisnotsupported.“REAL”isasynonymfor“DOUBLE”.
FLOAT 4bytes Storedin32-bitIEEE-754floatingpointformat.Assuch,thenumberofsignificantdigitsisabout6andtherangeofvaluesisapproximately+/- 1e38.TheMySQLextensiontospecifyprecisionandscaleisnotsupported.
INTEGER/INT 4-bytes Anormal-sizeinteger.Numericvaluewithscale0.Signed:-2,147,483,646to2,147,483,647.Unsigned:0to4,294,967,293
SMALLINT 2-bytes Asmallinteger.Signed:-32,766to32,767.Unsigned:0to65,533.
TINYINT 1-byte Averysmallinteger.Numericvaluewithscale0.Signed:-126to+127.Unsigned:0to253.
VARCHAR 1,2,4,or8bytesor8-bytetoken
Holdsletters,numbers,andspecialcharactersofvariablelength.Maxlength=8000bytesorcharactersandminimumlength=1byteorcharacter.
まとめ
ColumnStoreとは?
チューニングレスで⾼い検索パフォーマンスを実現するDWH特化型データベース
ColumnStoreとは?
•コア数,ノード数を増やすことでリニアにスケールアウト•エクステントマップによるI/Oコスト削減
ColumnStoreとは?
要件をきちんと把握した上であれば
使えます!
ColumnStore始めませんか?
ColumnStore 1.1
ColumnStore 1.1
• 1.1ではいくつかのエキサイティングな新機能が追加• ColumnStoreエンジンとMariaDBサーバーはGPLライセンス• ⼀部の新しいコンポーネントはLGPLとBSLのライセンス
ColumnStore1.1
Features
Data engine MariaDB 10.2base
Streaming/API バルクインポートAPI
HighAvailability GlusterFSサポート(HA)Analytics ユーザー定義集計関数,WindowFunctions
DataTypes TEXT型,Blob型のサポートEaseofUse バックアップ&リストアツールの提供Performance クエリ&メモリ処理改善Security MariaDB Audit pluginと統合Certifications
ColumnStore1.1
DataStreaming:ColumnStore DataAPI
•ストリーミングバルクインサート•直接PMノードへ書き込み要求を⾏う• ⼀括インポートのために巨⼤なCSVファイルを作成する必要が
ない• C++• LGPLlicensed
ColumnStore BulkWriteSDKhttps://mariadb.com/kb/en/library/columnstore-bulk-write-sdk/
Thankyouso,somuch!