{"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\/da\/blog\/administrirovanie\/clickhouse-dlya-prodvinutyh-polzovatelej-v-voprosah-i-otvetah","title":{"rendered":"ClickHouse for avancerede brugere i sp\u00f8rgsm\u00e5l og svar","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p>I april planlagde Avitos ingeni\u00f8rer online sammenkomster med hovedudvikleren af ClickHouse, Alexey Milovidov, og Kirill Shvakov, Golang-udvikleren fra Integros. De diskuterede, hvordan vi bruger databasesystemet, og hvilke udfordringer vi st\u00e5r overfor. <\/p>\n<p><\/p>\n<p>Inspireret af m\u00f8det har vi samlet en artikel med svar fra eksperterne p\u00e5 vores og seernes sp\u00f8rgsm\u00e5l om backup, datasharding, eksterne ordb\u00f8ger, Golang-driveren og opdateringen af versioner af ClickHouse. Den kan v\u00e6re nyttig for udviklere, der allerede arbejder aktivt med Yandexs databaser og er interesseret i dens nutid og fremtid. Som standard er svarene fra Alexey Milovidov, medmindre andet er angivet. <\/p>\n<p><\/p>\n<p>Pas p\u00e5, der er meget tekst under klippet. Vi h\u00e5ber, at indholdet med sp\u00f8rgsm\u00e5lene vil hj\u00e6lpe dig med at finde vej.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"ClickHouse for avancerede brugere i sp\u00f8rgsm\u00e5l og svar\" 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\">Indhold<\/h2>\n<p><\/p>\n<ul>\n<li><noindex><a rel=\"nofollow\" href=\"#old-data\">ClickHouse opdateres konstant, mens vores data ikke g\u00f8r. Hvad skal der g\u00f8res ved det?<\/a><\/noindex> <\/li>\n<li><noindex><a rel=\"nofollow\" href=\"#backup-best-practicies\">Hvad er de bedste praksisser p\u00e5 nuv\u00e6rende tidspunkt for backup af data fra ClickHouse?<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"#replication\">Kan vi organisere kontrolleret eftersl\u00e6b af repliker i klyngerne?<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"#soooo-changeable\">Hvad skal vi g\u00f8re, hvis tabelstrukturen \u00e6ndrer sig?<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"#resharding-best-practices\">Hvilke bedste praksisser er der for \u00f8jeblikket inden for datasharding?<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"#clickhouse-copier\">ClickHouse har et v\u00e6rkt\u00f8j kaldet clickhouse-copier. Kan I fort\u00e6lle om det?<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"#resharding-tool\">I havde en pilotfunktion kaldet sharding. Hvad er status p\u00e5 den?<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"#move-to-slow-disk\">Kan alle datadelene samles f\u00f8r flytning til langsomme diske?<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"#up-to-date\">Hvordan opgraderer vi til nye versioner af ClickHouse, hvis vi ikke har mulighed for at teste kompatibiliteten p\u00e5 forh\u00e5nd?<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"#kill-query\">Kill query skal dr\u00e6be foresp\u00f8rgsler, men det g\u00f8r det ikke. Hvorfor?<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"#reading-time\">Hvordan beregner man svartiden under l\u00e6sende belastning?<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"#pimp-my-clickhouse\">Hvad skal tunes i ClickHouse for at f\u00e5 flere data i cachen?<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"#storage-configuration\">Hvordan kan man konfigurere storage_configuration til opbevaring i RAM?<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"#low-cardinality\">Op til hvor mange unikke v\u00e6rdier er Low Cardinality effektivt?<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"#fulltext-search\">Hvad er de bedste praksisser for fuldtekst-s\u00f8gning p\u00e5 en tabel med fem milliarder r\u00e6kker?<\/a><\/noindex> <\/li>\n<li><noindex><a rel=\"nofollow\" href=\"#hello-and-welcome\">Hvordan organiserer man adgangen til ClickHouse for et stort antal brugere?<\/a><\/noindex> <\/li>\n<li><noindex><a rel=\"nofollow\" href=\"#smorgasbord\">Er det muligt at sende resultaterne af en foresp\u00f8rgsel til ti kunder?<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"#asynchronous\">Hvad med asynkrone operationer og materialiserede visninger?<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"#dashboard\">ClickHouse genererer mange logs. Hvordan kan jeg se, hvad der sker med serveren i realtid?<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"#zen\">Hvordan kan man p\u00e5virke mergerne, s\u00e5 serveren ikke falder i OOM?<\/a><\/noindex> <\/li>\n<li><noindex><a rel=\"nofollow\" href=\"#go\">Hvordan vil udviklingen af Golang-driveren til ClickHouse foreg\u00e5?<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"#lazy-load\">Den eksterne ordbog indl\u00e6ses ikke efter genstart med lazy_load-indstillingen aktiv. Hvad skal der g\u00f8res?<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"#reload-dictionaries\">Hvordan h\u00e5ndterer man, at system reload dictionaries ikke indl\u00e6ser nogen af de mange ordb\u00f8ger, hvis blot en af dem fejler med en fejl?<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"#connection\">Er der en m\u00e5de at konfigurere legitimationsoplysninger i ClickHouse-konfigurationen, uden at de vises ved fejl?<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"#zoom-backgrounds\">Bonus: baggrunde til Zoom fra sammenkomster<\/a><\/noindex><\/li>\n<\/ul>\n<p><\/p>\n<blockquote><p>Hvis du ikke har lyst til at l\u00e6se teksten, kan du se optagelsen af m\u00f8det. <noindex><a rel=\"nofollow\" href=\"https:\/\/www.youtube.com\/watch?v=n1tm4j4W8ZQ&amp;t=8147s\">p\u00e5 vores YouTube-kanal<\/a><\/noindex>. Tidskoder findes i den f\u00f8rste kommentar under videoen.<\/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 opdateres konstant, men vores data opdateres ikke. Hvad skal vi g\u00f8re ved det?<\/h2>\n<p><\/p>\n<blockquote><p>ClickHouse opdateres konstant, men vores data, som blev optimeret og behandlet, bliver ikke opdateret og ligger i backup. <\/p>\n<p>Antag, at vi har haft et problem, og data er blevet tabt. Vi besluttede at genskabe, og det viste sig, at de gamle partitioner, som ligger p\u00e5 sikkerhed i backup-servere, er meget forskellige fra den version af ClickHouse, vi bruger nu. Hvad skal man g\u00f8re i s\u00e5dan en situation, og er det muligt?<\/p><\/blockquote>\n<p>Situationen, hvor du gendanner data fra en backup i det gamle format, og de ikke kan tilsluttes i den nye version, er umulig. Vi sikrer, at dataformatet i ClickHouse altid forbliver bagudkompatibelt. Dette er meget vigtigere end bagudkompatibilitet i funktionalitet, hvis adf\u00e6rden for en sj\u00e6ldent brugt funktion \u00e6ndrer sig. Data, der er gemt p\u00e5 disk, skal den nye version af ClickHouse altid kunne l\u00e6se. Det er en regel. <\/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>Hvad er de bedste praksisser p\u00e5 nuv\u00e6rende tidspunkt for backup af data fra ClickHouse?<\/h2>\n<p><\/p>\n<blockquote><p>Hvordan laver man backups med hensyn til, at vi har operationer p\u00e5 optimize final, en enorm database p\u00e5 terabyte, og data, der opdateres, antager vi, for de sidste tre dage, mens der ikke sker nogen procedurer derefter? <\/p>\n<p>Vi kan finde p\u00e5 vores eget l\u00f8sning og skrive i bash: saml disse backups p\u00e5 en bestemt m\u00e5de. M\u00e5ske er der ikke behov for at finde p\u00e5 noget, og cyklen er allerede blevet opfundet? <\/p><\/blockquote>\n<p>For det f\u00f8rste hvad ang\u00e5r bedste praksis. Mine kolleger anbefaler altid, n\u00e5r sp\u00f8rgsm\u00e5l om backups stilles, at minde om tjenesten \u00abYandex.Cloud\u00bb, hvor denne opgave allerede er l\u00f8st. S\u00e5 brug det, hvis det er muligt. <\/p>\n<p><\/p>\n<p>Der er ikke en fuldst\u00e6ndig l\u00f8sning, som er hundrede procent indbygget i ClickHouse til backups. Der er nogle skabeloner, der kan bruges. For at f\u00e5 en komplet l\u00f8sning skal man enten arbejde lidt manuelt, eller lave indpakninger i form af scripts.<\/p>\n<p><\/p>\n<p>Jeg vil begynde med de enkleste l\u00f8sninger og afslutte med de mest avancerede afh\u00e6ngigt af datam\u00e6ngden og st\u00f8rrelsen p\u00e5 klyngen. Jo st\u00f8rre klyngen er, desto mere kompleks bliver l\u00f8sningen.<\/p>\n<p><\/p>\n<p>Hvis tabellen med data kun er et par gigabyte, kan backupen laves p\u00e5 f\u00f8lgende m\u00e5de: <\/p>\n<p><\/p>\n<ol>\n<li>Gem tabeldefinitionerne, det vil sige metadataene \u2014 <strong>show create table<\/strong>.<\/li>\n<li>Opret et dump ved hj\u00e6lp af ClickHouse-klienten \u2014 <strong>select<\/strong> * <strong>from table<\/strong> til en fil. Som standard f\u00e5r du en fil i TabSeparated-format. Hvis du \u00f8nsker det mere effektivt, kan du v\u00e6lge Native-format. <\/li>\n<\/ol>\n<p><\/p>\n<p>Hvis datam\u00e6ngden er st\u00f8rre, vil backupen tage l\u00e6ngere tid og optage mere plads. Dette kaldes en logisk backup, som ikke er bundet til ClickHouse-dataformatet. Hvis det er tilg\u00e6ngeligt, kan du i n\u00f8dstilf\u00e6lde tage backupen og uplode den til MySQL for gendannelse. <\/p>\n<p><\/p>\n<p>Til mere avancerede tilf\u00e6lde er der i ClickHouse indbygget mulighed for at oprette snapshot af partitioner i det lokale filsystem. Denne mulighed er tilg\u00e6ngelig som en foresp\u00f8rgsel <strong>alter table freeze partition<\/strong>. Eller blot <strong>alter table freeze<\/strong> \u2014 dette er et snapshot af hele tabellen. <\/p>\n<p><\/p>\n<p>Snapshotet vil blive oprettet konsistent for \u00e9n tabel p\u00e5 \u00e9n shard, hvilket vil sige, at det ikke er muligt at lave et konsistent snapshot af hele klyngen p\u00e5 denne m\u00e5de. Men til de fleste opgaver er s\u00e5dan en n\u00f8dvendighed ikke til stede, og det er tilstr\u00e6kkeligt at udf\u00f8re foresp\u00f8rgslen p\u00e5 hver shard for at f\u00e5 et konsistent snapshot. Det oprettes som hard links og optager derfor ikke ekstra plads. Herefter kopierer du dette snapshot til backup-serveren eller til det lager, du bruger til backups.<\/p>\n<p><\/p>\n<p>Det er relativt nemt at gendanne en s\u00e5dan backup. F\u00f8rst \u2014 opretter du tabeller efter de eksisterende tabeldefinitioner. Derefter kopierer du de gemte snapshots af partitioner til Directory-Detached for de relevante tabeller og udf\u00f8rer foresp\u00f8rgslen <strong>attach partition<\/strong>. Denne l\u00f8sning er helt passende til de mest seri\u00f8se datam\u00e6ngder. <\/p>\n<p><\/p>\n<p>Nogle gange kr\u00e6ves der noget endnu mere avanceret \u2014 i de tilf\u00e6lde, hvor du har titusinder eller endda hundredtusinder af terabyte p\u00e5 hver server og hundredvis af servere. Her er der en l\u00f8sning, som jeg har set hos mine kolleger fra \"Yandex.Metrica\". Jeg vil ikke anbefale den til alle \u2014 l\u00e6s det og beslutte selv, om det er passende eller ej. <\/p>\n<p><\/p>\n<p>F\u00f8rst skal der oprettes flere servere med store diskoph\u00e6ng. Dern\u00e6st skal der p\u00e5 disse servere installeres flere ClickHouse-servere og konfigureres, s\u00e5 de fungerer som endnu en replika for de samme shards. Derefter kan man bruge et filsystem eller et v\u00e6rkt\u00f8j, der tillader oprettelse af snapshots. Der er to muligheder. Den f\u00f8rste mulighed er LVM-snapshots, den anden mulighed er ZFS p\u00e5 Linux. <\/p>\n<p><\/p>\n<p>Efter dette skal der dagligt oprettes et snapshot, som vil optage plads. Naturligvis, hvis data \u00e6ndres, vil pladsen over tid stige. Dette snapshot kan tilg\u00e5s n\u00e5r som helst for at genskabe data, det er en m\u00e6rkelig l\u00f8sning. Derudover skal disse replikater begr\u00e6nses i konfigurationen, s\u00e5 de ikke fors\u00f8ger at blive ledere.<\/p>\n<p><\/p>\n<h2 id=\"anchorreplicationanchormozhno-li-budet-organizovat-kontroliruemoe-otstavanie-replik-vnbspvalah\"><noindex><a rel=\"nofollow\" name=\"replication\"><\/a><\/noindex>Kan vi organisere kontrolleret eftersl\u00e6b af repliker i klyngerne?<\/h2>\n<p><\/p>\n<blockquote><p>I \u00e5r planl\u00e6gger I at lave valser i ClickHouse. Vil det v\u00e6re muligt at organisere kontrolleret forsinkelse af replikaterne? Vi \u00f8nsker at bruge det til at beskytte os mod negative scenarier med altereringer og andre \u00e6ndringer. <\/p>\n<p>Er det muligt at lave nogen form for rollback for altrene? For eksempel i den eksisterende valse, at sige at indtil dette tidspunkt skal \u00e6ndringerne anvendes, og fra dette tidspunkt skal \u00e6ndringerne ikke l\u00e6ngere anvendes?<\/p>\n<p>Hvis en kommando kom ind i vores klynge og \u00f8delagde den, s\u00e5 har vi en betinget replika med en forsinkelse p\u00e5 en time, hvor vi kan sige, at lad os bruge netop denne p\u00e5 nuv\u00e6rende tidspunkt, men vi vil ikke anvende de sidste ti minutters \u00e6ndringer p\u00e5 den? <\/p><\/blockquote>\n<p>F\u00f8rst om kontrolleret forsinkelse af replikater. Der var en s\u00e5dan foresp\u00f8rgsel fra brugerne, og vi oprettede en issue p\u00e5 GitHub med anmodningen: \"Hvis nogen har brug for det, s\u00e5 giv et like, giv et hjerte.\" Ingen gav et like, og issue blev lukket. Ikke desto mindre kan man allerede nu opn\u00e5 en s\u00e5dan mulighed ved at konfigurere ClickHouse. Dog kun fra version 20.3.<\/p>\n<p><\/p>\n<p>ClickHouse udf\u00f8rer konstant sammenfletning af data i baggrunden \u2014 merge. N\u00e5r en merge er gennemf\u00f8rt, bliver et s\u00e6t dataudsnit erstattet med et st\u00f8rre udsnit. Tidligere dataudsnit forbliver dog p\u00e5 disken i nogen tid.<\/p>\n<p><\/p>\n<p>For det f\u00f8rste, de forts\u00e6tter med at blive opbevaret, s\u00e5 l\u00e6nge der findes select-foresp\u00f8rgsler, der bruger dem, for at sikre en ikke-blokerende drift. Select-foresp\u00f8rgsler kan roligt l\u00e6se fra gamle stykker.<\/p>\n<p><\/p>\n<p>For det andet er der ogs\u00e5 en tidsgr\u00e6nse \u2014 gamle datastykker ligger p\u00e5 disken i otte minutter. Disse otte minutter kan konfigureres og endda \u00e6ndres til en dag. Det vil koste plads p\u00e5 disken: afh\u00e6ngigt af datatrafikken kan det vise sig, at dataene ikke bare fordobles, men kan blive fem gange st\u00f8rre. Men hvis der er alvorlige problemer, kan du stoppe ClickHouse-serveren og f\u00e5 det hele ordnet.<\/p>\n<p><\/p>\n<p>Nu opst\u00e5r sp\u00f8rgsm\u00e5let om, hvordan dette beskytter mod alters. Her skal vi se dybere, for i de gamle versioner af ClickHouse arbejdede alters p\u00e5 den m\u00e5de, at de blot direkte \u00e6ndrede stykker. Der er et datastykke med nogle filer, og vi g\u00f8r for eksempel, <strong>ALTER DROP COLUMN<\/strong>. S\u00e5 fjernes denne kolonne fysisk fra alle stykker.<\/p>\n<p><\/p>\n<p>Men fra version 20.3 blev mekanismen for alters helt \u00e6ndret, og nu er datastykkerne altid immutable. De \u00e6ndres slet ikke \u2014 alters fungerer nu omtrent som merges. I stedet for at \u00e6ndre et stykke p\u00e5 stedet, opretter vi et nyt. I det nye stykke bliver de filer, der ikke er \u00e6ndret, hardlinks, og hvis vi har slettet en kolonne, vil den simpelthen ikke v\u00e6re til stede i det nye stykke. Det gamle stykke vil som standard blive slettet efter otte minutter, og her kan indstillingerne justeres, som n\u00e6vnt ovenfor. <\/p>\n<p><\/p>\n<p>Det samme g\u00e6lder for alters af mutations-typen. N\u00e5r du laver <strong>ALTER DELETE<\/strong> eller <strong>ALTER UPDATE<\/strong>, \u00e6ndres fragmentet ikke, men et nyt oprettes. Det gamle slettes derefter.<\/p>\n<p><\/p>\n<h2 id=\"anchorsoooo-changeableanchorkak-byt-esli-struktura-tablicy-pomenyalas\"><noindex><a rel=\"nofollow\" name=\"soooo-changeable\"><\/a><\/noindex>Hvad skal vi g\u00f8re, hvis tabelstrukturen \u00e6ndrer sig?<\/h2>\n<p><\/p>\n<blockquote><p>Hvordan gendanner man en backup, der blev lavet med den gamle struktur? Og det andet sp\u00f8rgsm\u00e5l handler om casen med snapshots og filsystemv\u00e6rkt\u00f8jer. Er Btrfs passende i stedet for ZFS p\u00e5 Linux LVM?<\/p><\/blockquote>\n<p>Hvis du laver <strong>attach partition<\/strong> delinger med en anden struktur, s\u00e5 vil ClickHouse fort\u00e6lle dig, at det ikke er muligt. L\u00f8sningen er denne. F\u00f8rst \u2014 opret en midlertidig tabel af typen MergeTree med den gamle struktur, knyt dataene til den ved hj\u00e6lp af attach, foretag en alter-foresp\u00f8rgsel. Derefter kan man enten kopiere eller flytte disse data og lave attach igen, eller bruge en foresp\u00f8rgsel. <strong>alter table move partition<\/strong>.<\/p>\n<p><\/p>\n<p>Dette bringer os til det andet sp\u00f8rgsm\u00e5l \u2014 kan man bruge Btrfs? For det f\u00f8rste, hvis du har LVM, er LVM-snapshots tilstr\u00e6kkelige, og filsystemet kan v\u00e6re ext4, det betyder ikke noget. Med Btrfs afh\u00e6nger alt af din erfaring med det. Det er et modent filsystem, men der er stadig nogle tvivl om, hvordan det vil fungere i praksis i en bestemt situation. Jeg ville ikke anbefale at bruge det, hvis du ikke har Btrfs i produktion.<\/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>Hvilke bedste praksisser er der for \u00f8jeblikket inden for datasharding?<\/h2>\n<p><\/p>\n<p>Sp\u00f8rgsm\u00e5let om reshadering er komplekst og mangesidet. Man kan svare p\u00e5 det p\u00e5 flere m\u00e5der. Man kan tage den ene vinkel og sige, at der ikke er en indbygget mulighed for reshadering i ClickHouse. Men jeg frygter, at dette svar ikke vil v\u00e6re tilfredsstillende for nogen. Derfor kan man tage en anden vej og sige, at ClickHouse har mange metoder til at reshader data. <\/p>\n<p><\/p>\n<p>Hvis der ikke er mere plads p\u00e5 klyngen, eller hvis den ikke kan h\u00e5ndtere belastningen, tilf\u00f8jer du nye servere. Men disse servere er som standard tomme, der er ingen data p\u00e5 dem, og der er ingen belastning. Du skal omfordele dataene, s\u00e5 de bliver j\u00e6vnt fordelt over den nye, nu st\u00f8rre klynge.<\/p>\n<p><\/p>\n<p>Den f\u00f8rste metode til at g\u00f8re dette er at kopiere nogle partitioner til de nye servere ved hj\u00e6lp af en foresp\u00f8rgsel. <strong>alter table fetch partition<\/strong>For eksempel, hvis du havde partitioner efter m\u00e5neder, kan du tage den f\u00f8rste m\u00e5ned i 2017 og kopiere den til en ny server, og derefter kopiere den tredje m\u00e5ned til en anden ny server. Dette g\u00f8r du, indtil det bliver mere eller mindre j\u00e6vnt fordelt.<\/p>\n<p><\/p>\n<p>Flytning kan kun finde sted for de partitioner, der ikke \u00e6ndres under skrivning. For friske partitioner skal skrivning deaktiveres, fordi deres flytning ikke er atomar. Ellers vil du ende med dubletter eller mangler i dataene. Ikke desto mindre er denne metode praktisk og fungerer ret effektivt. De allerede komprimerede partitioner overf\u00f8res over netv\u00e6rket, hvilket betyder, at dataene ikke dekomprimeres eller omkodes.<\/p>\n<p><\/p>\n<p>Denne metode har en ulempe, som afh\u00e6nger af sharding-schemat; om du har indregnet det i dette sharding-schema, og hvilken sharding-n\u00f8gle du har haft. I dit eksempel for metrikkerne er sharding-n\u00f8glen en hash af stien. N\u00e5r du foretager en select i en Distributed tabel, g\u00e5r den direkte til alle shardene i klyngen og henter data derfra. <\/p>\n<p><\/p>\n<p>Det betyder, at det faktisk ikke betyder noget for dig, hvilke data der er p\u00e5 hvilken shard. Det vigtigste er, at data for \u00e9n sti ender p\u00e5 \u00e9n shard, men hvilken specifik shard, er ikke afg\u00f8rende. I dette tilf\u00e6lde er det helt fint at flytte f\u00e6rdige partitioner, fordi n\u00e5r du foretager select-foresp\u00f8rgsler, vil du ogs\u00e5 f\u00e5 de fulde data \u2014 hvad enten det er f\u00f8r eller efter re-sharding, er schemaet ikke s\u00e5 vigtigt.<\/p>\n<p><\/p>\n<p>Men der er ogs\u00e5 mere komplekse situationer. Hvis du i applikationslogikken har fastsat et specifikt sharding-schema, hvor denne klient er placeret p\u00e5 en bestemt shard, kan foresp\u00f8rgslen sendes direkte dertil i stedet for til den Distributed tabel. Eller hvis du bruger en relativt ny version af ClickHouse og har aktiveret indstillingen <strong>optimize skip unused shards<\/strong>. I s\u00e5 fald vil udtrykket i where-sektionen blive analyseret under select-foresp\u00f8rgslen, og det vil blive beregnet, hvilke shards der skal tilg\u00e5s i henhold til sharding-schemat. Dette fungerer under foruds\u00e6tning af, at dataene er distribueret i overensstemmelse med dette sharding-schema. Hvis du har omfordelt dem manuelt, kan overensstemmelsen \u00e6ndre sig.<\/p>\n<p><\/p>\n<p>S\u00e5, dette er metode nummer \u00e9t. Jeg venter p\u00e5 dit svar; passer metoden, eller skal vi g\u00e5 videre?<\/p>\n<p><\/p>\n<p><strong>Vladimir Kolobaev, lead system administrator hos Avito<\/strong>: Alexey, den metode, som du n\u00e6vnte, fungerer ikke s\u00e5 godt, n\u00e5r man skal fordele belastningen, ogs\u00e5 p\u00e5 l\u00e6sning. Vi kan tage en partition, som er m\u00e5nedlig, og flytte den forrige m\u00e5ned til en anden node, men n\u00e5r der kommer foresp\u00f8rgsler efter disse data, vil vi kun belaste den. Det ville v\u00e6re bedre at belaste hele klyngen, fordi ellers vil al l\u00e6sebelastning i en periode blive behandlet af to shards.<\/p>\n<p><\/p>\n<p><strong>Alexey Milovidov:<\/strong> Svaret her er m\u00e6rkeligt \u2014 ja, det er d\u00e5rligt, men det kan ogs\u00e5 fungere. Lad mig forklare, hvordan. Man b\u00f8r se p\u00e5 belastningsscenariet, der f\u00f8lger med dine data. Hvis det er overv\u00e5gningsdata, kan man n\u00e6sten med sikkerhed sige, at langt st\u00f8rstedelen af foresp\u00f8rgslerne g\u00e5r efter friske data. <\/p>\n<p><\/p>\n<p>Du har installeret nye servere, flyttet gamle partitioner, men ogs\u00e5 \u00e6ndret m\u00e5den, hvorp\u00e5 nye data registreres. Og de nye data vil blive spredt over hele klyngen. S\u00e5 allerede efter fem minutter vil foresp\u00f8rgslerne for de seneste fem minutter belaste klyngen j\u00e6vnt, og efter en dag vil foresp\u00f8rgslerne for 24 timer ogs\u00e5 j\u00e6vnt belaste klyngen. Desv\u00e6rre vil foresp\u00f8rgslerne for den foreg\u00e5ende m\u00e5ned kun blive sendt til en del af serverne i klyngen.<\/p>\n<p><\/p>\n<p>Men oftest vil du ikke have foresp\u00f8rgsler specifikt fra februar 2019. Sandsynligvis, hvis foresp\u00f8rgslerne g\u00e5r ind i 2019, vil de v\u00e6re for hele 2019 \u2014 over en stor tidsperiode og ikke for et lille interval. Og s\u00e5danne foresp\u00f8rgsler vil ogs\u00e5 kunne belaste klyngen j\u00e6vnt. Men generelt er dit punkt helt rigtigt, at dette er en ad hoc-l\u00f8sning, som ikke fordeler dataene helt j\u00e6vnt.<\/p>\n<p><\/p>\n<p>Jeg har et par flere punkter at besvare sp\u00f8rgsm\u00e5let. Et af dem handler om, hvordan man oprindeligt kan lave en sharding-schema, s\u00e5 omskiftningen er mindre smertefuld. Det er ikke altid muligt.<\/p>\n<p><\/p>\n<p>For eksempel har du overv\u00e5gningsdata. Overv\u00e5gningsdata vokser af tre \u00e5rsager. Den f\u00f8rste er akkumuleringen af historiske data. Den anden er trafikv\u00e6kst. Og den tredje er stigningen i antallet af de ting, der falder ind under overv\u00e5gningen. Nye mikroservices og metrics dukker op, som skal gemmes. <\/p>\n<p><\/p>\n<p>Det er muligt, at den st\u00f8rste v\u00e6kst er relateret til den tredje \u00e5rsag \u2014 det er stigningen i brugen af overv\u00e5gning. Og i dette tilf\u00e6lde er det v\u00e6rd at se p\u00e5 belastningens karakter, hvad de prim\u00e6re foresp\u00f8rgsler til select er. De prim\u00e6re foresp\u00f8rgsler til select vil sandsynligvis v\u00e6re rettet mod et mindre subset af metrics.<\/p>\n<p><\/p>\n<p>For eksempel CPU-brug p\u00e5 nogle servere af en bestemt service. Det viser sig, at der er et subset af n\u00f8gler, som du henter disse data ved. Og selve foresp\u00f8rgslen efter disse data er sandsynligvis ret simpel og udf\u00f8res p\u00e5 f\u00e5 millisekunder. Det bruges til overv\u00e5gningsservices og dashboards. Jeg h\u00e5ber, jeg forst\u00e5r dette korrekt.<\/p>\n<p><\/p>\n<p><strong>Vladimir Kolobaev:<\/strong> Det, der er vigtigt, er, at vi ofte henviser til historiske data, da vi i realtid sammenligner den nuv\u00e6rende situation med historiske. Og for os er det vigtigt at have hurtig adgang til store m\u00e6ngder data, og ClickHouse klarer det rigtig godt.<\/p>\n<p><\/p>\n<p>Du har helt ret, de fleste l\u00e6seforesp\u00f8rgsler oplever vi i l\u00f8bet af den seneste dag, ligesom med ethvert overv\u00e5gningssystem. Men samtidig er der ogs\u00e5 et betydeligt pres p\u00e5 de historiske data. Det kommer prim\u00e6rt fra alarmeringssystemet, som hvert tredive sekund henvender sig til ClickHouse: \u2018Giv mig data fra de sidste seks uger. Og nu skal du lave et glidende gennemsnit ud af dem, og lad os sammenligne den nuv\u00e6rende v\u00e6rdi med den historiske.\u2019 <\/p>\n<p><\/p>\n<p>Jeg vil gerne n\u00e6vne, at vi for s\u00e5danne meget friske foresp\u00f8rgsler har en lille tabel, hvor vi opbevarer data for kun to dage, og de vigtigste foresp\u00f8rgsler g\u00e5r til den. Store historiske foresp\u00f8rgsler sendes kun til den store sharderede tabel.<\/p>\n<p><\/p>\n<p><strong>Alexey Milovidov:<\/strong> Desv\u00e6rre er det ikke s\u00e6rlig anvendeligt for dit scenario, men jeg vil beskrive to d\u00e5rlige og komplekse sharderingsordninger, som man ikke b\u00f8r bruge, men som alligevel bruges i mine venners service. <\/p>\n<p><\/p>\n<p>Der er et hovedkluster med \u2018Yandex.Metrika\u2019-begivenheder. Begivenhederne er sidevisninger, klik og overgange. De fleste foresp\u00f8rgsler g\u00e5r til en bestemt webside. Du \u00e5bner tjenesten \u2018Yandex.Metrika\u2019, har dit websted \u2014 avito.ru, g\u00e5r ind i rapporten, og der kommer en foresp\u00f8rgsel om dit websted.<\/p>\n<p><\/p>\n<p>Men der er ogs\u00e5 andre foresp\u00f8rgsler \u2014 analytiske og globale, som udf\u00f8res af interne analytikere. Jeg vil lige bem\u00e6rke, at interne analytikere kun laver foresp\u00f8rgsler p\u00e5 \u2018Yandex\u2019-tjenesterne. Ikke desto mindre st\u00e5r selv \u2018Yandex\u2019-tjenesterne for en betydelig del af alle data. Det er foresp\u00f8rgsler, der ikke handler om specifikke t\u00e6llere, men om bredere filtrering.<\/p>\n<p><\/p>\n<p>Hvordan organiserer man data p\u00e5 en s\u00e5dan m\u00e5de, at det b\u00e5de fungerer effektivt for \u00e9n t\u00e6ller og for globale foresp\u00f8rgsler? Kompleksiteten ligger ogs\u00e5 i, at antallet af foresp\u00f8rgsler til ClickHouse p\u00e5 \u2018Metrika\u2019-klusteret er flere tusinde pr. sekund. P\u00e5 samme tid kan en enkelt ClickHouse-server ikke h\u00e5ndtere ikke-trivielle foresp\u00f8rgsler, eksempelvis flere tusinde pr. sekund.<\/p>\n<p><\/p>\n<p>Clusterst\u00f8rrelsen er omkring seks hundrede servere. Hvis man blot l\u00e6gger en Distributed tabel over dette cluster og sender flere tusinde foresp\u00f8rgsler derhen, bliver det endnu v\u00e6rre, end at sende dem til en enkelt server. P\u00e5 den anden side, hvis dataene er j\u00e6vnt fordelt, og vi g\u00e5r og anmoder om fra alle serverne, s\u00e5 er det straks ikke en mulighed.<\/p>\n<p><\/p>\n<p>Der er en diametralt modsat mulighed. Forestil dig, hvis vi shardede dataene efter websteder, og foresp\u00f8rgslen for \u00e9t websted ville g\u00e5 til \u00e9n shard. Nu ville clustret helt sikkert kunne klare ti tusinde foresp\u00f8rgsler i sekundet, men p\u00e5 \u00e9n shard ville en eneste foresp\u00f8rgsel k\u00f8re alt for langsomt. Den ville ikke l\u00e6ngere kunne skaleres efter kapacitet. Is\u00e6r hvis det drejede sig om webstedet avito.ru. Jeg afsl\u00f8rer ikke en hemmelighed, hvis jeg siger, at Avito er et af de mest bes\u00f8gte websteder i den russiske del af internettet. At h\u00e5ndtere det p\u00e5 \u00e9n shard ville v\u00e6re vanvittigt.<\/p>\n<p><\/p>\n<p>Derfor er shardingsskemaet mere raffineret. Hele clustret er opdelt i et bestemt antal clusters, som vi kalder lag. Inden for hver cluster er der fra ti til flere dusin shards. Der er i alt treogtredive af disse clusters. <\/p>\n<p><\/p>\n<p>Hvordan skaleres det hele? Antallet af clusters \u00e6ndrer sig ikke \u2014 ligesom det var for et par \u00e5r siden med treogtredive, s\u00e5 er det stadig. Men inden for hver af dem \u00f8ger vi gradvist antallet af shards, efterh\u00e5nden som dataene akkumuleres. Shardingsskemaet er generelt s\u00e5dan \u2014 opdelingen i disse clusters sker ved hj\u00e6lp af websteder, og for at forst\u00e5 hvilket websted der h\u00f8rer til hvilken cluster, anvendes der en helt separat metabase i MySQL. \u00c9n hjemmeside \u2014 p\u00e5 \u00e9n cluster. Inden i den foreg\u00e5r shardingen efter bes\u00f8gendes identifikatorer.<\/p>\n<p><\/p>\n<p>Ved registrering opdeler vi dem efter resten af divisionen af bes\u00f8gsidentifikatoren. Men n\u00e5r vi tilf\u00f8jer en ny shard, \u00e6ndrer sharding-skemaet sig; vi forts\u00e6tter med at opdele, men efter resten af divisionen p\u00e5 et andet tal. Det betyder, at \u00e9n bes\u00f8gende faktisk kan v\u00e6re placeret p\u00e5 flere servere, og det kan ikke planl\u00e6gges. Dette er udelukkende lavet for at forbedre datakomprimeringen. Ved foresp\u00f8rgsler henvender vi os til den distribuerede tabel, der ser p\u00e5 klyngen og henvender sig til dusinvis af servere. S\u00e5dan er den klodsede skema.<\/p>\n<p><\/p>\n<p>Men min fort\u00e6lling vil v\u00e6re ufuldst\u00e6ndig, hvis jeg ikke n\u00e6vner, at vi har opgivet dette skema. I det nye skema har vi \u00e6ndret alt, og alle data er kopieret ved hj\u00e6lp af clickhouse-copier.<\/p>\n<p><\/p>\n<p>I det nye skema opdeles alle websteder i to kategorier \u2013 store og sm\u00e5. Jeg ved ikke, hvordan t\u00e6rsklen er valgt, men resultatet er, at store websteder registreres p\u00e5 en klynge med 120 shards, hvor hver shard har tre replikaer \u2013 alts\u00e5 i alt 360 servere. Og sharding-skemaet er s\u00e5dan, at enhver foresp\u00f8rgsel g\u00e5r direkte til alle shards. Hvis du \u00e5bner en hvilken som helst rapportside for avito.ru i 'Yandex.Metrica' lige nu, vil foresp\u00f8rgslen g\u00e5 til 120 servere. Der er f\u00e5 store websteder i det russiske internet. Og foresp\u00f8rgslerne bliver ikke tusind pr. sekund, men mindre end hundrede. Alt dette h\u00e5ndteres stille og roligt af den distribuerede tabel, som hver af dem behandler med 120 servere.<\/p>\n<p><\/p>\n<p>Og den anden klynge er til sm\u00e5 websteder. Her er sharding-skemaet baseret p\u00e5 webstedets identifikator, og hver foresp\u00f8rgsel g\u00e5r pr\u00e6cis til \u00e9n shard.<\/p>\n<p><\/p>\n<h2 id=\"anchorclickhouse-copieranchorv-clickhouse-est-utilita-clickhouse-copier-mozhete-pronbspneyo-rasskazat\"><noindex><a rel=\"nofollow\" name=\"clickhouse-copier\"><\/a><\/noindex>ClickHouse har et v\u00e6rkt\u00f8j kaldet clickhouse-copier. Kan I fort\u00e6lle om det?<\/h2>\n<p><\/p>\n<p>Jeg vil straks sige, at denne l\u00f8sning er mere besv\u00e6rlig og lidt mindre effektiv. Fordelen er, at den fuldst\u00e6ndig fordeler dataene i henhold til det skema, du angiver. Men ulemperne ved v\u00e6rkt\u00f8jet er, at det slet ikke udf\u00f8rer resharing. Det kopierer data fra \u00e9n klynge til en anden klynge.<\/p>\n<p><\/p>\n<p>Det betyder, at for at det kan fungere, skal du have to klynger. De kan v\u00e6re placeret p\u00e5 de samme servere, men alligevel vil dataene ikke blive flyttet inkrementelt, men vil blive kopieret. <\/p>\n<p><\/p>\n<p>For example, if there were four servers, there are now eight. You create a new Distributed table on all servers, new local tables, and run clickhouse-copier, specifying in it the operation scheme that it should read from there, accept the new sharding scheme, and move the data there. You will need one and a half times more space on the old servers than you have now because the old data must remain on them, and on top of that, half of these same old data will come. If you thought in advance about the need to re-shard the data and have space, this method will work.<\/p>\n<p><\/p>\n<p>How is clickhouse-copier structured internally? It breaks all work into a set of tasks for processing a single partition of a single table on one shard. All these tasks can be performed in parallel, and clickhouse-copier can be launched on different machines in several instances, but what it does for one partition is nothing more than an insert select. Data is read, decompressed, re-sharded, then compressed again, written somewhere, and re-sorted. This is a more complex solution.<\/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>I havde en pilotfunktion kaldet sharding. Hvad er status p\u00e5 den?<\/h2>\n<p><\/p>\n<blockquote><p>You had a pilot thing back in 2017 called resharding. There's even an option in ClickHouse. As I understand, it didn't take off. Can you tell me why that happened? It seems quite relevant.<\/p><\/blockquote>\n<p>The whole problem is that when it's necessary to re-shard data on-site, it requires very complex synchronization to do this atomically. When we started looking at how this synchronization is structured, it became clear that there are fundamental problems. And these fundamental problems are not just theoretical; they immediately begin to manifest themselves in practice in a way that can be explained very simply \u2014 nothing works.<\/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>Kan alle datadelene samles f\u00f8r flytning til langsomme diske?<\/h2>\n<p><\/p>\n<blockquote><p>Question about TTL with the option to move to slow disk in the context of merges. Is there any way, apart from cron, to merge all parts into one before moving them to slow disks?<\/p><\/blockquote>\n<p>The answer to the question of whether it's possible to automatically merge all pieces into one before their transfer is \u2014 no. I don't think there's a need for that. You can simply rely on them being moved to slow disks automatically. <\/p>\n<p><\/p>\n<p>Vi har to kriterier for overflytning. Det f\u00f8rste er efter fyldningsgrad. Hvis der p\u00e5 det aktuelle lagerniveau er mindre end en vis procentdel ledig plads, v\u00e6lger vi en blok og flytter den til et langsommere lager. Mere pr\u00e6cist, ikke n\u00f8dvendigvis langsommere, men det n\u00e6ste \u2013 som du har indstillet.<\/p>\n<p><\/p>\n<p>Det andet kriterium er efter st\u00f8rrelse. Det handler om at flytte st\u00f8rre blokke. Du kan justere t\u00e6rsklen for ledig plads p\u00e5 det hurtige disk, og data vil blive flyttet automatisk.<\/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>Hvordan opgraderer vi til nye versioner af ClickHouse, hvis vi ikke har mulighed for at teste kompatibiliteten p\u00e5 forh\u00e5nd?<\/h2>\n<p><\/p>\n<blockquote><p>Dette emne diskuteres regelm\u00e6ssigt <noindex><a rel=\"nofollow\" href=\"https:\/\/teleg.run\/clickhouse_ru\">i Telegram-chatten ClickHouse<\/a><\/noindex> under hensyntagen til forskellige versioner, men stadig. Hvor sikkert er det at opgradere fra version 19.11 til 19.16 og for eksempel fra 19.16 til 20.3? Hvordan er det bedst at migrere til nye versioner, n\u00e5r man ikke har mulighed for at teste kompatibiliteten i en sandkasse p\u00e5 forh\u00e5nd?<\/p><\/blockquote>\n<p>Her er nogle \"gyldne\" regler. Det f\u00f8rste er <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/ClickHouse\/ClickHouse\/blob\/master\/CHANGELOG.md\">at l\u00e6se changelog<\/a><\/noindex>. Den er stor, men der er separate punkter om bagudkompatible \u00e6ndringer. Det er ikke v\u00e6rd at betragte disse punkter som et r\u00f8dt flag. Normalt er dette sm\u00e5 inkompatibiliteter, der relaterer sig til en vis kantfunktionalitet, som sandsynligvis ikke er i brug hos dig.<\/p>\n<p><\/p>\n<p>Det andet er \u2013 hvis der ikke er mulighed for at kontrollere kompatibilitet i en sandkasse, og du \u00f8nsker at opgradere direkte i produktionen, er anbefalingen \u2013 lad v\u00e6re med at g\u00f8re det. Opret f\u00f8rst en sandkasse og test. Hvis der ikke er noget testmilj\u00f8, har du sandsynligvis ikke en meget stor virksomhed, og derfor kan du kopiere nogle data til din b\u00e6rbare computer og p\u00e5 denne m\u00e5de bekr\u00e6fte, at alt fungerer korrekt. Du kan endda ops\u00e6tte flere replikaer lokalt p\u00e5 din egen maskine. Eller du kan ops\u00e6tte en ny version et sted t\u00e6t p\u00e5 og overf\u00f8re nogle data \u2013 alts\u00e5 lave et improviseret testmilj\u00f8. <\/p>\n<p><\/p>\n<p>Endnu en regel \u2013 vent med at opdatere i en uge efter udgivelsen af versionen p\u00e5 grund af fejlretning i produktionen og efterf\u00f8lgende hurtige rettelser. Lad os se n\u00e6rmere p\u00e5 versionsnumrene i ClickHouse, s\u00e5 vi ikke bliver forvirrede. <\/p>\n<p><\/p>\n<p>Der er version 20.3.4. Tallet 20&nbsp;angiver udgivelses\u00e5ret&nbsp;\u2014 2020. Det har ikke nogen betydning for indholdet, s\u00e5 det beh\u00f8ver vi ikke fokusere p\u00e5. S\u00e5 kommer vi til 20.3. Det andet tal&nbsp;\u2014 i dette tilf\u00e6lde 3 \u2014 \u00f8ges hver gang, vi udgiver en version med ny funktionalitet. Hvis vi vil tilf\u00f8je en ny mulighed til ClickHouse, er vi forpligtet til at \u00f8ge dette tal. Det betyder, at ClickHouse i version 20.4 bliver endnu bedre. Det tredje tal&nbsp;\u2014 20.3.4. Her er 4 antal patch-udgivelser, hvor vi ikke har tilf\u00f8jet nye funktioner, men har rettet nogle fejl. 4&nbsp;angiver, at vi har gjort dette fire gange.<\/p>\n<p><\/p>\n<p>Det er ikke noget skr\u00e6mmende. Normalt kan brugeren installere den nyeste version, og den fungerer uden&nbsp;problemer med&nbsp;driftstiden i et \u00e5r. Men forestil dig, at i en funktion til behandling af bitmapper, som blev tilf\u00f8jet af vores kinesiske venner, falder serveren, n\u00e5r der sendes forkerte argumenter. Vi er n\u00f8dt til at rette det. Vi vil udgive en ny patch-version, og ClickHouse vil blive mere stabil.<\/p>\n<p><\/p>\n<p>Hvis du har ClickHouse k\u00f8rende i produktionen, og en ny version af ClickHouse med flere funktioner udkommer \u2014 for eksempel&nbsp;20.4.1 \u2014 s\u00e5 skynd dig ikke med at installere den i produktionen den f\u00f8rste dag. Hvad skal den overhovedet bruges til? Hvis du ikke bruger ClickHouse endnu, kan du installere den, og sandsynligvis vil alt v\u00e6re i orden. Men hvis ClickHouse allerede k\u00f8rer stabilt, s\u00e5 hold \u00f8je med&nbsp;patches og opdateringer&nbsp;\u2014 hvilke problemer vi l\u00f8ser.<\/p>\n<p><\/p>\n<p><strong>Kirill Shvakov:<\/strong> Jeg vil gerne tilf\u00f8je lidt om testmilj\u00f8er. Alle er meget bange for testmilj\u00f8er og mener af en eller anden grund, at hvis du har en meget stor ClickHouse-klynge, s\u00e5 skal dit testmilj\u00f8 ogs\u00e5 v\u00e6re lige s\u00e5 stort eller i det mindste ti gange mindre. Det er slet ikke tilf\u00e6ldet.<\/p>\n<p><\/p>\n<p>Jeg kan sige ud fra min egen erfaring. Jeg har et projekt, og der er ClickHouse. Vores testmilj\u00f8 til dette&nbsp;\u2014 er en lille virtuel maskine i&nbsp;Hetzner til&nbsp;tyve euro, hvor alt er implementeret. For at g\u00f8re dette har vi fuld automatisering i&nbsp;Ansible, og derfor er der i princippet ingen forskel p\u00e5, hvor vi best\u00e5r \u2014 p\u00e5 fysiske servere eller blot rulles ud i&nbsp;virtuelle maskiner.<\/p>\n<p><\/p>\n<p>Hvad kan man g\u00f8re? Det ville v\u00e6re fint at lave et eksempel i ClickHouse-dokumentationen p\u00e5, hvordan man ops\u00e6tter et lille cluster for sig selv \u2014 i Docker, i LXC, m\u00e5ske lave et Ansible playbook, fordi forskellige mennesker har forskellige deployment. Det ville g\u00f8re meget lettere. N\u00e5r man kan ops\u00e6tte et cluster p\u00e5 fem minutter, er det meget lettere at fors\u00f8ge at forst\u00e5 noget. Det er meget mere bekvemt, fordi at k\u00f8re en version i produktion, som man ikke har testet \u2014 det er en vej mod ingen steder. Nogle gange fungerer det, og nogle gange g\u00f8r det ikke. S\u00e5 at h\u00e5be p\u00e5 succes \u2014 det er d\u00e5rligt.<\/p>\n<p><\/p>\n<p><strong>Maxim Kotyakov, senior backend engineer hos Avito:<\/strong> Jeg vil tilf\u00f8je lidt om testmilj\u00f8er fra problemerne i store virksomheder. Vi har et fuldgyldigt accept-testcluster i ClickHouse, som er en n\u00f8jagtig kopi af dataene og indstillingerne fra produktionen. Dette cluster er opsat i ret midlertidige containere med minimale ressourcer. Vi skriver en vis procentdel af produktionsdataene derhen, heldigvis er der mulighed for at replikere str\u00f8mmen i Kafka. Der er alt synkroniseret og skaleret \u2014 b\u00e5de med hensyn til kapacitet og str\u00f8m, og teoretisk set burde det opf\u00f8re sig som produktionen i forhold til metrikkerne. Alt potentielt eksplosivt rulles f\u00f8rst til denne stand, og det modnes der i flere dage, indtil det er klar. Men selvf\u00f8lgelig er denne l\u00f8sning dyr, tung og har ikke-nul st\u00f8tteomkostninger. <\/p>\n<p><\/p>\n<p><strong>Alexey Milovidov:<\/strong> Jeg vil fort\u00e6lle, hvad testmilj\u00f8et for vores venner fra 'Yandex.Metrix' best\u00e5r af. \u00c9t cluster havde omkring 600 servere, et andet havde 360, og der er ogs\u00e5 et tredje og flere clusters. Testmilj\u00f8et for \u00e9t af dem \u2014 det er simpelthen to shards med to replikaer i hver. Hvorfor to shards? For at have mere end \u00e9n. Og replikaer ogs\u00e5 for at have dem. Bare et minimum antal, som man kan tillade sig.<\/p>\n<p><\/p>\n<p>Dette testmilj\u00f8 g\u00f8r det muligt at kontrollere, om foresp\u00f8rgslerne fungerer, og om der er noget, der er g\u00e5et helt galt. Men ofte opst\u00e5r der problemer af en helt anden karakter, n\u00e5r alt fungerer, men der er nogle sm\u00e5 \u00e6ndringer med belastningen.<\/p>\n<p><\/p>\n<p>Lad mig give et eksempel. Vi besluttede at installere den nye version af ClickHouse. Den blev udgivet til testmilj\u00f8et, automatiserede tests blev gennemf\u00f8rt i \"Yandex.Metrica\", som sammenligner data mellem den gamle og den nye version ved at k\u00f8re hele pipeline. Og selvf\u00f8lgelig vores CI's gr\u00f8nne tests. Ellers ville vi slet ikke have tilbudt denne version.<\/p>\n<p><\/p>\n<p>Alt er perfekt. Vi begynder at rulle den ud i produktion. Jeg modtager en besked om, at belastningen p\u00e5 graferne er steget flere gange. Vi ruller versionen tilbage. Jeg ser p\u00e5 grafen og kan se: belastningen er faktisk steget flere gange under udrulningen og faldt igen, da vi rullede tilbage. Derefter begyndte vi at rulle versionen tilbage. Og belastningen steg ogs\u00e5 p\u00e5 samme m\u00e5de og faldt tilbage p\u00e5 samme m\u00e5de. S\u00e5 konklusionen er, at belastningen steg i forbindelse med udrulningen, ikke noget at undre sig over.<\/p>\n<p><\/p>\n<p>Det var sv\u00e6rt at overbevise kollegerne om at installere den nye version. Jeg sagde: \"Alt er fint, rull ud. Hold fingrene krydsede, alt vil fungere. Nu er belastningen steget p\u00e5 graferne, men alt er fint. Hold fast.\" Generelt gjorde vi det, og alle \u2014 versionen er rullet ud til produktion. Men n\u00e6sten ved hver udrulning opst\u00e5r der lignende problemer.<\/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>Kill query skal dr\u00e6be foresp\u00f8rgsler, men det g\u00f8r det ikke. Hvorfor?<\/h2>\n<p><\/p>\n<blockquote><p>En bruger, en eller anden analytiker, kom til mig og lavede en foresp\u00f8rgsel, der nedlagde min ClickHouse-klynge. En bestemt node eller hele klyngen \u2014 afh\u00e6ngigt af hvilken replika eller shard foresp\u00f8rgslen ramte. Jeg kan se, at alle CPU-ressourcer p\u00e5 denne server er i bund, alt er r\u00f8dt. Samtidig svarer ClickHouse stadig p\u00e5 foresp\u00f8rgslerne. Og jeg skriver: \"Vis mig venligst proceslisten, hvilken foresp\u00f8rgsel for\u00e5rsagede dette kaos.\"<\/p>\n<p>Jeg finder denne foresp\u00f8rgsel og skriver kill. Og jeg kan se, at der ikke sker noget. Min server er i bund, ClickHouse forts\u00e6tter med at give mig nogle kommandoer og viser, at serveren lever, og alt er fint. Men jeg oplever nedgang i alle brugerforesp\u00f8rgsler, og der begynder at v\u00e6re nedgang i skrivningen til ClickHouse, og mit kill query virker ikke. Hvorfor? Jeg troede, at kill query skulle dr\u00e6be foresp\u00f8rgsler, men det sker ikke.<\/p><\/blockquote>\n<p>Nu kommer et ret m\u00e6rkeligt svar. Problemet er, at kill query ikke dr\u00e6ber foresp\u00f8rgsler. <\/p>\n<p><\/p>\n<p>Kill query s\u00e6tter et lille flag ved navn \u00abjeg vil have, at denne foresp\u00f8rgsel skal dr\u00e6bes\u00bb. N\u00e5r foresp\u00f8rgslen behandler hver blok, ser den p\u00e5 dette flag. Hvis det er sat, stopper foresp\u00f8rgslen med at arbejde. Det viser sig, at ingen dr\u00e6ber foresp\u00f8rgslen; den skal selv kontrollere og stoppe. Og dette skal fungere i alle tilf\u00e6lde, n\u00e5r foresp\u00f8rgslen er i en tilstand af behandling af datablokke. Den vil behandle den n\u00e6ste datablok, kontrollere flaget og stoppe.<\/p>\n<p><\/p>\n<p>Dette fungerer ikke i tilf\u00e6lde, hvor foresp\u00f8rgslen er l\u00e5st p\u00e5 en eller anden operation. Men det er sandsynligvis ikke din situation, da det if\u00f8lge dine ord bruger en masse serverressourcer. Det kan v\u00e6re, at det ikke fungerer i tilf\u00e6lde af ekstern sortering og i nogle andre detaljer. Men generelt burde det ikke ske, det er en bug. Og det eneste, jeg kan anbefale, er at opdatere ClickHouse.<\/p>\n<p><\/p>\n<h2 id=\"anchorreading-timeanchorkak-rasschitat-vremya-otveta-pri-chitayuschey-nagruzke\"><noindex><a rel=\"nofollow\" name=\"reading-time\"><\/a><\/noindex>Hvordan beregner man svartid under l\u00e6sebelastning?<\/h2>\n<p><\/p>\n<blockquote><p>Der er en tabel, der gemmer aggregationer pr. item \u2013 forskellige t\u00e6llere. Antallet af r\u00e6kker er omkring hundrede millioner. Kan man forvente en forudsigelig svartid, hvis man tilf\u00f8rer 1K RPS med 1K items? <\/p><\/blockquote>\n<p>Baseret p\u00e5 konteksten handler det om l\u00e6sebelastningen, fordi der ikke er nogen problemer med skrivning \u2013 man kan inds\u00e6tte b\u00e5de tusind og hundrede tusind, og nogle gange endda flere millioner r\u00e6kker. <\/p>\n<p><\/p>\n<p>L\u00e6seforesp\u00f8rgsler kan v\u00e6re meget forskellige. I select 1 kan ClickHouse udf\u00f8re omkring titusinder af foresp\u00f8rgsler pr. sekund, s\u00e5 selv foresp\u00f8rgsler ved en enkelt n\u00f8gle vil allerede kr\u00e6ve nogle ressourcer. S\u00e5danne punktforesp\u00f8rgsler vil v\u00e6re sv\u00e6rere end i nogle key-value databaser, fordi hver l\u00e6sning kr\u00e6ver, at hele datablokken skal l\u00e6ses via indekset. Indekset adresserer ikke hver post, men hver r\u00e6kkevidde. Det betyder, at man skal l\u00e6se hele r\u00e6kkevidden \u2013 det er 8192 r\u00e6kker som standard. Og man skal dekomprimere den komprimerede datablok fra 64 Kb til 1 Mb. Normalt tager s\u00e5danne punktforesp\u00f8rgsler fra flere millisekunder. Men det er den enkleste mulighed.<\/p>\n<p><\/p>\n<p>Lad os pr\u00f8ve at lave simpel aritmetik. Hvis man ganger et par millisekunder med tusinde, f\u00e5r man et par sekunder. Det er som om, det ikke kan h\u00e5ndtere tusinde foresp\u00f8rgsler per sekund, men det kan det faktisk, fordi vi har flere CPU-kerner. S\u00e5 i princippet kan 1000 RPS ClickHouse nogle gange h\u00e5ndtere det, men ved korte foresp\u00f8rgsler, is\u00e6r punktlige.<\/p>\n<p><\/p>\n<p>Hvis du skal skalere ClickHouse-klyngen efter antallet af simple foresp\u00f8rgsler, s\u00e5 anbefaler jeg den enkleste l\u00f8sning \u2014 at \u00f8ge antallet af replikaer og sende foresp\u00f8rgsler til en tilf\u00e6ldig replika. Hvis \u00e9n replika kan h\u00e5ndtere fem hundrede foresp\u00f8rgsler per sekund, hvilket er helt realistisk, s\u00e5 vil tre replikaer kunne klare halvandet tusinde.<\/p>\n<p><\/p>\n<p>Nogle gange kan man selvf\u00f8lgelig ogs\u00e5 konfigurere ClickHouse til det maksimale antal punktl\u00e6sninger. Hvad kr\u00e6ver det? For det f\u00f8rste \u2014 at reducere granulariteten af indekset. N\u00e5r du g\u00f8r dette, skal du ikke reducere det til en, men basere det p\u00e5 at antallet af poster i indekset vil v\u00e6re flere millioner eller titalls millioner per server. Hvis tabellen har hundrede millioner r\u00e6kker, kan du s\u00e6tte granulariteten til 64.<\/p>\n<p><\/p>\n<p>Du kan reducere st\u00f8rrelsen af den komprimerede blok. Der er indstillinger til dette. <strong>min compress block size<\/strong>, <strong>max compress block size<\/strong>. De kan reduceres, datakopieres, og s\u00e5 vil punktforesp\u00f8rgslerne v\u00e6re hurtigere. Men ClickHouse er stadig ikke en key-value database. Et stort antal sm\u00e5 foresp\u00f8rgsler er et antipattern for belastningen.<\/p>\n<p><\/p>\n<p><strong>Kirill Shvakov:<\/strong> Jeg vil give et r\u00e5d i tilf\u00e6lde af, at der er almindelige t\u00e6llere. Det er en ret standard situation, n\u00e5r ClickHouse gemmer en slags t\u00e6ller. Jeg har en bruger, han er fra et bestemt land, plus et tredje felt, og man skal inkrementelt \u00f8ge noget. Du tager MySQL, laver en unik n\u00f8gle \u2014 i MySQL er den duplicate key, og i PostgreSQL er den conflict \u2014 og tilf\u00f8jer med et plus. Det vil fungere meget bedre. <\/p>\n<p><\/p>\n<p>N\u00e5r du har lidt data, giver det ikke rigtig mening at bruge ClickHouse. Der er almindelige databaser, og de klarer det godt. <\/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>Hvad kan man tune i ClickHouse, s\u00e5 der er flere data i cache?<\/h2>\n<p><\/p>\n<blockquote><p>Lad os forestille os en situation \u2014 serverne har 256 GB RAM, i daglig brug tager ClickHouse cirka 60-80 GB, p\u00e5 toppen op til 130. Hvad kan man aktivere og tune for at f\u00e5 flere data i cache, og dermed f\u00e6rre diskopslag?<\/p><\/blockquote>\n<p>Som udgangspunkt h\u00e5ndterer operativsystemets page cache denne opgave godt. Hvis du bare \u00e5bner topvisningen, kan du se der st\u00e5r cached eller free \u2014 der st\u00e5r ogs\u00e5, hvor meget der er cached \u2014 s\u00e5 kan du bem\u00e6rke, at al fri hukommelse er brugt til cache. Og disse data vil ved l\u00e6sning blive l\u00e6st ikke fra disken, men fra RAM. Jeg kan sige, at cachen bruges effektivt, fordi det er komprimerede data, der caches.<\/p>\n<p><\/p>\n<p>Ikke desto mindre, hvis du \u00f8nsker at accelerere nogle simple foresp\u00f8rgsler endnu mere, er der mulighed for at aktivere cachen i ClickHouse til de ukomprimerede data. Dette kaldes <strong>uncompressed cache<\/strong>. I konfigurationsfilen config.xml angiver du uncompressed cache size til den \u00f8nskede v\u00e6rdi \u2014 jeg anbefaler ikke mere end halvdelen af den frie RAM, da resten vil g\u00e5 til page cache. <\/p>\n<p><\/p>\n<p>Derudover er der to indstillinger p\u00e5 foresp\u00f8rgselsniveau. Den f\u00f8rste indstilling \u2014 <strong>use uncompressed cache<\/strong> \u2014 aktiverer dens brug. Det anbefales at aktivere den for alle foresp\u00f8rgsler, undtagen tunge, der kan l\u00e6se alle data og dermed t\u00f8mme denne cache. Og den anden indstilling er noget i retning af et maksimalt antal r\u00e6kker til brug for cachen. Det begr\u00e6nser automatisk store foresp\u00f8rgsler, s\u00e5 de g\u00e5r forbi cachen.<\/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>Hvordan kan man konfigurere storage_configuration til opbevaring i RAM?<\/h2>\n<p><\/p>\n<blockquote><p>I den nye ClickHouse dokumentation l\u00e6ste jeg afsnittet relateret <noindex><a rel=\"nofollow\" href=\"https:\/\/clickhouse.tech\/docs\/en\/single\/#table_engine-mergetree-multiple-volumes\">med dataopbevaring<\/a><\/noindex>. I beskrivelsen er der et eksempel med hurtig SSD. <\/p>\n<p>Det er interessant, hvordan man kan konfigurere det samme med volumen hot memory. Og et andet sp\u00f8rgsm\u00e5l. Hvordan fungerer select med en s\u00e5dan datalagring, vil den l\u00e6se hele s\u00e6ttet eller kun det, der ligger p\u00e5 disken, og komprimeres disse data i hukommelsen? Og hvordan fungerer section prewhere med denne datalagring?<\/p><\/blockquote>\n<p>Denne indstilling p\u00e5virker opbevaringen af datablokke, og deres format \u00e6ndres ikke.<br \/>\nLad os se n\u00e6rmere p\u00e5 det. <\/p>\n<p><\/p>\n<p>Det er muligt at konfigurere dataopbevaring i RAM. Alt, hvad der konfigureres til disken \u2014 det er dens sti. Du opretter et tmpfs partition, der er mountet til en bestemt sti i filsystemet. Du angiver denne sti som stien til opbevaring af data for den varmeste partition, hvor datablokke begynder at blive modtaget og skrevet, det fungerer godt. <\/p>\n<p><\/p>\n<p>Men jeg anbefaler ikke at g\u00f8re det p\u00e5 grund af den lave p\u00e5lidelighed, selvom det er muligt, hvis du har mindst tre replikaer i forskellige datacentre. I s\u00e5 fald vil dataene kunne genoprettes. Forestil dig, at serveren pludselig bliver slukket og derefter t\u00e6ndt igen. Indholdet er blevet monteret igen, men der er tomt. ClickHouse-serveren ser ved opstart, at disse stykker mangler, selvom metadata fra ZooKeeper angiver, at de burde v\u00e6re der. Den tjekker, hvilke replikaer der har dem, anmoder om dem og downloader dem. P\u00e5 den m\u00e5de vil dataene blive genoprettet. <\/p>\n<p><\/p>\n<p>I denne henseende adskiller opbevaring af data i RAM sig principielt ikke fra opbevaring p\u00e5 disk, fordi n\u00e5r data skrives til disk, g\u00e5r de ogs\u00e5 f\u00f8rst ind i page cache og skrives fysisk bagefter. Dette afh\u00e6nger af, hvordan filsystemet er monteret. Men for en sikkerheds skyld vil jeg sige, at ClickHouse ikke udf\u00f8rer fsync ved insert.<\/p>\n<p><\/p>\n<p>Samtidig opbevares dataene i RAM i helt samme format som p\u00e5 disken. Select-foresp\u00f8rgslen v\u00e6lger p\u00e5 pr\u00e6cis samme m\u00e5de de stykker, der skal l\u00e6ses, v\u00e6lger de n\u00f8dvendige dataintervaler fra stykkerne og l\u00e6ser dem. Og prewhere fungerer pr\u00e6cis p\u00e5 samme m\u00e5de, uanset om dataene var i RAM eller p\u00e5 disk.<\/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>Op til hvor mange unikke v\u00e6rdier er Low Cardinality effektivt?<\/h2>\n<p><\/p>\n<p>Low Cardinality er smart konstrueret. Den danner datadictionary, men de er lokale. For det f\u00f8rste er der sit eget dictionary for hver stykke, og for det andet kan de selv inden for et enkelt stykke v\u00e6re forskellige for hver interval. N\u00e5r antallet af unikke v\u00e6rdier n\u00e5r en t\u00e6rskelv\u00e6rdi \u2014 hvis jeg ikke tager fejl, er det en million \u2014 bliver dictionaryen simpelthen forsinket, og en ny oprettes.<\/p>\n<p><\/p>\n<p>Svaret generelt: For hvert lokalt interval \u2014 for eksempel for hver dag \u2014 er Low Cardinality effektiv op til omkring en million unikke v\u00e6rdier. Derefter vil der v\u00e6re et fallback, hvor der anvendes mange forskellige dictionaries i stedet for \u00e9n. Det vil fungere omtrent som en almindelig string-kolonne, m\u00e5ske noget mindre effektivt, men der vil ikke v\u00e6re alvorlig nedgang i ydeevnen. <\/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>Hvad er de bedste praksisser for fuldtekst-s\u00f8gning p\u00e5 en tabel med fem milliarder r\u00e6kker?<\/h2>\n<p><\/p>\n<p>Der er forskellige m\u00e5der at svare p\u00e5. Den f\u00f8rste er at sige, at ClickHouse ikke er et system til fuldtekst-s\u00f8gning. Der er specifikke systemer til dette, for eksempel, <noindex><a rel=\"nofollow\" href=\"https:\/\/www.elastic.co\/enterprise-search\">Elasticsearch<\/a><\/noindex> og <noindex><a rel=\"nofollow\" href=\"http:\/\/sphinxsearch.com\/\">Sphinx<\/a><\/noindex>. Alligevel m\u00f8der jeg stadig oftere folk, der siger, at de skifter fra Elasticsearch til ClickHouse.<\/p>\n<p><\/p>\n<p>Hvorfor sker det? De forklarer det med, at Elasticsearch stopper med at kunne h\u00e5ndtere belastningen med visse datam\u00e6ngder, is\u00e6r n\u00e5r det g\u00e6lder opbygning af indeks. Indeksene bliver for store, og hvis man bare overf\u00f8rer dataene til ClickHouse, bliver de opbevaret flere gange mere effektivt i volumen. Desuden var s\u00f8geforesp\u00f8rgsler ofte ikke s\u00e5dan, at man skulle finde en s\u00e6tning i hele datam\u00e6ngden med hensyntagen til morfologi, men helt anderledes. For eksempel, at finde i loggene de sidste par timer efter en bestemt byte-sekvens.<\/p>\n<p><\/p>\n<p>I dette tilf\u00e6lde opretter du et indeks i ClickHouse, hvor den f\u00f8rste kolonne vil v\u00e6re dato med tidsstempel. Den st\u00f8rste datask\u00e6ringsoperation vil v\u00e6re baseret p\u00e5 datointervallet. Inden for det valgte datointerval kan man som regel udf\u00f8re fuldtekst-s\u00f8gning, endda med brute force-metoden ved hj\u00e6lp af like. Operatoren like i ClickHouse er den mest effektive like-operator, du kan finde. Hvis du finder en bedre, s\u00e5 sig til mig. <\/p>\n<p><\/p>\n<p>Men alligevel er like en fuld scanning. Og fuld scanning kan v\u00e6re langsom ikke bare p\u00e5 CPU'en, men ogs\u00e5 p\u00e5 disken. Hvis du pludselig har en terabyte data om dagen, og du skal finde et bestemt ord p\u00e5 en dag, s\u00e5 m\u00e5 du scanne en terabyte. Og det er nok p\u00e5 almindelige h\u00e5rde drev, som til sidst vil blive belastet s\u00e5 meget, at du ikke kan logge ind p\u00e5 denne server via SSH.<\/p>\n<p><\/p>\n<p>I dette tilf\u00e6lde er jeg klar til at foresl\u00e5 et andet lille trick. Det er af eksperimentel karakter \u2013 det kan fungere, eller det kan ikke. ClickHouse har fuldtekst-indekser i form af trigram Bloom-filtre. Vore kolleger fra Arenadata har allerede testet disse indekser, og ofte fungerer de netop som tilt\u00e6nkt.<\/p>\n<p><\/p>\n<p>For korrekt at anvende dem skal man have en god forst\u00e5else for, hvordan de fungerer: hvad trigram Bloom-filtret er, og hvordan man v\u00e6lger dets st\u00f8rrelse. Jeg kan sige, at de vil hj\u00e6lpe med foresp\u00f8rgsler p\u00e5 sj\u00e6ldne s\u00e6tninger, substrings, der sj\u00e6ldent optr\u00e6der i dataene. I dette tilf\u00e6lde vil underintervaller blive valgt fra indeksene, og der vil blive l\u00e6st f\u00e6rre data.<\/p>\n<p><\/p>\n<p>Nyligt er der kommet endnu mere avancerede funktioner til fuldtekst s\u00f8gning i ClickHouse. Dette inkluderer for det f\u00f8rste s\u00f8gning af flere substrenge i et enkelt pas, inklusive varianter med hensyn til store og sm\u00e5 bogstaver, uden hensyn til store og sm\u00e5 bogstaver, med st\u00f8tte for UTF-8 eller kun for ASCII. V\u00e6lg den mest effektive, som du har brug for. <\/p>\n<p><\/p>\n<p>Der er ogs\u00e5 mulighed for at s\u00f8ge efter flere regul\u00e6re udtryk i et enkelt pas. Du beh\u00f8ver ikke at skrive X like en substring or X like en anden substring. Du skriver med det samme, og alt udf\u00f8res s\u00e5 effektivt som muligt.<\/p>\n<p><\/p>\n<p>For det tredje er der nu n\u00e6rs\u00f8gningsm\u00f8nstre og n\u00e6rs\u00f8gning af substrenge. Hvis nogen har skrevet et ord med en tastefejl, vil det blive s\u00f8gt ud fra det maksimale match.<\/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>Hvordan organiserer man adgangen til ClickHouse for et stort antal brugere?<\/h2>\n<p><\/p>\n<blockquote><p>Fort\u00e6l, hvordan man bedst organiserer adgangen for et stort antal brugere og analytikere. Hvordan man danner en k\u00f8, prioriterer foresp\u00f8rgsler max concurrent queries, og hvilke v\u00e6rkt\u00f8jer man skal bruge?<\/p><\/blockquote>\n<p>Hvis klyngen er stor nok, kan en god l\u00f8sning v\u00e6re at ops\u00e6tte to ekstra servere, som bliver indgangspunktet for analytikerne. Det vil sige ikke at give analytikerne adgang til specifikke shards af klyngen, men blot at oprette to tomme servere uden data, og s\u00e5 konfigurere adgangen der. Under distribuerede foresp\u00f8rgsler overf\u00f8res brugerindstillingerne til de fjerne servere. S\u00e5 du konfigurerer alt p\u00e5 disse to servere, og indstillingerne har effekt for hele klyngen.<\/p>\n<p><\/p>\n<p>Disse servere er i princippet uden data, men m\u00e6ngden af RAM er ret vigtig for at udf\u00f8re foresp\u00f8rgsler. Disken kan ogs\u00e5 bruges til midlertidige data, hvis ekstern aggregering eller ekstern sortering er aktiveret.<\/p>\n<p><\/p>\n<p>Det er vigtigt at se p\u00e5 indstillingerne, der relaterer til alle mulige gr\u00e6nser. Hvis jeg nu logger ind p\u00e5 klyngen \"Yandex.Metrik\" som analytiker og stiller en foresp\u00f8rgsel <strong>select count from hits<\/strong>, f\u00e5r jeg straks en undtagelse, at jeg ikke kan udf\u00f8re foresp\u00f8rgslen. Det maksimale antal r\u00e6kker, som jeg har lov til at scanne, er et hundrede milliarder, men der er i alt femti trillioner i klyngen i \u00e9n tabel. Dette er den f\u00f8rste begr\u00e6nsning. <\/p>\n<p><\/p>\n<p>Lad os sige, at jeg fjerner begr\u00e6nsningen p\u00e5 antallet af r\u00e6kker og udf\u00f8rer foresp\u00f8rgslen igen. S\u00e5 vil jeg se den f\u00f8lgende undtagelse \u2014 indstillingen er aktiveret <strong>force index by date<\/strong>Jeg kan ikke udf\u00f8re anmodningen, hvis jeg ikke har angivet datointervallet. Der er ikke behov for at stole p\u00e5, at analytikere angiver det manuelt. Et typisk tilf\u00e6lde er skrevet som datointerval hvor event dato mellem uge. Og s\u00e5 blev parantesen blot forkert placeret, s\u00e5 i stedet for and blev det or \u2014 or URL match. Hvis der ikke er nogen gr\u00e6nse, vil den begynde at scanne URL-kolonnen og spilde en masse ressourcer.<\/p>\n<p><\/p>\n<p>Derudover er der to prioritetsindstillinger i ClickHouse. Desv\u00e6rre er de meget primitive. Den ene kaldes ganske enkelt <strong>priority<\/strong>. Hvis priority \u2260 0, og der udf\u00f8res foresp\u00f8rgsler med en form for prioritet, men samtidig udf\u00f8res en foresp\u00f8rgsel med en prioritet v\u00e6rdi, der er mindre, hvilket betyder en h\u00f8jere prioritet, s\u00e5 bliver foresp\u00f8rgslen med en prioritet v\u00e6rdi h\u00f8jere, der angiver en lavere prioritet, simpelthen suspenderet og vil ikke fungere overhovedet i den periode.<\/p>\n<p><\/p>\n<p>Det er en meget grov indstilling, og den er ikke egnet til de tilf\u00e6lde, hvor der er konstant belastning p\u00e5 klyngen. Men hvis du har korte, impulserende vigtige foresp\u00f8rgsler, og det meste af tiden st\u00e5r klyngen stille, s\u00e5 vil en s\u00e5dan indstilling v\u00e6re passende.<\/p>\n<p><\/p>\n<p>Den n\u00e6ste indstilling af prioriteter kaldes <strong>OS thread priority<\/strong>. Den s\u00e6tter ganske enkelt nice-v\u00e6rdien for alle foresp\u00f8rgselsudf\u00f8relse tr\u00e5de for Linux-scheduler. Det fungerer ikke s\u00e6rlig godt, men det fungerer stadig. Hvis den mindste nice v\u00e6rdi - det st\u00f8rste i st\u00f8rrelse, hvilket betyder den laveste prioritet - s\u00e6ttes, og for foresp\u00f8rgsler med h\u00f8j prioritet s\u00e6ttes -19, vil CPU forbruge lavprioriterede foresp\u00f8rgsler omtrent fire gange mindre end h\u00f8jprioriterede. <\/p>\n<p><\/p>\n<p>Det er ogs\u00e5 n\u00f8dvendigt at indstille den maksimale udf\u00f8relsestid for foresp\u00f8rgslerne - lad os sige fem minutter. Minimumshastighed for udf\u00f8relsen af foresp\u00f8rgslerne - det er den mest imponerende. Denne indstilling har eksisteret l\u00e6nge, og den er n\u00f8dvendig, for ikke bare at h\u00e6vde, at ClickHouse ikke h\u00e6nger, men for faktisk at tvinge det.<\/p>\n<p><\/p>\n<p>Forestil dig, at du indstiller: hvis en foresp\u00f8rgsel behandler mindre end en million r\u00e6kker per sekund - det er ikke acceptabelt. Det skader vores gode navn, vores gode database. Lad os simpelthen forbyde det. Der er faktisk to indstillinger. Den ene kaldes <strong>min execution speed<\/strong> \u2014 i&nbsp;sekunder, og den anden kaldes timeout f\u00f8r kontrol af minimum udf\u00f8relseshastighed&nbsp;\u2014 som standard femten sekunder. Det vil sige, at femten sekunder er muligt, og derefter, hvis det er langsomt, s\u00e5 kan der bare kastes en undtagelse \u2014 stoppe foresp\u00f8rgslen.<\/p>\n<p><\/p>\n<p>Der skal ogs\u00e5 konfigureres kvoter. I&nbsp;ClickHouse er der en indbygget kvoteordning, der t\u00e6ller forbruget af ressourcer. Men desv\u00e6rre ikke h\u00e5rde ressourcer som CPU, disk, men logiske&nbsp;\u2014 antallet af behandlede foresp\u00f8rgsler, linjer og l\u00e6ste byte. Man kan for eksempel konfigurere maksimum hundrede foresp\u00f8rgsler inden for fem minutter og tusinde foresp\u00f8rgsler i timen.<\/p>\n<p><\/p>\n<p>Hvorfor er det vigtigt? Fordi en del af analytiske foresp\u00f8rgsler vil blive udf\u00f8rt manuelt direkte fra&nbsp;ClickHouse-klienten. Og alt vil v\u00e6re godt. Men hvis du har avancerede analytikere i&nbsp;din virksomhed, vil de skrive et script, og der kan v\u00e6re en fejl i&nbsp;scriptet. Og denne fejl kan f\u00f8re til, at foresp\u00f8rgslen udf\u00f8res i&nbsp;en uendelig l\u00f8kke. Det er det, der skal beskyttes imod.<\/p>\n<p><\/p>\n<h2 id=\"anchorsmorgasbordanchormozhno-li-otdat-rezultaty-odnogo-zaprosa-desyati-klientam\"><noindex><a rel=\"nofollow\" name=\"smorgasbord\"><\/a><\/noindex>Er det muligt at sende resultaterne af en foresp\u00f8rgsel til ti kunder?<\/h2>\n<p><\/p>\n<blockquote><p>Vi har flere brugere, der elsker at komme med&nbsp;meget store foresp\u00f8rgsler p\u00e5 samme tid. Foresp\u00f8rgslen er stor, udf\u00f8res generelt hurtigt, men fordi s\u00e5 mange foresp\u00f8rgsler er samtidige, bliver det meget besv\u00e6rligt. Er det muligt at udf\u00f8re den samme foresp\u00f8rgsel, der kom ti gange i tr\u00e6k, \u00e9n gang, og s\u00e5 give resultatet til ti kunder?<\/p><\/blockquote>\n<p>Problemet er, at vi ikke har resultater fra cache eller cache af midlertidige data. Der er page cache fra operativsystemet, som g\u00f8r det muligt ikke at l\u00e6se data fra disken igen, men desv\u00e6rre vil data stadig blive udpakket, deserialiseret og behandlet igen. <\/p>\n<p><\/p>\n<p>Vi vil gerne undg\u00e5 dette p\u00e5 en eller anden m\u00e5de, enten ved at cache midlertidige data eller ved at placere lignende foresp\u00f8rgsler i&nbsp;en form for k\u00f8 og tilf\u00f8je resultater til cache. Vi har i \u00f8jeblikket en pull request i udvikling, der tilf\u00f8jer foresp\u00f8rgselscache, men kun for underforesp\u00f8rgsler i in-sektionen og join \u2014 s\u00e5 l\u00f8sningen er ikke komplet.<\/p>\n<p><\/p>\n<p>Alligevel oplever vi ogs\u00e5 en s\u00e5dan situation. Et klassisk eksempel er anmodninger med pagination. Der er en rapport med flere sider, og der sendes en anmodning med limit 10. Derefter det samme, men med limit 10,10. S\u00e5 den n\u00e6ste side. Og sp\u00f8rgsm\u00e5let er, hvorfor vi hele tiden regner det hele ud? Men i \u00f8jeblikket findes der ikke nogen l\u00f8sning, og det kan ikke undg\u00e5s.<\/p>\n<p><\/p>\n<p>Der er en alternativ l\u00f8sning, der installeres som en sidecar ved siden af ClickHouse \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> I ClickHouse Proxy er der en indbygget rate limiter og indbygget cache til resultater. Der er lavet mange indstillinger, fordi der blev l\u00f8st et lignende problem. Proxy'en tillader at begr\u00e6nse anmodninger ved at stille dem i k\u00f8 og indstille, hvor l\u00e6nge cache'de anmodninger skal leve. Hvis anmodningerne faktisk er de samme, vil Proxy'en returnere dem mange gange, men g\u00e5 til ClickHouse kun \u00e9n gang.<\/p>\n<p><\/p>\n<p>Nginx har ogs\u00e5 caching i den gratis version, og det vil ogs\u00e5 fungere. Nginx har endda indstillinger, som g\u00f8r, at hvis anmodningerne kommer samtidig, vil den forsinke andre, indtil en er f\u00e6rdig. Men i ClickHouse Proxy er indstillingen lavet meget bedre. Den er lavet specifikt til ClickHouse, netop til disse anmodninger, s\u00e5 den passer bedre. Og den installeres ogs\u00e5 nemt. <\/p>\n<p><\/p>\n<h2 id=\"anchorasynchronousanchorkak-byt-snbspasinhronnymi-operaciyami-i-materializovannymi-predstavleniyami\"><noindex><a rel=\"nofollow\" name=\"asynchronous\"><\/a><\/noindex>Hvad med asynkrone operationer og materialiserede visninger?<\/h2>\n<p><\/p>\n<blockquote><p>Der er et problem med, at operationerne med replace engine er asynkrone \u2014 f\u00f8rst skrives dataene, derefter sker sammentr\u00e6kningen. Hvis der findes en materialiseret tabel med nogle aggregationer under tabellen, vil dubletterne blive skrevet til den. Og hvis der ikke er nogen kompleks logik, vil dataene blive dubleret. Hvad kan man g\u00f8re ved dette?<\/p>\n<p>Der er en oplagt l\u00f8sning \u2014 at implementere en trigger p\u00e5 en bestemt klasse materialiserede views ved asynkron sammentr\u00e6kning. Er der nogen 's\u00f8lvkugler', planer for implementering af s\u00e5danne funktionaliteter?<\/p><\/blockquote>\n<p>Det er vigtigt at forst\u00e5, hvordan deduplicering fungerer. Det, jeg nu vil fort\u00e6lle, vedr\u00f8rer ikke sp\u00f8rgsm\u00e5let, men det er en god id\u00e9 at huske p\u00e5 det.<\/p>\n<p><\/p>\n<p>N\u00e5r du inds\u00e6tter i en replikeret tabel, sker der deduplisering af hele indsatte blokke. Hvis du inds\u00e6tter den samme blok igen, der indeholder det samme antal af de samme r\u00e6kker i den samme r\u00e6kkef\u00f8lge, s\u00e5 bliver dataene dedupliseret. Du vil modtage \u201cOk\u201d som svar p\u00e5 insert, men der vil faktisk kun blive gemt \u00e9n bunke data, og den vil ikke blive duplikeret.<\/p>\n<p><\/p>\n<p>Dette er n\u00f8dvendigt for at sikre klarhed. Hvis du har modtaget \u201cOk\u201d under inds\u00e6ttelsen, betyder det, at dine data er blevet indsat. Hvis du har f\u00e5et en fejl fra ClickHouse, betyder det, at de ikke er blevet indsat, og du skal gentage inds\u00e6ttelsen. Men hvis forbindelsen blev afbrudt under inds\u00e6ttelsen, ved du ikke, om dataene er indsat eller ej. Den eneste mulighed er at gentage inds\u00e6ttelsen. Hvis dataene faktisk blev indsat, og du inds\u00e6tter dem igen, er der deduplisering af blokke. Dette er n\u00f8dvendigt for at undg\u00e5 duplikater. <\/p>\n<p><\/p>\n<p>Og det er ogs\u00e5 vigtigt, hvordan det fungerer for materialiserede visninger. Hvis dataene blev dedupliseret ved inds\u00e6ttelse i den prim\u00e6re tabel, vil de ikke blive sendt til den materialiserede visning.<\/p>\n<p><\/p>\n<p>Nu til sp\u00f8rgsm\u00e5let. Du har en mere kompleks situation, fordi du registrerer duplikater af individuelle r\u00e6kker. Det vil sige, at ikke hele bunken er blevet duplikeret, men specifikke r\u00e6kker, og de smelter sammen i baggrunden. Faktisk vil dataene smelte sammen i den prim\u00e6re tabel, mens de ikke smeltede vil blive sendt til den materialiserede visning, og under mergerne vil intet ske med de materialiserede visninger. Fordi den materialiserede visning ikke er andet end en trigger for insert. Ved andre operationer sker der ikke noget yderligere med den.<\/p>\n<p><\/p>\n<p>Og jeg kan desv\u00e6rre ikke gl\u00e6de dig her. Det er kun muligt at finde en konkret l\u00f8sning til dette tilf\u00e6lde. For eksempel, kan man lave det samme replacements i den materialiserede visning, og metoden til deduplisering kan m\u00e5ske ogs\u00e5 fungere. Men desv\u00e6rre, ikke altid. Hvis det er aggregerende, kan det ikke lade sig g\u00f8re. <\/p>\n<p><\/p>\n<p><strong>Kirill Shvakov:<\/strong> Vi havde ogs\u00e5 vores udfordringer med klodsethed p\u00e5 et tidspunkt. Der var et problem med visning af annoncer, og der var nogle data, vi kunne vise i realtid \u2014 det var bare visningerne. De dupliceres sj\u00e6ldent, men hvis det sker, sl\u00e5r vi dem sammen senere. Og der var ting, der absolut ikke kunne dupliceres \u2014 klik og hele den historie. Men vi \u00f8nskede ogs\u00e5 at vise dem n\u00e6sten med det samme.<\/p>\n<p><\/p>\n<p>Hvordan blev de materialiserede views lavet? Der var views, hvor der skrives direkte \u2014 der bliver skrevet til de r\u00e5 data, og der skrives til views. P\u00e5 et tidspunkt er dataene ikke s\u00e6rlig korrekte, de dupliceres osv. Og der er den anden del af tabellen, som ser helt ens ud som de materialiserede views, alts\u00e5 strukturelt er de fuldst\u00e6ndig identiske. En gang imellem genberegner vi dataene, t\u00e6ller dem uden duplikater og skriver dem ind i de tabeller. <\/p>\n<p><\/p>\n<p>Vi arbejdede gennem API \u2014 i ClickHouse fungerer det ikke manuelt. API'et tjekker: n\u00e5r jeg har datoen for den sidste tilf\u00f8jelse til tabellen, hvor dataene garanteret er korrekte og beregnet, laver det en foresp\u00f8rgsel til den ene tabel og til den anden tabel. Det v\u00e6lger data fra \u00e9n foresp\u00f8rgsel op til et bestemt tidspunkt, og fra den anden henter det, hvad der endnu ikke er blevet beregnet. Og det fungerer, men ikke kun med ClickHouse.<\/p>\n<p><\/p>\n<p>Hvis du har et API \u2014 til analytikere, for brugere \u2014 s\u00e5 er det i princippet en mulighed. Du beregner altid, genberegner altid. Det kan g\u00f8res \u00e9n gang om dagen eller p\u00e5 et andet tidspunkt. Du v\u00e6lger selv det interval, som du ikke har brug for og som ikke er kritisk.<\/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>I ClickHouse er der mange logs. Hvordan kan jeg se alt, hvad der sker med serveren i \u00f8jeblikket?<\/h2>\n<p><\/p>\n<blockquote><p>I ClickHouse er der et meget stort antal forskellige logs, og dette antal stiger. I de nye versioner er nogle af dem endda som standard aktiveret, mens de i de gamle versioner skal aktiveres ved opdatering. Ikke desto mindre bliver der flere og flere. Jeg ville gerne kunne se, hvad der sker med min server nu, m\u00e5ske p\u00e5 et overordnet dashboard. <\/p>\n<p>Har du nogen i dit team, eller i dine venners teams, som underst\u00f8tter en slags funktionalitet med f\u00e6rdige dashboards, der ville vise disse logs som et allerede f\u00e6rdigt produkt? I sidste ende er det bare fantastisk at se logs i ClickHouse. Men det ville v\u00e6re meget bedre, hvis det allerede var tilg\u00e6ngeligt i form af et dashboard. Jeg ville virkelig nyde det. <\/p><\/blockquote>\n<p>Der er dashboards, men de er ikke standardiserede. I vores virksomhed bruger omkring 60 teams ClickHouse, og det mest m\u00e6rkelige er, at mange af dem har de dashboards, som de selv har lavet, og de er lidt forskellige. Nogle teams bruger en intern installation af 'Yandex.Cloud'. Der er nogle f\u00e6rdige rapporter, men ikke alle n\u00f8dvendige. Andre har deres egne. <\/p>\n<p><\/p>\n<p>Mine kolleger fra 'Metri' har deres eget dashboard i Grafana, og jeg har mit eget baseret p\u00e5 deres klynge. Jeg kigger p\u00e5 ting som cache hits for cache-m\u00e5linger. Og det bliver endda mere kompliceret, fordi vi bruger forskellige v\u00e6rkt\u00f8jer. Mit eget dashboard lavede jeg p\u00e5 et meget gammelt v\u00e6rkt\u00f8j, der hedder Graphite-web. Det er helt grimt. Og jeg bruger det stadig, selvom Grafana nok ville v\u00e6re mere praktisk og smukkere. <\/p>\n<p><\/p>\n<p>Det grundl\u00e6ggende i dashboards er det samme. Det er systemmetrikker for klyngen: CPU, hukommelse, disk, netv\u00e6rk. Andre m\u00e5linger inkluderer antal samtidige anmodninger, antal samtidige merges, antal anmodninger per sekund, maksimum antal stykker for partitioner i MergeTree-tabeller, replikeringslag, st\u00f8rrelsen p\u00e5 replikeringsk\u00f8en, antal indsatte r\u00e6kker per sekund, antal indsatte blokke per sekund. Alt dette kommer ikke fra logs, men fra metrikker.<\/p>\n<p><\/p>\n<p><strong>Vladimir Kolobaev:<\/strong> Alexey, jeg ville gerne justere lidt. Der er Grafana. Grafana har en datasource, som er ClickHouse. Det betyder, at jeg kan lave foresp\u00f8rgsler direkte fra Grafana til ClickHouse. I ClickHouse er der en tabel med logs, som alle har ens. Jeg vil i resultatet fra Grafana tilg\u00e5 denne logtabel og se de foresp\u00f8rgsler, som min server genererer. Det ville v\u00e6re fantastisk at have et s\u00e5dant dashboard.<\/p>\n<p><\/p>\n<p>Jeg har selv skabt det. Men jeg har et sp\u00f8rgsm\u00e5l - hvis alt er standardiseret, og Grafana bruges af alle, hvorfor er der s\u00e5 ikke et officielt dashboard i 'Yandex'?<\/p>\n<p><\/p>\n<p><strong>Kirill Shvakov:<\/strong> I virkeligheden er datasourcen, der tilsluttes ClickHouse, nu underst\u00f8ttet af Altinity. Og jeg vil bare give en indikator p\u00e5, hvor man skal grave og hvem man skal presse. Man kan sp\u00f8rge dem, fordi \"Yandex\" trods alt laver ClickHouse, ikke historien omkring det. Altinity er det prim\u00e6re firma, der i \u00f8jeblikket fremmer ClickHouse. De vil ikke opgive det, men vil forts\u00e6tte med at st\u00f8tte det. For at uploade et dashboard til Grafana-webstedet, er det i princippet kun n\u00f8dvendigt at registrere sig og uploade det - der er ikke s\u00e6rlige problemer. <\/p>\n<p><\/p>\n<p><strong>Alexey Milovidov:<\/strong> I l\u00f8bet af det sidste \u00e5r er der tilf\u00f8jet mange funktioner til ClickHouse med hensyn til foresp\u00f8rgselsprofilering. Der er metrikker for hver foresp\u00f8rgsel om ressourceforbrug. Og for nylig blev der tilf\u00f8jet en endnu lavere niveau profiler til foresp\u00f8rgsler, s\u00e5 man kan se, hvor hver millisekund bruges. Men for at bruge denne funktionalitet er jeg n\u00f8dt til at \u00e5bne konsolklienten og indtaste en foresp\u00f8rgsel, som jeg konstant glemmer. Jeg har gemt den et sted, men jeg glemmer konstant, hvor pr\u00e6cist. <\/p>\n<p><\/p>\n<p>Jeg ville \u00f8nske, at der var et v\u00e6rkt\u00f8j, hvor der simpelthen var beskrevet - her er dine tunge foresp\u00f8rgsler, grupperet efter foresp\u00f8rgselstyper. Jeg trykker p\u00e5 en, og s\u00e5 f\u00e5r jeg at vide, at den er tung af denne grund. Der findes i \u00f8jeblikket ikke en l\u00f8sning p\u00e5 det. Det er virkelig ret m\u00e6rkeligt, at n\u00e5r folk sp\u00f8rger mig: \"Sig mig, findes der nogen f\u00e6rdige dashboards til Grafana?\", siger jeg: \"G\u00e5 ind p\u00e5 Grafana-webstedet, der er et community med 'Dashboards', og der er et dashboard fra Dima, der er et dashboard fra Kostyan. Hvad det er, ved jeg ikke, jeg har ikke selv brugt det.\"<\/p>\n<p><\/p>\n<h2 id=\"anchorzenanchorkak-vozdeystvovat-na-merdzhi-chtoby-server-ne-padal-vnbspoom\"><noindex><a rel=\"nofollow\" name=\"zen\"><\/a><\/noindex>Hvordan p\u00e5virker man mergerne, s\u00e5 serveren ikke falder i OOM?<\/h2>\n<p><\/p>\n<blockquote><p>Jeg har en tabel, og der er kun \u00e9n partition i tabellen, den er ReplacingMergeTree. Jeg har skrevet data i den i fire \u00e5r. Jeg skulle lave en alterering i den og slette nogle data.<\/p>\n<p>Jeg gjorde det, og under behandlingen af denne foresp\u00f8rgsel blev al hukommelse brugt p\u00e5 alle servere i klyngen, og alle servere i klyngen gik i OOM. Derefter kom de alle sammen op igen, begyndte at udf\u00f8re mergeren af netop denne operation, denne datablok, og faldt igen i OOM. S\u00e5 rejste de sig op igen og faldt igen. Og denne ting stoppede ikke.<\/p>\n<p>Sen viste, at dette faktisk var en fejl, som folkene har rettet. Det er rigtig godt, mange tak. Men der er stadig en rest. Og nu, n\u00e5r jeg t\u00e6nker p\u00e5, hvad jeg skal g\u00f8re med et merge i tabellen, dukker sp\u00f8rgsm\u00e5let op \u2014 hvorfor kan jeg ikke p\u00e5 en eller anden m\u00e5de p\u00e5virke disse merges? For eksempel begr\u00e6nse dem i forhold til den n\u00f8dvendige m\u00e6ngde RAM, eller generelt i forhold til antallet af dem, der skal behandle denne specifikke tabel.<\/p>\n<p>Jeg har en tabel, der hedder \"Metrier\", venligst behandl den i to tr\u00e5de for mig. Lad v\u00e6re med at skabe ti eller fem merges parallelt, lav det i to. Jeg tror, at to vil v\u00e6re tilstr\u00e6kkeligt med hukommelse, men til at behandle ti m\u00e5ske ikke. Hvorfor forts\u00e6tter frygten? Fordi tabellen vokser, og en dag vil jeg st\u00e5 over for en situation, hvor det ikke l\u00e6ngere skyldes en fejl, men fordi dataene vil \u00e6ndre sig i s\u00e5 stort omfang, at jeg simpelthen ikke vil have tilstr\u00e6kkelig hukommelse p\u00e5 serveren. Og s\u00e5 vil serveren falde i OOM ved merge. Desuden kan jeg annullere mutationer, men merges kan jeg ikke.<\/p><\/blockquote>\n<p>Du ved, ved merges vil serveren ikke falde i OOM, fordi der ved merge kun anvendes m\u00e6ngden af hukommelse til et lille datainterval. S\u00e5 alt vil v\u00e6re fint uanset datam\u00e6ngden.<\/p>\n<p><\/p>\n<p><strong>Vladimir Kolobaev:<\/strong> Det er fint. Der er den detalje, at efter at fejlen blev rettet, downloadede jeg den nye version og udf\u00f8rte en lignende operation p\u00e5 en anden tabel, der var mindre og havde mange partitioner. I l\u00f8bet af merges blev der brugt omkring 100 GB RAM p\u00e5 serveren. Jeg havde 150 GB optaget, 100 GB blev brugt, og der var et vindue p\u00e5 50 GB, s\u00e5 jeg faldt ikke i OOM.<\/p>\n<p><\/p>\n<p>Hvad beskytter mig i \u00f8jeblikket mod at falde i OOM, hvis det virkelig forbruger 100 GB RAM? Hvordan skal jeg h\u00e5ndtere en situation, hvor RAM pludselig l\u00f8ber t\u00f8r under merges?<\/p>\n<p><\/p>\n<p><strong>Alexey Milovidov:<\/strong> Der er et problem med, at forbruget af RAM under merging ikke er begr\u00e6nset. Det andet problem er, at hvis en merging er planlagt, skal den udf\u00f8res, fordi den er skrevet i replikationsloggen. Replikationsloggen indeholder de handlinger, der er n\u00f8dvendige for at bringe replikatet i en konsistent tilstand. Hvis man ikke udf\u00f8rer de manuelle handlinger, som denne replikationslog vil tilbagef\u00f8re, m\u00e5 man p\u00e5 den ene eller anden m\u00e5de gennemf\u00f8re merging.<\/p>\n<p><\/p>\n<p>Selvf\u00f8lgelig ville det ikke v\u00e6re d\u00e5rligt at have en begr\u00e6nsning p\u00e5 RAM, der \"for en sikkerheds skyld\" beskytter mod OOM. Det vil ikke hj\u00e6lpe merging til at blive udf\u00f8rt, den vil begynde igen, n\u00e5 en t\u00e6rskel, kaste en undtagelse og s\u00e5 starte forfra \u2013 der kommer ikke noget godt ud af det. Men generelt ville det v\u00e6re nyttigt at indf\u00f8re en s\u00e5dan begr\u00e6nsning.<\/p>\n<p><\/p>\n<h2 id=\"anchorgoanchorkak-budet-proishodit-razrabotka-golang-drayvera-dlya-clickhouse\"><noindex><a rel=\"nofollow\" name=\"go\"><\/a><\/noindex>Hvordan vil udviklingen af Golang-driveren til ClickHouse forl\u00f8be?<\/h2>\n<p><\/p>\n<blockquote><p>Golang-driveren, som Kirill Shvakov har skrevet, underst\u00f8ttes nu officielt af ClickHouse-teamet. Den <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/ClickHouse\/clickhouse-go\">er i ClickHouse-repositoriet<\/a><\/noindex>, den er nu stor og rigtig.<\/p>\n<p>En lille bem\u00e6rkning. Der er et fantastisk og elsket lager til normale former for uendelig orden \u2014 det er Vertica. De har ogs\u00e5 deres officielle Python-driver, som vedligeholdes af Vertica-udviklerne. Flere gange har det v\u00e6ret s\u00e5dan, at versionerne af lagret og driveren har v\u00e6ret meget forskellige, og driveren har i en periode oph\u00f8rt med at fungere. Og et andet punkt. Supporten for denne officielle driver, mener jeg, drives gennem et system kaldet \u00abnipling\u00bb \u2014 du skriver dem et issue, og det h\u00e6nger for evigt.<\/p>\n<p>Jeg har to sp\u00f8rgsm\u00e5l. Lige nu er Kirills Golang-driver n\u00e6sten den standardmetode, der bruges til at kommunikere fra Golang til ClickHouse. M\u00e5ske er der nogen, der stadig kommunikerer via http-gr\u00e6nsefladen, fordi de foretr\u00e6kker det. Hvordan vil udviklingen af denne driver finde sted? Vil den blive synkroniseret med eventuelle breaking changes i selve lageret? Og hvad er proceduren for behandling af issues? <\/p><\/blockquote>\n<p><strong>Kirill Shvakov:<\/strong> Det f\u00f8rste er, hvordan alt er organiseret bureaukratisk. Dette punkt blev ikke diskuteret, s\u00e5 jeg kan ikke give noget svar.<\/p>\n<p><\/p>\n<p>For at svare p\u00e5 sp\u00f8rgsm\u00e5let om problemet, kr\u00e6ves en lille historie om driveren. Jeg arbejdede i et firma med mange data. Det var en reklameplatform med et k\u00e6mpe antal h\u00e6ndelser, der skulle opbevares et sted. Og p\u00e5 et tidspunkt kom ClickHouse til. Vi matchede dataene der, i starten gik alt godt, men s\u00e5 crashede ClickHouse. P\u00e5 det tidspunkt besluttede vi, at det var ikke noget for os. <\/p>\n<p><\/p>\n<p>Et \u00e5r senere kom vi tilbage til tanken om at bruge ClickHouse, og vi havde brug for at kunne skrive data derind. Forholdene var s\u00e5dan, at hardware var meget svag, og ressourcerne var f\u00e5. Men vi havde altid arbejdet s\u00e5dan, s\u00e5 vi kiggede i retning af den native protokol.<\/p>\n<p><\/p>\n<p>Da vi arbejdede med Go, var det klart, at der var brug for en driver i Go. Jeg arbejdede n\u00e6sten fuld tid p\u00e5 den \u2013 det var min arbejdsopgave. Indtil et bestemt tidspunkt fik vi den f\u00e6rdig, og praktisk talt forventede ingen, at nogen udover os ville bruge den. S\u00e5 kom CloudFlare med helt det samme problem, og i et stykke tid arbejdede vi meget stabilt sammen, fordi de havde de samme opgaver. Vi gjorde dette b\u00e5de i ClickHouse selv og i driveren. <\/p>\n<p><\/p>\n<p>P\u00e5 et tidspunkt stoppede jeg bare med at arbejde med dem, fordi min aktivitet med hensyn til ClickHouse og arbejdet \u00e6ndrede sig lidt. Derfor bliver problemerne ikke l\u00f8st. Af og til commit'er folk til repositoryet, fordi de selv har brug for noget. S\u00e5 kigger jeg p\u00e5 pull requests, og nogle gange retter jeg endda noget selv, men det sker sj\u00e6ldent.<\/p>\n<p><\/p>\n<p>Jeg vil gerne vende tilbage til driveren. For nogle \u00e5r siden, da det hele begyndte, var ClickHouse ogs\u00e5 anderledes og havde andre muligheder. Nu har vi forst\u00e5else for, hvordan man kan omarbejde driveren, s\u00e5 den fungerer godt. Hvis det sker, vil version 2 i hvert fald v\u00e6re inkompatibel p\u00e5 grund af de akkumulerede workarounds. <\/p>\n<p><\/p>\n<p>Hvordan vi skal organisere det, ved jeg ikke. Jeg har selv ikke s\u00e5 meget tid. Hvis nogle folk vil arbejde videre p\u00e5 driveren, kan jeg hj\u00e6lpe dem og fort\u00e6lle, hvad de skal g\u00f8re. Men aktiv deltagelse fra 'Yandex' i udviklingen af projektet er endnu ikke blevet diskuteret. <\/p>\n<p><\/p>\n<p><strong>Alexey Milovidov:<\/strong> Faktisk er der ikke nogen bureaukrati i forhold til disse drivere lige nu. Det eneste er, at de er udskilt til en officiel organisation, hvilket betyder, at denne driver er anerkendt som den officielle l\u00f8sning som standard for Go. Der er nogle andre drivere, men de fungerer separat. <\/p>\n<p><\/p>\n<p>Vi har ingen intern udvikling til disse drivere. Sp\u00f8rgsm\u00e5let er, om vi kan ans\u00e6tte en person, ikke kun til denne driver, men til udvikling af alle community-drivere, eller om vi kan finde nogen udefra. <\/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>Det eksterne ordforr\u00e5d bliver ikke indl\u00e6st efter genstart med indstillingen lazy_load aktiveret. Hvad skal vi g\u00f8re?<\/h2>\n<p><\/p>\n<blockquote><p>Vi har aktiveret indstillingen lazy_load, og efter genstart af serveren bliver ordforr\u00e5det ikke indl\u00e6st automatisk. Det indl\u00e6ses kun, n\u00e5r en bruger henvender sig til dette ordforr\u00e5d. Og ved den f\u00f8rste henvendelse opst\u00e5r der en fejl. Kan vi p\u00e5 nogen m\u00e5de automatisk indl\u00e6se ordforr\u00e5d med ClickHouse, eller skal vi altid selv kontrollere deres status, s\u00e5 brugere ikke f\u00e5r fejl?<\/p>\n<p>M\u00e5ske har vi en gammel version af ClickHouse, derfor blev ordforr\u00e5det ikke indl\u00e6st automatisk. Kan det v\u00e6re tilf\u00e6ldet?<\/p><\/blockquote>\n<p>For det f\u00f8rste kan ordforr\u00e5dene indl\u00e6ses tvangsvis ved hj\u00e6lp af en foresp\u00f8rgsel. <strong>system reload dictionaries<\/strong>. For det andet, ang\u00e5ende fejlen \u2014 hvis ordbogen allerede er indl\u00e6st, vil foresp\u00f8rgslerne fungere p\u00e5 de data, der er blevet indl\u00e6st. Hvis ordbogen endnu ikke er blevet indl\u00e6st, vil den blive indl\u00e6st lige i forbindelse med foresp\u00f8rgslen.<\/p>\n<p><\/p>\n<p>For tunge ordb\u00f8ger er det ikke s\u00e6rlig praktisk. For eksempel skal man tr\u00e6kke en million r\u00e6kker fra MySQL. Nogen laver en simpel select, men denne select vil vente p\u00e5 de million r\u00e6kker. Der er to l\u00f8sninger. Den f\u00f8rste er at sl\u00e5 lazy_load fra. Den anden er, n\u00e5r serveren starter, f\u00f8r man l\u00e6gger belastning p\u00e5 den, at udf\u00f8re <strong>system reload dictionary<\/strong> eller blot udf\u00f8re foresp\u00f8rgslen, der bruger ordbogen. S\u00e5 vil ordbogen blive indl\u00e6st. Man skal selv overv\u00e5ge tilg\u00e6ngeligheden af ordb\u00f8ger med indstilling for lazy_load aktiveret, fordi ClickHouse automatisk ikke tr\u00e6kker dem ind.<\/p>\n<p><\/p>\n<p>Til det sidste sp\u00f8rgsm\u00e5l er svaret \u2014 enten er versionen gammel, eller ogs\u00e5 skal der fejls\u00f8ges. <\/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>Hvordan h\u00e5ndterer man, at system reload dictionaries ikke indl\u00e6ser nogen af de mange ordb\u00f8ger, hvis blot en af dem fejler med en fejl?<\/h2>\n<p><\/p>\n<blockquote><p>Der er ogs\u00e5 et sp\u00f8rgsm\u00e5l ang\u00e5ende system reload dictionaries. Vi har to ordb\u00f8ger \u2014 den ene indl\u00e6ses ikke, den anden indl\u00e6ses. System reload dictionaries vil i dette tilf\u00e6lde ikke indl\u00e6se nogen ordbog, og man er n\u00f8dt til at indl\u00e6se den specifikt ved navn ved hj\u00e6lp af system reload dictionary. Er dette ogs\u00e5 relateret til versionen af ClickHouse?<\/p><\/blockquote>\n<p>I want to bring you good news. This behavior has changed. So if you update ClickHouse, it will change as well. If you are not satisfied with the current behavior <strong>system reload dictionaries<\/strong>, opdater og lad os h\u00e5be, at det \u00e6ndrer sig til det bedre.<\/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>Er der en m\u00e5de at konfigurere legitimationsoplysninger i ClickHouse-konfigurationen, uden at de vises ved fejl?<\/h2>\n<p><\/p>\n<blockquote><p>Det n\u00e6ste sp\u00f8rgsm\u00e5l handler om fejl relateret til ordbogen, specifikt forbindelsesoplysninger. Vi har angivet forbindelsesoplysningerne i ClickHouse-konfigurationen til ordbogen, og ved fejl f\u00e5r vi disse forbindelsesoplysninger og adgangskode i svaret. <\/p>\n<p>Vi har l\u00f8st denne fejl ved at flytte forbindelsesoplysningerne til ODBC-driverens konfiguration. Er der en m\u00e5de at konfigurere forbindelsesoplysningerne i ClickHouse-konfigurationen uden at vise disse oplysninger ved fejl?<\/p><\/blockquote>\n<p>Her er l\u00f8sningen faktisk \u2014 at angive disse credentials i odbc.ini, og i selve ClickHouse kun angive ODBC Data Source Name. For de andre kilder til ordb\u00f8ger vil dette ikke v\u00e6re tilf\u00e6ldet \u2014 hverken for ordbogen med MySQL eller for andre b\u00f8r du ikke se adgangskoden ved en fejlmeddelelse. Jeg vil ogs\u00e5 kigge p\u00e5 ODBC \u2014 hvis dette er tilf\u00e6ldet, skal det bare fjernes.<\/p>\n<p><\/p>\n<h2 id=\"anchorzoom-backgroundsanchorbonus-fony-dlya-zuma-snbspposidelok\"><noindex><a rel=\"nofollow\" name=\"zoom-backgrounds\"><\/a><\/noindex>Bonus: baggrunde til Zoom fra sammenkomster<\/h2>\n<p><\/p>\n<p>Ved at klikke p\u00e5&nbsp;billedet kan de mest vedholdende l\u00e6sere \u00e5bne bonusbilleder fra vores m\u00f8der. Vi slukker brande sammen med Avitos teknologimaskotter, holder m\u00f8der med kolleger fra serverrummet eller den oldschool computerklub, og vi gennemf\u00f8rer daglige m\u00f8der under broen med grafitti som baggrund.<\/p>\n<p><\/p>\n<p><noindex><a rel=\"nofollow\" href=\"http:\/\/amp.gs\/KvUr\"><img decoding=\"async\" alt=\"ClickHouse for avancerede brugere i sp\u00f8rgsm\u00e5l og svar\" src=\"\/wp-content\/uploads\/2020\/05\/38b2ea076283285d934913c395863eb1.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/a><\/noindex><\/p>\n<p>Kilde: <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.3 - 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\/da\/blog\/administrirovanie\/clickhouse-dlya-prodvinutyh-polzovatelej-v-voprosah-i-otvetah\" \/>\n\t\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.3\" \/>\n\t\t<meta property=\"og:locale\" content=\"da_DK\" \/>\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\/da\/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 til avancerede brugere i sp\u00f8rgsm\u00e5l og svar | ProHoster","description":"I april planlagde ingeni\u00f8rerne fra Avito online-m\u00f8der med hovedudvikleren af ClickHouse, Aleksey Milovidov, og Kirill Shvakov, en Golang-udvikler fra firmaet Integros.","canonical_url":"https:\/\/prohoster.info\/da\/blog\/administrirovanie\/clickhouse-dlya-prodvinutyh-polzovatelej-v-voprosah-i-otvetah","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"da_DK","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\/da\/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\/da\/wp-json\/wp\/v2\/posts\/80775","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/da\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/da\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/da\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/da\/wp-json\/wp\/v2\/comments?post=80775"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/da\/wp-json\/wp\/v2\/posts\/80775\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/da\/wp-json\/wp\/v2\/media\/80776"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/da\/wp-json\/wp\/v2\/media?parent=80775"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/da\/wp-json\/wp\/v2\/categories?post=80775"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/da\/wp-json\/wp\/v2\/tags?post=80775"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}