Skip to content
ClickHouse Docs
ClickHouse DocsClickHouse Docs

データのレプリケーション

この例では、データをレプリケーションするシンプルな ClickHouse クラスターのセットアップ方法を学びます。サーバーは 5 台構成です。うち 2 台はデータのコピーを保持するために使用されます。残りの 3 台は、データのレプリケーションを調整するために使用されます。

これからセットアップするクラスターのアーキテクチャを以下に示します。

ReplicatedMergeTree を使用した 1 分片 2 レプリカのアーキテクチャ図

前提条件

ディレクトリ構造とテスト環境のセットアップ

このチュートリアルでは、Docker compose を使用して ClickHouse クラスターをセットアップします。このセットアップは、個別のローカルマシン、仮想マシン、またはクラウドインスタンスに合わせて変更することも可能です。

次のコマンドを実行して、この例のディレクトリ構造を作成します。

mkdir cluster_1S_2R
cd cluster_1S_2R

# Create clickhouse-keeper directories
for i in {01..03}; do
  mkdir -p fs/volumes/clickhouse-keeper-${i}/etc/clickhouse-keeper
done

# Create clickhouse-server directories
for i in {01..02}; do
  mkdir -p fs/volumes/clickhouse-${i}/etc/clickhouse-server
done

次の docker-compose.yml ファイルを cluster_1S_2R ディレクトリに追加します:

docker-compose.ymlyaml
version: '3.8'
services:
  clickhouse-01:
    image: "clickhouse/clickhouse-server:latest"
    user: "101:101"
    container_name: clickhouse-01
    hostname: clickhouse-01
    volumes:
      - ${PWD}/fs/volumes/clickhouse-01/etc/clickhouse-server/config.d/config.xml:/etc/clickhouse-server/config.d/config.xml
      - ${PWD}/fs/volumes/clickhouse-01/etc/clickhouse-server/users.d/users.xml:/etc/clickhouse-server/users.d/users.xml
    ports:
      - "127.0.0.1:8123:8123"
      - "127.0.0.1:9000:9000"
    depends_on:
      - clickhouse-keeper-01
      - clickhouse-keeper-02
      - clickhouse-keeper-03
  clickhouse-02:
    image: "clickhouse/clickhouse-server:latest"
    user: "101:101"
    container_name: clickhouse-02
    hostname: clickhouse-02
    volumes:
      - ${PWD}/fs/volumes/clickhouse-02/etc/clickhouse-server/config.d/config.xml:/etc/clickhouse-server/config.d/config.xml
      - ${PWD}/fs/volumes/clickhouse-02/etc/clickhouse-server/users.d/users.xml:/etc/clickhouse-server/users.d/users.xml
    ports:
      - "127.0.0.1:8124:8123"
      - "127.0.0.1:9001:9000"
    depends_on:
      - clickhouse-keeper-01
      - clickhouse-keeper-02
      - clickhouse-keeper-03
  clickhouse-keeper-01:
    image: "clickhouse/clickhouse-keeper:latest-alpine"
    user: "101:101"
    container_name: clickhouse-keeper-01
    hostname: clickhouse-keeper-01
    volumes:
     - ${PWD}/fs/volumes/clickhouse-keeper-01/etc/clickhouse-keeper/keeper_config.xml:/etc/clickhouse-keeper/keeper_config.xml
    ports:
        - "127.0.0.1:9181:9181"
  clickhouse-keeper-02:
    image: "clickhouse/clickhouse-keeper:latest-alpine"
    user: "101:101"
    container_name: clickhouse-keeper-02
    hostname: clickhouse-keeper-02
    volumes:
     - ${PWD}/fs/volumes/clickhouse-keeper-02/etc/clickhouse-keeper/keeper_config.xml:/etc/clickhouse-keeper/keeper_config.xml
    ports:
        - "127.0.0.1:9182:9181"
  clickhouse-keeper-03:
    image: "clickhouse/clickhouse-keeper:latest-alpine"
    user: "101:101"
    container_name: clickhouse-keeper-03
    hostname: clickhouse-keeper-03
    volumes:
     - ${PWD}/fs/volumes/clickhouse-keeper-03/etc/clickhouse-keeper/keeper_config.xml:/etc/clickhouse-keeper/keeper_config.xml
    ports:
        - "127.0.0.1:9183:9181"

