<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
<title>Ivan Blinov</title><link href="https://ivanblinov.com/"/><link rel="self" href="https://ivanblinov.com/feed.xml"/>
<id>https://ivanblinov.com/</id><updated>2026-10-31T20:02:15+00:00</updated><author><name>Ivan Blinov</name></author>
<entry><title>AI agents for a data team, without handing them the keys to production</title><link href="https://ivanblinov.com/writing/ai-agents-for-a-data-team/"/><id>https://ivanblinov.com/writing/ai-agents-for-a-data-team/</id>
<updated>2026-10-31T18:50:11+00:00</updated><summary>What I built in 2026 for a 12-engineer billing data team, what the agentic code reviewer actually caught, and which guardrails mattered.</summary></entry>
<entry><title>Idle CPUs, 60-second queries: a global lock in ClickHouse 23.8</title><link href="https://ivanblinov.com/writing/clickhouse-global-context-lock/"/><id>https://ivanblinov.com/writing/clickhouse-global-context-lock/</id>
<updated>2026-10-31T18:50:11+00:00</updated><summary>How a dashboard widget that needed two numbers took a ClickHouse cluster down for 48 minutes, and why the fix was a cheaper query rather than more hardware.</summary></entry>
<entry><title>665 GiB of dictionaries: when ClickHouse dictionaries stop scaling</title><link href="https://ivanblinov.com/writing/clickhouse-dictionaries-665-gib/"/><id>https://ivanblinov.com/writing/clickhouse-dictionaries-665-gib/</id>
<updated>2026-10-31T19:59:01+00:00</updated><summary>Nine hashed dictionaries quietly grew to two thirds of a terabyte per node, and every reload tried to build a second copy. How we found that only five views used them, and replaced them with joins that read 17 granules out of 282,102.</summary></entry>
<entry><title>Airflow tasks stuck in &quot;queued&quot; forever after a twelve-second database blip</title><link href="https://ivanblinov.com/writing/airflow-tasks-stuck-in-queued/"/><id>https://ivanblinov.com/writing/airflow-tasks-stuck-in-queued/</id>
<updated>2026-10-31T20:01:11+00:00</updated><summary>A short network flap between two datacenters left a task in &quot;queued&quot; for two and a half hours, and its DAG with it. The cause is a lost executor event: `SELECT … FOR UPDATE SKIP LOCKED` skips exactly the row it needs. Why restarting the scheduler is the wrong fix.</summary></entry>
<entry><title>Expired certificates broke production twice, and nothing turned red</title><link href="https://ivanblinov.com/writing/expired-certificates-twice/"/><id>https://ivanblinov.com/writing/expired-certificates-twice/</id>
<updated>2026-10-31T20:01:12+00:00</updated><summary>Once as a load-balancer black hole that swallowed 23 of 24 connections for fifteen hours, once as a silent 30-hour replica lag behind a database that kept answering. Both times the metrics existed and the alerts did not.</summary></entry>
<entry><title>LowCardinality in ClickHouse: I measured the rule of thumb, and it was wrong both ways</title><link href="https://ivanblinov.com/writing/clickhouse-lowcardinality-measured/"/><id>https://ivanblinov.com/writing/clickhouse-lowcardinality-measured/</id>
<updated>2026-10-31T20:02:15+00:00</updated><summary>&quot;LowCardinality helps between a thousand and a hundred thousand distinct values, and hurts otherwise.&quot; A code review quoted this rule, so I measured it on ClickHouse 23.8. LowCardinality wins at any small number of values, even two, and starts losing badly at about twenty thousand per part.</summary></entry>
<entry><title>Partitioning by modulo in ClickHouse: the DDL I wrote that made queries 13.7 times slower</title><link href="https://ivanblinov.com/writing/clickhouse-modulo-partitioning/"/><id>https://ivanblinov.com/writing/clickhouse-modulo-partitioning/</id>
<updated>2026-10-31T20:01:58+00:00</updated><summary>`PARTITION BY supplier_id % 100` sounds like it spreads the load evenly. In practice it destroyed primary-key pruning: a lookup read 64% of the table instead of 3%. Here are the measurements, and why it happens.</summary></entry>
</feed>
