{"id":80775,"date":"2020-05-08T13:42:47","date_gmt":"2020-05-08T11:42:47","guid":{"rendered":"https:\/\/prohoster.info\/blog\/administrirovanie\/clickhouse-dlya-prodvinutyh-polzovatelej-v-voprosah-i-otvetah"},"modified":"2020-05-08T13:42:47","modified_gmt":"2020-05-08T11:42:47","slug":"clickhouse-dlya-prodvinutyh-polzovatelej-v-voprosah-i-otvetah","status":"publish","type":"post","link":"https:\/\/prohoster.info\/de\/blog\/administrirovanie\/clickhouse-dlya-prodvinutyh-polzovatelej-v-voprosah-i-otvetah","title":{"rendered":"ClickHouse f\u00fcr fortgeschrittene Benutzer in Fragen und Antworten","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p>Im April planten die Ingenieure von Avito eine Online-Sitzung mit dem Hauptentwickler von ClickHouse, Alexey Milovidov, und Kirill Shvakov, einem Golang-Entwickler von Integros. Es wurde besprochen, wie wir das Datenbanksystem nutzen und mit welchen Herausforderungen wir konfrontiert sind. <\/p>\n<p><\/p>\n<p>Auf Grundlage des Treffens haben wir einen Artikel mit Antworten von Experten auf unsere und Zuschauerfragen zu Backups, Datenresharding, externen Dictionaries, dem Golang-Treiber und der Aktualisierung von ClickHouse-Versionen zusammengestellt. Dieser kann Entwicklern hilfreich sein, die bereits aktiv mit der Datenbank von Yandex arbeiten und sich f\u00fcr deren Gegenwart und Zukunft interessieren. Standardm\u00e4\u00dfig stammen die Antworten von Alexey Milovidov, sofern nicht anders angegeben. <\/p>\n<p><\/p>\n<p>Achtung, unter dem Cut gibt es viel Text. Wir hoffen, dass der Inhalt mit den Fragen Ihnen hilft, sich zurechtzufinden.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"ClickHouse f\u00fcr fortgeschrittene Benutzer in Fragen und Antworten\" src=\"\/wp-content\/uploads\/2020\/05\/242b1d8d002fe115614435c242297fd2.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<h2 id=\"soderzhanie\">Inhalt<\/h2>\n<p><\/p>\n<ul>\n<li><noindex><a rel=\"nofollow\" href=\"#old-data\">ClickHouse wird st\u00e4ndig aktualisiert, unsere Daten hingegen nicht. Was k\u00f6nnen wir dagegen tun?<\/a><\/noindex> <\/li>\n<li><noindex><a rel=\"nofollow\" href=\"#backup-best-practicies\">Was sind derzeit die besten Praktiken f\u00fcr die Datensicherung aus ClickHouse?<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"#replication\">Kann man ein kontrolliertes Veralterung von Replikaten bei Str\u00f6mungen organisieren?<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"#soooo-changeable\">Was tun, wenn sich die Struktur der Tabelle ge\u00e4ndert hat?<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"#resharding-best-practices\">Was sind aktuell die besten Praktiken beim Resharding von Daten?<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"#clickhouse-copier\">ClickHouse verf\u00fcgt \u00fcber das Dienstprogramm clickhouse-copier. K\u00f6nnten Sie dar\u00fcber sprechen?<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"#resharding-tool\">Sie hatten ein Pilotprojekt, das Resharding hie\u00df. Wie steht es damit?<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"#move-to-slow-disk\">Kann man alle Teile der Daten zu einer Einheit verschmelzen, bevor man sie auf langsame Festplatten bewegt?<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"#up-to-date\">Wie migriert man auf neue Versionen von ClickHouse, wenn man die Kompatibilit\u00e4t vorher nicht testen kann?<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"#kill-query\">Der Kill-Query sollte Anfragen beenden, tut dies aber nicht. Warum?<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"#reading-time\">Wie berechnet man die Antwortzeit bei einer Leseanforderung?<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"#pimp-my-clickhouse\">Was kann man in ClickHouse optimieren, damit mehr Daten im Cache gespeichert werden?<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"#storage-configuration\">Wie kann man die storage_configuration f\u00fcr den Betriebsspeicher optimieren?<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"#low-cardinality\">Bis zu wie vielen einzigartigen Werten ist Low Cardinality effektiv?<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"#fulltext-search\">Was sind die besten Praktiken f\u00fcr die Volltextsuche in einer Tabelle mit f\u00fcnf Milliarden Zeilen?<\/a><\/noindex> <\/li>\n<li><noindex><a rel=\"nofollow\" href=\"#hello-and-welcome\">Wie organisiert man den Zugriff auf ClickHouse f\u00fcr eine gro\u00dfe Anzahl von Benutzern am besten?<\/a><\/noindex> <\/li>\n<li><noindex><a rel=\"nofollow\" href=\"#smorgasbord\">Kann man die Ergebnisse einer Anfrage an zehn Clients weitergeben?<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"#asynchronous\">Wie geht man mit asynchronen Operationen und materialisierten Views um?<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"#dashboard\">ClickHouse erzeugt viele Logs. Wie kann ich alles, was auf dem Server passiert, in Echtzeit sehen?<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"#zen\">Wie kann ich die Merges beeinflussen, damit der Server nicht in OOM abst\u00fcrzt?<\/a><\/noindex> <\/li>\n<li><noindex><a rel=\"nofollow\" href=\"#go\">Wie wird die Entwicklung des Golang-Treibers f\u00fcr ClickHouse voranschreiten?<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"#lazy-load\">Das externe Dictionary wird nach einem Neustart mit aktivierter lazy_load-Einstellung nicht geladen. Was tun?<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"#reload-dictionaries\">Wie geht man damit um, dass system reload dictionaries kein einziges der vielen Dictionaries l\u00e4dt, wenn auch nur eines von ihnen mit einem Fehler abst\u00fcrzt?<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"#connection\">Gibt es eine M\u00f6glichkeit, die Anmeldeinformationen in der ClickHouse-Konfiguration zu konfigurieren, ohne sie bei Fehlern zu offenbaren?<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"#zoom-backgrounds\">Bonus: Hintergr\u00fcnde f\u00fcr Zoom aus den Sitzungen<\/a><\/noindex><\/li>\n<\/ul>\n<p><\/p>\n<blockquote><p>Wenn Sie den Text nicht lesen m\u00f6chten, k\u00f6nnen Sie sich die Aufzeichnung der Zusammenk\u00fcnfte ansehen <noindex><a rel=\"nofollow\" href=\"https:\/\/www.youtube.com\/watch?v=n1tm4j4W8ZQ&amp;t=8147s\">auf&nbsp;unserem YouTube-Kanal<\/a><\/noindex>. Die Zeitstempel sind im ersten Kommentar unter dem Video.<\/p><\/blockquote>\n<p><\/p>\n<h2 id=\"anchorold-dataanchorclickhouse-postoyanno-obnovlyaetsya-a-nashi-dannyenbsp-net-chto-snbspetim-delat\"><noindex><a rel=\"nofollow\" name=\"old-data\"><\/a><\/noindex>ClickHouse wird st\u00e4ndig aktualisiert, unsere Daten hingegen nicht. Was k\u00f6nnen wir dagegen tun?<\/h2>\n<p><\/p>\n<blockquote><p>ClickHouse wird st\u00e4ndig aktualisiert, und unsere Daten, die mit optimize final bearbeitet wurden, werden nicht aktualisiert und liegen im Backup. <\/p>\n<p>Angenommen, wir haben ein Problem und Daten wurden verloren. Wir haben uns entschieden, wiederherzustellen, und es stellte sich heraus, dass die alten Partitionen, die auf den Backup-Servern gespeichert sind, stark von der aktuell verwendeten ClickHouse-Version abweichen. Was tun in so einem Fall, und ist dies \u00fcberhaupt m\u00f6glich?<\/p><\/blockquote>\n<p>Es ist nicht m\u00f6glich, eine Situation zu haben, in der Sie Daten aus einem Backup im alten Format wiederherstellen, und sie in der neuen Version nicht zug\u00e4nglich sind. Wir achten darauf, dass das Datenformat in ClickHouse immer abw\u00e4rtskompatibel bleibt. Dies ist viel wichtiger als die Abw\u00e4rtskompatibilit\u00e4t in Bezug auf Funktionalit\u00e4t, wenn sich das Verhalten einer selten verwendeten Funktion \u00e4ndert. Daten, die auf der Festplatte gespeichert sind, muss die neue Version von ClickHouse immer lesen k\u00f6nnen. Das ist Gesetz. <\/p>\n<p><\/p>\n<h2 id=\"anchorbackup-best-practiciesanchorkakie-luchshie-praktiki-est-nanbspdannyy-moment-ponbsprezervnomu-kopirovaniyu-dannyh-iznbspclickhouse\"><noindex><a rel=\"nofollow\" name=\"backup-best-practicies\"><\/a><\/noindex>Was sind derzeit die besten Praktiken f\u00fcr die Datensicherung aus ClickHouse?<\/h2>\n<p><\/p>\n<blockquote><p>Wie macht man Backups, wenn man bedenkt, dass wir optimize final-Operationen haben, eine enorme Datenbank in Terabytes und Daten, die beispielsweise in den letzten drei Tagen aktualisiert wurden, w\u00e4hrend danach keine weiteren Verfahren stattfinden? <\/p>\n<p>Wir k\u00f6nnen eine eigene L\u00f6sung zusammenst\u00f6pseln und auf Bash schreiben: sammle diese Backups so und so. Vielleicht muss man nichts st\u00fcmpern, und das Fahrrad wurde l\u00e4ngst erfunden? <\/p><\/blockquote>\n<p>Zun\u00e4chst zu den besten Praktiken. Meine Kollegen empfehlen immer, beim Thema Backups auf den Dienst \u201eYandex.Cloud\u201c hinzuweisen, wo diese Aufgabe bereits gel\u00f6st ist. Nutzen Sie es, wenn es Ihnen m\u00f6glich ist. <\/p>\n<p><\/p>\n<p>Es gibt keine vollst\u00e4ndige L\u00f6sung, die zu einhundert Prozent in ClickHouse integriert ist, f\u00fcr Backups. Es gibt einige Vorlagen, die man verwenden kann. Um eine vollst\u00e4ndige L\u00f6sung zu erhalten, muss man entweder ein wenig manuell arbeiten oder Wrapper in Form von Skripten erstellen.<\/p>\n<p><\/p>\n<p>Ich beginne mit den einfachsten L\u00f6sungen und beende mit den komplexesten, abh\u00e4ngig von der Datenmenge und der Clustergr\u00f6\u00dfe. Je gr\u00f6\u00dfer das Cluster, desto komplexer wird die L\u00f6sung.<\/p>\n<p><\/p>\n<p>Wenn die Datentabelle nur einige Gigabyte gro\u00df ist, kann das Backup so erstellt werden: <\/p>\n<p><\/p>\n<ol>\n<li>Speichern Sie die Tabellendefinition, also die Metadaten \u2014 <strong>show create table<\/strong>.<\/li>\n<li>Erstellen Sie einen Dump mit dem ClickHouse-Client \u2014 <strong>select<\/strong> * <strong>from table<\/strong> in eine Datei. Standardm\u00e4\u00dfig erhalten Sie eine Datei im TabSeparated-Format. Wenn Sie es effizienter w\u00fcnschen, kann es im Native-Format erfolgen. <\/li>\n<\/ol>\n<p><\/p>\n<p>Wenn das Datenvolumen gr\u00f6\u00dfer ist, dauert das Backup l\u00e4nger und ben\u00f6tigt mehr Platz. Dies wird als logisches Backup bezeichnet, das nicht an das Datenformat von ClickHouse gebunden ist. Falls vorhanden, k\u00f6nnen Sie im schlimmsten Fall das Backup nehmen und in MySQL zur Wiederherstellung laden. <\/p>\n<p><\/p>\n<p>F\u00fcr fortgeschrittene F\u00e4lle bietet ClickHouse die M\u00f6glichkeit, Snapshots von Partitionen im lokalen Dateisystem zu erstellen. Diese Funktion steht als Abfrage zur Verf\u00fcgung. <strong>alter table freeze partition<\/strong>. Oder einfach <strong>alter table freeze<\/strong> \u2014 das ist ein Snapshot der gesamten Tabelle. <\/p>\n<p><\/p>\n<p>Ein Snapshot wird konsistent f\u00fcr eine Tabelle auf einem Shard erstellt, das hei\u00dft, einen konsistenten Snapshot des gesamten Clusters auf diese Weise zu erstellen, ist nicht m\u00f6glich. Doch f\u00fcr die meisten Aufgaben ist dies nicht erforderlich, und es ist ausreichend, auf jedem Shard die Abfrage auszuf\u00fchren und einen konsistenten Snapshot zu erhalten. Er wird als Hardlink erstellt und ben\u00f6tigt daher keinen zus\u00e4tzlichen Platz. Anschlie\u00dfend kopieren Sie diesen Snapshot auf den Backup-Server oder in den Speicher, den Sie f\u00fcr Backups verwenden.<\/p>\n<p><\/p>\n<p>Ein solches Backup wiederherzustellen ist relativ einfach. Zuerst erstellen Sie Tabellen anhand der vorhandenen Tabellendefinitionen. Dann kopieren Sie die gespeicherten Snapshots der Partitionen in das Directory-Detached f\u00fcr die betreffenden Tabellen und f\u00fchren die Abfrage aus. <strong>attach partition<\/strong>. Diese L\u00f6sung eignet sich gut f\u00fcr die ernsthaftesten Datenmengen. <\/p>\n<p><\/p>\n<p>Manchmal wird etwas noch ausgefeilteres erforderlich \u2014 in F\u00e4llen, in denen Sie Dutzende oder sogar Hunderte von Terabyte auf jedem Server und Hunderte von Servern haben. Hier gibt es eine L\u00f6sung, die ich von Kollegen von Yandex.Metrica \u00fcbernommen habe. Ich w\u00fcrde es nicht jedem empfehlen \u2014 lesen Sie selbst und entscheiden Sie, ob es passt oder nicht. <\/p>\n<p><\/p>\n<p>Zun\u00e4chst m\u00fcssen Sie mehrere Server mit gro\u00dfen Festplattenregalen einrichten. Danach richten Sie auf diesen Servern mehrere ClickHouse-Server ein und konfigurieren sie so, dass sie als eine weitere Replik f\u00fcr dieselben Shards fungieren. Und dann verwenden Sie auf diesen Servern ein Dateisystem oder ein Werkzeug, das es erm\u00f6glicht, Snapshots zu erstellen. Hier gibt es zwei Optionen. Die erste Option sind LVM-Snapshots, die zweite Option ist ZFS auf Linux. <\/p>\n<p><\/p>\n<p>Anschlie\u00dfend m\u00fcssen t\u00e4glich Snapshots erstellt werden, die einen bestimmten Platz einnehmen. Nat\u00fcrlich, wenn sich die Daten \u00e4ndern, wird im Laufe der Zeit der Platzbedarf steigen. Dieser Snapshot kann jederzeit abgerufen und die Daten wiederhergestellt werden, so eine merkw\u00fcrdige L\u00f6sung. Au\u00dferdem m\u00fcssen diese Replikate in der Konfiguration eingeschr\u00e4nkt werden, damit sie nicht versuchen, zu Leadern zu werden.<\/p>\n<p><\/p>\n<h2 id=\"anchorreplicationanchormozhno-li-budet-organizovat-kontroliruemoe-otstavanie-replik-vnbspvalah\"><noindex><a rel=\"nofollow\" name=\"replication\"><\/a><\/noindex>Kann man ein kontrolliertes Veralterung von Replikaten bei Str\u00f6mungen organisieren?<\/h2>\n<p><\/p>\n<blockquote><p>In diesem Jahr planen Sie, Wellen in ClickHouse zu erstellen. Wird es m\u00f6glich sein, darin ein kontrolliertes Wiederbestehen von Replikaten zu organisieren? Wir m\u00f6chten uns damit vor negativen Szenarien mit Alternativen und anderen \u00c4nderungen sch\u00fctzen. <\/p>\n<p>Kann man Rollbacks f\u00fcr Alternativen durchf\u00fchren? Zum Beispiel, in der bestehenden Welle zu sagen, dass bis zu diesem Zeitpunkt \u00c4nderungen angewendet werden sollen, und ab diesem Moment sollen die \u00c4nderungen nicht mehr angewendet werden?<\/p>\n<p>Falls ein Team in unser Cluster eindringt und es auseinanderrei\u00dft, haben wir eine bedingte Replikation mit einer Stunde Verz\u00f6gerung, wo wir sagen k\u00f6nnen, dass wir genau diese im Moment verwenden werden, aber die letzten zehn Minuten an \u00c4nderungen nicht anwenden m\u00f6chten? <\/p><\/blockquote>\n<p>Zun\u00e4chst zu den kontrollierten Verz\u00f6gerungen von Replikaten. Eine solche Anfrage von Benutzern gab es, und wir haben ein Issue auf GitHub erstellt mit der Bitte: 'Wenn jemand das braucht, dr\u00fccken Sie den Daumen hoch, geben Sie ein Herz.' Niemand hat es gemacht, und das Issue wurde geschlossen. Dennoch kann man bereits jetzt eine solche M\u00f6glichkeit erhalten, indem man ClickHouse konfiguriert. Allerdings nur ab Version 20.3.<\/p>\n<p><\/p>\n<p>ClickHouse f\u00fchrt st\u00e4ndig im Hintergrund die Zusammenf\u00fchrung von Daten durch \u2014 Merge. Wenn der Merge abgeschlossen ist, wird eine bestimmte Menge an Partitionen durch eine gr\u00f6\u00dfere Partition ersetzt. Die fr\u00fcheren Partitionen bleiben jedoch eine Zeit lang auf der Festplatte.<\/p>\n<p><\/p>\n<p>Zun\u00e4chst werden sie so lange gespeichert, bis es Select-Anfragen gibt, die sie nutzen, um den nicht-blockierenden Betrieb zu gew\u00e4hrleisten. Select-Anfragen k\u00f6nnen einfach von den \u00e4lteren Partitionen lesen.<\/p>\n<p><\/p>\n<p>Zweitens gibt es auch eine Zeitgrenze \u2013 alte Datenst\u00fccke liegen acht Minuten lang auf der Festplatte. Diese acht Minuten k\u00f6nnen angepasst werden und sogar auf einen Tag verl\u00e4ngert werden. Das kostet Speicherplatz: Je nach Datenfluss kann es sein, dass sich die Daten an einem Tag nicht nur verdoppeln, sondern sogar f\u00fcnfmal so umfangreich werden. Aber Sie k\u00f6nnen, im Falle eines ernsthaften Problems, den ClickHouse-Server anhalten und alles kl\u00e4ren.<\/p>\n<p><\/p>\n<p>Jetzt stellt sich die Frage, wie das vor Altern sch\u00fctzt. Man sollte hier tiefer gehen, denn in alten Versionen von ClickHouse funktionierte der Alter so, dass er einfach direkt die St\u00fccke ver\u00e4nderte. Es gibt ein Datenst\u00fcck mit bestimmten Dateien, und wir sagen zum Beispiel, <strong>Alter Drop Column<\/strong>. In diesem Fall wird die Spalte physisch aus allen St\u00fccken gel\u00f6scht.<\/p>\n<p><\/p>\n<p>Aber mit der Version 20.3 wurde der Mechanismus der Altern vollst\u00e4ndig ge\u00e4ndert, und jetzt sind die Datenst\u00fccke immer unver\u00e4nderlich. Sie werden \u00fcberhaupt nicht ver\u00e4ndert \u2013 die Altern funktionieren jetzt \u00e4hnlich wie Merges. Anstatt das St\u00fcck vor Ort zu \u00e4ndern, erstellen wir ein neues. In dem neuen St\u00fcck werden die unver\u00e4nderten Dateien Hardlinks, und wenn wir eine Spalte gel\u00f6scht haben, wird sie einfach im neuen St\u00fcck fehlen. Das alte St\u00fcck wird standardm\u00e4\u00dfig nach acht Minuten gel\u00f6scht, und hier kann man die zuvor erw\u00e4hnten Einstellungen anpassen. <\/p>\n<p><\/p>\n<p>Das gilt auch f\u00fcr Alter-Operationen vom Typ Mutationen. Wenn Sie <strong>Alter Delete<\/strong> oder <strong>Alter Update<\/strong>, \u00e4ndert es das Fragment nicht, sondern erstellt ein neues. Danach wird das alte gel\u00f6scht.<\/p>\n<p><\/p>\n<h2 id=\"anchorsoooo-changeableanchorkak-byt-esli-struktura-tablicy-pomenyalas\"><noindex><a rel=\"nofollow\" name=\"soooo-changeable\"><\/a><\/noindex>Was tun, wenn sich die Struktur der Tabelle ge\u00e4ndert hat?<\/h2>\n<p><\/p>\n<blockquote><p>Wie kann ein Backup, das mit dem alten Schema erstellt wurde, wiederhergestellt werden? Und eine zweite Frage zu Snapshots und Dateisystemmitteln. Ist Btrfs anstelle von ZFS auf Linux LVM geeignet?<\/p><\/blockquote>\n<p>Wenn Sie <strong>attach partition<\/strong> Wenn die Partitionen eine andere Struktur haben, wird ClickHouse Ihnen sagen, dass es nicht m\u00f6glich ist. Die L\u00f6sung ist folgende: Erstens - erstellen Sie eine tempor\u00e4re Tabelle vom Typ MergeTree mit der alten Struktur, f\u00fcgen Sie die Daten dort mit attach hinzu, und machen Sie eine Alter-Anfrage. Dann k\u00f6nnen Sie entweder die Daten kopieren oder verschieben und die attach-Anfrage erneut durchf\u00fchren, oder Sie verwenden die Anfrage <strong>alter table move partition<\/strong>.<\/p>\n<p><\/p>\n<p>Die zweite Frage ist \u2013 kann man Btrfs verwenden. Zun\u00e4chst, wenn Sie LVM haben, sind LVM-Snapshots ausreichend, und das Dateisystem kann auch ext4 sein, das spielt keine Rolle. Bei Btrfs h\u00e4ngt alles von Ihrer Erfahrung mit deren Nutzung ab. Es ist ein ausgereiftes Dateisystem, aber es gibt dennoch einige Bedenken, wie alles in der Praxis unter einem bestimmten Szenario funktionieren wird. Ich w\u00fcrde nicht empfehlen, es zu verwenden, wenn Sie Btrfs nicht im produktiven Einsatz haben.<\/p>\n<p><\/p>\n<h2 id=\"anchorresharding-best-practicesanchorkakie-seychas-luchshie-praktiki-vnbspreshardinge-dannyh\"><noindex><a rel=\"nofollow\" name=\"resharding-best-practices\"><\/a><\/noindex>Was sind aktuell die besten Praktiken beim Resharding von Daten?<\/h2>\n<p><\/p>\n<p>Die Frage zum Re-Sharding ist komplex und vielschichtig. Hier kann man gleich mehrere Antworten geben. Man kann von einer Seite sagen \u2013 ClickHouse hat keine eingebaute Re-Sharding-Funktionalit\u00e4t. Aber ich bef\u00fcrchte, diese Antwort wird niemanden zufriedenstellen. Daher kann man von der anderen Seite kommen und sagen, dass ClickHouse viele M\u00f6glichkeiten f\u00fcr das Re-Sharding von Daten bietet. <\/p>\n<p><\/p>\n<p>Wenn der Platz im Cluster ausgeht oder es die Last nicht bew\u00e4ltigen kann, f\u00fcgen Sie neue Server hinzu. Aber diese Server sind standardm\u00e4\u00dfig leer, es gibt keine Daten darauf und keine Last. Sie m\u00fcssen die Daten neu verteilen, damit sie gleichm\u00e4\u00dfig auf das neue, vergr\u00f6\u00dferte Cluster verteilt werden.<\/p>\n<p><\/p>\n<p>Der erste Weg, wie dies geschehen kann, ist, einen Teil der Partitionen auf die neuen Server mithilfe der Anfrage zu kopieren <strong>alter table fetch partition<\/strong>. Wenn Sie beispielsweise Partitionen nach Monaten hatten, nehmen Sie den ersten Monat 2017 und kopieren ihn auf den neuen Server, dann kopieren Sie den dritten Monat auf einen anderen neuen Server. Und so weiter, bis es mehr oder weniger gleichm\u00e4\u00dfig verteilt ist.<\/p>\n<p><\/p>\n<p>Der Transfer kann nur f\u00fcr die Partitionen erfolgen, die sich bei der Aufnahme nicht \u00e4ndern. F\u00fcr frische Partitionen muss die Aufnahme gestoppt werden, da deren \u00dcbertragung nicht atomar ist. Andernfalls erhalten Sie Duplikate oder Auslassungen in den Daten. Nichtsdestotrotz ist diese Methode praktikabel und funktioniert ziemlich effektiv. Bereitgestellte komprimierte Partitionen werden \u00fcber das Netzwerk \u00fcbertragen, das hei\u00dft, die Daten werden nicht erneut komprimiert oder dekodiert.<\/p>\n<p><\/p>\n<p>Diese Methode hat einen Nachteil, und dieser h\u00e4ngt von dem Sharding-Schema ab, auf das Sie sich urspr\u00fcnglich eingestellt haben, welcher Sharding-Schl\u00fcssel Ihnen zur Verf\u00fcgung stand. In Ihrem Beispiel f\u00fcr den Fall mit Metriken ist der Sharding-Schl\u00fcssel der Hash des Pfades. Wenn Sie eine Auswahl in eine verteilte Tabelle vornehmen, wird sie sofort an alle Shards des Clusters weitergeleitet und holt dort die Daten. <\/p>\n<p><\/p>\n<p>Das bedeutet, dass es f\u00fcr Sie faktisch nicht von Bedeutung ist, welche Daten auf welchem Shard gelandet sind. Entscheidend ist, dass die Daten \u00fcber einen bestimmten Pfad auf einem Shard liegen, auf welchem genau, ist nicht wichtig. In diesem Fall eignet sich die \u00dcbertragung von fertigen Partitionen hervorragend, da Sie bei SELECT-Abfragen sowohl vor als auch nach der Neuschardierung im Grunde dieselben vollst\u00e4ndigen Daten erhalten werden.<\/p>\n<p><\/p>\n<p>Es gibt jedoch auch komplexere F\u00e4lle. Wenn Sie auf der Anwendungsebene eine spezielle Sharding-Schema einplanen, das besagt, dass dieser Client auf einem bestimmten Shard liegt, und die Abfrage direkt dorthin gesendet werden kann, anstatt in die verteilte Tabelle. Oder Sie verwenden eine relativ neue Version von ClickHouse und haben die Einstellung aktiviert <strong>optimize skip unused shards<\/strong>. In diesem Fall wird w\u00e4hrend der SELECT-Abfrage der Ausdruck in der WHERE-Klausel analysiert und es wird ermittelt, auf welche Shards gem\u00e4\u00df dem Sharding-Schema zugegriffen werden muss. Dies funktioniert unter der Bedingung, dass die Daten tats\u00e4chlich gem\u00e4\u00df diesem Sharding-Schema aufgeteilt sind. Wenn Sie sie manuell verschoben haben, kann die \u00dcbereinstimmung m\u00f6glicherweise ver\u00e4ndert werden.<\/p>\n<p><\/p>\n<p>Das ist also die erste Methode. Ich warte auf Ihre R\u00fcckmeldung, ob diese Methode f\u00fcr Sie geeignet ist oder ob wir weitermachen sollen.<\/p>\n<p><\/p>\n<p><strong>Wladimir Kolobajew, leitender Systemadministrator bei Avito<\/strong>: Alexej, die Methode, die Sie erw\u00e4hnt haben, l\u00e4sst sich nicht sehr gut umsetzen, wenn es darum geht, die Last auch auf das Lesen zu verteilen. Wir k\u00f6nnen eine Partition nehmen, die monatlich ist, und die vorherige Monat auf einen anderen Knoten verschieben, aber wenn die Abfrage nach diesen Daten kommt, belasten wir nur diesen. Wir m\u00f6chten jedoch den gesamten Cluster belasten, denn andernfalls wird eine Zeit lang die gesamte Leselast nur von zwei Shards bearbeitet.<\/p>\n<p><\/p>\n<p><strong>Alexej Milowidow:<\/strong> Die Antwort ist hier seltsam \u2013 ja, schlecht, aber es kann klappen. Ich erkl\u00e4re es Ihnen. Man sollte sich das Lastszenario ansehen, das mit Ihren Daten einhergeht. Wenn es sich um \u00dcberwachungsdaten handelt, kann man mit ziemlicher Sicherheit sagen, dass die meisten Abfragen nach aktuellen Daten suchen. <\/p>\n<p><\/p>\n<p>Sie haben neue Server installiert, alte Partitionen verschoben, aber auch ge\u00e4ndert, wie aktuelle Daten geschrieben werden. Und die aktuellen Daten werden \u00fcber den gesamten Cluster verteilt. Somit werden bereits nach f\u00fcnf Minuten die Abfragen f\u00fcr die letzten f\u00fcnf Minuten gleichm\u00e4\u00dfig den Cluster belasten, nach einem Tag die Abfragen f\u00fcr den Tag gleichm\u00e4\u00dfig den Cluster. Leider werden die Abfragen f\u00fcr den vorherigen Monat nur auf einem Teil der Server des Clusters ausgef\u00fchrt.<\/p>\n<p><\/p>\n<p>Aber h\u00e4ufig werden Sie keine Abfragen genau f\u00fcr Februar 2019 haben. Vielmehr werden die Abfragen, wenn sie aus dem Jahr 2019 stammen, f\u00fcr das gesamte Jahr 2019 sein \u2013 f\u00fcr einen gro\u00dfen Zeitrahmen und nicht f\u00fcr einen kleinen Bereich. Und solche Abfragen k\u00f6nnen den Cluster ebenfalls gleichm\u00e4\u00dfig belasten. Aber insgesamt ist Ihre Anmerkung v\u00f6llig korrekt, dass dies eine ad-hoc-L\u00f6sung ist, die die Daten nicht vollst\u00e4ndig gleichm\u00e4\u00dfig verteilt.<\/p>\n<p><\/p>\n<p>Ich habe noch einige Punkte, um die Frage zu beantworten. Einer davon betrifft, wie man das Sharding-Schema von Anfang an so gestalten kann, dass die Neuschardierung weniger schmerzhaft ist. Das ist nicht immer m\u00f6glich.<\/p>\n<p><\/p>\n<p>Zum Beispiel haben Sie \u00dcberwachungsdaten. Die \u00dcberwachungsdaten wachsen aus drei Gr\u00fcnden. Der erste ist das Ansammeln historischer Daten. Der zweite ist das Wachstum des Datenverkehrs. Und der dritte ist die Erh\u00f6hung der Anzahl der Dinge, die unter \u00dcberwachung fallen. Es kommen neue Mikrodienste und Metriken hinzu, die gespeichert werden m\u00fcssen. <\/p>\n<p><\/p>\n<p>Es ist m\u00f6glich, dass das gr\u00f6\u00dfte Wachstum mit genau dem dritten Grund zusammenh\u00e4ngt \u2013 der Zunahme der Nutzung von \u00dcberwachung. In diesem Fall sollte man sich die Art der Last ansehen, was die Hauptabfragen f\u00fcr SELECT sind. Die Hauptabfragen f\u00fcr SELECT werden wahrscheinlich f\u00fcr eine bestimmte Teilmenge von Metriken durchgef\u00fchrt.<\/p>\n<p><\/p>\n<p>Zum Beispiel die CPU-Nutzung auf bestimmten Servern durch einen Dienst. So gibt es eine bestimmte Teilmenge von Schl\u00fcssel, \u00fcber die Sie diese Daten abrufen. Und die Abfrage nach diesen Daten ist wahrscheinlich recht einfach und wird in wenigen zehn Millisekunden ausgef\u00fchrt. Sie wird f\u00fcr \u00dcberwachungsdienste und Dashboards verwendet. Ich hoffe, ich verstehe es richtig.<\/p>\n<p><\/p>\n<p><strong>Wladimir Kolobajew:<\/strong> Das Problem ist, dass wir sehr oft auf historische Daten zugreifen, da wir in Echtzeit die aktuelle Situation mit den historischen vergleichen. Und es ist wichtig f\u00fcr uns, schnellen Zugriff auf gro\u00dfe Datenmengen zu haben, und ClickHouse meistert das hervorragend.<\/p>\n<p><\/p>\n<p>Sie haben v\u00f6llig recht, die meisten Anfragen zum Lesen erhalten wir in den letzten 24 Stunden, wie bei jedem \u00dcberwachungssystem. Zugleich ist die Last auf den historischen Daten ebenfalls erheblich. Diese kommt haupts\u00e4chlich von dem Alarmsystem, das alle drei\u00dfig Sekunden an ClickHouse anfragt: \u201eGib mir die Daten der letzten sechs Wochen. Und jetzt erstelle mir daraus einen gleitenden Durchschnitt und lass uns den aktuellen Wert mit dem historischen vergleichen.\u201c <\/p>\n<p><\/p>\n<p>Ich m\u00f6chte betonen, dass wir f\u00fcr solche sehr frischen Anfragen noch eine kleine Tabelle haben, in der wir nur zwei Tage Daten speichern, und die Hauptanfragen flie\u00dfen dorthin. In die gro\u00dfe shardisierte Tabelle senden wir nur gro\u00dfe historische Anfragen.<\/p>\n<p><\/p>\n<p><strong>Alexej Milowidow:<\/strong> Leider passt das schlecht zu Ihrem Szenario, aber ich werde von zwei schlechten und komplexen Shardierungsschemata erz\u00e4hlen, die man vermeiden sollte, die aber im Service meiner Freunde verwendet werden. <\/p>\n<p><\/p>\n<p>Es gibt einen Hauptcluster mit den Ereignissen von \u201eYandex.Metrica\u201c. Die Ereignisse sind Seitenaufrufe, Klicks und \u00dcberg\u00e4nge. Die meisten Anfragen richten sich an eine bestimmte Website. Sie \u00f6ffnen den Service \u201eYandex.Metrica\u201c, haben eine Website \u2013 avito.ru, gehen zum Bericht und es erfolgt eine Anfrage zu Ihrer Website.<\/p>\n<p><\/p>\n<p>Aber es gibt auch andere Anfragen \u2013 analytische und globale, die von internen Analysten gemacht werden. Ich weise vorsichtshalber darauf hin, dass interne Analysten nur Anfragen zu den Services von \u201eYandex\u201c stellen. Dennoch nehmen selbst die Services von \u201eYandex\u201c einen erheblichen Anteil an allen Daten ein. Dies sind Anfragen nicht zu bestimmten Z\u00e4hlern, sondern mit breiterer Filterung.<\/p>\n<p><\/p>\n<p>Wie organisiert man die Daten so, dass sowohl die Anfragen f\u00fcr einen einzelnen Z\u00e4hler effizient funktionieren als auch die globalen Anfragen? Die Schwierigkeit besteht auch darin, dass die Anzahl der Anfragen an ClickHouse im \u201eMetrica\u201c-Cluster mehrere tausend pro Sekunde betr\u00e4gt. Dabei k\u00f6nnen nicht triviale Anfragen, zum Beispiel mehrere tausend pro Sekunde, von einem ClickHouse-Server nicht bearbeitet werden.<\/p>\n<p><\/p>\n<p>Die Clustergr\u00f6\u00dfe betr\u00e4gt mehr als sechshundert Server. Wenn wir einfach eine verteilte Tabelle \u00fcber diesem Cluster anlegen und mehrere tausend Anfragen dorthin senden, wird es noch schlimmer als w\u00fcrde man sie an einen einzelnen Server senden. Auf der anderen Seite ist die Option, dass die Daten gleichm\u00e4\u00dfig verteilt sind und wir von allen Servern anfragen, sofort ausgeschlossen.<\/p>\n<p><\/p>\n<p>Es gibt eine diametral entgegengesetzte Variante. Stellen Sie sich vor, wir shardieren die Daten nach Websites, und die Anfrage f\u00fcr eine Website geht an einen Shard. Jetzt kann der Cluster durchaus zehntausend Anfragen pro Sekunde bew\u00e4ltigen, aber auf einem bestimmten Shard wird eine einzelne Anfrage zu langsam arbeiten. Sie wird sich nicht mehr nach der Durchsatzkapazit\u00e4t skalieren lassen. Besonders wenn es sich um die Website avito.ru handelt. Ich werde kein Geheimnis verraten, wenn ich sage, dass Avito eine der meistbesuchten Websites im Runet ist. Und sie auf einem Shard zu verarbeiten w\u00e4re wahnsinnig.<\/p>\n<p><\/p>\n<p>Daher ist das Shardierungsschema cleverer gestaltet. Der gesamte Cluster ist in eine bestimmte Anzahl von Clustern unterteilt, die wir Schichten nennen. Innerhalb jeder Schicht gibt es von einem Dutzend bis mehrere Dutzend Shards. Insgesamt gibt es neununddrei\u00dfig solcher Cluster. <\/p>\n<p><\/p>\n<p>Wie skaliert sich das alles? Die Anzahl der Cluster bleibt gleich \u2013 wie vor einigen Jahren neununddrei\u00dfig, so bleibt es auch. Aber innerhalb jeder Schicht erh\u00f6hen wir allm\u00e4hlich die Anzahl der Shards, je mehr Daten wir ansammeln. Und das Shardierungsschema insgesamt sieht so aus: Die Aufteilung in diese Cluster erfolgt nach Websites, und um zu verstehen, welche Website zu welchem Cluster geh\u00f6rt, wird eine separate Metadatenbank in MySQL verwendet. Eine Website \u2013 ein Cluster. Und innerhalb davon erfolgt die Shardierung nach den Identifikatoren der Besucher.<\/p>\n<p><\/p>\n<p>Bei der Speicherung teilen wir sie nach dem Rest der Division des Besucher-Identifikators auf. Aber bei der Hinzuf\u00fcgung eines neuen Shards \u00e4ndert sich das Shardierungsschema, wir teilen weiterhin auf, jedoch nach dem Rest der Division durch eine andere Zahl. Das bedeutet, dass ein Besucher tats\u00e4chlich auf mehreren Servern liegen kann, und darauf sollte man sich nicht verlassen. Dies ist ausschlie\u00dflich daf\u00fcr gemacht, damit die Daten besser komprimiert werden. Und bei Anfragen gehen wir in die verteilte Tabelle, die auf den Cluster schaut und sich an Dutzende von Servern wendet. So ein komisches Schema.<\/p>\n<p><\/p>\n<p>Aber meine Erz\u00e4hlung w\u00e4re unvollst\u00e4ndig, wenn ich nicht erw\u00e4hnen w\u00fcrde, dass wir dieses Schema aufgegeben haben. In dem neuen Schema haben wir alles ge\u00e4ndert und alle Daten mit dem clickhouse-copier kopiert.<\/p>\n<p><\/p>\n<p>In&nbsp;dem neuen Schema werden alle Webseiten in&nbsp;zwei Kategorien&nbsp;unterteilt&nbsp;\u2014 gro\u00dfe und kleine. Ich wei\u00df nicht, wie die Grenze festgelegt wurde, aber das Ergebnis ist, dass gro\u00dfe Websites in&nbsp;einen Cluster eingetragen werden, der 120&nbsp;Shards mit jeweils drei Replikaten enth\u00e4lt&nbsp;\u2014 das sind insgesamt 360&nbsp;Server. Das Sharding-Schema ist so, dass jede Anfrage sofort an&nbsp;alle Shards geht. Wenn Sie jetzt in&nbsp;\u201eYandex.Metrica\u201c eine beliebige Berichtseite f\u00fcr&nbsp;avito.ru \u00f6ffnen, wird die Anfrage an&nbsp;120&nbsp;Server gesendet. Gro\u00dfe Webseiten gibt es im&nbsp;Russischen Internet nur wenige. Daher ergeben sich weniger als tausend Anfragen pro Sekunde, sogar weniger als hundert. All dies wird bequem von der Distributed-Tabelle verarbeitet, die jede von&nbsp;ihnen mit 120&nbsp;Servern bearbeitet.<\/p>\n<p><\/p>\n<p>Der zweite Cluster&nbsp;\u2014 f\u00fcr&nbsp;kleine Webseiten. Hier erfolgt das Sharding nach der Website-ID, und jede Anfrage geht nur an&nbsp;einen Shard.<\/p>\n<p><\/p>\n<h2 id=\"anchorclickhouse-copieranchorv-clickhouse-est-utilita-clickhouse-copier-mozhete-pronbspneyo-rasskazat\"><noindex><a rel=\"nofollow\" name=\"clickhouse-copier\"><\/a><\/noindex>ClickHouse verf\u00fcgt \u00fcber das Dienstprogramm clickhouse-copier. K\u00f6nnten Sie dar\u00fcber sprechen?<\/h2>\n<p><\/p>\n<p>Um es gleich zu sagen, diese L\u00f6sung ist etwas sperriger und bietet eine geringere Leistung. Der Vorteil besteht darin, dass sie die Daten vollst\u00e4ndig gem\u00e4\u00df dem Schema verteilt, das Sie angeben. Der Nachteil des Tools besteht darin, dass es kein Re-Sharding durchf\u00fchrt. Es kopiert die Daten von einem Cluster-Schema in&nbsp;ein anderes.<\/p>\n<p><\/p>\n<p>Das bedeutet, dass f\u00fcr&nbsp;seinen Betrieb zwei Cluster notwendig sind. Diese k\u00f6nnen sich auf&nbsp;den gleichen Servern befinden, jedoch erfolgt die Daten\u00fcbertragung nicht inkrementell, sondern es werden Kopien erstellt. <\/p>\n<p><\/p>\n<p>Zum Beispiel, wenn vorher vier Server vorhanden waren, gibt es jetzt acht. Sie erstellen auf&nbsp;allen Servern eine neue Distributed-Tabelle, neue lokale Tabellen und starten clickhouse-copier, wobei Sie ihm das Schema angeben, dass er von dort lesen und das neue Sharding-Schema \u00fcbernehmen und die Daten dorthin verschieben soll. Und auf den alten Servern ben\u00f6tigen Sie anderthalb Mal mehr Platz, als derzeit vorhanden ist, da die alten Daten dort bleiben m\u00fcssen und zus\u00e4tzlich eine H\u00e4lfte dieser alten Daten dorthin kommen wird. Wenn Sie im Voraus bedacht haben, dass die Daten neu shardiert werden m\u00fcssen und der Platz vorhanden ist, ist diese Methode geeignet.<\/p>\n<p><\/p>\n<p>Wie funktioniert clickhouse-copier intern? Er unterteilt die gesamte Arbeit in eine Reihe von Aufgaben zur Bearbeitung einer Partition einer Tabelle auf&nbsp;einem Shard. Alle diese Aufgaben k\u00f6nnen parallel ausgef\u00fchrt werden, und clickhouse-copier kann auf&nbsp;verschiedenen Maschinen in mehreren Instanzen gestartet werden, aber was er f\u00fcr&nbsp;eine Partition tut&nbsp;\u2014 ist nichts anderes als insert select. Daten werden gelesen, dekomprimiert, neu shardiert, dann wieder komprimiert und woanders gespeichert, neu sortiert. Dies ist eine aufwendigere L\u00f6sung.<\/p>\n<p><\/p>\n<h2 id=\"anchorresharding-toolanchoru-vas-byla-pilotnaya-shtuka-kotoraya-nazyvalas-resharding-chto-snbspney\"><noindex><a rel=\"nofollow\" name=\"resharding-tool\"><\/a><\/noindex>Sie hatten ein Pilotprojekt, das Resharding hie\u00df. Wie steht es damit?<\/h2>\n<p><\/p>\n<blockquote><p>Im Jahr 2017 gab es ein Pilotprojekt namens Re-Sharding. Es gibt sogar eine Option in&nbsp;ClickHouse. Ich verstehe, dass es nicht erfolgreich war. K\u00f6nnen Sie erz\u00e4hlen, warum das so ist? Es scheint doch sehr relevant zu sein.<\/p><\/blockquote>\n<p>Das ganze Problem besteht darin, dass bei der Notwendigkeit, Daten vor Ort neu zu shardieren, eine sehr komplexe Synchronisierung erforderlich ist, um dies atomar zu machen. Als wir uns ansahen, wie diese Synchronisierung gestaltet ist, wurde klar, dass es fundamentale Probleme gibt. Und diese fundamentalen Probleme sind nicht nur theoretisch, sondern zeigten sich sofort in der Praxis durch etwas, das sehr einfach erkl\u00e4rt werden kann&nbsp;\u2014 nichts funktioniert.<\/p>\n<p><\/p>\n<h2 id=\"anchormove-to-slow-diskanchormozhno-li-slivat-vse-chasti-dannyh-voedino-perednbspperemescheniem-nanbspmedlennye-diski\"><noindex><a rel=\"nofollow\" name=\"move-to-slow-disk\"><\/a><\/noindex>Kann man alle Teile der Daten zu einer Einheit verschmelzen, bevor man sie auf langsame Festplatten bewegt?<\/h2>\n<p><\/p>\n<blockquote><p>Frage zu&nbsp;TTL mit der Option, auf langsame Festplatten zu verschieben, im Kontext von&nbsp;Mergers. Gibt es eine M\u00f6glichkeit, au\u00dfer \u00fcber&nbsp;cron, alle Teile vor dem Verschieben auf langsame Festplatten in&nbsp;einen zusammenzuf\u00fchren?<\/p><\/blockquote>\n<p>Die Antwort auf die Frage, ob man automatisch alle St\u00fccke vor der \u00dcbertragung zusammenf\u00fchren kann&nbsp;\u2014 nein. Ich denke nicht, dass das notwendig ist. Man kann auch darauf setzen, dass sie automatisch auf&nbsp;langsame Festplatten verschoben werden. <\/p>\n<p><\/p>\n<p>Wir haben zwei Kriterien f\u00fcr die \u00dcbertragungsregeln. Erstens&nbsp;\u2014 je nach F\u00fcllstand. Wenn der aktuelle Speicherspiegel weniger als einen bestimmten Prozentsatz freien Speicherplatz hat, w\u00e4hlen wir ein St\u00fcck aus und verschieben es auf&nbsp;einen langsameren Speicher. Genauer gesagt nicht langsamer, sondern den n\u00e4chsten&nbsp;\u2014 je nach Ihren Einstellungen.<\/p>\n<p><\/p>\n<p>Das zweite Kriterium&nbsp;\u2014 nach Gr\u00f6\u00dfe. Es geht um die \u00dcbertragung gro\u00dfer St\u00fccke. Sie k\u00f6nnen den Schwellenwert f\u00fcr den freien Speicherplatz auf&nbsp;der schnellen Festplatte einstellen, und die Daten werden automatisch \u00fcbertragen.<\/p>\n<p><\/p>\n<h2 id=\"anchorup-to-dateanchorkak-pereezzhat-nanbspnovye-versii-clickhouse-esli-net-vozmozhnosti-zaranee-proverit-sovmestimost\"><noindex><a rel=\"nofollow\" name=\"up-to-date\"><\/a><\/noindex>Wie migriert man auf neue Versionen von ClickHouse, wenn man die Kompatibilit\u00e4t vorher nicht testen kann?<\/h2>\n<p><\/p>\n<blockquote><p>Dieses Thema wird regelm\u00e4\u00dfig diskutiert <noindex><a rel=\"nofollow\" href=\"https:\/\/teleg.run\/clickhouse_ru\">im&nbsp;Telegram-Chat ClickHouse<\/a><\/noindex> unter Ber\u00fccksichtigung verschiedener Versionen, und trotzdem. Wie sicher ist es, von&nbsp;Version 19.11 auf&nbsp;19.16 und zum Beispiel von&nbsp;19.16 auf&nbsp;20.3 zu aktualisieren? Wie am besten auf neue Versionen umsteigen, wenn man die Kompatibilit\u00e4t nicht vorher in&nbsp;einer Sandbox \u00fcberpr\u00fcfen kann?<\/p><\/blockquote>\n<p>Hier einige \u201egoldene\u201c Regeln. Erstens&nbsp;\u2014 <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/ClickHouse\/ClickHouse\/blob\/master\/CHANGELOG.md\">lesen Sie das Changelog<\/a><\/noindex>. Es ist umfangreich, aber es gibt spezifische Punkte zu&nbsp;r\u00fcckw\u00e4rts inkompatiblen \u00c4nderungen. Man sollte diese Punkte nicht als roten Alarm betrachten. In der Regel handelt es sich um kleine Inkompatibilit\u00e4ten, die mit bestimmten Randfunktionen zusammenh\u00e4ngen, die Sie h\u00f6chstwahrscheinlich nicht verwenden.<\/p>\n<p><\/p>\n<p>Zweitens&nbsp;\u2014 wenn keine M\u00f6glichkeit besteht, die Kompatibilit\u00e4t in einer Sandbox zu pr\u00fcfen, und Sie m\u00f6chten direkt in der Produktionsumgebung aktualisieren, lautet die Empfehlung: Tun Sie es nicht. Erstellen Sie zuerst eine Sandbox und testen Sie. Wenn es keine Testumgebung gibt, ist Ihr Unternehmen wahrscheinlich nicht sehr gro\u00df, und Sie k\u00f6nnen daher einige Daten auf Ihren Laptop kopieren, um dort sicherzustellen, dass alles korrekt funktioniert. Es ist sogar m\u00f6glich, mehrere Exemplare lokal auf Ihrem Rechner zu starten. Oder Sie k\u00f6nnen in der N\u00e4he eine neue Version aufsetzen und einige Daten hineinladen&nbsp;\u2014 das hei\u00dft, eine improvisierte Testumgebung erstellen. <\/p>\n<p><\/p>\n<p>Eine weitere Regel&nbsp;\u2014 aktualisieren Sie nicht innerhalb einer Woche nach der Ver\u00f6ffentlichung einer Version, weil Fehler in der Produktion identifiziert und schnell behoben werden m\u00fcssen. Lassen Sie uns die Versionsnummerierung von ClickHouse kl\u00e4ren, um nicht durcheinander zu kommen. <\/p>\n<p><\/p>\n<p>Es gibt die Version 20.3.4. Die Zahl 20 steht f\u00fcr das Ver\u00f6ffentlichungsjahr&nbsp;\u2014 2020. In Bezug auf den Inhalt hat das keine Bedeutung, also m\u00fcssen wir darauf nicht weiter eingehen. Weiter&nbsp;\u2014 20.3. Die zweite Zahl&nbsp;\u2014 in diesem Fall 3&nbsp;\u2014 erh\u00f6hen wir jedes Mal, wenn wir ein Release mit neuer Funktionalit\u00e4t herausbringen. Wenn wir eine neue Funktion in ClickHouse hinzuf\u00fcgen m\u00f6chten, sind wir verpflichtet, diese Zahl zu erh\u00f6hen. Das bedeutet, dass ClickHouse in der Version 20.4 noch besser funktionieren wird. Die dritte Zahl&nbsp;\u2014 20.3.4. Hier steht&nbsp;4 f\u00fcr die Anzahl der Patch-Releases, in denen keine neuen Funktionen hinzugef\u00fcgt wurden, aber einige Bugs behoben wurden. Und die 4 bedeutet, dass wir das viermal gemacht haben.<\/p>\n<p><\/p>\n<p>Man sollte nicht denken, dass es etwas Schreckliches ist. In der Regel kann der Benutzer die neueste Version installieren, und sie wird ein Jahr lang ohne Probleme mit der Betriebszeit funktionieren. Aber stellen Sie sich vor, dass bei einer Funktion zur Verarbeitung von Bitmaps, die von unseren chinesischen Kollegen hinzugef\u00fcgt wurde, der Server abst\u00fcrzt, wenn falsche Argumente \u00fcbergeben werden. Wir m\u00fcssen das beheben. Wir werden eine neue Patch-Version ver\u00f6ffentlichen, und ClickHouse wird stabiler.<\/p>\n<p><\/p>\n<p>Wenn Sie ClickHouse in der Produktionsumgebung verwenden und eine neue Version von ClickHouse mit zus\u00e4tzlichen Funktionen erscheint&nbsp;\u2014 zum Beispiel&nbsp;20.4.1&nbsp;\u2014 warten Sie am ersten Tag nicht mit der Installation in der Produktion. Warum brauchen Sie es \u00fcberhaupt? Wenn Sie ClickHouse noch nicht verwenden, k\u00f6nnen Sie es installieren, und es wird wahrscheinlich alles gut funktionieren. Wenn ClickHouse jedoch bereits stabil l\u00e4uft, beachten Sie die Patches und Updates&nbsp;\u2014 welche Probleme wir beheben.<\/p>\n<p><\/p>\n<p><strong>Kirill Shvakov:<\/strong> Ich m\u00f6chte ein wenig zu Testumgebungen hinzuf\u00fcgen. Alle haben gro\u00dfe Angst vor Testumgebungen und denken irgendwie, dass, wenn Sie ein sehr gro\u00dfes ClickHouse-Cluster haben, die Testumgebung mindestens gleich gro\u00df oder zumindest zehnmal kleiner sein sollte. Das ist ganz und gar nicht der Fall.<\/p>\n<p><\/p>\n<p>Ich kann aus eigener Erfahrung sagen. Ich habe ein Projekt, in dem ClickHouse l\u00e4uft. Unsere Testumgebung daf\u00fcr&nbsp;\u2014 ist eine kleine virtuelle Maschine bei Hetzner f\u00fcr zwanzig Euro, auf der alles vollst\u00e4ndig implementiert ist. Um das zu tun, haben wir eine vollst\u00e4ndige Automatisierung mit Ansible, daher ist es im Prinzip egal, wohin man ausrollen muss&nbsp;\u2014 auf physische Server oder einfach auf virtuellen Maschinen.<\/p>\n<p><\/p>\n<p>Was kann man tun? Es w\u00e4re gut, in der ClickHouse-Dokumentation ein Beispiel zu haben, wie man sich ein kleines Cluster aufsetzt&nbsp;\u2014 in Docker, in LXC; m\u00f6glicherweise ein Ansible-Playbook zu erstellen, weil die Leute unterschiedliche Deployments haben. Das w\u00fcrde vieles erleichtern. Wenn man in f\u00fcnf Minuten ein Cluster aufsetzen kann, ist es viel einfacher, sich mit etwas auseinanderzusetzen. So ist es viel bequemer, da in die Produktionsversion zu gehen, die Sie nicht \u00fcberpr\u00fcft haben&nbsp;\u2014 das ist der Weg ins Nichts. Manchmal funktioniert es, manchmal nicht. Daher ist es schlecht, auf den Erfolg zu hoffen.<\/p>\n<p><\/p>\n<p><strong>Maxim Kotyakov, Senior Backend Engineer bei Avito:<\/strong> Ich m\u00f6chte etwas zu den Testumgebungen im Zusammenhang mit den Herausforderungen gro\u00dfer Unternehmen hinzuf\u00fcgen. Wir haben einen voll funktionsf\u00e4higen Acceptance-Cluster von ClickHouse, der in Datenmodellen und Konfigurationen eine exakte Kopie der Produktionsumgebung ist. Dieser Cluster ist in recht einfachen Containern mit minimalen Ressourcen bereitgestellt. Wir schreiben einen bestimmten Prozentsatz der Produktionsdaten dort hin, wobei wir die M\u00f6glichkeit haben, den Stream in Kafka zu replizieren. Alles ist synchronisiert und skaliert \u2013 sowohl in Bezug auf die Leistung als auch auf den Datenfluss, und theoretisch sollte es sich unter gleichen Bedingungen hinsichtlich der Metriken wie die Produktionsumgebung verhalten. Alles, was potenziell problematisch ist, wird zuerst auf diesem Stand getestet und dort mehrere Tage \u201eeingek\u00f6chelt\u201c, bis es bereit ist. Aber nat\u00fcrlich ist diese L\u00f6sung teuer, anspruchsvoll und mit nicht unerheblichen Supportkosten verbunden. <\/p>\n<p><\/p>\n<p><strong>Alexej Milowidow:<\/strong> Ich m\u00f6chte erl\u00e4utern, wie die Testumgebung unserer Freunde aus \u201eYandex.Metrica\u201c aussieht. Ein Cluster bestand aus \u00fcber 600 Servern, ein anderer aus 360, und es gibt noch einen dritten sowie mehrere andere Cluster. Die Testumgebung f\u00fcr einen davon besteht aus einfach zwei Shards mit jeweils zwei Replikaten. Warum zwei Shards? Damit nicht nur einer vorhanden ist. Und auch Replikate, damit zumindest eine minimale Anzahl vorhanden ist, die man sich leisten kann.<\/p>\n<p><\/p>\n<p>Diese Testumgebung erm\u00f6glicht es, die Funktionsf\u00e4higkeit der Abfragen zu \u00fcberpr\u00fcfen und sicherzustellen, dass nicht alles kaputt gegangen ist. Oft tauchen jedoch Probleme anderer Art auf, wenn alles funktioniert, aber es einige kleine \u00c4nderungen bei der Last gibt.<\/p>\n<p><\/p>\n<p>Ein Beispiel: Wir entschieden uns, eine neue Version von ClickHouse zu installieren. Diese wurde in die Testumgebung eingespielt, automatisierte Tests in Yandex.Metrica wurden erfolgreich durchlaufen, die die Daten der alten und der neuen Version vergleichen, indem sie die gesamte Pipeline durchlaufen. Und nat\u00fcrlich die gr\u00fcnen Tests unserer CI. Andernfalls h\u00e4tten wir diese Version nicht einmal angeboten.<\/p>\n<p><\/p>\n<p>Alles lief hervorragend. Wir beginnen, es in die Produktion zu bringen. Ich bekomme die Nachricht, dass die Last in den Grafiken mehrere Male gestiegen ist. Wir rollen die Version zur\u00fcck. Ich schaue mir das Diagramm an und sehe: Die Last ist w\u00e4hrend des Rollouts wirklich um mehrere Male gestiegen und fiel zur\u00fcck, als wir die Version zur\u00fcckrollten. Dann begannen wir, die Version zur\u00fcckzurollen. Und die Last stieg ebenso an und fiel ebenso zur\u00fcck. Die Schlussfolgerung ist also: Die Last stieg aufgrund des Rollouts, nichts \u00dcberraschendes.<\/p>\n<p><\/p>\n<p>Danach war es schwierig, die Kollegen zu \u00fcberzeugen, die neue Version tats\u00e4chlich zu installieren. Ich sage: \u201eAlles ist in Ordnung, rollt sie aus. Haltet die Daumen, alles wird funktionieren. Momentan ist die Last in den Grafiken gestiegen, aber alles ist in Ordnung. Haltet durch.\u201c Im Allgemeinen haben wir es so gemacht, und das war's \u2013 die Version wurde in die Produktion gebracht. Aber bei fast jedem Rollout treten \u00e4hnliche Probleme auf.<\/p>\n<p><\/p>\n<h2 id=\"anchorkill-queryanchorkill-query-dolzhen-ubivat-zaprosy-no-on-etogo-ne-delaet-pochemu\"><noindex><a rel=\"nofollow\" name=\"kill-query\"><\/a><\/noindex>Der Kill-Query sollte Anfragen beenden, tut dies aber nicht. Warum?<\/h2>\n<p><\/p>\n<blockquote><p>Ein Benutzer, ein Analyst, kam zu mir und erstellte eine Anfrage, die meinen ClickHouse-Cluster lahmlegte. Irgendein Knoten oder der gesamte Cluster, je nachdem, in welches Replikat oder welchen Shard die Anfrage fiel. Ich sehe, dass alle Ressourcen der CPU auf diesem Server ausgelastet sind, alles rot. Gleichzeitig antwortet ClickHouse auf Anfragen. Und ich schreibe: \u201eZeig mir bitte die Prozessliste, welche Anfrage hat dieses Chaos verursacht.\u201c<\/p>\n<p>Ich finde diese Anfrage und schreibe \u201ekill\u201c. Und ich sehe, dass nichts passiert. Mein Server ist \u00fcberlastet, ClickHouse gibt mir weiterhin Befehle zur\u00fcck und zeigt, dass der Server funktioniert und alles gut ist. Aber ich erlebe eine Verschlechterung bei allen Benutzeranfragen, die Datenaufzeichnung in ClickHouse wird schlechter, und mein kill query funktioniert nicht. Warum? Ich dachte, kill query sollte die Anfragen stoppen, aber das passiert nicht.<\/p><\/blockquote>\n<p>Jetzt kommt eine ziemlich seltsame Antwort. Es liegt daran, dass kill query die Anfragen nicht wirklich stoppt. <\/p>\n<p><\/p>\n<p>Kill query setzt ein kleines Flag mit dem Namen \u201eich m\u00f6chte, dass diese Anfrage gestoppt wird\u201c. Die Anfrage \u00fcberpr\u00fcft beim Verarbeiten jedes Blocks dieses Flag. Wenn es gesetzt ist, stoppt die Anfrage ihre Arbeit. Es stellt sich heraus, dass niemand die Anfrage stoppt; sie muss selbst alles \u00fcberpr\u00fcfen und anhalten. Und das sollte in allen F\u00e4llen funktionieren, wenn die Anfrage sich im Zustand der Verarbeitung von Datenbl\u00f6cken befindet. Sie verarbeitet den n\u00e4chsten Datenblock, \u00fcberpr\u00fcft das Flag und stoppt.<\/p>\n<p><\/p>\n<p>Das funktioniert nicht in F\u00e4llen, in denen die Anfrage bei einer bestimmten Operation blockiert ist. Wahrscheinlich ist das nicht Ihr Fall, denn laut Ihrer Aussage nutzt sie eine Menge Server-Ressourcen. Es ist m\u00f6glich, dass dies nicht bei externer Sortierung und einigen anderen Details funktioniert. Aber grunds\u00e4tzlich sollte es nicht so sein, das ist ein Fehler. Und das Einzige, was ich vorschlagen kann, ist, ClickHouse zu aktualisieren.<\/p>\n<p><\/p>\n<h2 id=\"anchorreading-timeanchorkak-rasschitat-vremya-otveta-pri-chitayuschey-nagruzke\"><noindex><a rel=\"nofollow\" name=\"reading-time\"><\/a><\/noindex>Wie berechnet man die Antwortzeit bei einer Leseanfrage?<\/h2>\n<p><\/p>\n<blockquote><p>Es gibt eine Tabelle, in der Aggregationen zu item gespeichert werden \u2013 verschiedene Z\u00e4hler. Die Anzahl der Zeilen betr\u00e4gt etwa hundert Millionen. Kann man mit einer vorhersehbaren Antwortzeit rechnen, wenn man 1K RPS mit 1K items anwirft? <\/p><\/blockquote>\n<p>Laut dem Kontext handelt es sich um eine Lese-Last, denn beim Schreiben gibt es keine Probleme \u2013 man kann tausend, hunderttausend oder manchmal sogar mehrere Millionen Zeilen einf\u00fcgen. <\/p>\n<p><\/p>\n<p>Leseanfragen sind ganz unterschiedlich. In einem select 1 kann ClickHouse mehrere Zehntausend Anfragen pro Sekunde ausf\u00fchren, daher erfordern sogar Anfragen mit einem Schl\u00fcssel bereits einige Ressourcen. Diese punktuellen Anfragen sind komplizierter als in einigen key-value Datenbanken, da f\u00fcr jedes Lesen ein Datenblock \u00fcber den Index gelesen werden muss. Der Index adressiert nicht jeden Datensatz, sondern jeden Bereich. Das bedeutet, dass der gesamte Bereich gelesen werden muss \u2013 dies sind standardm\u00e4\u00dfig 8192 Zeilen. Man muss einen komprimierten Datenblock von 64 Kb auf 1 Mb dekomprimieren. Normalerweise dauern solche punktuellen Anfragen einige Millisekunden. Aber das ist die einfachste Variante.<\/p>\n<p><\/p>\n<p>Lassen Sie uns eine einfache Arithmetik versuchen. Wenn man einige Millisekunden mit tausend multipliziert, ergibt das einige Sekunden. Es scheint, als k\u00f6nnte man nicht tausend Anfragen pro Sekunde halten, aber tats\u00e4chlich kann man das, weil wir mehrere Prozessorkerne haben. Prinzipiell kann ClickHouse manchmal 1000 RPS handhaben, aber nur bei kurzen, pr\u00e4zisen Anfragen.<\/p>\n<p><\/p>\n<p>Wenn man das ClickHouse-Cluster hinsichtlich der einfachen Anfragen skalieren muss, empfehle ich das Einfachste \u2013 erh\u00f6hen Sie die Anzahl der Replikate und leiten Sie Anfragen an eine zuf\u00e4llige Replik. Wenn eine Replik 500 Anfragen pro Sekunde verarbeiten kann, was durchaus realistisch ist, dann k\u00f6nnen drei Replikate 1500 verarbeiten.<\/p>\n<p><\/p>\n<p>Manchmal kann man ClickHouse auch f\u00fcr die maximale Anzahl an punktuellen Lesevorg\u00e4ngen optimieren. Was braucht man daf\u00fcr? Zuerst \u2013 die Granularit\u00e4t des Indexes reduzieren. Dabei sollte man sie nicht auf eins reduzieren, sondern so, dass die Anzahl der Datens\u00e4tze im Index mehrere Millionen oder mehrere zehn Millionen pro Server betr\u00e4gt. Wenn die Tabelle hundert Millionen Zeilen enth\u00e4lt, kann die Granularit\u00e4t auf 64 gesetzt werden.<\/p>\n<p><\/p>\n<p>Die Gr\u00f6\u00dfe des komprimierten Blocks kann verringert werden. Daf\u00fcr gibt es Einstellungen. <strong>minimale Gr\u00f6\u00dfe des komprimierten Blocks<\/strong>, <strong>maximale Gr\u00f6\u00dfe des komprimierten Blocks<\/strong>Diese k\u00f6nnen verringert werden, indem die Daten neu geladen werden, und dann werden Punktanfragen schneller. Aber ClickHouse ist dennoch keine key-value Datenbank. Eine gro\u00dfe Anzahl kleiner Anfragen ist ein Antipattern f\u00fcr die Last.<\/p>\n<p><\/p>\n<p><strong>Kirill Shvakov:<\/strong> Ich gebe Ihnen einen Rat f\u00fcr den Fall, dass es sich um gew\u00f6hnliche Z\u00e4hler handelt. Dies ist eine g\u00e4ngige Situation, wenn ClickHouse einen Z\u00e4hler speichert. Ich habe einen Benutzer, er kommt aus einem bestimmten Land, hat noch ein drittes Feld, und muss etwas inkrementell erh\u00f6hen. Nehmen Sie MySQL, erstellen Sie einen eindeutigen Schl\u00fcssel \u2013 in MySQL ist es ein doppelter Schl\u00fcssel, in PostgreSQL ein Konflikt \u2013 und addieren Sie mit einem Plus. Das wird viel besser funktionieren. <\/p>\n<p><\/p>\n<p>Wenn Sie nur wenige Daten haben, macht es keinen Sinn, ClickHouse zu verwenden. Es gibt normale Datenbanken, und die machen damit guten Job. <\/p>\n<p><\/p>\n<h2 id=\"anchorpimp-my-clickhouseanchorchto-podtyunit-v-clickhouse-chtoby-bolshe-dannyh-bylo-vnbspkeshe\"><noindex><a rel=\"nofollow\" name=\"pimp-my-clickhouse\"><\/a><\/noindex>Was kann man in ClickHouse optimieren, um mehr Daten im Cache zu haben?<\/h2>\n<p><\/p>\n<blockquote><p>Stellen wir uns die Situation vor \u2013 auf den Servern sind 256 GB RAM, im t\u00e4glichen Betrieb verbraucht ClickHouse etwa 60\u201380 GB, in Spitzenzeiten bis zu 130. Was kann man aktivieren und optimieren, um mehr Daten im Cache zu haben und folglich weniger auf die Disk zugreifen zu m\u00fcssen?<\/p><\/blockquote>\n<p>In der Regel erledigt der Page Cache des Betriebssystems diese Aufgabe gut. Wenn Sie einfach top \u00f6ffnen und dort cached oder free ansehen \u2013 es wird auch dort angezeigt, wie viel im Cache gespeichert ist \u2013 dann k\u00f6nnen Sie feststellen, dass der gesamte freie Speicher f\u00fcr den Cache genutzt wird. Und diese Daten werden beim Lesen nicht von der Disk, sondern aus dem RAM gelesen. Dabei kann ich sagen, dass der Cache effizient genutzt wird, da tats\u00e4chlich komprimierte Daten zwischengespeichert werden.<\/p>\n<p><\/p>\n<p>Dennoch, wenn Sie einige einfache Anfragen noch weiter beschleunigen m\u00f6chten, gibt es die M\u00f6glichkeit, innerhalb von ClickHouse einen Cache f\u00fcr unkomprimierte Daten zu aktivieren. Dies wird genannt <strong>uncompressed cache<\/strong>. Im Konfigurationsfile config.xml stellen Sie die uncompressed cache size auf den gew\u00fcnschten Wert ein \u2013 ich empfehle nicht mehr als die H\u00e4lfte des verf\u00fcgbaren RAM, da der Rest f\u00fcr den Page Cache verwendet wird. <\/p>\n<p><\/p>\n<p>Dar\u00fcber hinaus gibt es zwei Abfrageebenen-Einstellungen. Die erste Einstellung ist <strong>use uncompressed cache<\/strong> \u2013 aktiviert die Nutzung. Es wird empfohlen, sie f\u00fcr alle Anfragen zu aktivieren, au\u00dfer f\u00fcr intensive, die m\u00f6glicherweise alle Daten lesen und diesen Cache leeren k\u00f6nnten. Und die zweite Einstellung ist etwa das maximale Anzahl an Zeilen, die f\u00fcr den Cache verwendet werden d\u00fcrfen. Dies begrenzt automatisch gro\u00dfe Anfragen, sodass sie den Cache umgehen.<\/p>\n<p><\/p>\n<h2 id=\"anchorstorage-configurationanchorkak-mozhno-nastroit-storage_configuration-dlya-hraneniya-v-operativke\"><noindex><a rel=\"nofollow\" name=\"storage-configuration\"><\/a><\/noindex>Wie kann man die storage_configuration f\u00fcr den Betriebsspeicher optimieren?<\/h2>\n<p><\/p>\n<blockquote><p>In der neuen Dokumentation von ClickHouse habe ich einen Abschnitt gefunden, der sich <noindex><a rel=\"nofollow\" href=\"https:\/\/clickhouse.tech\/docs\/en\/single\/#table_engine-mergetree-multiple-volumes\">mit data storage<\/a><\/noindex>. In der Beschreibung gibt es ein Beispiel mit schnellen SSD. <\/p>\n<p>Es ist interessant, wie man dasselbe mit&nbsp;volume hot memory konfigurieren kann. Und noch eine Frage. Wie funktioniert select mit&nbsp;dieser Datenorganisation? Wird das gesamte Set gelesen oder nur das, was auf&nbsp;der Festplatte liegt, und werden diese Daten im&nbsp;Speicher komprimiert? Und wie funktioniert der prewhere-Bereich bei dieser Datenorganisation?<\/p><\/blockquote>\n<p>Diese Einstellung beeinflusst die Speicherung von Datenst\u00fccken, und ihr Format \u00e4ndert sich dabei nicht.<br \/>\nLassen Sie uns das genauer betrachten. <\/p>\n<p><\/p>\n<p>Die Speicherung von Daten im&nbsp;RAM kann eingerichtet werden. Alles, was f\u00fcr&nbsp;die Festplatte konfiguriert wird, ist ihr Pfad. Sie erstellen eine tmpfs-Partition, die an einen bestimmten Pfad im&nbsp;Dateisystem gemountet ist. Sie geben diesen Pfad als Speicherort f\u00fcr die hei\u00dfeste Partition an, und dort beginnen die Datenst\u00fccke zu flie\u00dfen und werden geschrieben, alles funktioniert gut. <\/p>\n<p><\/p>\n<p>Aber ich empfehle das nicht wegen der niedrigen Zuverl\u00e4ssigkeit, obwohl es m\u00f6glich ist, wenn Sie mindestens drei Replikate in verschiedenen Rechenzentren haben. Wenn etwas passiert, k\u00f6nnen die Daten wiederhergestellt werden. Stellen Sie sich vor, der Server wird pl\u00f6tzlich ausgeschaltet und wieder eingeschaltet. Die Partition wurde erneut gemountet, aber dort ist Leere. Der ClickHouse-Server sieht beim Start, dass diese St\u00fccke fehlen, obwohl sie gem\u00e4\u00df den Metadaten in ZooKeeper vorhanden sein sollten. Er \u00fcberpr\u00fcft, auf welchen Replikaten sie vorhanden sind, fordert sie an und l\u00e4dt sie herunter. So werden die Daten wiederhergestellt. <\/p>\n<p><\/p>\n<p>In dieser Hinsicht unterscheidet sich die Speicherung von Daten im&nbsp;RAM prinzipiell nicht von deren Speicherung auf&nbsp;der Festplatte, weil die Daten beim Schreiben auf die Festplatte auch zuerst in den Page Cache gelangen und physisch verz\u00f6gert geschrieben werden. Das h\u00e4ngt von der Art der Einbindung des Dateisystems ab. Aber vorsichtshalber sage ich, dass ClickHouse bei&nbsp;insert kein fsync durchf\u00fchrt.<\/p>\n<p><\/p>\n<p>Dabei werden die Daten im&nbsp;RAM im genau gleichen Format wie auf&nbsp;der Festplatte gespeichert. Die select-Abfrage w\u00e4hlt genau die St\u00fccke aus, die gelesen werden m\u00fcssen, w\u00e4hlt die erforderlichen Datenbereiche in den St\u00fccken aus und liest sie. Und der prewhere-Bereich funktioniert absolut gleich, unabh\u00e4ngig davon, ob die Daten im&nbsp;RAM oder auf&nbsp;der Festplatte waren.<\/p>\n<p><\/p>\n<h2 id=\"anchorlow-cardinalityanchordo-kakogo-kolichestva-unikalnyh-znacheniy-effektiven-low-cardinality\"><noindex><a rel=\"nofollow\" name=\"low-cardinality\"><\/a><\/noindex>Bis zu wie vielen einzigartigen Werten ist Low Cardinality effektiv?<\/h2>\n<p><\/p>\n<p>Low Cardinality ist clever aufgebaut. Es erstellt Datenw\u00f6rterb\u00fccher, aber sie sind lokal. Erstens, die W\u00f6rterb\u00fccher sind f\u00fcr jedes St\u00fcck spezifisch, zweitens k\u00f6nnen sie sogar innerhalb eines St\u00fccks f\u00fcr jeden Bereich unterschiedlich sein. Wenn die Anzahl der einzigartigen Werte einen Schwellwert erreicht, ich glaube, eine Million, wird das W\u00f6rterbuch einfach zur\u00fcckgestellt, und es wird ein neues erstellt.<\/p>\n<p><\/p>\n<p>Die Antwort im&nbsp;Allgemeinen: F\u00fcr jeden lokalen Bereich \u2013 sagen wir, f\u00fcr jeden Tag \u2013 ist Low Cardinality effektiv, wenn es bis zu einer Million einzigartiger Werte gibt. Danach gibt es einfach einen Fallback, bei dem viele verschiedene W\u00f6rterb\u00fccher verwendet werden, anstatt nur eines. Es wird ungef\u00e4hr so funktionieren wie eine normale Spalte vom Typ string, vielleicht etwas weniger effizient, aber es wird keine gravierenden Leistungseinbu\u00dfen geben. <\/p>\n<p><\/p>\n<h2 id=\"anchorfulltext-searchanchorkakie-luchshie-praktiki-ponbsppolnotekstovomu-poisku-ponbsptablice-snbsppyatyu-milliardami-strok\"><noindex><a rel=\"nofollow\" name=\"fulltext-search\"><\/a><\/noindex>Was sind die besten Praktiken f\u00fcr die Volltextsuche in einer Tabelle mit f\u00fcnf Milliarden Zeilen?<\/h2>\n<p><\/p>\n<p>Es gibt verschiedene Arten von Antworten. Die erste ist zu sagen, dass ClickHouse keine Volltextsuchsystem ist. Daf\u00fcr gibt es spezielle Systeme, zum Beispiel, <noindex><a rel=\"nofollow\" href=\"https:\/\/www.elastic.co\/enterprise-search\">Elasticsearch<\/a><\/noindex> und <noindex><a rel=\"nofollow\" href=\"http:\/\/sphinxsearch.com\/\">Sphinx<\/a><\/noindex>. Dennoch treffe ich immer h\u00e4ufiger auf Menschen, die sagen, dass sie von Elasticsearch auf ClickHouse umsteigen.<\/p>\n<p><\/p>\n<p>Warum geschieht das? Sie erkl\u00e4ren es damit, dass Elasticsearch bei bestimmten Volumina beginnt, mit der Last nicht mehr umzugehen, beginnend mit dem, was die Indexierung betrifft. Die Indizes werden zu umfangreich, und wenn man die Daten einfach in ClickHouse \u00fcbertr\u00e4gt, stellt sich heraus, dass sie um ein Vielfaches effizienter gespeichert werden. Dabei waren die Suchanfragen oft nicht so, dass man in allen Daten irgendeine Phrase unter Ber\u00fccksichtigung der Morphologie finden muss, sondern ganz anders. Zum Beispiel, um in den Logs der letzten Stunden nach einer bestimmten Byte-Unterfolge zu suchen.<\/p>\n<p><\/p>\n<p>In diesem Fall erstellen Sie in ClickHouse einen Index, dessen erstes Feld das Datum mit der Uhrzeit ist. Die gr\u00f6\u00dfte Einschr\u00e4nkung der Daten wird genau nach dem Datumsbereich sein. Innerhalb des gew\u00e4hlten Datumsbereichs kann in der Regel eine Volltextsuche auch mit der Brute-Force-Methode mittels like durchgef\u00fchrt werden. Der like-Operator in ClickHouse ist der effizienteste like-Operator, den Sie finden k\u00f6nnen. Wenn Sie einen besseren finden, sagen Sie es mir. <\/p>\n<p><\/p>\n<p>Aber trotzdem ist like ein full scan. Und ein full scan kann nicht nur hinsichtlich der CPU, sondern auch der Festplatte langsam sein. Wenn Sie pl\u00f6tzlich ein Terabyte Daten pro Tag haben und innerhalb eines Tages nach einem Wort suchen, m\u00fcssen Sie ein Terabyte scannen. Und das wird sicherlich auf normalen Festplatten sein, und am Ende werden sie so ausgelastet, dass Sie sich nicht einmal mehr per SSH auf diesen Server einloggen k\u00f6nnen.<\/p>\n<p><\/p>\n<p>In diesem Fall m\u00f6chte ich einen weiteren kleinen Trick vorschlagen. Er geh\u00f6rt zur Experimentalkategorie \u2013 er k\u00f6nnte funktionieren oder auch nicht. In ClickHouse gibt es Volltextindizes in Form von trigrammatischen Bloom-Filtern. Unsere Kollegen von Arenadata haben diese Indizes bereits getestet, und oft funktionieren sie genau so, wie es vorgesehen ist.<\/p>\n<p><\/p>\n<p>Um sie richtig zu nutzen, muss man gut verstehen, wie sie funktionieren: Was ist ein trigrammatischer Bloom-Filter und wie w\u00e4hlt man seine Gr\u00f6\u00dfe? Ich kann sagen, dass sie bei Anfragen zu seltenen Phrasen und Substrings helfen, die in den Daten kaum vorkommen. In diesem Fall werden Teilbereiche durch die Indizes ausgew\u00e4hlt, und es werden weniger Daten gelesen.<\/p>\n<p><\/p>\n<p>Neu in ClickHouse sind auch noch fortschrittlichere Funktionen f\u00fcr die Volltextsuche. Erstens die Suche nach mehreren Substrings in einem Durchgang, einschlie\u00dflich Varianten mit Ber\u00fccksichtigung der Gro\u00df- und Kleinschreibung, ohne Ber\u00fccksichtigung der Gro\u00df- und Kleinschreibung, mit Unterst\u00fctzung f\u00fcr UTF-8 oder nur f\u00fcr ASCII. W\u00e4hlen Sie die effizienteste Variante, die Sie ben\u00f6tigen. <\/p>\n<p><\/p>\n<p>Es gibt auch die M\u00f6glichkeit, mehrere regul\u00e4re Ausdr\u00fccke in einem Durchgang zu durchsuchen. Sie m\u00fcssen nicht X like eine Substring oder X like eine andere Substring schreiben. Schreiben Sie einfach alles und es wird maximal effizient ausgef\u00fchrt.<\/p>\n<p><\/p>\n<p>Drittens \u2013 es gibt jetzt eine ungef\u00e4hre Suche f\u00fcr regul\u00e4re Ausdr\u00fccke und eine ungef\u00e4hre Suche f\u00fcr Substrings. Wenn jemand ein Wort mit einem Tippfehler geschrieben hat, wird es nach der maximalen \u00dcbereinstimmung gesucht.<\/p>\n<p><\/p>\n<h2 id=\"anchorhello-and-welcomeanchorkak-luchshe-organizovat-dostup-vnbspclickhouse-dlyanbspbolshogo-kolichestva-polzovateley\"><noindex><a rel=\"nofollow\" name=\"hello-and-welcome\"><\/a><\/noindex>Wie organisiert man den Zugriff auf ClickHouse f\u00fcr eine gro\u00dfe Anzahl von Benutzern am besten?<\/h2>\n<p><\/p>\n<blockquote><p>Erz\u00e4hlen Sie, wie der Zugang f\u00fcr eine gro\u00dfe Anzahl von Nutzern und Analysten am besten organisiert werden kann. Wie bildet man eine Warteschlange, priorisiert Anfragen max concurrent queries und mit welchen Werkzeugen?<\/p><\/blockquote>\n<p>Wenn der Cluster gro\u00df genug ist, kann es eine gute L\u00f6sung sein, zwei weitere Server einzurichten, die als Zugangspunkt f\u00fcr die Analysten dienen. Das hei\u00dft, Analysten nicht auf bestimmte Shards des Clusters zu lassen, sondern einfach zwei leere Server ohne Daten zu erstellen und auf ihnen bereits die Zugriffsrechte einzustellen. Dabei werden die Benutzereinstellungen bei verteilten Anfragen auf die remote Server \u00fcbertragen. Das hei\u00dft, Sie stellen alles auf diesen beiden Servern ein, und die Einstellungen wirken sich auf den gesamten Cluster aus.<\/p>\n<p><\/p>\n<p>Im Grunde genommen sind diese Server ohne Daten, aber der Speicherbedarf auf ihnen ist sehr wichtig f\u00fcr die Ausf\u00fchrung von Anfragen. Die Festplatte kann auch f\u00fcr tempor\u00e4re Daten verwendet werden, wenn externe Aggregation oder externe Sortierung aktiviert ist.<\/p>\n<p><\/p>\n<p>Es ist wichtig, die Einstellungen zu ber\u00fccksichtigen, die mit allen m\u00f6glichen Limits verbunden sind. Wenn ich jetzt als Analyst auf den Cluster \u201eYandex.Metrik\u201c gehe und eine Anfrage stelle, <strong>select count from hits<\/strong>, dann bekomme ich sofort eine Ausnahme, dass ich die Anfrage nicht ausf\u00fchren kann. Die maximale Anzahl von Zeilen, die ich scannen darf, betr\u00e4gt hundert Milliarden, w\u00e4hrend es im gesamten Cluster f\u00fcnfzig Billionen in einer Tabelle gibt. Das ist die erste Einschr\u00e4nkung. <\/p>\n<p><\/p>\n<p>Angenommen, ich hebe die Einschr\u00e4nkung der Zeilenanzahl auf und f\u00fchre die Anfrage erneut aus. Dann sehe ich die folgende Ausnahme \u2013 die Einstellung ist aktiviert. <strong>Index nach Datum erzwingen<\/strong>. Ich kann die Anfrage nicht ausf\u00fchren, wenn ich keinen Datumsbereich angegeben habe. Man sollte nicht davon ausgehen, dass Analysten ihn manuell angeben werden. Ein typischer Fall ist, wenn der Datumsbereich so geschrieben wird, dass das Ereignisdatum zwischen einer Woche liegt. Und dann wurde einfach die Klammer an der falschen Stelle gesetzt, und anstelle von und entstand oder \u2013 oder URL-Abgleich. Wenn es keine Einschr\u00e4nkung gibt, wird es die Spalte URL scannen und einfach eine Menge Ressourcen verschwenden.<\/p>\n<p><\/p>\n<p>Dar\u00fcber hinaus gibt es in ClickHouse zwei Einstellungsm\u00f6glichkeiten bez\u00fcglich Priorit\u00e4ten. Leider sind sie sehr primitiv. Eine nennt sich einfach. <strong>Priorit\u00e4t<\/strong>. Wenn priority \u2260 0 ist und Anfragen mit einer bestimmten Priorit\u00e4t ausgef\u00fchrt werden, aber gleichzeitig eine Anfrage mit einer Priorit\u00e4t ausgef\u00fchrt wird, die einen niedrigeren Wert hat, was einen h\u00f6heren Priorit\u00e4tswert bedeutet, dann wird die Anfrage mit dem h\u00f6heren Priorit\u00e4tswert, der einen niedrigeren Priorit\u00e4tswert darstellt, einfach pausiert und wird in dieser Zeit \u00fcberhaupt nicht ausgef\u00fchrt.<\/p>\n<p><\/p>\n<p>Das ist eine sehr grobe Einstellung, und sie eignet sich nicht f\u00fcr F\u00e4lle, in denen im Cluster st\u00e4ndig Last herrscht. Aber wenn Sie kurze, impulsive wichtige Anfragen haben und der Cluster im Wesentlichen idle ist, wird eine solche Einstellung passen.<\/p>\n<p><\/p>\n<p>Die n\u00e4chste Priorit\u00e4tseinstellung hei\u00dft <strong>OS-Thread-Priorit\u00e4t<\/strong>. Sie stellt einfach f\u00fcr alle Threads, die die Anfrage ausf\u00fchren, einen Wert in nice f\u00fcr den Linux-Scheduler ein. Sie funktioniert zwar nicht optimal, aber immerhin funktioniert sie. Wenn der niedrigste Wert f\u00fcr nice -19 gesetzt wird, dann verbrauchen die CPU niedrigere Priorit\u00e4tsanfragen etwa viermal weniger als hochpriorisierte. <\/p>\n<p><\/p>\n<p>Sie m\u00fcssen die maximale Ausf\u00fchrungszeit der Abfrage einstellen \u2013 sagen wir f\u00fcnf Minuten. Die Mindestgeschwindigkeit der Abfrageausf\u00fchrung ist dabei das Wichtigste. Diese Einstellung gibt es schon lange und sie ist notwendig, um nicht nur zu behaupten, dass ClickHouse nicht h\u00e4ngt, sondern um das zu erzwingen.<\/p>\n<p><\/p>\n<p>Stellen Sie sich vor, Sie konfigurieren: Wenn eine Abfrage weniger als eine Million Zeilen pro Sekunde verarbeitet \u2013 so kann man das nicht machen. Das besch\u00e4digt unseren guten Ruf und unsere gute Datenbank. Lassen Sie uns das einfach verbieten. Es gibt tats\u00e4chlich zwei Einstellungen. Eine hei\u00dft <strong>min execution speed<\/strong> \u2013 in Zeilen pro Sekunde, und die andere hei\u00dft timeout before checking min execution speed \u2013 standardm\u00e4\u00dfig f\u00fcnfzehn Sekunden. Das bedeutet, f\u00fcnfzehn Sekunden sind in Ordnung, aber dann, wenn es langsam ist, werfen Sie einfach eine Ausnahme \u2013 beenden Sie die Abfrage.<\/p>\n<p><\/p>\n<p>Sie m\u00fcssen auch die Quoten einstellen. ClickHouse hat eine eingebaute M\u00f6glichkeit zur Quotierung, die den Ressourcenkonsum z\u00e4hlt. Leider nicht die physikalischen Ressourcen wie CPU oder Datentr\u00e4ger, sondern logische \u2013 die Menge der verarbeiteten Abfragen, Zeilen und gelesenen Bytes. Sie k\u00f6nnen zum Beispiel h\u00f6chstens einhundert Abfragen innerhalb von f\u00fcnf Minuten und tausend Abfragen pro Stunde einstellen.<\/p>\n<p><\/p>\n<p>Warum ist das wichtig? Weil einige analytische Abfragen manuell direkt aus dem ClickHouse-Client ausgef\u00fchrt werden. Und alles wird gut sein. Aber wenn Sie in Ihrem Unternehmen avancierte Analysten haben, werden sie ein Skript schreiben, und in dem Skript k\u00f6nnte ein Fehler sein. Und dieser Fehler k\u00f6nnte dazu f\u00fchren, dass die Abfrage in einer Endlos-Schleife ausgef\u00fchrt wird. Dagegen m\u00fcssen wir uns sch\u00fctzen.<\/p>\n<p><\/p>\n<h2 id=\"anchorsmorgasbordanchormozhno-li-otdat-rezultaty-odnogo-zaprosa-desyati-klientam\"><noindex><a rel=\"nofollow\" name=\"smorgasbord\"><\/a><\/noindex>Kann man die Ergebnisse einer Anfrage an zehn Clients weitergeben?<\/h2>\n<p><\/p>\n<blockquote><p>Wir haben einige Benutzer, die gerne mit sehr gro\u00dfen Abfragen gleichzeitig kommen. Die Abfrage ist gro\u00df, sie wird im Prinzip schnell ausgef\u00fchrt, aber da es viele solcher Abfragen gleichzeitig gibt, wird es sehr schmerzhaft. Kann die gleiche Abfrage, die zehnmal hintereinander eingeht, einmal ausgef\u00fchrt werden, und das Ergebnis zehn Kunden geliefert werden?<\/p><\/blockquote>\n<p>Das Problem ist, dass wir keine Ergebnisse aus dem Cache oder dem Cache der Zwischendaten haben. Es gibt den Page-Cache des Betriebssystems, der es erm\u00f6glicht, Daten nicht erneut von der Festplatte zu lesen, aber leider m\u00fcssen die Daten dennoch entpackt, deserialisiert und erneut verarbeitet werden. <\/p>\n<p><\/p>\n<p>Wir w\u00fcrden gerne irgendwie vermeiden, entweder indem wir Zwischendaten cachen oder indem wir \u00e4hnliche Abfragen in eine Warteschlange stellen und das Ergebnis cachen. Momentan haben wir einen Pull-Request in der Entwicklung, der die Abfragen cached, aber nur f\u00fcr Unterabfragen in der Sektion IN und JOIN \u2013 das hei\u00dft, die L\u00f6sung ist unvollst\u00e4ndig.<\/p>\n<p><\/p>\n<p>Dennoch haben wir auch solche Situationen. Besonders das kanonische Beispiel sind Abfragen mit Pagination. Es gibt einen Bericht, darin gibt es mehrere Seiten, und es wird eine Abfrage limit 10 gemacht. Dann das Gleiche, aber limit 10,10. Dann die n\u00e4chste Seite. Und die Frage ist, warum wir das jedes Mal neu berechnen? Aber momentan gibt es keine L\u00f6sung, und das l\u00e4sst sich nicht vermeiden.<\/p>\n<p><\/p>\n<p>Es gibt eine alternative L\u00f6sung, die als Sidecar neben ClickHouse installiert wird \u2013 <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/Vertamedia\/chproxy\">ClickHouse Proxy<\/a><\/noindex>.<\/p>\n<p><\/p>\n<p><strong>Kirill Shvakov:<\/strong> ClickHouse Proxy hat einen eingebauten Ratenbegrenzer und einen eingebauten Ergebnis-Cache. Es gibt viele Einstellungen, weil eine \u00e4hnliche Aufgabe gel\u00f6st wurde. Proxy erm\u00f6glicht es, Abfragen zu limitieren, sie in eine Warteschlange zu stellen und einzustellen, wie lange der Cache der Abfragen lebt. Wenn die Abfragen wirklich identisch waren, gibt Proxy sie mehrfach aus, w\u00e4hrend er nur einmal mit ClickHouse kommuniziert.<\/p>\n<p><\/p>\n<p>In Nginx gibt es auch einen Cache in der kostenlosen Version, und das wird auch funktionieren. Nginx hat sogar Einstellungen, dass, wenn Abfragen gleichzeitig eingehen, er andere verlangsamt, bis eine abgeschlossen ist. Aber diese Einstellung ist im ClickHouse Proxy viel besser umgesetzt. Es wurde speziell f\u00fcr ClickHouse und f\u00fcr diese Abfragen entwickelt, daher passt es besser. Und es ist einfach zu installieren. <\/p>\n<p><\/p>\n<h2 id=\"anchorasynchronousanchorkak-byt-snbspasinhronnymi-operaciyami-i-materializovannymi-predstavleniyami\"><noindex><a rel=\"nofollow\" name=\"asynchronous\"><\/a><\/noindex>Wie geht man mit asynchronen Operationen und materialisierten Views um?<\/h2>\n<p><\/p>\n<blockquote><p>Es gibt ein Problem, dass Operationen mit dem Replacing-Engine asynchron sind \u2013 zuerst werden die Daten geschrieben, dann erfolgt die Verdichtung. Wenn unter einer Tabelle eine materialisierte Tabelle mit bestimmten Aggregaten lebt, werden die Duplikate dort geschrieben. Und wenn es keine komplizierte Logik gibt, werden die Daten dupliziert. Was kann man dagegen tun?<\/p>\n<p>Es gibt eine offensichtliche L\u00f6sung \u2013 einen Trigger f\u00fcr eine bestimmte Klasse von Materialized Views bei der asynchronen Verdichtungsoperation zu implementieren. Gibt es irgendwelche \"silbernen Kugeln\", Pl\u00e4ne zur Implementierung solcher Funktionen?<\/p><\/blockquote>\n<p>Es ist wichtig, die Funktionsweise der Deduplication zu verstehen. Das, was ich jetzt sage, geh\u00f6rt nicht direkt zur Frage, aber es ist f\u00fcr den Fall gut, daran zu denken.<\/p>\n<p><\/p>\n<p>Beim Einf\u00fcgen in eine replizierte Tabelle gibt es eine vollst\u00e4ndige Deduplication der eingef\u00fcgten Bl\u00f6cke. Wenn Sie denselben Block, der dieselbe Anzahl an gleichen Zeilen in derselben Reihenfolge enth\u00e4lt, erneut eingef\u00fcgt haben, werden die Daten dedupliziert. Sie erhalten \u201eOk\u201c als Antwort auf insert, aber tats\u00e4chlich wird nur ein Datenblock geschrieben, und er wird nicht dupliziert.<\/p>\n<p><\/p>\n<p>Das ist notwendig f\u00fcr die Gewissheit. Wenn Sie w\u00e4hrend des Einf\u00fcgens \u201eOk\u201c erhalten haben, bedeutet das, dass Ihre Daten eingef\u00fcgt wurden. Wenn Sie einen Fehler von ClickHouse erhalten haben, wurden sie nicht eingef\u00fcgt und das Einf\u00fcgen muss wiederholt werden. Sollte die Verbindung w\u00e4hrend des Einf\u00fcgens unterbrochen werden, wissen Sie nicht, ob die Daten eingef\u00fcgt wurden oder nicht. Die einzige M\u00f6glichkeit ist, das Einf\u00fcgen erneut zu wiederholen. Wenn die Daten tats\u00e4chlich eingef\u00fcgt wurden und Sie sie erneut eingef\u00fcgt haben, gibt es eine Blockdeduplication. Diese ist notwendig, um Duplikate zu vermeiden. <\/p>\n<p><\/p>\n<p>Es ist auch wichtig zu verstehen, wie es f\u00fcr materialisierte Sichten funktioniert. Wenn die Daten beim Einf\u00fcgen in die Haupttabelle dedupliziert wurden, werden sie auch nicht in die materialisierte Sicht \u00fcbertragen.<\/p>\n<p><\/p>\n<p>Jetzt zu Ihrer Frage. Sie haben eine kompliziertere Situation, da Sie Duplikate einzelner Zeilen aufzeichnen. Das hei\u00dft, nicht der gesamte Block wurde dupliziert, sondern spezifische Zeilen, und diese werden im Hintergrund zusammengef\u00fchrt. Tats\u00e4chlich werden die Daten in der Haupttabelle zusammengef\u00fchrt, w\u00e4hrend sie in die materialisierte Sicht nicht zusammengef\u00fchrt werden, und bei Merges passiert mit den materialisierten Sichten nichts. Denn eine materialisierte Sicht ist nichts anderes als ein Trigger f\u00fcr insert. Bei anderen Vorg\u00e4ngen passiert nichts Zus\u00e4tzliches mit ihr.<\/p>\n<p><\/p>\n<p>Ich kann hier leider nicht viel Licht ins Dunkel bringen. Es muss nur eine spezifische L\u00f6sung f\u00fcr diesen Fall gesucht werden. Zum Beispiel, ob in der materialisierten Sicht auch ein Replacing gemacht werden kann und die Methode zur Deduplication m\u00f6glicherweise ebenso funktioniert. Aber leider funktioniert das nicht immer. Wenn es aggregiert ist, wird es nicht funktionieren. <\/p>\n<p><\/p>\n<p><strong>Kirill Shvakov:<\/strong> Auch wir hatten in der Vergangenheit unsere Probleme. Es gab ein Problem mit Anzeigen, und einige Daten, die wir in Echtzeit anzeigen k\u00f6nnen \u2014 das sind einfach Anzeigen. Diese werden selten dupliziert, aber wenn das passiert, werden wir sie trotzdem zusammenf\u00fchren. Es gab auch Dinge, die nicht dupliziert werden k\u00f6nnen \u2014 Klicks und solche Geschichten. Aber man wollte sie auch praktisch sofort anzeigen.<\/p>\n<p><\/p>\n<p>Wie wurden die materialisierten Sichten erstellt? Es gab Sichten, in die direkt geschrieben wird \u2014 die Rohdaten werden gespeichert und in Views geschrieben. Dort sind die Daten zu einem bestimmten Zeitpunkt nicht korrekt, sie werden dupliziert usw. Und es gibt einen zweiten Teil der Tabelle, der genauso aussieht wie die materialisierten Sichten und deren Struktur identisch ist. Von Zeit zu Zeit z\u00e4hlen wir die Daten ohne Duplikate nach und schreiben sie in diese Tabellen. <\/p>\n<p><\/p>\n<p>Wir sind \u00fcber die API gegangen \u2014 in ClickHouse wird das manuell nicht funktionieren. Und die API sieht: Wenn ich ein Datum des letzten Hinzuf\u00fcgens in die Tabelle habe, in der garantiert bereits korrekte, berechnete Daten vorhanden sind, macht sie eine Anfrage an die eine Tabelle und an die andere. Aus der einen wird bis zu einem bestimmten Zeitpunkt ausgew\u00e4hlt, und aus der anderen wird das hinzugef\u00fcgt, was noch nicht berechnet wurde. Und das funktioniert, aber nicht mittels eines einzelnen ClickHouse.<\/p>\n<p><\/p>\n<p>Wenn Sie eine API haben \u2014 f\u00fcr Analysten, f\u00fcr Benutzer \u2014 dann ist das im Prinzip eine M\u00f6glichkeit. Sie z\u00e4hlen immer nach, Sie berechnen immer neu. Das kann einmal am Tag oder zu einem anderen Zeitpunkt erfolgen. Sie selbst w\u00e4hlen den Zeitraum, der Ihnen nicht wichtig ist und nicht kritisch.<\/p>\n<p><\/p>\n<h2 id=\"anchordashboardanchorv-clickhouse-mnogo-logov-kak-ya-mogu-videt-vsyo-chto-proishodit-s-serverom-vnbspmomente\"><noindex><a rel=\"nofollow\" name=\"dashboard\"><\/a><\/noindex>In ClickHouse gibt es viele Protokolle. Wie kann ich alles sehen, was gerade mit dem Server passiert?<\/h2>\n<p><\/p>\n<blockquote><p>In ClickHouse gibt es eine sehr gro\u00dfe Anzahl verschiedener Protokolle, und diese Anzahl steigt. In den neuen Versionen sind einige davon sogar standardm\u00e4\u00dfig aktiviert, in den alten Versionen m\u00fcssen sie beim Upgrade aktiviert werden. Trotzdem werden es immer mehr. Ich h\u00e4tte gerne, dass ich am Ende sehe, was gerade mit meinem Server passiert, vielleicht auf einem zusammenfassenden Dashboard. <\/p>\n<p>Haben Sie in Ihrem Team ClickHouse oder in den Teams Ihrer Freunde, die eine Art Funktionalit\u00e4t f\u00fcr fertige Dashboards unterst\u00fctzen, die diese Protokolle in Form eines bereits fertigen Produkts anzeigen? Am Ende ist es zwar gro\u00dfartig, die Protokolle in ClickHouse einfach anzusehen. Aber es w\u00e4re sehr toll, wenn es bereits in Form eines Dashboards vorbereitet w\u00e4re. Davon w\u00fcrde ich begeistert sein. <\/p><\/blockquote>\n<p>Dashboards exist, but they are not standardized. In our company, about 60 teams use ClickHouse, and strangely enough, many of them have their own dashboards, which are slightly different. Some teams use an internal installation of 'Yandex.Cloud.' There are some ready-made reports there, although not all necessary ones. Others have their own. <\/p>\n<p><\/p>\n<p>My colleagues from 'Metrics' have their own dashboard in Grafana, and I have my own for their cluster. I look at things like cache hits for cache check. What's even more complicated is that we use different tools. I created my dashboard using a very old tool called Graphite-web. It's not visually appealing at all. And I still use it, although Grafana would probably be more convenient and aesthetically pleasing. <\/p>\n<p><\/p>\n<p>The basic components of the dashboards are the same. They include system metrics for the cluster: CPU, memory, disk, network. Others include the number of simultaneous requests, the number of concurrent merges, requests per second, maximum number of chunks for MergeTree table partitions, replication lag, size of the replication queue, number of rows inserted per second, number of blocks inserted per second. These metrics are derived from measurements, not from logs.<\/p>\n<p><\/p>\n<p><strong>Wladimir Kolobajew:<\/strong> Alexey, I would like to correct you a bit. There is Grafana. Grafana has a datasource, which is ClickHouse. This means I can query ClickHouse directly from Grafana. ClickHouse has a log table, which is the same for everyone. I want to access this log table in Grafana and see the queries that my server sends. It would be great to have such a dashboard.<\/p>\n<p><\/p>\n<p>I built it myself. But I have a question\u2014if everything is standardized, and Grafana is used by everyone, why is there no such official dashboard at 'Yandex'?<\/p>\n<p><\/p>\n<p><strong>Kirill Shvakov:<\/strong> In fact, the datasource for ClickHouse is currently supported by Altinity. And I just want to provide direction on where to dig and who to push. We can ask them because Yandex is primarily responsible for ClickHouse, not its surrounding ecosystem. Altinity is the main company currently promoting ClickHouse. They won't abandon it and will provide support. Because generally, to upload a dashboard to the Grafana site, you only need to register and upload it\u2014there aren\u2019t any significant problems. <\/p>\n<p><\/p>\n<p><strong>Alexej Milowidow:<\/strong> In the past year, many new features have been added in ClickHouse for profiling queries. There are metrics for each query regarding resource usage. Recently, an even lower-level query profiler was added to see exactly where each query spends every millisecond. However, to use this functionality, I have to open the console client and type the query that I constantly forget. I saved it somewhere but keep forgetting where. <\/p>\n<p><\/p>\n<p>I would like a tool that simply displays\u2014here are your heavy queries, grouped by query types. Click on one, and it would tell me it\u2019s heavy for this reason. Currently, there is no such solution. And it\u2019s quite strange that when people ask me: 'Are there any ready-made Grafana dashboards?' I respond: 'Check the Grafana site, there is the community \u201cDashboards,\u201d and there's a dashboard by Dimka, and another by Kostyan. What these are, I don't know; I haven\u2019t used them myself.'<\/p>\n<p><\/p>\n<h2 id=\"anchorzenanchorkak-vozdeystvovat-na-merdzhi-chtoby-server-ne-padal-vnbspoom\"><noindex><a rel=\"nofollow\" name=\"zen\"><\/a><\/noindex>How to impact merges to prevent the server from falling into OOM?<\/h2>\n<p><\/p>\n<blockquote><p>I have a table with only one partition, which is ReplacingMergeTree. I've been writing data into it for four years. I needed to perform an alter operation to delete some data.<\/p>\n<p>I did that, and during the processing of this request, all memory was consumed on all cluster servers, and all cluster servers collectively went into OOM. They then restarted collectively, began executing the merge for the same operation, for that block of data, and fell into OOM again. Then they restarted again and fell into OOM once more. This cycle didn\u2019t stop.<\/p>\n<p>Later it turned out that this was actually a bug, which the team has fixed. That is great, thank you very much. But the aftertaste remains. Now, when I think about performing a merge in the table, I question why I can\u2019t somehow influence these merges? For instance, limit them by the amount of memory required, or by their quantity that would specifically handle this table.<\/p>\n<p>Ich habe eine Tabelle namens \u201eMetriken\u201c, bitte bearbeite sie in zwei Streams. Mach keine zehn oder f\u00fcnf Merges parallel, mach es in zwei. Ich denke, dass ich mit zwei genug Speicher habe, und f\u00fcr zehn k\u00f6nnte es vielleicht nicht ausreichen. Warum bleibt die Angst? Weil die Tabelle w\u00e4chst, und irgendwann werde ich einer Situation gegen\u00fcberstehen, in der es nicht wegen eines Bugs ist, sondern weil die Daten so enorm zunehmen, dass mir einfach der Speicher auf dem Server nicht ausreichen wird. Und dann wird der Server bei einem Merge aufgrund von OOM abst\u00fcrzen. Die Mutation kann ich zur\u00fccksetzen, aber die Merges nicht.<\/p><\/blockquote>\n<p>Wei\u00dft du, bei Merges wird der Server nicht wegen OOM abst\u00fcrzen, weil beim Merge nur der Speicher f\u00fcr einen kleinen Datenbereich ben\u00f6tigt wird. Es wird also alles gut sein, unabh\u00e4ngig vom Datenvolumen.<\/p>\n<p><\/p>\n<p><strong>Wladimir Kolobajew:<\/strong> In Ordnung. Hier ist die Sache, dass ich, nachdem ich den Bug fixiert hatte, mir die neue Version runtergeladen habe und bei einer anderen, kleineren Tabelle, bei der es viele Partitionen gibt, eine \u00e4hnliche Operation durchgef\u00fchrt habe. W\u00e4hrend des Merges wurden auf dem Server etwa 100 GB RAM verbraucht. Ich hatte 150 belegt, 100 wurden verbraucht, und ich hatte noch 50 GB frei, deshalb bin ich nicht in OOM gefallen.<\/p>\n<p><\/p>\n<p>Was sch\u00fctzt mich momentan davor, in OOM zu fallen, wenn er tats\u00e4chlich 100 GB RAM ben\u00f6tigt? Was mache ich in einer Situation, wenn der RAM bei Merges pl\u00f6tzlich ausgeht?<\/p>\n<p><\/p>\n<p><strong>Alexej Milowidow:<\/strong> Es gibt ein Problem, dass der RAM-Verbrauch bei Merges nicht beschr\u00e4nkt ist. Das zweite Problem ist, dass, wenn ein Merge geplant wurde, er ausgef\u00fchrt werden muss, weil er im Replikations-Log aufgezeichnet ist. Das Replikations-Log sind die Aktionen, die notwendig sind, um die Replik in einen konsistenten Zustand zu bringen. Wenn die manuellen Manipulationen nicht vorgenommen werden, die dieses Replikations-Log zur\u00fccksetzen, muss der Merge auf die eine oder andere Weise durchgef\u00fchrt werden.<\/p>\n<p><\/p>\n<p>Nat\u00fcrlich w\u00e4re es nicht schlecht, ein Limit f\u00fcr den RAM einzuf\u00fchren, das \u201azur Sicherheit\u2018 genau vor OOM sch\u00fctzt. Es w\u00fcrde nicht helfen, den Merge erfolgreich durchzuf\u00fchren, er w\u00fcrde neu gestartet werden, bis zu einem gewissen Punkt kommen, eine Ausnahme ausl\u00f6sen und dann wieder neu beginnen \u2013 nichts Gutes w\u00fcrde dabei herauskommen. Aber im Prinzip w\u00e4re es n\u00fctzlich, ein solches Limit einzuf\u00fchren.<\/p>\n<p><\/p>\n<h2 id=\"anchorgoanchorkak-budet-proishodit-razrabotka-golang-drayvera-dlya-clickhouse\"><noindex><a rel=\"nofollow\" name=\"go\"><\/a><\/noindex>Wie wird die Entwicklung des Golang-Treibers f\u00fcr ClickHouse aussehen?<\/h2>\n<p><\/p>\n<blockquote><p>Der Golang-Treiber, den Kirill Shvakov geschrieben hat, wird offiziell von dem ClickHouse-Team unterst\u00fctzt. <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/ClickHouse\/clickhouse-go\">Im ClickHouse-Repository<\/a><\/noindex>, ist er jetzt gro\u00df und echt.<\/p>\n<p>Eine kleine Anmerkung. Es gibt ein gro\u00dfartiges und beliebtes Speichersystem f\u00fcr unendliche Ordnung \u2013 Vertica. Auch sie haben einen offiziellen Python-Treiber, der von den Entwicklern von Vertica unterst\u00fctzt wird. Es kam jedoch schon mehrmals vor, dass die Versionen des Speichersystems und des Treibers erheblich auseinanderdrifteten, sodass der Treiber irgendwann nicht mehr funktionierte. Ein weiterer Punkt ist, dass die Unterst\u00fctzung dieses offiziellen Treibers, so scheint es, \u00fcber das System \"Nippel\" l\u00e4uft \u2013 du schreibst ihnen ein Issue, und es bleibt ewig h\u00e4ngen.<\/p>\n<p>Ich habe zwei Fragen. Der Golang-Treiber von Kirill ist mittlerweile die nahezu standardm\u00e4\u00dfige Methode, um aus Golang mit ClickHouse zu kommunizieren. Es k\u00f6nnte sein, dass jemand immer noch \u00fcber die HTTP-Schnittstelle kommuniziert, weil ihm das so besser gef\u00e4llt. Wie wird die Entwicklung dieses Treibers ablaufen? Wird sie sich mit den m\u00f6glichen Breaking Changes im Speicher selbst synchronisieren? Und wie erfolgt die Bearbeitung von Issues? <\/p><\/blockquote>\n<p><strong>Kirill Shvakov:<\/strong> Erstens, wie alles b\u00fcrokratisch organisiert ist. Dieser Punkt wurde nicht diskutiert, also kann ich darauf nicht antworten.<\/p>\n<p><\/p>\n<p>Um die Frage zum Thema Issue zu beantworten, braucht man eine kleine Geschichte des Treibers. Ich habe in einer Firma gearbeitet, die viele Daten hatte. Es war ein gro\u00dfes Werbesystem mit einer riesigen Anzahl von Events, die irgendwo gespeichert werden mussten. Und irgendwann tauchte ClickHouse auf. Wir haben die Daten dort hineingepumpt, und anfangs war alles gut, aber dann ist ClickHouse abgest\u00fcrzt. Zu diesem Zeitpunkt haben wir entschieden, dass wir es nicht brauchen. <\/p>\n<p><\/p>\n<p>Ein Jahr sp\u00e4ter sind wir zum Gedanken zur\u00fcckgekehrt, ClickHouse zu nutzen, und wir mussten irgendwie Daten dorthin schreiben. Die Idee war, dass die Hardware sehr schwach war und es wenig Ressourcen gab. Aber wir hatten immer so gearbeitet, also schauten wir uns den nativen Protokollansatz an.<\/p>\n<p><\/p>\n<p>Da wir in Go arbeiteten, war klar, dass wir einen Treiber in Go ben\u00f6tigten. Ich habe ihn praktisch Vollzeit entwickelt \u2013 das war meine Aufgabenstellung. Bis zu einem gewissen Punkt hatten wir ihn entwickelt, und grunds\u00e4tzlich hat niemand gedacht, dass jemand au\u00dfer uns ihn benutzen w\u00fcrde. Dann kam CloudFlare mit genau demselben Problem, und eine Zeit lang arbeiteten wir sehr eng zusammen, weil sie dieselben Aufgaben hatten. Wir machten das sowohl in ClickHouse selbst als auch im Treiber. <\/p>\n<p><\/p>\n<p>Irgendwann h\u00f6rte ich einfach auf, mich darum zu k\u00fcmmern, weil sich meine Aktivit\u00e4t bez\u00fcglich ClickHouse und meine Arbeit ein wenig ge\u00e4ndert hatte. Deshalb bleiben die Issues offen. Gelegentlich committen Leute in das Repository, die selbst etwas brauchen. Dann schaue ich mir Pull Requests an und korrigiere manchmal sogar etwas selbst, aber das passiert sehr selten.<\/p>\n<p><\/p>\n<p>Ich m\u00f6chte zum Treiber zur\u00fcckkehren. Vor ein paar Jahren, als das Ganze anfing, war ClickHouse auch anders und hatte andere M\u00f6glichkeiten. Jetzt gibt es ein Verst\u00e4ndnis daf\u00fcr, wie man den Treiber umgestalten kann, damit es gut wird. Wenn das passiert, wird Version 2 in jedem Fall inkompatibel sein aufgrund der angesammelten Hacks. <\/p>\n<p><\/p>\n<p>Wie ich das organisieren soll, wei\u00df ich nicht. Ich selbst habe nicht viel Zeit. Wenn irgendwelche Leute den Treiber weiterentwickeln, kann ich ihnen helfen und erkl\u00e4ren, was zu tun ist. Aber die aktive Teilnahme von \u201aYandex\u2018 an der Weiterentwicklung des Projekts wurde bisher nicht diskutiert. <\/p>\n<p><\/p>\n<p><strong>Alexej Milowidow:<\/strong> Tats\u00e4chlich gibt es zurzeit keine B\u00fcrokratie bez\u00fcglich dieser Treiber. Das Einzige ist, dass sie in eine offizielle Organisation \u00fcberf\u00fchrt wurden, was bedeutet, dass dieser Treiber als offizielle Standardl\u00f6sung f\u00fcr Go anerkannt ist. Es gibt einige andere Treiber, aber diese werden separat bereitgestellt. <\/p>\n<p><\/p>\n<p>Wir haben intern keine Entwicklung f\u00fcr diese Treiber. Die Frage ist, ob wir eine separate Person einstellen k\u00f6nnen, nicht speziell f\u00fcr diesen Treiber, sondern zur Entwicklung aller Community-Treiber, oder ob wir jemanden von au\u00dfen finden k\u00f6nnen. <\/p>\n<p><\/p>\n<h2 id=\"anchorlazy-loadanchorvneshniy-slovar-ne-podnimaetsya-posle-perezagruzki-snbspvklyuchennoy-nastroykoy-lazy_load-chto-delat\"><noindex><a rel=\"nofollow\" name=\"lazy-load\"><\/a><\/noindex>Das externe W\u00f6rterbuch wird nach einem Neustart mit aktivierter Einstellung lazy_load nicht geladen. Was sollen wir tun?<\/h2>\n<p><\/p>\n<blockquote><p>Wir haben die Einstellung lazy_load aktiviert, und nach dem Neustart des Servers wird das W\u00f6rterbuch nicht automatisch geladen. Es wird nur hochgefahren, wenn der Benutzer auf dieses W\u00f6rterbuch zugreift. Und beim ersten Zugriff wird ein Fehler angezeigt. Gibt es eine M\u00f6glichkeit, das W\u00f6rterbuch automatisch mit ClickHouse zu laden, oder m\u00fcssen wir stets deren Verf\u00fcgbarkeit kontrollieren, damit die Benutzer keine Fehler erhalten?<\/p>\n<p>Vielleicht haben wir eine alte Version von ClickHouse, deshalb wurde das W\u00f6rterbuch nicht automatisch geladen. K\u00f6nnte das sein?<\/p><\/blockquote>\n<p>Erstens kann das W\u00f6rterbuch zwangsweise mit einer Anfrage geladen werden <strong>System W\u00f6rterb\u00fccher neu laden<\/strong>. Zweitens, bez\u00fcglich des Fehlers: Wenn das W\u00f6rterbuch bereits geladen ist, werden die Anfragen mit den Daten arbeiten, die geladen wurden. Wenn das W\u00f6rterbuch noch nicht geladen wurde, wird es w\u00e4hrend der Anfrage geladen.<\/p>\n<p><\/p>\n<p>F\u00fcr gro\u00dfe W\u00f6rterb\u00fccher ist das nicht sehr praktisch. Zum Beispiel muss man eine Million Zeilen aus MySQL abrufen. Jemand f\u00fchrt einen einfachen Select durch, aber dieser Select wird auf die besagte Million Zeilen warten. Hier gibt es zwei L\u00f6sungen. Die erste ist, lazy_load zu deaktivieren. Die zweite ist, bevor der Server in Betrieb geht und bevor man ihm Last aufl\u00e4dt, zu machen <strong>System W\u00f6rterbuch neu laden<\/strong> oder einfach eine Anfrage auszuf\u00fchren, die das W\u00f6rterbuch verwendet. Dann wird das W\u00f6rterbuch geladen. Man muss selbst die Verf\u00fcgbarkeit der W\u00f6rterb\u00fccher mit der aktivierten Einstellung lazy_load kontrollieren, weil ClickHouse sie nicht automatisch zieht.<\/p>\n<p><\/p>\n<p>Auf die letzte Frage lautet die Antwort: entweder ist die Version alt oder es muss debuggt werden. <\/p>\n<p><\/p>\n<h2 id=\"anchorreload-dictionariesanchorkak-byt-snbsptem-chto-system-reload-dictionaries-ne-podgruzhaet-ni-odin-iznbspmnozhestva-slovarey-esli-hotya-by-odin-iznbspnih-padaet-snbsposhibkoy\"><noindex><a rel=\"nofollow\" name=\"reload-dictionaries\"><\/a><\/noindex>Wie geht man damit um, dass system reload dictionaries kein einziges der vielen Dictionaries l\u00e4dt, wenn auch nur eines von ihnen mit einem Fehler abst\u00fcrzt?<\/h2>\n<p><\/p>\n<blockquote><p>Es gibt noch eine Frage zu system reload dictionaries. Wir haben zwei W\u00f6rterb\u00fccher \u2013 eines wird nicht geladen, das andere wird geladen. In diesem Fall l\u00e4dt system reload dictionaries kein W\u00f6rterbuch, und man muss speziell das einzelne nach seinem Namen mit system reload dictionary laden. H\u00e4ngt das auch mit der Version von ClickHouse zusammen?<\/p><\/blockquote>\n<p>Ich m\u00f6chte Sie erfreuen. Dieses Verhalten hat sich ge\u00e4ndert. Wenn Sie ClickHouse aktualisieren, wird es sich ebenfalls \u00e4ndern. Wenn Sie mit dem aktuellen Verhalten unzufrieden sind, <strong>System W\u00f6rterb\u00fccher neu laden<\/strong>, aktualisieren Sie und wir hoffen, dass es sich zum Besseren \u00e4ndern wird.<\/p>\n<p><\/p>\n<h2 id=\"anchorconnectionanchorest-li-sposob-konfigurirovat-rekvizity-vnbspkonfige-clickhouse-no-ne-svetit-ih-prinbsposhibkah\"><noindex><a rel=\"nofollow\" name=\"connection\"><\/a><\/noindex>Gibt es eine M\u00f6glichkeit, die Anmeldeinformationen in der ClickHouse-Konfiguration zu konfigurieren, ohne sie bei Fehlern zu offenbaren?<\/h2>\n<p><\/p>\n<blockquote><p>Die n\u00e4chste Frage betrifft die Fehler, die mit dem W\u00f6rterbuch verbunden sind, insbesondere die Anmeldedaten. Wir haben die Anmeldedaten in der ClickHouse-Konfiguration f\u00fcr das W\u00f6rterbuch festgelegt, und bei einem Fehler erhalten wir diese Anmeldedaten und das Passwort als Antwort. <\/p>\n<p>Wir haben diesen Fehler beseitigt, indem wir die Anmeldedaten in die Konfiguration des ODBC-Treibers verschoben haben. Gibt es eine M\u00f6glichkeit, die Anmeldedaten in der ClickHouse-Konfiguration zu hinterlegen, ohne dass diese bei Fehlern sichtbar werden?<\/p><\/blockquote>\n<p>Hier ist die L\u00f6sung tats\u00e4chlich \u2013 diese Credentials in der odbc.ini anzugeben und in ClickHouse nur den ODBC Data Source Name zu hinterlegen. F\u00fcr die anderen Quellen wird das nicht der Fall sein \u2013 f\u00fcr das W\u00f6rterbuch mit MySQL oder andere d\u00fcrfen Sie das Passwort nicht bei einer Fehlermeldung sehen. Ich werde auch bei ODBC nachsehen \u2013 wenn es so etwas gibt, muss es einfach entfernt werden.<\/p>\n<p><\/p>\n<h2 id=\"anchorzoom-backgroundsanchorbonus-fony-dlya-zuma-snbspposidelok\"><noindex><a rel=\"nofollow\" name=\"zoom-backgrounds\"><\/a><\/noindex>Bonus: Hintergr\u00fcnde f\u00fcr Zoom aus den Sitzungen<\/h2>\n<p><\/p>\n<p>Beim Klicken auf das Bild \u00f6ffnet sich f\u00fcr die hartn\u00e4ckigsten Leser ein Bonus-Hintergrund von den Zusammenk\u00fcnften. Lassen Sie uns gemeinsam mit den Maskottchen der Avito-Technologien ein Feuer l\u00f6schen, mit Kollegen aus dem Raum des Systemadministrators oder einem alten Computerclub beraten und ein Daily unter der Br\u00fccke mit Graffiti-Hintergrund abhalten.<\/p>\n<p><\/p>\n<p><noindex><a rel=\"nofollow\" href=\"http:\/\/amp.gs\/KvUr\"><img decoding=\"async\" alt=\"ClickHouse f\u00fcr fortgeschrittene Benutzer in Fragen und Antworten\" src=\"\/wp-content\/uploads\/2020\/05\/38b2ea076283285d934913c395863eb1.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/a><\/noindex><\/p>\n<p>Quelle: <a content=\"nofollow\" rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/avito\/blog\/500678\/\">habr.com<\/a> <\/p>","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"excerpt":{"rendered":"<p>\u0412 \u0430\u043f\u0440\u0435\u043b\u0435 \u0438\u043d\u0436\u0435\u043d\u0435\u0440\u044b \u0410\u0432\u0438\u0442\u043e \u0441\u043e\u0431\u0438\u0440\u0430\u043b\u0438\u0441\u044c \u043d\u0430&nbsp;\u043e\u043d\u043b\u0430\u0439\u043d-\u043f\u043e\u0441\u0438\u0434\u0435\u043b\u043a\u0438 \u0441 \u0433\u043b\u0430\u0432\u043d\u044b\u043c \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u043e\u043c ClickHouse \u0410\u043b\u0435\u043a\u0441\u0435\u0435\u043c \u041c\u0438\u043b\u043e\u0432\u0438\u0434\u043e\u0432\u044b\u043c \u0438 \u041a\u0438\u0440\u0438\u043b\u043b\u043e\u043c \u0428\u0432\u0430\u043a\u043e\u0432\u044b\u043c, Golang-\u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u043e\u043c \u0438\u0437&nbsp;\u043a\u043e\u043c\u043f\u0430\u043d\u0438\u0438 Integros. \u041e\u0431\u0441\u0443\u0436\u0434\u0430\u043b\u0438, \u043a\u0430\u043a \u043c\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c \u0441\u0438\u0441\u0442\u0435\u043c\u0443 \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0431\u0430\u0437\u0430\u043c\u0438 \u0434\u0430\u043d\u043d\u044b\u0445 \u0438 \u043a\u0430\u043a\u0438\u0435 \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u0438 \u0443&nbsp;\u043d\u0430\u0441 \u0432\u043e\u0437\u043d\u0438\u043a\u0430\u044e\u0442. \u041f\u043e&nbsp;\u043c\u043e\u0442\u0438\u0432\u0430\u043c \u0432\u0441\u0442\u0440\u0435\u0447\u0438 \u043c\u044b \u0441\u043e\u0431\u0440\u0430\u043b\u0438 \u0441\u0442\u0430\u0442\u044c\u044e \u0441&nbsp;\u043e\u0442\u0432\u0435\u0442\u0430\u043c\u0438 \u044d\u043a\u0441\u043f\u0435\u0440\u0442\u043e\u0432 \u043d\u0430&nbsp;\u043d\u0430\u0448\u0438 \u0438 \u0437\u0440\u0438\u0442\u0435\u043b\u044c\u0441\u043a\u0438\u0435 \u0432\u043e\u043f\u0440\u043e\u0441\u044b \u043f\u0440\u043e&nbsp;\u0431\u044d\u043a\u0430\u043f\u044b, \u0440\u0435\u0448\u0430\u0440\u0434\u0438\u043d\u0433 \u0434\u0430\u043d\u043d\u044b\u0445, \u0432\u043d\u0435\u0448\u043d\u0438\u0435 \u0441\u043b\u043e\u0432\u0430\u0440\u0438, Golang-\u0434\u0440\u0430\u0439\u0432\u0435\u0440 \u0438 \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0435 \u0432\u0435\u0440\u0441\u0438\u0439 ClickHouse. \u041e\u043d\u0430 \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c [&hellip;]<\/p>\n","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"author":1,"featured_media":80776,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[688],"tags":[],"class_list":["post-80775","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-administrirovanie"],"aioseo_notices":[],"aioseo_head":"\n\t\t<!-- All in One SEO 5.0.0.1 - aioseo.com -->\n\t<meta name=\"description\" content=\"\u0412 \u0430\u043f\u0440\u0435\u043b\u0435 \u0438\u043d\u0436\u0435\u043d\u0435\u0440\u044b \u0410\u0432\u0438\u0442\u043e \u0441\u043e\u0431\u0438\u0440\u0430\u043b\u0438\u0441\u044c \u043d\u0430 \u043e\u043d\u043b\u0430\u0439\u043d-\u043f\u043e\u0441\u0438\u0434\u0435\u043b\u043a\u0438 \u0441 \u0433\u043b\u0430\u0432\u043d\u044b\u043c \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u043e\u043c ClickHouse \u0410\u043b\u0435\u043a\u0441\u0435\u0435\u043c \u041c\u0438\u043b\u043e\u0432\u0438\u0434\u043e\u0432\u044b\u043c \u0438 \u041a\u0438\u0440\u0438\u043b\u043b\u043e\u043c \u0428\u0432\u0430\u043a\u043e\u0432\u044b\u043c, Golang-\u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u043e\u043c \u0438\u0437 \u043a\u043e\u043c\u043f\u0430\u043d\u0438\u0438 Integros.\" \/>\n\t<meta name=\"robots\" content=\"max-image-preview:large\" \/>\n\t<meta name=\"author\" content=\"Yuri Gagarin\"\/>\n\t<link rel=\"canonical\" href=\"https:\/\/prohoster.info\/de\/blog\/administrirovanie\/clickhouse-dlya-prodvinutyh-polzovatelej-v-voprosah-i-otvetah\" \/>\n\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.0.1\" \/>\n\t\t<meta property=\"og:locale\" content=\"de_DE\" \/>\n\t\t<meta property=\"og:site_name\" content=\"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b\" \/>\n\t\t<meta property=\"og:type\" content=\"article\" \/>\n\t\t<meta property=\"og:title\" content=\"\ud83e\udd47ClickHouse \u0434\u043b\u044f \u043f\u0440\u043e\u0434\u0432\u0438\u043d\u0443\u0442\u044b\u0445 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u0439 \u0432 \u0432\u043e\u043f\u0440\u043e\u0441\u0430\u0445 \u0438 \u043e\u0442\u0432\u0435\u0442\u0430\u0445 | ProHoster\" \/>\n\t\t<meta property=\"og:description\" content=\"\u0412 \u0430\u043f\u0440\u0435\u043b\u0435 \u0438\u043d\u0436\u0435\u043d\u0435\u0440\u044b \u0410\u0432\u0438\u0442\u043e \u0441\u043e\u0431\u0438\u0440\u0430\u043b\u0438\u0441\u044c \u043d\u0430 \u043e\u043d\u043b\u0430\u0439\u043d-\u043f\u043e\u0441\u0438\u0434\u0435\u043b\u043a\u0438 \u0441 \u0433\u043b\u0430\u0432\u043d\u044b\u043c \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u043e\u043c ClickHouse \u0410\u043b\u0435\u043a\u0441\u0435\u0435\u043c \u041c\u0438\u043b\u043e\u0432\u0438\u0434\u043e\u0432\u044b\u043c \u0438 \u041a\u0438\u0440\u0438\u043b\u043b\u043e\u043c \u0428\u0432\u0430\u043a\u043e\u0432\u044b\u043c, Golang-\u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u043e\u043c \u0438\u0437 \u043a\u043e\u043c\u043f\u0430\u043d\u0438\u0438 Integros.\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/prohoster.info\/de\/blog\/administrirovanie\/clickhouse-dlya-prodvinutyh-polzovatelej-v-voprosah-i-otvetah\" \/>\n\t\t<meta property=\"og:image\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:secure_url\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:width\" content=\"350\" \/>\n\t\t<meta property=\"og:image:height\" content=\"350\" \/>\n\t\t<meta property=\"article:published_time\" content=\"2020-05-08T11:42:47+00:00\" \/>\n\t\t<meta property=\"article:modified_time\" content=\"2020-05-08T11:42:47+00:00\" \/>\n\t\t<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<meta property=\"article:author\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<!-- All in One SEO -->\n\n","aioseo_head_json":{"title":"\ud83e\udd47 ClickHouse f\u00fcr fortgeschrittene Benutzer in Fragen und Antworten | ProHoster","description":"Im April planten die Ingenieure von Avito ein Online-Treffen mit dem Hauptentwickler von ClickHouse, Alexei Milovidov, und Kirill Shvakov, einem Golang-Entwickler von Integros.","canonical_url":"https:\/\/prohoster.info\/de\/blog\/administrirovanie\/clickhouse-dlya-prodvinutyh-polzovatelej-v-voprosah-i-otvetah","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"de_DE","og:site_name":"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b","og:type":"article","og:title":"\ud83e\udd47ClickHouse \u0434\u043b\u044f \u043f\u0440\u043e\u0434\u0432\u0438\u043d\u0443\u0442\u044b\u0445 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u0439 \u0432 \u0432\u043e\u043f\u0440\u043e\u0441\u0430\u0445 \u0438 \u043e\u0442\u0432\u0435\u0442\u0430\u0445 | ProHoster","og:description":"\u0412 \u0430\u043f\u0440\u0435\u043b\u0435 \u0438\u043d\u0436\u0435\u043d\u0435\u0440\u044b \u0410\u0432\u0438\u0442\u043e \u0441\u043e\u0431\u0438\u0440\u0430\u043b\u0438\u0441\u044c \u043d\u0430 \u043e\u043d\u043b\u0430\u0439\u043d-\u043f\u043e\u0441\u0438\u0434\u0435\u043b\u043a\u0438 \u0441 \u0433\u043b\u0430\u0432\u043d\u044b\u043c \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u043e\u043c ClickHouse \u0410\u043b\u0435\u043a\u0441\u0435\u0435\u043c \u041c\u0438\u043b\u043e\u0432\u0438\u0434\u043e\u0432\u044b\u043c \u0438 \u041a\u0438\u0440\u0438\u043b\u043b\u043e\u043c \u0428\u0432\u0430\u043a\u043e\u0432\u044b\u043c, Golang-\u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u043e\u043c \u0438\u0437 \u043a\u043e\u043c\u043f\u0430\u043d\u0438\u0438 Integros.","og:url":"https:\/\/prohoster.info\/de\/blog\/administrirovanie\/clickhouse-dlya-prodvinutyh-polzovatelej-v-voprosah-i-otvetah","og:image":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:secure_url":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:width":350,"og:image:height":350,"article:published_time":"2020-05-08T11:42:47+00:00","article:modified_time":"2020-05-08T11:42:47+00:00","article:publisher":"https:\/\/www.facebook.com\/prohoster","article:author":"https:\/\/www.facebook.com\/prohoster"},"aioseo_meta_data":{"post_id":"80775","title":null,"description":null,"keywords":null,"keyphrases":null,"primary_term":null,"canonical_url":null,"og_title":null,"og_description":null,"og_object_type":"default","og_image_type":"default","og_image_url":null,"og_image_width":null,"og_image_height":null,"og_image_custom_url":null,"og_image_custom_fields":null,"og_video":null,"og_custom_url":null,"og_article_section":null,"og_article_tags":null,"twitter_use_og":false,"twitter_card":"default","twitter_image_type":"default","twitter_image_url":null,"twitter_image_custom_url":null,"twitter_image_custom_fields":null,"twitter_title":null,"twitter_description":null,"schema":{"blockGraphs":[],"customGraphs":[],"default":{"data":{"Article":[],"Course":[],"Dataset":[],"FAQPage":[],"Movie":[],"Person":[],"Product":[],"ProductReview":[],"Car":[],"Recipe":[],"Service":[],"SoftwareApplication":[],"WebPage":[]},"graphName":"","isEnabled":true},"graphs":[]},"schema_type":null,"schema_type_options":null,"pillar_content":false,"robots_default":true,"robots_noindex":false,"robots_noarchive":false,"robots_nosnippet":false,"robots_nofollow":false,"robots_noimageindex":false,"robots_noodp":false,"robots_notranslate":false,"robots_max_snippet":null,"robots_max_videopreview":null,"robots_max_imagepreview":"large","priority":null,"frequency":null,"local_seo":null,"seo_analyzer_scan_date":null,"breadcrumb_settings":null,"limit_modified_date":false,"reviewed_by":null,"ai":null,"created":"2021-02-28 16:11:22","updated":"2022-09-28 05:48:13","focus_keyword":null,"additional_keywords":null,"truseo_locale":null},"gt_translate_keys":[{"key":"link","format":"url"}],"_links":{"self":[{"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/posts\/80775","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/comments?post=80775"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/posts\/80775\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/media\/80776"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/media?parent=80775"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/categories?post=80775"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/tags?post=80775"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}