以下のサブディレクトリとファイルを作成してください:

for i in {01..02}; do
  mkdir -p fs/volumes/clickhouse-${i}/etc/clickhouse-server/config.d
  mkdir -p fs/volumes/clickhouse-${i}/etc/clickhouse-server/users.d
  touch fs/volumes/clickhouse-${i}/etc/clickhouse-server/config.d/config.xml
  touch fs/volumes/clickhouse-${i}/etc/clickhouse-server/users.d/users.xml
done
  • config.d ディレクトリには、ClickHouse server の構成ファイル config.xml が含まれており、 ここで各 ClickHouse ノード用のカスタム構成を定義します。この 構成は、すべての ClickHouse インストールに含まれるデフォルトの config.xml 構成 ファイルと組み合わされます。
  • users.d ディレクトリにはユーザー構成ファイル users.xml が含まれており、ここで ユーザーごとのカスタム構成を定義します。この構成は、すべての ClickHouse インストールに含まれるデフォルトの users.xml 構成ファイルと組み合わされます。

ClickHouseノードの設定

サーバーのセットアップ

次に、fs/volumes/clickhouse-{}/etc/clickhouse-server/config.d にある空の設定ファイル config.xml をそれぞれ編集します。以下でハイライトされている行は、各ノード固有の値に変更してください。

<clickhouse replace="true">
    <logger>
        <level>debug</level>
        <log>/var/log/clickhouse-server/clickhouse-server.log</log>
        <errorlog>/var/log/clickhouse-server/clickhouse-server.err.log</errorlog>
        <size>1000M</size>
        <count>3</count>
    </logger>
    <display_name>cluster_1S_2R node 1</display_name>
    <listen_host>0.0.0.0</listen_host>
    <http_port>8123</http_port>
    <tcp_port>9000</tcp_port>
    <user_directories>
        <users_xml>
            <path>users.xml</path>
        </users_xml>
        <local_directory>
            <path>/var/lib/clickhouse/access/</path>
        </local_directory>
    </user_directories>
    <distributed_ddl>
        <path>/clickhouse/task_queue/ddl</path>
    </distributed_ddl>
    <remote_servers>
        <cluster_1S_2R>
            <shard>
                <internal_replication>true</internal_replication>
                <replica>
                    <host>clickhouse-01</host>
                    <port>9000</port>
                </replica>
                <replica>
                    <host>clickhouse-02</host>
                    <port>9000</port>
                </replica>
            </shard>
        </cluster_1S_2R>
    </remote_servers>
    <zookeeper>
        <node>
            <host>clickhouse-keeper-01</host>
            <port>9181</port>
        </node>
        <node>
            <host>clickhouse-keeper-02</host>
            <port>9181</port>
        </node>
        <node>
            <host>clickhouse-keeper-03</host>
            <port>9181</port>
        </node>
    </zookeeper>
    <macros>
        <shard>01</shard>
        <replica>01</replica>
        <cluster>cluster_1S_2R</cluster>
    </macros>
</clickhouse>
ディレクトリ File
fs/volumes/clickhouse-01/etc/clickhouse-server/config.d config.xml
fs/volumes/clickhouse-02/etc/clickhouse-server/config.d config.xml

上記の設定ファイルの各セクションについて、以下で詳しく説明します。

ネットワークとログ

ネットワークインターフェイスで外部からの通信を有効にするには、listen host 設定を有効化します。これにより、ClickHouse server のホストに他の ホストからアクセスできるようになります:

<listen_host>0.0.0.0</listen_host>

HTTP API のポートは 8123 に設定されています。

<http_port>8123</http_port>

clickhouse-client や他のネイティブ ClickHouse ツール、ならびに clickhouse-server と他の clickhouse-servers の間で ClickHouse のネイティブプロトコルによる通信に使用される TCP ポートは、9000 に設定されています。

