3台の CentOS 7 サーバー上で ClickHouse の複数インスタンスを構成し、3シャード・2レプリカの高可用クラスタを構築する方法を説明します。
サーバー構成
| ホスト名 | IPアドレス | インストール済みパッケージ | インスタンス1ポート | インスタンス2ポート |
|---|---|---|---|---|
| centf8118.sharding1.db | 192.168.81.18 | clickhouse-server, clickhouse-client | 9000 | 9002 |
| centf8119.sharding2.db | 192.168.81.19 | clickhouse-server, clickhouse-client | 9000 | 9002 |
| centf8120.sharding3.db | 192.168.81.20 | clickhouse-server, clickhouse-client | 9000 | 9002 |
クラスタトポロジ
| レプリカ1 | レプリカ2 | |
|---|---|---|
| シャード1 | 192.168.81.18:9000 | 192.168.81.19:9002 |
| シャード2 | 192.168.81.19:9000 | 192.168.81.20:9002 |
| シャード3 | 192.168.81.20:9000 | 192.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*.xml で macros を以下のように設定します:
- 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 経由でデータが自動同期されます。