Перейти к основному содержанию
Перейти к основному содержанию

Журнал изменений за 2017 год

Релиз ClickHouse 1.1.54327, 2017-12-21

Этот релиз содержит исправления ошибок для предыдущего релиза 1.1.54318:

  • Исправлена ошибка с возможным состоянием гонки в репликации, которая могла приводить к потере данных. Эта проблема затрагивает версии 1.1.54310 и 1.1.54318. Если вы используете одну из этих версий с реплицируемыми таблицами, настоятельно рекомендуется выполнить обновление. Эта проблема проявляется в логах предупреждающими сообщениями вида Part ... from own log does not exist.. Проблема актуальна, даже если вы не видите эти сообщения в логах.

Релиз ClickHouse 1.1.54318, 2017-11-30

Этот релиз содержит исправления ошибок для предыдущего релиза 1.1.54310:

  • Исправлено некорректное удаление строк во время слияний в движке SummingMergeTree
  • Исправлена утечка памяти в нереплицируемых движках MergeTree
  • Исправлена деградация производительности при частых вставках в движки MergeTree
  • Исправлена проблема, приводившая к остановке очереди репликации
  • Исправлена ротация и архивирование серверных логов

Релиз ClickHouse 1.1.54310, 2017-11-01

Новые возможности:

  • Пользовательский ключ партиционирования для семейства движков таблиц MergeTree.
  • Движок таблиц Kafka.
  • Добавлена поддержка загрузки моделей CatBoost и их применения к данным, хранящимся в ClickHouse.
  • Добавлена поддержка часовых поясов с нецелочисленным смещением от UTC.
  • Добавлена поддержка арифметических операций с временными интервалами.
  • Диапазон значений для типов Date и DateTime расширен до 2105 года.
  • Добавлен запрос CREATE MATERIALIZED VIEW x TO y (указывается существующая таблица для хранения данных материализованного представления).
  • Добавлен запрос ATTACH TABLE без аргументов.
  • Логика обработки столбцов типа Nested с именами, оканчивающимися на -Map, в таблице SummingMergeTree была вынесена в агрегатную функцию sumMap. Теперь вы можете указывать такие столбцы явно.
  • Максимальный размер словаря IP trie увеличен до 128M записей.
  • Добавлена функция getSizeOfEnumType.
  • Добавлена агрегатная функция sumWithOverflow.
  • Добавлена поддержка входного формата Cap'n Proto.
  • Теперь можно настраивать уровень сжатия при использовании алгоритма zstd.

Несовместимые изменения:

  • Создание временных таблиц с движком, отличным от Memory, не допускается.
  • Явное создание таблиц с движком View или MaterializedView не допускается.
  • При создании таблицы выполняется новая проверка, которая удостоверяется, что выражение выборки (sampling key) входит в первичный ключ.

Исправления ошибок:

  • Исправлены зависания при синхронной вставке в таблицу Distributed.
  • Исправлено неатомарное добавление и удаление частей в реплицируемых таблицах.
  • Данные, вставляемые в материализованное представление, не подвергаются избыточной дедупликации.
  • Выполнение запроса к таблице Distributed, для которой локальная реплика отстает, а удалённые реплики недоступны, больше не приводит к ошибке.
  • Пользователям больше не нужны права доступа к базе данных default для создания временных таблиц.
  • Исправлено падение при указании типа Array без аргументов.
  • Исправлены зависания, когда дисковый том, содержащий серверные логи, заполнен.
  • Исправлено переполнение в функции toRelativeWeekNum для первой недели эпохи Unix.

Улучшения сборки:

  • Несколько сторонних библиотек (в частности, Poco) были обновлены и преобразованы в git submodules.

Релиз ClickHouse 1.1.54304, 2017-10-19

Новые возможности:

  • Поддержка TLS в нативном протоколе (для включения установите tcp_ssl_port в config.xml).