<tcp_port>9000</tcp_port>

ロギングは <logger> ブロックで定義します。以下の設定例では、1000M に達するとローテーションするデバッグログを3世代分保持します:

<logger>
    <level>debug</level>
    <log>/var/log/clickhouse-server/clickhouse-server.log</log>
    <errorlog>/var/log/clickhouse-server/clickhouse-server.err.log</errorlog>
    <size>1000M</size>
    <count>3</count>
</logger>

ロギング設定の詳細については、デフォルトの ClickHouse 設定ファイルに含まれるコメントを参照してください。

クラスターの設定

クラスターの設定は <remote_servers> ブロックで行います。 ここでクラスター名 cluster_1S_2R を定義します。

<cluster_1S_2R></cluster_1S_2R> ブロックは、<shard></shard> および <replica></replica> の設定を使用してクラスターのレイアウトを定義し、ON CLUSTER 句を使用してクラスター全体で実行される distributed DDL クエリのテンプレートとして機能します。デフォルトでは distributed DDL クエリは許可されていますが、allow_distributed_ddl_queries の設定で無効にすることもできます。

internal_replication を true に設定することで、データはいずれか1つのレプリカにのみ書き込まれます。

<remote_servers>
    <!-- cluster name (should not contain dots) -->
    <cluster_1S_2R>
        <!-- <allow_distributed_ddl_queries>false</allow_distributed_ddl_queries> -->
        <shard>
            <!-- Optional. Whether to write data to just one of the replicas. Default: false (write data to all replicas). -->
            <internal_replication>true</internal_replication>
            <replica>
                <host>clickhouse-01</host>
                <port>9000</port>
            </replica>
            <replica>
                <host>clickhouse-02</host>
                <port>9000</port>
            </replica>
        </shard>
    </cluster_1S_2R>
</remote_servers>

各サーバーに対して、次のパラメーターを指定します。

Parameter Description Default Value
host リモートサーバーのアドレスです。ドメイン名、IPv4 アドレス、IPv6 アドレスのいずれかを使用できます。ドメイン名を指定すると、サーバーは起動時に DNS ルックアップを実行し、その結果はサーバーの稼働中保持されます。DNS ルックアップに失敗すると、サーバーは起動しません。DNS レコードを変更した場合は、サーバーを再起動する必要があります。 -
port メッセンジャー通信用の TCP ポートです (設定ファイルでは tcp_port、通常は 9000 に設定されています) 。http_port と混同しないでください。 -

Keeperの設定

<ZooKeeper> セクションでは、ClickHouse Keeper (または ZooKeeper) の実行場所を ClickHouse に指定します。 ClickHouse Keeper クラスターを使用する場合、クラスター内の各 <node> に対して、<host> タグおよび <port> タグでそれぞれホスト名とポート番号を指定する必要があります。

ClickHouse Keeper のセットアップについては、チュートリアルの次のステップで説明します。

<zookeeper>
    <node>
        <host>clickhouse-keeper-01</host>
        <port>9181</port>
    </node>
    <node>
        <host>clickhouse-keeper-02</host>
        <port>9181</port>
    </node>
    <node>
        <host>clickhouse-keeper-03</host>
        <port>9181</port>
    </node>
</zookeeper>

マクロの設定

また、<macros> セクションはレプリケートテーブル向けのパラメータ置換を定義するために使用されます。これらは system.macros に一覧表示され、クエリ内で {shard}{replica} などの置換を利用できます。

<macros>
    <shard>01</shard>
    <replica>01</replica>
    <cluster>cluster_1S_2R</cluster>
</macros>

ユーザー設定

次に、fs/volumes/clickhouse-{}/etc/clickhouse-server/users.d にある空の設定ファイル users.xml をそれぞれ以下の内容に変更します。

