{
lib,
pkgs,
package,
...
}:
rec {
name = "clickhouse-keeper";
meta.maintainers = with pkgs.lib.maintainers; [
jpds
thevar1able
];
nodes =
let
node = i: {
environment.etc = {
"clickhouse-server/config.d/cluster.xml".text = ''
${lib.concatStrings (
lib.imap0 (j: name: ''
${name}
9000
'') (builtins.attrNames nodes)
)}
'';
"clickhouse-server/config.d/keeper.xml".text = ''
${toString i}
9181
/var/lib/clickhouse/coordination/log
/var/lib/clickhouse/coordination/snapshots
10000
30000
trace
10000
${lib.concatStrings (
lib.imap1 (j: name: ''
${toString j}
${name}
9444
'') (builtins.attrNames nodes)
)}
${lib.concatStrings (
lib.imap0 (j: name: ''
${name}
9181
'') (builtins.attrNames nodes)
)}
/clickhouse/testcluster/task_queue/ddl
'';
"clickhouse-server/config.d/listen.xml".text = ''
::
'';
"clickhouse-server/config.d/macros.xml".text = ''
${toString i}
perftest_2shards_1replicas
'';
};
networking.firewall.allowedTCPPorts = [
9009
9181
9444
];
services.clickhouse = {
enable = true;
inherit package;
};
systemd.services.clickhouse = {
after = [ "network-online.target" ];
requires = [ "network-online.target" ];
};
virtualisation.memorySize = 1024 * 4;
virtualisation.diskSize = 1024 * 10;
};
in
{
clickhouse1 = node 1;
clickhouse2 = node 2;
};
testScript =
let
# work around quote/substitution complexity by Nix, Perl, bash and SQL.
clustersQuery = pkgs.writeText "clusters.sql" "SHOW clusters";
keeperQuery = pkgs.writeText "keeper.sql" "SELECT * FROM system.zookeeper WHERE path IN ('/', '/clickhouse') FORMAT VERTICAL";
systemClustersQuery = pkgs.writeText "system-clusters.sql" "SELECT host_name, host_address, replica_num FROM system.clusters WHERE cluster = 'perftest_2shards_1replicas'";
tableDDL = pkgs.writeText "table.sql" ''
CREATE TABLE test ON cluster 'perftest_2shards_1replicas' ( A Int64, S String)
Engine = ReplicatedMergeTree('/clickhouse/{cluster}/tables/{database}/{table}', '{replica}')
ORDER BY A;
'';
insertDDL = pkgs.writeText "insert.sql" "
INSERT INTO test SELECT number, '' FROM numbers(100000000);
";
selectCountQuery = pkgs.writeText "select-count.sql" "
select count() from test;
";
in
''
clickhouse1.start()
clickhouse2.start()
for machine in clickhouse1, clickhouse2:
machine.wait_for_unit("clickhouse.service")
machine.wait_for_open_port(9000)
machine.wait_for_open_port(9009)
machine.wait_for_open_port(9181)
machine.wait_for_open_port(9444)
machine.wait_until_succeeds(
"""
journalctl -o cat -u clickhouse.service | grep "Merging configuration file '/etc/clickhouse-server/config.d/keeper.xml'"
"""
)
machine.log(machine.succeed(
"cat ${clustersQuery} | clickhouse-client | grep perftest_2shards_1replicas"
))
machine.log(machine.succeed(
"cat ${keeperQuery} | clickhouse-client"
))
machine.succeed(
"cat ${systemClustersQuery} | clickhouse-client | grep clickhouse1"
)
machine.succeed(
"cat ${systemClustersQuery} | clickhouse-client | grep clickhouse2"
)
machine.succeed(
"ls /var/lib/clickhouse/coordination/log | grep changelog"
)
clickhouse2.succeed(
"cat ${tableDDL} | clickhouse-client"
)
clickhouse2.succeed(
"cat ${insertDDL} | clickhouse-client"
)
for machine in clickhouse1, clickhouse2:
machine.wait_until_succeeds(
"cat ${selectCountQuery} | clickhouse-client | grep 100000000"
)
'';
}