ClickHouse Keeper (clickhouse-keeper)
このページは ClickHouse Cloud には適用されません。ここで説明している手順は、ClickHouse Cloud サービスでは自動化されています。
ClickHouse Keeperは、データのレプリケーションと分散DDLクエリ実行のための調整システムを提供します。ClickHouse KeeperはZooKeeperと互換性があります。
実装の詳細
ZooKeeperは、最初によく知られたオープンソース調整システムの1つです。Javaで実装されており、非常にシンプルで強力なデータモデルを持っています。ZooKeeperの調整アルゴリズムであるZooKeeper Atomic Broadcast(ZAB)は、各ZooKeeperノードがローカルで読み取りを処理するため、読み取りの線形化可能性の保証を提供しません。ZooKeeperとは異なり、ClickHouse KeeperはC++で記述されており、RAFTアルゴリズムの実装を使用します。このアルゴリズムは、読み取りと書き込みの線形化可能性を可能にし、さまざまな言語でいくつかのオープンソース実装があります。
デフォルトでは、ClickHouse KeeperはZooKeeperと同じ保証を提供します:線形化可能な書き込みと非線形化可能な読み取り。互換性のあるクライアント・サーバープロトコルを持っているため、標準のZooKeeperクライアントを使用してClickHouse Keeperと対話できます。スナップショットとログはZooKeeperと互換性のない形式ですが、clickhouse-keeper-converterツールを使用すると、ZooKeeperデータをClickHouse Keeperスナップショットに変換できます。ClickHouse Keeperのサーバー間プロトコルもZooKeeperと互換性がないため、ZooKeeper / ClickHouse Keeper混合クラスターは不可能です。
ClickHouse Keeperは、ZooKeeperと同じ方法でアクセス制御リスト(ACL)をサポートします。ClickHouse Keeperは同じ権限セットをサポートし、同一の組み込みスキームを持っています:world、auth、digest。ダイジェスト認証スキームは、username:passwordのペアを使用し、パスワードはBase64でエンコードされます。
外部統合はサポートされていません。
設定
ClickHouse KeeperはZooKeeperのスタンドアロン代替として、またはClickHouseサーバーの内部部分として使用できます。どちらの場合も、設定はほぼ同じ.xmlファイルです。
Keeper 設定項目
主な ClickHouse Keeper の設定タグは <keeper_server> で、次のパラメータを持ちます:
| パラメータ | 説明 | デフォルト |
|---|---|---|
tcp_port | クライアントが接続するためのポート。 | 2181 |
tcp_port_secure | クライアントとkeeper-server間のSSL接続用のセキュアポート。 | - |
server_id | 一意のサーバーID、ClickHouse Keeperクラスターの各参加者は一意の番号(1、2、3など)を持つ必要があります。 | - |
log_storage_path | 調整ログへのパス、ZooKeeperと同様に、ビジーでないノードにログを保存することが最善です。 | - |
snapshot_storage_path | 調整スナップショットへのパス。 | - |
enable_reconfiguration | reconfigを介した動的クラスター再構成を有効にします。 | False |
max_memory_usage_soft_limit | keeperの最大メモリ使用量のソフト制限(バイト単位)。 | max_memory_usage_soft_limit_ratio * physical_memory_amount |
max_memory_usage_soft_limit_ratio | max_memory_usage_soft_limitが設定されていないか0に設定されている場合、この値を使用してデフォルトのソフト制限を定義します。 | 0.9 |
cgroups_memory_observer_wait_time | max_memory_usage_soft_limitが設定されていないか0に設定されている場合、この間隔を使用して物理メモリの量を監視します。メモリ量が変更されると、max_memory_usage_soft_limit_ratioによってKeeperのメモリソフト制限を再計算します。 | 15 |
http_control | HTTP制御インターフェースの設定。 | - |
digest_enabled | リアルタイムデータ整合性チェックを有効にします | True |
create_snapshot_on_exit | シャットダウン時にスナップショットを作成します | - |
hostname_checks_enabled | クラスター設定の健全性ホスト名チェックを有効にします(例:localhostがリモートエンドポイントと一緒に使用されている場合) | True |
four_letter_word_white_list | 4lwコマンドのホワイトリスト。 | conf, cons, crst, envi, ruok, srst, srvr, stat, wchs, dirs, mntr, isro, rcvr, apiv, csnp, lgif, rqld, ydld |
enable_ipv6 | IPv6を有効にします | True |
その他の一般的なパラメータはClickHouseサーバー設定(listen_host、loggerなど)から継承されます。
内部調整設定
内部調整設定は<keeper_server>.<coordination_settings>セクションにあり、次のパラメータがあります:
| パラメータ | 説明 | デフォルト |
|---|---|---|
operation_timeout_ms | 単一のクライアント操作のタイムアウト(ms) | 10000 |
min_session_timeout_ms | クライアントセッションの最小タイムアウト(ms) | 10000 |
session_timeout_ms | クライアントセッションの最大タイムアウト(ms) | 100000 |
dead_session_check_period_ms | ClickHouse Keeperが死んでいるセッションをチェックし、それらを削除する頻度(ms) | 500 |
heart_beat_interval_ms | ClickHouse Keeperリーダーがフォロワーにハートビートを送信する頻度(ms) | 500 |
election_timeout_lower_bound_ms | フォロワーがこの間隔でリーダーからハートビートを受信しない場合、リーダー選出を開始できます。election_timeout_upper_bound_ms以下である必要があります。理想的にはそれらは等しくないべきです。 | 1000 |
election_timeout_upper_bound_ms | フォロワーがこの間隔でリーダーからハートビートを受信しない場合、リーダー選出を開始する必要があります。 | 2000 |
rotate_log_storage_interval | 単一のファイルに保存するログレコードの数。 | 100000 |
reserved_log_items | 圧縮前に保存する調整ログレコードの数。 | 100000 |
snapshot_distance | ClickHouse Keeperが新しいスナップショットを作成する頻度(ログ内のレコード数)。 | 100000 |
snapshots_to_keep | 保持するスナップショットの数。 | 3 |
stale_log_gap | リーダーがフォロワーを古いと見なし、ログの代わりにスナップショットを送信するしきい値。 | 10000 |
fresh_log_gap | ノードがフレッシュになったとき。 | 200 |
max_requests_batch_size | RAFTに送信される前のリクエスト数でのバッチの最大サイズ。 | 100 |
force_sync | 調整ログへの各書き込みでfsyncを呼び出します。 | true |
quorum_reads | 読み取りリクエストを、同様の速度でRAFTコンセンサス全体を通じた書き込みとして実行します。 | false |
raft_logs_level | 調整に関するテキストログレベル(trace、debugなど)。 | system default |
auto_forwarding | フォロワーからリーダーへの書き込みリクエストの転送を許可します。 | true |
shutdown_timeout | 内部接続の完了とシャットダウンを待ちます(ms)。 | 5000 |
startup_timeout | サーバーが指定されたタイムアウト内に他のクォーラム参加者に接続しない場合、終了します(ms)。 | 30000 |
async_replication | 非同期レプリケーションを有効にします。すべての書き込みと読み取りの保証は保持されながら、より良いパフォーマンスが達成されます。後方互換性を壊さないために、設定はデフォルトで無効になっています | false |
latest_logs_cache_size_threshold | 最新のログエントリのメモリ内キャッシュの最大合計サイズ | 1GiB |
commit_logs_cache_size_threshold | コミットに必要な次のログエントリのメモリ内キャッシュの最大合計サイズ | 500MiB |
disk_move_retries_wait_ms | ディスク間でファイルが移動されている間に発生した失敗後のリトライ間の待機時間 | 1000 |
disk_move_retries_during_init | 初期化中にディスク間でファイルが移動されている間に発生した失敗後のリトライ回数 | 100 |
experimental_use_rocksdb | rocksdbをバックエンドストレージとして使用します | 0 |
クォーラム設定は<keeper_server>.<raft_configuration>セクションにあり、サーバーの説明が含まれています。
クォーラム全体の唯一のパラメータはsecureで、クォーラム参加者間の通信の暗号化接続を有効にします。内部ノード間通信にSSL接続が必要な場合はパラメータをtrueに設定でき、それ以外の場合は指定しません。
各<server>の主なパラメータは次のとおりです:
id— クォーラム内のサーバー識別子。hostname— このサーバーが配置されているホスト名。port— このサーバーが接続をリッスンするポート。can_become_leader— サーバーをlearnerとして設定するにはfalseに設定します。省略された場合、値はtrueです。
ClickHouse Keeperクラスターのトポロジーが変更される場合(例:サーバーの置き換え)、server_idからhostnameへのマッピングを一貫して保持し、既存のserver_idを異なるサーバーにシャッフルまたは再利用しないようにしてください(例:ClickHouse Keeperをデプロイするための自動化スクリプトに依存している場合に発生する可能性があります)
Keeperインスタンスのホストが変更される可能性がある場合は、生のIPアドレスではなくホスト名を定義して使用することをお勧めします。ホスト名の変更は、サーバーを削除して再度追加することと同等であり、場合によっては不可能です(例:クォーラムに十分なKeeperインスタンスがない)。
async_replicationは、後方互換性を壊さないようにデフォルトで無効になっています。クラスター内のすべてのKeeperインスタンスがasync_replicationをサポートするバージョン(v23.9+)を実行している場合は、ダウンサイドなしでパフォーマンスを向上させることができるため、有効にすることをお勧めします。
3ノードでのクォーラムの設定例は、test_keeper_プレフィックスを持つ統合テストで見つけることができます。サーバー#1の設定例:
実行方法
ClickHouse KeeperはClickHouseサーバーパッケージにバンドルされています。/etc/your_path_to_config/clickhouse-server/config.xmlに<keeper_server>の設定を追加して、いつものようにClickHouseサーバーを起動するだけです。スタンドアロンのClickHouse Keeperを実行したい場合は、次のような方法で起動できます:
シンボリックリンクclickhouse-keeperがない場合は、それを作成するか、clickhouseの引数としてkeeperを指定できます:
Four letter word commands
ClickHouse Keeper は、Zookeeper とほぼ同様の 4 文字コマンド (4lw) も提供します。各コマンドは mntr や stat などの 4 文字で構成されています。中でも代表的なコマンドとして、stat はサーバーおよび接続されているクライアントに関する一般的な情報を返し、srvr と cons はそれぞれサーバーおよび接続に関する詳細情報を返します。
4lw コマンドには four_letter_word_white_list というホワイトリスト設定があり、デフォルト値は conf,cons,crst,envi,ruok,srst,srvr,stat,wchs,dirs,mntr,isro,rcvr,apiv,csnp,lgif,rqld,ydld です。
クライアントポートに対して、telnet または nc を使用して ClickHouse Keeper にコマンドを送信できます。
Bellow is the detailed 4lw commands:
ruok: サーバーがエラーのない状態で動作しているかどうかをテストします。サーバーが正常に動作している場合はimokと応答します。そうでない場合はまったく応答しません。imokという応答は、サーバーがクォーラムに参加していることを必ずしも示すものではなく、サーバープロセスがアクティブであり、指定されたクライアントポートにバインドされていることのみを示します。クォーラムへの参加状況およびクライアント接続情報に関する詳細については "stat" を使用してください。
mntr:クラスターの健全性を監視するために使用できる変数のリストを出力します。
srvr:サーバーの完全な詳細をリストします。
stat:サーバーと接続されたクライアントの簡単な詳細をリストします。
srst:サーバー統計をリセットします。コマンドはsrvr、mntr、statの結果に影響します。
conf:サービング設定の詳細を出力します。
cons:このサーバーに接続しているすべてのクライアントの接続/セッションの詳細情報を一覧表示します。受信/送信パケット数、セッション ID、操作のレイテンシ、最後に実行された操作などの情報を含みます。
crst:すべての接続に対する接続/セッションの統計情報をリセットします。
envi: 稼働環境の詳細を表示します
dirs:スナップショットとログファイルの合計サイズをバイト単位で表示します
isro:サーバーが読み取り専用モードで実行されているかどうかをテストします。読み取り専用モードの場合はro、読み取り専用モードでない場合はrwで応答します。
wchs:サーバーのウォッチに関する簡単な情報をリストします。
wchc:サーバーのウォッチに関する詳細情報をセッションごとにリストします。これは、関連するウォッチ(パス)を持つセッション(接続)のリストを出力します。ウォッチの数によっては、この操作は高価(サーバーパフォーマンスに影響)になる可能性がありますので、注意して使用してください。
wchp:サーバーのウォッチに関する詳細情報をパスごとにリストします。これは、関連するセッションを持つパス(znode)のリストを出力します。ウォッチの数によっては、この操作は高価(つまり、サーバーパフォーマンスに影響)になる可能性がありますので、注意して使用してください。
dump:未処理のセッションとエフェメラルノードをリストします。これはリーダーでのみ機能します。
csnp:スナップショット作成タスクをスケジュールします。成功した場合はスケジュールされたスナップショットの最後にコミットされたログインデックスを返し、失敗した場合はFailed to schedule snapshot creation task.を返します。lgifコマンドがスナップショットが完了したかどうかを判断するのに役立つことに注意してください。
lgif:Keeperログ情報。first_log_idx:ログストア内の最初のログインデックス;first_log_term:最初のログターム;last_log_idx:ログストア内の最後のログインデックス;last_log_term:最後のログターム;last_committed_log_idx:ステートマシン内の最後にコミットされたログインデックス;leader_committed_log_idx:私の視点からのリーダーのコミットされたログインデックス;target_committed_log_idx:コミットすべきターゲットログインデックス;last_snapshot_idx:最後のスナップショット内で最大のコミットされたログインデックス。
rqld: ノードを新しいリーダーにするようリクエストします。リクエストが送信された場合はSent leadership request to leader.、送信されなかった場合はFailed to send leadership request to leader.を返します。ノードがすでにリーダーであっても、結果はリクエストが送信された場合と同じになります。
ftfl: Keeperインスタンスで有効かどうかを含め、すべての機能フラグを一覧表示します。
ydld: リーダーの役割を明け渡してフォロワーになるためのリクエストです。リクエストを受け取ったサーバーがリーダーである場合、まず書き込み操作を一時停止し、後継ノード(現在のリーダーが後継になることはありません)が最新のログに追いつくのを待ってから辞任します。後継ノードは自動的に選出されます。リクエストが送信された場合はSent yield leadership request to leader.を返し、送信されなかった場合はFailed to send yield leadership request to leader.を返します。ノードがすでにフォロワーである場合、結果はリクエストが送信された場合と同じになります。
pfev: 収集されたすべてのイベントの値を返します。各イベントごとに、イベント名、値、および説明を返します。
HTTP制御
ClickHouse Keeperは、レプリカがトラフィックを受信する準備ができているかどうかをチェックするためのHTTPインターフェースを提供します。これは、Kubernetesなどのクラウド環境で使用できます。
/readyエンドポイントを有効にする設定の例:
機能フラグ
KeeperはZooKeeperとそのクライアントと完全に互換性がありますが、ClickHouseクライアントで使用できるいくつかのユニークな機能とリクエストタイプも導入しています。
これらの機能は後方互換性のない変更を導入する可能性があるため、ほとんどがデフォルトで無効になっており、keeper_server.feature_flags設定を使用して有効にできます。
すべての機能は明示的に無効にできます。
Keeperクラスターの新しい機能を有効にする場合は、まずクラスター内のすべてのKeeperインスタンスを機能をサポートするバージョンに更新してから、機能自体を有効にすることをお勧めします。
multi_readを無効にし、check_not_existsを有効にする機能フラグ設定の例:
次の機能が利用可能です:
| 機能 | 説明 | デフォルト |
|---|---|---|
multi_read | 読み取りマルチリクエストのサポート | 1 |
filtered_list | ノードのタイプ(エフェメラルまたはパーシステント)で結果をフィルタリングするリストリクエストのサポート | 1 |
check_not_exists | ノードが存在しないことをアサートするCheckNotExistsリクエストのサポート | 1 |
create_if_not_exists | ノードが存在しない場合にノードを作成しようとするCreateIfNotExistsリクエストのサポート。存在する場合、変更は適用されず、ZOKが返されます | 1 |
remove_recursive | ノードをそのサブツリーとともに削除するRemoveRecursiveリクエストのサポート | 1 |
一部の機能フラグは、バージョン25.7以降デフォルトで有効になっています。 Keeperを25.7+にアップグレードする推奨方法は、まずバージョン24.9+にアップグレードすることです。
ZooKeeperからの移行
ZooKeeperからClickHouse Keeperへのシームレスな移行は不可能です。ZooKeeperクラスターを停止し、データを変換してから、ClickHouse Keeperを起動する必要があります。clickhouse-keeper-converterツールを使用すると、ZooKeeperのログとスナップショットをClickHouse Keeperスナップショットに変換できます。ZooKeeper > 3.4でのみ機能します。移行の手順:
-
すべてのZooKeeperノードを停止します。
-
オプションですが推奨:ZooKeeperリーダーノードを見つけて、再度起動してから停止します。これにより、ZooKeeperが一貫したスナップショットを作成するように強制されます。
-
リーダーで
clickhouse-keeper-converterを実行します。例:
keeperが設定されている ClickHouse サーバーノードにスナップショットをコピーするか、ZooKeeper の代わりに ClickHouse Keeper を起動します。スナップショットはすべてのノードに永続化されている必要があります。そうでない場合、空のノードのほうが起動が速く、そのうちの 1 つがリーダーになってしまう可能性があります。
keeper-converter ツールは、Keeper スタンドアロンバイナリには含まれていません。
ClickHouse がインストールされている場合は、そのバイナリを直接使用できます:
それ以外の場合は、バイナリをダウンロードして、ClickHouseをインストールせずに上記のようにツールを実行できます。
クォーラムを失った後の回復
ClickHouse KeeperはRaftを使用するため、クラスターサイズに応じて一定量のノードクラッシュに耐えることができます。
例えば、3ノードクラスターの場合、1つのノードがクラッシュしても正しく動作し続けます。
クラスター設定は動的に設定できますが、いくつかの制限があります。再構成もRaftに依存しているため、クラスターからノードを追加/削除するにはクォーラムが必要です。同時にあまりにも多くのノードを失い、再起動する可能性がない場合、Raftは動作を停止し、従来の方法でクラスターを再構成することはできません。
それにもかかわらず、ClickHouse Keeperには、1つのノードのみでクラスターを強制的に再構成できる回復モードがあります。 これは、ノードを再起動できない場合、または同じエンドポイントで新しいインスタンスを起動できない場合の最後の手段としてのみ実行する必要があります。
続行する前に注意すべき重要なこと:
- 失敗したノードが再びクラスターに接続できないことを確認してください。
- 手順で指定されるまで、新しいノードを起動しないでください。
上記の事項が真であることを確認したら、次のことを行う必要があります。
- 新しいリーダーとする単一のKeeperノードを選択します。そのノードのデータがクラスター全体で使用されるため、最新の状態を持つノードを使用することを推奨します。
- 何かを行う前に、選択したノードの
log_storage_pathおよびsnapshot_storage_pathフォルダのバックアップを作成します。 - 利用したいすべてのノードでクラスターを再構成します。
- 選択したノードに4文字のコマンド
rcvrを送信して、そのノードを回復モードに移行させるか、選択したノード上のKeeperインスタンスを停止し、--force-recovery引数を付けて再起動します。 - 新しいノード上のKeeperインスタンスを1つずつ起動し、次のノードを起動する前に
mntrがzk_server_stateとしてfollowerを返すことを確認します。 - 回復モード中、リーダーノードは新しいノードとの間でクォーラムを達成するまで
mntrコマンドに対してエラーメッセージを返し、クライアントおよびフォロワーからのあらゆるリクエストを拒否します。 - クォーラムが達成されると、リーダーノードは通常の動作モードに戻り、
zk_server_stateとしてleaderを返すmntrでRaftによりすべてのリクエストを受け付けるようになります。
Keeperでディスクを使用する
Keeperは、スナップショット、ログファイル、状態ファイルを保存するための外部ディスクのサブセットをサポートしています。
サポートされているディスクの種類:
- s3_plain
- s3
- local
以下は、設定内に含まれるディスク定義の例です。
ログ用のディスクを使用するには、keeper_server.log_storage_disk設定をディスクの名前に設定する必要があります。
スナップショット用のディスクを使用するには、keeper_server.snapshot_storage_disk設定をディスクの名前に設定する必要があります。
さらに、最新のログまたはスナップショット用に異なるディスクを使用するには、それぞれkeeper_server.latest_log_storage_diskとkeeper_server.latest_snapshot_storage_diskを使用します。
その場合、新しいログまたはスナップショットが作成されると、Keeperは自動的にファイルを正しいディスクに移動します。
状態ファイル用のディスクを使用するには、keeper_server.state_storage_disk設定をディスクの名前に設定する必要があります。
ディスク間でのファイルの移動は安全で、Keeperが転送の途中で停止してもデータを失うリスクはありません。 ファイルが新しいディスクに完全に移動されるまで、古いディスクからは削除されません。
keeper_server.coordination_settings.force_syncがtrue(デフォルトでtrue)に設定されたKeeperは、すべての種類のディスクに対していくつかの保証を満たすことができません。
現在、localタイプのディスクのみが永続的な同期をサポートしています。
force_syncが使用されている場合、latest_log_storage_diskが使用されていない場合は、log_storage_diskはlocalディスクである必要があります。
latest_log_storage_diskが使用されている場合は、常にlocalディスクである必要があります。
force_syncが無効の場合、すべてのタイプのディスクを任意の設定で使用できます。
Keeperインスタンスの可能なストレージ設定は次のようになります:
このインスタンスは、最新のログを除くすべてのログをlog_s3_plainディスクに保存し、最新のログはlog_localディスクにあります。
スナップショットにも同じロジックが適用され、最新のスナップショットを除くすべてのスナップショットはsnapshot_s3_plainに保存され、最新のスナップショットはsnapshot_localディスクにあります。
ディスク設定の変更
新しいディスク設定を適用する前に、すべてのKeeperログとスナップショットを手動でバックアップしてください。
階層化されたディスク設定が定義されている場合(最新のファイル用に別々のディスクを使用)、Keeperは起動時にファイルを正しいディスクに自動的に移動しようとします。 以前と同じ保証が適用されます。ファイルが新しいディスクに完全に移動されるまで、古いディスクからは削除されないため、複数回の再起動を安全に行うことができます。
ファイルを完全に新しいディスクに移動する必要がある場合(または2ディスク設定から単一ディスク設定に移動する場合)、keeper_server.old_snapshot_storage_diskとkeeper_server.old_log_storage_diskの複数の定義を使用できます。
次の設定は、以前の2ディスク設定から完全に新しい単一ディスク設定に移動する方法を示しています:
起動時に、すべてのログファイルは log_local と log_s3_plain から log_local2ディスクに移動されます。
同様に、すべてのスナップショットファイルは snapshot_local と snapshot_s3_plain から snapshot_local2ディスクに移動されます。
ログキャッシュの設定
ディスクから読み取るデータ量を最小化するために、Keeperはログエントリをメモリにキャッシュします。 リクエストが大きい場合、ログエントリはあまりにも多くのメモリを消費するため、キャッシュされるログの量は上限が設定されています。 制限は次の2つの設定で制御されます:
latest_logs_cache_size_threshold- キャッシュに保存される最新ログの合計サイズcommit_logs_cache_size_threshold- 次にコミットする必要がある連続したログの合計サイズ
デフォルト値が大きすぎる場合は、これら2つの設定を減らすことでメモリ使用量を削減できます。
pfevコマンドを使用して、各キャッシュとファイルから読み取られたログの量を確認できます。
Prometheusエンドポイントからのメトリクスを使用して、両方のキャッシュの現在のサイズを追跡することもできます。
Prometheus
Keeperは、Prometheusサーバーによるスクレイピングのためにメトリクスデータを公開できます。
設定:
endpoint– PrometheusサーバーがメトリクスをスクレイピングするためのHTTPエンドポイント。'/'から始まります。port–endpointのポート。metrics– system.metricsテーブルからメトリクスを公開するように設定するフラグ。events– system.eventsテーブルからメトリクスを公開するように設定するフラグ。asynchronous_metrics– system.asynchronous_metricsテーブルから現在のメトリクス値を公開するように設定するフラグ。
例
確認してください(127.0.0.1をClickHouseサーバーのIPアドレスまたはホスト名に置き換えてください):
ClickHouse CloudのPrometheus統合も参照してください。
ClickHouse Keeperユーザーガイド
このガイドは、ClickHouse Keeperを設定するためのシンプルで最小限の設定を提供し、分散操作をテストする方法の例を示します。この例は、Linux上の3つのノードを使用して実行されます。
1. Keeper設定でノードを構成する
-
3つのホスト(
chnode1、chnode2、chnode3)に3つのClickHouseインスタンスをインストールします。(ClickHouseのインストールの詳細については、クイックスタートを参照してください。) -
各ノードで、ネットワークインターフェースを介した外部通信を許可するために次のエントリを追加します。
-
各サーバーごとに
<server_id>設定を更新したうえで、次のClickHouse Keeper設定を3つのサーバーすべてに追加します。chnode1の場合は1、chnode2の場合は2などです。これらは上記で使用した基本設定です。
パラメータ 説明 例 tcp_port keeperのクライアントが使用するポート 9181 デフォルト、zookeeperの2181と同等 server_id raft設定で使用される各ClickHouse Keeperサーバーの識別子 1 coordination_settings タイムアウトなどのパラメータのセクション タイムアウト: 10000、ログレベル: trace server 参加するサーバーの定義 各サーバー定義のリスト raft_configuration keeperクラスター内の各サーバーの設定 各サーバーとその設定 id keeperサービスのサーバーの数値ID 1 hostname keeperクラスター内の各サーバーのホスト名、IP、またはFQDN chnode1.domain.comport サーバー間keeper接続をリッスンするポート 9234 -
Zookeeperコンポーネントを有効にします。ClickHouse Keeperエンジンを使用します:
これらは上記で使用されている基本設定です:
パラメータ 説明 例 node ClickHouse Keeper接続用のノードのリスト 各サーバーの設定エントリ host 各ClickHouse keeperノードのホスト名、IP、またはFQDN chnode1.domain.comport ClickHouse Keeperクライアントポート 9181 -
ClickHouseを再起動し、各Keeperインスタンスが実行されていることを確認します。各サーバーで次のコマンドを実行します。
ruokコマンドは、Keeperが実行されており、健全な場合はimokを返します: -
systemデータベースには、ClickHouse Keeperインスタンスの詳細を含むzookeeperという名前のテーブルがあります。テーブルを表示してみましょう:テーブルは以下のようになります:
2. ClickHouseでクラスターを設定する
-
2つのノードに2つのシャードと1つのレプリカのみを持つシンプルなクラスターを設定しましょう。3番目のノードは、ClickHouse Keeperの要件のためのクォーラムを達成するために使用されます。
chnode1とchnode2の設定を更新します。次のクラスターは、各ノードに1つのシャードを定義し、レプリケーションなしで合計2つのシャードを定義します。この例では、データの一部がノードに、一部が他のノードにあります:パラメータ 説明 例 shard クラスター定義のレプリカのリスト 各シャードのレプリカのリスト replica 各レプリカの設定のリスト 各レプリカの設定エントリ host レプリカシャードをホストするサーバーのホスト名、IP、またはFQDN chnode1.domain.comport ネイティブtcpプロトコルを使用して通信するために使用されるポート 9000 user クラスターインスタンスへの認証に使用されるユーザー名 default password クラスターインスタンスへの接続を許可するために定義されたユーザーのパスワード ClickHouse123! -
ClickHouseを再起動し、クラスターが作成されたことを確認します:
クラスターが表示されるはずです:
3. 分散テーブルを作成してテストする
-
chnode1上で ClickHouse クライアントを使用して、新しいクラスターに新しいデータベースを作成します。ON CLUSTER句は両方のノード上にデータベースを自動的に作成します。 -
db1データベースに新しいテーブルを作成します。もう一度、ON CLUSTERは両方のノードでテーブルを作成します。 -
chnode1ノードで、いくつかの行を追加します: -
chnode2ノードでいくつかの行を追加します: -
各ノードで
SELECT文を実行すると、そのノードのデータのみが表示されることに注意してください。たとえば、chnode1で:chnode2で: -
-
2つのシャードのデータを表す
Distributedテーブルを作成できます。Distributedテーブルエンジンを持つテーブルは独自のデータを保存しませんが、複数のサーバーで分散クエリ処理を可能にします。読み取りはすべてのシャードにヒットし、書き込みはシャード全体に分散できます。chnode1で次のクエリを実行します: -
dist_tableをクエリすると、2つのシャードからの4行のデータすべてが返されることに注意してください:
まとめ
このガイドは、ClickHouse Keeperを使用してクラスターをセットアップする方法を示しました。ClickHouse Keeperを使用すると、クラスターを設定し、シャード全体でレプリケートできる分散テーブルを定義できます。
ユニークパスでClickHouse Keeperを設定する
このページは ClickHouse Cloud には適用されません。ここで説明している手順は、ClickHouse Cloud サービスでは自動化されています。
説明
この記事では、組み込みの{uuid}マクロ設定を使用して、ClickHouse KeeperまたはZooKeeperでユニークなエントリを作成する方法について説明します。ユニークパスは、頻繁にテーブルを作成および削除する場合に役立ちます。これは、Keeperガベージコレクションがパスエントリを削除するために数分待つ必要がないためです。パスが作成されるたびに新しいuuidが使用されるため、パスは再利用されません。
環境例
3つすべてのノードでClickHouse Keeperを設定し、ノードの2つでClickHouseを設定する3ノードクラスター。これにより、ClickHouse Keeperに3つのノード(タイブレーカーノードを含む)と、2つのレプリカで構成される単一のClickHouseシャードが提供されます。
| node | description |
|---|---|
chnode1.marsnet.local | データノード - クラスターcluster_1S_2R |
chnode2.marsnet.local | データノード - クラスター cluster_1S_2R |
chnode3.marsnet.local | ClickHouse Keeperタイブレーカーノード |
クラスターの設定例:
{uuid}を使用するようにテーブルをセットアップする手順
- 各サーバーでマクロを設定する サーバー1の例:
shardとreplicaのマクロを定義しますが、{uuid}はここで定義する必要はありません。組み込みであり、定義する必要はありません。
- データベースを作成する
- マクロと
{uuid}を使用してクラスターにテーブルを作成する
- 分散テーブルを作成する
テスト
- 最初のノードにデータを挿入する(例:
chnode1)
- 2番目のノードにデータを挿入する(例:
chnode2)
- 分散テーブルを使用してレコードを表示する
代替案
デフォルトのレプリケーションパスは、マクロで、{uuid}も使用して事前に定義できます
- 各ノードでテーブルのデフォルトを設定する
ノードが特定のデータベースに使用される場合は、マクロ{database}を各ノードで定義することもできます。
- 明示的なパラメータなしでテーブルを作成する:
- デフォルト構成で定義されている設定が使われていることを確認する
トラブルシューティング
テーブル情報とUUIDを取得するコマンドの例:
上記のテーブルのUUIDを使用して、ZooKeeper内のテーブル情報を取得するためのコマンド例
データベースはAtomicである必要があります。以前のバージョンからアップグレードした場合、
defaultデータベースはおそらくOrdinaryタイプです。
確認するには:
例えば、
ClickHouse Keeper動的再構成
このページは ClickHouse Cloud には適用されません。ここで説明している手順は、ClickHouse Cloud サービスでは自動化されています。
説明
ClickHouse Keeper は、keeper_server.enable_reconfiguration が有効になっている場合、ZooKeeper の reconfig
コマンドによる動的なクラスター再構成を部分的にサポートします。
この設定が無効になっている場合は、レプリカの raft_configuration
セクションを手動で変更することでクラスターを再構成できます。変更を適用するのはリーダーのみであるため、必ずすべてのレプリカ上のファイルを編集してください。
あるいは、ZooKeeper 互換クライアントを使用して reconfig クエリを送信することもできます。
仮想ノード /keeper/config には、次の形式で最後にコミットされたクラスター構成が含まれます:
- 各サーバーエントリは改行で区切られます。
server_typeはparticipantまたはlearnerのいずれかです(learnerはリーダー選出に参加しません)。server_priorityは、どのノードをリーダー選出で優先すべきかを示す非負の整数です。 優先度が0の場合、そのサーバーがリーダーになることは決してありません。
例:
reconfigコマンドを使用すると、新しいサーバーの追加、既存サーバーの削除、および既存サーバーの優先度の変更を行うことができます。以下に例を示します(clickhouse-keeper-clientを使用する場合):
kazoo の例は次のとおりです。
joining内のサーバーは、上記で説明したサーバー形式である必要があります。サーバーエントリはカンマで区切る必要があります。
新しいサーバーを追加する際、server_priority(デフォルト値は1)とserver_type(デフォルト値はparticipant)を省略できます。
既存のサーバーの優先度を変更したい場合は、ターゲット優先度でjoiningに追加します。
サーバーのホスト、ポート、タイプは既存のサーバー設定と等しくなければなりません。
サーバーはjoiningとleavingの出現順に追加および削除されます。
joiningからのすべての更新は、leavingからの更新の前に処理されます。
Keeper再構成実装にはいくつかの注意事項があります:
-
増分再構成のみがサポートされています。空でない
new_membersを持つリクエストは拒否されます。ClickHouse Keeper実装は、メンバーシップを動的に変更するためにNuRaft APIに依存しています。NuRaftには、単一のサーバーを追加または削除する方法があり、一度に1つずつです。これは、設定への各変更(
joiningの各部分、leavingの各部分)が個別に決定されなければならないことを意味します。したがって、エンドユーザーにとって誤解を招く可能性があるため、バルク再構成は利用できません。サーバータイプ(participant/learner)の変更もNuRaftでサポートされていないため不可能であり、唯一の方法はサーバーを削除して追加することであり、これも誤解を招く可能性があります。
-
返された
znodestat値は使用できません。 -
from_versionフィールドは使用されません。from_versionが設定されたすべてのリクエストは拒否されます。 これは、/keeper/configが仮想ノードであり、永続ストレージに保存されるのではなく、すべてのリクエストに対して指定されたノード設定でその場で生成されるという事実によるものです。 この決定は、NuRaftがすでにこの設定を保存しているため、データを重複させないために行われました。 -
ZooKeeperとは異なり、
syncコマンドを送信することでクラスター再構成を待機する方法はありません。 新しい設定は_最終的に_適用されますが、時間保証はありません。 -
reconfigコマンドはさまざまな理由で失敗する可能性があります。クラスターの状態を確認して、更新が適用されたかどうかを確認できます。
単一ノードのkeeperをクラスターに変換する
場合によっては、実験的なkeeperノードをクラスターに拡張する必要があります。ここに、3ノードクラスターでこれを段階的に行う方法のスキームがあります:
- 重要:新しいノードは現在のクォーラムよりも少ないバッチで追加する必要があります。そうでないと、それら自身の間でリーダーを選出します。この例では1つずつです。
- 既存のkeeperノードは、
keeper_server.enable_reconfiguration設定パラメータをオンにする必要があります。 - 新しいkeeperクラスターの完全な新しい設定で2番目のノードを起動します。
- 起動したら、
reconfigを使用してノード1に追加します。 - 次に、3番目のノードを起動し、
reconfigを使用して追加します。 - そこに新しいkeeperノードを追加して
clickhouse-server設定を更新し、再起動して変更を適用します。 - ノード1のraft設定を更新し、オプションで再起動します。
プロセスに自信を持つために、サンドボックスリポジトリがあります。
サポートされていない機能
ClickHouse KeeperはZooKeeperと完全に互換性があることを目指していますが、現在実装されていない機能がいくつかあります(ただし、開発は継続中です):
createはStatオブジェクトの返却をサポートしていませんcreateはTTLをサポートしていませんaddWatchはPERSISTENTウォッチでは動作しませんremoveWatchとremoveAllWatchesはサポートされていませんsetWatchesはサポートされていませんCONTAINERタイプのznodesの作成はサポートされていませんSASL認証はサポートされていません