/users.d/users.xmlxml
<?xml version="1.0"?>
<clickhouse replace="true">
    <profiles>
        <default>
            <max_memory_usage>10000000000</max_memory_usage>
            <use_uncompressed_cache>0</use_uncompressed_cache>
            <load_balancing>in_order</load_balancing>
            <log_queries>1</log_queries>
        </default>
    </profiles>
    <users>
        <default>
            <access_management>1</access_management>
            <profile>default</profile>
            <networks>
                <ip>::/0</ip>
            </networks>
            <quota>default</quota>
            <access_management>1</access_management>
            <named_collection_control>1</named_collection_control>
            <show_named_collections>1</show_named_collections>
            <show_named_collections_secrets>1</show_named_collections_secrets>
        </default>
    </users>
    <quotas>
        <default>
            <interval>
                <duration>3600</duration>
                <queries>0</queries>
                <errors>0</errors>
                <result_rows>0</result_rows>
                <read_rows>0</read_rows>
                <execution_time>0</execution_time>
            </interval>
        </default>
    </quotas>
</clickhouse>
ディレクトリ File
fs/volumes/clickhouse-01/etc/clickhouse-server/users.d users.xml
fs/volumes/clickhouse-02/etc/clickhouse-server/users.d users.xml

この例では、簡略化のためにデフォルトユーザーをパスワードなしで設定しています。 実際の運用では、この設定は推奨されません。

ClickHouse Keeperの設定

Keeperのセットアップ

レプリケーションを機能させるには、ClickHouse Keeper クラスターをセットアップして 設定する必要があります。ClickHouse Keeper はデータレプリケーションのための 調整システムを提供し、ZooKeeper の代替として動作します。ZooKeeper を使用することも可能ですが、 より優れた保証と信頼性を備え、 ZooKeeper よりも少ないリソースで動作するため、ClickHouse Keeper の使用が推奨されます。高可用性を確保し、 クォーラムを維持するため、少なくとも 3 台の ClickHouse Keeper ノードを実行することを推奨します。

各 ClickHouse Keeper ノード用の keeper_config.xml ファイルを、 example フォルダーのルートで次のコマンドを使用して作成します。

for i in {01..03}; do
  touch fs/volumes/clickhouse-keeper-${i}/etc/clickhouse-keeper/keeper_config.xml
done

各 ノードディレクトリ fs/volumes/clickhouse-keeper-{}/etc/clickhouse-keeper に作成された空の設定ファイルを編集します。以下で 強調表示されている行は、各ノードごとに対応する内容へ変更する必要があります。

/clickhouse-keeper/keeper_config.xmlxml
<clickhouse replace="true">
    <logger>
        <level>information</level>
        <log>/var/log/clickhouse-keeper/clickhouse-keeper.log</log>
        <errorlog>/var/log/clickhouse-keeper/clickhouse-keeper.err.log</errorlog>
        <size>1000M</size>
        <count>3</count>
    </logger>
    <listen_host>0.0.0.0</listen_host>
    <keeper_server>
        <tcp_port>9181</tcp_port>
        <server_id>1</server_id>
        <log_storage_path>/var/lib/clickhouse/coordination/log</log_storage_path>
        <snapshot_storage_path>/var/lib/clickhouse/coordination/snapshots</snapshot_storage_path>
        <coordination_settings>
            <operation_timeout_ms>10000</operation_timeout_ms>
            <session_timeout_ms>30000</session_timeout_ms>
            <raft_logs_level>information</raft_logs_level>
        </coordination_settings>
        <raft_configuration>
            <server>
                <id>1</id>
                <hostname>clickhouse-keeper-01</hostname>
                <port>9234</port>
            </server>
            <server>
                <id>2</id>
                <hostname>clickhouse-keeper-02</hostname>
                <port>9234</port>
            </server>
            <server>
                <id>3</id>
                <hostname>clickhouse-keeper-03</hostname>
                <port>9234</port>
            </server>
        </raft_configuration>
    </keeper_server>
</clickhouse>
ディレクトリ ファイル
fs/volumes/clickhouse-keeper-01/etc/clickhouse-keeper keeper_config.xml
fs/volumes/clickhouse-keeper-02/etc/clickhouse-keeper keeper_config.xml
fs/volumes/clickhouse-keeper-03/etc/clickhouse-keeper keeper_config.xml

