åã®èšäºã§ã media2瀟ã§ClickHouse DBMSãå®è£
ããã³äœ¿çšããçµéšãå
±æããŸããã çŸåšã®èšäºã§ã¯ãåãç©çãµãŒããŒå
ã§ããŒã¿ãä¿åããã³åŠçã§ããªããªã£ããšãã«åæãããããŒã¿éãšè² è·ã®å¢å ã«äŒŽã£ãŠçºçããã¹ã±ãŒãªã³ã°ã®åé¡ã«å¯ŸåŠããŸãã ãŸãã DDLã¯ãšãªãClickHouseã¯ã©ã¹ã¿ãŒã«ç§»è¡ããããã«éçºããããŒã«ã«ã€ããŠã説æããŸãã

ClickHouse㯠ãç°ãªãããŒã¿ã»ã³ã¿ãŒã«ããã¯ã©ã¹ã¿ãŒã§åäœããããã«ç¹å¥ã«èšèšãããŸããã DBMSã¯ãæ°çŸã®ããŒãã«ç·åœ¢ã«ã¹ã±ãŒãªã³ã°ãããŸãã ãããã£ãŠãããšãã°ãå·çæç¹ã§ã®Yandex.Metricaã¯ã400以äžã®ããŒãã®ã¯ã©ã¹ã¿ãŒã§ãã
ClickHouseã¯ãããã«äœ¿çšã§ããã·ã£ãŒãã£ã³ã°ãšã¬ããªã±ãŒã·ã§ã³ãæäŸããããŒãã«ããšã«åå¥ã«æè»ã«æ§æã§ããŸãã ã¬ããªã±ãŒã·ã§ã³ã«ã¯Apache ZooKeeperãå¿
èŠã§ãïŒããŒãžã§ã³3.4.5以éãæšå¥šïŒã ä¿¡é Œæ§ãé«ããããã«ã5ããŒãã®ZKã¯ã©ã¹ã¿ãŒïŒã¢ã³ãµã³ãã«ïŒã䜿çšããŸãã ã¯ã©ãŒã©ã ãæäŸããã«ã¯ãå¥æ°ã®ZKããŒãïŒ3ãŸãã¯5ãªã©ïŒãéžæããå¿
èŠããããŸãã ZKã¯SELECTæäœã§ã¯äœ¿çšãããŸããããããšãã°ãALTERã¯ãšãªã§äœ¿çšãããŠåãå€æŽããåã¬ããªã«ã®æ瀺ãä¿åããããšã«æ³šæããŠãã ããã
ã·ã£ãŒãã£ã³ã°
ClickHouseã®ã·ã£ãŒãã£ã³ã°ã䜿çšãããšãã¯ã©ã¹ã¿ãŒå
ã®ãã¹ãŠã®ããŒãã«åæ£ããŠã¯ã©ã¹ã¿ãŒå
ã®ããŒã¿ã®ãã£ã³ã¯ãæžã蟌ã¿ããã³ä¿åããã¯ã©ã¹ã¿ãŒå
ã®ãã¹ãŠã®ããŒãã§ããŒã¿ã䞊ååŠçïŒèªã¿åãïŒããŠãã¹ã«ãŒããããåäžãããåŸ
ã¡æéãççž®ã§ããŸãã ããšãã°ãGROUP BY ClickHouseã䜿çšããã¯ãšãªã§ã¯ããªã¢ãŒãããŒãã§éçŽãå®è¡ãããéçŽé¢æ°ã®äžéç¶æ
ããªã¯ãšã¹ãã®éå§ããŒãã«æž¡ãããããã§éçŽãããŸãã
ã·ã£ãŒãã£ã³ã°ã«ã¯ãããŒã¿ãæ ŒçŽããªãç¹å¥ãªåæ£ãšã³ãžã³ã䜿çšãããŸãããSELECTã¯ãšãªãã·ã£ãŒãããŒãã«ïŒããŒã¿ãå«ãããŒãã«ïŒã«å§ä»»ããåä¿¡ããŒã¿ã®åŸç¶åŠçãè¡ããŸãã ã·ã£ãŒããžã®ããŒã¿ã®æžã蟌ã¿ã¯ã2ã€ã®ã¢ãŒãã§å®è¡ã§ããŸãã1ïŒåæ£ããŒãã«ãšãªãã·ã§ã³ã®ã·ã£ãŒãã£ã³ã°ããŒã䜿çšãããã2ïŒã·ã£ãŒãããŒãã«ã«çŽæ¥å
¥åããããããåæ£ããŒãã«ãä»ããŠããŒã¿ãèªã¿åããŸãã ãããã®ã¢ãŒããããã«è©³ããèããŠã¿ãŸãããã
æåã®ã¢ãŒãã§ã¯ãããŒã¿ã¯ã·ã£ãŒãããŒã䜿çšããŠåæ£ããŒãã«ã«æžã蟌ãŸããŸãã æãåçŽãªã±ãŒã¹ã§ã¯ãã©ã³ãã åããŒã¯ä¹±æ°ãã€ãŸãrandïŒïŒé¢æ°ãåŒã³åºããçµæã§ããå ŽåããããŸãã ãã ããããã·ã¥é¢æ°ã®å€ãããŒãã«ã®ãã£ãŒã«ãããã·ã£ãŒãã£ã³ã°ããŒãšããŠååŸããããšããå§ãããŸããããã«ãããäžæ¹ã§ã¯å°ããªããŒã¿ã»ãããäžæ¹ã®ã·ã£ãŒãã«ããŒã«ã©ã€ãºã§ããä»æ¹ã§ã¯ã¯ã©ã¹ã¿ãŒå
ã®ç°ãªãã·ã£ãŒãã§ãã®ãããªã»ãããããªãåçã«åæ£ã§ããŸãã ããšãã°ããŠãŒã¶ãŒã®ã»ãã·ã§ã³èå¥åïŒsess_idïŒã䜿çšãããšãåãã·ã£ãŒãã®1人ã®ãŠãŒã¶ãŒã«ããŒãžè¡šç€ºãããŒã«ã©ã€ãºã§ããŸãããç°ãªããŠãŒã¶ãŒã®ã»ãã·ã§ã³ã¯ã¯ã©ã¹ã¿ãŒå
ã®ãã¹ãŠã®ã·ã£ãŒãã«åçã«åæ£ãããŸãïŒsess_idãã£ãŒã«ãã®å€ã«é©åãªååžãããå ŽåïŒã ã·ã£ãŒãã£ã³ã°ããŒã¯ãéæ°å€ãŸãã¯è€åã«ããããšãã§ããŸãã ãã®å Žåãçµã¿èŸŒã¿ã®ããã·ã¥é¢æ°cityHash64ã䜿çšã§ããŸãã èæ
®ã¢ãŒãã§ã¯ãã¯ã©ã¹ã¿ãŒããŒãã®1ã€ã«æžã蟌ãŸããããŒã¿ã¯ãã·ã£ãŒãã£ã³ã°ããŒã䜿çšããŠå¿
èŠãªã·ã£ãŒãã«èªåçã«ãªãã€ã¬ã¯ããããŸããããã©ãã£ãã¯ãå¢å ããŸãã
ããè€éãªæ¹æ³ã¯ãClickHouseã®å€éšããå¿
èŠãªã·ã£ãŒããèšç®ããã·ã£ãŒãããŒãã«ã«çŽæ¥æžã蟌ãããšã§ãã ããã§ã®å°é£ã¯ãå©çšå¯èœãªããŒãã·ã£ãŒãã®ã»ãããç¥ãå¿
èŠããããšããäºå®ã«ãããã®ã§ãã ãã ãããã®å Žåãèšé²ã¯ããå¹ççã«ãªããã·ã£ãŒãã£ã³ã°ã¡ã«ããºã ïŒç®çã®ã·ã£ãŒãã決å®ããïŒã¯ããæè»ã«ãªããŸãã
è€è£œ
ClickHouseã¯ããŒã¿è€è£œããµããŒãããã¬ããªã«ã®ããŒã¿æŽåæ§ã確ä¿ããŸãã ããŒã¿è€è£œã«ã¯ãMergeTreeãã¡ããªãŒã®ç¹å¥ãªãšã³ãžã³ã䜿çšãããŸãã
- ReplicatedMergeTree
- ReplicatedCollapsingMergeTree
- ReplicatedAggregatingMergeTree
- ReplicatedSummingMergeTree
å€ãã®å Žåãã¬ããªã±ãŒã·ã§ã³ã¯ã·ã£ãŒãã£ã³ã°ãšçµã¿åãããŠäœ¿çšââãããŸãã ããšãã°ã6ããŒãã®ã¯ã©ã¹ã¿ãŒã«ã¯ã2ã€ã®ã¬ããªã«ãæã€3ã€ã®ã·ã£ãŒããå«ãŸããå ŽåããããŸãã ã¬ããªã±ãŒã·ã§ã³ã¯ã·ã£ãŒãã£ã³ã°ã¡ã«ããºã ã«äŸåãããåã
ã®ããŒãã«ã®ã¬ãã«ã§æ©èœããããšã«æ³šæããŠãã ããã
ããŒã¿ã¯ã©ã®ã¬ããªã«ããŒãã«ã«ãæžã蟌ãããšãã§ããClickHouseã¯ãã¹ãŠã®ã¬ããªã«éã§ããŒã¿ãèªåçã«åæããŸãã
ClickHouseã¯ã©ã¹ã¿ãŒã®æ§æäŸ
äŸãšããŠã4ã€ã®ããŒãch63.smi2, ch64.smi2, ch65.smi2, ch66.smi2
ããŸããŸãªæ§æãæ€èšããŸãã èšå®ã¯ãæ§æãã¡ã€ã«/etc/clickhouse-server/config.xmlã«å«ãŸããŠããŸãã
1ã€ã®æçãš4ã€ã®ã¬ããªã«

