ClickHouse の複数インスタンスによる 3シャード2レプリカクラスタ構築手順

3台の CentOS 7 サーバー上で ClickHouse の複数インスタンスを構成し、3シャード・2レプリカの高可用クラスタを構築する方法を説明します。

サーバー構成

ホスト名IPアドレスインストール済みパッケージインスタンス1ポートインスタンス2ポート
centf8118.sharding1.db192.168.81.18clickhouse-server, clickhouse-client90009002
centf8119.sharding2.db192.168.81.19clickhouse-server, clickhouse-client90009002
centf8120.sharding3.db192.168.81.20clickhouse-server, clickhouse-client90009002

クラスタトポロジ

レプリカ1レプリカ2
シャード1192.168.81.18:9000192.168.81.19:9002
シャード2192.168.81.19:9000192.168.81.20:9002
シャード3192.168.81.20:9000192.168.81.18:9002

ClickHouse のインストール

各ノードに clickhouse-server および clickhouse-client を標準手順でインストールします。

追加インスタンスの設定

設定ファイルの複製と修正

[root@centf8118 ~]# cp /etc/clickhouse-server/config.xml /etc/clickhouse-server/config9002.xml

以下のように config9002.xml を編集し、ポートやパスを変更します:

<log>/var/log/clickhouse-server/clickhouse-server-9002.log</log>
<errorlog>/var/log/clickhouse-server/clickhouse-server-9002.err.log</errorlog>
<http_port>8124</http_port>
<tcp_port>9002</tcp_port>
<mysql_port>9005</mysql_port>
<interserver_http_port>9010</interserver_http_port>
<path>/data/clickhouse9002/</path>
<tmp_path>/data/clickhouse9002/tmp/</tmp_path>
<user_files_path>/data/clickhouse9002/user_files/</user_files_path>
<access_control_path>/data/clickhouse9002/access/</access_control_path>
<include_from>/etc/clickhouse-server/metrika9002.xml</include_from>

データディレクトリの作成

[root@centf8118 ~]# mkdir -p /data/clickhouse9002
[root@centf8118 ~]# chown -R clickhouse:clickhouse /data/clickhouse9002

サービススクリプトの複製と調整

[root@centf8118 ~]# cp /etc/init.d/clickhouse-server /etc/init.d/clickhouse-server9002

スクリプト内で以下の変数を修正します:

CLICKHOUSE_CONFIG=$CLICKHOUSE_CONFDIR/config9002.xml
CLICKHOUSE_PIDFILE="$CLICKHOUSE_PIDDIR/$PROGRAM-9002.pid"

同様の手順を他の2台のサーバーでも実施します。

クラスタ設定(3シャード・2レプリカ)

共通の metrika 設定

全6つの metrika*.xml ファイルに以下の共通部分を含めます:

<yandex>
  <clickhouse_remote_servers>
    <xinchen_3shards_2replicas>
      <shard>
        <weight>1</weight>
        <internal_replication>true</internal_replication>
        <replica><host>192.168.81.18</host><port>9000</port></replica>
        <replica><host>192.168.81.19</host><port>9002</port></replica>
      </shard>
      <shard>
        <weight>1</weight>
        <internal_replication>true</internal_replication>
        <replica><host>192.168.81.19</host><port>9000</port></replica>
        <replica><host>192.168.81.20</host><port>9002</port></replica>
      </shard>
      <shard>
        <weight>1</weight>
        <internal_replication>true</internal_replication>
        <replica><host>192.168.81.20</host><port>9000</port></replica>
        <replica><host>192.168.81.18</host><port>9002</port></replica>
      </shard>
    </xinchen_3shards_2replicas>
  </clickhouse_remote_servers>

  <zookeeper-servers>
    <node index="1"><host>192.168.81.18</host><port>4181</port></node>
    <node index="2"><host>192.168.81.19</host><port>4181</port></node>
    <node index="3"><host>192.168.81.20</host><port>4181</port></node>
  </zookeeper-servers>

  <networks><ip>::/0</ip></networks>

  <clickhouse_compression>
    <case>
      <min_part_size>10000000000</min_part_size>
      <min_part_size_ratio>0.01</min_part_size_ratio>
      <method>lz4</method>
    </case>
  </clickhouse_compression>
</yandex>

各ノードごとの macros 設定

各インスタンスの metrika*.xmlmacros を以下のように設定します:

  • 192.168.81.18:9000<shard>01</shard>, <replica>cluster01-01-1</replica>
  • 192.168.81.18:9002<shard>03</shard>, <replica>cluster01-03-2</replica>
  • 192.168.81.19:9000<shard>02</shard>, <replica>cluster01-02-1</replica>
  • 192.168.81.19:9002<shard>01</shard>, <replica>cluster01-01-2</replica>
  • 192.168.81.20:9000<shard>03</shard>, <replica>cluster01-03-1</replica>
  • 192.168.81.20:9002<shard>02</shard>, <replica>cluster01-02-2</replica>

既存のテーブルがある場合は、macros の変更により起動エラーが発生する可能性があるため、事前に削除してください。

クラスタ起動と確認

各ノードで両方のインスタンスを起動します:

[root@centf8118 ~]# /etc/init.d/clickhouse-server start
[root@centf8118 ~]# /etc/init.d/clickhouse-server9002 start

すべてのインスタンスに接続し、system.clusters をクエリして構成を確認します:

clickhouse-client --host 192.168.81.18 --port 9000 -q "SELECT * FROM system.clusters WHERE cluster = 'xinchen_3shards_2replicas'"

高可用性検証

レプリケートテーブルの作成

全6インスタンスで以下のテーブルを作成します:

CREATE TABLE test_clusters_ha (
    dt Date,
    path String
) ENGINE = ReplicatedMergeTree(
    '/clickhouse/tables/{layer}-{shard}/test_clusters_ha',
    '{replica}',
    dt,
    (dt),
    8192
);

分散テーブルの作成

任意のノード(例:192.168.81.18:9000)で実行:

CREATE TABLE test_clusters_ha_all AS test_clusters_ha
ENGINE = Distributed(xinchen_3shards_2replicas, default, test_clusters_ha, rand());

データ挿入と障害シナリオテスト

分散テーブルにデータを挿入後、特定ノードを停止してクエリの一貫性を確認します。1ノードの停止ではデータ整合性が保たれますが、2ノード以上が停止するとクエリが失敗します。停止したノードを再起動すると、ZooKeeper 経由でデータが自動同期されます。

タグ: ClickHouse ReplicatedMergeTree Distributed クラスタ構成 ZooKeeper

5月16日 07:53 投稿