TiDBクラスタ管理に関する FAQ
このドキュメントでは、TiDB クラスタ管理に関連する FAQ をまとめています。
日常管理
このセクションでは、日常的なクラスター管理中に発生する可能性のある一般的な問題、その原因、および解決策について説明します。
TiDBにログインするにはどうすればいいですか?
MySQL にログインするのと同じように、TiDB にログインできます。例:
mysql -h 127.0.0.1 -uroot -P4000
TiDB のシステム変数を変更するにはどうすればよいですか?
MySQL と同様に、TiDB には静的パラメータとソリッドパラメータが含まれています。 SET GLOBAL xxx = n
使用して静的パラメータを直接変更できますが、この場合、パラメータの新しい値はライフサイクル内でのみ有効です。
TiDB (TiKV) のデータ ディレクトリはどこにあり、何ですか?
TiKV データは--data-dir
にあり、その中にはそれぞれバックアップ、データ、 Raftデータ、ミラー データを保存するために使用される、backup、db、raft、snap の 4 つのディレクトリが含まれています。
TiDB のシステム テーブルとは何ですか?
MySQL と同様に、TiDB にもシステム テーブルが含まれており、サーバーの実行時に必要な情報を保存するために使用されますTiDB システム テーブル参照してください。
TiDB/PD/TiKV ログはどこにありますか?
TiDB/PD/TiKV は、デフォルトではログに標準エラーを出力します。起動時にログファイルを--log-file
で指定すると、指定されたファイルにログが出力され、毎日ローテーションが実行されます。
TiDB を安全に停止するにはどうすればよいですか?
ロード バランサが実行中の場合 (推奨): ロード バランサを停止し、SQL ステートメント
SHUTDOWN
を実行します。その後、TiDB はgraceful-wait-before-shutdown
で指定された期間、すべてのセッションが終了するまで待機します。その後、TiDB は実行を停止します。ロード バランサが実行されていない場合:
SHUTDOWN
ステートメントを実行します。その後、TiDB コンポーネントは正常に停止されます。
TiDB でkill
を実行できますか?
DML ステートメントを強制終了します。
まず
information_schema.cluster_processlist
使用して TiDB インスタンス アドレスとセッション ID を見つけ、次に kill コマンドを実行します。TiDB v6.1.0 では、Global Kill 機能が導入されています (
enable-global-kill
構成によって制御され、デフォルトで有効になっています)。Global Kill が有効になっている場合は、kill session_id
実行するだけです。TiDB バージョンが v6.1.0 より前の場合、または Global Kill 機能が有効になっていない場合、
kill session_id
デフォルトでは有効になりません。DML ステートメントを終了するには、DML ステートメントを実行している TiDB インスタンスにクライアントを直接接続してから、kill tidb session_id
ステートメントを実行する必要があります。クライアントが別の TiDB インスタンスに接続している場合、またはクライアントと TiDB クラスターの間にプロキシがある場合、kill tidb session_id
ステートメントが別の TiDB インスタンスにルーティングされ、別のセッションが誤って終了する可能性があります。詳細については、KILL
参照してください。DDL ステートメントを強制終了します。まず
admin show ddl jobs
使用して、終了する必要がある DDL ジョブの ID を見つけ、次にadmin cancel ddl jobs 'job_id' [, 'job_id'] ...
実行します。詳細については、ADMIN
ステートメント参照してください。
TiDB はセッション タイムアウトをサポートしていますか?
TiDB は現在、 wait_timeout
、 interactive_timeout
、 tidb_idle_transaction_timeout
のタイムアウトをサポートしています。
TiDB バージョン管理戦略とは何ですか?
TiDBのバージョン管理の詳細については、 TiDB のバージョン管理参照してください。
TiDB クラスターの導入と保守にかかる運用コストはどのくらいでしょうか?
TiDB は、低コストで簡単にクラスターを管理できるいくつかの機能とツール提供します。
- メンテナンス操作の場合、 TiUPパッケージ マネージャーとして機能し、展開、スケーリング、アップグレード、およびその他のメンテナンス タスクを簡素化します。
- 監視の場合、 TiDB 監視フレームワークはプロメテウス使用して監視およびパフォーマンス メトリックを保存し、 グラファナ使用してこれらのメトリックを視覚化します。数百のメトリックを備えた数十の組み込みパネルが利用可能です。
- トラブルシューティングのために、 TiDB トラブルシューティング マップでは TiDBサーバーとその他のコンポーネントの一般的な問題をまとめています。関連する問題が発生した場合、このマップを使用して問題を診断し、解決することができます。
さまざまな TiDB マスター バージョンの違いは何ですか?
TiDB コミュニティは非常に活発です。エンジニアは機能の最適化とバグの修正を続けています。そのため、TiDB バージョンは非常に速く更新されます。最新バージョンの情報を常に把握したい場合は、 TiDB リリース タイムライン参照してください。
TiDB TiUPを使用するまたはTiDB Operatorの使用導入することをお勧めします。TiDB ではバージョン番号が一元管理されています。次のいずれかの方法でバージョン番号を確認できます。
select tidb_version()
tidb-server -V
TiDB 用のグラフィカル デプロイメント ツールはありますか?
現在はいいえ。
TiDB クラスターをスケールアウトするにはどうすればよいですか?
オンライン サービスを中断することなく、TiDB クラスターをスケールアウトできます。
- クラスターがTiUP使用してデプロイされている場合は、 TiUPを使用して TiDBクラスタを拡張するを参照してください。
- クラスターが Kubernetes 上でTiDB Operator使用してデプロイされている場合は、 Kubernetes で TiDB を手動でスケールするを参照してください。
TiDB を水平方向にスケーリングするにはどうすればよいですか?
ビジネスが成長するにつれて、データベースは次の 3 つのボトルネックに直面する可能性があります。
storageリソースが不足しているため、ディスク領域が十分ではありません。
CPU 占有率が高いなどのコンピューティング リソースの不足。
書き込みおよび読み取り容量が不十分です。
ビジネスの成長に合わせて TiDB を拡張できます。
ディスク容量が足りない場合は、TiKV ノードを追加するだけで容量を増やすことができます。新しいノードが起動すると、PD は他のノードから新しいノードにデータを自動的に移行します。
コンピューティング リソースが十分でない場合は、TiDB ノードまたは TiKV ノードを追加する前に、まず CPU の消費状況を確認してください。TiDB ノードを追加する場合は、ロード バランサーで設定できます。
容量が足りない場合は、TiDB ノードと TiKV ノードの両方を追加できます。
Percolator が分散ロックを使用し、クラッシュ クライアントがロックを保持する場合、ロックは解放されませんか?
詳細は中国語版パーコレータと TiDBトランザクションアルゴリズムご覧ください。
TiDB が Thrift ではなく gRPC を使用するのはなぜですか? Google が使用しているからでしょうか?
そうではありません。フロー制御、暗号化、ストリーミングなど、gRPC の優れた機能が必要です。
like(bindo.customers.name, jason%, 92)
の 92 は何を示していますか?
92 はエスケープ文字を示し、デフォルトでは ASCII 92 です。
information_schema.tables.data_length
で表示されるデータ長が TiKV 監視パネルのストア サイズと異なるのはなぜですか?
理由は2つあります。
- 2 つの結果は異なる方法で計算されます
information_schema.tables.data_length
各行の平均長さを計算して推定した値ですが、TiKV 監視パネルのストア サイズは、単一の TiKV インスタンス内のデータ ファイル (RocksDB の SST ファイル) の長さを合計したものです。 information_schema.tables.data_length
は論理値ですが、ストア サイズは物理値です。トランザクションの複数のバージョンによって生成された冗長データは論理値には含まれませんが、冗長データは物理値で TiKV によって圧縮されます。
トランザクションが非同期コミットまたは 1 フェーズ コミット機能を使用しないのはなぜですか?
TiDB は、トランザクションに書き込まれるキーと値のペアが 256 個以下で、キーの合計サイズが 4 KB 以下の場合にのみ、非同期コミットまたは 1 フェーズ コミット機能を使用します。それ以外の場合、システム変数を使用して非同期コミット機能と1フェーズコミット機能を有効にしても、TiDB はこれらの機能を使用しません。これは、書き込むデータ量が多いトランザクションの場合、非同期コミットを使用してもパフォーマンスが大幅に向上しないためです。
PD管理
このセクションでは、PD 管理中に発生する可能性のある一般的な問題、その原因、および解決策について説明します。
PDにアクセスすると、 TiKV cluster is not bootstrapped
メッセージが表示されます
PD の API のほとんどは、TiKV クラスターが初期化されている場合にのみ使用できます。新しいクラスターがデプロイされたときに TiKV が起動されていない状態で PD が起動されているときに PD にアクセスすると、このメッセージが表示されます。このメッセージが表示された場合は、TiKV クラスターを起動してください。TiKV が初期化されると、PD にアクセスできるようになります。
PD を起動すると、 etcd cluster ID mismatch
メッセージが表示されます。
これは、PD 起動パラメータの--initial-cluster
に、このクラスターに属していないメンバーが含まれているためです。この問題を解決するには、各メンバーの対応するクラスターを確認し、間違ったメンバーを削除してから、PD を再起動します。
PD の保存時の暗号化を有効にすると[PD:encryption:ErrEncryptionNewMasterKey]fail to get encryption key from file /root/path/file%!(EXTRA string=open /root/path/file: permission denied)
メッセージが表示されます。
保存時の暗号化では、キー ファイルをroot
ディレクトリまたはそのサブディレクトリに保存することはできません。読み取り権限を付与しても、同じエラーが発生します。この問題を解決するには、キー ファイルをroot
ディレクトリ以外の場所に保存します。
PD の時間同期エラーの最大許容範囲はどれくらいですか?
PD はあらゆる同期エラーを許容できますが、エラー値が大きいほど、PD によって割り当てられたタイムスタンプと物理時間の間のギャップが大きくなり、履歴バージョンの読み取りなどの関数に影響します。
クライアント接続はどのようにして PD を見つけるのでしょうか?
クライアント接続は TiDB を介してのみクラスターにアクセスできます。TiDB は PD と TiKV を接続します。PD と TiKV はクライアントに対して透過的です。TiDB がいずれかの PD に接続すると、PD は現在のリーダーが誰であるかを TiDB に伝えます。この PD がリーダーでない場合、TiDB はリーダー PD に再接続します。
TiKV ストアの各ステータス (Up、Disconnect、Offline、Down、Tombstone) の関係は何ですか?
各ステータスの関係についてはTiKVストアの各ステータスの関係を参照してください。
PD Controlを使用して、TiKV ストアのステータス情報を確認できます。
PD のleader-schedule-limit
とregion-schedule-limit
スケジューリング パラメータの違いは何ですか?
leader-schedule-limit
スケジューリング パラメータは、異なる TiKV サーバーのLeader数のバランスをとるために使用され、クエリ処理の負荷に影響します。region-schedule-limit
スケジューリング パラメータは、異なる TiKV サーバーのレプリカ数のバランスをとるために使用され、異なるノードのデータ量に影響します。
各リージョンのレプリカの数は設定可能ですか? 設定可能な場合、どのように設定しますか?
はい。現在、レプリカのグローバル数のみを更新できます。初めて起動すると、PD は構成ファイル (conf/pd.yml) を読み取り、その中の max-replicas 構成を使用します。後で数を更新する場合は、pd-ctl 構成コマンドconfig set max-replicas $num
を使用し、 config show all
使用して有効な構成を表示します。更新はアプリケーションに影響せず、バックグラウンドで構成されます。
TiKV インスタンスの合計数が、設定したレプリカの数以上であることを確認してください。たとえば、レプリカが 3 つある場合は、少なくとも 3 つの TiKV インスタンスが必要です。レプリカの数を増やす前に、追加のstorage要件を見積もる必要があります。pd-ctl の詳細については、 PD Controlユーザー ガイド参照してください。
コマンドラインのクラスター管理ツールがない場合に、クラスター全体のヘルス ステータスを確認するにはどうすればよいでしょうか?
pd-ctl ツールを使用して、クラスターの一般的なステータスを確認できます。詳細なクラスター ステータスを確認するには、モニターを使用して確認する必要があります。
オフラインのクラスター ノードの監視データを削除するにはどうすればよいですか?
オフライン ノードは通常、TiKV ノードを示します。オフライン プロセスが終了したかどうかは、pd-ctl またはモニターによって判断できます。ノードがオフラインになったら、次の手順を実行します。
- オフライン ノード上の関連サービスを手動で停止します。
- Prometheus 構成ファイルから対応するノードの
node_exporter
データを削除します。
TiDBサーバー管理
このセクションでは、TiDBサーバーの管理中に発生する可能性のある一般的な問題、その原因、および解決策について説明します。
TiDB でlease
パラメータを設定するにはどうすればよいでしょうか?
リースパラメータ( --lease=60
)は、TiDBサーバーの起動時にコマンドラインから設定されます。リースパラメータの値は、現在のセッションのデータベーススキーマ変更(DDL)速度に影響します。テスト環境では、値を 1 秒に設定してテストサイクルを高速化できます。ただし、本番環境では、DDL の安全性を確保するために、値を分(たとえば 60)に設定することをお勧めします。
DDL 操作の処理時間はどれくらいですか?
処理時間はシナリオによって異なります。一般的には、次の 3 つのシナリオが考えられます。
- 対応するデータテーブル内の行数が比較的少ない
Add Index
目の操作: 約3秒 - 対応するデータ テーブル内の行数が比較的多い
Add Index
操作: 処理時間は、特定の行数とその時点の QPS によって異なります (Add Index
操作は通常の SQL 操作よりも優先度が低くなります) - その他のDDL操作: 約1秒
DDL 要求を受信する TiDBサーバーインスタンスが、DDL 所有者が存在する TiDBサーバーインスタンスと同じである場合、上記の最初のシナリオと 3 番目のシナリオにかかるコストは、数十から数百ミリ秒に過ぎない可能性があります。
DDL ステートメントの実行が非常に遅くなるのはなぜですか?
考えられる理由:
- 複数の DDL ステートメントを同時に実行すると、最後のいくつかの DDL ステートメントの実行速度が遅くなる可能性があります。これは、DDL ステートメントが TiDB クラスター内で順番に実行されるためです。
- クラスターを正常に起動した後、最初の DDL 操作の実行には、通常 30 秒程度かかることがあります。これは、TiDB クラスターが DDL ステートメントを処理するリーダーを選出しているためです。
- 以下の条件に該当する場合、TiDB 起動後の最初の 10 分間の DDL ステートメントの処理時間は通常の場合よりも大幅に長くなります。1) TiDB を停止しているとき (停電の場合を含む)、TiDB は通常どおり PD と通信できません。2) TiDB は
kill -9
コマンドによって停止されるため、PD から登録データを時間内にクリーンアップできません。この期間中に DDL ステートメントを実行すると、各 DDL の状態変更のために、2 * リース (リース = 45 秒) 待機する必要があります。 - クラスター内の TiDBサーバーと PDサーバーの間で通信の問題が発生した場合、TiDBサーバーはPDサーバーからバージョン情報を時間内に取得または更新できません。この場合、各 DDL の状態処理に 2 * リースを待つ必要があります。
TiDB のバックエンドstorageエンジンとして S3 を使用できますか?
いいえ。現在、TiDB は分散storageエンジンと Goleveldb/RocksDB/BoltDB エンジンのみをサポートしています。
Information_schema
より実際の情報をサポートできますか?
MySQL 互換性の一環として、TiDB は多数のINFORMATION_SCHEMA
テーブルをサポートしています。これらのテーブルの多くには、対応する SHOW コマンドもあります。詳細については、 情報スキーマ参照してください。
TiDB バックオフ タイプのシナリオの説明は何ですか?
TiDBサーバーと TiKVサーバー間の通信プロセスで、大量のデータを処理しているときに、 Server is busy
またはbackoff.maxsleep 20000ms
ログメッセージが表示されます。これは、TiKVサーバーがデータを処理している間、システムがビジー状態になっているためです。このとき、通常、TiKV ホストのリソース使用率が高いことがわかります。このような場合は、リソースの使用状況に応じてサーバーの容量を増やすことができます。
TiDB TiClient タイプの主な理由は何ですか?
TiClientリージョンエラー インジケータは、TiDBサーバーがクライアントとして KV インターフェイスを介して TiKVサーバーにアクセスしてデータ操作を実行するときに表示されるエラーの種類とメトリックを示します。エラーの種類にはnot_leader
とstale_epoch
含まれます。これらのエラーは、TiDBサーバーが独自のキャッシュ情報に従ってリージョンリーダー データを操作した場合、リージョンリーダーが移行した場合、または現在の TiKVリージョン情報と TiDB キャッシュのルーティング情報が一致しない場合に発生します。通常、この場合、TiDBサーバーはPD から最新のルーティング データを自動的に取得し、以前の操作をやり直します。
TiDB がサポートする同時接続の最大数はいくつですか?
デフォルトでは、TiDBサーバーあたりの最大接続数に制限はありません。必要に応じて、 config.toml
ファイルにinstance.max_connections
設定するか、システム変数max_connections
の値を変更して、最大接続数を制限できます。同時接続数が多すぎると応答時間が長くなる場合は、TiDB ノードを追加して容量を増やすことをお勧めします。
テーブルの作成時間を表示するにはどうすればいいですか?
information_schema
の表のうちcreate_time
作成時刻です。
TiDB ログのEXPENSIVE_QUERY
の意味は何ですか?
TiDB が SQL ステートメントを実行しているときに、各演算子が 10,000 行以上を処理すると推定される場合、クエリはEXPENSIVE_QUERY
になります。 tidb-server
構成パラメータを変更してしきい値を調整し、 tidb-server
再起動できます。
TiDB のテーブルのサイズを見積もるにはどうすればよいでしょうか?
TiDB 内のテーブルのサイズを見積もるには、次のクエリ ステートメントを使用できます。
SELECT
db_name,
table_name,
ROUND(SUM(total_size / cnt), 2) Approximate_Size,
ROUND(
SUM(
total_size / cnt / (
SELECT
ROUND(AVG(value), 2)
FROM
METRICS_SCHEMA.store_size_amplification
WHERE
value > 0
)
),
2
) Disk_Size
FROM
(
SELECT
db_name,
table_name,
region_id,
SUM(Approximate_Size) total_size,
COUNT(*) cnt
FROM
information_schema.TIKV_REGION_STATUS
WHERE
db_name = @dbname
AND table_name IN (@table_name)
GROUP BY
db_name,
table_name,
region_id
) tabinfo
GROUP BY
db_name,
table_name;
上記のステートメントを使用する場合は、ステートメント内の次のフィールドを必要に応じて入力して置き換える必要があります。
@dbname
: データベースの名前。@table_name
: ターゲット テーブルの名前。
さらに、上記の声明では、
store_size_amplification
クラスター圧縮率の平均を示します。この情報を照会するためにSELECT * FROM METRICS_SCHEMA.store_size_amplification;
使用するだけでなく、 Grafana Monitoring PD - 統計バランスパネルで各ノードのサイズ増幅メトリックを確認することもできます。クラスター圧縮率の平均は、すべてのノードのサイズ増幅の平均です。Approximate_Size
、圧縮前のレプリカ内のテーブルのサイズを示します。これはおおよその値であり、正確な値ではないことに注意してください。Disk_Size
圧縮後のテーブルのサイズを示します。これはおおよその値であり、Approximate_Size
とstore_size_amplification
に従って計算できます。
TiKVサーバー管理
このセクションでは、TiKVサーバーの管理中に発生する可能性のある一般的な問題、その原因、および解決策について説明します。
コンプライアンスまたはマルチテナント アプリケーションのデータの場所を指定するにはどうすればよいでしょうか?
配置ルール使用して、コンプライアンスまたはマルチテナント アプリケーションのデータの場所を指定できます。
SQL の配置ルールは、レプリカの数、 Raftロール、配置場所、ルールが適用されるキー範囲など、連続したデータ範囲の属性を制御するように設計されています。
TiKV クラスターのレプリカの推奨数はいくつですか? 高可用性のためには最小数を維持する方が良いですか?
テスト環境では、リージョンごとに 3 つのレプリカがあれば十分です。ただし、本番シナリオでは、3 ノード未満の TiKV クラスターを運用しないでください。インフラストラクチャ、ワークロード、および回復力のニーズに応じて、この数を増やす必要がある場合があります。コピー数が多いほどパフォーマンスは低下しますが、セキュリティは高くなることに注意してください。
TiKVを起動すると、 cluster ID mismatch
メッセージが表示されます。
これは、ローカル TiKV に保存されているクラスター ID が PD で指定されたクラスター ID と異なるためです。新しい PD クラスターがデプロイされると、PD はランダムなクラスター ID を生成します。TiKV は PD からクラスター ID を取得し、初期化時にクラスター ID をローカルに保存します。次に TiKV を起動すると、ローカル クラスター ID と PD のクラスター ID が照合されます。クラスター ID が一致しない場合は、 cluster ID mismatch
メッセージが表示され、TiKV は終了します。
以前に PD クラスターをデプロイしたが、その後 PD データを削除して新しい PD クラスターをデプロイすると、TiKV が古いデータを使用して新しい PD クラスターに接続するため、このエラーが発生します。
TiKVを起動するとduplicated store address
メッセージが表示されます
これは、起動パラメータのアドレスが他の TiKV によって PD クラスターに登録されているためです。このエラーが発生する一般的な条件: TiKV --data-dir
で指定されたパスにデータ フォルダーがありません (削除または移動後に --data-dir を更新していない)。以前のパラメータで TiKV を再起動します。pd-ctl のストア削除機能を試し、以前のストアを削除してから、TiKV を再起動してください。
TiKV プライマリ ノードとセカンダリ ノードは同じ圧縮アルゴリズムを使用しますが、結果が異なるのはなぜですか?
現在、TiKV プライマリ ノードの一部のファイルは圧縮率が高くなっています。これは、基盤となるデータ分布と RocksDB の実装に依存します。データ サイズが時々変動するのは正常です。基盤となるstorageエンジンは、必要に応じてデータを調整します。
TiKVブロックキャッシュの機能は何ですか?
TiKV は、RocksDB のカラムファミリ (CF) 機能を実装します。デフォルトでは、KV データは最終的に RocksDB 内の 3 つの CF (デフォルト、書き込み、ロック) に保存されます。
- デフォルトの CF には実データが保存され、対応するパラメータは
[rocksdb.defaultcf]
にあります。 - 書き込み CF にはデータ バージョン情報 (MVCC) とインデックス関連データが格納され、対応するパラメータは
[rocksdb.writecf]
にあります。 - ロック CF はロック情報を保存し、システムはデフォルトのパラメータを使用します。
- Raft RocksDB インスタンスはRaftログを保存します。デフォルトの CF は主にRaftログを保存し、対応するパラメータは
[raftdb.defaultcf]
にあります。 - すべての CF には、データ ブロックをキャッシュして RocksDB の読み取り速度を向上させる共有ブロック キャッシュがあります。ブロック キャッシュのサイズは、
block-cache-size
パラメータによって制御されます。パラメータの値が大きいほど、より多くのホット データをキャッシュでき、読み取り操作に有利になります。同時に、システムメモリの消費量も増加します。 - 各 CF には個別の書き込みバッファがあり、そのサイズは
write-buffer-size
パラメータによって制御されます。
TiKV チャンネルが満員なのはなぜですか?
- Raftstoreスレッドが遅すぎるか、I/O によってブロックされています。RaftstoreのCPU 使用状況を表示できます。
- TiKV がビジー状態 (CPU やディスク I/O など) のため、処理できません。
TiKV がリージョンリーダーを頻繁に変更するのはなぜですか?
- ネットワークの問題により、ノード間の通信が停止します。レポート障害の監視を確認できます。
- 元のメインLeaderのノードがスタックし、Followerに時間内に到達できなくなります。
- Raftstore のスレッドがスタックしました。
ノードがダウンした場合、サービスに影響はありますか? 影響がある場合、どのくらいの期間影響がありますか?
TiKV はRaftを使用して、複数のレプリカ間でデータを複製します (デフォルトでは、リージョンごとに 3 つのレプリカ)。1 つのレプリカに障害が発生した場合、他のレプリカがデータの安全性を保証します。Raft プロトコルに基づいて、ノードがダウンして単一のリーダーに障害が発生した場合、最大 2 倍のリース時間 (リース時間は 10 秒) 後に、別のノードのフォロワーがリージョンリーダーとしてすぐに選出されます。
I/O、メモリ、CPU を大量に消費し、パラメータ構成を超える TiKV シナリオは何ですか?
TiKV で大量のデータを書き込んだり読み取ったりすると、大量の I/O、メモリ、CPU が消費されます。大規模な中間結果セットを生成するシナリオなど、非常に複雑なクエリを実行すると、大量のメモリと CPU リソースが消費されます。
TiKV は SAS/SATA ディスクまたは SSD/SAS ディスクの混合展開をサポートしていますか?
いいえ。OLTP シナリオの場合、TiDB はデータ アクセスと操作のために高 I/O ディスクを必要とします。強力な一貫性を備えた分散データベースである TiDB には、レプリカ レプリケーションや最レイヤーのstorageコンパクションなどの書き込み増幅機能があります。したがって、TiDB のベスト プラクティスでは、storageディスクとして NVMe SSD を使用することをお勧めします。TiKV と PD の混合展開はサポートされていません。
データアクセスの前に、キーデータテーブルの範囲が分割されていますか?
いいえ。MySQL のテーブル分割ルールとは異なります。TiKV では、テーブル Range はリージョンのサイズに基づいて動的に分割されます。
リージョンはどのように分割されますか?
リージョンは事前に分割されませんが、リージョン分割メカニズムに従います。リージョンのサイズがregion-max-size
またはregion-max-keys
パラメータの値を超えると、分割がトリガーされます。分割後、その情報は PD に報告されます。
TiKV には、データのセキュリティを保証するために、MySQL のようなinnodb_flush_log_trx_commit
パラメータがありますか?
はい。現在、スタンドアロンstorageエンジンは 2 つの RocksDB インスタンスを使用しています。1 つのインスタンスは raft-log の保存に使用されます。TiKV のsync-log
パラメータが true に設定されている場合、各コミットは強制的に raft-log にフラッシュされます。クラッシュが発生した場合は、raft-log を使用して KV データを復元できます。
SSD、RAID レベル、RAID カードのキャッシュ戦略、NUMA 構成、ファイル システム、オペレーティング システムの I/O スケジューリング戦略など、WALstorageに推奨されるサーバー構成は何ですか?
WAL は順序付き書き込みに属しており、現在、固有の構成は適用されていません。推奨される構成は次のとおりです。
- ソリッドステートドライブ
- RAID 10を推奨
- RAID カードのキャッシュ戦略とオペレーティング システムの I/O スケジューリング戦略: 現在、特定のベスト プラクティスはありません。Linux 7 以降では、デフォルト構成を使用できます。
- NUMA: 具体的な提案はありません。メモリ割り当て戦略としては、
interleave = all
使用できます。 - ファイルシステム: ext4
最も厳密なデータ利用可能モード ( sync-log = true
) での書き込みパフォーマンスはどうですか?
通常、 sync-log
有効にするとパフォーマンスが約 30% 低下します。 sync-log
をfalse
に設定した場合の書き込みパフォーマンスについては、 Sysbench を使用した TiDB のパフォーマンス テスト結果参照してください。
TiKVアーキテクチャのRaft + 複数のレプリカは絶対的なデータ安全性を実現できますか? スタンドアロンstorageに最も厳格なモード ( sync-log = true
) を適用する必要がありますか?
データは、ノード障害が発生した場合の回復可能性を確保するために、 Raftコンセンサスアルゴリズム使用して TiKV ノード間で冗長的に複製されます。データがレプリカの 50% 以上に書き込まれた場合にのみ、アプリケーションは ACK を返します (3 つのノードのうち 2 つ)。ただし、理論上は 2 つのノードがクラッシュする可能性があります。したがって、データの安全性に対する要件がそれほど厳しくなく、パフォーマンスに対する要件が厳しいシナリオを除き、 sync-log
モードを有効にすることを強くお勧めします。
sync-log
使用する代わりに、 Raftグループに 3 つのレプリカではなく 5 つのレプリカを持つことも検討できます。これにより、データの安全性を維持しながら、2 つのレプリカの障害を許容できます。
スタンドアロンの TiKV ノードの場合でも、 sync-log
モードを有効にすることをお勧めします。そうしないと、ノード障害が発生した場合に最後の書き込みが失われる可能性があります。
TiKV はRaftプロトコルを使用するため、データの書き込み中に複数のネットワーク ラウンドトリップが発生します。実際の書き込み遅延はどのくらいですか?
理論上、TiDB の書き込み遅延は、スタンドアロン データベースよりもネットワーク ラウンドトリップで 4 回多くなります。
TiDB には、KV インターフェイスを直接使用でき、独立したキャッシュを必要としない MySQL のような InnoDB memcached プラグインがありますか?
TiKV は、インターフェイスを個別に呼び出すことをサポートしています。理論的には、インスタンスをキャッシュとして取得できます。TiDB は分散リレーショナル データベースであるため、TiKV を個別にサポートしていません。
コプロセッサーコンポーネントは何に使用されますか?
- TiDBとTiKV間のデータ転送を削減
- TiKV の分散コンピューティング リソースを最大限に活用して、コンピューティング プッシュダウンを実行します。
エラーメッセージIO error: No space left on device While appending to file
が表示されます
これはディスク容量が不足しているためです。ノードを追加するか、ディスク容量を拡大する必要があります。
TiKV で OOM (メモリ不足) エラーが頻繁に発生するのはなぜですか?
TiKV のメモリ使用量は主に RocksDB のブロック キャッシュから発生し、デフォルトではシステムメモリサイズの 40% を占めます。TiKV で OOM エラーが頻繁に発生する場合は、値block-cache-size
の設定が高すぎないか確認する必要があります。また、1 台のマシンに複数の TiKV インスタンスを展開する場合は、複数のインスタンスがシステムメモリを大量に使用して OOM エラーが発生しないように、パラメータを明示的に構成する必要があります。
TiDB データと RawKV データの両方を同じ TiKV クラスターに保存できますか?
これは、TiDBのバージョンとTiKV API V2が有効になっているかどうかによって異なります( storage.api-version = 2
)。
- TiDB バージョンが v6.1.0 以降で、TiKV API V2 が有効になっている場合は、TiDB データと RawKV データを同じ TiKV クラスターに保存できます。
- それ以外の場合、TiDB データ (またはトランザクション API を使用して作成されたデータ) のキー形式は RawKV API を使用して作成されたデータ (または他の RawKV ベースのサービスからのデータ) と互換性がないため、答えは「いいえ」です。
TiDB テスト
このセクションでは、TiDB テスト中に発生する可能性のある一般的な問題、その原因、および解決策について説明します。
Sysbench を使用した TiDB のパフォーマンス テスト結果は何ですか?
最初は、多くのユーザーが TiDB と MySQL のベンチマーク テストや比較テストを行う傾向があります。私たちも同様の公式テストを実施しましたが、テスト データには多少の偏りはあるものの、テスト結果は概ね一貫していることがわかりました。TiDB のアーキテクチャはMySQL と大きく異なるため、ベンチマーク ポイントを見つけるのは困難です。提案は次のとおりです。
- ベンチマーク テストに時間をかけすぎないでください。TiDB を使用するシナリオの違いにもっと注意を払ってください。
- Sysbench を使用した TiDB のパフォーマンス テスト結果参照。
TiDB クラスターの容量 (QPS) とノード数の関係は何ですか? TiDB と MySQL を比較するとどうなりますか?
- 10 ノード内では、TiDB 書き込み容量 (挿入 TPS) とノード数の関係は、およそ 40% の線形増加です。MySQL は単一ノード書き込みを使用するため、書き込み容量を拡張することはできません。
- MySQL では、セカンダリ データベースを追加することで読み取り容量を増やすことができますが、書き込み容量はシャーディングを使用する以外では増やすことができず、多くの問題があります。
- TiDB では、ノードを追加することで読み取り容量と書き込み容量の両方を簡単に増やすことができます。
DBAによるMySQLとTiDBのパフォーマンステストでは、スタンドアロンのTiDBのパフォーマンスはMySQLほど良くないことがわかりました。
TiDB は、MySQL スタンドアロンの容量が限られているためにシャーディングが使用され、強力な一貫性と完全な分散トランザクションが求められるシナリオ向けに設計されています。TiDB の利点の 1 つは、コンピューティングをstorageノードにプッシュダウンして同時コンピューティングを実行することです。
TiDB は、小さなデータサイズと限られたリージョンでは同時実行の強さを発揮できないため、小さいサイズ (1,000 万レベル未満など) のテーブルには適していません。典型的な例は、数行のレコードが頻繁に更新されるカウンター テーブルです。TiDB では、これらの行はstorageエンジンで複数のキーと値のペアになり、単一のノードにあるリージョンに落ち着きます。強力な一貫性を保証するためのバックグラウンド レプリケーションと TiDB から TiKV への操作のオーバーヘッドにより、MySQL スタンドアロンよりもパフォーマンスが低下します。
バックアップと復元
このセクションでは、バックアップおよび復元中に発生する可能性のある一般的な問題、その原因、および解決策について説明します。
TiDB でデータをバックアップするにはどうすればよいですか?
現在、大容量データ (1 TB 以上) のバックアップには、 バックアップと復元 (BR)使用する方法が推奨されています。それ以外の場合は、 Dumplingツールが推奨されます。公式の MySQL ツールmysqldump
も TiDB でデータのバックアップと復元にサポートされていますが、そのパフォーマンスはBRほど優れておらず、大容量データのバックアップと復元にはさらに多くの時間が必要です。
BRに関するその他の FAQ については、 BRよくある質問参照してください。
バックアップと復元の速度はどのくらいですか?
BRを使用してバックアップおよび復元タスクを実行すると、バックアップは TiKV インスタンスあたり約 40 MB/秒で処理され、復元は TiKV インスタンスあたり約 100 MB/秒で処理されます。