サーバーの強制シャットダウン、異常な停電などにより、クリックハウスのデータが破損する 疑わしい多くの壊れた部品を取り外す

質問

現象

  • 電算室の電源を切り、サーバーを再起動する サービス開始後、データ書き込み時にエラーが発生する クリックハウスのエラーログを確認する
  • 重要なヒントはTOO_MANY_PARTSandDB::Exception: Suspiciously many (12 parts, 0.00 B in total) broken parts to remove while maximum allowed broken parts count is 10.です。これはおそらくデータ フラグメントが多すぎることを意味します。削除する破損したフラグメントの数は 12 ですが、許容される最大数は 10 です。
  • 修理の提案も後で出されましたYou can change the maximum value with merge tree setting 'max_suspicious_broken_parts' in <merge_tree> configuration section or in table settings in .sql file (don't forget to return setting back to default value)一般的な意味は、テーブル パラメーターを変更することですmax_suspicious_broken_partsが、復旧後に元に戻すことを忘れないでください。
  • また、テーブルのエラー部分を示しますCannot attach table radar.signal_status from metadata file /var/lib/clickhouse/store/422/4222e684-3a04-4de6-bacc-879c855ef94c/signal_status.sql from query ATTACH TABLE radar.signal_status
0. DB::Exception::Exception(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, int, bool) @ 0xaebed1a in /usr/bin/clickhouse
1. DB::Exception::Exception<unsigned long&>(int, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, unsigned long&) @ 0xaf096b2 in /usr/bin/clickhouse
2. DB::MergeTreeData::delayInsertOrThrowIfNeeded(Poco::Event*) const @ 0x15488280 in /usr/bin/clickhouse
3. ? @ 0x15c0a4e9 in /usr/bin/clickhouse
4. DB::ExceptionKeepingTransform::work() @ 0x15c09c94 in /usr/bin/clickhouse
5. DB::ExecutionThreadContext::executeTask() @ 0x15a60ca3 in /usr/bin/clickhouse
6. DB::PipelineExecutor::executeStepImpl(unsigned long, std::__1::atomic<bool>*) @ 0x15a54b7e in /usr/bin/clickhouse
7. DB::PipelineExecutor::executeStep(std::__1::atomic<bool>*) @ 0x15a54280 in /usr/bin/clickhouse
8. DB::PushingPipelineExecutor::start() @ 0x15a68d14 in /usr/bin/clickhouse
9. DB::SystemLog<DB::MetricLogElement>::flushImpl(std::__1::vector<DB::MetricLogElement, std::__1::allocator<DB::MetricLogElement> > const&, unsigned long) @ 0x14d9b618 in /usr/bin/clickhouse
10. DB::SystemLog<DB::MetricLogElement>::savingThreadFunction() @ 0x14d99ab5 in /usr/bin/clickhouse
11. ? @ 0xaf80cb1 in /usr/bin/clickhouse
12. ThreadPoolImpl<std::__1::thread>::worker(std::__1::__list_iterator<std::__1::thread, void*>) @ 0xaf62837 in /usr/bin/clickhouse
13. ? @ 0xaf662fd in /usr/bin/clickhouse
14. start_thread @ 0x7ea5 in /usr/lib64/libpthread-2.17.so
15. __clone @ 0xfe96d in /usr/lib64/libc-2.17.so
 (version 22.2.2.1)
2022.12.08 15:07:08.647866 [ 18188 ] {} <Error> void DB::SystemLog<DB::MetricLogElement>::flushImpl(const std::vector<LogElement> &, uint64_t) [LogElement = DB::MetricLogElement]: Code: 252. DB::Exception: Too many parts (300). Merges are processing significantly slower than inserts. (TOO_MANY_PARTS), Stack trace (when copying this message, always include the lines below):

0. DB::Exception::Exception(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, int, bool) @ 0xaebed1a in /usr/bin/clickhouse
1. DB::Exception::Exception<unsigned long&>(int, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, unsigned long&) @ 0xaf096b2 in /usr/bin/clickhouse
2. DB::MergeTreeData::delayInsertOrThrowIfNeeded(Poco::Event*) const @ 0x15488280 in /usr/bin/clickhouse
3. ? @ 0x15c0a4e9 in /usr/bin/clickhouse
4. DB::ExceptionKeepingTransform::work() @ 0x15c09c94 in /usr/bin/clickhouse
5. DB::ExecutionThreadContext::executeTask() @ 0x15a60ca3 in /usr/bin/clickhouse
6. DB::PipelineExecutor::executeStepImpl(unsigned long, std::__1::atomic<bool>*) @ 0x15a54b7e in /usr/bin/clickhouse
7. DB::PipelineExecutor::executeStep(std::__1::atomic<bool>*) @ 0x15a54280 in /usr/bin/clickhouse
8. DB::PushingPipelineExecutor::start() @ 0x15a68d14 in /usr/bin/clickhouse
9. DB::SystemLog<DB::MetricLogElement>::flushImpl(std::__1::vector<DB::MetricLogElement, std::__1::allocator<DB::MetricLogElement> > const&, unsigned long) @ 0x14d9b618 in /usr/bin/clickhouse
10. DB::SystemLog<DB::MetricLogElement>::savingThreadFunction() @ 0x14d99ab5 in /usr/bin/clickhouse
11. ? @ 0xaf80cb1 in /usr/bin/clickhouse
12. ThreadPoolImpl<std::__1::thread>::worker(std::__1::__list_iterator<std::__1::thread, void*>) @ 0xaf62837 in /usr/bin/clickhouse
13. ? @ 0xaf662fd in /usr/bin/clickhouse
14. start_thread @ 0x7ea5 in /usr/lib64/libpthread-2.17.so
15. __clone @ 0xfe96d in /usr/lib64/libc-2.17.so
 (version 22.2.2.1)
2022.12.08 15:07:09.448149 [ 18117 ] {} <Error> Application: DB::Exception: Suspiciously many (12 parts, 0.00 B in total) broken parts to remove while maximum allowed broken parts count is 10. You can change the maximum value with merge tree setting 'max_suspicious_broken_parts' in <merge_tree> configuration section or in table settings in .sql file (don't forget to return setting back to default value): Cannot attach table `radar`.`signal_status` from metadata file /var/lib/clickhouse/store/422/4222e684-3a04-4de6-bacc-879c855ef94c/signal_status.sql from query ATTACH TABLE radar.signal_status UUID '85937e46-5e81-4d48-bcfc-dbd2a738c086' (`time_stamp` DateTime COMMENT '信控上报时间(当前灯色开始时间)', `intersection_number` Int32 COMMENT '交叉口编号', `pattern_number` Int16 COMMENT '方案编号', `working_mode` String COMMENT '信号机工作模式', `stage_index` Int8 COMMENT '当前阶段序号', `phase_number` Int8 COMMENT '当前执行相位', `stage_status` String COMMENT '当前阶段灯色', `len_lamp_light` Int16 COMMENT '当前灯色的持续时间', `cycle` Int16 COMMENT '方案周期(秒)', `green_movement` Array(String) COMMENT '当前相位绿灯可通行进口流向', `green_lane` Array(String) COMMENT '当前相位绿灯可通行进口车道编号', `stage_end_time` DateTime COMMENT '当前灯色结束时间', `cycle_start_time` DateTime COMMENT '本周期开始时间') ENGINE = MergeTree PARTITION BY toYYYYMM(time_stamp) PRIMARY KEY time_stamp ORDER BY (time_stamp, intersection_number) TTL time_stamp + toIntervalMonth(6) SETTINGS index_granularity = 8192, old_parts_lifetime = 300

理由

  • 本機の電源がオフの場合に発生するエラーで、データ書き込みによるメタデータとデータの不一致が検索の原因です。
  • Clickhouse は、サービスの再起動時に MergeTree テーブル エンジン データをリロードし、データが破損する可能性があります
  • クリックハウス構成の理由の
    構成パラメーターには、パラメーター max_suspicious_broken_parts が含まれています。既定値は 10 で、オプションの値の範囲は任意の正の整数です。単一のパーティション内の破損したパーツの数が max_suspicious_broken_parts で構成された値を超えると、自動修復が拒否されます。または破損した部分のデータの削除を拒否し、サービスを開始すると、エラーを報告してすぐに終了します
  • 現時点では、サービスの起動失敗を回避するために、このエラーを可能な限り回避する必要があります.このパラメータを1000以上の値に設定することをお勧めします.

解決

  • プロンプトに従って、対応するファイルを見つけました/var/lib/clickhouse/store/422/4222e684-3a04-4de6-bacc-879c855ef94c/signal_status.sql
  • テーブル構成を変更し、max_suspicious_broken_parts=20 (破損したファイルの数より多い) を設定します。
  • データベースを再起動するだけ

その他の処理方法

単一テーブル構成

MergeTree テーブルの作成時に max_suspicious_broken_parts パラメーターを特別に構成する

CREATE TABLE foo
(
    `A` Int64
)
ENGINE = MergeTree
ORDER BY tuple()
SETTINGS max_suspicious_broken_parts = 1000;

コマンドライン

ALTER TABLE ... MODIFY SETTING コマンドを使用して変更します

ALTER TABLE foo
    MODIFY SETTING max_suspicious_broken_parts = 1000;

-- 恢复默认值
-- reset to default (use value from system.merge_tree_settings)
ALTER TABLE foo
    RESET SETTING max_suspicious_broken_parts;

構成ファイルの方法

サービスが失敗した場合は、この方法でのみ解決できます

  • 新しいファイル max_suspicious_broken_parts.xml を作成し、次の内容を記述します
<?xml version="1.0"?>
<yandex>
     <merge_tree>
         <max_suspicious_broken_parts>1000</max_suspicious_broken_parts>
     </merge_tree>
</yandex>
  • Clickhouse 構成ファイルを有効にするには、/etc/clickhouse-server/config.d/ フォルダーに配置することをお勧めします
  • Ubuntu または Centos で DEB または RPM インストール パッケージとして開始された場合は、このファイルを /etc/clickhouse-server/config.d/ に置き、最後に clickhouse を再起動する必要があります。
  • docker compose で起動する場合は、
    compose.yaml の設定を以下のように変更し、主に対応するファイルをコンテナ内の対応する位置にマウントします。
services:
  clickhouse:
    image: clickhouse/clickhouse-server
    ulimits:
      nofile:
        soft: 262144
        hard: 262144
    restart: always
    container_name: demo-clickhouse
    environment:
    - CLICKHOUSE_USER=demo
    - CLICKHOUSE_PASSWORD=demo-pass
    - CLICKHOUSE_DB=demo
    ports:
      - "8123:8123"
      - "9000:9000"
    volumes:
      - ./max_suspicious_broken_parts.xml:/etc/clickhouse-server/config.d/max_suspicious_broken_parts.xml
      - demo-clickhouse:/var/lib/clickhouse
    healthcheck:
      test: 'wget -O - http://127.0.0.1:8123 || exit 1'
     
volumes:
  demo-clickhouse: {}

構成が有効であることを確認する

  • クリックハウスに接続、クエリ
SELECT *
FROM system.merge_tree_settings
WHERE name LIKE '%max_suspicious_broken_parts%'

参考

おすすめ

転載: blog.csdn.net/u010882234/article/details/128553785