<remote_servers> <repikator> <shard> <replica> <host>ch63.smi2</host> </replica> <replica> <host>ch64.smi2</host> </replica> <replica> <host>ch65.smi2</host> </replica> <replica> <host>ch66.smi2</host> </replica> </shard> </repikator> </remote_servers>
ããŒãã«äœæã¹ããŒã ã®äŸïŒ

æå®ãããæ§æã®ããŒãã«ãäœæããSQLã¯ãšãªã®äŸïŒ
CREATE DATABASE IF NOT EXISTS dbrepikator ; CREATE TABLE IF NOT EXISTS dbrepikator.anysumming_repl_sharded ( event_date Date DEFAULT toDate(event_time), event_time DateTime DEFAULT now(), body_id Int32, views Int32 ) ENGINE = ReplicatedSummingMergeTree('/clickhouse/tables/{repikator_replica}/dbrepikator/anysumming_repl_sharded', '{replica}', event_date, (event_date, event_time, body_id), 8192) ; CREATE TABLE IF NOT EXISTS dbrepikator.anysumming_repl AS dbrepikator.anysumming_repl_sharded ENGINE = Distributed( repikator, dbrepikator, anysumming_repl_sharded , rand() )
ãã®æ§æã®å©ç¹ïŒ
- ããŒã¿ãä¿åããæãä¿¡é Œã§ããæ¹æ³ã
çæïŒ
- ã»ãšãã©ã®ã¿ã¹ã¯ã§ã¯ãããŒã¿ã®äœåãªã³ããŒãä¿åãããŸãã
- ãã®æ§æã«ã¯ã·ã£ãŒãã1ã€ãããªããããç°ãªãããŒãã§SELECTã¯ãšãªã䞊è¡ããŠå®è¡ããããšã¯ã§ããŸããã
- ãã¹ãŠã®ããŒãéã§ããŒã¿ãç¹°ãè¿ãè€è£œããã«ã¯ãè¿œå ã®ãªãœãŒã¹ãå¿
èŠã§ãã
1ã€ã®ã¬ããªã«ã«4ã€ã®ç Žç

