このトピックでは、LindormTable の使用時に発生する可能性のある一般的な問題とその解決策を一覧表示します。
問題の概要
接続に関する問題
マイナーバージョンの更新
ストレージ関連のトピック (コンパクション)
データ管理
データクエリ
モニタリング
HBase 関連のトピック
一括操作
接続
Lindorm-cli が LindormTable に接続できないのはなぜですか?
以下の各項目を確認してください:
これはパブリックネットワーク接続ですか?もしそうであれば、パブリック IP アドレスを取得し、それを Lindorm ホワイトリストに追加してください。
VPN などのプロキシを使用していますが、それをホワイトリストに追加していませんか?
サービスポートは利用可能ですか?telnet コマンドを使用して Lindorm ポートへの接続性をテストできます。
ECS を使用して LindormTable に接続する場合、「Lindorm の接続に関する問題と解決策」をご参照ください。
LindormTable の一般的なポート番号は何ですか?
ポート番号 | 説明 |
30060 | SQL ポート (Avatica プロトコル) |
33060 | SQL ポート (MySQL プロトコル) |
30020 | ワイドテーブルポート (HBase 互換プロトコル、Java アクセス) |
9042 | CQL ポート (Cassandra 互換プロトコル) |
マイナーバージョンの更新
マイナーバージョンの更新による影響と所要時間はどのくらいですか?
マイナーバージョンの更新により、一度に 1 つのノードが短時間切断される可能性があります。各サーバーはローリングリスタートを実行します。更新中、リージョンはオフラインになり、その後オンラインに戻ります。更新が完了すると、システムは負荷を再分散します。
影響評価:低負荷のインスタンスへの影響は最小限です。高負荷または遅延の影響を受けやすいインスタンスは影響を受ける可能性があります。更新はオフピーク時間に実行してください。
推定時間:ノードあたり約 5〜30 分です。実際の時間はリージョンの数と現在の負荷によって異なります。
ストレージ関連のトピック (コンパクション)
コンパクション操作
Compaction 操作:何をするのですか?
コンパクション操作は、期限切れのデータ (TTL) をクリーンアップし、削除マーカーを削除し、ホットデータとコールドデータをアーカイブし、データを圧縮してストレージ領域を削減します。
Compaction 操作:自動的にどのくらいの頻度で実行されますか?
デフォルトの自動トリガー間隔は 20 日です。TTL シナリオでは、デフォルトの間隔は min(TTL 値, 20 日) です。この間隔は 2 つの方法で変更できます:min(ttl,20 days)。間隔を変更するには:
SQL 文 ALTER TABLE を使用して変更します。たとえば、間隔を 2 日に設定するには、次のようにします:
ALTER TABLE <tableName> SET 'COMPACTION_MAJOR_PERIOD'='172800000';。説明COMPACTION_MAJOR_PERIODの単位はミリ秒 (ms) です。「クラスター管理システム(Lindorm Insight)」および「テーブル変更管理」を使用して、[コンパクション期間] を変更します。
Compaction 操作:手動でトリガーできますか?
はい。SQL 文 Major Compaction の実行を使用します。
高負荷のインスタンス、大規模なテーブル、またはホットデータとコールドデータの分離があるテーブルで手動でコンパクションをトリガーするとリスクが伴います。注意して使用してください。トリガー後、リージョンあたりの最大ファイル数を監視してください。ファイルが多すぎると、書き込みにバックプレッシャーがかかる可能性があります。リージョンあたりの最大ファイル数に関するアラートについては、「モニタリングとアラートのベストプラクティス」をご参照ください。
Compaction 操作:ビジネスへの影響は何ですか?
ビジネスへの影響:
システムは通常、コンパクションを実行するために複数のスレッドを割り当てます。デフォルトのスレッド数はインスタンスの仕様によって異なります。仕様が高いほど処理が速くなります。仕様が低いと多くのタスクがキューに入る可能性があります。コンパクションは CPU リソースを使用します。CPU が十分な場合、コンパクションはビジネスにほとんど影響を与えず、読み取りパフォーマンスを向上させ、ストレージ領域を解放し、データを圧縮します。
負荷モニタリング:
「[コンパクション キュー長]」は、LindormTable メトリック — クラスターペイロード を介して インスタンスモニタリング で確認できます。この値が継続的に増加するか、または横ばいのままとなる場合、コンパクション キューに多数のタスクがキューイングされている可能性があります。詳細については、「[コンパクション キュー長]」の説明について、クラスターペイロード をご参照ください。
最適化の提案:
CPU 使用率が 40% 未満の場合、LindormTable バージョン 2.6.5 以降では負荷に基づいてパラメーターを自動的に調整します。単に新しいマイナーバージョンに更新してください。CPU 使用率が 40% を超える場合は、LindormTable ノードを追加してください。
compaction タスクのステータスを確認するにはどうすればよいですか?
インスタンスのモニタリングを使用して、LindormTable のメトリック — クラスター負荷の [コンパクションキューの長さ (カウント)] を確認します。値が着実に減少するか、定期的に増加してから減少し、1 日以上上昇し続けたり横ばいになったりしない場合、ステータスは正常です。それ以外の場合は異常です。
TTL を設定してもストレージ使用量が増え続けるのはなぜですか?
インスタンスのモニタリングを使用して、LindormTable のメトリック — クラスター負荷の [コンパクションキューの長さ (カウント)] を確認します。多くのタスクがキューに入っている場合、データのクリーンアップが遅れます。CPU 使用率が 40% 未満の場合、LindormTable バージョン 2.6.5 以降では負荷に基づいてパラメーターを自動的に調整します。単に新しいマイナーバージョンに更新してください。CPU 使用率が 40% を超える場合は、LindormTable ノードを追加してください。
キューが空の場合、コンパクションは正常に実行されます。I/O 負荷が低い場合は、手動でコンパクションをトリガーするか、major compaction の間隔を調整します。たとえば、2 日に設定するには、次のようにします:ALTER TABLE <tableName> SET 'COMPACTION_MAJOR_PERIOD'='172800000';。
COMPACTION_MAJOR_PERIOD の単位はミリ秒 (ms) です。
デフォルトの間隔は 20 日です。TTL シナリオでは、デフォルトの間隔は min(ttl,20 days) です。
圧縮アルゴリズムとコーデックを設定してストレージ領域を削減するにはどうすればよいですか?
テーブルの圧縮アルゴリズム COMPRESSION を ZSTD に、コーデック DATA_BLOCK_ENCODING を INDEX に設定します。その後、major compaction を実行します。
SQL を使用してテーブルを作成した場合、これらの設定はデフォルトで適用されています。何もする必要はありません。
詳細:
SQL:Lindorm-cli を使用して LindormTable に接続するか、クラスター管理システム (Lindorm Insight) を使用して SQL 文を実行します。
-- 圧縮を ZSTD に、エンコーディングを INDEX に設定 ALTER TABLE <tablename> SET 'COMPRESSION' = 'ZSTD','DATA_BLOCK_ENCODING' = 'INDEX'; ALTER TABLE <tablename> COMPACT; -- テーブルに多くのリージョンがある場合は待機しますインスタンスのモニタリングを使用して、LindormTable のメトリック — クラスター負荷の [コンパクションキューの長さ (カウント)] を確認して進行状況を追跡します。
HBase API:テーブルの作成とデータの挿入
alter 'ns:tablename', {NAME=>'family', DATA_BLOCK_ENCODING => 'INDEX',COMPRESSION => 'ZSTD'} // テーブルに多くのリージョンがある場合は待機します major_compact 'ns:tablename' // テーブルに多くのリージョンがある場合は待機しますインスタンスのモニタリングを使用して、LindormTable のメトリック — クラスター負荷の [コンパクションキューの長さ (カウント)] を確認して進行状況を追跡します。
クラスター管理システム (Lindorm Insight) の使用:
テーブル変更管理を使用して圧縮を ZSTD に設定します。その後、[概要] ページに移動してテーブルの詳細を表示します。一番下までスクロールすると、コンパクションタスクの詳細が表示されます。
ディスク (ストレージ領域) が容量に達した場合、どうすればよいですか?
次のいずれかの操作を実行できます:
DROP TABLE を使用して未使用のテーブルを削除し、ストレージ領域を即座に解放します。
TRUNCATE TABLE を使用してテーブルからすべてのデータをクリアし、ストレージ領域を即座に解放します。
データを直接削除するために DELETE を使用しないでください。理由は次のとおりです:
Lindorm は書き込みパフォーマンスを優先します。削除操作は最初にデータを読み取りません。代わりに、削除マーカーを書き込み、データがクエリに見えなくなります。データは、次の compaction 操作中にのみ物理的に削除されます。トリガー間隔については、「コンパクション操作の自動トリガー間隔」をご参照ください。
ディスク (ストレージ領域) が容量に達した後、データを削除できないのはなぜですか?
データを直接削除するために DELETE を使用しないでください。理由は次のとおりです:
Lindorm は書き込みパフォーマンスを優先します。削除操作は最初にデータを読み取りません。代わりに、削除マーカー (Delete Marker) を書き込み、データがクエリに見えなくなります。データは、次の compaction 操作中にのみ物理的に削除されます。トリガー間隔については、「コンパクション操作の自動トリガー間隔」をご参照ください。
また、ディスクが容量制限に達すると、システムは削除マーカーを含むすべてのデータ書き込みを禁止します。削除マーカーを書き込めないため、削除対象のデータは Compaction 操作でパージできません。したがって、この操作ではすぐに領域を解放できません。
LindormTable はノード数の変更やディスク容量のスケーリングをサポートしていますか?
ノード数の変更はエンジンレベルの操作です。ディスク容量のスケーリングはインスタンスレベルの操作です。
ローカルディスクとクラウドディスクの両方のインスタンスが LindormTable ノード数の変更をサポートしています。
ローカルディスクインスタンスはディスク容量のスケーリングをサポートしていません。クラウドディスクインスタンスはホットストレージ容量のスケーリングとコールドストレージ容量のスケーリングをサポートしています。スケールダウンにはデータのコピーが必要で時間がかかります。お待ちください。
データ管理
一般的なテーブルプロパティにはどの単位を使用すればよいですか?
major compaction間隔:COMPACTION_MAJOR_PERIOD パラメーターはmajor compaction間隔を設定します。単位はミリ秒 (ms) です。major compaction 間隔を使用してテーブルを作成するときにこの間隔を指定できます。タイムスタンプ:単位はミリ秒 (ms) です。一部のヒントでは秒 (s) を使用します。例:
/*+ _l_ts_(%s) */。TTL (Time To Live):単位は秒 (s) です。データの有効期限を使用してテーブルを作成するときに TTL を指定できます。
テーブル作成時に NUMREGIONS パラメーターを設定するにはどうすればよいですか?
NUMREGIONS を指定しない場合、デフォルトは 1 パーティションです。最初に NUMREGIONS を サーバーノード数 × 4 に設定することをお勧めします。パーティションはデータが 8 GB に達すると自動的に分割されます。または、パーティションの読み取り/書き込み QPS の合計が 1000 を超えると、システムはホットスポットを検出し、分割するかどうかを決定します。
より良いホットスポット自己修復のために、LindormTable の新しいマイナーバージョン (2.4.x 以降) に更新することをお勧めします。
ALTER TABLE でテーブルプロパティを変更するとどのような影響がありますか?
ALTER TABLE はテーブルのすべてのリージョンを閉じてから再度開きます。これによる影響は最小限です。アプリケーションが読み取りレイテンシに敏感な場合 (たとえば、ミリ秒単位の応答時間が必要な場合)、この操作はオフピーク時間に実行してください。
書き込み操作が最大列サイズ制限を超えるのはなぜですか?
書き込み操作が最大列サイズ制限を超えると、次のエラーが返されます:
com.alibaba.lindorm.client.exception.IllegalDataException: Column [xxx] is too big, max length is 2097152 bytes but has 7621168 bytes.
VARBINARY 列には長さの制限はありません。その他の制限については、「クォータと制限」をご参照ください。
デフォルトでは、単一のセルは 2 MB を超えることはできません。インスタンスの負荷とストレージ領域を考慮してください。負荷が低い場合は、SQL を使用して最大非プライマリキー列サイズを一時的に増やすことができます (非推奨):ALTER TABLE <tablename> SET 'MAX_NONPK_LEN'='4194304'; (単位:バイト)。
最大非プライマリキー列サイズを変更するには、アップグレード時に次のガイドラインに従ってください:
ノードメモリが 32 GB の場合、MAX_NONPK_LEN を 5 MB 未満に保ちます。
ノードメモリが 64 GB の場合、MAX_NONPK_LEN を 10 MB 未満に保ちます。
データを削除する方法と注意点は何ですか?
Lindorm は 2 つの方法でデータを削除できます:TRUNCATE TABLE を使用してテーブルからすべてのデータをクリアするか、完全なプライマリキーを使用して特定の行を削除します。削除後、アプリケーションが読み取り RT に敏感な場合は、手動で major compaction を実行します。そうでない場合は、スケジュールされた compaction サイクルを待ちます。
完全なプライマリキーを使用した削除操作は、範囲削除をサポートしていません。まず完全なプライマリキーをクエリし、次に等価条件を使用して削除します。
データがコールドストレージに移動したことを確認するにはどうすればよいですか?
まず、プライマリキーを指定して検証対象のすべてのデータをクエリし、次に同じプライマリキーを使用してHINT を使用してホットデータのみをクエリします。クエリ結果を比較します:同じであれば、データはコールドストレージに入っていません。すべてのデータをクエリした結果とHINT を使用してホットデータのみをクエリした結果が異なり、すべてのデータをクエリしたときにコールドデータが見つからない場合、これはデータがコールドストレージに入ったことを示します。
検証する前に、クラスター管理システム (Lindorm Insight) と [概要] ページを使用して、[コールドストレージ] と [ホットストレージ] のサイズを確認します。アーカイブ前後のサイズを比較します。
データがコールドストレージに移動しないのはなぜですか?
「コンパクション後にデータがコールドストレージに移動しない理由」をご参照ください。
主な理由には次のものがあります:
Flush が実行されなかった
flushを実行してデータをディスクに書き込んでからコンパクションを実行します。コンパクションのバックログ
スケールアウトまたはスペックアップによって CPU リソースを増やすことで、コンパクションのバックログ問題を解決できます。
説明モニタリング情報の表示でモニタリング情報を表示することで、コンパクションのバックログが発生したかどうかを判断できます。具体的には、 です。値が 0 より大きいままで増加し続ける場合、コンパクションのバックログが発生しています。
データにタイムスタンプがある
データクエリ
セカンダリインデックスのクエリがnull 値を返さないのはなぜですか?
プライマリキーの並べ替えと複数列インデックスを使用する場合、最初の非プライマリキー列の値が NULL の場合、システムはセカンダリインデックスを構築しません。実際の値を持つ非プライマリキー列のみがインデックステーブルに表示されます。
クエリ結果が予期しないものになる原因は何ですか?
モニタリング
モニタリングにおけるコールドストレージトークンメトリックは何を意味しますか?
コールドストレージは、アクセス頻度の低いアーカイブデータ用です。コールドストレージからの読み取りを最小限に抑えてください。コールドストレージトークンメトリックは、コールドストレージのレート制限を監視します。トークン数が継続的に減少している場合、一部のリクエストがスロットリングされたことを意味します。
推奨されるモニタリング設定は何ですか?
「モニタリングとアラートのベストプラクティス」をご参照ください。
テーブルレベルのモニタリングに関するよくある質問
テーブルの名前を変更した後、モニタリングメトリックが更新されないのはなぜですか?
テーブルの名前を変更した後に更新されるのは のみです。システムメトリックなどの他のメトリックは変更されません。
テーブルモニタリングでテーブル名が見つからないのはなぜですか?
テーブルモニタリングにテーブル名が表示されない場合は、まず時間範囲を広げてください (例:1 時間から 24 時間)。それでも表示されない場合、その期間中にテーブルに読み取りまたは書き込みアクティビティがなかったため、モニタリングデータが報告されませんでした。
HBase 関連のトピック
SQL テーブルと HBase テーブルの違いは何ですか?どのように見分けますか?
SQL テーブルと HBase テーブルは、構造とデータ操作が異なります。SQL テーブルは固定スキーマ (事前に定義された列名と型) を持ち、SQL 操作のみをサポートします。HBase テーブルは固定スキーマを持たず (動的カラムをサポート)、HBase API を使用します (ただし、SQL クエリも許可されます)。それらを区別するには:
作成方法
HBase テーブル:
hbase shellまたは他の HBase 同期ツールを使用して作成されます (「ワイドテーブル」とも呼ばれます)。SQL テーブル:SQL コマンドを使用して作成されます (SQL は HBase テーブルを作成できません)。
構造的特徴
HBase テーブル:スキーマなし。動的カラムをサポートします。
SQL テーブル:固定スキーマ。列の型が厳密に定義されています。
操作制限
HBase テーブル:HBase API を通じてのみ書き込み可能 (SQL で読み取り可能、Htype マッピングドキュメントを参照)。
SQL テーブル:SQL API を通じてのみ読み書き可能。
検証方法
この SQL コマンドを実行してIS_HBASE_LIKEプロパティを確認します:SHOW TABLE VARIABLES FROM <database_name> LIKE 'IS_HBASE_LIKE';true:HBase テーブルfalse:SQL テーブル
ApsaraDB for HBase Performance-enhanced Edition は SQL をサポートしていますか?
ApsaraDB for HBase Performance-enhanced Edition は LindormTable エンジン (HBase または Cassandra と互換) を使用します。その使用法は LindormTable と一致します。SQL をサポートしています。Lindorm-cli を使用して LindormTable に接続できます:
./lindorm-cli -url jdbc:lindorm:table:url=http://ld-bp17j28j2y7pm****-proxy-lindorm-pub.lindorm.rds.aliyuncs.com:30060 -username xxx -password xxx
# 接続後
lindorm:default> show databases;接続する前に、ネットワーク接続を確認してください。telnet コマンドを使用して Lindorm ポートの接続性をテストできます。また、クライアント IP をホワイトリストに追加してください。
オープンソースの HBase クライアントユーザーが知っておくべきことは何ですか?
オープンソースの HBase クライアントは、認証やマルチゾーンデプロイメントをサポートしていません。LindormTable に接続する前に、HBase SDK をインストールしてください。
一括操作
一括削除を有効にするにはどうすればよいですか?
一括削除の設定を有効にして確認するには、次のコマンドを使用します。
通常の削除ではパフォーマンスの問題はほとんど発生しません。特別な処理は必要ありません。大規模な削除は多くの削除マーカーを作成します。これらのマーカーはスキャンのオーバーヘッドを増加させ、クエリのタイムアウトを引き起こす可能性があります。「テーブルの一括削除後のクエリタイムアウト」をご参照ください。
一括削除は LindormTable バージョン 2.8.2.13 からサポートされています。バージョンを確認またはアップグレードするには、「LindormTable バージョンガイド」および「マイナーバージョンの更新」をご参照ください。
-- SQL を使用して有効または無効にする
ALTER SYSTEM SET `lindorm.allow.range.delete`=TRUE;
-- 現在の設定を確認する
SHOW SYSTEM variables LIKE 'lindorm.allow.range.delete';一括更新がサポートされていない、または「Update's WHERE clause can only contain PK columns」というエラーが表示されるのはなぜですか?
単一行の更新はデフォルトで有効になっています。一括更新の設定を有効にして確認するには、次のコマンドを使用します。
テーブルの一括更新がクエリのタイムアウトを引き起こす場合は、解決策をご参照ください。
一括更新は LindormTable バージョン 2.8.2.13 からサポートされています。バージョンを確認またはアップグレードするには、「LindormTable バージョンガイド」および「マイナーバージョンの更新」をご参照ください。
-- SQL を使用して有効または無効にする
ALTER SYSTEM SET `lindorm.allow.batch.update`=TRUE;
-- 現在の設定を確認する
SHOW SYSTEM variables LIKE 'lindorm.allow.batch.update';テーブルの一括削除後のクエリタイムアウト
削除の仕組み
Lindorm は高い書き込みスループットを優先します。削除操作はデータをすぐに消去しません。代わりに、削除マーカーを書き込みます。これはユーザーには透明です — 削除されたデータは読み取りには見えませんが、システムは読み取り中にマーカーと削除されたデータをスキップする必要があります。通常の削除では問題はほとんど発生しません。大規模な削除は多くの削除マーカーを蓄積します。例:100,000 の有効な行、1,000,000 の削除された行、1,000,000 の削除マーカーを持つ範囲を読み取ると、システムは約 210 万レコードをスキャンして有効な結果をフィルタリングする必要があります。これにより、読み取り時間が大幅に増加し、タイムアウトが発生する可能性があります。クエリがタイムアウトする理由
多くの保留中の削除がある範囲をスキャンするクエリは、多くのdeleteMarkerを生成します。それらをスキップするとオーバーヘッドが増加し、タイムアウトが発生します。解決策
コンパクションを実行して、期限切れのデータとdeleteMarkerを永続的に削除します。コンパクションは自動または手動でトリガーされます。詳細については、「コンパクション操作」をご参照ください。
セカンダリインデックスを持つテーブルを一括更新した後のクエリタイムアウト
クエリがタイムアウトする理由
セカンダリインデックスは別のインデックステーブルです。そのプライマリキーのフォーマットは [インデックス付き列の値] + [プライマリテーブルの RowKey] です。プライマリテーブルのレコードが更新または削除されると、Lindorm は自動的に:
古いインデックスエントリを削除し (削除マーカーを書き込み)、新しいインデックスエントリを挿入します (該当する場合)。
そのため、インデックス付き列への大規模な更新は、インデックステーブルに多くの削除マーカーを作成します。インデックスを使用するクエリは、ターゲットのインデックス値のすべての RowKey をスキャンし、削除されたエントリをスキップする必要があります。有効なエントリが少ない場合、スキャンとフィルタリングのオーバーヘッドが急激に増加します。これにより、クエリレイテンシが増加し、スループットが低下します。
削除の仕組み
Lindorm は高い書き込みスループットを優先します。削除操作はデータをすぐに消去しません。代わりに、削除マーカーを書き込みます。これはユーザーには透明です — 削除されたデータは読み取りには見えませんが、システムは読み取り中にマーカーと削除されたデータをスキップする必要があります。通常の削除では問題はほとんど発生しません。大規模な削除は多くの削除マーカーを蓄積します。例:100,000 の有効な行、1,000,000 の削除された行、1,000,000 の削除マーカーを持つ範囲を読み取ると、システムは約 210 万レコードをスキャンして有効な結果をフィルタリングする必要があります。これにより、読み取り時間が大幅に増加し、タイムアウトが発生する可能性があります。解決策
コンパクションを実行して、期限切れのデータとdeleteMarkerを永続的に削除します。コンパクションは自動または手動でトリガーされます。詳細については、「コンパクション操作」をご参照ください。