MySQLの最適化設定
データ移行先としてMySQLを使用する場合、以下の設定により大幅なパフォーマンス向上が見込めます。ここでは一時的なデータ移行用途としてMySQLを設定します。
MySQLのインストールと設定
- Oracle公式サイトから64bit版MySQLをダウンロード
- 任意のディレクトリに解凍(例:D:\mysql-5.7.26-winx64)
- my.iniファイルを作成し以下の設定を記述
[mysqld]
port=3306
basedir=D:\mysql-5.7.26-winx64\
datadir=D:\mysql-5.7.26-winx64\data
net_buffer_length=5242880
max_allowed_packet=104857600
bulk_insert_buffer_size=104857600
max_connections = 1000
innodb_flush_log_at_trx_commit = 2
# このシナリオではMyISAMがInnoDBより約2倍高速
default-storage-engine=MyISAM
general_log = 1
general_log_file=D:\mysql-5.7.26-winx64\logs\mysql.log
innodb_buffer_pool_size = 36G
innodb_log_files_in_group=2
innodb_log_file_size = 500M
innodb_log_buffer_size = 50M
sync_binlog=1
innodb_lock_wait_timeout = 50
innodb_thread_concurrency = 16
key_buffer_size=82M
read_buffer_size=64K
read_rnd_buffer_size=256K
sort_buffer_size=256K
myisam_max_sort_file_size=100G
myisam_sort_buffer_size=100M
transaction_isolation=READ-COMMITTED
Kettleの最適化
起動パラメータの調整
大容量メモリ環境でのOOM(Out of Memory)を防ぐため、環境変数PENTAHO_DI_JAVA_OPTIONSを設定します:
PENTAHO_DI_JAVA_OPTIONS = -Xms20480m -Xmx30720m -XX:MaxPermSize=1024m
テーブル入出力のマルチスレッド化
テーブル入力でマルチスレッドを有効にすると、データが重複して取得される可能性があります。Oracleソースの場合、以下のクエリを使用してデータを分割します:
SELECT * FROM (
SELECT source_data.*, rownum as row_num
FROM source_data
)
WHERE mod(row_num, ${Internal.Step.Unique.Count}) = ${Internal.Step.Unique.Number}
このクエリの説明:
rownumはOracleがクエリ結果に割り当てる連番ですmod関数は割り算の余りを計算しますInternal.Step.Unique.CountとInternal.Step.Unique.NumberはKettleの組み込み変数で、それぞれ総スレッド数と現在のスレッド番号を表します
テーブル出力コンポーネントでは、以下の設定を調整します:
- 「変更開始コピー数」を適切な値に設定
- コミットサイズを調整(デフォルトは100)
- 「テーブルの切り捨て」オプションを無効化(マルチスレッド環境での競合を避けるため)
- データベースフィールドを明示的に指定
- バッチ挿入を有効化
JDBCパラメータの最適化
接続文字列に以下のパラメータを追加します:
- characterEncoding GBK
- rewriteBatchedStatements true
- useServerPrepStmts false
- useCompression true
パフォーマンス測定とチューニング
異なるスレッド数とコミットサイズの組み合わせをテストし、最適な設定を見つけます。監視ツールを使用して、Oracleからの読み取り速度とMySQLへの書き込み速度をリアルタイムで確認します。
さらなる改善の可能性
- SSDストレージへの移行
- MySQLパラメータのさらなる最適化
- TokuDBなど、別のストレージエンジンの検討
- StreamSetsやDataXなど、別のETLツールの評価
- ClickHouse、TiDB、Cassandraなど、別のデータベースへの移行
- Kettleクラスターの構成による分散処理