Исправления ошибок:

  • ALTER для реплицируемых таблиц теперь пытается начать выполняться как можно скорее.
  • Исправлен сбой при чтении данных с настройкой preferred_block_size_bytes=0.
  • Исправлены падения clickhouse-client при нажатии Page Down.
  • Исправлена интерпретация некоторых сложных запросов с GLOBAL IN и UNION ALL.
  • FREEZE PARTITION теперь всегда работает атомарно.
  • Пустые POST-запросы теперь возвращают ответ с кодом 411.
  • Исправлены ошибки интерпретации для выражений вида CAST(1 AS Nullable(UInt8)).
  • Исправлена ошибка при чтении столбцов типа Array(Nullable(String)) из таблиц MergeTree.
  • Исправлен сбой при разборе запросов вида SELECT dummy AS dummy, dummy AS b.
  • Пользователи корректно обновляются при некорректном users.xml.
  • Исправлена обработка случая, когда исполняемый словарь возвращает ненулевой код ответа.

ClickHouse Release 1.1.54292, 2017-09-20

New Features:

  • Добавлена функция pointInPolygon для работы с координатами на координатной плоскости.
  • Добавлена агрегатная функция sumMap для вычисления суммы массивов, аналогично SummingMergeTree.
  • Добавлена функция trunc. Повышена производительность функций округления (round, floor, ceil, roundToExp2) и скорректирована логика их работы. Изменена логика работы функции roundToExp2 для дробных и отрицательных чисел.
  • Исполняемый файл ClickHouse теперь меньше зависит от версии libc. Один и тот же исполняемый файл ClickHouse может работать на широком спектре систем Linux. Зависимость остаётся при использовании компилируемых запросов (с настройкой compile = 1, которая по умолчанию не используется).
  • Сокращено время, необходимое для динамической компиляции запросов.

Bug Fixes:

  • Исправлена ошибка, которая иногда приводила к появлению сообщений part ... intersects previous part и ослабляла согласованность реплик.
  • Исправлена ошибка, из-за которой сервер зависал, если ZooKeeper был недоступен во время остановки.
  • Убрано избыточное логирование при восстановлении реплик.
  • Исправлена ошибка в реализации UNION ALL.
  • Исправлена ошибка в функции concat, возникавшая, если первый столбец в блоке имеет тип Array.
  • Прогресс теперь корректно отображается в таблице system.merges.

ClickHouse Release 1.1.54289, 2017-09-13

New Features:

  • Запросы SYSTEM для администрирования сервера: SYSTEM RELOAD DICTIONARY, SYSTEM RELOAD DICTIONARIES, SYSTEM DROP DNS CACHE, SYSTEM SHUTDOWN, SYSTEM KILL.
  • Добавлены функции для работы с массивами: concat, arraySlice, arrayPushBack, arrayPushFront, arrayPopBack, arrayPopFront.
  • Добавлены параметры root и identity для конфигурации ZooKeeper. Это позволяет изолировать отдельных пользователей в одном кластере ZooKeeper.
  • Добавлены агрегатные функции groupBitAnd, groupBitOr и groupBitXor (для совместимости они также доступны под именами BIT_AND, BIT_OR и BIT_XOR).
  • Внешние словари могут загружаться из MySQL при указании сокета в файловой системе.
  • Внешние словари могут загружаться из MySQL по SSL (параметры ssl_cert, ssl_key, ssl_ca).
  • Добавлена настройка max_network_bandwidth_for_user для ограничения суммарного сетевого трафика запросов на пользователя.
  • Добавлена поддержка DROP TABLE для временных таблиц.
  • Добавлена поддержка чтения значений DateTime в формате Unix timestamp из форматов CSV и JSONEachRow.
  • Отстающие реплики в распределённых запросах теперь по умолчанию исключаются (порог по умолчанию — 5 минут).
  • При выполнении ALTER используется блокировка по принципу FIFO: запрос ALTER не блокируется бесконечно при непрерывно выполняющихся запросах.
  • Добавлена возможность задать umask в конфигурационном файле.
  • Улучшена производительность запросов с DISTINCT.