<remote_servers> <sharovara> <shard> <replica> <host>ch63.smi2</host> </replica> </shard> <shard> <replica> <host>ch64.smi2</host> </replica> </shard> <shard> <replica> <host>ch65.smi2</host> </replica> </shard> <shard> <replica> <host>ch66.smi2</host> </replica> </shard> </sharovara> </remote_servers>
æå®ãããæ§æã®ããŒãã«ãäœæããSQLã¯ãšãªã®äŸïŒ
CREATE DATABASE IF NOT EXISTS testshara ; CREATE TABLE IF NOT EXISTS testshara.anysumming_sharded ( event_date Date DEFAULT toDate(event_time), event_time DateTime DEFAULT now(), body_id Int32, views Int32 ) ENGINE = ReplicatedSummingMergeTree('/clickhouse/tables/{sharovara_replica}/sharovara/anysumming_sharded_sharded', '{replica}', event_date, (event_date, event_time, body_id), 8192) ; CREATE TABLE IF NOT EXISTS testshara.anysumming AS testshara.anysumming_sharded ENGINE = Distributed( sharovara, testshara, anysumming_sharded , rand() )
ãã®æ§æã®å©ç¹ïŒ
- ãã®æ§æã«ã¯4ã€ã®ã·ã£ãŒãããããããã¯ã©ã¹ã¿ãŒã®ãã¹ãŠã®ããŒãã§SELECTã¯ãšãªãåæã«äžŠè¡ããŠå®è¡ã§ããŸãã
æ¬ ç¹ïŒ
- ããŒã¿ãä¿åããæãä¿¡é Œæ§ã®äœãæ¹æ³ïŒããŒãã®æ倱ã¯ãããŒã¿ã®äžéšã®æ倱ã«ã€ãªãããŸãïŒã
2ã€ã®æçã2ã€ã®ã¬ããªã«

