本記事では、高性能を目指してOceanBaseデータベースのインストールとデプロイ、業務テナントの作成、およびSysbenchの使用方法について説明します。これは、OceanBaseデータベースのユーザーがSysbenchテストでより良いパフォーマンスを得られるよう支援することを目的としています。
OceanBaseデータベースのデプロイパラメータ設定
OceanBaseデータベースのインストールおよびデプロイプロセスにおいて、パフォーマンスに関連するパラメータ設定と設定ファイルの内容を概説します。
インストールおよびデプロイプロセス
オープンソース版のインストールおよびデプロイプロセス
OBDを使用したデプロイ:コマンドラインを使用したOceanBaseデータベースの本番環境へのデプロイ
Enterprise Editionのインストールおよびデプロイプロセス
- Enterprise Editionのデプロイ:デプロイプロセス
インストールおよびデプロイメントパラメータの説明
クイックインストールプロセスに加えて、一般的には.yamlファイルを手動で修正して設定する必要があります。OceanBaseデータベースでは多くのパラメータを設定できますが、本記事では主にパフォーマンス関連のパラメータに焦点を当てます。詳細については、前述のデプロイメントドキュメントを参照してください。
- パラメータの確認:
show parameters where name = 'xxx'; - Serverの重要なパラメータの確認:
SELECT * FROM GV$OB_SERVERS;
具体的には、以下のパラメータが含まれます:
memory_limit
- パラメータの説明:OBServerノードのメモリ上限。
memory_limit_percentageパラメータよりも優先されます。 - デフォルト値:0
- 推奨設定:システム全体メモリの80%~90%
- 動的変更:
alter system set memory_limit='32G'; - クエリ:
show parameters where name = 'memory_limit'; - 関連ドキュメント:memory_limit
- パラメータの説明:OBServerノードのメモリ上限。
memory_limit_percentage
- パラメータの説明:OBServerノードのメモリがシステムメモリに占める割合。この構成パラメータは、
memory_limitが0の場合にのみ有効になります。 - デフォルト値:80
- 推奨設定:80~90
- 動的変更:
alter system set memory_limit_percentage=80; - クエリ:
show parameters where name = 'memory_limit_percentage'; - 関連ドキュメント:memory_limit_percentage
- パラメータの説明:OBServerノードのメモリがシステムメモリに占める割合。この構成パラメータは、
system_memory
- パラメータの説明:システムテナントが使用するメモリ。
memory_limitに含まれており、設定されていない場合は自動的に設定されます。 - デフォルト値:Enterprise Edition:30G Community Edition:0M
- 推奨設定:
memory_limitの10% - 動的変更:
alter system set system_memory='2G'; - クエリ:
show parameters where name = 'system_memory'; - 関連ドキュメント:system_memory
- パラメータの説明:システムテナントが使用するメモリ。
cpu_count
- パラメータの説明:OBServerノードで利用可能なCPUの総数。
- デフォルト値:0。システムが自動的にCPU数を検出することを意味します。
- 推奨設定:システムのCPU総数。
lscpuで確認できます。 - 動的変更:
alter system set cpu_count=24; - クエリ:
show parameters where name = 'cpu_count'; - 関連ドキュメント:cpu_count
net_thread_count
- パラメータの説明:ネットワークスレッド数。
- デフォルト値:0(ネットワークI/Oスレッド数はmax(6, CPU_NUM/8))
- 推奨設定:CPU総数の1/8。トランザクションの実行時間が短く、比較的ネットワークオーバーヘッドが大きい場合は、CPU総数の20%に設定できます。
- この構成パラメータは、OBServerノードのデプロイ時にのみ静的に設定でき、動的に変更することはできません。
- クエリ:
show parameters where name = 'net_thread_count'; - 関連ドキュメント:net_thread_count
sql_net_thread_count
- パラメータの説明:MySQLモードでのクラスタIOスレッド数。
- デフォルト値:0。これは、構成パラメータ
net_thread_countの値と同じであることを意味します。 - 関連ドキュメント:sql_net_thread_count
datafile_size
- パラメータの説明:データファイルの総サイズ。
datafile_disk_percentage構成パラメータよりも優先されます。 - デフォルト値:0
- 推奨設定:ログとディスクを共有する場合はディスク容量の60%、専用ディスクの場合はディスク容量の90%に設定します。
- 動的変更:
alter system set datafile_size='80G'; - クエリ:
show parameters where name = 'datafile_size'; - 関連ドキュメント:datafile_size
- パラメータの説明:データファイルの総サイズ。
datafile_disk_percentage
- パラメータの説明:データファイルが占有するディスクの総容量に占める割合。
- デフォルト値:0
- 推奨設定:ログとディスクを共有する場合は60%、専用ディスクの場合は90%に設定します。
- 動的変更:
alter system set datafile_disk_percentage=60; - クエリ:
show parameters where name = 'datafile_disk_percentage'; - 関連ドキュメント:datafile_disk_percentage
log_disk_size
- パラメータの説明:Redoログファイルの総サイズ。
log_disk_percentage構成パラメータよりも優先されます。 - デフォルト値:0
- 推奨設定:データとディスクを共有する場合は30、専用ディスクの場合は90に設定します。
- 動的変更:
alter system set log_disk_size='40G'; - クエリ:
show parameters where name = 'log_disk_size';
関連ドキュメント:log_disk_size
- パラメータの説明:Redoログファイルの総サイズ。
log_disk_percentage
パラメータの説明:Redoログファイルが占有するディスクの総容量に占める割合。
デフォルト値:0
推奨設定:データとディスクを共有する場合はディスク容量の30%、専用ディスクの場合はディスク容量の90%に設定します。
動的変更:
alter system set log_disk_percentage=30;クエリ:
show parameters where name = 'log_disk_percentage';関連ドキュメント:log_disk_percentage
設定ファイル
32コア128GBのマシン構成を例に、ディスク容量に余裕がある場合、「3台のOBServerノード + 1台のOBProxy」のデプロイ方式で説明します。obagentなど他のコンポーネントは今回の説明から除外します。より良いパフォーマンスを得るために、各OBServerノードとOBProxyは異なるマシンにデプロイし、マシンのハードウェアリソースを可能な限り十分に活用します。OceanBaseデータベースおよびそのOBProxyコンポーネントのデプロイ設定ファイルは以下のとおりです:
oceanbase:
servers:
* name: server1
ip: xxx.xxx.1.1
* name: server2
ip: xxx.xxx.1.2
* name: server3
ip: xxx.xxx.1.3
server1:
mysql_port: 2881
rpc_port: 2882
home_path: /data/1/user_name/observer1
zone: zone1
server2:
mysql_port: 2881
rpc_port: 2882
home_path: /data/1/user_name/observer2
zone: zone2
server3:
mysql_port: 2881
rpc_port: 2882
home_path: /data/1/user_name/observer3
zone: zone3
include: obd/observer.include.yaml
global:
devname: eth0
memory_limit: '100G'
system_memory: '2G'
datafile_size: '80G'
cpu_count: '32'
net_thread_count: 6
obproxy:
servers:
* xxx.xxx.1.5
depends:
* oceanbase
include: obd/obproxy.include.yaml
global:
listen_port: 2891
prometheus_listen_port: 2892
home_path: /data/1/user_name/obproxy
ビジネステナントのパラメータ設定
OBDによる自動デプロイを使用する場合、デプロイ後にはsysテナントのみが存在します。パフォーマンステスト専用のテナントを作成し、OBServerノードの利用可能なリソースを最大限に活用する必要があります。
テナントの作成
OceanBaseデータベースはユーザーテナントの作成のみをサポートしており、システムテナントはクラスタ作成時に自動的に作成されます。ユーザーテナントの作成は一連の操作であり、まずリソース仕様を作成し、次にそのリソース仕様に基づいてリソースプールを作成し、最後にテナントを作成してそのリソースプールを指定します。したがって、テナントの作成順序はリソース仕様 -> リソースプール -> テナントとなります。
テナントの作成手順の詳細については、テナントの作成を参照してください。
ここでは、32c128gのマシンを例に、テナントの作成コマンドは以下のとおりです:
sh create_perf_tenant.sh ip port
mysql -c -h $1 -P $2 -uroot -e "drop resource unit unit_1;"
mysql -c -h $1 -P $2 -uroot -e "create resource unit unit_1 max_cpu 24, min_cpu 16, memory_size 64000000000, log_disk_size 40000000000, max_iops 10000000;"
mysql -c -h $1 -P $2 -uroot -e "create resource pool pool_2 unit = 'unit_1', unit_num = 1, zone_list = ('zone1','zone2','zone3');"
mysql -c -h $1 -P $2 -uroot -e "create tenant perf replica_num = 3,primary_zone='zone1', resource_pool_list=('pool_2') set ob_tcp_invited_nodes='%';"
mysql -c -h $1 -P $2 -uroot@perf -e "set global ob_query_timeout = 50000000000;"
mysql -c -h $1 -P $2 -uroot@perf -e "set global ob_trx_timeout = 50000000000;"
mysql -c -h $1 -P $2 -uroot@perf -e "set global ob_plan_cache_percentage = 20;"
mysql -c -h $1 -P $2 -uroot@perf -e "set global binlog_row_image='MINIMAL';"
mysql -c -h $1 -P $2 -uroot -e "alter system set enable_early_lock_release=true tenant = perf;"
mysql -c -h $1 -P $2 -uroot -e "alter system set cpu_quota_concurrency=2 tenant = perf;"
テナント作成コマンドでテナントタイプが指定されていない場合、デフォルトはMySQLテナントであり、Oracleモードを指定した場合にのみOracleテナントとなります。
sys テナント内でコマンドを実行します:
SELECT * FROM DBA_OB_TENANTS;
ここで、COMPATIBILITY_MODE フィールドはテナントのモードを示しています。
テナントの重要な構成パラメータ
パフォーマンスに関連するテナント構成パラメータは以下のとおりです:
min_cpu
- パラメータの説明:テナントで利用可能な最小CPU数(
すべてのテナントのmin_cpuの合計<=cpu_count)。 - 推奨値:
cpu_count/2 - 関連ドキュメント:
min_cpuパラメータの詳細については、テナントの作成のリソースユニットの作成のパラメータの説明を参照してください。
- パラメータの説明:テナントで利用可能な最小CPU数(
max_cpu
- パラメータの説明:テナントで利用可能な最大CPU数(
すべてのテナントのmax_cpuの合計<=cpu_count * resource_hard_limit/ 100)。 - 推奨値:
cpu_count/2 ~cpu_count(またはmin_cpuと同じ値に設定してもよい) - 関連ドキュメント:
min_cpuパラメータの詳細については、テナントの作成のリソースユニットの作成のパラメータの説明を参照してください。
- パラメータの説明:テナントで利用可能な最大CPU数(
cpu_quota_concurrency
- パラメータの説明:テナントの各CPUで並行実行できるスレッド数(
max_cpu * cpu_quota_concurrency= 最大ビジネススレッド数)。 - 推奨値:4(デフォルト値を変更しないことを一般的に推奨しますが、CPU集約型のストレステストでは2に変更できます。)
- 関連ドキュメント:cpu_quota_concurrency
- パラメータの説明:テナントの各CPUで並行実行できるスレッド数(
memory_size
- パラメータの説明:リソースユニットが提供できるメモリサイズ。
- 推奨値:総メモリの50%~80%(複数のリソースユニットを作成する場合は、柔軟に割り当てる必要があります)。
log_disk_size
- パラメータの説明:ログディスクのサイズ。
- 推奨値:正常に使用できればよく、例えば40~80GBに設定します。データ量が非常に多い場合は、より大きな値に設定できます。
primary_zone
パラメータの説明:リーダーレプリカがゾーン内に割り当てられる優先順位。カンマの両側の優先順位は同じで、セミコロンの左側の優先順位は右側よりも高い。例えば
zone1,zone2,zone3。推奨値:
- 3台のマシンの仕様が同一で、ネットワーク遅延が近い場合、Leaderを均等に分散させることで、パフォーマンスRANDOMを向上させることができます。
- そのうちの1台のパフォーマンスがより優れている場合、または統計やデータの観察を容易にするために、そのゾーンを指定することもできます。例えば
zone1。
システムテナントのグローバル設定
システムテナントに接続して、ログレベルの変更やパフォーマンスに影響を与える機能(例:sql_audit)の無効化など、クラスタレベルの設定を変更します。一般的な設定コマンドは以下のとおりです:
ALTER SYSTEM SET enable_sql_audit=false;
select sleep(5);
ALTER SYSTEM SET enable_perf_event=false;
ALTER SYSTEM SET syslog_level='ERROR';
alter SYSTEM SET enable_record_trace_log=false;
Sysbenchパラメータの設定
MySQLテナントを例に、Sysbenchのテストプロセスの準備と主要なパラメータの設定を行います。
Sysbenchテストプロセス
データの準備
cleanup: sysbench oltp_read_write.lua --mysql-host=x.x.x.x --mysql-port=xxxx --mysql-db=test --mysql-user=test@xxx --mysql-password=xxx --table_size=1000000 --tables=30 --rand-type=uniform --threads=1000 --report-interval=1 --time=600 cleanup prepare: sysbench oltp_read_write.lua --mysql-host=x.x.x.x --mysql-port=xxxx --mysql-db=test --mysql-user=test@xxx --mysql-password=test --table_size=1000000 --tables=30 --rand-type=uniform --threads=1000 --report-interval=1 --time=600 prepareテストの実行
sysbench oltp_read_write.lua --mysql-host=x.x.x.x --mysql-port=xxxx --mysql-db=test --mysql-user=test@xxx --mysql-password=xxx --table_size=1000000 --tables=30 --rand-type=uniform --threads=1000 --report-interval=1 --time=600 --db-ps-mode=disable run
パフォーマンスに関する重要なパラメータの設定
Sysbenchのパフォーマンスに関連する重要なパラメータの推奨設定は以下のとおりです:
table_size
- パラメータの説明:各テーブルの初期化されるデータ行数。デフォルトは10000です。
- 推奨値:100000、1000000
tables
- パラメータの説明:初期化されるテーブルの数
- 推奨値:30~100
threads
- パラメータの説明:テストスレッドの数
- 推奨値:500~2000(テストマシンのCPUが多いほど、スレッド数を増やすことができます)
rand-type
パラメータの説明:ランダム型のモードを示します。合計4種類のモードがあります:
uniform、gaussian、special、pareto。デフォルト値はspecialです。special:キーの比較が集中している分布モードで、ロック競合が発生しやすい。uniform:離散一様分布で、範囲内のすべての値の出現確率が均等で、ホットスポットがありません。gaussian:ガウス分布、つまり正規分布で、データは中央値付近に集中します。pareto:パレート分布で、データは最小値付近に集中し、値が大きいほど出現確率が小さくなります。
推奨値:
uniformmysql-ignore-errors
- パラメータの説明:テスト中に無視するエラーコード。Sysbenchはエラーを受信すると、現在のリクエストがすべて返されるまで新しいリクエストの送信を停止し、その後テストを終了します。したがって、予想される問題であれば、関連するエラーコードを無視することができます。
- 値:
--mysql-ignore-errors=1062,1213,6002。ここで、1062は主キー、一意インデックスの競合を示し、1213はデッドロックを示し、6002はトランザクションのロールバックを示します。
db-ps-mode
- パラメータの説明:SQLがプリコンパイルする必要があるかどうか。モードには
auto/disableがあり、デフォルトはdisableです。 - 推奨値:
disable(disableに設定することを推奨します) autoに設定した場合、テナント構成を変更する必要があります:alter system set open_cursors=65535;
- パラメータの説明:SQLがプリコンパイルする必要があるかどうか。モードには
skip_trx
- パラメータの説明:トランザクションをスキップするかどうか。読み取り専用テストでは、トランザクションをスキップするかどうかを選択できます。デフォルトはOFFで、トランザクションが有効です。
- 推奨値:読み取り専用テストではONに設定できますが、他の場合はデフォルトのままです。
auto-inc
- パラメータの説明:ID列が自動インクリメントされるかどうか。デフォルトはONです。
- 推奨値:OFF(書き込みシナリオでは、無効にすることを推奨します)
warmup-time
- パラメータの説明:ウォームアップ時間(単位:s)。テスト開始から何秒後に本格的な統計を開始するかを示します。デフォルトは0です。
- 推奨値:10~30(データ量が多い場合は、時間を若干長くすることができます)
Sysbenchの詳細なパラメータ設定については、Sysbenchパラメータの詳細を参照してください。