Bug Fixes:

  • Улучшен процесс удаления старых узлов в ZooKeeper. Ранее старые узлы иногда не удалялись при очень частых вставках, что, среди прочего, приводило к медленному завершению работы сервера.
  • Исправлён случайный выбор хостов для подключения к ZooKeeper.
  • Исправлено исключение отстающих реплик из распределённых запросов, если реплика — это localhost.
  • Исправлена ошибка, при которой часть данных в таблице ReplicatedMergeTree могла быть повреждена после выполнения ALTER MODIFY над элементом структуры Nested.
  • Исправлена ошибка, которая могла приводить к «зависанию» запросов SELECT.
  • Улучшены распределённые DDL-запросы.
  • Исправлен запрос CREATE TABLE ... AS <materialized view>.
  • Устранена взаимоблокировка в запросе ALTER ... CLEAR COLUMN IN PARTITION для таблиц Buffer.
  • Исправлено некорректное значение по умолчанию для типов Enum (0 вместо минимального значения) при использовании форматов JSONEachRow и TSKV.
  • Устранено появление «зомби»-процессов при использовании словаря с источником executable.
  • Исправлена ошибка сегментации (segfault) для запроса HEAD.

Улучшенный процесс разработки и сборки ClickHouse:

  • Можно использовать pbuilder для сборки ClickHouse.
  • Можно использовать libc++ вместо libstdc++ для сборок под Linux.
  • Добавлены инструкции по использованию инструментов статического анализа кода: Coverage, clang-tidy, cppcheck.

Обратите внимание при обновлении:

  • Теперь установлено более высокое значение по умолчанию для настройки MergeTree max_bytes_to_merge_at_max_space_in_pool (максимальный общий размер сливаемых частей данных в байтах): оно увеличено со 100 GiB до 150 GiB. Это может привести к запуску крупных слияний после обновления сервера, что может вызвать повышенную нагрузку на дисковую подсистему. Если свободное место, доступное на сервере, менее чем в два раза превышает суммарный объём выполняющихся слияний, это приведёт к остановке всех остальных слияний, включая слияния маленьких частей данных. В результате запросы INSERT будут завершаться с сообщением «Merges are processing significantly slower than inserts.» Используйте запрос SELECT * FROM system.merges для мониторинга ситуации. Вы также можете проверить метрику DiskSpaceReservedForMerge в таблице system.metrics или в Graphite. Ничего делать не нужно, так как проблема разрешится сама после завершения крупных слияний. Если вы считаете это неприемлемым, вы можете восстановить предыдущее значение настройки max_bytes_to_merge_at_max_space_in_pool. Для этого перейдите в раздел <merge_tree> в config.xml, установите <merge_tree><max_bytes_to_merge_at_max_space_in_pool>107374182400</max_bytes_to_merge_at_max_space_in_pool> и перезапустите сервер.

Релиз ClickHouse 1.1.54284, 2017-08-29

  • Это релиз с исправлениями ошибок для предыдущего релиза 1.1.54282. Исправлены утечки в каталоге частей в ZooKeeper.

Релиз ClickHouse 1.1.54282, 2017-08-23

Этот релиз содержит исправления ошибок для предыдущего релиза 1.1.54276:

  • Исправлена ошибка DB::Exception: Assertion violation: !_path.empty() при вставке в таблицу Distributed.
  • Исправлена обработка данных при вставке в формате RowBinary, если входные данные начинаются с ';'.
  • Исправлены ошибки при компиляции во время выполнения для некоторых агрегатных функций (например, groupArray()).

Релиз ClickHouse 1.1.54276, 2017-08-16