<remote_servers> <pulse> <shard> <replica> <host>ch63.smi2</host> </replica> <replica> <host>ch64.smi2</host> </replica> </shard> <shard> <replica> <host>ch65.smi2</host> </replica> <replica> <host>ch66.smi2</host> </replica> </shard> </pulse> </remote_servers>
æå®ãããæ§æã®ããŒãã«ãäœæããSQLã¯ãšãªã®äŸïŒ
CREATE DATABASE IF NOT EXISTS dbpulse ; CREATE TABLE IF NOT EXISTS dbpulse.normal_summing_sharded ( event_date Date DEFAULT toDate(event_time), event_time DateTime DEFAULT now(), body_id Int32, views Int32 ) ENGINE = ReplicatedSummingMergeTree('/clickhouse/tables/{pulse_replica}/pulse/normal_summing_sharded', '{replica}', event_date, (event_date, event_time, body_id), 8192) ; CREATE TABLE IF NOT EXISTS dbpulse.normal_summing AS dbpulse.normal_summing_sharded ENGINE = Distributed( pulse, dbpulse, normal_summing_sharded , rand() )
ãã®æ§æã¯ãæåãš2çªç®ã®äŸããæé«ã®å質ãå®çŸããŸãã
- ãã®æ§æã«ã¯2ã€ã®ã·ã£ãŒãããããããã¯ã©ã¹ã¿ãŒå
ã®åã·ã£ãŒãã§SELECTã¯ãšãªã䞊è¡ããŠå®è¡ã§ããŸãã
- ããŒã¿ãä¿åããæ¯èŒçä¿¡é Œæ§ã®é«ãæ¹æ³ïŒ1ã€ã®ã¯ã©ã¹ã¿ãŒããŒãã倱ãããŠããããŒã¿ã®äžéšã倱ãããããšã¯ãããŸããïŒã
Ansibleã¯ã©ã¹ã¿ãŒã®æ§æäŸ
ansibleã®ã¯ã©ã¹ã¿ãŒæ§æã¯æ¬¡ã®ããã«ãªããŸãã
- name: "pulse" shards: - { name: "01", replicas: ["ch63.smi2", "ch64.smi2"]} - { name: "02", replicas: ["ch65.smi2", "ch66.smi2"]} - name: "sharovara" shards: - { name: "01", replicas: ["ch63.smi2"]} - { name: "02", replicas: ["ch64.smi2"]} - { name: "03", replicas: ["ch65.smi2"]} - { name: "04", replicas: ["ch66.smi2"]} - name: "repikator" shards: - { name: "01", replicas: ["ch63.smi2", "ch64.smi2","ch65.smi2", "ch66.smi2"]}
ClickHouseã¯ã©ã¹ã¿ãŒãæäœããããã®PHPãã©ã€ããŒ
åã®èšäºã§ã ClickHouseçšã®ãªãŒãã³ãœãŒã¹PHPãã©ã€ããŒã«ã€ããŠæ¢ã«èª¬æããŸããã
ããŒãã®æ°ãå€ããªããšãã¯ã©ã¹ã¿ãŒç®¡çãäžäŸ¿ã«ãªããŸãã ãããã£ãŠãDDLã¯ãšãªãClickHouseã¯ã©ã¹ã¿ãŒã«ç§»è¡ããããã®ã·ã³ãã«ã§ååã«æ©èœçãªããŒã«ãéçºããŸããã 次ã«ããã®æ©èœã®äŸãç°¡åã«èª¬æããŸãã
ã¯ã©ã¹ã¿ãŒã«æ¥ç¶ããã«ã¯ã ClickHouseDB\Cluster
ã¯ã©ã¹ã䜿çšãããŸãã
$cl = new ClickHouseDB\Cluster( ['host'=>'allclickhouse.smi2','port'=>'8123','username'=>'x','password'=>'x'] );
allclickhouse.smi2
DNSã¬ã³ãŒãã«ã¯ããã¹ãŠã®ããŒãã®IPã¢ãã¬ã¹ããªã¹ããããŠããŸãïŒ ch63.smi2, ch64.smi2, ch65.smi2, ch66.smi2
ãããã«ããã ã©ãŠã³ãããã³DNSã¡ã«ããºã ã䜿çšã§ããŸãã
ãã©ã€ããŒã¯ã¯ã©ã¹ã¿ãŒã«æ¥ç¶ããDNSã¬ã³ãŒãã«ãªã¹ããããŠããåããŒãã«pingèŠæ±ãéä¿¡ããŸãã
ãã¹ãŠã®ã¯ã©ã¹ã¿ãŒããŒããžã®æ倧æ¥ç¶æéã®èšå®ã¯ã次ã®ããã«æ§æãããŸãã
$cl->setScanTimeOut(2.5);
ã¯ã©ã¹ã¿ã¬ããªã«ã®ã¹ããŒã¿ã¹ã®ç¢ºèªã¯ã次ã®ããã«å®è¡ãããŸãã
if (!$cl->isReplicasIsOk()) { throw new Exception('Replica state is bad , error='.$cl->getError()); }
ClickHouseã¯ã©ã¹ã¿ãŒã®ç¶æ
ã¯ã次ã®ããã«ç¢ºèªãããŸãã
- DNSã¬ã³ãŒãã«ãªã¹ããããŠãããã¹ãŠã®ã¯ã©ã¹ã¿ãŒããŒããžã®æ¥ç¶ã確èªãããŸãã
- SQLã¯ãšãªãåããŒãã«éä¿¡ããããããClickHouseã¯ã©ã¹ã¿ãŒã®ãã¹ãŠã®ã¬ããªã«ã®ã¹ããŒã¿ã¹ã確èªã§ããŸãã
ZKã¯ã©ã¹ã¿ãŒãžã®ã¯ãšãªãå®è¡ãããããŒã¿ãåä¿¡ãããšãã«log_max_index, log_pointer, total_replicas, active_replicas
ã®å€ãæžç®ããªãå Žåãã¯ãšãªã®å®è¡é床ãäžããããšãã§ããŸãã
軜éæ€èšŒã®å Žåããã©ã€ããŒã«ç¹å¥ãªãã©ã°ãèšå®ããå¿
èŠããããŸãã
$cl->setSoftCheck(true);
䜿çšå¯èœãªãã¹ãŠã®ã¯ã©ã¹ã¿ãŒã®ãªã¹ããååŸããã«ã¯ã次ã®ããã«ããŸãã
print_r($cl->getClusterList());
ããšãã°ãäžèšã§èª¬æããã¯ã©ã¹ã¿ãŒã®æ§æãååŸããã«ã¯ã次ã®ããã«ããŸãã
foreach (['pulse','repikator','sharovara'] as $name) { print_r($cl->getClusterNodes($name)); echo "> $name , count shard = ".$cl->getClusterCountShard($name)." ; count replica = ".$cl->getClusterCountReplica($name)."\n"; }
ã¯ã©ã¹ã¿ãŒåãŸãã¯ã·ã£ãŒãããŒãã«ããããŒãã®ãªã¹ããååŸããïŒ
$nodes=$cl->getNodesByTable('sharovara.body_views_sharded'); $nodes=$cl->getClusterNodes('sharovara');
ã¯ã©ã¹ã¿ãŒã®åããŒãã«ãªã¯ãšã¹ããéä¿¡ããŠãããŒãã«ã®ãµã€ãºãŸãã¯ãã¹ãŠã®ããŒãã«ã®ãµã€ãºãååŸããŸãã
foreach ($nodes as $node) { echo "$node > \n"; print_r($cl->client($node)->tableSize('test_sharded')); print_r($cl->client($node)->tablesSize()); }
ã¯ã©ã¹ã¿ããŒãã«ã®ãªã¹ããååŸããŸãã
$cl->getTables()
ã¯ã©ã¹ã¿ãŒå
ã®ãªãŒããŒã®å®çŸ©ïŒ
$cl->getMasterNodeForTable('dbName.tableName')
ããšãã°ãæ§é ã®åé€ãŸãã¯å€æŽã«é¢é£ãããªã¯ãšã¹ãã¯ã is_leader
ãã©ã°ãis_leader
ããããŒãã«éä¿¡is_leader
ãŸãã
ã¯ã©ã¹ã¿ãŒå
ã®ããŒãã«ã®ããŒã¿ãæ¶å»ããïŒ
$cl->truncateTable('dbName.tableName')`
DDLã¯ãšãªç§»è¡ããŒã«
åœç€Ÿã¯ã MyBatis Migrationsã䜿çšããŠããªã¬ãŒã·ã§ãã«DBMSã®DDLã¯ãšãªã移è¡ããŸãã
Habréã®ç§»è¡ããŒã«ã«ã€ããŠã¯ããã§ã«æ¬¡ã®ããã«æžããŠããŸãã
ClickHouseã¯ã©ã¹ã¿ãŒã䜿çšããã«ã¯ãåæ§ã®ããŒã«ãå¿
èŠã§ããã
å·çæç¹ã§ã¯ãClickHouseã«ã¯DDLã¯ãšãªã«é¢é£ä»ããããå€ãã®æ©èœïŒå¶éïŒããããŸãã åŒçš ïŒ
INSERTãALTERãè€è£œãããŸãïŒè©³çŽ°ã«ã€ããŠã¯ãALTERã¯ãšãªã®èª¬æãåç
§ããŠãã ããïŒã ã¯ãšãªããã¹ãã§ã¯ãªããå§çž®ããŒã¿ãè€è£œãããŸãã CREATEãDROPãATTACHãDETACHãRENAMEãªã¯ãšã¹ãã¯ã¬ããªã±ãŒããããŸãããã€ãŸããåããµãŒããŒãåç
§ããŸãã CREATE TABLEã¯ãšãªã¯ãã¯ãšãªãå®è¡ããããµãŒããŒã«æ°ããã¬ããªã±ãŒãããŒãã«ãäœæããŸãã ãŸããä»ã®ãµãŒããŒã«ãã®ãããªããŒãã«ãæ¢ã«ããå Žåãæ°ããã¬ããªã«ãè¿œå ããŸãã DROP TABLEã¯ãšãªã¯ãã¯ãšãªãå®è¡ããããµãŒããŒäžã«ããã¬ããªã«ãåé€ããŸãã RENAMEã¯ãšãªã¯ãã¬ããªã«ã®1ã€ã«ããããŒãã«ã®ååãå€æŽããŸããã€ãŸããç°ãªãã¬ããªã«ã«ããè€è£œãããããŒãã«ã«ã¯ãç°ãªãååãä»ããããšãã§ããŸãã
ClickHouseéçºããŒã ã¯ãã®æ¹åã§ã®äœæ¥ãæ¢ã«çºè¡šããŠããŸãããçŸåšã¯å€éšããŒã«ã§ãã®åé¡ã解決ããå¿
èŠããããŸãã DDLã¯ãšãªãClickHouseã¯ã©ã¹ã¿ãŒã«ç§»è¡ããããã®phpMigrationsClickhouseããŒã«ã®ç°¡åãªãããã¿ã€ããäœæããŸããã ãããŠãç§ãã¡ã®èšç»ã¯phpMigrationsClickhouseãPHPèšèªããæœè±¡åããããšã§ãã
ä»ã®ããã°ã©ãã³ã°èšèªã§å®è£
ã§ããphpMigrationsClickhouseã§çŸåšäœ¿çšãããŠããã¢ã«ãŽãªãºã ã«ã€ããŠèª¬æããŸãã
çŸåšã phpMigrationsClickhouseã®ç§»è¡æé ã¯ä»¥äžã§æ§æãããŠããŸãã
- ãšã©ãŒãçºçããå Žåã«ããŒã«ããã¯ããã³ããŒã«ããã¯ããå¿
èŠãããSQLã¯ãšãªã
- SQLã¯ãšãªãå®è¡ããã¯ã©ã¹ã¿ãŒã®ååã
次ã®ã³ãŒããå«ãPHPãã¡ã€ã«ãäœæããŸãã
$cluster_name = 'pulse'; $mclq = new \ClickHouseDB\Cluster\Migration($cluster_name); $mclq->setTimeout(100);
ããŒã«ããå¿
èŠãããSQLã¯ãšãªãè¿œå ããŸãã
$mclq->addSqlUpdate(" CREATE DATABASE IF NOT EXISTS dbpulse "); $mclq->addSqlUpdate(" CREATE TABLE IF NOT EXISTS dbpulse.normal_summing_sharded ( event_date Date DEFAULT toDate(event_time), event_time DateTime DEFAULT now(), body_id Int32, views Int32 ) ENGINE = ReplicatedSummingMergeTree('/clickhouse/tables/{pulse_replica}/pulse/normal_summing_sharded', '{replica}', event_date, (event_date, event_time, body_id), 8192) ");
ãšã©ãŒã®å Žåã«ããŒã«ããã¯ãå®è¡ããSQLã¯ãšãªãè¿œå ããŸãã
$mclq->addSqlDowngrade(' DROP TABLE IF EXISTS dbpulse.normal_summing_sharded '); $mclq->addSqlDowngrade(' DROP DATABASE IF EXISTS dbpulse ');
ããŒãªã³ã°ç§»è¡ã«ã¯2ã€ã®æŠç¥ããããŸãã
- 次ã®SQLã¯ãšãªãžã®ç§»è¡ãšãšãã«ãåã
ã®SQLã¯ãšãªã1ã€ã®ãµãŒããŒã«éä¿¡ããŸãã
- ãã¹ãŠã®SQLã¯ãšãªã1ã€ã®ãµãŒããŒã«éä¿¡ãã次ã®ãµãŒããŒã«ç§»è¡ããŸãã
ãšã©ãŒãçºçããå Žåã次ã®ãªãã·ã§ã³ãå¯èœã§ãã
- ã¢ããã°ã¬ãŒãèŠæ±ãæ¢ã«è¡ãããŠãããã¹ãŠã®ããŒããžã®ããŠã³ã°ã¬ãŒãèŠæ±ã®å®è¡ã
- ä»ã®ãµãŒããŒã«ã¢ããã°ã¬ãŒãèŠæ±ãéä¿¡ããåã«åŸ
æ©ããŸãã
- ãšã©ãŒãçºçããå Žåã«ãã¹ãŠã®ãµãŒããŒã§ããŠã³ã°ã¬ãŒãèŠæ±ãå®è¡ããŸãã
ã¯ã©ã¹ã¿ãŒã®ç¶æ
ãäžæãªå Žåã®ãšã©ãŒã¯ãç¹å¥ãªå ŽæãåããŸãã
- æ¥ç¶ã¿ã€ã ã¢ãŠããšã©ãŒã
- ãµãŒããŒãšã®éä¿¡ãšã©ãŒã
移è¡ãå®è¡ããéã®PHPã³ãŒãã®åäœã®ååã¯æ¬¡ã®ãšããã§ãã
ãšã©ãŒãçºçããå ŽåãããŠã³ã°ã¬ãŒãèŠæ±ãã¯ã©ã¹ã¿ãŒã®ãã¹ãŠã®ããŒãã«éä¿¡ãããŸãã
foreach ($node_hosts as $node) { foreach ($sql_down as $s_u) { try{ $st=$this->client($node)->write($s_u); } catch (Exception $E) {
ClickHouseã§ã®çµéšã«é¢ããäžé£ã®è³æãç¶ç¶ããŸãã
çµè«ãšããŠãå°ããªèª¿æ»ãå®æœããããšæããŸãã