ClickHouse-Konfiguration: Wie ich die Produktion eingerichtet habe und mir nicht ins Bein geschossen habe
Die Geschichte eines Tippfehlers: 300 GB Logs und ein abgestürzter Server
Standardmäßig schreibt ClickHouse Logs nach /var/log/clickhouse-server/ und rotiert sie nie. Zwei Wochen nach dem Start stellten wir fest, dass die Logdatei auf 300 GB angewachsen war und die gesamte Root-Partition gefüllt hatte. Der Server stürzte ab. Analysten konnten kein SELECT ausführen, die Produktion war down.
Die ClickHouse-Dokumentation ist riesig, aber in der Produktion müssen Sie wirklich nur etwa 20 Parameter ändern. Unten ist meine Checkliste aus 5 Jahren Betrieb von Clustern mit 1 bis 12 Knoten.
1. config.xml: Das Grundgerüst einer Produktionskonfiguration
Die Hauptkonfiguration befindet sich in /etc/clickhouse-server/config.xml. Hier sind die Abschnitte, die ich in jedem Projekt anfasse:
<clickhouse>
<!-- Logging — Rotation hinzufügen, um meinen Fehler zu vermeiden -->
<logger>
<level>information</level>
<log>/var/log/clickhouse-server/clickhouse-server.log</log>
<errorlog>/var/log/clickhouse-server/clickhouse-server.err.log</errorlog>
<size>1000M</size>
<count>10</count>
<!-- Das spart Speicherplatz. 10 Dateien à 1 GB — größenbasierte Rotation -->
</logger>
<!-- Ports — Standard, aber ich ändere sie in der Produktion -->
<tcp_port>9000</tcp_port> <!-- Native client -->
<http_port>8123</http_port> <!-- HTTP API -->
<interserver_http_port>9009</interserver_http_port> <!-- Replikation -->
<!-- Listen interfaces — für die Produktion NICHT 0.0.0.0 ohne Firewall setzen -->
<listen_host>0.0.0.0</listen_host> <!-- Alle Interfaces — vorsichtig -->
<!-- <listen_host>::</listen_host> IPv6 -->
Warum ich davon abrate, blind 0.0.0.0 zu verwenden: In der Produktion mit einer öffentlichen IP wird Ihr ClickHouse zum Ziel von Portscans. Besser VPN oder Firewalls verwenden.
2. Datenpfade: Wo ClickHouse alles speichert
<path>/var/lib/clickhouse/</path> <!-- Hauptdaten -->
<tmp_path>/var/lib/clickhouse/tmp/</tmp_path>
<user_files_path>/var/lib/clickhouse/user_files/</user_files_path>
<format_schema_path>/var/lib/clickhouse/format_schemas/</format_schema_path>
Was mich gebrannt hat: Das System-/tmp war im RAM (tmpfs) mit nur 2 GB gemountet. ClickHouse versuchte, temporäre Dateien für große GROUP BY-Abfragen dort zu schreiben und stürzte mit einem Fehler ab. Ich habe tmp_path auf eine 50-GB-Festplatte verschoben:
<tmp_path>/data/clickhouse_tmp/</tmp_path>
3. MergeTree-Einstellungen: Katastrophen verhindern
Ich setze diese Parameter auf allen Produktionsservern:
<merge_tree>
<!-- Ein Teil wird erst zusammengeführt, wenn er 10 GB angesammelt hat — reduziert Hintergrundlast -->
<min_bytes_for_wide_part>10000000000</min_bytes_for_wide_part>
<!-- Maximale Teilgröße für die Zusammenführung (100 GB) -->
<max_bytes_to_merge_at_max_space_in_pool>107374182400</max_bytes_to_merge_at_max_space_in_pool>
<!-- Wenn Teile 300 überschreiten, werden neue INSERTs abgelehnt -->
<parts_to_throw_insert>300</parts_to_throw_insert>
<!-- Warnung bei 200 Teilen -->
<parts_to_delay_insert>200</parts_to_delay_insert>
<!-- Maximale Anzahl von Teilen in einer Partition -->
<max_parts_in_total>10000</max_parts_in_total>
</merge_tree>
Warum parts_to_throw_insert = 300: Wenn Sie 300+ Teile haben, verlangsamt sich SELECT, und INSERTs machen es nur noch schlimmer. Besser den Insert ablehnen und nachforschen.
4. users.xml: Benutzer, Profile, Kontingente
Die Datei /etc/clickhouse-server/users.xml ist die Zugriffskontrolle. Ich erstelle drei Benutzer:
<clickhouse>
<!-- 1. Benutzer für Analysten (schreibgeschützt) -->
<analyst>
<password>analyst_secure_password</password>
<networks>
<ip>10.0.0.0/8</ip> <!-- Nur internes Netzwerk -->
</networks>
<profile>readonly_profile</profile>
<quota>analyst_quota</quota>
</analyst>
<!-- 2. Anwendung (begrenzte Ressourcen) -->
<app_user>
<password>${CLICKHOUSE_APP_PASSWORD}</password> <!-- Aus Umgebungsvariable -->
<networks>
<ip>::/0</ip> <!-- Hier vorsichtig sein, besser spezifische Subnetze verwenden -->
</networks>
<profile>app_profile</profile>
</app_user>
<!-- 3. Administrator (voller Zugriff) -->
<admin>
<password>admin_strong_password</password>
<networks>
<host>localhost</host>
<host>10.0.0.50</host> <!-- Nur Bastion-Host -->
</networks>
<profile>admin_profile</profile>
</admin>
</clickhouse>
Wichtige Nuance: Das Passwort des Standardbenutzers ist standardmäßig leer. Das ist das Erste, was ich nach der Installation ändere.
5. Einstellungsprofile: Schutz vor verrückten Abfragen
Profile sind Mengen von Einschränkungen, die den Cluster vor SELECT * FROM huge_table CROSS JOIN schützen.
<profiles>
<!-- Analysten: können schwere Abfragen ausführen, aber mit Grenzen -->
<readonly_profile>
<readonly>1</readonly> <!-- Nur SELECT -->
<max_memory_usage>10000000000</max_memory_usage> <!-- 10 GB -->
<max_execution_time>300</max_execution_time> <!-- 5 Minuten -->
<max_rows_to_read>50000000000</max_rows_to_read> <!-- 50 Milliarden Zeilen -->
<max_bytes_to_read>107374182400</max_bytes_to_read> <!-- 100 GB -->
<prefer_global_in_and_join>1</prefer_global_in_and_join>
</readonly_profile>
<!-- Anwendung: schnelle Abfragen, kleine Grenzen -->
<app_profile>
<readonly>0</readonly>
<max_memory_usage>1000000000</max_memory_usage> <!-- 1 GB -->
<max_execution_time>10</max_execution_time> <!-- 10 Sekunden -->
<max_rows_to_read>100000000</max_rows_to_read> <!-- 100 Millionen -->
<timeout_before_checking_execution_speed>0</timeout_before_checking_execution_speed>
</app_profile>
<!-- Admin: fast keine Grenzen (aber vorsichtig) -->
<admin_profile>
<readonly>0</readonly>
<max_memory_usage>0</max_memory_usage> <!-- keine Grenze -->
<max_execution_time>0</max_execution_time>
</admin_profile>
</profiles>
Kontingente — damit ein Analyst nicht alle tötet:
<quotas>
<analyst_quota>
<interval>
<duration>3600</duration> <!-- pro Stunde -->
<queries>100</queries> <!-- nicht mehr als 100 Abfragen -->
<errors>0</errors> <!-- keine Fehler -->
<result_rows>100000000</result_rows> <!-- 100 Millionen Ergebniszeilen -->
<read_rows>10000000000</read_rows> <!-- 10 Milliarden gelesen -->
</interval>
</analyst_quota>
</quotas>
6. Standard-Komprimierungseinstellungen
ClickHouse komprimiert Daten mit LZ4 (schnell) oder ZSTD (stärker). Ich wähle basierend auf dem Datentyp:
<compression>
<!-- LZ4 für frische Daten (Geschwindigkeit) -->
<case>
<last_level>1</last_level> <!-- Komprimierungsstufe -->
<method>LZ4</method>
</case>
<!-- ZSTD für Partitionen älter als 30 Tage (Platzersparnis) -->
<case>
<min_part_size>10737418240</min_part_size> <!-- 10 GB -->
<method>ZSTD</method>
<level>3</level>
</case>
</compression>
Meine Wahl in der Produktion: LZ4 für alle Daten. ZSTD spart 20-30% Platz, verliert aber bis zu 10% Geschwindigkeit bei Abfragen.
7. TLS/SSL — Wenn Sie nicht in einem isolierten Netzwerk sind
<https_port>8443</https_port>
<tcp_port_secure>9440</tcp_port_secure>
<openSSL>
<server>
<certificateFile>/etc/clickhouse-server/ssl/server.crt</certificateFile>
<privateKeyFile>/etc/clickhouse-server/ssl/server.key</privateKeyFile>
<verificationMode>none</verificationMode>
<caConfig>/etc/clickhouse-server/ssl/CA.pem</caConfig>
<cacheSessions>true</cacheSessions>
<disableProtocols>sslv2,sslv3,tlsv1,tlsv1_1</disableProtocols>
<preferServerCiphers>true</preferServerCiphers>
</server>
</openSSL>
Was mich gebrannt hat: Ein selbstsigniertes Zertifikat ohne Verifizierung ist nur innerhalb eines vertrauenswürdigen Netzwerks sicher. Für externen Zugriff verwenden Sie Let's Encrypt oder ein kostenpflichtiges Zertifikat.
8. config.d/ — Überschreibungen ohne Schmerz
Bearbeiten Sie niemals config.xml direkt. Legen Sie alle Änderungen in /etc/clickhouse-server/config.d/ ab.
Datei config.d/memory.xml:
<clickhouse>
<max_server_memory_usage>0.75</max_server_memory_usage> <!-- 75% des gesamten RAM -->
<max_concurrent_queries>100</max_concurrent_queries>
</clickhouse>
Datei config.d/networks.xml:
<clickhouse>
<listen_host>0.0.0.0</listen_host>
<max_connections>4096</max_connections>
</clickhouse>
Vorteile: Beim Aktualisieren von ClickHouse wird Ihre config.xml nicht überschrieben, und die Überschreibungen bleiben erhalten. Ich habe dies auf die harte Tour gelernt, nachdem ich meine Konfiguration bei einem Upgrade von 22.x auf 23.x verloren hatte.
9. Sicherheitscheckliste für eine Wettplattform
Bevor ich den ClickHouse-Zugriff für die Außenwelt öffne, überprüfe ich:
✅ Standardbenutzerpasswort ändern
clickhouse-client --password
ALTER USER default IDENTIFIED BY 'new_strong_password';
✅ Standardbenutzer entfernen oder einschränken
<!-- In users.xml den Standardabschnitt auskommentieren -->
<!-- <default>
<password></password>
</default> -->
✅ Ports vor externem Zugriff schließen (UFW)
sudo ufw default deny incoming
sudo ufw allow from 10.0.0.0/8 to any port 9000 proto tcp # nur internes Netzwerk
sudo ufw allow from 10.0.0.0/8 to any port 8123 proto tcp
sudo ufw allow ssh
✅ Host-Firewall aktivieren
sudo iptables -A INPUT -p tcp --dport 9000 -s 10.0.0.0/8 -j ACCEPT
sudo iptables -A INPUT -p tcp --dport 9000 -j DROP
✅ max_memory_usage setzen, damit eine Abfrage den Server nicht tötet
<max_memory_usage>10000000000</max_memory_usage> <!-- 10 GB -->
✅ Experimentelle Funktionen deaktivieren (falls nicht benötigt)
<allow_experimental_geo_types>0</allow_experimental_geo_types>
<allow_experimental_window_functions>1</allow_experimental_window_functions> <!-- 23.8+ -->
✅ query_log und slow_log für Überwachung aktivieren
<query_log>
<database>system</database>
<table>query_log</table>
<partition_by>toYYYYMM(event_date)</partition_by>
<flush_interval_milliseconds>7500</flush_interval_milliseconds>
</query_log>
<query_thread_log>
<database>system</database>
<table>query_thread_log</table>
</query_thread_log>
✅ Zugriff nach IP einschränken (Whitelist)
<analyst>
<networks>
<ip>10.0.0.100</ip> <!-- Nur spezifische Analysten-IP -->
<ip>10.0.0.101</ip>
<ip>192.168.1.0/24</ip>
</networks>
</analyst>
Was kommt als Nächstes
Jetzt ist Ihr ClickHouse für den Kampf konfiguriert. Der nächste Artikel handelt von Überwachung und Backups in der Produktion.
← Vorherige: ClickHouse-Aggregatfunktionen: Wie ich aufgehört habe, uniqHLL12 und quantileTDigest zu fürchten → Nächste: ReplacingMergeTree: So schlagen Sie Duplikate in ClickHouse ohne Schmerzen
— Editorial Team
Noch keine Kommentare.