Новые возможности:

  • Добавлен необязательный раздел WITH для запроса SELECT. Пример запроса: WITH 1+1 AS a SELECT a, a*a
  • INSERT может выполняться синхронно в таблицу типа Distributed: OK возвращается только после того, как все данные сохранены на всех шардах. Эта возможность включается настройкой insert_distributed_sync=1.
  • Добавлен тип данных UUID для работы с 16-байтовыми идентификаторами.
  • Добавлены псевдонимы типов CHAR, FLOAT и других для совместимости с Tableau.
  • Добавлены функции toYYYYMM, toYYYYMMDD и toYYYYMMDDhhmmss для преобразования времени в числа.
  • Можно использовать IP-адреса (вместе с именем хоста) для идентификации серверов для кластерных DDL-запросов.
  • Добавлена поддержка неконстантных аргументов и отрицательных смещений в функции substring(str, pos, len).
  • Добавлен параметр max_size для агрегатной функции groupArray(max_size)(column) и оптимизирована её производительность.

Основные изменения:

  • Улучшения безопасности: все файлы сервера создаются с правами 0640 (может быть изменено через параметр конфигурации <umask>).
  • Улучшены сообщения об ошибках для запросов с некорректным синтаксисом.
  • Существенно снижено потребление памяти и улучшена производительность при слиянии крупных частей данных MergeTree.
  • Существенно повышена производительность слияния данных для движка ReplacingMergeTree.
  • Улучшена производительность асинхронных вставок из таблицы типа Distributed за счёт объединения нескольких исходных вставок. Для включения этой функциональности используйте настройку distributed_directory_monitor_batch_inserts=1.

Изменения, нарушающие обратную совместимость:

  • Изменён двоичный формат агрегатных состояний функций groupArray(array_column) для массивов.

Полный список изменений:

  • Добавлена настройка output_format_json_quote_denormals, которая позволяет выводить значения nan и inf в формате JSON.
  • Оптимизировано распределение потоков при чтении из таблицы типа Distributed.
  • Настройки могут быть заданы в режиме readonly, если значение не изменяется.
  • Добавлена возможность получать нецелые гранулы для движка MergeTree, чтобы удовлетворять ограничениям на размер блока, задаваемым в настройке preferred_block_size_bytes. Цель — уменьшить потребление ОЗУ и повысить локальность кэша при обработке запросов к таблицам с большими столбцами.
  • Эффективное использование индексов, содержащих выражения вида toStartOfHour(x) для условий вида toStartOfHour(x) op constexpr.
  • Добавлены новые настройки для движков MergeTree (секция merge_tree в config.xml):
    • replicated_deduplication_window_seconds задаёт количество секунд, в течение которых допускается дедупликация вставок в реплицируемых таблицах.
    • cleanup_delay_period задаёт, как часто запускать очистку для удаления устаревших данных.
    • replicated_can_become_leader может предотвратить назначение реплики лидером (и назначение слияний).
  • Ускорена очистка устаревших данных из ZooKeeper.
  • Многочисленные улучшения и исправления для кластерных DDL-запросов. Особый интерес представляет новая настройка distributed_ddl_task_timeout, которая ограничивает время ожидания ответа от серверов в кластере. Если DDL-запрос не был выполнен на всех хостах, ответ будет содержать ошибку тайм-аута, и запрос будет выполнен в асинхронном режиме.
  • Улучшено отображение трассировок стека в серверных логах.
  • Добавлено значение "none" для метода сжатия.
  • Можно использовать несколько секций dictionaries_config в config.xml.
  • Возможна работа с MySQL через сокет в файловой системе.
  • В таблицу system.parts добавлен новый столбец с информацией о размере меток (marks) в байтах.