各設定ファイルには、次のような固有の設定 (以下参照) を含めます。 使用する server_id は、クラスター内の該当する ClickHouse Keeper ノードごとに一意であり、 <raft_configuration> セクションで定義されたサーバーの <id> と一致している必要があります。 tcp_port は、ClickHouse Keeper のクライアントが使用するポートです。

<tcp_port>9181</tcp_port>
<server_id>{id}</server_id>

次のセクションでは、 Raftコンセンサスアルゴリズムのクォーラムに参加する サーバーを設定します。

<raft_configuration>
    <server>
        <id>1</id>
        <hostname>clickhouse-keeper-01</hostname>
        <!-- ClickHouse Keeperノード間の通信に使用するTCPポート -->
        <port>9234</port>
    </server>
    <server>
        <id>2</id>
        <hostname>clickhouse-keeper-02</hostname>
        <port>9234</port>
    </server>
    <server>
        <id>3</id>
        <hostname>clickhouse-keeper-03</hostname>
        <port>9234</port>
    </server>
</raft_configuration>

セットアップをテストする

お使いのマシンで Docker が実行中であることを確認してください。 cluster_1S_2R ディレクトリのルートで docker-compose up コマンドを実行し、クラスターを起動します。

docker-compose up -d

docker が ClickHouse と Keeper のイメージのプルを開始し、 その後コンテナーが起動するはずです:

[+] Running 6/6
 Network cluster_1s_2r_default   Created
 Container clickhouse-keeper-03  Started
 Container clickhouse-keeper-02  Started
 Container clickhouse-keeper-01  Started
 Container clickhouse-01         Started
 Container clickhouse-02         Started

クラスターが稼働していることを確認するには、clickhouse-01 または clickhouse-02 のいずれかに接続し、次のクエリを実行します。以下は、最初のノードに接続するコマンドです:

# Connect to any node
docker exec -it clickhouse-01 clickhouse-client

成功すると、ClickHouse client のプロンプトが表示されます:

cluster_1S_2R node 1 :)

どのホストにどのクラスターのトポロジーが定義されているかを確認するには、次の クエリを実行します。

Querysql
SELECT 
    cluster,
    shard_num,
    replica_num,
    host_name,
    port
FROM system.clusters;
Responseresponse
   ┌─cluster───────┬─shard_num─┬─replica_num─┬─host_name─────┬─port─┐
1. │ cluster_1S_2R │         1 │           1 │ clickhouse-01 │ 9000 │
2. │ cluster_1S_2R │         1 │           2 │ clickhouse-02 │ 9000 │
3. │ default       │         1 │           1 │ localhost     │ 9000 │
   └───────────────┴───────────┴─────────────┴───────────────┴──────┘

ClickHouse Keeper クラスターの状態を確認するには、次のクエリを実行します。

Querysql
SELECT *
FROM system.zookeeper
WHERE path IN ('/', '/clickhouse')
Responseresponse
   ┌─name───────┬─value─┬─path────────┐
1. │ sessions   │       │ /clickhouse │
2. │ task_queue │       │ /clickhouse │
3. │ keeper     │       │ /           │
4. │ clickhouse │       │ /           │
   └────────────┴───────┴─────────────┘

mntr コマンドは、ClickHouse Keeper が稼働していることを確認し、 3 つの Keeper ノード間の関係に関する状態情報を取得するためにも一般的に使用されます。 この例で使用する構成では、3 つのノードが連携して動作します。 ノードは leader を選出し、残りのノードは followers になります。

mntr コマンドでは、パフォーマンスに関する情報に加え、 特定のノードが follower か leader かも確認できます。

以下のコマンドを clickhouse-keeper-01clickhouse-keeper-02、および clickhouse-keeper-03 のシェルで実行し、各 Keeper ノードのステータスを確認します。clickhouse-keeper-01 で実行するコマンドを以下に示します。

docker exec -it clickhouse-keeper-01  /bin/sh -c 'echo mntr | nc 127.0.0.1 9181'

以下は、フォロワーノードからのレスポンス例です。

