すべてのプロダクト
Search
ドキュメントセンター

ApsaraDB for ClickHouse:よくある質問

最終更新日:Jun 04, 2026

一般的な ApsaraDB for ClickHouse の問題とその解決策。

ApsaraDB for ClickHouse とコミュニティ版の比較

ApsaraDB for ClickHouse は、主にコミュニティ版の安定性のバグを修正します。また、ユーザーロールごとにリソース使用量の優先度を設定するための リソースキュー も提供しています。

ApsaraDB for ClickHouse の推奨バージョン

ApsaraDB for ClickHouse は、オープンソースコミュニティの安定したLTSカーネルバージョンを使用しています。新しいバージョンは通常、3か月間の安定化期間を経てクラウドサービスで利用可能になります。バージョン21.8以降を推奨します。バージョン機能比較

シングルレプリカインスタンスとマスターレプリカインスタンス

  • シングルレプリカインスタンスは、各シャードノードにレプリカノードを持たないため、高可用性を提供しません。データセキュリティは、基盤となるクラウドディスクのマルチレプリカストレージに依存しており、非常にコスト効率の高いオプションです。

  • マスターレプリカインスタンスは、各シャードノードにレプリカノードを提供します。プライマリノードが障害を起こした場合、対応するレプリカノードがディザスタリカバリを提供します。

リソース不足エラー

同じリージョン内の別のゾーンでリソースを購入してみてください。VPC ネットワークは、同じリージョン内のゾーンをネットワーク遅延を無視できるレベルで接続します。

水平スケーリング時間に影響を与える要因

水平スケーリングにはデータ移行が含まれるため、データ量が多いインスタンスほど処理に時間がかかります。

スケーリングの影響

データ移行後のデータ整合性を確保するため、スケーリングプロセス中はインスタンスが読み取り専用状態になります。

水平スケーリングの推奨事項

水平スケーリングには長い時間がかかります。クラスターのパフォーマンスが不十分な場合は、垂直スケーリングを優先してください。Community Edition クラスターの垂直スケーリングと水平スケーリング

ポートの説明

プロトコル

ポート番号

説明

TCP

3306

このポートを使用して、clickhouse-client ツールで ApsaraDB for ClickHouse に接続します。コマンドラインインターフェイスを使用して ClickHouse に接続する

HTTP

8123

このポートを使用して、アプリケーション開発のために JDBC を使用して ApsaraDB for ClickHouse に接続します。JDBC を使用して ClickHouse に接続する

HTTPS

8443

このポートを使用して、HTTPS 経由で ApsaraDB for ClickHouse にアクセスします。HTTPS プロトコルを使用して ClickHouse に接続する

Alibaba Cloud ClickHouse の SDK 接続ポート

言語

HTTP

TCP

Java

8123

3306

Python

Go

Go および Python 用の SDK

推奨される SDK は、サードパーティ製クライアントライブラリに記載されています。

「connect timed out」エラーの解決方法

以下の解決策をお試しください。

  • ネットワーク接続を確認します。ping を使用してネットワーク到達可能性を確認し、telnet を使用してデータベースポート 3306 および 8123 が開いていることを確認します。

  • ご利用の ClickHouse ホワイトリスト設定を確認します。ホワイトリストの設定

  • クライアントマシンのパブリック IP アドレスを確認します。オフィスネットワークでは、このアドレスが頻繁に変更される可能性があるため、IP ルックアップサービスを使用して正しいアドレスを確認してください。例として、whatsmyip を参照してください。

外部テーブルに接続できない

バージョン 20.3 および 20.8 では、外部テーブルを作成する際にシステムが自動的に接続を検証します。テーブル作成が成功すれば、ネットワーク接続が確立されていることを意味します。テーブル作成が失敗した場合、一般的な原因は以下のとおりです。

  • ターゲットエンドポイントと ClickHouse が同じ VPC にないため、ネットワーク接続が確立できません。

  • MySQL サーバーがホワイトリストを使用しています。ClickHouse を MySQL ホワイトリストに追加する必要があります。

Kafka 外部テーブルの場合、テーブル作成は成功してもクエリがデータを返さないことがあります。これは、Kafka のデータがテーブルスキーマに従って解析できなかったことが原因であることが多いです。エラーメッセージには、解析エラーが発生した正確な位置が示されます。

接続問題のトラブルシューティング

