{"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 haben sich die Ingenieure von Avito zu einem Online-Treffen mit dem Hauptentwickler von ClickHouse, Alexei Milovidov, und Kirill Shvakov, einem Golang-Entwickler von Integros, getroffen. Sie haben besprochen, wie wir das Datenbankverwaltungssystem nutzen und welche Schwierigkeiten dabei auftreten. <\/p>\n<p><\/p>\n<p>Basierend auf dem Treffen haben wir einen Artikel mit Antworten von Experten auf unsere und Zuschauerfragen zu Backups, Datenresharding, externen Dicitonaries, dem Golang-Treiber und der Aktualisierung von ClickHouse-Versionen zusammengestellt. Er k\u00f6nnte f\u00fcr Entwickler hilfreich sein, die bereits aktiv mit dem DBMS von Yandex arbeiten und an seiner Gegenwart und Zukunft interessiert sind. Standardm\u00e4\u00dfig stammen die Antworten von Alexei Milovidov, es sei denn, es ist anders angegeben. <\/p>\n<p><\/p>\n<p>Vorsicht, unter dem Cut gibt es viele Texte. Wir hoffen, dass der Inhalt mit den Fragen Ihnen helfen wird, 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 sollten 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 Verlangsamen der Replikate in den Wellen organisieren?<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"#soooo-changeable\">Was ist zu tun, wenn sich die Tabellenstruktur ge\u00e4ndert hat?<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"#resharding-best-practices\">Was sind die aktuellen besten Praktiken beim Datenresharding?<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"#clickhouse-copier\">In ClickHouse gibt es das Tool clickhouse-copier. K\u00f6nnen Sie dar\u00fcber erz\u00e4hlen?<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"#resharding-tool\">Hatten Sie ein Pilotprojekt, das Resharding genannt wurde? Was ist damit passiert?<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"#move-to-slow-disk\">Kann ich alle Teile der Daten zusammenf\u00fchren, bevor ich sie auf langsame Festplatten verschiebe?<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"#up-to-date\">Wie wechselt man auf neue Versionen von ClickHouse, wenn es keine M\u00f6glichkeit gibt, die Kompatibilit\u00e4t im Voraus zu \u00fcberpr\u00fcfen?<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"#kill-query\">Der Kill-Query sollte Anfragen abbrechen, tut dies jedoch nicht. Warum?<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"#reading-time\">Wie berechnet man die Antwortzeit bei einer Lese-Last?<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"#pimp-my-clickhouse\">Was kann man in ClickHouse anpassen, damit mehr Daten im Cache sind?<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"#storage-configuration\">Wie kann man die storage_configuration f\u00fcr den Speicher in RAM einstellen?<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"#low-cardinality\">Bis zu welcher Anzahl von eindeutigen Werten ist Low Cardinality effektiv?<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"#fulltext-search\">Welche besten Praktiken gibt es 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 am besten den Zugriff auf ClickHouse f\u00fcr eine gro\u00dfe Anzahl von Benutzern?<\/a><\/noindex> <\/li>\n<li><noindex><a rel=\"nofollow\" href=\"#smorgasbord\">Kann man die Ergebnisse einer Anfrage an zehn Kunden weitergeben?<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"#asynchronous\">Wie geht man mit asynchronen Operationen und materialisierten Sichten um?<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"#dashboard\">In ClickHouse gibt es viele Protokolle. Wie kann ich alles sehen, was im Moment mit dem Server passiert?<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"#zen\">Wie wirkt man auf die Merges ein, damit der Server nicht in OOM f\u00e4llt?<\/a><\/noindex> <\/li>\n<li><noindex><a rel=\"nofollow\" href=\"#go\">Wie wird die Entwicklung des Golang-Treibers f\u00fcr ClickHouse vor sich gehen?<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"#lazy-load\">Ein externes W\u00f6rterbuch wird nach einem Neustart mit aktivierter lazy_load-Einstellung nicht geladen. Was soll ich tun?<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"#reload-dictionaries\">Wie gehe ich damit um, dass system reload dictionaries kein einziges der vielen W\u00f6rterb\u00fccher 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 \u00e4ndern, ohne sie bei Fehlern preiszugeben?<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"#zoom-backgrounds\">Bonus: Hintergr\u00fcnde f\u00fcr Zoom-Meetings<\/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 Besprechung ansehen. <noindex><a rel=\"nofollow\" href=\"https:\/\/www.youtube.com\/watch?v=n1tm4j4W8ZQ&amp;t=8147s\">auf unserem YouTube-Kanal<\/a><\/noindex>. Die Zeitstempel befinden sich 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, w\u00e4hrend unsere Daten nicht. Was sollen wir damit tun?<\/h2>\n<p><\/p>\n<blockquote><p>ClickHouse wird st\u00e4ndig aktualisiert, aber unsere Daten, die einmal als 'optimize final' verarbeitet wurden, werden nicht aktualisiert und liegen in einer Sicherungskopie. <\/p>\n<p>Angenommen, wir haben ein Problem gehabt und Daten gingen verloren. Wir haben uns entschieden, diese wiederherzustellen, und festgestellt, dass \u00e4ltere Partitionen, die auf den Sicherungsservern gespeichert sind, stark von der aktuell verwendeten ClickHouse-Version abweichen. Was sollten wir in dieser Situation tun, und ist das m\u00f6glich?<\/p><\/blockquote>\n<p>Es ist nicht m\u00f6glich, Daten aus einer Sicherung im alten Format wiederherzustellen, wenn sie in der neuen Version nicht angeschlossen werden k\u00f6nnen. Wir stellen sicher, dass das Datenformat in ClickHouse immer abw\u00e4rtskompatibel bleibt. Das ist viel wichtiger als die R\u00fcckw\u00e4rtskompatibilit\u00e4t in Bezug auf die Funktionalit\u00e4t, wenn sich das Verhalten einer selten genutzten Funktion \u00e4ndert. Die in der Datentr\u00e4gerversion gespeicherten Daten sollten von der neuen Version von ClickHouse jederzeit lesbar sein. Das ist das 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 Sicherungen unter Ber\u00fccksichtigung, dass wir 'optimize final'-Operationen, eine riesige Datenbank in Terabytes und Daten haben, die zuletzt vor drei Tagen aktualisiert wurden, und danach keine Verfahren mehr damit durchgef\u00fchrt werden? <\/p>\n<p>Wir k\u00f6nnten eine eigene L\u00f6sung basteln und in Bash schreiben: Sammle diese Sicherungen so und so. Vielleicht muss man nichts basteln, und das Rad ist l\u00e4ngst erfunden? <\/p><\/blockquote>\n<p>Zun\u00e4chst zu den besten Praktiken. Meine Kollegen empfehlen immer, beim Thema Backups auf den Service 'Yandex.Cloud' hinzuweisen, wo dieses Thema bereits gel\u00f6st ist. Nutzen Sie ihn, wenn Sie die M\u00f6glichkeit dazu haben. <\/p>\n<p><\/p>\n<p>Es gibt keine vollst\u00e4ndige L\u00f6sung, die zu 100 Prozent in ClickHouse integriert ist, f\u00fcr Backups. Es gibt einige Vorlagen, die man verwenden kann. Um eine vollst\u00e4ndige L\u00f6sung zu erhalten, m\u00fcssen Sie 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 ende mit den ausgefeiltesten, abh\u00e4ngig vom Datenvolumen und der Clustergr\u00f6\u00dfe. Je gr\u00f6\u00dfer das Cluster ist, desto komplexer wird die L\u00f6sung.<\/p>\n<p><\/p>\n<p>Wenn die Datenbank nur wenige Gigabyte gro\u00df ist, kann das Backup wie folgt durchgef\u00fchrt werden: <\/p>\n<p><\/p>\n<ol>\n<li>Die Tabellenbeschreibung, das hei\u00dft die Metadaten, speichern - <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 m\u00f6chten, k\u00f6nnen Sie das Native-Format w\u00e4hlen. <\/li>\n<\/ol>\n<p><\/p>\n<p>Wenn das Datenvolumen gr\u00f6\u00dfer ist, dauert das Backup l\u00e4nger und ben\u00f6tigt viel Platz. Dies wird als logisches Backup bezeichnet, es ist nicht an das Datenformat von ClickHouse gebunden. Falls verf\u00fcgbar, k\u00f6nnen Sie in diesem Fall ein Backup nehmen und in MySQL f\u00fcr die Wiederherstellung laden. <\/p>\n<p><\/p>\n<p>F\u00fcr fortgeschrittenere F\u00e4lle bietet ClickHouse die M\u00f6glichkeit, Snapshots von Partitionen im lokalen Dateisystem zu erstellen. Diese Funktion steht in Form einer Anfrage zur Verf\u00fcgung. <strong>alter table freeze partition<\/strong>. Oder einfach <strong>alter table freeze<\/strong> \u2013 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, es ist nicht m\u00f6glich, auf diese Weise einen konsistenten Snapshot des gesamten Clusters zu erstellen. Aber f\u00fcr die meisten Aufgaben ist dies nicht erforderlich, und es gen\u00fcgt, den Befehl auf jedem Shard auszuf\u00fchren, um einen konsistenten Snapshot zu erhalten. Er wird in Form von Hardlinks erstellt und ben\u00f6tigt daher keinen zus\u00e4tzlichen Speicherplatz. 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 ist relativ einfach wiederherzustellen. Zuerst erstellen Sie die Tabellen basierend auf den vorhandenen Tabellendefinitionen. Danach kopieren Sie die gespeicherten Partition-Snapshots in das Directory-Detached f\u00fcr diese Datentabellen und f\u00fchren Sie die Anfrage aus <strong>attach partition<\/strong>. Diese L\u00f6sung eignet sich durchaus f\u00fcr die ernsthaftesten Datenmengen. <\/p>\n<p><\/p>\n<p>Manchmal ist etwas noch ausgefeilter erforderlich \u2014 in F\u00e4llen, wenn Sie Dutzende oder sogar Hunderte Terabyte auf jedem Server und Hunderte von Servern haben. Hier gibt es eine L\u00f6sung, die ich von Kollegen bei \u201eYandex.Metrica\u201c \u00fcbernommen habe. Ich w\u00fcrde es nicht jedem empfehlen \u2014 lesen Sie und entscheiden Sie selbst, ob es geeignet ist oder nicht. <\/p>\n<p><\/p>\n<p>Zun\u00e4chst m\u00fcssen einige Server mit gro\u00dfen Datentr\u00e4gerspeichern erstellt werden. Anschlie\u00dfend sollten auf diesen Servern mehrere ClickHouse-Server installiert und so konfiguriert werden, dass sie als eine weitere Replik f\u00fcr die gleichen Shards fungieren. Danach kann auf diesen Servern ein Dateisystem oder ein Werkzeug verwendet werden, das Snapshots erstellt. Es gibt zwei Optionen: Die erste Option sind LVM-Snapshots, die zweite Option ist ZFS unter Linux. <\/p>\n<p><\/p>\n<p>Danach muss jeden Tag ein Snapshot erstellt werden, der Platz beansprucht. Nat\u00fcrlich, wenn sich die Daten \u00e4ndern, wird mit der Zeit der Platzbedarf steigen. Dieser Snapshot kann jederzeit abgerufen werden, um die Daten wiederherzustellen \u2013 eine seltsame L\u00f6sung. Zudem m\u00fcssen diese Replikate in der Konfiguration eingeschr\u00e4nkt werden, damit sie nicht versuchen, zu F\u00fchrern 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 Verlangsamen der Replikate in den Wellen organisieren?<\/h2>\n<p><\/p>\n<blockquote><p>In diesem Jahr planen Sie, Wellen in ClickHouse zu erstellen. Wird es m\u00f6glich sein, ein kontrolliertes Hinterherziehen der Replikate zu organisieren? Wir m\u00f6chten uns damit vor negativen Szenarien mit Alternativen und anderen \u00c4nderungen sch\u00fctzen. <\/p>\n<p>Kann man einige Rollbacks f\u00fcr Alternativen durchf\u00fchren? Zum Beispiel k\u00f6nnten wir in der bestehenden Welle sagen, dass bis zu diesem Zeitpunkt \u00c4nderungen angewendet werden sollen und ab diesem Zeitpunkt die \u00c4nderungen nicht mehr angewendet werden sollen?<\/p>\n<p>Wenn in unseren Cluster ein Befehl eingeht und ihn kaputt macht, haben wir eine bedingte Replik mit einer Stunde Verz\u00f6gerung, wo wir sagen k\u00f6nnen, dass wir genau diese im Moment verwenden m\u00f6chten, jedoch die letzten zehn Minuten \u00c4nderungen nicht anwenden wollen? <\/p><\/blockquote>\n<p>Zun\u00e4chst zum kontrollierten Hinterherziehen der Replikate. Eine solche Anfrage kam von den Benutzern, und wir haben ein Issue auf GitHub erstellt mit der Bitte: \u201eWenn jemand das braucht, liked oder gebt ein Herzchen\u201c. Niemand hat es geliket, und das Issue wurde geschlossen. Dennoch kann bereits jetzt diese M\u00f6glichkeit erhalten werden, indem ClickHouse konfiguriert wird, allerdings nur ab Version 20.3.<\/p>\n<p><\/p>\n<p>ClickHouse f\u00fchrt st\u00e4ndig im Hintergrund Datenfusionen durch \u2013 Merges. Wenn ein Merge durchgef\u00fchrt wird, wird eine bestimmte Anzahl von Datenst\u00fccken durch ein gr\u00f6\u00dferes St\u00fcck ersetzt. Die fr\u00fcheren Datenst\u00fccken bleiben jedoch f\u00fcr einige Zeit auf der Festplatte.<\/p>\n<p><\/p>\n<p>Zun\u00e4chst einmal bleiben sie so lange erhalten, wie es Select-Abfragen gibt, die sie verwenden, um eine nicht blockierende Verarbeitung zu gew\u00e4hrleisten. Select-Abfragen k\u00f6nnen bequem aus den alten Bl\u00f6cken lesen.<\/p>\n<p><\/p>\n<p>Zweitens gibt es auch eine zeitliche Grenze \u2013 alte Datenbl\u00f6cke bleiben acht Minuten lang auf der Festplatte. Diese acht Minuten k\u00f6nnen angepasst und sogar auf einen Tag verl\u00e4ngert werden. Dies hat Konsequenzen f\u00fcr den Speicherplatz: je nach Datenstrom k\u00f6nnte es sein, dass die Daten am letzten Tag nicht nur verdoppelt werden, sondern bis zu f\u00fcnfmal mehr werden. Aber Sie k\u00f6nnen bei einem ernsten Problem den ClickHouse-Server anhalten und alles in Ordnung bringen.<\/p>\n<p><\/p>\n<p>Nun stellt sich die Frage, wie das vor Alterungen sch\u00fctzt. Hier lohnt es sich, tiefer zu schauen, denn in \u00e4lteren Versionen von ClickHouse arbeitete die Alterung so, dass einfach die Bl\u00f6cke direkt ge\u00e4ndert wurden. Es gibt einen Datenblock mit bestimmten Dateien, und wir machen zum Beispiel <strong>alter drop column<\/strong>. Dann wird diese Spalte physisch aus allen Bl\u00f6cken entfernt.<\/p>\n<p><\/p>\n<p>Aber seit Version 20.3 wurde der Mechanismus der Alterungen vollst\u00e4ndig \u00fcberarbeitet, und jetzt sind Datenbl\u00f6cke immer unver\u00e4nderlich. Sie werden \u00fcberhaupt nicht ge\u00e4ndert \u2013 Alterungen funktionieren jetzt \u00e4hnlich wie Merge-Prozesse. Anstatt einen Block vor Ort zu \u00e4ndern, erstellen wir einen neuen. In dem neuen Block werden die unver\u00e4nderten Dateien zu Hardlinks, und wenn wir eine Spalte gel\u00f6scht haben, wird sie einfach im neuen Block nicht vorhanden sein. Der alte Block wird standardm\u00e4\u00dfig nach acht Minuten gel\u00f6scht, und hier k\u00f6nnen die oben genannten Einstellungen angepasst werden. <\/p>\n<p><\/p>\n<p>Das gilt auch f\u00fcr Altern vom Typ Mutationen. Wenn Sie die <strong>alter delete<\/strong> oder <strong>alter update<\/strong>-Befehle ausf\u00fchren, wird das St\u00fcck nicht ge\u00e4ndert, sondern ein neues erstellt. Anschlie\u00dfend 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 ist zu tun, wenn sich die Tabellenstruktur ge\u00e4ndert hat?<\/h2>\n<p><\/p>\n<blockquote><p>Wie stellt man ein Backup wieder her, das mit einem alten Schema erstellt wurde? Und die zweite Frage betrifft den Fall von Snapshots und Dateisystemtools. Ist Btrfs hier anstelle von ZFS unter Linux LVM geeignet?<\/p><\/blockquote>\n<p>Wenn Sie <strong>attach partition<\/strong> Partitionen mit einer anderen Struktur, wird ClickHouse Ihnen sagen, dass dies nicht m\u00f6glich ist. Die L\u00f6sung ist folgende: Zuerst eine tempor\u00e4re Tabelle vom Typ MergeTree mit der alten Struktur erstellen, dort Daten mit Attach anh\u00e4ngen, eine Alter-Abfrage durchf\u00fchren. Danach kann man die Daten entweder kopieren oder verschieben und erneut Attach durchf\u00fchren, oder die Abfrage verwenden. <strong>alter table move partition<\/strong>.<\/p>\n<p><\/p>\n<p>Die zweite Frage ist nun&nbsp;\u2014 kann man Btrfs verwenden. Zun\u00e4chst, wenn Sie LVM haben, sind LVM-Snapshots ausreichend, und das Dateisystem kann ext4 sein, das spielt keine Rolle. Bei Btrfs h\u00e4ngt alles von Ihrer Erfahrung im Umgang damit ab. Es ist ein ausgereiftes Dateisystem, aber es gibt immer noch einige Zweifel, wie es in der Praxis in bestimmten Szenarien funktioniert. Ich w\u00fcrde nicht empfehlen, es zu verwenden, wenn Sie kein Btrfs in der Produktion 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 die aktuellen besten Praktiken beim Datenresharding?<\/h2>\n<p><\/p>\n<p>Die Frage nach dem Re-Sharding ist komplex und vielschichtig. Hier kann man gleich auf mehrere Arten antworten. Man kann von einer Seite ausgehen und sagen, dass ClickHouse keine eingebaute Re-Sharding-Funktionalit\u00e4t hat. Aber ich bef\u00fcrchte, das wird niemanden zufriedenstellen. Daher kann man von der anderen Seite ausgehen und sagen, dass es in ClickHouse viele M\u00f6glichkeiten f\u00fcr das Re-Sharding von Daten gibt. <\/p>\n<p><\/p>\n<p>Wenn der Speicherplatz im Cluster zur Neige geht oder er mit der Last nicht mehr zurechtkommt, f\u00fcgen Sie neue Server hinzu. Diese Server sind jedoch standardm\u00e4\u00dfig leer, sie enthalten keine Daten und es gibt keine Last. Sie m\u00fcssen die Daten neu verteilen, damit sie gleichm\u00e4\u00dfig auf das neu vergr\u00f6\u00dferte Cluster verteilt sind.<\/p>\n<p><\/p>\n<p>Der erste Weg, wie man dies tun kann, ist, Teile der Partitionen mit einer Anfrage auf die neuen Server zu kopieren. <strong>alter table fetch partition<\/strong>Zum Beispiel, wenn Sie Partitionen nach Monaten hatten, dann 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 machen Sie weiter, bis es mehr oder weniger gleichm\u00e4\u00dfig wird.<\/p>\n<p><\/p>\n<p>Der Transfer kann nur f\u00fcr die Partitionen durchgef\u00fchrt werden, die sich beim Schreiben nicht \u00e4ndern. F\u00fcr frische Partitionen muss das Schreiben deaktiviert werden, da ihr Transfer nicht atomar ist. Andernfalls erhalten Sie Duplikate oder L\u00fccken in den Daten. Dennoch ist diese Methode praktikabel und funktioniert ziemlich effizient. Es werden bereits komprimierte Partitionen \u00fcber das Netz \u00fcbertragen, d.h. die Daten werden nicht erneut komprimiert oder rekodiert.<\/p>\n<p><\/p>\n<p>Diese Methode hat einen Nachteil, und zwar h\u00e4ngt er vom Sharding-Schema ab. Wenn Sie auf ein bestimmtes Sharding-Schema gesetzt haben, auf welchen Sharding-Schl\u00fcssel Sie gesetzt haben. In Ihrem Beispiel ist der Sharding-Schl\u00fcssel f\u00fcr den Fall mit Metriken der Hash des Pfades. Wenn Sie einen Select in die verteilte Tabelle durchf\u00fchren, werden sofort alle Shards des Clusters angefragt, und die Daten werden von dort abgerufen. <\/p>\n<p><\/p>\n<p>Das bedeutet, dass es f\u00fcr Sie im Grunde keine Rolle spielt, welche Daten auf welchem Shard gelandet sind. Wichtig ist, dass die Daten zu einem Pfad auf einem Shard liegen, auf welchem genau, ist nicht entscheidend. In diesem Fall eignet sich der Transfer von fertigen Partitionen hervorragend, da Sie bei Select-Anfragen sowohl vor der Re-Shardierung als auch danach, die Struktur der Werte dabei keine Rolle spielt, vollst\u00e4ndige Daten erhalten werden.<\/p>\n<p><\/p>\n<p>Es gibt jedoch auch kompliziertere F\u00e4lle. Wenn Sie auf Anwendungsebene auf ein spezielles Sharding-Schema setzen, dass dieser Kunde sich auf einem bestimmten Shard befindet, und die Anfrage direkt dorthin gesendet werden kann, anstatt zur verteilten 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-Anfrage der Ausdruck im Where-Bereich analysiert und ermittelt, auf welche Shards gegangen werden muss, gem\u00e4\u00df dem Sharding-Schema. Dies funktioniert unter der Bedingung, dass die Daten tats\u00e4chlich gem\u00e4\u00df diesem Sharding-Schema verteilt sind. Wenn Sie sie manuell umsortiert haben, kann die \u00dcbereinstimmung \u00e4ndern.<\/p>\n<p><\/p>\n<p>Das ist also Methode Nummer eins. Ich warte auf Ihre Antwort, 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, der Weg, den Sie erw\u00e4hnt haben, eignet sich nicht gut, wenn man die Last auch auf das Lesen verteilen muss. Wir k\u00f6nnen eine monatliche Partition nehmen und den vorhergehenden Monat auf einen anderen Knoten verschieben, aber wenn eine Anfrage nach diesen Daten kommt, belasten wir nur diesen. Wir w\u00fcrden jedoch gerne den ganzen Cluster belasten, denn andernfalls wird f\u00fcr eine gewisse Zeit die gesamte Lese-last von zwei Shards bearbeitet.<\/p>\n<p><\/p>\n<p><strong>Alexej Milovidov:<\/strong> Die Antwort hier ist merkw\u00fcrdig \u2013 ja, es ist schlecht, k\u00f6nnte aber auch funktionieren. Lassen Sie mich erkl\u00e4ren, wie genau. Man sollte sich das Lastszenario anschauen, das mit Ihren Daten einhergeht. Wenn es sich um \u00dcberwachungsdaten handelt, kann man fast mit Sicherheit sagen, dass die \u00fcberwiegende Mehrheit der Anfragen nach aktuellen Daten fragt. <\/p>\n<p><\/p>\n<p>Sie haben neue Server bereitgestellt, alte Partitionen verschoben, aber auch die Art und Weise ge\u00e4ndert, wie neue Daten gespeichert werden. Die neuen Daten werden \u00fcber den gesamten Cluster verteilt. Daher werden bereits nach f\u00fcnf Minuten die Anfragen der letzten f\u00fcnf Minuten gleichm\u00e4\u00dfig auf den Cluster verteilt, und nach einem Tag werden die Anfragen f\u00fcr 24 Stunden ebenso gleichm\u00e4\u00dfig den Cluster belasten. Leider werden die Anfragen des letzten Monats nur auf einen Teil der Server im Cluster gehen.<\/p>\n<p><\/p>\n<p>Aber oft werden Sie keine Anfragen f\u00fcr genau den Februar 2019 haben. H\u00f6chstwahrscheinlich, wenn die Anfragen auf das Jahr 2019 abzielen, dann f\u00fcr das gesamte Jahr \u2014 \u00fcber einen langen Zeitraum, nicht f\u00fcr einen kleinen Bereich. Und solche Anfragen k\u00f6nnen den Cluster ebenfalls gleichm\u00e4\u00dfig belasten. Ihr Hinweis ist insgesamt jedoch korrekt: Dies ist eine ad-hoc-L\u00f6sung, 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 die Sharding-Schemata von Anfang an so gestaltet, dass das Nachher-Sharding weniger schmerzhaft ist. Das ist nicht immer m\u00f6glich.<\/p>\n<p><\/p>\n<p>Zum Beispiel haben Sie Monitoring-Daten. Die Monitoring-Daten wachsen aus drei Gr\u00fcnden. Erster Grund \u2014 die Ansammlung historischer Daten. Zweiter Grund \u2014 das Wachstum des Traffics. Und dritter Grund \u2014 die Zunahme der Dinge, die \u00fcberwacht werden m\u00fcssen. Es kommen neue Microservices und Metriken hinzu, die gespeichert werden m\u00fcssen. <\/p>\n<p><\/p>\n<p>M\u00f6glicherweise ist das gr\u00f6\u00dfte Wachstum mit dem dritten Grund verbunden \u2014 der zunehmenden Nutzung des Monitorings. In diesem Fall sollten Sie sich die Art der Last ansehen, welche die Hauptabfragen auf select sind. Die Hauptabfragen auf select werden wahrscheinlich f\u00fcr eine bestimmte Teilmenge von Metriken erfolgen.<\/p>\n<p><\/p>\n<p>Zum Beispiel die CPU-Nutzung auf einigen Servern von einem bestimmten Dienst. Das bedeutet, dass es eine Teilmenge von Schl\u00fcsseln gibt, \u00fcber die Sie diese Daten abrufen. Und die Anfrage nach diesen Daten ist wahrscheinlich recht einfach und wird in wenigen Millisekunden ausgef\u00fchrt. Sie wird f\u00fcr Monitoring-Dienste und Dashboards verwendet. Ich hoffe, ich verstehe das richtig.<\/p>\n<p><\/p>\n<p><strong>Wladimir Kolobajew:<\/strong> Es ist so, dass wir sehr oft auf historische Daten zur\u00fcckgreifen, da wir in Echtzeit die aktuelle Situation mit der historischen vergleichen. F\u00fcr uns ist es wichtig, schnellen Zugriff auf gro\u00dfe Datenmengen zu haben, und das gelingt ClickHouse hervorragend.<\/p>\n<p><\/p>\n<p>Sie haben vollkommen recht, die meisten Leseanfragen absolvieren wir am letzten Tag, wie jedes \u00dcberwachungssystem. Aber auch die historische Datenlast ist ziemlich gro\u00df. Diese kommt haupts\u00e4chlich von dem Alarmierungssystem, das alle drei\u00dfig Sekunden an ClickHouse fragt: \"Gib 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.\" <\/p>\n<p><\/p>\n<p>Ich m\u00f6chte erw\u00e4hnen, dass wir f\u00fcr solche sehr frischen Anfragen eine kleine zus\u00e4tzliche Tabelle haben, in der wir nur zwei Tage Daten speichern, und die Hauptanfragen laufen dort hinein. In die gro\u00dfe sharded Tabelle schicken wir nur gro\u00dfe historische Anfragen.<\/p>\n<p><\/p>\n<p><strong>Alexej Milovidov:<\/strong> Leider ist das f\u00fcr Ihr Szenario schlecht anwendbar, aber ich werde zwei schlechte und komplexe Sharding-Modelle beschreiben, die man nicht verwenden sollte, die aber im Dienst meiner Freunde eingesetzt werden. <\/p>\n<p><\/p>\n<p>Es gibt einen Hauptcluster mit Ereignissen von \u201eYandex.Metrica\u201c. Ereignisse sind Seitenaufrufe, Klicks und Wechsel. Die meisten Anfragen beziehen sich auf eine bestimmte Website. Sie \u00f6ffnen den Dienst \u201eYandex.Metrica\u201c, haben eine Website \u2013 avito.ru, gehen zum Bericht und es erfolgt eine Anfrage f\u00fcr Ihre Website.<\/p>\n<p><\/p>\n<p>Es gibt aber auch andere Anfragen \u2013 analytische und globale, die von internen Analysten gestellt werden. Ich m\u00f6chte anmerken, dass interne Analysten Anfragen nur zu den \u201eYandex\u201c-Diensten stellen. Dennoch machen die \u201eYandex\u201c-Dienste einen erheblichen Teil aller Daten aus. Diese Anfragen sind nicht auf bestimmte Z\u00e4hler beschr\u00e4nkt, sondern erfordern eine breitere Filterung.<\/p>\n<p><\/p>\n<p>Wie organisiert man die Daten so, dass sowohl die Anfragen f\u00fcr einen einzelnen Z\u00e4hler effizient arbeiten als auch die globalen Anfragen? Die Schwierigkeit besteht auch darin, dass die Anzahl der Anfragen an ClickHouse im Cluster \u201eMetrica\u201c mehrere Tausend pro Sekunde betr\u00e4gt. Dabei kann ein einzelner ClickHouse-Server nicht mehrere tausend nicht triviale Anfragen pro Sekunde bew\u00e4ltigen.<\/p>\n<p><\/p>\n<p>Die Clustergr\u00f6\u00dfe betr\u00e4gt \u00fcber sechshundert Server. Wenn man einfach eine verteilte Tabelle \u00fcber dieses Cluster legt und mehrere Tausend Anfragen dorthin sendet, wird es noch schlimmer, als sie an einen einzelnen Server zu senden. Andererseits kann die Option, die Daten gleichm\u00e4\u00dfig verteilt sind, dabei helfen, alle Server abzufragen, was wir sofort ausschlie\u00dfen k\u00f6nnen.<\/p>\n<p><\/p>\n<p>Es gibt eine diametral entgegengesetzte Option. Stellen Sie sich vor, wir shardieren die Daten nach Websites, und die Anfrage f\u00fcr eine Website wird an einen Shard gesendet. Nun kann das Cluster problemlos zehntausend Anfragen pro Sekunde verarbeiten, aber auf einem einzelnen Shard wird eine bestimmte Anfrage zu langsam sein. Sie wird nicht mehr in Bezug auf die Bandbreite skalierbar sein, 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 russischen Internet ist. Diese auf einem einzelnen Shard zu verarbeiten, w\u00e4re Wahnsinn.<\/p>\n<p><\/p>\n<p>Daher ist das Shardingschema komplexer aufgebaut. Das gesamte Cluster ist in eine gewisse Anzahl von Kleinstclustern unterteilt, die wir Schichten nennen. Innerhalb jedes kleinen Clusters gibt es zwischen zehn und mehreren Dutzend Shards. Insgesamt gibt es neununddrei\u00dfig dieser Kleinstcluster. <\/p>\n<p><\/p>\n<p>Wie wird das alles skaliert? Die Anzahl der Kleinstcluster bleibt gleich \u2013 wie vor einigen Jahren neununddrei\u00dfig, so ist es geblieben. Doch innerhalb jedes von ihnen erh\u00f6hen wir schrittweise die Anzahl der Shards, w\u00e4hrend die Daten wachsen. Das Shardingschema insgesamt sieht so aus \u2013 die Aufteilung in diese Kleinstcluster erfolgt nach Webseiten, und um zu verstehen, welche Website zu welchem Cluster geh\u00f6rt, wird eine separate Metadatenbank in MySQL verwendet. Eine Website \u2013 ein Kleinstcluster. Innerhalb dieses Clusters erfolgt das Sharding nach den Besuchern-IDs.<\/p>\n<p><\/p>\n<p>Bei der Aufzeichnung teilen wir sie nach dem Rest der Division des Besucherkennzeichens auf. Bei der Hinzuf\u00fcgung eines neuen Shards \u00e4ndert sich jedoch das Sharding-Schema; wir teilen weiterhin auf, aber nach dem Rest der Division durch eine andere Zahl. Das bedeutet, dass ein Besucher sich tats\u00e4chlich auf mehreren Servern befindet, was nicht vorhergesehen werden kann. Dies wurde ausschlie\u00dflich gemacht, um die Daten besser zu komprimieren. Bei Anfragen gehen wir zur Distributed-Tabelle, die den Cluster betrachtet und sich an Dutzende von Servern wendet. So sieht das merkw\u00fcrdige Schema aus.<\/p>\n<p><\/p>\n<p>Aber meine Erz\u00e4hlung w\u00e4re unvollst\u00e4ndig, wenn ich nicht erw\u00e4hnen w\u00fcrde, dass wir von diesem Schema Abstand genommen haben. Im neuen Schema haben wir alles ge\u00e4ndert und alle Daten mit dem clickhouse-copier kopiert.<\/p>\n<p><\/p>\n<p>Im neuen Schema werden alle Websites in zwei Kategorien eingeteilt \u2013 gro\u00dfe und kleine. Ich wei\u00df nicht, wie die Grenze gew\u00e4hlt wurde, aber das Ergebnis ist, dass gro\u00dfe Websites auf einen Cluster mit 120 Shards verteilt werden, wobei jeder drei Replikate hat \u2013 also insgesamt 360 Server. Und das Sharding-Schema ist so, dass jede Anfrage sofort an alle Shards geht. Wenn Sie jetzt in \u201eYandex.Metrica\u201c eine beliebige Berichtseite f\u00fcr avito.ru \u00f6ffnen, wird die Anfrage an 120 Server gesendet. Gro\u00dfe Websites sind in Runet selten. Und es gibt nicht tausend Anfragen pro Sekunde, sondern sogar weniger als hundert. All dies verarbeitet die Distributed-Tabelle, die von jedem dieser 120 Server bearbeitet wird.<\/p>\n<p><\/p>\n<p>Der zweite Cluster ist f\u00fcr kleine Websites. Hier verfolgt das Sharding-Schema die Website-ID, und jede Anfrage geht genau an 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>In ClickHouse gibt es das Tool clickhouse-copier. K\u00f6nnen Sie dar\u00fcber erz\u00e4hlen?<\/h2>\n<p><\/p>\n<p>Ich sage gleich, dass diese L\u00f6sung umfangreicher und etwas weniger leistungsf\u00e4hig ist. Der Vorteil ist, dass sie die Daten vollst\u00e4ndig gem\u00e4\u00df dem von Ihnen angegebenen Schema verteilt. Der Nachteil des Werkzeugs besteht darin, dass es kein Re-Sharding durchf\u00fchrt. Es kopiert Daten von einem Schema des Clusters in ein anderes Schema des Clusters.<\/p>\n<p><\/p>\n<p>Das bedeutet, dass Sie f\u00fcr ihren Betrieb zwei Cluster ben\u00f6tigen. Sie k\u00f6nnen auf denselben Servern liegen, jedoch werden die Daten nicht inkrementell verschoben, sondern sie werden kopiert. <\/p>\n<p><\/p>\n<p>Zum Beispiel, es gab vier Server, jetzt sind es acht. Sie erstellen auf&nbsp;allen Servern eine neue verteilte Tabelle, neue lokale Tabellen und starten den clickhouse-copier, wobei Sie ihm das Arbeitsmuster angeben, dass er von dort lesen, das neue Shardingschema \u00fcbernehmen und die Daten dorthin verschieben soll. Und Sie ben\u00f6tigen auf&nbsp;den alten Servern anderthalb Mal mehr Platz als jetzt, weil die alten Daten darauf bleiben m\u00fcssen, und dar\u00fcber hinaus wird die H\u00e4lfte dieser alten Daten dort ankommen. Wenn Sie im Voraus dar\u00fcber nachgedacht haben, dass die Daten neu sharded werden m\u00fcssen und Platz vorhanden ist, dann eignet sich diese Methode.<\/p>\n<p><\/p>\n<p>Wie funktioniert der clickhouse-copier intern? Er unterteilt die gesamte Arbeit in eine Reihe von Aufgaben zur Verarbeitung einer Partition einer Tabelle auf&nbsp;einem Shard. All diese Aufgaben k\u00f6nnen parallel ausgef\u00fchrt werden, und der clickhouse-copier kann auf&nbsp;verschiedenen Maschinen in&nbsp;mehreren Instanzen gestartet werden, aber das, was er f\u00fcr eine Partition tut, ist nichts anderes als ein Insert Select. Daten werden gelesen, dekomprimiert, neu aufgeteilt, dann wieder komprimiert, irgendwo aufgezeichnet und neu sortiert. Dies ist eine aufw\u00e4ndigere 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>Hatten Sie ein Pilotprojekt, das Resharding genannt wurde? Was ist damit passiert?<\/h2>\n<p><\/p>\n<blockquote><p>Sie hatten bereits 2017 ein Pilotprojekt, das Resharding genannt wurde. Es gibt sogar eine Option in&nbsp;ClickHouse. Ich verstehe, das hat sich nicht durchgesetzt. K\u00f6nnen Sie erz\u00e4hlen, warum das so war? Es scheint doch sehr aktuell zu sein.<\/p><\/blockquote>\n<p>Das ganze Problem besteht darin, dass eine ziemlich komplexe Synchronisation erforderlich ist, um die Daten vor Ort atomar neu zu sharden. Als wir uns ansahen, wie diese Synchronisation funktioniert, wurde klar, dass es fundamentale Probleme gibt. Und diese fundamentalen Probleme sind nicht nur theoretisch, sondern zeigen sich sofort in der Praxis in&nbsp;der einfach zu erkl\u00e4renden Tatsache \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 ich alle Teile der Daten zusammenf\u00fchren, bevor ich sie auf langsame Festplatten verschiebe?<\/h2>\n<p><\/p>\n<blockquote><p>Frage zu&nbsp;TTL mit der Option, auf langsamen Speicher zu verschieben, im Kontext von Mergers. Gibt es einen Weg, au\u00dfer \u00fcber Cron, um alle Teile vor der Verschiebung auf&nbsp;langsame Laufwerke in&nbsp;eine zu verschmelzen?<\/p><\/blockquote>\n<p>Die Antwort auf die Frage, ob man die Teile automatisch zu einem gro\u00dfen St\u00fcck vor ihrem Transfer zusammenf\u00fchren kann \u2014 lautet nein. Ich denke, das ist nicht notwendig. Man kann die Teile auch einfach nicht zusammenf\u00fchren und darauf vertrauen, dass sie automatisch auf&nbsp;die langsamen Disks verschoben werden. <\/p>\n<p><\/p>\n<p>Wir haben zwei Kriterien f\u00fcr die Migration. Erstens nach dem F\u00fcllstand. Wenn auf dem aktuellen Speicherlevel weniger als ein bestimmter Prozentsatz freier Platz verf\u00fcgbar ist, w\u00e4hlen wir einen Block aus und verschieben ihn auf einen langsameren Speicher. Genauer gesagt, nicht auf einen langsameren, sondern auf den n\u00e4chsten \u2013 ganz wie Sie es konfigurieren.<\/p>\n<p><\/p>\n<p>Das zweite Kriterium ist die Gr\u00f6\u00dfe. Es geht um die Migration gro\u00dfer Bl\u00f6cke. Sie k\u00f6nnen die Schwelle f\u00fcr den freien Speicher auf der schnellen Disk anpassen, und die Daten werden automatisch verschoben.<\/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 wechselt man auf neue Versionen von ClickHouse, wenn es keine M\u00f6glichkeit gibt, die Kompatibilit\u00e4t im Voraus zu \u00fcberpr\u00fcfen?<\/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 Telegram-Chat ClickHouse<\/a><\/noindex> unter Ber\u00fccksichtigung verschiedener Versionen, und dennoch. Wie sicher ist es, von Version 19.11 auf 19.16 und beispielsweise von 19.16 auf 20.3 zu aktualisieren? Wie sollten Sie auf neue Versionen umsteigen, ohne die M\u00f6glichkeit zu haben, die Kompatibilit\u00e4t im Sandbox-Modus vorher zu \u00fcberpr\u00fcfen?<\/p><\/blockquote>\n<p>Hier sind einige \u201egoldene\u201c Regeln. Die erste ist <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/ClickHouse\/ClickHouse\/blob\/master\/CHANGELOG.md\">lesen Sie das Changelog<\/a><\/noindex>. Es ist gro\u00df, aber es gibt spezielle Punkte zu nicht r\u00fcckw\u00e4rtskompatiblen \u00c4nderungen. Man sollte diese Punkte nicht als roten Alarm betrachten. In der Regel handelt es sich um kleine Inkompatibilit\u00e4ten, die mit einiger Randfunktionalit\u00e4t verbunden sind, die sehr wahrscheinlich nicht von Ihnen genutzt wird.<\/p>\n<p><\/p>\n<p>Das zweite ist \u2013 wenn Sie keine M\u00f6glichkeit haben, die Kompatibilit\u00e4t im Sandbox-Modus zu pr\u00fcfen, und Sie m\u00f6chten sofort in der Produktion aktualisieren, lautet die Empfehlung \u2013 tun Sie das nicht. Erstellen Sie zuerst eine Sandbox und testen Sie. Wenn es keine Testumgebung gibt, dann sind Sie wahrscheinlich nicht gerade ein gro\u00dfes Unternehmen, also k\u00f6nnen Sie einen Teil der Daten auf Ihren Laptop kopieren und dort sicherstellen, dass alles korrekt funktioniert. Sie k\u00f6nnen sogar mehrere Replikate lokal auf Ihrem Computer hochfahren. Oder Sie k\u00f6nnen irgendwo in der N\u00e4he eine neue Version hochziehen und dort einen Teil der Daten hochladen \u2013 das hei\u00dft, eine improvisierte Testumgebung erstellen. <\/p>\n<p><\/p>\n<p>Eine weitere Regel ist \u2013 aktualisieren Sie nicht innerhalb einer Woche nach dem Release einer Version, um Fehler in der Produktion zu beheben und die nachfolgenden schnellen Fixes abzuwarten. Lassen Sie uns die Versionsnummerierung von ClickHouse kl\u00e4ren, um nicht verwirrt zu werden. <\/p>\n<p><\/p>\n<p>Es gibt die Version 20.3.4. Die Zahl 20&nbsp;bezeichnet das Jahr der Ver\u00f6ffentlichung&nbsp;\u2014 2020. In Bezug auf den inneren Aufbau hat das keine Bedeutung, also werden wir darauf nicht weiter eingehen. Weiter geht es mit 20.3. Die zweite Zahl&nbsp;\u2014 in diesem Fall 3&nbsp;\u2014 erh\u00f6hen wir jedes Mal, wenn wir eine neue Funktionalit\u00e4t ver\u00f6ffentlichen. Wenn wir ClickHouse eine Funktion 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 die 4 f\u00fcr die Anzahl an Patch-Versionen, in denen wir keine neuen Funktionen hinzugef\u00fcgt, aber einige Bugs behoben haben. Und die 4 bedeutet, dass wir das viermal gemacht haben.<\/p>\n<p><\/p>\n<p>Man sollte nicht denken, dass dies etwas Schreckliches ist. Normalerweise kann der Benutzer die neueste Version installieren, und sie wird ohne&nbsp;irgendwelche Probleme mit einer Laufzeit von&nbsp;einem Jahr funktionieren. Aber stellen Sie sich vor, dass in einer Funktion zur Verarbeitung von Bitmaps, die von unseren chinesischen Kollegen hinzugef\u00fcgt wurde, der Server abst\u00fcrzt, wenn falsche Argumente \u00fcbergeben werden. Das m\u00fcssen wir beheben. Wir werden eine neue Patch-Version herausbringen, und ClickHouse wird stabiler.<\/p>\n<p><\/p>\n<p>Wenn Sie ClickHouse in der Produktion verwenden und eine neue Version mit zus\u00e4tzlichen Features herauskommt \u2014 zum Beispiel&nbsp;20.4.1 \u2014 installieren Sie sie am ersten Tag nicht sofort in der Produktion. Warum ist sie \u00fcberhaupt notwendig? Wenn Sie ClickHouse noch nicht verwenden, k\u00f6nnen Sie es installieren, und wahrscheinlich wird alles gut laufen. Aber wenn ClickHouse bereits stabil ist, achten Sie auf die&nbsp;Patches und Updates&nbsp;\u2014 welche Probleme wir beheben.<\/p>\n<p><\/p>\n<p><strong>Kirill Shvakov:<\/strong> Ich m\u00f6chte ein wenig \u00fcber Testumgebungen erg\u00e4nzen. Jeder hat gro\u00dfe Angst vor Testumgebungen und denkt aus irgendeinem Grund, dass, wenn Sie einen sehr gro\u00dfen ClickHouse-Cluster haben, die Testumgebung nicht weniger oder zumindest zehnmal kleiner sein sollte. Das ist ganz und gar nicht der Fall.<\/p>\n<p><\/p>\n<p>Ich kann aus meiner eigenen Erfahrung sprechen. Ich habe ein Projekt, und dort gibt es ClickHouse. Unsere Testumgebung daf\u00fcr&nbsp;\u2014 ist eine kleine virtuelle Maschine bei Hetzner f\u00fcr zwanzig Euro, wo alles vollst\u00e4ndig bereitgestellt ist. Um das zu tun, haben wir eine vollst\u00e4ndige Automatisierung in Ansible, und daher spielt es im Grunde keine Rolle, ob wir auf physische Server gehen oder einfach in virtuellen Maschinen bereitgestellt werden.<\/p>\n<p><\/p>\n<p>Was kann man tun? Es w\u00e4re sinnvoll, in der ClickHouse-Dokumentation ein Beispiel zu erstellen, wie man sich einen kleinen Cluster aufsetzt \u2013 in Docker, in LXC. Vielleicht k\u00f6nnte man ein Ansible-Playbook erstellen, da verschiedene Leute unterschiedliche Deployments haben. Das w\u00fcrde vieles vereinfachen. Wenn man in f\u00fcnf Minuten einen Cluster aufbaut, ist es viel einfacher, etwas zu verstehen. Das ist wesentlich bequemer, denn in eine Produktionsversion zu gehen, die man nicht getestet hat, ist ein Weg ins Nichts. Manchmal funktioniert das, manchmal nicht. Daher ist es schlecht, auf Erfolg zu hoffen.<\/p>\n<p><\/p>\n<p><strong>Maxim Kotyakov, Senior Backend Engineer bei Avito:<\/strong> Ich m\u00f6chte noch etwas \u00fcber Testumgebungen aus der Reihe der Probleme gro\u00dfer Unternehmen hinzuf\u00fcgen. Wir haben einen vollst\u00e4ndigen Abnahme-Cluster von ClickHouse, der in Bezug auf Datenmodelle und Einstellungen eine genaue Kopie dessen ist, was in der Produktion l\u00e4uft. Dieser Cluster l\u00e4uft in ziemlich mageren Containern mit minimalen Ressourcen. Wir schreiben einen bestimmten Prozentsatz von Produktionsdaten hinein, gl\u00fccklicherweise haben wir die M\u00f6glichkeit, den Datenstrom in Kafka zu replizieren. Alles dort ist synchronisiert und skaliert \u2013 sowohl hinsichtlich der Kapazit\u00e4ten als auch des Stroms, und theoretisch sollte es sich bei gleichen Bedingungen wie die Produktion verhalten. Alles potenziell Explosive wird zuerst auf diesen Stand geschoben und bleibt einige Tage dort, um bereit zu werden. Aber nat\u00fcrlich ist diese L\u00f6sung teuer, aufwendig und mit nicht unerheblichen Wartungskosten verbunden. <\/p>\n<p><\/p>\n<p><strong>Alexej Milovidov:<\/strong> Ich werde erz\u00e4hlen, wie die Testumgebung unserer Freunde von Yandex.Metrica aussieht. Ein Cluster hatte \u00fcber 600 Server, ein anderer hatte 360, und es gibt noch einen dritten und mehrere Cluster. Die Testumgebung f\u00fcr einen von ihnen besteht einfach aus zwei Shards mit je zwei Replikaten. Warum zwei Shards? Damit es nicht nur einen gibt. Und auch Replikate, damit es diese gibt. Einfach eine minimale Anzahl, die man sich leisten kann.<\/p>\n<p><\/p>\n<p>Diese Testumgebung erm\u00f6glicht es, die Funktionsf\u00e4higkeit der Anfragen zu \u00fcberpr\u00fcfen und zu sehen, ob etwas Gr\u00f6\u00dferes kaputt gegangen ist. Aber oft treten Probleme ganz anderer Art auf, wenn alles funktioniert, aber es einige kleine \u00c4nderungen mit der Last gibt.<\/p>\n<p><\/p>\n<p>Ich gebe ein Beispiel. Wir haben beschlossen, die neue Version von ClickHouse zu installieren. Sie wurde in die Testumgebung hochgeladen, automatisierte Tests in Yandex.Metrica wurden durchgef\u00fchrt, die die Daten der alten und der neuen Version vergleichen, indem sie die gesamte Pipeline durchlaufen. Und nat\u00fcrlich sind die Tests in unserem CI alle gr\u00fcn. Andernfalls h\u00e4tten wir diese Version nicht einmal angeboten.<\/p>\n<p><\/p>\n<p>Alles ist bestens. Wir beginnen mit dem Rollout in die Produktion. Ich erhalte die Nachricht, dass die Last auf den Diagrammen mehrere Male gestiegen ist. Wir setzen die Version zur\u00fcck. Ich schaue mir das Diagramm an und sehe: Die Last ist w\u00e4hrend des Rollouts tats\u00e4chlich mehrere Male gestiegen und fiel wieder, als wir die Version zur\u00fccksetzten. Dann haben wir die Version wieder zur\u00fcckgesetzt. Und die Last stieg ebenso und fiel dann wieder. Die Schlussfolgerung ist also, dass die Last aufgrund des Rollouts gestiegen ist, nichts \u00dcberraschendes.<\/p>\n<p><\/p>\n<p>Es war schwierig, die Kollegen zu \u00fcberzeugen, die neue Version tats\u00e4chlich zu installieren. Ich sagte: \u201eAlles ist in Ordnung, rollt sie aus. Dr\u00fcckt die Daumen, es wird alles funktionieren. Jetzt ist die Last in den Diagrammen gestiegen, aber alles ist normal. Haltet durch.\u201c Insgesamt haben wir es so gemacht, und die Version wurde in die Produktion ausgerollt. Aber fast bei 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 abbrechen, tut dies jedoch nicht. Warum?<\/h2>\n<p><\/p>\n<blockquote><p>Ein Benutzer, ein Analyst, kam zu mir und stellte eine Anfrage, die meinen ClickHouse-Cluster zum Absturz brachte. Entweder einen Knoten oder den gesamten Cluster \u2013 je nachdem, in welche Replik oder Partition die Anfrage gelangte. Ich sehe, dass alle CPU-Ressourcen auf diesem Server im roten Bereich sind. Gleichzeitig antwortet ClickHouse weiterhin auf Anfragen. Und ich schreibe: \u201eZeig mir bitte die Prozessliste, welche Anfrage dieses Chaos verursacht hat.\u201c<\/p>\n<p>Ich finde diese Anfrage und schreibe ihm kill. Und ich sehe, dass nichts passiert. Mein Server ist im roten Bereich, ClickHouse gibt mir weiterhin Befehle zur\u00fcck und zeigt, dass der Server lebt, und alles ist gut. Aber ich habe eine Degradation bei allen Benutzeranfragen, es beginnt eine Degradation beim Schreiben in ClickHouse, und mein kill query funktioniert nicht. Warum? Ich dachte, dass kill query die Anfragen abbrechen sollte, aber das passiert nicht.<\/p><\/blockquote>\n<p>Jetzt wird die Antwort ziemlich seltsam sein. Der Punkt ist, dass kill query die Anfragen nicht abbricht. <\/p>\n<p><\/p>\n<p>Kill query stellt eine kleine Markierung unter dem Namen \u201eIch m\u00f6chte, dass diese Abfrage beendet wird\u201c. Bei der Verarbeitung jedes Datenblocks schaut die Abfrage auf diese Markierung. Wenn sie gesetzt ist, stoppt die Abfrage ihre Ausf\u00fchrung. Das bedeutet, dass niemand die Abfrage killt, sie muss alles selbst \u00fcberpr\u00fcfen und anhalten. Und das sollte in allen F\u00e4llen funktionieren, wenn die Abfrage sich im Zustand der Verarbeitung von Datenbl\u00f6cken befindet. Sie verarbeitet den n\u00e4chsten Datenblock, \u00fcberpr\u00fcft die Markierung und stoppt.<\/p>\n<p><\/p>\n<p>Das funktioniert nicht in F\u00e4llen, in denen die Abfrage an einer bestimmten Operation blockiert ist. Wahrscheinlich ist das nicht Ihr Fall, denn laut Ihren Aussagen verbraucht sie eine Menge Server-Ressourcen. M\u00f6glicherweise funktioniert dies nicht im Fall einer externen Sortierung und in einigen anderen Details. Aber insgesamt sollte das nicht der Fall sein, das ist ein Bug. Und das Einzige, was ich empfehlen 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 Leseanfragen?<\/h2>\n<p><\/p>\n<blockquote><p>Es gibt eine Tabelle, in der Aggregationen nach item gespeichert sind \u2013 verschiedene Z\u00e4hler. Die Anzahl der Zeilen betr\u00e4gt etwa hundert Millionen. Kann man mit einer vorhersehbaren Antwortzeit rechnen, wenn man 1K RPS auf 1K items abgibt? <\/p><\/blockquote>\n<p>Aus dem Kontext heraus geht es um die 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>Leseabfragen k\u00f6nnen sehr unterschiedlich sein. In select 1 kann ClickHouse etwa zehntausend Abfragen pro Sekunde ausf\u00fchren, daher erfordern selbst Abfragen zu einem einzigen Schl\u00fcssel bereits einige Ressourcen. Und solche gezielten Abfragen sind schwieriger als in irgendwelchen Key-Value-Datenbanken, denn f\u00fcr jedes Lesen muss ein Datenblock \u00fcber den Index gelesen werden. Der Index adressiert nicht jede Aufzeichnung, sondern jeden Bereich. Das hei\u00dft, man muss den gesamten Bereich lesen \u2013 das sind standardm\u00e4\u00dfig 8192 Zeilen. Und man muss einen komprimierten Datenblock von 64 Kb auf 1 Mb dekomprimieren. Normalerweise dauern solche gezielten Abfragen mehrere Millisekunden. Aber das ist die einfachste Variante.<\/p>\n<p><\/p>\n<p>Lassen Sie uns eine einfache Arithmetik ausprobieren. Wenn man einige Millisekunden mit tausend multipliziert, erh\u00e4lt man einige Sekunden. Es scheint zwar, dass man nicht tausend Anfragen pro Sekunde verwalten kann, aber in Wirklichkeit kann man es, weil wir mehrere Prozessorkerne haben. Grunds\u00e4tzlich kann ClickHouse manchmal 1000 RPS bew\u00e4ltigen, aber nur bei kurzen, punktuellen Anfragen.<\/p>\n<p><\/p>\n<p>Wenn Sie einen ClickHouse-Cluster nach der Anzahl einfacher Anfragen skalieren m\u00fcssen, empfehle ich als einfachste L\u00f6sung \u2014 die Anzahl der Repliken zu erh\u00f6hen und Anfragen an eine zuf\u00e4llige Replik zu senden. Wenn eine Replik bei Ihnen f\u00fcnfhundert Anfragen pro Sekunde verarbeitet, was durchaus realistisch ist, dann werden drei Repliken eineinhalb Tausend verarbeiten.<\/p>\n<p><\/p>\n<p>Man kann ClickHouse manchmal auch f\u00fcr die maximale Anzahl punktueller Lesevorg\u00e4nge optimieren. Was muss man daf\u00fcr tun? Zuerst die Granularit\u00e4t des Index verringern. Dabei sollte sie jedoch nicht auf eins reduziert werden, sondern so, dass die Anzahl der Eintr\u00e4ge im Index einige Millionen oder Dutzende Millionen pro Server betr\u00e4gt. Wenn die Tabelle hundert Millionen Zeilen hat, kann man eine Granularit\u00e4t von 64 festlegen.<\/p>\n<p><\/p>\n<p>Man kann die Gr\u00f6\u00dfe des komprimierten Blocks reduzieren. Daf\u00fcr gibt es Einstellungen. <strong>min compress block size<\/strong>, <strong>max compress block size<\/strong>Diese k\u00f6nnen verringert werden, die Daten k\u00f6nnen umgeschichtet werden, und dann werden punktuelle Anfragen schneller. Aber ClickHouse ist immer noch keine Key-Value-Datenbank. Eine gro\u00dfe Anzahl kleiner Anfragen ist ein Antipattern bei der Last.<\/p>\n<p><\/p>\n<p><strong>Kirill Shvakov:<\/strong> Ich gebe einen Rat, falls dort gew\u00f6hnliche Z\u00e4hler vorhanden sind. Dies ist eine ziemlich Standard-Situation, wenn in ClickHouse ein Z\u00e4hler gespeichert wird. Ich habe einen Benutzer, er kommt aus diesem oder jenem Land, es gibt noch ein drittes Feld, und ich muss etwas inkrementell erh\u00f6hen. Nehmen Sie MySQL, erstellen Sie einen eindeutigen Schl\u00fcssel \u2014 in MySQL ist er ein doppelter Schl\u00fcssel, in PostgreSQL ein Konflikt \u2014 und f\u00fcgen Sie es mit einem Pluszeichen hinzu. Das wird viel besser funktionieren. <\/p>\n<p><\/p>\n<p>Wenn Sie nur wenige Daten haben, gibt es keinen Sinn, ClickHouse zu verwenden. Es gibt gew\u00f6hnliche Datenbanken, und die machen das gut. <\/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 tunen, damit mehr Daten im Cache sind?<\/h2>\n<p><\/p>\n<blockquote><p>Stellen wir uns folgende Situation vor \u2014 auf den Servern sind 256 GB RAM installiert, im t\u00e4glichen Betrieb ben\u00f6tigt ClickHouse etwa 60-80 GB, im Peak bis zu 130. Was kann man aktivieren und optimieren, damit mehr Daten im Cache sind und folglich weniger Zugriffe auf die Festplatte stattfinden?<\/p><\/blockquote>\n<p>In der Regel bew\u00e4ltigt der Page-Cache des Betriebssystems diese Aufgabe gut. Wenn Sie einfach den Top-Bereich \u00f6ffnen und dort cached oder free sehen \u2014 es steht auch dort, wie viel zwischengespeichert ist \u2014 k\u00f6nnen Sie feststellen, dass der gesamte freie Speicherplatz f\u00fcr den Cache verwendet wird. Bei der Lekt\u00fcre werden diese Daten nicht von der Festplatte, sondern aus dem Arbeitsspeicher gelesen. Ich kann sagen, dass der Cache effektiv genutzt wird, da nur komprimierte Daten zwischengespeichert werden.<\/p>\n<p><\/p>\n<p>Dennoch, wenn Sie einige einfache Abfragen noch weiter beschleunigen m\u00f6chten, gibt es die M\u00f6glichkeit, den Cache f\u00fcr unkomprimierte Daten innerhalb von ClickHouse zu aktivieren. Das nennt sich <strong>uncompressed cache<\/strong>. Im Konfigurationsdatei config.xml stellen Sie die uncompressed cache size auf den gew\u00fcnschten Wert ein \u2014 ich empfehle, nicht mehr als die H\u00e4lfte des freien Arbeitsspeichers zu verwenden, weil der Rest f\u00fcr den Page-Cache ben\u00f6tigt wird. <\/p>\n<p><\/p>\n<p>Au\u00dferdem gibt es zwei Anfragen auf der Ebene der Einstellungen. Die erste Einstellung ist <strong>use uncompressed cache<\/strong> \u2014 aktiviert seine Nutzung. Es wird empfohlen, dies f\u00fcr alle Abfragen zu aktivieren, au\u00dfer f\u00fcr schwere Abfragen, die m\u00f6glicherweise alle Daten lesen und diesen Cache leeren k\u00f6nnten. Die zweite Einstellung ist etwas wie die maximale Anzahl an Zeilen f\u00fcr die Nutzung des Caches. Sie begrenzt automatisch gro\u00dfe Abfragen, damit sie am Cache vorbeigehen.<\/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 Speicher in RAM einstellen?<\/h2>\n<p><\/p>\n<blockquote><p>In der neuen ClickHouse-Dokumentation habe ich einen Abschnitt gefunden, der <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 SSDs. <\/p>\n<p>Es ist interessant, wie man dasselbe mit volume hot memory konfigurieren kann. Und noch eine Frage. Wie funktioniert der Select-Befehl mit dieser Datenorganisation? Wird er das gesamte Set lesen oder nur das, was sich auf der Festplatte befindet, und werden diese Daten im Speicher komprimiert? Und wie funktioniert der prewhere-Bereich bei dieser Datenorganisation?<\/p><\/blockquote>\n<p>Diese Einstellung beeinflusst die Speicherung von Datensegmenten, und ihr Format \u00e4ndert sich nicht.<br \/>\nLassen Sie uns das genauer betrachten. <\/p>\n<p><\/p>\n<p>Die Speicherung von Daten im Arbeitsspeicher kann konfiguriert werden. Alles, was f\u00fcr die Festplatte konfiguriert wird \u2014 das ist ihr Pfad. Sie erstellen eine tmpfs-Partition, die an einem bestimmten Pfad im Dateisystem eingeh\u00e4ngt ist. Sie geben diesen Pfad als Speicherort f\u00fcr die hei\u00dfeste Partition an, wo Datensegmente eintreffen und geschrieben werden, alles gut. <\/p>\n<p><\/p>\n<p>Ich empfehle das jedoch nicht aufgrund der niedrigen Zuverl\u00e4ssigkeit. Wenn Sie jedoch mindestens drei Replikate in verschiedenen Rechenzentren haben, ist das m\u00f6glich. Falls etwas passiert, k\u00f6nnen die Daten wiederhergestellt werden. Stellen wir uns vor, der Server wird pl\u00f6tzlich ausgeschaltet und dann wieder eingeschaltet. Der Abschnitt wurde erneut eingebunden, aber dort ist Leere. Der ClickHouse-Server stellt beim Start fest, dass diese Teile fehlen, obwohl sie laut den Metadaten von ZooKeeper vorhanden sein sollten. Er sieht nach, auf welchen Replikaten sie vorhanden sind, fordert sie an und l\u00e4dt sie herunter. Auf diese Weise werden die Daten wiederhergestellt. <\/p>\n<p><\/p>\n<p>In diesem Sinne unterscheidet sich die Speicherung von Daten im RAM prinzipiell nicht von der Speicherung auf der Festplatte, da die Daten beim Schreiben auf die Festplatte ebenfalls zun\u00e4chst in den Page-Cache gelangen und physisch verz\u00f6gert geschrieben werden. Das h\u00e4ngt von der Art der Einbindung des Dateisystems ab. Aber zur Sicherheit sage ich, dass ClickHouse fsync beim Insert nicht durchf\u00fchrt.<\/p>\n<p><\/p>\n<p>Dabei werden die Daten im RAM im genau gleichen Format gespeichert wie auf der Festplatte. Eine SELECT-Abfrage w\u00e4hlt ebenso die Teile aus, die gelesen werden m\u00fcssen, w\u00e4hlt in den Teilen die notwendigen Datenbereiche aus und liest sie. Das Prewhere funktioniert absolut gleich, unabh\u00e4ngig davon, ob die Daten im RAM oder auf 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 welcher Anzahl von eindeutigen Werten ist Low Cardinality effektiv?<\/h2>\n<p><\/p>\n<p>Low Cardinality ist clever aufgebaut. Es erstellt Datenw\u00f6rterb\u00fccher, aber diese sind lokal. Erstens, es gibt separate W\u00f6rterb\u00fccher f\u00fcr jedes St\u00fcck, zweitens k\u00f6nnen sie sogar innerhalb eines einzelnen St\u00fccks unterschiedlich f\u00fcr jeden Bereich sein. Wenn die Anzahl der einzigartigen Werte einen Schwellenwert erreicht \u2013 meines Wissens nach eine Million \u2013 wird das W\u00f6rterbuch einfach aufgeschoben und ein neues erstellt.<\/p>\n<p><\/p>\n<p>Die Antwort im Gro\u00dfen und Ganzen: F\u00fcr jeden lokalen Bereich \u2013 sagen wir f\u00fcr jeden Tag \u2013 ist Low Cardinality bis zu etwa einer Million einzigartiger Werte effizient. Danach gibt es einfach einen Fallback, bei dem viele verschiedene W\u00f6rterb\u00fccher verwendet werden, anstatt eines. Es funktioniert etwa so wie eine normale Spalte vom Typ String, vielleicht etwas weniger effizient, aber eine ernsthafte Leistungsverschlechterung wird nicht auftreten. <\/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>Welche besten Praktiken gibt es f\u00fcr die Volltextsuche in einer Tabelle mit f\u00fcnf Milliarden Zeilen?<\/h2>\n<p><\/p>\n<p>Es gibt verschiedene Antwortm\u00f6glichkeiten. Die erste w\u00e4re zu sagen, dass ClickHouse kein System f\u00fcr die Volltextsuche ist. Daf\u00fcr gibt es spezielle Systeme wie 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 Leute, die sagen, dass sie von Elasticsearch auf ClickHouse umsteigen.<\/p>\n<p><\/p>\n<p>Warum passiert das? Sie erkl\u00e4ren es damit, dass Elasticsearch ab bestimmten Datenmengen nicht mehr mit der Last fertig wird, angefangen bei der Erstellung von Indizes. Die Indizes werden zu umfangreich, und wenn man die Daten einfach in ClickHouse verschiebt, werden sie in mehreren Punkten effizienter gespeichert. Dabei sind die Suchanfragen oft nicht so, dass man in den gesamten Datenbestand nach einer bestimmten Phrase unter Ber\u00fccksichtigung der Morphologie suchen muss, sondern ganz anders. Zum Beispiel, um in den Protokollen der letzten Stunden nach einer bestimmten Byte-Untersequenz 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 sein wird. Und die gr\u00f6\u00dfte Datenk\u00fcrzung erfolgt genau im Datumsbereich. Innerhalb des gew\u00e4hlten Datumsbereichs kann man in der Regel auch eine Volltextsuche selbst mit der bruteforce-Methode mithilfe von like durchf\u00fchren. Der like-Operator in ClickHouse ist der effektivste like-Operator, den Sie finden k\u00f6nnen. Wenn Sie einen besseren finden, lassen Sie es mich wissen. <\/p>\n<p><\/p>\n<p>Aber trotzdem ist like ein Full Scan. Und ein Full Scan kann nicht nur in Bezug auf die CPU, sondern auch auf die Festplatte langsam sein. Wenn Sie pl\u00f6tzlich ein Terabyte Daten pro Tag haben und innerhalb eines Tages nach einem bestimmten Wort suchen, m\u00fcssen Sie ein Terabyte scannen. Und es wird sicherlich auf gew\u00f6hnlichen Festplatten gespeichert, und am Ende werden sie so beansprucht, dass Sie nicht mehr per SSH auf diesen Server zugreifen k\u00f6nnen.<\/p>\n<p><\/p>\n<p>In diesem Fall bin ich bereit, einen weiteren kleinen Trick anzubieten. Er geh\u00f6rt zur Kategorie experimentell \u2013 k\u00f6nnte funktionieren, k\u00f6nnte aber 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, sollte man genau verstehen, wie sie funktionieren: Was ein trigrammatischer Bloom-Filter ist und wie man seine Gr\u00f6\u00dfe w\u00e4hlt. Ich kann sagen, dass sie bei Anfragen nach seltenen Phrasen und Teilstrings, die selten in den Daten vorkommen, hilfreich sein werden. In diesem Fall werden Teilbereiche \u00fcber die Indizes ausgew\u00e4hlt und es werden weniger Daten gelesen.<\/p>\n<p><\/p>\n<p>K\u00fcrzlich wurden in ClickHouse noch fortschrittlichere Funktionen f\u00fcr die Volltextsuche eingef\u00fchrt. Erstens erm\u00f6glicht die Suche nun das Auffinden mehrerer Substrings in einem Durchgang, darunter Optionen unter 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 effektivste Option f\u00fcr Ihre Bed\u00fcrfnisse. <\/p>\n<p><\/p>\n<p>Es gibt jetzt auch die M\u00f6glichkeit, mehrere regul\u00e4re Ausdr\u00fccke in einem Durchgang zu suchen. Sie m\u00fcssen nicht X like ein Substring oder X like ein anderes Substring schreiben. Geben Sie einfach alles auf einmal ein, und es wird maximal effizient ausgef\u00fchrt.<\/p>\n<p><\/p>\n<p>Drittens gibt es jetzt die M\u00f6glichkeit der unscharfen Suche von RegEx und der unscharfen Suche von Substrings. Wenn jemand ein Wort mit einem Tippfehler eingegeben hat, wird es basierend auf 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 am besten den Zugriff auf ClickHouse f\u00fcr eine gro\u00dfe Anzahl von Benutzern?<\/h2>\n<p><\/p>\n<blockquote><p>Berichten Sie, wie man den Zugang f\u00fcr eine gro\u00dfe Anzahl von Nutzern und Analysten besser organisieren kann. Wie kann man Anfragen prioritieren, w\u00e4hrend man max gleichzeitige Anfragen und welche Werkzeuge verwendet?<\/p><\/blockquote>\n<p>Wenn der Cluster gro\u00df genug ist, w\u00e4re es eine gute L\u00f6sung, noch zwei Server einzurichten, die als Zugangspunkt f\u00fcr die Analysten dienen. Das hei\u00dft, Analysten sollen nicht auf bestimmte Shards des Clusters zugreifen, sondern einfach zwei leere Server ohne Daten erstellen und die Zugriffsrechte dort einrichten. Au\u00dferdem werden die Benutzereinstellungen bei verteilten Anfragen auf die entfernten Server \u00fcbertragen. Das bedeutet, dass Sie alles auf diesen beiden Servern einrichten, und die Einstellungen wirken sich auf den gesamten Cluster aus.<\/p>\n<p><\/p>\n<p>Im Prinzip sind diese Server ohne Daten, aber der Arbeitsspeicher ist f\u00fcr die Ausf\u00fchrung der Anfragen von gro\u00dfer Bedeutung. Die Festplatte kann auch f\u00fcr tempor\u00e4re Daten genutzt werden, wenn externe Aggregation oder externe Sortierung aktiviert ist.<\/p>\n<p><\/p>\n<p>Es ist wichtig, die Einstellungen zu pr\u00fcfen, die mit allen m\u00f6glichen Limits verbunden sind. Wenn ich jetzt als Analyst auf den Cluster \"Yandex.Metrika\" zugreife und eine Anfrage stelle, <strong>select count from hits<\/strong>, wird mir sofort eine Ausnahme angezeigt, dass ich die Anfrage nicht ausf\u00fchren kann. Die maximale Anzahl an Zeilen, die ich scannen darf, betr\u00e4gt einhundert Milliarden, w\u00e4hrend insgesamt f\u00fcnfzig Billionen in einer Tabelle im Cluster sind. 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>force index by date<\/strong>. Ich kann die Anfrage nicht ausf\u00fchren, wenn ich den Datumsbereich nicht angegeben habe. Man sollte nicht darauf vertrauen, dass die Analysten ihn manuell angeben. Ein typischer Fall ist \u2014 ein Datumsbereich wurde geschrieben, wo das Ereignisdatum zwischen einer Woche liegt. Und dann wurde einfach die Klammer an der falschen Stelle gesetzt, und statt und wurde oder \u2014 oder URL-\u00dcbereinstimmung. Wenn es keine Einschr\u00e4nkungen gibt, wird es die URL-Spalte scannen und einfach eine Menge Ressourcen verschwenden.<\/p>\n<p><\/p>\n<p>Dar\u00fcber hinaus gibt es in ClickHouse zwei Priorit\u00e4tseinstellungen. Leider sind sie sehr primitiv. Eine hei\u00dft einfach <strong>priority<\/strong>. Wenn die Priorit\u00e4t \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, wird die Anfrage mit dem h\u00f6heren Priorit\u00e4tswert, der einen niedrigeren Wert bedeutet, einfach ausgesetzt und funktioniert in dieser Zeit \u00fcberhaupt nicht.<\/p>\n<p><\/p>\n<p>Das ist eine sehr grobe Einstellung, und sie ist nicht geeignet f\u00fcr F\u00e4lle, in denen der Cluster st\u00e4ndig belastet ist. Aber wenn Sie kurze, impulsive Anfragen haben, die wichtig sind, und der Cluster haupts\u00e4chlich ungenutzt bleibt, ist eine solche Einstellung geeignet.<\/p>\n<p><\/p>\n<p>Die n\u00e4chste Priorit\u00e4tseinstellung hei\u00dft <strong>OS-Thread-Priorit\u00e4t<\/strong>. Es stellt einfach f\u00fcr alle Threads, die eine Anfrage ausf\u00fchren, den Wert nice f\u00fcr den Linux-Scheduler ein. Es funktioniert so lala, aber es funktioniert immerhin. Wenn man den minimalen Wert nice einstellt \u2014 dieser ist der gr\u00f6\u00dfte in der Gr\u00f6\u00dfe und somit die niedrigste Priorit\u00e4t \u2014 und f\u00fcr Anfragen mit hoher Priorit\u00e4t -19 einstellt, verbraucht die CPU niedrigpriorisierte Anfragen etwa viermal weniger als hochpriorisierte. <\/p>\n<p><\/p>\n<p>Au\u00dferdem muss die maximale Ausf\u00fchrungszeit der Anfrage eingestellt werden \u2014 sagen wir f\u00fcnf Minuten. Die minimale Geschwindigkeit der Anfragen ist das Wichtigste. Diese Einstellung gibt es schon lange und sie ist n\u00f6tig, um nicht nur zu behaupten, dass ClickHouse nicht h\u00e4ngt, sondern um dies auch zu erzwingen.<\/p>\n<p><\/p>\n<p>Stellen Sie sich vor, Sie stellen ein: Wenn eine Anfrage weniger als eine Million Zeilen pro Sekunde verarbeitet \u2014 das sollte nicht gemacht werden. Das beschmutzt unseren guten Ruf, unsere gute Datenbank. Lassen Sie uns das einfach verbieten. Dort gibt es tats\u00e4chlich zwei Einstellungen. Eine nennt sich <strong>min execution speed<\/strong> \u2014 in&nbsp;Zeilen pro&nbsp;Sekunde, und der zweite wird als Timeout vor der \u00dcberpr\u00fcfung der minimalen Ausf\u00fchrungsgeschwindigkeit bezeichnet&nbsp;\u2014 standardm\u00e4\u00dfig f\u00fcnfzehn Sekunden. Das hei\u00dft, f\u00fcnfzehn Sekunden sind m\u00f6glich, aber wenn es langsam ist, wird einfach eine Ausnahme ausgel\u00f6st \u2014 die Anfrage wird abgebrochen.<\/p>\n<p><\/p>\n<p>Es m\u00fcssen auch Quoten eingerichtet werden. In&nbsp;ClickHouse gibt es eine eingebaute M\u00f6glichkeit zur Quotenverwaltung, die den Ressourcenverbrauch z\u00e4hlt. Leider jedoch nicht von physischen Ressourcen wie CPU oder Festplatten, sondern von logischen&nbsp;\u2014 der Anzahl der verarbeiteten Anfragen, Zeilen und gelesenen Bytes. Und man kann beispielsweise maximal hundert Anfragen in&nbsp;f\u00fcnf Minuten und tausend Anfragen pro Stunde festlegen.<\/p>\n<p><\/p>\n<p>Warum ist das wichtig? Weil einige Analytics-Anfragen manuell direkt aus dem&nbsp;ClickHouse-Client ausgef\u00fchrt werden. Und es wird gut funktionieren. Aber wenn Sie in&nbsp;Ihrem Unternehmen fortgeschrittene Analysten haben, werden sie ein Skript schreiben, und im&nbsp;Skript kann ein Fehler sein. Und dieser Fehler k\u00f6nnte dazu f\u00fchren, dass die Anfrage in&nbsp;einer Endlosschleife ausgef\u00fchrt wird. Dagegen muss man sich 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 Kunden weitergeben?<\/h2>\n<p><\/p>\n<blockquote><p>Wir haben mehrere Benutzer, die gerne mit sehr gro\u00dfen Anfragen zur gleichen Zeit kommen. Die Anfrage ist gro\u00df, wird grunds\u00e4tzlich schnell ausgef\u00fchrt, aber da es viele solche Anfragen gleichzeitig gibt, wird es sehr schmerzhaft. Ist es m\u00f6glich, dieselbe Anfrage, die zehnmal hintereinander angekommen ist, einmal auszuf\u00fchren und das Ergebnis zehn Kunden zur Verf\u00fcgung zu stellen?<\/p><\/blockquote>\n<p>Das Problem ist, dass wir keine Ergebnisse aus dem Cache oder den Zwischendaten haben. Es gibt den Page Cache des Betriebssystems, der verhindert, dass Daten erneut von der Festplatte gelesen werden, aber leider m\u00fcssen die Daten trotzdem entpackt, deserialisiert und erneut verarbeitet werden. <\/p>\n<p><\/p>\n<p>Wir m\u00f6chten das irgendwie vermeiden, entweder durch Caching von Zwischendaten oder indem wir \u00e4hnliche Anfragen in eine Warteschlange einreihen und Ergebnisse cachen. Aktuell haben wir einen Pull Request in der Entwicklung, der das Caching von Anfragen hinzuf\u00fcgt, aber nur f\u00fcr Unterabfragen im Zusammenhang mit in und join \u2013 das bedeutet, dass die L\u00f6sung unvollst\u00e4ndig ist.<\/p>\n<p><\/p>\n<p>Dennoch haben wir auch eine solche Situation. Ein besonders typisches Beispiel sind Abfragen mit Paginierung. Es gibt einen Bericht, in dem es mehrere Seiten gibt, und es wird die Anfrage limit 10 gestellt. Dann das Gleiche, aber limit 10,10. Dann die n\u00e4chste Seite. Und die Frage ist, warum wir das jeweils st\u00e4ndig berechnen? Aber derzeit gibt es keine L\u00f6sung, und dies kann nicht vermieden werden.<\/p>\n<p><\/p>\n<p>Es gibt eine alternative L\u00f6sung, die als Sidecar neben ClickHouse platziert wird \u2014 <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/Vertamedia\/chproxy\">ClickHouse Proxy<\/a><\/noindex>.<\/p>\n<p><\/p>\n<p><strong>Kirill Shvakov:<\/strong> In ClickHouse Proxy gibt es einen eingebauten Ratenbegrenzer und einen eingebauten Ergebniscache. Es wurden viele Einstellungen vorgenommen, weil ein \u00e4hnliches Problem gel\u00f6st werden musste. Proxy erm\u00f6glicht es, Anfragen zu limitieren, sie in eine Warteschlange zu stellen und zu konfigurieren, wie lange der Anfragecache besteht. Wenn die Anfragen tats\u00e4chlich identisch waren, gibt Proxy sie mehrfach zur\u00fcck, w\u00e4hrend er nur einmal zu ClickHouse geht.<\/p>\n<p><\/p>\n<p>Nginx hat auch einen Cache in der kostenlosen Version, und das wird ebenfalls funktionieren. Nginx hat sogar Einstellungen, dass, wenn Anfragen gleichzeitig eintreffen, er andere verlangsamt, bis eine ausgef\u00fchrt wird. Doch die Einstellung in ClickHouse Proxy ist viel besser. Es wurde speziell f\u00fcr ClickHouse, genau f\u00fcr solche Anfragen, entwickelt und ist daher passender. 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 Sichten um?<\/h2>\n<p><\/p>\n<blockquote><p>Es gibt ein Problem, dass Operationen mit der Replacing-Engine asynchron sind \u2014 zuerst werden Daten geschrieben, dann erfolgt ihre Zusammenfassung. Wenn sich unter der Tabelle eine materialisierte Tabelle mit irgendwelchen Aggregaten befindet, werden Duplikate in diese geschrieben. Und wenn es keine komplexe Logik gibt, werden die Daten dupliziert. Was kann man damit tun?<\/p>\n<p>Es gibt eine offensichtliche L\u00f6sung \u2014 einen Trigger f\u00fcr eine bestimmte Klasse von Materialized Views bei der asynchronen Zusammenfassungsoperation zu implementieren. Gibt es irgendwelche \u201eSilbergeschosse\u201c, Pl\u00e4ne zur Implementierung solcher Funktionalit\u00e4ten?<\/p><\/blockquote>\n<p>Es lohnt sich, sich mit der Funktionsweise der Deduplication zu besch\u00e4ftigen. Das, was ich jetzt erz\u00e4hlen werde, geh\u00f6rt nicht zur Frage, aber es ist f\u00fcr den Fall, dass es wert ist, daran zu denken.<\/p>\n<p><\/p>\n<p>Beim Einf\u00fcgen in eine replizierte Tabelle findet eine vollst\u00e4ndige Duplikatsbeseitigung der eingef\u00fcgten Bl\u00f6cke statt. Wenn Sie denselben Block erneut eingef\u00fcgt haben, der die gleiche Anzahl der gleichen Zeilen in derselben Reihenfolge enth\u00e4lt, werden die Daten dedupliziert. Sie erhalten \"Ok\" als Antwort auf das Insert, aber tats\u00e4chlich wird nur eine Datencharge aufgezeichnet, und diese wird nicht dupliziert.<\/p>\n<p><\/p>\n<p>Das ist notwendig f\u00fcr die Klarheit. Wenn Sie w\u00e4hrend des Einf\u00fcgens \"Ok\" erhalten haben, bedeutet das, dass Ihre Daten eingef\u00fcgt wurden. Wenn Sie einen Fehler von ClickHouse erhalten haben, bedeutet das, dass sie nicht eingef\u00fcgt wurden, und das Einf\u00fcgen muss wiederholt werden. Wenn die Verbindung w\u00e4hrend des Einf\u00fcgens jedoch unterbrochen wurde, wissen Sie nicht, ob die Daten eingef\u00fcgt wurden oder nicht. Die einzige Option ist, das Einf\u00fcgen erneut durchzuf\u00fchren. Wenn die Daten tats\u00e4chlich eingef\u00fcgt wurden und Sie sie erneut eingef\u00fcgt haben, gibt es eine Duplikatsbeseitigung der Bl\u00f6cke. Dies ist erforderlich, um Duplikate zu vermeiden. <\/p>\n<p><\/p>\n<p>Und es ist auch wichtig, wie es f\u00fcr materialisierte Ansichten funktioniert. Wenn die Daten bei der Einf\u00fcgung in die Haupttabelle dedupliziert wurden, gehen sie auch nicht in die materialisierte Ansicht.<\/p>\n<p><\/p>\n<p>Nun zu Ihrer Frage. Sie haben eine komplexere Situation, da Sie Duplikate einzelner Zeilen aufzeichnen. Das hei\u00dft, nicht ein ganzer Block wird dupliziert, sondern bestimmte Zeilen, und sie werden im Hintergrund reduziert. Tats\u00e4chlich werden die Daten in der Haupttabelle reduziert, w\u00e4hrend die nicht reduzierten in die materialisierte Ansicht gelangen und bei Merges passiert nichts mit den materialisierten Ansichten. Denn eine materialisierte Ansicht ist nichts anderes als ein Trigger auf Insert. Bei anderen Operationen passiert zus\u00e4tzlich nichts mit ihr.<\/p>\n<p><\/p>\n<p>Und ich kann hier leider keine gute Nachricht bringen. Es bleibt nur, eine spezifische L\u00f6sung f\u00fcr diesen Fall zu finden. Zum Beispiel, ob man in der materialisierten Ansicht ebenfalls ein Replacing vornehmen kann und ob die Methode zur Duplikatsbeseitigung m\u00f6glicherweise ebenfalls so funktioniert. Leider ist das nicht immer der Fall. Wenn sie aggregierend ist, funktioniert es nicht. <\/p>\n<p><\/p>\n<p><strong>Kirill Shvakov:<\/strong> Auch wir hatten zu diesem Zeitpunkt unser eigenes Konstruktionsproblem. Es gab die Herausforderung, dass es Anzeigen gibt und einige Daten, die wir in Echtzeit anzeigen k\u00f6nnen \u2014 das sind einfach Anzeigen. Die werden selten dupliziert, aber wenn das passiert, fassen wir sie dennoch sp\u00e4ter zusammen. Es gab Dinge, die man nicht duplizieren konnte \u2014 Klicks und all diese Dinge. Aber auch sie wollten wir m\u00f6glichst schnell anzeigen.<\/p>\n<p><\/p>\n<p>Wie wurden materialisierte Ansichten erstellt? Es gab Ansichten, in die direkt geschrieben wird \u2014 die Rohdaten werden aufgezeichnet und in die Ansichten geschrieben. Zu einem bestimmten Zeitpunkt sind die Daten dort nicht ganz korrekt, sie werden dupliziert und so weiter. Und es gibt einen zweiten Teil der Tabelle, der in seiner Erscheinung den materialisierten Ansichten v\u00f6llig gleicht, das hei\u00dft, in der Struktur sind sie absolut identisch. In regelm\u00e4\u00dfigen Abst\u00e4nden z\u00e4hlen wir die Daten neu, berechnen die Daten ohne Duplikate und schreiben in diese Tabellen. <\/p>\n<p><\/p>\n<p>Wir arbeiteten \u00fcber die API \u2014 mit ClickHouse w\u00fcrde das manuell nicht funktionieren. Die API pr\u00fcft: Wenn ich ein Datum des letzten Hinzuf\u00fcgens in die Tabelle habe, wo die Daten garantiert bereits korrekt und berechnet sind, macht es eine Anfrage an eine Tabelle und an eine andere Tabelle. Aus einer Tabelle w\u00e4hlt es bis zu einem bestimmten Zeitpunkt und erg\u00e4nzt mit der anderen Tabelle die noch nicht berechneten Daten. Und das funktioniert, aber nicht nur mit ClickHouse.<\/p>\n<p><\/p>\n<p>Wenn Sie eine API haben \u2014 f\u00fcr Analysten oder f\u00fcr Benutzer \u2014 ist das prinzipiell eine Option. Sie z\u00e4hlen immer nach, berechnen immer neu. Das kann einmal t\u00e4glich oder zu einem anderen Zeitpunkt geschehen. Sie w\u00e4hlen selbst den Bereich, der f\u00fcr Sie nicht notwendig und nicht kritisch ist.<\/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 im Moment 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 sogar standardm\u00e4\u00dfig aktiviert, in den alten Versionen mussten sie beim Upgrade aktiviert werden. Dennoch werden es immer mehr und mehr. Ich m\u00f6chte letztendlich sehen, was momentan 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 bestimmte Funktionalit\u00e4t f\u00fcr fertige Dashboards unterst\u00fctzen, die diese Protokolle bereits in Form eines fertigen Produkts anzeigen? Letztendlich ist es gro\u00dfartig, die Protokolle einfach in ClickHouse zu betrachten. Aber es w\u00e4re wirklich klasse, wenn es das bereits in Form eines Dashboards g\u00e4be. Das w\u00fcrde ich richtig genie\u00dfen. <\/p><\/blockquote>\n<p>Es gibt Dashboards, allerdings sind sie nicht standardisiert. In unserem Unternehmen nutzen etwa 60 Teams ClickHouse, und das Seltsame ist, dass viele von ihnen Dashboards erstellt haben, die sich geringf\u00fcgig unterscheiden. Einige Teams verwenden eine interne Installation von 'Yandex.Cloud'. Dort gibt es einige vorgefertigte Berichte, aber nicht alle notwendigen. Andere haben ihre eigenen. <\/p>\n<p><\/p>\n<p>Meine Kollegen von 'Metri\u0441s' haben ihr eigenes Dashboard in Grafana, und ich habe meins f\u00fcr deren Cluster. Dort sehe ich Dinge wie Cache-Hits f\u00fcr den Cache der Messungen. Und es wird sogar noch komplizierter, da wir verschiedene Werkzeuge verwenden. Ich habe mein Dashboard mit einem sehr alten Tool namens Graphite-web erstellt. Es sieht \u00fcberhaupt nicht sch\u00f6n aus. Und ich benutze es bis heute, obwohl Grafana wahrscheinlich benutzerfreundlicher und sch\u00f6ner w\u00e4re. <\/p>\n<p><\/p>\n<p>Die grundlegenden Dinge in Dashboards sind gleich. Es sind die Systemmetriken des Clusters: CPU, Speicher, Disk, Netzwerk. Andere sind die Anzahl der gleichzeitigen Anfragen, die Anzahl der gleichzeitigen Merges, die Anzahl der Anfragen pro Sekunde, die maximale Anzahl der St\u00fccke f\u00fcr die Partitionen der MergeTree-Tabellen, der Replizierungs-Lag, die Gr\u00f6\u00dfe der Replikationswarteschlange, die Anzahl der pro Sekunde eingef\u00fcgten Zeilen, die Anzahl der pro Sekunde eingef\u00fcgten Bl\u00f6cke. Das ist alles, was nicht aus Protokollen stammt, sondern aus Metriken.<\/p>\n<p><\/p>\n<p><strong>Wladimir Kolobajew:<\/strong> Alexey, ich m\u00f6chte das ein wenig korrigieren. Es gibt Grafana. Grafana hat eine Datenquelle, die ClickHouse ist. Das bedeutet, dass ich direkt aus Grafana Anfragen an ClickHouse stellen kann. In ClickHouse gibt es eine Tabelle mit den Protokollen, die f\u00fcr alle gleich ist. Ich m\u00f6chte schlie\u00dflich in Grafana auf diese Protokoll-Tabelle zugreifen und die Anfragen sehen, die mein Server stellt. Es w\u00e4re toll, ein solches Dashboard zu haben.<\/p>\n<p><\/p>\n<p>Ich habe es selbst gebastelt. Aber ich habe eine Frage: Wenn alles standardisiert ist und Grafana von allen genutzt wird, warum gibt es bei 'Yandex' kein entsprechendes offizielles Dashboard?<\/p>\n<p><\/p>\n<p><strong>Kirill Shvakov:<\/strong> Tats\u00e4chlich wird die Datenquelle, die mit ClickHouse verbunden ist, jetzt von Altinity unterst\u00fctzt. Und ich m\u00f6chte einfach eine Richtung geben, wo man graben und wer gepusht werden sollte. Man kann sie fragen, denn schlie\u00dflich macht Yandex ClickHouse und nicht die Geschichte drumherum. Altinity ist das Hauptunternehmen, das ClickHouse jetzt vorantreibt. Sie werden es nicht aufgeben, sondern weiterhin unterst\u00fctzen. Denn im Prinzip muss man sich nur registrieren und das Dashboard auf die Grafana-Website hochladen - es gibt keine besonderen Probleme. <\/p>\n<p><\/p>\n<p><strong>Alexej Milovidov:<\/strong> Im letzten Jahr wurden viele M\u00f6glichkeiten zur Profilierung von Abfragen in ClickHouse hinzugef\u00fcgt. Es gibt Metriken f\u00fcr jede Abfrage zur Ressourcennutzung. Vor kurzem wurde auch ein noch niedrigstufigerer Profiler f\u00fcr Abfragen hinzugef\u00fcgt, um zu sehen, wo jede Millisekunde von der Abfrage verbracht wird. Aber um diese Funktionalit\u00e4t zu nutzen, muss ich den Konsolenclient \u00f6ffnen und die Abfrage eingeben, die ich st\u00e4ndig vergesse. Ich habe sie irgendwo gespeichert und vergesse st\u00e4ndig, wo genau. <\/p>\n<p><\/p>\n<p>Ich w\u00fcnschte, es g\u00e4be ein Tool, in dem einfach geschrieben steht - hier sind Ihre schweren Abfragen, gruppiert nach Abfrageklassen. Wenn ich auf eine klicke, w\u00fcrde mir gesagt, dass sie deshalb schwer ist. Momentan gibt es keine solche L\u00f6sung. Es ist wirklich ziemlich seltsam, dass, wenn mich die Leute fragen: \u201eGibt es irgendwelche fertigen Dashboards f\u00fcr Grafana?\u201c ich sage: \u201eGehen Sie auf die Grafana-Website, dort gibt es die Community \u201eDashboards\u201c, und da ist ein Dashboard von Dima, ein Dashboard von Kostya. Was das genau ist, wei\u00df ich nicht, ich habe es selbst nicht genutzt.\"<\/p>\n<p><\/p>\n<h2 id=\"anchorzenanchorkak-vozdeystvovat-na-merdzhi-chtoby-server-ne-padal-vnbspoom\"><noindex><a rel=\"nofollow\" name=\"zen\"><\/a><\/noindex>Wie kann man auf die Merges einwirken, damit der Server nicht in OOM f\u00e4llt?<\/h2>\n<p><\/p>\n<blockquote><p>Ich habe eine Tabelle, in der es nur eine Partition gibt, sie ist ReplacingMergeTree. Ich schreibe seit vier Jahren Daten hinein. Ich musste in ihr einen Alter durchf\u00fchren und einige Daten l\u00f6schen.<\/p>\n<p>Ich habe das getan, und w\u00e4hrend der Verarbeitung dieser Abfrage wurde der gesamte Speicher auf allen Servern des Clusters verbraucht, und alle Server des Clusters fielen gemeinsam in OOM. Dann standen sie alle zusammen wieder auf, begannen den Merge von genau dieser Operation, diesem Datenblock durchzuf\u00fchren und fielen erneut in OOM. Dann standen sie wieder auf und fielen wieder. Und dieser Vorgang h\u00f6rte nicht auf.<\/p>\n<p>Es stellte sich heraus, dass es sich tats\u00e4chlich um einen Bug handelte, den die Jungs behoben haben. Das ist gro\u00dfartig, danke vielmals. Aber der Beigeschmack bleibt. Und jetzt, wenn ich dar\u00fcber nachdenke, dass ich einen Merge in einer Tabelle machen muss, frage ich mich: Warum kann ich nicht irgendwie Einfluss auf diese Merges nehmen? Zum Beispiel, sie hinsichtlich des ben\u00f6tigten Arbeitsspeichers zu begrenzen oder grunds\u00e4tzlich bez\u00fcglich der Anzahl, die diese spezielle Tabelle verarbeiten wird.<\/p>\n<p>Ich habe eine Tabelle namens \u201eMetriken\u201c, bitte bearbeite sie f\u00fcr mich in zwei Threads. Mach nicht zehn oder f\u00fcnf Merges parallel, mach es in zwei. Ich denke, dass ich in zwei genug Speicher habe, w\u00e4hrend es vielleicht nicht ausreicht, um zehn zu verarbeiten. Warum bleibt die Angst? Weil die Tabelle w\u00e4chst, und irgendwann werde ich mit der Situation konfrontiert, dass aufgrund der gro\u00dfen Datenmenge nicht genug Speicher auf dem Server zur Verf\u00fcgung steht. Und dann wird der Server bei einem Merge in OOM fallen. Die Mutation kann ich r\u00fcckg\u00e4ngig machen, die Merges aber nicht.<\/p><\/blockquote>\n<p>Wissen Sie, bei Merges wird der Server nicht in OOM fallen, da bei einem Merge nur der Arbeitsspeicher f\u00fcr einen kleinen Datenbereich ben\u00f6tigt wird. Es wird also unabh\u00e4ngig vom Datenvolumen alles gut sein.<\/p>\n<p><\/p>\n<p><strong>Wladimir Kolobajew:<\/strong> Gut. Hier ist der Punkt, dass, nachdem der Bugfix gemacht wurde, ich mir die neue Version heruntergeladen habe und an einer anderen, kleineren Tabelle mit vielen Partitionen einen \u00e4hnlichen Vorgang durchgef\u00fchrt habe. W\u00e4hrend des Merges wurden auf dem Server etwa 100 GB Arbeitsspeicher verbraucht. Ich hatte 150 besetzt, 100 wurden genutzt, und es blieben 50 GB Fenster, also bin ich nicht in OOM gefallen.<\/p>\n<p><\/p>\n<p>Was sch\u00fctzt mich im Moment davor, in OOM zu fallen, wenn es wirklich 100 GB Arbeitsspeicher ben\u00f6tigt? Was soll ich tun, wenn pl\u00f6tzlich der Arbeitsspeicher bei den Merges ausgeht?<\/p>\n<p><\/p>\n<p><strong>Alexej Milovidov:<\/strong> Es gibt ein Problem, dass der Verbrauch des Arbeitsspeichers genau bei Mergers nicht begrenzt ist. Und das zweite Problem ist, dass, wenn ein Merge festgelegt wurde, dieser ausgef\u00fchrt werden muss, da er im Replikationsprotokoll aufgezeichnet ist. Das Replikationsprotokoll sind die Handlungen, die erforderlich sind, um die Replik in einen konsistenten Zustand zu bringen. Wenn keine manuellen Manipulationen durchgef\u00fchrt werden, die dieses Replikationsprotokoll zur\u00fccksetzen, muss der Merge auf die ein oder andere Weise ausgef\u00fchrt werden.<\/p>\n<p><\/p>\n<p>Nat\u00fcrlich w\u00e4re es nicht schlecht, eine Begrenzung f\u00fcr den Arbeitsspeicher zu haben, die \u201ef\u00fcr den Fall der F\u00e4lle\u201c genau vor OOM sch\u00fctzt. Es wird dem Merge nicht helfen, er wird wieder beginnen, einen bestimmten Schwellenwert erreichen, eine Ausnahme ausl\u00f6sen und dann wieder beginnen \u2013 daraus wird nichts Gutes entstehen. Aber grunds\u00e4tzlich w\u00e4re es n\u00fctzlich, diese Begrenzung 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 ablaufen?<\/h2>\n<p><\/p>\n<blockquote><p>Der Golang-Treiber, den Kirill Shvakov geschrieben hat, wird jetzt offiziell, soweit ich wei\u00df, vom ClickHouse-Team unterst\u00fctzt. Er <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/ClickHouse\/clickhouse-go\">ist im ClickHouse-Repository<\/a><\/noindex>, er ist jetzt gro\u00df und echt.<\/p>\n<p>Eine kleine Anmerkung. Es gibt ein wunderbares und von allen geliebtes Speicherformat unendlicher Ordnung \u2014 Vertica. Auch sie haben ihren eigenen offiziellen Python-Treiber, der von den Entwicklern von Vertica unterst\u00fctzt wird. Es gab mehrmals Situationen, in denen die Versionen des Speichers und des Treibers stark auseinanderliefen, und der Treiber irgendwann nicht mehr funktionierte. Ein weiterer Punkt ist, dass die Unterst\u00fctzung f\u00fcr diesen offiziellen Treiber, meiner Meinung nach, im System \"Nippel\" l\u00e4uft \u2014 du schreibst ihnen ein Issue, und es h\u00e4ngt f\u00fcr immer.<\/p>\n<p>Ich habe zwei Fragen. Der Golang-Treiber von Kirill ist momentan die fast standardm\u00e4\u00dfige Methode, um aus Golang mit ClickHouse zu kommunizieren. Es sei denn, jemand kommuniziert immer noch \u00fcber das HTTP-Interface, weil er es so mag. Wie wird die Entwicklung dieses Treibers vorangehen? Wird sie mit den Breaking Changes im Speicher selbst synchronisiert? Und wie l\u00e4uft die Bearbeitung von Issues ab? <\/p><\/blockquote>\n<p><strong>Kirill Shvakov:<\/strong> Erstens \u2013 wie alles b\u00fcrokratisch organisiert ist. Dieser Punkt wurde nicht besprochen, daher kann ich darauf nicht antworten.<\/p>\n<p><\/p>\n<p>Um die Frage bez\u00fcglich des Issues zu beantworten, ist eine kleine Geschichte \u00fcber den Treiber n\u00f6tig. Ich arbeitete in einer Firma, die viele Daten hatte. Es war eine Werbeplattform mit einer riesigen Anzahl von Ereignissen, die irgendwo gespeichert werden mussten. Und irgendwann erschien ClickHouse. Wir haben Daten dorthin geleitet, und anfangs lief alles gut, aber dann fiel ClickHouse aus. Zu diesem Zeitpunkt entschieden wir, dass wir es nicht ben\u00f6tigen. <\/p>\n<p><\/p>\n<p>Ein Jahr sp\u00e4ter kamen wir zur\u00fcck zur Idee, ClickHouse zu nutzen, und wir mussten irgendwie Daten dorthin schreiben. Die Vorgabe war, dass die Hardware sehr schwach war und wenig Ressourcen zur Verf\u00fcgung standen. Aber so haben wir immer gearbeitet, also schauten wir in Richtung des nativen Protokolls.<\/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 in Vollzeit entwickelt \u2013 das war mein Arbeitsauftrag. Bis zu einem bestimmten Zeitpunkt haben wir ihn vorangetrieben, und im Prinzip hat niemand vermutet, dass au\u00dfer uns noch jemand ihn verwenden w\u00fcrde. Dann kam CloudFlare mit genau dem gleichen Problem, und eine Zeit lang arbeiteten wir sehr gut zusammen, da sie die gleichen Aufgaben hatten. Wir haben das sowohl in ClickHouse selbst als auch im Treiber gemacht. <\/p>\n<p><\/p>\n<p>Irgendwann habe ich einfach aufgeh\u00f6rt, mich damit zu besch\u00e4ftigen, weil sich meine Aktivit\u00e4ten im Hinblick auf ClickHouse und die Arbeit ein wenig ver\u00e4ndert haben. Daher werden die Issues nicht geschlossen. Gelegentlich committen Leute etwas ins Repository, die selbst etwas brauchen. Dann schaue ich mir den Pull Request an und \u00e4ndere manchmal sogar selbst etwas, aber das passiert selten.<\/p>\n<p><\/p>\n<p>Ich m\u00f6chte zum Treiber zur\u00fcckkehren. Vor einigen Jahren, als das Ganze begann, war ClickHouse auch anders und hatte andere M\u00f6glichkeiten. Jetzt haben wir eine Vorstellung davon, wie man den Treiber \u00fcberarbeiten kann, damit er gut funktioniert. Wenn das passiert, wird Version 2 auf jeden Fall aufgrund der angesammelten Hacks nicht kompatibel sein. <\/p>\n<p><\/p>\n<p>Wie man das organisieren kann, wei\u00df ich nicht. Ich habe selbst nicht so viel Zeit. Wenn einige Leute den Treiber weiterentwickeln, kann ich ihnen helfen und erz\u00e4hlen, was zu tun ist. Aber eine aktive Teilnahme von Yandex an der Entwicklung des Projekts wurde bisher nicht diskutiert. <\/p>\n<p><\/p>\n<p><strong>Alexej Milovidov:<\/strong> Tats\u00e4chlich gibt es bisher keine B\u00fcrokratie bez\u00fcglich dieser Treiber. Das Einzige ist, dass sie in eine offizielle Organisation \u00fcbertragen wurden, d. h. dieser Treiber wird als offizielle Standardl\u00f6sung f\u00fcr Go anerkannt. Es gibt einige andere Treiber, aber die kommen separat. <\/p>\n<p><\/p>\n<p>Bei uns gibt es intern keine Entwicklung f\u00fcr diese Treiber. Die Frage ist, ob wir jemanden einstellen k\u00f6nnen, der sich nicht nur um diesen spezifischen Treiber k\u00fcmmert, sondern um die Entwicklung aller Community-Treiber, oder ob wir jemand externen 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 bei aktivierter lazy_load-Einstellung nicht geladen. Was tun?<\/h2>\n<p><\/p>\n<blockquote><p>Wir haben die lazy_load-Einstellung aktiviert, und nach dem Neustart des Servers wird das W\u00f6rterbuch nicht automatisch geladen. Es wird nur geladen, wenn der Benutzer auf dieses W\u00f6rterbuch zugreift. Und beim ersten Zugriff gibt es einen Fehler. Kann man die W\u00f6rterb\u00fccher irgendwie automatisch mit den Mitteln von ClickHouse laden, oder m\u00fcssen wir stets deren Bereitstellung kontrollieren, damit die Benutzer keine Fehler erhalten?<\/p>\n<p>Vielleicht haben wir eine alte Version von ClickHouse, daher wurde das W\u00f6rterbuch nicht automatisch geladen. Kann das sein?<\/p><\/blockquote>\n<p>Erstens k\u00f6nnen W\u00f6rterb\u00fccher mit einer Anfrage gezwungen geladen werden. <strong>system reload dictionaries<\/strong>Zweitens, zur Fehlerbehebung \u2013 wenn das W\u00f6rterbuch bereits geladen ist, werden die Anfragen mit den bereits geladenen Daten verarbeitet. Wenn das W\u00f6rterbuch jedoch 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 bequem. Zum Beispiel m\u00fcssen eine Million Zeilen aus MySQL abgerufen werden. Jemand f\u00fchrt eine einfache Auswahl durch, aber diese Auswahl wartet auf genau diese Million Zeilen. Hier gibt es zwei L\u00f6sungen. Erstens \u2013 das lazy_load deaktivieren. Zweitens \u2013 wenn der Server hochf\u00e4hrt, bevor er belastet wird, durchf\u00fchren <strong>system reload dictionary<\/strong> oder einfach eine Anfrage ausf\u00fchren, die das W\u00f6rterbuch verwendet. Dann wird das W\u00f6rterbuch geladen. Es ist notwendig, die Verf\u00fcgbarkeit der W\u00f6rterb\u00fccher mit aktivierter lazy_load-Einstellung selbst zu \u00fcberwachen, da ClickHouse sie nicht automatisch nachl\u00e4dt.<\/p>\n<p><\/p>\n<p>Auf die letzte Frage lautet die Antwort \u2013 entweder ist die Version alt oder sie muss debugged 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 gehe ich damit um, dass system reload dictionaries kein einziges der vielen W\u00f6rterb\u00fccher l\u00e4dt, wenn auch nur eines von ihnen mit einem Fehler abst\u00fcrzt?<\/h2>\n<p><\/p>\n<blockquote><p>Es gibt auch 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 nach, und es ist erforderlich, das spezifische W\u00f6rterbuch manuell anhand seines Namens mit system reload dictionary zu laden. H\u00e4ngt das auch mit der Version von ClickHouse zusammen?<\/p><\/blockquote>\n<p>Ich m\u00f6chte Ihnen eine gute Nachricht \u00fcberbringen. Dieses Verhalten hat sich ge\u00e4ndert. Das bedeutet, wenn Sie ClickHouse aktualisieren, wird es sich auch \u00e4ndern. Wenn Ihnen das aktuelle Verhalten nicht gef\u00e4llt, <strong>system reload dictionaries<\/strong>, aktualisieren Sie, und wir hoffen, dass sich die Situation zum Besseren \u00e4ndert.<\/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 \u00e4ndern, ohne sie bei Fehlern preiszugeben?<\/h2>\n<p><\/p>\n<blockquote><p>Die n\u00e4chste Frage betrifft Fehler im Zusammenhang mit dem W\u00f6rterbuch, insbesondere die Zugangsdaten. Wir haben die Zugangsdaten f\u00fcr die Verbindung im ClickHouse-Config f\u00fcr das W\u00f6rterbuch angegeben, und im Falle eines Fehlers erhalten wir diese Zugangsdaten und das Passwort als Antwort. <\/p>\n<p>Wir haben diesen Fehler durch das Herausziehen der Zugangsdaten in die Konfiguration des ODBC-Treibers gel\u00f6st. Gibt es eine M\u00f6glichkeit, die Zugangsdaten in der ClickHouse-Konfiguration zu konfigurieren, ohne diese Zugangsdaten bei Fehlern offenzulegen?<\/p><\/blockquote>\n<p>Die L\u00f6sung besteht tats\u00e4chlich darin, diese credentials in der odbc.ini anzugeben und im ClickHouse nur den ODBC-Datenquellennamen anzugeben. F\u00fcr andere W\u00f6rterbuchquellen wird dies nicht der Fall sein \u2013 weder f\u00fcr das W\u00f6rterbuch mit MySQL noch f\u00fcr andere sollten Sie das Passwort bei einer Fehlermeldung sehen. Ich werde auch f\u00fcr ODBC schauen \u2013 wenn es dies 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-Meetings<\/h2>\n<p><\/p>\n<p>Beim Klick auf das Bild \u00f6ffnen sich Bonus-Hintergr\u00fcnde f\u00fcr die hartn\u00e4ckigsten Leser. Lassen Sie uns gemeinsam mit den Avito-Technologie-Maskottchen ein Feuer l\u00f6schen, besprechen Sie sich mit Kollegen aus dem B\u00fcro des Systemadministrators oder einem Old-School-Computerclub und ziehen Sie die t\u00e4glichen Besprechungen unter der Br\u00fccke vor einer Graffiti-Wand ab.<\/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.2 - 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.2\" \/>\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\udd47ClickHouse f\u00fcr fortgeschrittene Nutzer in Fragen und Antworten | ProHoster","description":"Im April trafen sich die Ingenieure von Avito zu einem Online-Gespr\u00e4ch mit dem Hauptentwickler von ClickHouse, Alexey 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}]}}