Responseresponse
zk_version      v23.3.1.2823-testing-46e85357ce2da2a99f56ee83a079e892d7ec3726
zk_avg_latency  0
zk_max_latency  0
zk_min_latency  0
zk_packets_received     0
zk_packets_sent 0
zk_num_alive_connections        0
zk_outstanding_requests 0
zk_server_state follower
zk_znode_count  6
zk_watch_count  0
zk_ephemerals_count     0
zk_approximate_data_size        1271
zk_key_arena_size       4096
zk_latest_snapshot_size 0
zk_open_file_descriptor_count   46
zk_max_file_descriptor_count    18446744073709551615

以下は、リーダーノードからのレスポンス例です:

Responseresponse
zk_version      v23.3.1.2823-testing-46e85357ce2da2a99f56ee83a079e892d7ec3726
zk_avg_latency  0
zk_max_latency  0
zk_min_latency  0
zk_packets_received     0
zk_packets_sent 0
zk_num_alive_connections        0
zk_outstanding_requests 0
zk_server_state leader
zk_znode_count  6
zk_watch_count  0
zk_ephemerals_count     0
zk_approximate_data_size        1271
zk_key_arena_size       4096
zk_latest_snapshot_size 0
zk_open_file_descriptor_count   48
zk_max_file_descriptor_count    18446744073709551615
zk_followers    2
zk_synced_followers     2

これで、1 つの分片と 2 つのレプリカを持つ ClickHouse クラスターのセットアップは完了です。 次のステップでは、このクラスターにテーブルを作成します。

データベースを作成する

クラスターが正しくセットアップされ、稼働していることを確認できたので、 UK property prices サンプルデータセットのチュートリアルで使用したものと同じテーブルを再作成します。これは、1995年以降の イングランドおよびウェールズの不動産の成約価格約3,000万行で構成されています。

各ホストのクライアントに接続するには、以下の各コマンドを、それぞれ別のターミナルの タブまたはウィンドウで実行します。

docker exec -it clickhouse-01 clickhouse-client
docker exec -it clickhouse-02 clickhouse-client

各ホストの clickhouse-client から以下のクエリを実行し、 デフォルト以外のデータベースがまだ作成されていないことを確認できます:

Querysql
SHOW DATABASES;
Responseresponse
   ┌─name───────────────┐
1. │ INFORMATION_SCHEMA │
2. │ default            │
3. │ information_schema │
4. │ system             │
   └────────────────────┘

clickhouse-01 クライアントから、uk という名前の新しいデータベースを作成するため、ON CLUSTER 句を使って次の 分散 DDL クエリを実行します:

CREATE DATABASE IF NOT EXISTS uk 
ON CLUSTER cluster_1S_2R;

各ホストのクライアントから先ほどと同じクエリをもう一度実行し、 クエリを実行したのが clickhouse-01 のみであっても、データベースがクラスター全体に作成されていることを確認できます:

SHOW DATABASES;
   ┌─name───────────────┐
1. │ INFORMATION_SCHEMA │
2. │ default            │
3. │ information_schema │
4. │ system             │
5. │ uk                 │
   └────────────────────┘

クラスター上にテーブルを作成する

データベースを作成したら、クラスター上にテーブルを作成します。 以下のクエリを任意のホストクライアントから実行します。

CREATE TABLE IF NOT EXISTS uk.uk_price_paid_local
ON CLUSTER cluster_1S_2R
(
    price UInt32,
    date Date,
    postcode1 LowCardinality(String),
    postcode2 LowCardinality(String),
    type Enum8('terraced' = 1, 'semi-detached' = 2, 'detached' = 3, 'flat' = 4, 'other' = 0),
    is_new UInt8,
    duration Enum8('freehold' = 1, 'leasehold' = 2, 'unknown' = 0),
    addr1 String,
    addr2 String,
    street LowCardinality(String),
    locality LowCardinality(String),
    town LowCardinality(String),
    district LowCardinality(String),
    county LowCardinality(String)
)
ENGINE = ReplicatedMergeTree
ORDER BY (postcode1, postcode2, addr1, addr2);