Исправление ошибок:

  • Распределённые таблицы, использующие таблицу Merge, теперь корректно работают для запроса SELECT с условием по полю _table.
  • Исправлено редкое состояние гонки в ReplicatedMergeTree при проверке частей данных.
  • Исправлено возможное зависание на этапе "leader election" при запуске сервера.
  • Настройка max_replica_delay_for_distributed_queries игнорировалась при использовании локальной реплики источника данных. Это исправлено.
  • Исправлено некорректное поведение ALTER TABLE CLEAR COLUMN IN PARTITION при попытке очистки несуществующего столбца.
  • Исправлено исключение в функции multiIf при использовании пустых массивов или строк.
  • Исправлены избыточные выделения памяти при десериализации формата Native.
  • Исправлено некорректное автообновление Trie-словарей.
  • Исправлено исключение при выполнении запросов с предложением GROUP BY из таблицы Merge при использовании SAMPLE.
  • Исправлен сбой GROUP BY при использовании distributed_aggregation_memory_efficient=1.
  • Теперь можно указывать database.table в правой части IN и JOIN.
  • Для параллельной агрегации использовалось слишком много потоков. Это исправлено.
  • Исправлена работа функции if с аргументами типа FixedString.
  • SELECT работал некорректно по Distributed-таблице для шардов с весом 0. Это исправлено.
  • Выполнение CREATE VIEW IF EXISTS больше не приводит к сбоям.
  • Исправлено некорректное поведение при установленном input_format_skip_unknown_fields=1 и наличии отрицательных чисел.
  • Исправлен бесконечный цикл в функции dictGetHierarchy(), если в словаре есть некорректные данные.
  • Исправлены ошибки Syntax error: unexpected (...) при выполнении распределённых запросов с подзапросами в предложении IN или JOIN и таблицами Merge.
  • Исправлена некорректная интерпретация запроса SELECT по таблицам Dictionary.
  • Исправлена ошибка "Cannot mremap" при использовании массивов в предложениях IN и JOIN с более чем 2 миллиардами элементов.
  • Исправлен механизм failover для словарей с источником MySQL.

Улучшенный рабочий процесс разработки и сборки ClickHouse:

  • Сборки можно собирать в Arcadia.
  • Для компиляции ClickHouse можно использовать gcc 7.
  • Параллельные сборки с использованием ccache+distcc теперь работают быстрее.

Релиз ClickHouse 1.1.54245, 2017-07-04

Новые возможности:

  • Распределённый DDL (например, CREATE TABLE ON CLUSTER)
  • Реплицируемый запрос ALTER TABLE CLEAR COLUMN IN PARTITION.
  • Движок для таблиц Dictionary (доступ к данным словаря в виде таблицы).
  • Движок базы данных Dictionary (для этой базы данных автоматически доступны таблицы Dictionary для всех подключённых внешних словарей).
  • Можно проверять обновления словаря, отправляя запрос к источнику.
  • Квалифицированные имена столбцов.
  • Экранирование идентификаторов с помощью двойных кавычек.
  • Сессии в HTTP-интерфейсе.
  • Запрос OPTIMIZE для Replicated-таблицы может выполняться не только на лидере.

Несовместимые с предыдущими версиями изменения:

  • Удалён SET GLOBAL.

Незначительные изменения:

  • Теперь после срабатывания алерта в лог выводится полный стек вызовов.
  • Ослаблена проверка количества повреждённых/лишних частей данных при старте (ранее было слишком много ложных срабатываний).

Исправленные ошибки:

  • Исправлено "залипание" плохого соединения при вставке в Distributed-таблицу.
  • GLOBAL IN теперь работает для запроса из таблицы Merge, который обращается к Distributed-таблице.
  • На виртуальной машине Google Compute Engine неправильно определялось количество ядер. Это исправлено.
  • Изменена работа исполняемого источника кэшируемых внешних словарей.
  • Исправлено сравнение строк, содержащих нулевые символы.
  • Исправлено сравнение полей первичного ключа Float32 с константами.
  • Ранее некорректная оценка размера поля могла приводить к чрезмерно большим выделениям памяти.
  • Исправлен сбой при запросе Nullable-столбца, добавленного в таблицу с помощью ALTER.
  • Исправлен сбой при сортировке по Nullable-столбцу, если число строк меньше LIMIT.
  • Исправлен подзапрос в ORDER BY, состоящий только из константных значений.
  • Ранее Replicated-таблица могла оставаться в некорректном состоянии после неудачного DROP TABLE.
  • Псевдонимы для скалярных подзапросов с пустыми результатами больше не теряются.
  • Теперь запрос, использующий компиляцию, не завершается с ошибкой, если .so-файл повреждён.