接続失敗の一般的な原因とその解決策:

  • 原因:ネットワーク環境が誤って設定されています。アプリケーションとインスタンスが同じ VPC 内にある場合にのみ、内部ネットワーク経由で接続できます。異なる VPC にある場合は、パブリックエンドポイントを有効にしてパブリックネットワーク経由で接続する必要があります。

    解決策:パブリックネットワークアクセスを有効にするには、「パブリック IP アドレスの申請と解放」をご参照ください。

  • 原因:クライアントの IP アドレスがインスタンスのホワイトリストに含まれていません。

    解決策:ホワイトリストを設定するには、「ホワイトリストの設定」をご参照ください。

  • 原因:ご利用の ECS インスタンスのセキュリティグループが、必要なポートのトラフィックをブロックしています。

    解決策:セキュリティグループを設定するには、「セキュリティグループ操作ガイド」をご参照ください。

  • 原因:企業のファイアウォールが接続をブロックしています。

    解決策:ファイアウォールルールを変更して、インスタンスへのアウトバウンドトラフィックを許可してください。

  • 原因:接続文字列のユーザー名またはパスワードに特殊文字(!@#$%^&*()_+= など)が含まれています。クライアントがこれらの文字を正しく解釈できないため、接続に失敗することがあります。

    解決策:接続文字列内の特殊文字を URL エンコードする必要があります。エンコードルールは次のとおりです。

    ! : %21
    @ : %40
    # : %23
    $ : %24
    % : %25
    ^ : %5e
    & : %26
    * : %2a
    ( : %28
    ) : %29
    _ : %5f
    + : %2b
    = : %3d

    たとえば、パスワードが ab@#c の場合、接続文字列内のエンコードされたパスワードは ab%40%23c にする必要があります。

  • 原因:ApsaraDB for ClickHouse は、クラスター用に従量課金の Server Load Balancer (SLB) インスタンスを自動的にプロビジョニングします。Alibaba Cloud アカウントに支払い遅延がある場合、SLB インスタンスが一時停止され、ApsaraDB for ClickHouse インスタンスにアクセスできなくなる可能性があります。

    解決策:Alibaba Cloud アカウントの支払い遅延を確認してください。未払い残高がある場合は、支払ってサービスを復元してください。

ClickHouse タイムアウト問題の対処方法

ApsaraDB for ClickHouse は、さまざまなタイムアウト関連のパラメーターを提供しており、複数のインタラクションプロトコルをサポートしています。たとえば、HTTP および TCP プロトコルのパラメーターを設定して、タイムアウトを管理できます。

HTTP プロトコル

HTTP プロトコルは、本番環境で ApsaraDB for ClickHouse と対話する最も一般的な方法です。公式 JDBC ドライバー、Alibaba Cloud DMS、DataGrip などのクライアントはすべて、バックグラウンドで HTTP プロトコルを使用しています。HTTP プロトコルのデフォルトポートは 8123 です。

  • distributed_ddl_task_timeout の問題への対処方法

    • このパラメーターは、分散 DDL クエリ(ON CLUSTER 句付き)の実行待機時間を指定します。デフォルト値は 180 秒です。Alibaba Cloud DMS で次のコマンドを実行して、これをグローバルパラメーターとして設定できます。新しい設定は、クラスターを再起動後に有効になります。

      set global on cluster default distributed_ddl_task_timeout = 1800;

      ZooKeeper が非同期にキュー内で分散 DDL タスクを管理および実行するため、タイムアウトはタスクがまだ実行待ち状態であることを示しており、タスクが失敗したわけではありません。タスクを再送信しないでください。

  • max_execution_time タイムアウト問題への対処方法

    • このパラメーターは、クエリの最大実行時間を指定します。Alibaba Cloud DMS プラットフォームでのデフォルト値は 7200 秒、JDBC ドライバーおよび DataGrip などのクライアントでは 30 秒です。この時間制限に達すると、ClickHouse は自動的にクエリをキャンセルします。この設定をクエリレベルで上書きできます。例: select * from system.numbers settings max_execution_time = 3600。または、Alibaba Cloud DMS で次のコマンドを実行して、グローバルパラメーターとして設定できます。

      set global on cluster default max_execution_time = 3600;
  • socket_timeout 問題への対処方法

    • このパラメーターは、HTTP プロトコル経由でリスニングソケットが結果を返すまでの待機時間を指定します。DMS プラットフォームでのデフォルト値は 7200 秒、JDBC ドライバーおよび DataGrip では 30 秒です。このパラメーターは ClickHouse システムパラメーターではなく、HTTP プロトコルの JDBC パラメーターですが、max_execution_time パラメーター設定の有効性に影響します。これは、クライアント側の結果待機時間制限を決定するためです。したがって、max_execution_time パラメーターを調整する際は、socket_timeout パラメーターも max_execution_time よりもわずかに高い値に調整する必要があります。このパラメーターを設定するには、JDBC 接続文字列に socket_timeout プロパティを追加します。値はミリ秒単位で指定します。例: 'jdbc:clickhouse://127.0.0.1:8123/default?socket_timeout=3600000'。

  • ClickHouse サーバー IP アドレスに直接接続するとクライアントがハングする

    • ECS インスタンスがセキュリティグループを越えて ClickHouse サーバーに接続する場合、サイレント接続エラーが発生することがあります。このエラーは、JDBC クライアントを実行している ECS インスタンスのセキュリティグループホワイトリストに ClickHouse サーバーの IP アドレスが含まれていない場合に発生します。長時間実行されるクエリを実行すると、ルーティングの問題により応答パケットがクライアントに配信されず、クライアントがハングする可能性があります。

      SLB インスタンスの一時的な切断問題を解決するのと同様に、send_progress_in_http_headers を有効にすることで、これらの問題のほとんどを解決できます。まれにこの設定が機能しない場合は、クライアントを実行している ECS インスタンスのセキュリティグループホワイトリストに ClickHouse サーバーの IP アドレスを追加してください。

TCP プロトコル

TCP プロトコルは、ClickHouse のネイティブコマンドラインツールを使用したインタラクティブ分析に最もよく使用されます。Community Edition クラスターの一般的なポートは 3306 です。TCP プロトコルにはキープアライブパケットが含まれているため、ソケットレベルのタイムアウトは発生しません。distributed_ddl_task_timeout および max_execution_time パラメーターのみを管理する必要があります。これらのパラメーターは、HTTP プロトコルと同様の方法で設定できます。

「Connection refused (localhost:9000)」エラーの解決方法

  • 問題Alibaba Cloud ClickHouse インスタンスで辞書を作成した後、クエリを実行すると次のエラーが返されます。「Code: 210. DB::NetException: Connection refused (localhost:9000). (NETWORK_ERROR) (version 23.8.16.1)」。

  • 原因Alibaba Cloud ClickHouse はポートマッピングを使用しています。コンソールに表示されるポート(例:9000)はロードバランサーポートであり、実際のノードポートではありません。localhost を使用してインスタンスにアクセスするには、ロードバランサーポートではなく実際のノードポートを使用する必要があります。

  • 解決方法: 実際のノードポートにアクセスします。たとえば、localhost:9000localhost:3003変更します以下の表は、Community Edition の一般的なポートマッピングを示しています。

    ロードバランサーポート

    実際のノードポート

    3306

    3003

    9000

    3003

    8123

    3002

    9004

    3005

    8443

    3006

ApsaraDB for ClickHouse の Prometheus ポートにアクセスできない

  • 問題ApsaraDB for ClickHouse クラスターの Prometheus パラメーターを設定しましたが、指定された Prometheus ポートにアクセスできません。たとえば、telnet cc-xxxx.clickhouse.ads.aliyuncs.com:port-number コマンドが失敗します。

  • 原因:コンソールで提供される接続アドレスはロードバランサーを指していますが、Prometheus サービスは基盤となる ApsaraDB for ClickHouse ノードで実行されています。ロードバランサーは、カスタムポートのトラフィックをこれらのノードに転送するように設定されていません。

  • 解決策:Prometheus にアクセスするには、基盤となるノードの IP アドレスに直接接続します。次のコマンドを実行して、基盤となるノードの IP アドレスを取得します。その後、取得した IP アドレスのいずれかを使用して Prometheus ポートに接続します。

    SELECT * FROM system.clusters;

OSS データインポート時の OOM エラー

一般的な原因:高メモリ使用量。

この問題を解決するには、以下のいずれかを行ってください。

「too many parts」エラーの解決方法

ClickHouse は各書き込み操作に対してデータパーツを生成します。1 行または少量のデータを一度に書き込むと、過剰な数のデータパーツが生成され、マージ操作およびクエリに大きな負担がかかります。「too many parts」エラーは、ClickHouse がこれを防ぐために内部制限を設けているために発生します。このエラーが発生した場合は、書き込みバッチサイズを増やしてください。バッチサイズを調整できない場合は、コンソールで merge_tree.parts_to_throw_insert パラメーターの値を増やしてください。

DataX インポートが遅い理由

一般的な原因と解決策:

  • 原因 1:パラメーター設定が最適ではありません。ClickHouse は大規模な batch サイズと少ない concurrent operations 数で最高のパフォーマンスを発揮します。単一の batch には、平均行サイズに応じて、数十万行から数十万行を含めることができます。一般的なガイドラインとして、1 行あたり 100 バイトで見積もりますが、実際のデータ特性に基づいてこの値を調整する必要があります。

    解決策:concurrent operations 数を 10 以下に設定します。異なるパラメーター値を試して、ワークロードに最適な設定を見つけてください。

  • 原因 2:DataWorks 専用リソースグループ のリソースが不十分です。専用リソースグループECS インスタンスが小さすぎる可能性があります。CPU またはメモリが不十分だと、concurrent operations 数および利用可能な ネットワーク送信帯域幅 が制限されます。同様に、メモリが限られたマシンで大規模な batch サイズを設定すると、DataWorks プロセスで Java GC(ガベージコレクション)が頻繁に発生し、パフォーマンスが低下します。

    解決策:DataWorks 出力ログで ECS インスタンスの仕様を確認します。

  • 原因 3:データソース にボトルネックがあります。

    解決策:DataWorks 出力ログで totalWaitReaderTime および totalWaitWriterTime メトリックを検索します。totalWaitReaderTimetotalWaitWriterTime よりも大幅に高い場合、ボトルネックは書き込み側ではなく読み取り側(データソース)にあります。

  • 原因 4:パブリックネットワークエンドポイント を使用しています。パブリックネットワークエンドポイント は帯域幅が限られており、高性能なデータインポートまたはエクスポート操作には適していません。

    解決策:VPC ネットワーク エンドポイントに切り替えてください。

  • 原因 5:ダーティデータ が存在します。通常、データは batch で書き込まれます。ただし、ダーティデータ に遭遇すると、現在の batch 書き込みが失敗します。その後、DataX は行単位の挿入モードにフォールバックします。このフォールバックにより、過剰な データパーツ が生成され、書き込みパフォーマンスが大幅に低下します。

    ダーティデータ を確認するには、次の 2 つの方法を使用できます。

    • エラーメッセージを確認します。ログに Cannot parse エラーが含まれている場合、これは ダーティデータ を示しています。

      次の SQL クエリを使用して例外を検索できます。

      SELECT written_rows, written_bytes, query_duration_ms, event_time, exception
      FROM system.query_log
      WHERE event_time BETWEEN '2021-11-22 22:00:00' AND '2021-11-22 23:00:00' AND lowerUTF8(query) LIKE '%insert into <table_name>%' and type != 'QueryStart' and exception_code != 0
      ORDER BY event_time DESC LIMIT 30;
    • batch 行数を監視します。batch あたりの行数が 1 に低下した場合、DataX が ダーティデータ に遭遇して行単位モードに切り替わったことを強く示唆します。

      次の SQL クエリを使用して行数を確認できます。

      SELECT written_rows, written_bytes, query_duration_ms, event_time
      FROM system.query_log
      WHERE event_time BETWEEN '2021-11-22 22:00:00' AND '2021-11-22 23:00:00' AND lowerUTF8(query) LIKE '%insert into <table_name>%' and type != 'QueryStart'
      ORDER BY event_time DESC LIMIT 30;

    解決策:データソース から ダーティデータ を特定して修正または削除します。

Hive インポート後の行数の不一致

以下のチェックを実行してください。

  1. インポート中にエラーが発生していないか、query_log システムテーブルを確認します。エラーが存在する場合、データ損失が発生している可能性があります。

  2. テーブルエンジンが重複排除をサポートしているかどうかを確認します。たとえば、ReplacingMergeTree テーブルエンジンを使用している場合、このエンジンが重複を削除するため、ClickHouse の行数が Hive よりも少なくなる可能性があります。

  3. Hive ソースの行数の正確性を確認します。ソースの初期カウントが不正確な可能性があります。

Kafka と ClickHouse 間の行数の不一致

以下の項目を確認してください。

  1. インポート中にエラーが発生していないか、query_log システムテーブルを確認します。エラーが存在する場合、データ損失が発生している可能性があります。

  2. テーブルエンジンがデータ重複排除を実行しているかどうかを確認します。たとえば、ReplacingMergeTree エンジンは重複エントリを削除するため、ClickHouse の行数が Kafka よりも少なくなります。

  3. Kafka 外部テーブル設定で kafka_skip_broken_messages パラメーターが有効になっているかどうかを確認します。有効になっている場合、ClickHouse は解析に失敗したメッセージをスキップするため、ClickHouse の行数が Kafka よりも少なくなります。

Spark および Flink によるデータインポート

既存の ClickHouse からのデータインポート

以下のいずれかの方法を使用します。

MaterializeMySQL 同期エラー: The slave is connecting using CHANGE MASTER TO MASTER_AUTO_POSITION = 1, but the master has purged binary logs containing GTIDs that the slave requires

このエラーは、MaterializeMySQL エンジンが長期間同期を停止したため、MySQL バイナリログが有効期限切れになり、パージされたことを示しています。

この問題を解決するには、影響を受けたデータベースを削除してから、ApsaraDB for ClickHouse で再度作成します。

MaterializeMySQL エンジンを使用して MySQL データを同期する際に、テーブルの同期が停止し、system.materialize_mysql システムテーブルの sync_failed_tables フィールドが空でないのはなぜですか?

一般的な原因:ApsaraDB for ClickHouse が同期中にサポートしていない MySQL DDL(データ定義言語)ステートメントを実行したことです。

解決策:以下の手順に従って、MySQL データを再同期します。

  1. 同期が停止したテーブルを削除します。

    DROP TABLE <table_name> ON cluster default;
    説明

    このコマンドでは、table_name は同期が停止したテーブルの名前です。テーブルが分散テーブルの場合、分散テーブルとそのローカルテーブルの両方を削除する必要があります。

  2. 同期プロセスを再開します。

    ALTER database <database_name> ON cluster default MODIFY SETTING skip_unsupported_tables = 1;
    説明

    このコマンドでは、<database_name>ApsaraDB for ClickHouse の同期データベースの名前です。

「Too many partitions for single INSERT block (more than 100)」エラーの解決方法

このエラーは、単一の INSERT 操作が max_partitions_per_insert_block パラメーター(デフォルト値は 100)で許可されている以上のパーティションに書き込もうとした場合に発生します。ClickHouse では、各書き込み操作がデータパーツを生成します。パーティションには 1 つ以上のデータパーツを含めることができます。INSERT ステートメントが一度に多くの異なるパーティションにデータを書き込むと、多くのデータパーツが生成され、マージおよびクエリ操作に負担がかかります。パフォーマンスの劣化を防ぐために、ClickHouse はこの制限を設けています。

この問題を解決するには、パーティション戦略を調整するか、max_partitions_per_insert_block パラメーターを変更します。

  • テーブルスキーマを調整し、パーティション方法を変更するか、単一の挿入操作がパーティション制限を超えないようにします。

  • ユースケースで一度に多くのパーティションに書き込む必要がある場合は、データ量に基づいて max_partitions_per_insert_block 制限を増やすことができます。次の構文を使用してパラメーターを変更します。

    シングルノードインスタンス

    SET GLOBAL max_partitions_per_insert_block = XXX;

    マルチノードインスタンス

    SET GLOBAL ON cluster DEFAULT max_partitions_per_insert_block = XXX;
    説明

    ClickHouse コミュニティは、デフォルト値 100 を推奨しています。この値を高く設定しすぎると、パフォーマンスが低下する可能性があります。一括データインポートが完了したら、パラメーターをデフォルト値に戻すことができます。

insert into select のメモリ制限超過エラー

CPU およびメモリ使用量のクエリ

system.query_log システムテーブルは、各クエリの CPU およびメモリ使用量統計を提供します。

メモリ制限エラーのトラブルシューティング

ClickHouse サーバーは、複数のレベルでメモリ使用量を追跡します。単一のクエリでは、メモリトラッカーがすべてのクエリスレッドのメモリ使用量を集約します。このトラッカーは、全体のメモリトラッカーに報告します。解決策は、発生するエラーに応じて異なります。

  • Memory limit (for query) のエラーは、クエリがメモリを過剰に消費し、インスタンスメモリ容量の 70% の制限を超えたために失敗したことを意味します。これを解決するには、垂直アップグレードを実行してインスタンスメモリ容量を増やしてください。

  • Memory limit (for total) のエラーは、インスタンス全体のメモリ使用量がインスタンスメモリ容量の 90% のシステム全体の制限を超えたことを意味します。このエラーは、クエリの同時実行数が高いことや、データ書き込み後に実行されるプライマリキーマージタスクなどのリソース集約型のバックグラウンド非同期タスクが原因で発生する可能性があります。まず、クエリの同時実行数を減らしてみてください。エラーが続く場合は、垂直アップグレードを実行してインスタンスメモリ容量を増やしてください。

Enterprise Edition の SQL クエリ memory limit エラー

原因: Alibaba Cloud ApsaraDB for ClickHouse Enterprise Edition クラスターの各ノードには、32 CCU(ClickHouse 計算ユニット)と 128 GB のメモリがあります。オペレーティングシステムがこのメモリの一部を使用するため、クエリ実行用に約 115 GB が残ります。デフォルトでは、単一の SQL クエリは 1 つのノードで実行されます。memory limit エラーは、クエリが 115 GB を超えるメモリを使用した場合に発生します。

説明

クラスターの最大 CCU 制限はノード数を決定します。最大 CCU 制限が 64 を超える場合、Enterprise Edition クラスターのノード数は次のとおりです。Maximum CCU limit / 32。最大 CCU 制限が 64 以下の場合、Enterprise Edition クラスターには 2 つのノードがあります。

解決策: 次の SETTINGS 句を SQL ステートメントに追加して、複数ノード間で並列実行を有効にします。この手法によりメモリ負荷が分散され、memory limit エラーを回避できます。

SETTINGS 
    allow_experimental_analyzer = 1,
    allow_experimental_parallel_reading_from_replicas = 1;

GROUP BY による過剰なメモリ消費

max_bytes_before_external_group_by パラメーターを設定して、GROUP BY 操作のメモリ消費量を制限します。allow_experimental_analyzer 設定が、このパラメーターが有効になるかどうかに影響することに注意してください。

同時実行数制限超過エラーの対処方法

サーバーのデフォルトの最大クエリ同時実行数は 100 です。この値はコンソールで変更できます。

  1. ApsaraDB for ClickHouse コンソール にログインします。

  2. クラスターリスト ページで、Community Edition インスタンスのリスト を選択し、対象のクラスター ID をクリックします。

  3. 左側のナビゲーションウィンドウで、パラメーター設定 をクリックします。

  4. パラメーター設定ページで、max_concurrent_queries パラメーターの パラメーター値の実行 列の編集アイコンをクリックします。

  5. ダイアログボックスに新しい値を入力し、を決定 をクリックします。

  6. パラメーターの送信 をクリックします。

  7. を決定 をクリックします。

データ書き込みが停止した後のクエリ結果の不整合

問題の説明:select count(*) を使用してデータをクエリする際に、データの総量の約半分しか返されない、または結果が変動します。

以下の解決策を検討してください。

  • マルチノードクラスターを使用しているかどうかを確認します。マルチノードクラスターでは、分散テーブルを作成する必要があります。このテーブルに書き込みおよびクエリを実行することで、一貫した結果を得られます。これを行わないと、各クエリが異なるシャードにヒットする可能性があります。分散テーブルの作成

  • マスターレプリカクラスターを使用しているかどうかを確認します。マスターレプリカクラスターでは、レプリカ間でデータを同期するために Replicated シリーズのテーブルエンジンを使用するテーブルを作成する必要があります。これを行わないと、各クエリが異なるレプリカにヒットし、結果が一貫しなくなる可能性があります。Replicated シリーズのテーブルエンジンを使用したテーブルを作成するには、「テーブルエンジン」をご参照ください。

テーブルが表示されないおよびクエリ結果が変動する

一般的な原因と解決策:

  • 原因 1:テーブル作成プロセスが正しくありません。ClickHouse 分散クラスターには、ネイティブの分散 DDL セマンティクスがありません。セルフマネージド ClickHouse クラスターで create table ステートメントを使用すると、成功メッセージが返される場合がありますが、テーブルは現在接続しているサーバーにのみ作成されます。別のサーバーに接続すると、テーブルは表示されません。

    解決策:

    1. テーブルを作成する際は、create table <table_name> on cluster default ステートメントを使用します。on cluster default 句により、ステートメントがデフォルトクラスターのすべてのノードにブロードキャストされます。

      CREATE TABLE test ON cluster default (a UInt64) Engine = MergeTree() ORDER BY tuple();
    2. test テーブルの上に分散テーブルエンジンを使用した別のテーブルを作成します。

      CREATE TABLE test_dis ON cluster default AS test Engine = Distributed(default, default, test, cityHash64(a));
  • 原因 2:ReplicatedMergeTree テーブルの設定が誤っています。ReplicatedMergeTree テーブルエンジンは、マスターレプリカ同期を提供する MergeTree テーブルエンジンの拡張版です。シングルレプリカインスタンスでは、MergeTree エンジンを使用したテーブルのみを作成できます。マスターレプリカインスタンスでは、ReplicatedMergeTree エンジンを使用したテーブルを作成する必要があります。

    解決策:マスターレプリカインスタンスでテーブルを作成する際は、ReplicatedMergeTree('/clickhouse/tables/{database}/{table}/{shard}', '{replica}') または ReplicatedMergeTree() を使用して、ReplicatedMergeTree テーブルエンジンを設定します。ReplicatedMergeTree('/clickhouse/tables/{database}/{table}/{shard}', '{replica}') の引数は固定テンプレートの一部であり、変更しないでください。

タイムスタンプデータの不整合

SELECT timezone() を実行して、タイムゾーンがローカルタイムゾーンであるかどうかを確認します。そうでない場合は、「timezone」設定項目をローカルタイムゾーンに設定します。「設定項目の実行時パラメーター値の変更」の手順をご参照ください。

作成後のテーブルが見つからない

この問題は、DDL ステートメントが 1 つのノードでのみ実行された場合に発生することがよくあります。

この問題を解決するには、DDL ステートメントに on cluster 句を含めるようにしてください。テーブル作成構文

Kafka 外部テーブルに新しいデータがない

まず、Kafka 外部テーブルに対して select * from クエリを実行します。クエリが失敗する場合は、エラーメッセージを確認します。これは多くの場合、データ解析エラーが原因です。クエリが結果を返す場合は、宛先テーブル(Kafka 外部テーブルの基盤となるストレージテーブル)と Kafka 外部テーブルのフィールドが一致しているかどうかを確認します。データ書き込みが失敗する場合は、フィールドが一致していません。例:

insert into <destination table> as select * from <Kafka external table>;

クライアントの時刻とタイムゾーンの不一致

この問題は、use_client_time_zone 設定が誤ったタイムゾーンで設定されている場合に発生します。

書き込み操作後のデータが表示されない?

症状:テーブルにデータを書き込んだ後、後続のクエリでデータが見つかりません。

原因:考えられる原因は以下のとおりです。

  • 分散テーブルとローカルテーブルのスキーマが不整合です。

  • 分散テーブルにデータを書き込んだ後、一時ファイルの分散が完了していません。

  • マスターレプリカクラスターで 1 つのレプリカにデータを書き込んだ後、レプリカ同期が完了していません。

分析と解決策

スキーマの不整合

system.distribution_queue システムテーブルをクエリして、分散テーブルへの書き込み中にエラーが発生していないかを確認します。

ファイル分散の未完了

原因分析:マルチノード ApsaraDB for ClickHouse クラスターでは、アプリケーションがドメイン名を使用してデータベースに接続し、分散テーブルに対して INSERT ステートメントを実行すると、フロントエンドの Server Load Balancer (SLB) がリクエストをクラスター内のランダムなノードにルーティングします。リクエストを受信したノードは、データの一部をローカルディスクに書き込み、残りを一時ファイルとして保存します。これらのファイルはその後、非同期に他のノードに分散されます。分散プロセスが完了する前にクエリを実行すると、分散されていないデータが返されない可能性があります。

解決策:アプリケーションで書き込み後の読み取りの一貫性が求められる場合は、INSERT ステートメントに settings insert_distributed_sync = 1 句を追加します。この設定により、INSERT 操作が同期モードに切り替わります。ステートメントは、データがすべてのノードに分散された後にのみ成功メッセージを返します。

重要
  • この設定を有効にすると、データ分散が完了するのを待つ必要があるため、INSERT ステートメントの実行時間が長くなります。アプリケーションのデータ整合性と書き込みパフォーマンスのトレードオフを評価してください。

  • この設定はクラスターレベルで適用されるため、慎重に使用してください。まず、単一のクエリでこの設定をテストします。結果を確認した後、ビジネス要件に応じてクラスターレベルで適用してください。

  • 単一のクエリにこの設定を適用するには、ステートメントの末尾に追加します。例:

    INSERT INTO <table_name> values() settings insert_distributed_sync = 1;
  • クラスターレベルでこの設定を適用するには、user.xml ファイルで設定します。user.xml パラメーターの設定

レプリカ同期の未完了

原因分析:マスターレプリカ ApsaraDB for ClickHouse クラスターでは、INSERT ステートメントを実行すると、クラスターがランダムに選択されたレプリカで操作を実行します。その後、データが非同期に他のレプリカに同期されます。同期が完了する前に後続の SELECT クエリが同期されていないレプリカにルーティングされると、期待されるデータが返されない可能性があります。

解決策:アプリケーションで書き込み後の読み取りの一貫性が求められる場合は、INSERT ステートメントに settings insert_quorum = 2 句を追加します。この設定により、レプリカ同期が同期モードで強制的に実行されます。INSERT ステートメントは、両方のレプリカでデータ同期が完了した後にのみ成功メッセージを返します。

重要

このパラメーターを使用する際は、以下の点に注意してください。

  • この設定を有効にすると、レプリカ同期が完了するのを待つ必要があるため、INSERT ステートメントの実行時間が長くなります。アプリケーションのデータ整合性と書き込みパフォーマンスのトレードオフを評価してください。

  • このパラメーターを設定すると、INSERT 操作はレプリカ間の同期が成功するまで待機する必要があります。つまり、レプリカが利用できない場合、insert_quorum = 2 で設定されたすべての書き込み操作が失敗し、デュアルレプリカ構成の信頼性保証と矛盾します。

  • この設定はクラスターレベルで適用されるため、慎重に使用してください。まず、単一のクエリでこの設定をテストします。結果を確認した後、ビジネス要件に応じてクラスターレベルで適用してください。

  • 単一のクエリにこの設定を適用するには、ステートメントの末尾に追加します。例:

    INSERT INTO <table_name> values() settings insert_quorum = 2;
  • クラスターレベルでこの設定を適用するには、user.xml ファイルで設定します。user.xml パラメーターの設定

TTL が期限切れのデータを削除しない理由

症状

テーブルに TTL が正しく設定されていますが、テーブル内の期限切れデータが自動的に削除されず、TTL 設定が有効になっていません。

トラブルシューティング手順

  1. テーブルの TTL 設定が妥当かどうかを確認します。

    ビジネス要件に基づいて TTL を設定します。日単位での TTL 設定を推奨し、秒または分単位の設定(例:TTL event_time + INTERVAL 30 SECOND)は避けてください。

  2. materialize_ttl_after_modify パラメーターを確認します。

    このパラメーター は、ALTER MODIFY TTL ステートメントを実行した後、新しい TTL ルールを既存のデータに適用するかどうかを制御します。デフォルト値は 1(有効)です。値が 0 の場合、ルールは新しいデータにのみ適用され、既存のデータは TTL の影響を受けません。

    • パラメーター設定を確認します

      SELECT * FROM system.settings WHERE name like 'materialize_ttl_after_modify';
    • パラメーター設定を変更します

      重要

      このコマンドはすべての既存データをスキャンするため、リソース負荷が高くなります。慎重に使用してください。

      ALTER TABLE $table_name MATERIALIZE TTL;
  3. パーティションクリーンアップ戦略を診断します。

    ttl_only_drop_parts パラメーター 1 に設定されている場合、ClickHouse はデータパーツ内のすべての行が期限切れになった場合にのみ、そのデータパーツを削除します。

    • ttl_only_drop_parts パラメーター設定を確認します

      SELECT * FROM system.merge_tree_settings WHERE name LIKE 'ttl_only_drop';
    • パーティションの有効期限ステータスを確認します

      SELECT partition, name, active, bytes_on_disk, modification_time, min_time, max_time, delete_ttl_info_min, delete_ttl_info_max FROM system.parts c WHERE database = 'your_dbname' AND TABLE = 'your_tablename' LIMIT 100;
      • delete_ttl_info_min: このパーツの TTL DELETE ルールで使用される最小 datetime キー値。

      • delete_ttl_info_max: このパーツの TTL DELETE ルールで使用される最大 datetime キー値。

    • パーティションと TTL ルールが一致しない場合、一部のデータがすぐにクリーンアップされない可能性があります。パーティションと TTL ルールの相互作用について以下に説明します。

      • パーティションと TTL ルールが一致している場合(例:日別パーティションと日別 TTL)、ClickHouse はパーティション ID に基づいて有効期限を判断し、パーティション全体を一度に削除できます。これが最も効率的な戦略です。 最適なパフォーマンスを得るには、パーティション戦略(日別など)と ttl_only_drop_parts=1 を組み合わせて、期限切れデータを効率的に削除することを推奨します。

      • ルールが一致せず、ttl_only_drop_parts = 1 の場合、ClickHouse は各パーツの TTL 情報をチェックします。 パーツ内のすべてのデータが delete_ttl_info_max タイムスタンプを超えた後にのみ、パーツが削除されます。

      • ルールが一致せず、ttl_only_drop_parts = 0 の場合、ClickHouse は各パーツ内のデータをスキャンして、個々の期限切れ行を検索および削除する必要があります。これが最もリソース集約的な戦略です。

  4. マージトリガー頻度を制御します。

    期限切れデータは、リアルタイムではなくマージ中に非同期に削除されます。 merge_with_ttl_timeout パラメーターを使用してマージ頻度を制御するか、ALTER TABLE ... MATERIALIZE TTL ステートメントを使用して TTL マテリアライズを強制できます。

    • パラメーターを確認します

      SELECT * FROM system.merge_tree_settings WHERE name = 'merge_with_ttl_timeout';
      説明

      単位は秒です。オンラインインスタンスのデフォルト値は 7200 秒(2 時間)です。

    • パラメーターを変更します

      もし merge_with_ttl_timeout が高すぎると設定されている場合、TTL マージトリガーの頻度が低下し、期限切れデータのクリーンアップが遅れます。このパラメーターを下げることで、クリーンアップ頻度を上げることができます。詳細については、パラメーターの説明をご参照ください。

  5. スレッドプールパラメーター設定を確認します。

    TTL データ削除はパーツマージフェーズ中に実行され、max_number_of_merges_with_ttl_in_pool(オンラインインスタンスのデフォルト値:2)および background_pool_size(オンラインインスタンスのデフォルト値:16)パラメーターによって制限されます。

    • 現在のバックグラウンドスレッドアクティビティをクエリします

      SELECT * FROM system.metrics WHERE metric LIKE 'Background%';

      BackgroundPoolTask メトリックは、バックグラウンドプールで現在アクティブなタスク数を示します。

    • パラメーターを変更します

      他のパラメーター設定が正しく、CPU 使用率が低い場合は、ビジネスニーズに基づいて max_number_of_merges_with_ttl_in_pool パラメーターを 2 から 4 に、または 4 から 8 に増やすことを検討してください。これで問題が解決しない場合は、background_pool_size パラメーターを増やすことを検討してください。

      重要

      max_number_of_merges_with_ttl_in_pool パラメーターを調整する場合は、クラスターを再起動する必要があります。background_pool_size パラメーターを増やす場合はクラスターを再起動する必要はありませんが、background_pool_size パラメーターを減らす場合はクラスターを再起動する必要があります。

  6. テーブルスキーマとパーティション設計が妥当かどうかを確認します。

    テーブルが効果的にパーティション化されていない場合、またはパーティション粒度が粗すぎる場合、TTL クリーンアップ効率が低下します。効率的なクリーンアップのためには、パーティション粒度と TTL 粒度を一致させることを推奨します(例:両方を日単位の間隔に設定)。詳細については、 ベストプラクティス を参照してください。

  7. クラスターに十分なディスク領域があるかどうかを確認します。

    バックグラウンドマージ操作は TTL クリーンアップをトリガーし、利用可能なディスク領域を必要とします。大規模なデータパーツまたはディスク領域不足(例:使用率が 90% を超える)により、マージ操作およびそれに続く TTL 削除が防止される可能性があります。

  8. system.merge_tree_settings の他のシステムパラメーターを確認します。

    • merge_with_recompression_ttl_timeout: 再圧縮 TTL を伴うマージが繰り返されるまでの最小遅延。デフォルトでは、TTL ルールが少なくとも 4 時間ごとにテーブルに適用されることを意味します。TTL ルールをより頻繁に適用する必要がある場合は、この値を下げてください

    • max_number_of_merges_with_ttl_in_pool: このパラメーターは、TTL タスクに利用可能な最大スレッド数を制御します。バックグラウンドスレッドプールで TTL を伴うマージタスクが進行中の数がこの値を超えると、ClickHouse は新しい TTL を伴うマージタスクをスケジュールしません。

OPTIMIZE タスクが遅い

OPTIMIZE タスクは CPU およびディスクスループットを集中的に使用します。同時実行クエリと競合し、同じシステムリソースを争います。そのため、ノードの負荷が重い場合、OPTIMIZE タスクの実行が遅くなる可能性があります。現時点では、特定の最適化方法は利用できません。

OPTIMIZE 後のプライマリキーマージの失敗

primary key merge が正しく機能するには、次の 2 つの前提条件を満たす必要があります。

  • ORDER BY キーに ストレージテーブルパーティションキー が含まれている必要があります。primary key merge は異なるパーティション間では実行されません。

  • 分散テーブル の場合、ORDER BY キーに ハッシュアルゴリズム で決定されるシャーディングキーが含まれている必要があります。primary key merge は異なるノード間では実行されません。

次の表は、一般的な optimize コマンドとその動作を説明しています。

コマンド

説明

optimize table test;

このコマンドは、MergeTree データパーツ の選択とマージを試みますが、何も実行せずに戻る場合があります。実行されたとしても、テーブル内のすべてのレコードに対して完全な primary key merge が保証されるわけではありません。このコマンドは一般的に推奨されません。

optimize table test partition tuple();

このコマンドは特定の パーティション を対象とし、その データパーツ をすべてマージします。何も実行せずに戻る場合があります。タスクが完了すると、指定された パーティション 内のすべてのデータが単一の データパーツ に統合され、その パーティションprimary key merge が完了します。ただし、タスク実行中に書き込まれたデータはマージに含まれません。パーティション がすでに単一の データパーツ で構成されている場合、タスクは再度実行されません。

説明

パーティションキー を持たないテーブルの場合、デフォルトの パーティションtuple() です。

optimize table test final;

このコマンドは、テーブル内のすべてのパーティションのマージを強制的に実行します。パーティションがすでに単一の データパーツ で構成されている場合でも、再マージが実行されます。これは、TTL(Time to Live)を超えたレコードの削除を強制的に実行するのに役立ちます。この操作は最もリソースを集中的に使用し、それでもマージを実行せずに戻る場合があります。

これらの optimize コマンドのいずれにも、optimize_throw_if_noop パラメーターを設定できます。このパラメーターを有効にすると、コマンドがマージを実行しない場合に例外がスローされるため、タスクが実際に実行されたかどうかを判断できます。

OPTIMIZE 後のデータ TTL の無効化

一般的な原因とその解決策を以下に示します。

  • 原因 1:データ TTL のエビクションはプライマリキーマージフェーズ中に発生します。データパーツが長期間マージされない場合、その中に含まれる期限切れデータをシステムがエビクションできません。

    解決策:

    • optimize final または 特定のパーティションの optimize を実行して、マージタスクを手動でトリガーできます。

    • テーブル作成時に、期限切れデータを含むデータパーツをより頻繁にマージするための merge_with_ttl_timeout や ttl_only_drop_parts などのパラメーターを設定できます。

  • 原因 2:テーブルの TTL が変更または追加された場合、既存のデータパーツに TTL 情報が欠落しているか、不正確である可能性があります。これにより、期限切れデータのエビクションが妨げられる可能性があります。

    解決策:

    • alter table materialize ttl を実行して、TTL 情報を再生成できます。

    • optimize partition を実行して、TTL 情報を更新できます。

OPTIMIZE 後の更新および削除が有効にならない

ApsaraDB for ClickHouse は、更新および削除操作を非同期に実行します。このプロセスを直接制御することはできませんが、system.mutations システムテーブルをクエリすることで進行状況を監視できます。

DDL によるカラムの追加、削除、または変更

ローカルテーブルを変更するには、DDL ステートメントを実行します。分散テーブルの場合は、テーブルにデータが書き込まれているかどうかによって手順が異なります。

  • テーブルにデータが書き込まれていない場合、まずローカルテーブルを変更し、次に分散テーブルを変更します。

  • テーブルにデータが書き込まれている場合、変更の種類によって手順が異なります。

    種類

    操作

    NULL 許容カラムの追加

    1. ローカルテーブルを変更します。

    2. 分散テーブルを変更します。

    カラムのデータ型の変更(変換可能な型)

    NULL 許容カラムの削除

    1. 分散テーブルを変更します。

    2. ローカルテーブルを変更します。

    NULL 非許容カラムの追加

    1. データ書き込みを停止します。

    2. 分散テーブルで SYSTEM FLUSH DISTRIBUTED を実行します。

    3. ローカルテーブルを変更します。

    4. 分散テーブルを変更します。

    5. データ書き込みを再開します。

    NULL 非許容カラムの削除

    カラム名の変更

DDL 操作の遅延と停止

これは、グローバル DDL 実行が逐次的であり、複雑なクエリがデッドロックを引き起こすことが原因であることが多いです。

以下の解決策をお試しください。

  • 操作が完了するまで待ちます。

  • コンソールでクエリを終了させてみてください。

分散 DDL タスクタイムアウトエラー

デフォルトのタイムアウトを、set global on cluster default distributed_ddl_task_timeout=xxx を実行して変更します(xxx は秒単位のタイムアウト値)。クラスターパラメーターの変更

構文エラー: 「set global on cluster default」

  • 原因 1:ClickHouse クライアントが構文を解析します。ただし、set global on cluster default はサーバー側の構文です。クライアントバージョンがサーバーと互換性がない場合、クライアントがこのステートメントをブロックします。

    解決策:

    • クライアント側の構文解析を行わないツールを使用します。例:DataGrip や DBeaver などの JDBC ベースのツール。

    • JDBC プログラムを記述してステートメントを実行します。

  • 原因 2:set global on cluster default key = value; ステートメントで、value が文字列であるにもかかわらず、引用符で囲まれていません。

    解決策:文字列値を引用符で囲んでください。

推奨される BI ツール

Quick BI を推奨します。

推奨されるデータクエリ IDE

DataGrip、DBeaver。

ベクトル検索のサポート

はい。ApsaraDB for ClickHouse はベクトル検索をサポートしています。関連リソース:

ON CLUSTER is not allowed for Replicated database エラーの解決方法

クラスターが Enterprise Edition クラスターで、テーブル作成ステートメントに ON CLUSTER default が含まれている場合、ON CLUSTER is not allowed for Replicated database エラーが発生することがあります。この問題は、一部のマイナーバージョンで発生します。これを解決するには、インスタンスを最新バージョンにアップグレードします。手順については、「マイナーエンジンバージョンのアップグレード」をご参照ください。

Double-distributed IN/JOIN subqueries is denied (distributed_product_mode = 'deny') エラーの解決方法

問題:マルチノード Community Edition クラスターを使用している場合、クエリで複数の分散テーブルを結合するために JOIN または IN を使用すると、Exception: Double-distributed IN/JOIN subqueries is denied (distributed_product_mode = 'deny').  というエラーが発生することがあります。

原因:クエリで複数の分散テーブルを結合すると、クエリの増幅が発生する可能性があります。たとえば、3 ノードクラスターでは、2 つの分散テーブル間の結合クエリが、基盤となるローカルテーブルで 3 x 3 のサブクエリに展開されます。これにより、リソースが大幅に消費され、レイテンシが増加します。これを防ぐために、システムはデフォルトでこれらのクエリをブロックします。

動作原理IN または JOIN 演算子を GLOBAL IN または GLOBAL JOIN に置き換えることで、エンジンに右側のサブクエリを単一ノードで実行するよう指示します。結果は一時テーブルに格納され、その後すべての他のノードにブロードキャストされて、ローカルで結合が完了します。

GLOBAL IN または GLOBAL JOIN の使用による影響

  • 一時テーブルがすべてのリモートサーバーに送信されます。大規模なデータセットではこの戦略を避けてください。

  • GLOBAL IN または GLOBAL JOINremote() 関数とともに使用すると、不正確な結果が生成される可能性があります。これは、サブクエリが外部インスタンスで実行されるべきところを、現在のインスタンスで実行されるためです。

    たとえば、instance_a で次のステートメントを実行して、外部インスタンス cc-bp1wc089c**** からデータをクエリします。

    SELECT *
    FROM remote('cc-bp1wc089c****.clickhouse.ads.aliyuncs.com:3306', `default`, test_tbl_distributed1, '<your_Account>', '<YOUR_PASSWORD>')
    WHERE id GLOBAL IN
        (SELECT id
         FROM test_tbl_distributed1);

    この場合、instance_a はサブクエリ SELECT id FROM test_tbl_distributed1 を実行して一時テーブル(仮に temp_table_A と呼びます)を生成します。temp_table_A のデータはその後、外部インスタンス cc-bp1wc089c**** に送信され、最終クエリが実行されます。外部インスタンス cc-bp1wc089c**** は最終的にステートメント SELECT * FROM default.test_tbl_distributed1 WHERE id IN (temp_table_A); を実行します。

    問題は、一時テーブル内のデータのソースにあります。

    上記の説明に基づくと、インスタンス cc-bp1wc089c**** が実行する最終ステートメントは SELECT * FROM default.test_tbl_distributed1 WHERE id IN (temporary table A); です。ただし、一時テーブル A の条件セットはインスタンス a で生成されます。この例では、インスタンス cc-bp1wc089c****SELECT * FROM default.test_tbl_distributed1 WHERE id IN (SELECT id FROM test_tbl_distributed1 ); を実行し、条件セットがインスタンス cc-bp1wc089c**** から取得されるべきでした。したがって、GLOBAL IN または GLOBAL JOIN の使用により、サブクエリが誤ったソースから条件セットを取得し、結果が不正確になります。

解決策

解決策 1:アプリケーションの SQL コードを変更して、IN または JOIN を手動で GLOBAL IN または GLOBAL JOIN に置き換えます。

たとえば、次のステートメントを変更します。

SELECT * FROM test_tbl_distributed WHERE id IN (SELECT id FROM test_tbl_distributed1);

宛先:

SELECT * FROM test_tbl_distributed WHERE id GLOBAL IN (SELECT id FROM test_tbl_distributed1);

解決策 2distributed_product_mode または prefer_global_in_and_join システムパラメーターを変更して、システムが自動的に IN または JOINGLOBAL IN または GLOBAL JOIN に変換するようにします。

distributed_product_mode

次のステートメントを実行して、distributed_product_modeglobal に設定します。この設定により、必要に応じて標準の IN または JOIN 操作が自動的に GLOBAL IN または GLOBAL JOIN クエリに変換されます。

SET GLOBAL ON cluster default distributed_product_mode='global';

使用方法

  • 目的:ClickHouse が分散サブクエリを処理する方法を制御します。

  • 値:

    • deny(デフォルト):分散 IN および JOIN サブクエリを禁止し、「Double-distributed IN/JOIN subqueries is denied」 例外をスローします。

    • local:サブクエリをターゲットシャードのローカルテーブルを使用するように書き換え、標準の IN または JOIN 演算子を保持します。

    • globalIN または JOIN クエリを GLOBAL IN または GLOBAL JOIN クエリに変換します。

    • allow:標準の IN および JOIN サブクエリを許可しますが、クエリの増幅が発生する可能性があります。

  • 適用シナリオ:複数の分散テーブルを結合するために IN または JOIN を使用するクエリにのみ適用されます。

prefer_global_in_and_join

prefer_global_in_and_join

次のステートメントを実行して、prefer_global_in_and_join パラメーターを 1 に設定します。この設定により、標準の IN または JOIN 操作が自動的に GLOBAL IN または GLOBAL JOIN に変換されます。

SET GLOBAL ON cluster default prefer_global_in_and_join = 1;

使用方法

  • 目的:IN および JOIN 演算子の動作を制御します。

  • 値:

    • 0(デフォルト):分散 IN および JOIN サブクエリを禁止し、「Double-distributed IN/JOIN subqueries is denied」 例外をスローします。

    • 1:分散 IN および JOIN サブクエリを有効にして、自動的に GLOBAL IN または GLOBAL JOIN クエリに変換します。

  • 適用シナリオ:複数の分散テーブルを結合するために IN または JOIN を使用するクエリにのみ適用されます。

テーブルディスク領域の表示

各テーブルが使用しているディスク領域を表示するには、次のクエリを実行します。

SELECT table, formatReadableSize(sum(bytes)) as size, min(min_date) as min_date, max(max_date) as max_date FROM system.parts WHERE active GROUP BY table; 

コールドデータサイズの表示

次のクエリ例を示します。

SELECT * FROM system.disks;

コールドストレージ内のデータのクエリ

次のクエリを使用します。

SELECT * FROM system.parts WHERE disk_name = 'cold_disk';

パーティションデータをコールドストレージに移動

データパーティションをコールドストレージに移動するには、次のステートメントを実行します。

ALTER TABLE table_name MOVE PARTITION partition_expr TO DISK 'cold_disk';

モニタリングデータのギャップ

一般的な原因は以下のとおりです。

  • OOM エラーをトリガーするクエリ。

  • 設定変更によってトリガーされたインスタンスの再起動。

  • アップグレードまたはスペックダウン後のインスタンスの再起動。

データ移行なしのスムーズなアップグレード

ClickHouse クラスターがスムーズなアップグレードをサポートするかどうかは、その作成日付によって異なります。2021 年 12 月 1 日以降に購入されたクラスターは、データ移行なしで新しいメジャーエンジンバージョンへのインプレーススムーズアップグレードをサポートします。2021 年 12 月 1 日以前に購入されたクラスターは、新しいメジャーエンジンバージョンにアップグレードするにはデータ移行が必要です。アップグレード手順については、「メジャーエンジンバージョンのアップグレード」をご参照ください。

一般的なシステムテーブル

次の表は、一般的なシステムテーブルとその機能を説明しています。

パラメーター

説明

system.processes

現在実行中の SQL ステートメントに関する情報を含みます。

system.query_log

実行された SQL ステートメントのログを含みます。

system.merges

クラスター上のマージ操作に関する情報を含みます。

system.mutations

クラスター上のミューテーション操作に関する情報を含みます。

システムレベルのパラメーターの変更

システムレベルのパラメーターは、config.xml ファイルの設定に対応しています。これらのパラメーターを変更するには、次の手順を実行します。

  1. ApsaraDB for ClickHouse コンソール にログインします。

  2. クラスターリスト ページで、Community Edition インスタンスのリスト を選択し、対象のクラスター ID をクリックします。

  3. 左側のナビゲーションウィンドウで、パラメーター設定 をクリックします。

  4. パラメーター設定ページで、max_concurrent_queries パラメーターの パラメーター値の実行 列の編集アイコンをクリックします。

  5. ダイアログボックスに新しい値を入力し、を決定 をクリックします。

  6. パラメーターの送信 をクリックします。

  7. を決定 をクリックします。

を決定 をクリックした後、clickhouse-server プロセスが自動的に再起動され、約 1 分間の瞬断が発生します。

ユーザーレベルのパラメーターの変更

ユーザーレベルのパラメーターは、users.xml ファイルの設定項目に対応しています。パラメーターを変更するには、次のステートメントを実行します。

SET global ON cluster default ${key}=${value};

特に指定がない限り、変更は即座に有効になります。

クォータの変更

実行ステートメントの settings にクォータパラメーターを指定します。

settings max_memory_usage = XXX;

ノード間の CPU およびメモリ使用量のばらつき

デュアルレプリカ または シングルレプリカ のマルチノード クラスターでは、書き込みノード は大量の 書き込み操作 中に他の ノード よりも CPU 使用量 および メモリ使用量 が高くなります。データが同期されると、使用量はノード間で均等になります。

詳細なシステムログの表示

  • 問題の説明:

    エラーのトラブルシューティングや潜在的な問題の特定のために、詳細なシステムログを表示する方法。

  • 解決策:

    1. クラスターの text_log.level パラメーターを確認し、以下のいずれかを実行します。

      1. text_log.level が空の場合、テキストロギングは無効になっています。これを有効にするには、このパラメーターに値を設定します。

      2. text_log.level に値が設定されている場合、ログレベルが要件を満たしているかどうかを確認します。満たしていない場合は、パラメーターを目的のレベルに変更します。

      text_log.level パラメーターの表示および変更方法については、「config.xml パラメーターの設定」をご参照ください。

    2. 対象のデータベースに接続します。データベースへの接続

    3. 次のステートメントを実行してログを表示および分析します。

      SELECT * FROM system.text_log;

ネットワーク接続の問題の解決

送信先クラスターとデータソースが同じ VPC およびリージョン内にある場合は、それぞれの IP アドレスが相手のホワイトリストに含まれていることを確認します。

  • ClickHouse でホワイトリストを設定するには、「ホワイトリストの設定」をご参照ください。

  • 他のデータソースについては、それぞれのプロダクトドキュメントをご参照ください。

上記の条件を満たしていない場合は、まず適切なネットワークソリューションを使用して接続性を確立します。その後、それぞれの IP アドレスを相手のホワイトリストに追加します。

シナリオ

解決策

ハイブリッドクラウド接続

オンプレミスとクラウド間のネットワーク相互接続

クロスリージョンおよびクロスアカウントの VPC 接続

クロスアカウント VPC 間接続

同一リージョン、異なる VPC 間の接続

Cloud Enterprise Network を使用した同一リージョン VPC 接続(Basic Edition)

クロスリージョンおよびクロスアカウントの VPC 接続

Cloud Enterprise Network を使用したクロスリージョンおよびクロスアカウント VPC 間接続(Basic Edition)

パブリックネットワーク接続

インターネット NAT Gateway SNAT を使用したインターネットアクセス

アドレスの競合

VPC NAT Gateway を使用したアドレス競合の解決

Community Edition から Enterprise Edition への移行

はい、ClickHouse Community Edition クラスターを Enterprise Edition クラスターに移行できます。

Enterprise Edition と Community Edition クラスター間でデータを移行するには、主に remote 関数を使用する方法と、データファイルをエクスポートおよびインポートする方法の 2 通りがあります。詳細な手順については、「セルフマネージド ClickHouse クラスターから Alibaba Cloud ClickHouse Community-Compatible Edition へのデータ移行」をご参照ください。

データ移行中のスキーマの不整合

問題の説明

データ移行には、すべてのシャード間でデータベースおよびテーブルスキーマを一致させる必要があります。そうでない場合、一部のデータベースまたはテーブルの移行が失敗する可能性があります。

解決策

  • MergeTree テーブル(マテリアライズドビューの内部テーブルではない)のスキーマがシャード間で不整合です。

    ビジネスロジックがシャード間のスキーマの違いを引き起こしていないか調査します。

    • すべてのシャードでテーブルスキーマを同一にすることを想定している場合、テーブルを再作成して一貫性を確保する必要があります。

    • ビジネスロジックで意図的にシャード間で異なるテーブルスキーマを使用している場合、チケットを起票してテクニカルサポートに連絡してください。

  • マテリアライズドビューの内部テーブルがシャード間で不整合です。

    • 解決策 1:内部テーブルの名前を変更し、マテリアライズドビューおよび分散テーブルを明示的にターゲット MergeTree テーブルを指すようにします。次の手順では、元のマテリアライズドビュー up_down_votes_per_day_mv を例として使用します。

      1. すべてのノードに存在しないテーブルを一覧表示します。NODE_NUM = シャード数 × レプリカ数。

        SELECT database,table,any(create_table_query) AS sql,count() AS cnt
        FROM cluster(default, system.tables)
        WHERE database NOT IN ('system', 'information_schema', 'INFORMATION_SCHEMA')
        GROUP BY  database, table
        HAVING cnt != <NODE_NUM>;
      2. 内部テーブルの数が正しくないマテリアライズドビューを特定します。

        SELECT substring(hostName(),38,8) AS host,*
        FROM cluster(default, system.tables)
        WHERE uuid IN (<UUID1>, <UUID2>, ...);
      3. デフォルトのクラスター同期動作を無効にします。この手順は ApsaraDB for ClickHouse クラスターには必要ですが、セルフマネージド ClickHouse クラスターには必要ありません。その後、内部テーブルの名前を変更して、すべてのノードで一貫性を確保します。運用リスクを軽減するために、各ノードの IP アドレスを取得し、ポート 3005 に接続して、次のステートメントを各ノードで個別に実行します。

        SELECT count() FROM mv_test.up_down_votes_per_day_mv;
        SET enforce_on_cluster_default_for_ddl=0; 
        RENAME TABLE `mv_test`.`.inner_id.9b40675b-3d72-4631-a26d-25459250****` TO `mv_test`.`up_down_votes_per_day`;
      4. マテリアライズドビューを削除します。次のステートメントを各ノードで個別に実行します。

        SELECT count() FROM mv_test.up_down_votes_per_day_mv;
        SET enforce_on_cluster_default_for_ddl=0; 
        DROP TABLE mv_test.up_down_votes_per_day_mv;
      5. 内部テーブルを明示的に指す新しいマテリアライズドビューを作成します。次のステートメントを各ノードで個別に実行します。

        SELECT count() FROM mv_test.up_down_votes_per_day_mv;
        SET enforce_on_cluster_default_for_ddl=0; 
        CREATE MATERIALIZED VIEW mv_test.up_down_votes_per_day_mv TO `mv_test`.`up_down_votes_per_day`
        (
            `Day` Date,
            `UpVotes` UInt32,
            `DownVotes` UInt32
        ) AS
        SELECT toStartOfDay(CreationDate) AS Day,
               countIf(VoteTypeId = 2) AS UpVotes,
               countIf(VoteTypeId = 3) AS DownVotes
        FROM mv_test.votes
        GROUP BY Day;

        : マテリアライズドビューの定義では、ターゲットテーブルの列を明示的に定義する必要があります。SELECT 文からの型推論に依存しないでください。これにより予期しないエラーが発生する可能性があります。たとえば、tcp_cn という名前の列が SELECT 文で sumIfState のような集計状態関数を使用して計算される場合、ターゲットテーブルでその型を AggregateFunction(例: AggregateFunction(sum, Float64))として定義する必要があります。

        正しい使用方法

        CREATE MATERIALIZED VIEW net_obs.public_flow_2tuple_1m_local TO net_obs.public_flow_2tuple_1m_local_inner
        (
         ... 
        tcp_cnt AggregateFunction(sum, Float64),
        ) AS
        SELECT
        ...
        sumIfState(pkt_cnt, protocol = '6') AS tcp_cnt,
        FROM net_obs.public_flow_5tuple_1m_local
        ...

        誤った使用方法

        CREATE MATERIALIZED VIEW net_obs.public_flow_2tuple_1m_local TO net_obs.public_flow_2tuple_1m_local_inner AS
        SELECT
        ...
        sumIfState(pkt_cnt, protocol = '6') AS tcp_cnt,
        FROM net_obs.public_flow_5tuple_1m_local
        ...
    • 解決策 2:内部テーブルの名前を変更し、すべてのノードでマテリアライズドビューを再構築してから、古い内部テーブルからデータを移行します。

    • 解決策 3:マテリアライズドビューのデュアルライト戦略を実装し、7 日間データを同期させます。

Enterprise Edition 24.5 以降での SQL ステートメントの失敗

デフォルトでは、Enterprise Edition 24.5 以降のインスタンスは、クエリエンジンで新しいアナライザを使用します。この新しいアナライザはクエリパフォーマンスを向上させますが、一部のレガシー SQL ステートメントとの下位互換性がないため、解析エラーが発生する可能性があります。このエラーが発生した場合は、次のステートメントを実行してレガシーアナライザに戻します。詳細については、「新しいアナライザの詳細」をご参照ください。

SET allow_experimental_analyzer = 0;

クラスターの一時停止

一時停止機能は、Enterprise Edition クラスターでのみ利用できます。ClickHouse Community Edition クラスターは一時停止できません。Enterprise Edition クラスターを一時停止するには、[Enterprise Edition クラスターページ] に移動します。左上隅で対象のリージョンを選択します。クラスターリストで対象のクラスターを見つけ、image> [一時停止] を 操作 列でクリックします。

MergeTree テーブルを ReplicatedMergeTree に変換

問題の説明

ClickHouse に不慣れなユーザーが、マルチレプリカクラスターで誤って MergeTree エンジンを使用してテーブルを作成することがあります。これにより、各シャードのレプリカノード間でデータが同期されなくなります。その結果、対応する分散テーブルに対するクエリが一貫しない結果を返す可能性があります。この問題を解決するには、MergeTree テーブルを ReplicatedMergeTree テーブルに変換する必要があります。

解決策

ClickHouse には、テーブルのストレージエンジンを直接変更する DDL ステートメントがありません。MergeTree テーブルを ReplicatedMergeTree テーブルに変換するには、ReplicatedMergeTree エンジンを使用した新しいテーブルを作成し、元のテーブルからデータをインポートする必要があります。

たとえば、マルチレプリカクラスターに MergeTree テーブル table_src とその対応する分散テーブル table_src_d があると仮定します。この MergeTree テーブルを ReplicatedMergeTree テーブルに変換するには、次の手順を実行します。

  1. ターゲット ReplicatedMergeTree テーブル table_dst とその対応する分散テーブル table_dst_d を作成します。CREATE TABLE

  2. MergeTree テーブル table_src から table_dst_d にデータをインポートします。次の 2 つの方法のいずれかを使用できます。

説明
  • どちらの方法も、ローカル MergeTree テーブルからソースデータをクエリします。

  • データ量が少ない場合は、分散テーブル table_dst_d に直接データを挿入して、データを均等に分散させます。

  • 元の MergeTree テーブル table_src のデータがすでにすべてのノードに均等に分散されており、データ量が多い場合は、各ノードのローカル ReplicatedMergeTree テーブル table_dst に直接データを挿入できます。

  • データセットが大きい場合、インポートプロセスに長い時間がかかる可能性があります。remote() 関数を使用する場合は、適切なタイムアウト値を設定してください。

remote 関数の使用

  1. DMS を介して ClickHouse に接続

  2. 各ノードの IP アドレスを取得します。

    SELECT 
        cluster,
        shard_num,
        replica_num,
        is_local,
        host_address
    FROM system.clusters
    WHERE cluster = 'default';
    
  3. remote 関数を使用してデータをインポートします。

    前の手順で取得した IP アドレスを順番に remote() 関数に渡し、各アドレスに対してステートメントを実行します。

    INSERT INTO  table_dst_d SELECT * FROM remote('node1', db.table_src) ;

    たとえば、2 つのノードの IP アドレスが 10.10.0.16510.10.0.167 の場合、次の INSERT ステートメントを別々に実行します。

    INSERT INTO table_dst_d SELECT * FROM remote('10.10.0.167', default.table_src) ;
    INSERT INTO table_dst_d SELECT * FROM remote('10.10.0.165', default.table_src) ;

    すべてのノード IP アドレスに対してステートメントを実行すると、MergeTree テーブルが ReplicatedMergeTree テーブルに変換されます。

ローカルテーブルの使用

VPC 内に ClickHouse クライアントがインストールされた ECS インスタンスがある場合は、各ノードに個別にログオンして次の操作を実行できます。

  1. コマンドラインインターフェイスを使用して ClickHouse に接続

  2. 各ノードの IP アドレスを取得します。

    SELECT 
        cluster,
        shard_num,
        replica_num,
        is_local,
        host_address
    FROM system.clusters
    WHERE cluster = 'default';
  3. データをインポートします。

    IP アドレスを使用して各ノードに順番にログオンし、次のステートメントを実行します。

    INSERT INTO table_dst_d SELECT * FROM db.table_src ;

    すべてのノードでステートメントを実行すると、MergeTree テーブルが ReplicatedMergeTree テーブルに変換されます。

同じセッションで複数の SQL ステートメントを実行

一意の session_id を設定することで、ClickHouse サーバーが同じ セッション ID を持つリクエストに対して一貫したコンテキストを維持し、単一のセッションで複数の SQL ステートメントを実行できるようになります。この例では、ClickHouse Java Client (V2) を使用する方法を示します。

  1. Maven プロジェクトの pom.xml ファイルに依存関係を追加します。

    <dependency>
        <groupId>com.clickhouse</groupId>
        <artifactId>client-v2</artifactId>
        <version>0.8.2</version>
    </dependency>
  2. CommandSettings でカスタム セッション ID を設定します。

    package org.example;
    
    import com.clickhouse.client.api.Client;
    import com.clickhouse.client.api.command.CommandSettings;
    public class Main {
    
        public static void main(String[] args) {
            Client client = new Client.Builder()
                    .addEndpoint("endpoint") // インスタンスエンドポイント
                    .setUsername("username")   // ユーザー名
                    .setPassword("password")   // パスワード
                    .build();
    
            try {
                client.ping(10);
                CommandSettings commandSettings = new CommandSettings();
                // session_id を設定
                commandSettings.serverSetting("session_id","examplesessionid");
                // セッションの max_block_size パラメーターを設定
                client.execute("SET max_block_size=65409 ",commandSettings);
                // クエリを実行
                client.execute("SELECT 1 ",commandSettings);
                client.execute("SELECT 2 ",commandSettings);
    
            } catch (Exception e) {
                throw new RuntimeException(e);
            } finally {
                client.close();
            }
        }
    }

この例では、両方の SELECT ステートメントが max_block_size 65409 の同じセッションで実行されます。ClickHouse Java Client の使用方法の詳細については、「Java Client | ClickHouse Docs」をご参照ください。

FINAL 重複排除が JOIN で失敗する理由

症状

FINAL キーワードを使用してクエリ結果の重複排除を行う際、SQL ステートメントに JOIN 句が含まれていると、重複排除が失敗し、出力に重複データが残ります。次の SQL ステートメントがその例です。

SELECT * FROM t1 FINAL JOIN t2 FINAL WHERE xxx;

原因

これは、ClickHouse で修正されていない既知のバグです。FINALJOIN の実行ロジックの競合により、重複排除が失敗します。詳細については、ClickHouse の issues を参照してください。

解決策

  • 解決策 1 (推奨):実験的オプティマイザーを有効にします。クエリレベルで FINAL を有効にするには、クエリに設定を追加します。この方法では、テーブルレベルでの宣言は不要です。例:

    元の SQL ステートメントが次のとおりの場合:

    SELECT * FROM t1 FINAL JOIN t2 FINAL WHERE xxx;

    テーブル名から FINAL キーワードを削除し、ステートメントの末尾に settings allow_experimental_analyzer = 1,FINAL = 1 を追加します。修正後のステートメントは次のとおりです。

    SELECT * FROM t1 JOIN t2 WHERE xxx  SETTINGS allow_experimental_analyzer = 1, FINAL = 1; 
    重要

    allow_experimental_analyzer パラメーターは バージョン 23.8 以降でのみサポートされています。23.8 より前のバージョンを使用している場合は、SQL ステートメントを変更する前にバージョンをアップグレードすることを推奨します。アップグレード方法の詳細については、「メジャーエンジンバージョンのアップグレード」をご参照ください。

  • 解決策 2 (慎重に使用):

    1. 事前に重複排除のために OPTIMIZE TABLE local_table_name FINAL を定期的に実行してマージを強制します。ただし、大規模テーブルでは I/O オーバーヘッドが大きいため、慎重に使用してください。

    2. SQL クエリを変更します:FINAL キーワードを削除します。これにより、データ重複排除はマージ済みデータのクエリに依存します。

    重要

    このアプローチは慎重に使用してください。この操作は I/O リソースを大量に消費し、大規模テーブルのパフォーマンスに影響を与える可能性があります。

DELETE または UPDATE 操作が完了しない理由

症状

ApsaraDB for ClickHouse Community-compatible Edition クラスターでデータ削除 (DELETE) または更新 (UPDATE) 操作を実行すると、タスクが長時間完了しないままになります。

原因

MySQL の同期操作とは異なり、ApsaraDB for ClickHouse Community-compatible Edition クラスターでの DELETE および UPDATE 操作は非同期であり、Mutation メカニズムに基づいて実行されます。したがって、変更はリアルタイムで有効になりません。Mutation のコアプロセスは次のとおりです。

  1. タスクの送信:ユーザーが ALTER TABLE ... UPDATE/DELETE コマンドを実行して非同期タスクを生成します。

  2. データのマーク:システムがバックグラウンドで mutation_*.txt ファイルを作成して、変更対象のデータ範囲を記録します。変更は即座には適用されません。

  3. バックグラウンドでの書き換え:ClickHouse が影響を受ける データパーツ を徐々に書き換え、マージプロセス中に変更を適用します。

  4. 古いデータのクリーンアップ:マージが完了すると、古いデータブロックが削除対象としてマークされます。

したがって、短時間の間に Mutation 操作を多く実行すると、タスクがブロックされ、DELETE および UPDATE 操作が完了しないままになります。バックログを防ぐために、新しい操作を実行する前に次の SQL ステートメントを実行して、実行中の Mutations を確認してください。

SELECT * FROM clusterAllReplicas('default', system.mutations) WHERE is_done = 0;

解決策

  1. クラスター上で実行中の Mutation タスクが多すぎないかを確認します。

    次の SQL ステートメントを実行して、クラスター内の Mutations の現在のステータスを表示できます。

    SELECT * FROM clusterAllReplicas('default', system.mutations) WHERE is_done = 0;
  2. 多くの Mutation タスクが実行中の場合、特権アカウントを使用して一部またはすべてのタスクをキャンセルします。

    • 単一テーブルのすべての Mutation タスクをキャンセルします。

      KILL MUTATION WHERE database = 'default' AND table = '<table_name>'
    • 特定の Mutation タスクをキャンセルします。

      KILL MUTATION WHERE database = 'default' AND table = '<table_name>' AND mutation_id = '<mutation_id>'

      mutation_id を取得するには、次の SQL ステートメントを実行します。

      SELECT mutation_id, * FROM clusterAllReplicas('default', system.mutations) WHERE is_done = 0;

ApsaraDB for ClickHouse Enterprise Edition で「Code: 241. DB::Exception: Memory limit (total) exceeded」エラーを解決する方法

  • 症状:SQL ステートメントを実行する際に、クラスターの合計メモリがエラーメッセージで指定されたメモリ制限を超えているにもかかわらず、次のエラーメッセージが表示されます。

    Code: 241. DB::Exception: Memory limit (total) exceeded: would use 115.28 GiB (attempt to allocate chunk of 133791376 bytes), maximum: 115.20 GiB. OvercommitTracker decision: Query was selected to stop by OvercommitTracker.: While executing AggregatingTransform. (MEMORY_LIMIT_EXCEEDED) (version 24.2.2.16476 (official build))
  • 原因ApsaraDB for ClickHouse Enterprise Edition では、単一ノードに CCU 制限があります(最大 32 CCU、1 CCU は約 1 vCore および 4 GiB のメモリに相当)。単一の SQL クエリがノードのしきい値を超えるメモリを消費すると、MemoryTracker がクエリをインターセプトします。デフォルトのしきい値はノードの合計メモリの 0.9 倍です。次の SQL ステートメントを実行してしきい値をクエリできます。

    SELECT *
    FROM system.server_settings
    WHERE name = 'max_server_memory_usage_to_ram_ratio';
  • 解決策allow_experimental_parallel_reading_from_replicas パラメーターを 1 に設定します。この設定により、SQL クエリのデータ読み取りフェーズが複数ノードに分散され、メモリ消費が分散されます。 このパラメーターの設定方法の詳細については、「Enterprise Edition」をご参照ください。

クエリ結果が一貫しない理由

症状

ApsaraDB for ClickHouse Community-compatible Edition クラスターで、同じ SQL ステートメントを複数回実行しても一貫しない結果が返されます。

原因

ApsaraDB for ClickHouse Community-compatible Edition クラスターで同じクエリの結果が一貫しない主な原因は次の 2 つです。

  • クエリがマルチシャードクラスターのローカルテーブルを対象としている。

    ApsaraDB for ClickHouse Community-compatible Edition のマルチシャードクラスターでは、ローカルテーブルに加えて分散テーブルを作成する必要があります。このようなクラスターでの データ書き込みプロセス は次のとおりです。

    データはまず分散テーブルに書き込まれ、その後、異なるシャードのローカルテーブルに分散されて保存されます。

    データをクエリする際、クエリ対象のテーブルの種類によってデータソースが異なります。

    • 分散テーブルをクエリする場合:分散テーブルはすべてのシャードのローカルテーブルからデータを集約して返します。

    • ローカルテーブルをクエリする場合:各クエリはランダムに選択されたシャードのローカルテーブルからデータを返すため、結果が一貫しなくなります。

  • 2 レプリカクラスターのテーブルが Replicated* シリーズエンジンを使用して作成されていない。

    ApsaraDB for ClickHouse Community-compatible Edition の 2 レプリカクラスターでは、レプリカ間でデータ同期を有効にするために、ReplicatedMergeTree エンジンなどの Replicated* シリーズエンジンを使用してテーブルを作成する必要があります。

    2 レプリカクラスターで Replicated* シリーズエンジンを使用せずにテーブルを作成した場合、レプリカ間でデータが同期されず、クエリ結果が一貫しなくなる可能性があります。

解決策

  1. クラスタータイプを特定します。

    クラスター情報で、クラスターがマルチシャードクラスター、2 レプリカクラスター、またはマルチシャードおよび 2 レプリカクラスターのいずれであるかを確認します。次の手順を実行します。

    1. ApsaraDB for ClickHouse コンソール にログインします。

    2. ページの左上隅で、Community Edition インスタンスのリスト を選択します。

    3. クラスターリストで、対象のクラスター ID をクリックしてクラスター情報ページを開きます。

      Editionクラスターのプロパティ セクション内)および ノード・グループの数構成情報 セクション内)を表示します。次のプロパティに基づいてクラスタータイプを特定できます。

      • ノードグループ数が 1 を超える場合、クラスターはマルチシャードクラスターです。

      • シリーズが High-availability Edition の場合、クラスターは 2 レプリカクラスターです。

      • 両方の条件を満たす場合、クラスターはマルチシャードおよび 2 レプリカクラスターです。

  2. クラスタータイプに基づいて解決策を選択します。

    マルチシャードクラスター

    クエリ対象のテーブルの種類を確認します。ローカルテーブルの場合、代わりに分散テーブルをクエリします。

    分散テーブルが存在しない場合は、作成する必要があります。テーブルの作成

    2 レプリカクラスター

    対象テーブルの CREATE TABLE ステートメントを確認します。エンジンが Replicated* シリーズエンジンでない場合、テーブルを再作成する必要があります。詳細については、「テーブルの作成」をご参照ください。

    マルチシャードおよび 2 レプリカクラスター

    クエリ対象のテーブルの種類を確認します。

    ローカルテーブルの場合、分散テーブルをクエリします。分散テーブルが存在しない場合は、作成する必要があります。

    分散テーブルをクエリしている場合、対応するローカルテーブルのエンジンが Replicated* シリーズエンジンであるかどうかを確認します。そうでない場合、ローカルテーブルを再作成し、Replicated* シリーズエンジンを指定する必要があります。詳細については、「テーブルの作成」をご参照ください。

ReplacingMergeTree が強制マージ後に重複排除に失敗する理由

症状

ClickHouse の ReplacingMergeTree エンジンは、データマージプロセス中に同じプライマリキーを持つデータの重複を排除します。ただし、次のコマンドを実行してデータマージを強制した後でも、同じプライマリキーを持つ重複データが残ることがあります。

optimize TABLE <table_name> FINAL ON cluster default;

原因

ReplacingMergeTree エンジンは単一ノードでのみデータを重複排除します。同じプライマリキーを持つデータが異なるノードに分散されている場合(デフォルトでは rand() 関数を使用してデータがランダムに割り当てられるため)、エンジンはクラスター全体でデータを重複排除できません。

解決策

ローカルテーブルと分散テーブルを再作成します。分散テーブルを作成する際、シャーディングキー式 をローカルテーブルのプライマリキーに設定します。CREATE TABLE

重要

分散テーブルとローカルテーブルの両方を再作成する必要があります。分散テーブルのみを再作成すると、新しいデータにのみ影響し、既存のデータの重複は解消されません。