clickhouse-go v2.x. Примеры с кодом см. в разделе Конфигурация.
Пометки о версияхПараметры, добавленные в
clickhouse-go v2.35.0 и новее, помечены как (Начиная с vX.Y.Z) рядом с описанием. Параметры без метки “Начиная с” доступны с v2.0 и присутствуют во всех поддерживаемых версиях.Как задаются параметры
| Область видимости | Как задать | Время действия |
|---|---|---|
| Connection | структура clickhouse.Options или строка DSN | Для всех запросов в соединении |
| Query | clickhouse.Context() с функциями WithXxx | Выполнение одного запроса |
| батч | функции параметров PrepareBatch() | Одна операция батча |
Settings ключи уровня запроса объединяются с ключами уровня соединения; при конфликте приоритет у ключей уровня запроса.
Через структуру Options:
Варианты подключения
Протокол и подключение
| Опция | Тип | По умолчанию | Параметр DSN | Описание | Рекомендация | При неверной конфигурации |
|---|---|---|---|---|---|---|
Protocol | Protocol (int) | Native | Схема: clickhouse://=Native, http://=HTTP | Протокол связи: Native (0) для TCP, HTTP (1) для HTTP | Используйте Native для производительности примерно на 30% выше. Используйте HTTP, если нужна поддержка proxy, обход firewall (порт 80/443) или сжатие, доступное только через HTTP (gzip/br). См. TCP vs HTTP. | HTTP-схема с портом Native (9000): отказ в подключении. Native заблокирован firewall: тайм-ауты. |
Addr | []string | ["localhost:9000"] (Native) ["localhost:8123"] (HTTP) | Хосты в URL, разделенные запятыми | Список адресов "host:port" для подключения и failover | В продакшн указывайте несколько адресов для высокой доступности. Правильные порты: 9000 (Native), 8123 (HTTP), 9440 (Native+TLS), 8443 (HTTP+TLS). | Один адрес: нет failover. Неверный порт: "connection refused". Пустое значение или nil: по умолчанию используется localhost, что приводит к сбою в распределенных развертываниях. |
ConnOpenStrategy | ConnOpenStrategy (uint8) | ConnOpenInOrder (0) | connection_open_strategy (in_order, round_robin, random) | Стратегия выбора сервера из Addr. InOrder (0)=failover, RoundRobin (1)=балансировка нагрузки, Random (2)=случайный выбор. | InOrder для active-standby. RoundRobin для active-active/K8s. Random — чтобы избежать эффекта thundering herd. | InOrder с active-active: всю нагрузку получает первый сервер, остальные бездействуют. При сбое все стратегии пробуют все серверы — различается только то, какой сервер будет опробован первым. |
Аутентификация
| Option | Type | Default | DSN param | Description | Best practice | When misconfigured |
|---|---|---|---|---|---|---|
Auth.Username | string | "default" | username or URL user portion | Имя пользователя для аутентификации в ClickHouse | Никогда не используйте default в продакшне. Создавайте отдельных пользователей с минимальными разрешениями. | Неверное имя пользователя: "Code: 516. DB::Exception: Authentication failed". Пустая строка: без уведомления используется "default". |
Auth.Password | string | "" | password or URL password portion | Пароль для аутентификации в ClickHouse | В продакшне используйте переменные окружения или менеджеры секретов. Кодируйте специальные символы в DSN для URL. | Неверный пароль: "Code: 516. DB::Exception: Authentication failed". Специальные символы не закодированы для URL: ошибки разбора. |
Auth.Database | string | "" (server default) | database or URL path (/mydb) | База данных по умолчанию для подключения | Всегда указывайте явно. В продакшне используйте отдельные базы данных для каждого приложения. | Не существует: "Code: 81. DB::Exception: Database xyz doesn't exist". Пустое значение в многотенантной конфигурации: запросы выполняются не в той базе данных. |
GetJWT | func(ctx) (string, error) | nil | (programmatic only) | Callback-функция, возвращающая JWT для аутентификации ClickHouse Cloud. Можно переопределить для каждого запроса с помощью WithJWT(token). (Начиная с v2.35.0) | Реализуйте кэширование и обновление токена — функция вызывается для каждого подключения/запроса. | Истёкший токен: ошибки аутентификации. Блокирующий callback: тайм-ауты. JWT имеет приоритет над user/pass. Требуется TLS — без него происходит молчаливый возврат к user/pass. |
Тайм-ауты
| Параметр | Тип | По умолчанию | Параметр DSN | Описание | Рекомендация | При неправильной настройке |
|---|---|---|---|---|---|---|
DialTimeout | time.Duration | 30s | dial_timeout | Максимальное время на установку нового соединения. Также задаёт время ожидания получения соединения из пула, если достигнут предел MaxOpenConns. | 5-10s в LAN, 15-30s в WAN/cloud. Никогда не меньше 1s. | Слишком короткий: "clickhouse: acquire conn timeout" при перегрузке. Слишком длинный (> 60s): приложение зависает во время сбоев. |
ReadTimeout | time.Duration | 5m (300s) | read_timeout | Максимальное время ожидания ответа сервера для каждого вызова чтения. Применяется к каждому блоку, а не ко всему запросу. Приоритет имеет deadline контекста. | 10-30s для коротких интерактивных запросов; 5-30m для длительных аналитических запросов. | Слишком короткий: "i/o timeout" или "read: connection reset by peer" в середине запроса; сервер продолжает выполнение. Слишком длинный: разорванные соединения не обнаруживаются. |
Пул соединений
| Параметр | Тип | По умолчанию | Параметр DSN | API | Описание | Рекомендации | При неверной настройке |
|---|---|---|---|---|---|---|---|
MaxIdleConns | int | 5 | max_idle_conns | Оба | Максимальное число бездействующих (неиспользуемых, но открытых) соединений в пуле | 50–80% от ожидаемого числа одновременных запросов. Низкая нагрузка: 2–5, средняя: 10–20, высокая: 20–50. | Слишком мало: частое открытие/закрытие соединений, более высокая задержка. Слишком много: лишний расход памяти. Автоматически ограничивается значением MaxOpenConns. |
MaxOpenConns | int | MaxIdleConns + 5 (по умолчанию: 10) | max_open_conns | Оба | Максимальное общее число соединений (бездействующих + активных) | Низкая нагрузка: 10–20, средняя: 20–50, высокая: 50–100. Формула: одновременные запросы + всплеск + буфер. Мониторинг: SELECT * FROM system.metrics WHERE metric='TCPConnection'. | Слишком мало: "clickhouse: acquire conn timeout". Слишком много: на стороне сервера — "Too many connections", превышены лимиты FD. Значение max_connections в ClickHouse по умолчанию: 1024 (общее). |
ConnMaxLifetime | time.Duration | 1h | conn_max_lifetime | Оба | Максимальное время повторного использования соединения. Проверяется при возврате в пул. | 1–5 ч для стабильных окружений. 5–15 мин для K8s/rolling deploys. Никогда не используйте бесконечное значение. | Слишком мало (< 1m): частое открытие/закрытие соединений, более высокая задержка. Слишком много/бесконечно: устаревшие соединения, не подхватываются изменения DNS, трафик не перераспределяется. |
ConnMaxIdleTime | time.Duration | 0 (нет) | — | только database/sql | Максимальное время, в течение которого соединение может оставаться бездействующим перед закрытием. В структуре Options отсутствует — задаётся через db.SetConnMaxIdleTime(). | 5–10 мин для K8s и неравномерной рабочей нагрузки, чтобы освобождать бездействующие соединения после всплесков трафика. | Не задано: бездействующие соединения сохраняются до ConnMaxLifetime. Слишком мало (< 30s): соединения пересоздаются во время обычных пауз. |
только для
database/sqlConnMaxIdleTime — это стандартная настройка пула Go database/sql. Она недоступна в структуре clickhouse.Options или через clickhouse.Open(). Задайте её после OpenDB():Стандартные настройки пула database/sql
clickhouse.OpenDB() или sql.Open("clickhouse", dsn) возвращаемый объект *sql.DB поддерживает стандартные методы пула Go. OpenDB() автоматически применяет первые три параметра из Options:
| Метод | Эквивалент в Options | Примечания |
|---|---|---|
db.SetMaxIdleConns(n) | MaxIdleConns | Автоматически применяется через OpenDB() |
db.SetMaxOpenConns(n) | MaxOpenConns | Автоматически применяется через OpenDB() |
db.SetConnMaxLifetime(d) | ConnMaxLifetime | Автоматически применяется через OpenDB() |
db.SetConnMaxIdleTime(d) | Нет | Необходимо задать вручную после создания |
API ClickHouse (clickhouse.Open)Эти методы недоступны для подключения, возвращаемого
clickhouse.Open(). API ClickHouse управляет собственным пулом внутри, напрямую используя поля структуры Options.Сжатие
| Option | Type | Default | DSN param | Description | Best practice | When misconfigured |
|---|---|---|---|---|---|---|
Compression.Method | CompressionMethod (byte) | None | compress (lz4, zstd, lz4hc, gzip, deflate, br, or true for LZ4) | Алгоритм сжатия для передачи данных. См. матрицу поддержки протоколов ниже. | LAN: None или LZ4. WAN: ZSTD или LZ4. При ограничениях по CPU: LZ4. Максимальное сжатие: ZSTD (Native) или Brotli (HTTP). Не используйте для вставок < 1 MB. | GZIP/Brotli в Native: ошибка рукопожатия. LZ4HC в HTTP: ошибка или тихий переход на резервный вариант. Без сжатия в медленных сетях: вставки в 10–100 раз медленнее. |
Compression.Level | int | 3 | compress_level | Интенсивность, зависящая от алгоритма. GZIP/Deflate: от -2 до 9. Brotli: от 0 до 11. Для LZ4/ZSTD игнорируется. | Сбалансированный уровень для GZIP: 3-6. Для Brotli: 4-6. | Очень высокие уровни: экстремальная нагрузка на CPU при минимальной пользе. Ненулевое значение для LZ4/ZSTD: молча игнорируется. Уровень без включенного сжатия: не дает эффекта. |
MaxCompressionBuffer | int (bytes) | 10485760 (10 MiB) | max_compression_buffer | Максимальный размер буфера сжатия перед сбросом. У каждого соединения свой буфер. | Значение по умолчанию 10 MiB обычно оптимально. 20-50 MiB для больших строк. Суммарная память = буфер x MaxOpenConns. | Слишком маленький (< 1 MiB): частые сбросы, низкая эффективность. Слишком большой (> 100 MiB): OOM при большом числе соединений. |
| Method | Native | HTTP |
|---|---|---|
CompressionLZ4 | Да | Да |
CompressionLZ4HC | Да | Нет |
CompressionZSTD | Да | Да |
CompressionGZIP | Нет | Да |
CompressionDeflate | Нет | Да |
CompressionBrotli | Нет | Да |
TLS
| Параметр | Тип | По умолчанию | Параметр DSN | Описание | Рекомендуемая практика | При неверной настройке |
|---|---|---|---|---|---|---|
TLS | *tls.Config | nil (без шифрования) | secure=true, skip_verify=true | Конфигурация TLS/SSL. Значение, отличное от nil, включает TLS. Порты: Native 9000/9440, HTTP 8123/8443. | Всегда включайте в продакшн и в ClickHouse Cloud (обязательно). В продакшн используйте InsecureSkipVerify: false. Добавляйте пользовательские CA через RootCAs. | Неверный порт: "connection reset by peer". skip_verify=true в продакшн: уязвимость к MITM-атакам. Просроченный сертификат: "x509: certificate has expired". Неверный хост: "x509: certificate is valid for X, not Y". Недоверенный CA: "x509: certificate signed by unknown authority". Для HTTP DSN с secure=true вместо этого используйте схему https://. |
Журналирование
| Параметр | Type | По умолчанию | Параметр DSN | Описание | Рекомендация | При неверной настройке |
|---|---|---|---|---|---|---|
Logger | *slog.Logger | nil (без журналирования) | — | Структурированный logger через log/slog в Go. Приоритет: Debug+Debugf > Logger > no-op. (Начиная с v2.43.0) | Используйте slog с JSON-обработчиком в продакшн. Добавляйте контекст приложения через logger.With(...). | — |
Debug (устарело) | bool | false | debug | Устаревший флаг отладки. Вместо него используйте Logger. Выводит в stdout, если Debugf не задан. | — | Включен в продакшн: накладные расходы по производительности, подробный вывод журналов, чувствительные данные в выводе. |
Debugf (устарело) | func(string, ...any) | nil | — | Пользовательская функция для вывода отладочных сообщений. Вместо нее используйте Logger. Требует Debug: true. | — | — |
Буферы и память
| Опция | Тип | По умолчанию | Параметр DSN | Для каждого запроса | Описание | Рекомендация | При неверной настройке |
|---|---|---|---|---|---|---|---|
BlockBufferSize | uint8 | 2 | block_buffer_size | Да (WithBlockBufferSize) | Количество декодированных блоков, буферизуемых при чтении результатов. Позволяет читать и декодировать данные параллельно. | Значения 2 по умолчанию обычно достаточно. 5-10 — для больших потоковых результатов. Память = буфер x размер блока x параллельные запросы. | Слишком мало (1): чтение блокируется, задержка выше. Слишком много (> 50): высокое потребление памяти, отдача снижается. |
FreeBufOnConnRelease | bool | false | — | Нет | Освобождать буфер соединения в памяти после каждого запроса вместо повторного использования. | false — при высокой частоте запросов. true — в контейнерах с ограниченной памятью или при редких крупных батчах. | false + ограниченная память: буферы накапливаются (память = буфер x бездействующие соединения). true + высокая частота: нагрузка на GC, повышенное использование CPU. |
Для HTTP
| Option | Type | Default | DSN param | Description | Best practice | When misconfigured |
|---|---|---|---|---|---|---|
HttpHeaders | map[string]string | nil | — | Дополнительные HTTP-заголовки в каждом запросе | Используйте для трассировки (X-Request-ID) и заголовков прокси-аутентификации. Сводите их число к минимуму. | Переопределение внутренних заголовков (Content-Type, Authorization) может привести к непредсказуемому поведению. |
HttpUrlPath | string | "" | http_path | URL-путь, добавляемый к запросам. Начальный / добавляется автоматически. | Используйте, если работаете через обратный прокси с маршрутизацией по пути. | Неверный путь: HTTP 404 от прокси или балансировщика. |
HttpMaxConnsPerHost | int | 0 (без ограничений) | — | Число TCP-соединений на хост на транспортном уровне (http.Transport.MaxConnsPerHost). | Для большинства приложений оставляйте 0. Задавайте только если на сервере есть строгие лимиты на соединения. | Слишком низкое значение (например, 10 при MaxOpenConns=50): узкое место на транспортном уровне, медленные запросы при низкой нагрузке на сервер. |
HTTPProxyURL | *url.URL | nil (использует env vars) | http_proxy (URL-encoded) | HTTP-прокси для маршрутизации запросов | Явно задавайте, если нужен прокси. Переопределяет переменные окружения HTTP_PROXY/HTTPS_PROXY. | Неверный адрес: "dial tcp: lookup proxy: no such host". Если прокси требует аутентификацию — HTTP 407. |
TransportFunc | func(*http.Transport) (http.RoundTripper, error) | nil | — | Пользовательская фабрика HTTP-транспорта. Получает транспорт по умолчанию для обёртывания. (Начиная с v2.41.0) | Используйте для middleware обсервабилити. Не переопределяйте Proxy, DialContext, TLSClientConfig. | Возврат nil: panic. При переопределении полей клиента TLS/прокси молча игнорируются. Блокирующий RoundTripper: взаимная блокировка. |
Двухуровневый пул HTTP-соединенийПри использовании HTTP есть два пула соединений:
- Уровень 1 (приложение):
MaxIdleConns/MaxOpenConns— управляет объектамиhttpConnect - Уровень 2 (транспорт):
HttpMaxConnsPerHost— управляет базовыми TCP-соединениями
HttpMaxConnsPerHost.Расширенные настройки подключения
| Параметр | Тип | По умолчанию | Параметр DSN | Описание | Рекомендация | При неправильной настройке |
|---|---|---|---|---|---|---|
DialContext | func(ctx, addr) (net.Conn, error) | nil (стандартный dialer) | — | Пользовательская функция установки TCP-соединения. Работает и с Native, и с HTTP. | В 99% случаев оставляйте nil. Используйте для Unix-сокетов, SOCKS-прокси и пользовательского DNS. | Если не учитывать context: зависания, утечки ресурсов. Если задан TLS, пользовательский dialer должен сам обрабатывать TLS. Некорректный net.Conn: аварийные сбои. |
DialStrategy | func(ctx, connID, options, dial) (DialResult, error) | DefaultDialStrategy | — | Пользовательская стратегия выбора сервера и установки соединения. Переопределяет ConnOpenStrategy. | В 99,9% случаев используйте значение по умолчанию. Пользовательскую стратегию применяйте только для маршрутизации с учётом географии, взвешенного выбора и проверок работоспособности. | Если не перебирать все серверы: сбои даже при наличии доступных исправных серверов. Дорогостоящие операции внутри: блокируют получение соединения из пула при каждом подключении. |
Информация о клиенте
| Option | Type | Default | DSN param | Per-query | Description | Best practice | When misconfigured |
|---|---|---|---|---|---|---|---|
ClientInfo | ClientInfo struct | Авто: версия clickhouse-go + среда выполнения Go | client_info_product=myapp/1.0 | Да (WithClientInfo, добавляет) | Идентификатор приложения, отправляемый в ClickHouse. Содержит Products ([]struct{Name,Version}) и Comment ([]string). Отображается в system.query_log. | Всегда указывайте имя и версию приложения. Атрибуция запросов: SELECT client_name FROM system.query_log WHERE client_name LIKE '%myapp%' | Если не задано, в средах с несколькими сервисами невозможно определить, какой сервис отправлял запросы. |
Настройки сервера ClickHouse
| Option | Type | Default | DSN param | Per-query | Description | Best practice | When misconfigured |
|---|---|---|---|---|---|---|---|
Settings | map[string]any | nil | Любой нераспознанный параметр (например, ?max_execution_time=60) | Да (WithSettings, при конфликте приоритет у context) | Настройки сервера ClickHouse, применяемые к каждому запросу. Преобразование DSN: "true"→1, "false"→0, числовые значения→int. | Задавайте общие ограничения на уровне соединения, а для отдельных запросов переопределяйте их через context. | Опечатки: молча игнорируются или вызывают ошибку в зависимости от версии. Неверные типы: "Cannot parse string 'abc' as Int64". max_execution_time=0 + отсутствие deadline: запросы выполняются бесконечно. |
CustomSetting | CustomSetting{Value string} | — | — | Да (через WithSettings) | Помечает настройку как “пользовательскую” (неважную) для собственного протокола. Ошибки не будет, если сервер её не распознаёт. HTTP по умолчанию считает все настройки пользовательскими. | Используйте для экспериментальных настроек или настроек, зависящих от версии. | Если пометить важные настройки как пользовательские, они будут молча проигнорированы, если не поддерживаются. |
| Setting | Type | Description |
|---|---|---|
max_execution_time | int | Тайм-аут запроса в секундах |
max_memory_usage | int | Лимит памяти на запрос (в байтах) |
max_block_size | int | Размер блока для обработки |
readonly | int | 1 = только для чтения, 2 = только для чтения + изменение настроек |
Параметры запроса на уровне Context
clickhouse.Context():
Поведение дедлайна контекстаЕсли для контекста задан дедлайн > 1s,
max_execution_time автоматически устанавливается в seconds_remaining + 5. Это значение переопределяет любое значение, заданное вручную.| Параметр | Тип | По умолчанию | Протокол | Описание | Рекомендуемая практика | При неправильной настройке |
|---|---|---|---|---|---|---|
WithQueryID | string | Генерируется автоматически | Оба | Пользовательский идентификатор запроса. Отображается в system.query_log и system.processes. | Используйте UUID. Удобно для KILL QUERY WHERE query_id='...'. | Повторяющиеся идентификаторы: путаница в system.query_log. |
WithQuotaKey | string | "" | Оба | Ключ квоты для ограничения ресурсов в многотенантной среде. Требуется настройка квот на стороне сервера. | Используйте для ограничений на уровне клиента или пользователя. | QUOTA не настроена: молча игнорируется. |
WithJWT | string | "" | Только по HTTPS | Переопределение JWT для ClickHouse Cloud на уровне отдельного запроса. (Начиная с v2.35.0) | Используйте для аутентификации каждого запроса в мультитенантных прокси. | Без TLS: игнорируется, используется аутентификация на уровне соединения. Просрочен: "Token has expired". |
WithSettings | Settings | Наследуется из подключения | Оба | Настройки сервера для отдельных запросов. Объединяются с настройками подключения; при конфликте приоритет у контекста. | Переопределяйте max_execution_time или max_rows_to_read для отдельных типов запросов. | То же, что и для Settings на уровне подключения. |
WithParameters | Параметры (map[string]string) | nil | Оба | Значения параметров для параметризованных запросов на стороне сервера. Синтаксис запроса: {param_name:Type}. | Используйте вместо конкатенации строк, чтобы защититься от SQL-инъекций. | Отсутствует параметр: "Substitution {param_name:Type} isn't set". Неверный тип: "Cannot parse string 'abc' as UInt64". |
WithAsync | bool (wait) | Синхронный | Оба | Режим асинхронной вставки. Устанавливает async_insert=1. wait=true также устанавливает wait_for_async_insert=1. Требуется ClickHouse 21.11+. (Начиная с v2.41.0; заменяет более старый WithStdAsync.) | Используйте для вставок с высокой производительностью. | wait=false: ошибки могут возникать асинхронно — проверьте system.asynchronous_insert_log. Для SELECT: игнорируется. Старый сервер: "Unknown setting async_insert". |
WithLogs | func(*Log) | nil | Только для Native-протокола | Обратный вызов для записей журнала сервера во время выполнения запроса. | Должен работать быстро — блокирует выполнение. Для ресурсоёмкой обработки используйте goroutine. | При HTTP: никогда не вызывается без каких-либо уведомлений. |
WithProgress | func(*Progress) | nil | Только для native-протокола | Обновления Прогресса запроса (обработанные строки/байты). | Обработчик должен работать быстро — он блокирует выполнение. | При HTTP: никогда не вызывается без каких-либо уведомлений. |
WithProfileInfo | func(*ProfileInfo) | nil | Только для Native | Колбэк со статистикой выполнения запроса. | Должен выполняться быстро — блокирует выполнение. | При HTTP: никогда не вызывается без предупреждения. |
WithProfileEvents | func([]ProfileEvent) | nil | Только для Native | Колбэк счётчиков производительности. | Должен выполняться быстро — блокирует выполнение. | При HTTP молча не вызывается. |
WithoutProfileEvents | — | События отправляются | Только для Native | Отключает события профилирования. Оптимизация производительности для серверов ≥ 25.11. (С версии v2.44.0) | Используйте, если profile events не нужны. | На старых серверах: ошибка из-за неизвестного параметра. |
WithExternalTable | ...*ext.Table | nil | Оба | Подключает временные lookup-таблицы к запросу. Данные передаются с каждым запросом. | Используйте таблицы размером < 10 МБ. Нативный протокол эффективнее HTTP (multipart). | Большие таблицы: сетевые накладные расходы на каждый запрос. |
WithUserLocation | *time.Location | Часовой пояс сервера | Оба | Переопределяет часовой пояс для разбора DateTime. | Явно задавайте, если часовые пояса клиента и сервера различаются. | Неверный часовой пояс: значения DateTime будут незаметно смещены на несколько часов, возможна порча данных. |
WithColumnNamesAndTypes | []ColumnNameAndType | nil (выполняется DESCRIBE) | Только для HTTP | Позволяет избежать цикла DESCRIBE TABLE при HTTP-вставках, если заранее указать информацию о столбцах. (Начиная с v2.37.0) | Используйте, когда схема известна и стабильна. | Неверные типы: "Cannot convert String to UInt64". Расхождение схемы после миграции: устаревшие метаданные. |
WithBlockBufferSize | uint8 | На уровне подключения (2) | Оба | Переопределяет параметр BlockBufferSize, заданный на уровне соединения, для одного запроса. | Увеличьте для больших результирующих наборов данных в отдельных запросах. | — |
WithClientInfo | ClientInfo | На уровне соединения | Оба | Добавляет дополнительную информацию о клиенте для отдельного запроса. Не заменяет существующую, а дополняет её. (Начиная с v2.42.0) | Добавьте контекст на уровне отдельного запроса (например, имя конечной точки). | — |
WithSpan | trace.SpanContext | Пусто | Только для нативного протокола | Контекст span OpenTelemetry для распределённой трассировки. | См. OpenTelemetry. | — |
Параметры батча
PrepareBatch(). Импорт: github.com/ClickHouse/clickhouse-go/v2/lib/driver.
| Option | Default | Description | Best practice | When misconfigured |
|---|---|---|---|---|
WithReleaseConnection | Соединение удерживается до Send() | Возвращает соединение в пул сразу после PrepareBatch(). Повторно получает его при Send()/Flush(). | Используйте для долгоживущих батчей (минуты/часы), чтобы избежать исчерпания пула. | Если не использовать для долгоживущих батчей: "acquire conn timeout" при большом числе активных соединений. |
WithCloseOnFlush | Батч остаётся открытым | Автоматически закрывает батч при вызове Flush(). | Используйте для одноразовых батчей. Избавляет от необходимости явно вызывать Close(). | При использовании с несколькими вызовами Flush(): первый Flush() закрывает батч, последующие операции завершаются ошибкой. |
Справочные таблицы
Рекомендации по настройке размера пула соединений
| Тип приложения | MaxIdleConns | MaxOpenConns | ConnMaxLifetime |
|---|---|---|---|
| Веб-приложение с низким трафиком | 5 | 10 | 1h |
| API со средним трафиком | 20 | 50 | 30m |
| Сервис с высоким трафиком | 50 | 100 | 15m |
| Фоновые задачи пакетной обработки | 10 | 20 | 2h |
| Развертывание в Kubernetes | 10 | 20 | 10m |
| Serverless (Lambda) | 1 | 5 | 5m |
Рекомендации по тайм-аутам
| Среда | DialTimeout | ReadTimeout |
|---|---|---|
| Локально / LAN | 5s | 30s |
| Cloud, тот же регион | 10s | 2m |
| Cloud, разные регионы | 30s | 5m |
| Рабочая нагрузка OLAP | 10s | 30m |
| Реальное время / OLTP | 5s | 10s |
Краткий справочник по параметрам DSN
| Параметр DSN | Поле в Options | Пример |
|---|---|---|
username | Auth.Username | ?username=admin |
password | Auth.Password | ?password=secret |
database | Auth.Database | ?database=mydb или /mydb в path |
dial_timeout | DialTimeout | ?dial_timeout=10s |
read_timeout | ReadTimeout | ?read_timeout=5m |
max_open_conns | MaxOpenConns | ?max_open_conns=50 |
max_idle_conns | MaxIdleConns | ?max_idle_conns=20 |
conn_max_lifetime | ConnMaxLifetime | ?conn_max_lifetime=30m |
connection_open_strategy | ConnOpenStrategy | ?connection_open_strategy=round_robin |
block_buffer_size | BlockBufferSize | ?block_buffer_size=10 |
compress | Compression.Method | ?compress=lz4 |
compress_level | Compression.Level | ?compress_level=6 |
max_compression_buffer | MaxCompressionBuffer | ?max_compression_buffer=20971520 |
secure | TLS | ?secure=true |
skip_verify | TLS.InsecureSkipVerify | ?skip_verify=true |
debug | Debug | ?debug=true |
client_info_product | ClientInfo.Products | ?client_info_product=myapp/1.0 |
http_proxy | HTTPProxyURL | ?http_proxy=http%3A%2F%2Fproxy%3A8080 |
http_path | HttpUrlPath | ?http_path=/clickhouse |
| (любой другой) | Settings[key] | ?max_execution_time=60 |
Устранение неполадок
Пул соединений исчерпан: “acquire conn timeout”
MaxOpenConns заняты, и ни одно не освободилось в течение DialTimeout.
Решение
Попробуйте выполнить следующие шаги по порядку и определить первопричину, прежде чем менять параметры:
- Проверьте, нет ли длительно выполняющихся запросов, удерживающих соединения:
SELECT query_id, elapsed FROM system.processes ORDER BY elapsed DESC. Если такие запросы есть, сначала разберитесь с ними. - Если вы используете долгоживущие батчи (минуты/часы между
PrepareBatch()иSend()), применяйтеWithReleaseConnection(), чтобы вернуть соединение в пул, пока батч остаётся открытым. - Увеличьте
MaxOpenConnsв соответствии с наблюдаемым параллелизмом. - Увеличивайте
DialTimeoutтолько в том случае, если ожидаются всплески нагрузки и реким узким местом действительно является ожидание получения соединения.
Ошибки тайм-аута чтения и сброса соединения
ReadTimeout при ожидании ответа от сервера, либо соединение было закрыто сервером или сетью.
Решение:
- Увеличьте
ReadTimeoutдля длительно выполняющихся запросов - Используйте дедлайны контекста для управления тайм-аутом отдельных запросов
- Проверьте ограничения
max_execution_timeна стороне ClickHouse server
”Код: 516. Ошибка аутентификации”
- Проверьте учетные данные в таблице
system.users - Проверьте, нет ли проблем с URL-кодированием специальных символов в паролях DSN
- Убедитесь, что у пользователя есть доступ к указанной базе данных
Ошибки TLS-сертификатов
| Ошибка | Причина | Решение |
|---|---|---|
x509: certificate has expired | Срок действия сертификата сервера истёк | Обновите сертификат сервера |
x509: certificate is valid for X, not Y | Несоответствие имени хоста | Используйте правильное имя хоста или добавьте его в SAN |
x509: certificate signed by unknown authority | Недоверенный CA | Добавьте CA в tls.Config.RootCAs |
connection reset by peer | Несоответствие TLS и порта | Для TLS используйте порт 9440 (Native) или 8443 (HTTP) |
Постепенный рост потребления памяти
- Установите
FreeBufOnConnRelease: trueв средах с ограниченным объёмом памяти - Уменьшите
MaxIdleConns, чтобы ограничить количество бездействующих соединений - Уменьшите
MaxCompressionBuffer, если используете сжатие - Уменьшите
ConnMaxLifetime, чтобы соединения пересоздавались чаще