これは、元の CREATE ステートメントで使用された UK property prices サンプルデータセットのチュートリアル内のクエリと同一で、 ON CLUSTER 句と ReplicatedMergeTree エンジンを使用している点だけが異なります。

ON CLUSTER 句は、CREATEDROPALTERRENAME などの DDL (Data Definition Language) クエリを分散実行するためのもので、これらの スキーマ変更がクラスター内のすべてのノードに適用されるようにします。

ReplicatedMergeTree エンジンは通常の MergeTree テーブルエンジンと同様に動作しますが、データもレプリケーションされます。

以下のクエリを clickhouse-01 または clickhouse-02 のいずれかのクライアントから実行すると、 テーブルがクラスター全体で作成されていることを確認できます。

Querysql
SHOW TABLES IN uk;
Responseresponse
   ┌─name────────────────┐
1. │ uk_price_paid.      │
   └─────────────────────┘

データの挿入

データセットは大きく、完全に取り込むには数分かかるため、まずは少量のサブセットのみを挿入します。

以下のクエリを使用して、clickhouse-01 からデータの小さなサブセットを挿入してください:

INSERT INTO uk.uk_price_paid_local
SELECT
    toUInt32(price_string) AS price,
    parseDateTimeBestEffortUS(time) AS date,
    splitByChar(' ', postcode)[1] AS postcode1,
    splitByChar(' ', postcode)[2] AS postcode2,
    transform(a, ['T', 'S', 'D', 'F', 'O'], ['terraced', 'semi-detached', 'detached', 'flat', 'other']) AS type,
    b = 'Y' AS is_new,
    transform(c, ['F', 'L', 'U'], ['freehold', 'leasehold', 'unknown']) AS duration,
    addr1,
    addr2,
    street,
    locality,
    town,
    district,
    county
FROM url(
    'http://prod1.publicdata.landregistry.gov.uk.s3-website-eu-west-1.amazonaws.com/pp-complete.csv',
    'CSV',
    'uuid_string String,
    price_string String,
    time String,
    postcode String,
    a String,
    b String,
    c String,
    addr1 String,
    addr2 String,
    street String,
    locality String,
    town String,
    district String,
    county String,
    d String,
    e String'
) LIMIT 10000
SETTINGS max_http_get_redirects=10;

データが各ホストに完全にレプリケートされていることに注目してください:

-- clickhouse-01
SELECT count(*)
FROM uk.uk_price_paid_local

--   ┌─count()─┐
-- 1.│   10000 │
--   └─────────┘

-- clickhouse-02
SELECT count(*)
FROM uk.uk_price_paid_local

--   ┌─count()─┐
-- 1.│   10000 │
--   └─────────┘

ホストに障害が発生した場合の動作を確認するため、いずれかのホストからシンプルなテスト用データベースとテスト用テーブルを作成します。

CREATE DATABASE IF NOT EXISTS test ON CLUSTER cluster_1S_2R;
CREATE TABLE test.test_table ON CLUSTER cluster_1S_2R
(
    `id` UInt64,
    `name` String
)
ENGINE = ReplicatedMergeTree
ORDER BY id;

uk_price_paid テーブルと同様に、どちらのホストからもデータを挿入できます:

INSERT INTO test.test_table (id, name) VALUES (1, 'Clicky McClickface');

では、ホストの1つがダウンした場合はどうなるでしょうか?これをシミュレートするために、次のコマンドを実行して clickhouse-01 を停止します:

docker stop clickhouse-01

次のコマンドを実行して、ホストがダウンしていることを確認します:

docker-compose ps
Responseresponse
NAME                   IMAGE                                        COMMAND            SERVICE                CREATED          STATUS          PORTS
clickhouse-02          clickhouse/clickhouse-server:latest          "/entrypoint.sh"   clickhouse-02          X minutes ago    Up X minutes    127.0.0.1:8124->8123/tcp, 127.0.0.1:9001->9000/tcp
clickhouse-keeper-01   clickhouse/clickhouse-keeper:latest-alpine   "/entrypoint.sh"   clickhouse-keeper-01   X minutes ago    Up X minutes    127.0.0.1:9181->9181/tcp
clickhouse-keeper-02   clickhouse/clickhouse-keeper:latest-alpine   "/entrypoint.sh"   clickhouse-keeper-02   X minutes ago    Up X minutes    127.0.0.1:9182->9181/tcp
clickhouse-keeper-03   clickhouse/clickhouse-keeper:latest-alpine   "/entrypoint.sh"   clickhouse-keeper-03   X minutes ago    Up X minutes    127.0.0.1:9183->9181/tcp

clickhouse-01 がダウンしている状態で、テストテーブルにもう1行データを挿入し、テーブルをクエリします:

INSERT INTO test.test_table (id, name) VALUES (2, 'Alexey Milovidov');
SELECT * FROM test.test_table;
Responseresponse
   ┌─id─┬─name───────────────┐
1. │  1 │ Clicky McClickface │
2. │  2 │ Alexey Milovidov   │
   └────┴────────────────────┘

次のコマンドで clickhouse-01 を再起動してください (再起動後に docker-compose ps を再度実行して確認できます) :

docker start clickhouse-01

docker exec -it clickhouse-01 clickhouse-client を実行した後、clickhouse-01 からテストテーブルに再度クエリを実行します。

Querysql
SELECT * FROM test.test_table
Responseresponse
   ┌─id─┬─name───────────────┐
1. │  1 │ Clicky McClickface │
2. │  2 │ Alexey Milovidov   │
   └────┴────────────────────┘

この段階でUKの不動産価格データセット全体を取り込んで試したい場合は、以下のクエリを実行してください。

TRUNCATE TABLE uk.uk_price_paid_local ON CLUSTER cluster_1S_2R;
INSERT INTO uk.uk_price_paid_local
SELECT
    toUInt32(price_string) AS price,
    parseDateTimeBestEffortUS(time) AS date,
    splitByChar(' ', postcode)[1] AS postcode1,
    splitByChar(' ', postcode)[2] AS postcode2,
    transform(a, ['T', 'S', 'D', 'F', 'O'], ['terraced', 'semi-detached', 'detached', 'flat', 'other']) AS type,
    b = 'Y' AS is_new,
    transform(c, ['F', 'L', 'U'], ['freehold', 'leasehold', 'unknown']) AS duration,
    addr1,
    addr2,
    street,
    locality,
    town,
    district,
    county
FROM url(
    'http://prod1.publicdata.landregistry.gov.uk.s3-website-eu-west-1.amazonaws.com/pp-complete.csv',
    'CSV',
    'uuid_string String,
    price_string String,
    time String,
    postcode String,
    a String,
    b String,
    c String,
    addr1 String,
    addr2 String,
    street String,
    locality String,
    town String,
    district String,
    county String,
    d String,
    e String'
    ) SETTINGS max_http_get_redirects=10;

clickhouse-02 または clickhouse-01 からテーブルにクエリを実行します:

Querysql
SELECT count(*) FROM uk.uk_price_paid_local;
Responseresponse
   ┌──count()─┐
1. │ 30212555 │ -- 30.21 million
   └──────────┘

結論

このクラスター トポロジーの利点は、レプリカが 2 つあることで、 データが 2 台の異なるホストに存在する点です。1 台のホストで障害が発生しても、もう一方のレプリカが データ提供を損失なく継続します。これにより、ストレージ層における単一障害点を 排除できます。

1 台のホストが停止しても、残っているレプリカでは引き続き次のことが可能です。

  • 読み取りクエリを中断なく処理する
  • 新しい書き込みを受け付ける (整合性設定によって異なります)
  • アプリケーション向けのサービス可用性を維持する

障害が発生したホストがオンラインに復帰すると、次のことが可能になります。

  • 正常なレプリカから不足データを自動的に同期する
  • 手動で介入しなくても通常運用を再開する
  • 完全な冗長性をすばやく復元する

次の例では、分片が 2 つあり、 レプリカが 1 つだけのクラスターをどのようにセットアップするかを見ていきます。

Navigation