Merge pull request #1113 from BayoNet/master

<invalidate_query> setting of external dictionary <source> section is described
This commit is contained in:
alexey-milovidov 2017-08-17 22:21:09 +03:00 committed by GitHub
commit 34dc2e5279
4 changed files with 41 additions and 15 deletions

View File

@ -6,12 +6,13 @@
Существует возможность подключать собственные словари из различных источников данных. Источником данных для словаря может быть локальный текстовый/исполняемый файл, HTTP(s) ресурс или другая СУБД. Подробнее смотрите в разделе ":ref:`dicts-external_dicts_dict_sources`".
ClickHouse может полностью или частично хранить словари в оперативной памяти, периодически обновлять их и динамически подгружать отсутствующие значения.
ClickHouse:
* Полностью или частично хранить словари в оперативной памяти.
* Периодически обновляет их и динамически подгружает отсутствующие значения. Т.е. словари можно подгружать динамически.
Конфигурация внешних словарей находится в одном или нескольких файлах. Путь к конфигурации указывается в параметре :ref:`server_settings-dictionaries_config`.
Периодически ClickHouse обновляет конфигурацию словарей и словари. Т.о. словари можно подгружать динамически.
Словари могут загружаться при старте сервера или при первом использовании, в зависимости от настройки :ref:`server_settings-dictionaries_lazy_load`.
Конфигурационный файл словарей имеет вид:
@ -19,7 +20,7 @@ ClickHouse может полностью или частично хранить
.. code-block:: xml
<dictionaries>
<comment>Необязательный элемент с любым содержимым. Полностью игнорируется.</comment>
<comment>Необязательный элемент с любым содержимым. Игнорируется сервером ClickHouse.</comment>
<dictionary>
<!-- Конфигурация словаря -->
@ -36,7 +37,7 @@ ClickHouse может полностью или частично хранить
Смотрите также ":ref:`ext_dict_functions`" .
.. attention:: Вы можете преобразовать значения по небольшому словарю, описав его в запросе ``SELECT`` (см. функцию ":ref:`other_functions-transform`"). Эта функциональность не связана с внешними словарями.
.. attention:: Вы можете преобразовывать значения по небольшому словарю, описав его в запросе ``SELECT`` (см. функцию ":ref:`other_functions-transform`"). Эта функциональность не связана с внешними словарями.
.. toctree::
:glob:

View File

@ -15,10 +15,6 @@
* Вызывать функцию для работы со словарём после ``GROUP BY``.
* Помечать извлекаемые атрибуты как инъективные. Атрибут называется инъективным, если разным ключам соответствуют разные значения атрибута. Тогда при использовании в ``GROUP BY`` функции, достающей значение атрибута по ключу, эта функция автоматически выносится из ``GROUP BY``.
ClickHouse периодически обновляет словари. Сначала проверяется время модификации файла/таблицы, затем, если файл/таблица обновились, обновляется словарь. Если словарь хранится в таблице типа MyISAM, то время модификации проверяется запросом ``SHOW TABLE STATUS``. Для таблиц InnoDB нельзя получить время модификации, поэтому словарь обновляется каждый раз.
Обновление словарей (кроме загрузки при первом использовании) не блокирует запросы - во время обновления используется старая версия словаря. Если при обновлении возникнет ошибка, то ошибка пишется в лог сервера, а запросы продолжат использовать старую версию словарей.
При ошибках работы со словарями ClickHouse генерирует исключения. Например, в следующих ситуациях:
* При обращении к словарю, который не удалось загрузить.

View File

@ -6,7 +6,7 @@
ClickHouse периодически обновляет словари. Интервал обновления для полностью загружаемых словарей и интервал инвалидации для кэшируемых словарей определяется в теге ``<lifetime>`` в секундах.
Обновление словарей (кроме загрузки при первом использовании) не блокирует запросы, во время обновления используется старая версия словаря. Если при обновлении возникнет ошибка, то ошибка пишется в лог сервера, а запросы продолжат использовать старую версию словарей.
Обновление словарей (кроме загрузки при первом использовании) не блокирует запросы - во время обновления используется старая версия словаря. Если при обновлении возникнет ошибка, то ошибка пишется в лог сервера, а запросы продолжат использовать старую версию словарей.
Пример настройки:
@ -36,3 +36,28 @@ ClickHouse периодически обновляет словари. Инте
</lifetime>
...
</dictionary>
При обновлении словарей сервер ClickHouse применяет различную логику в зависимости от типа :ref:`источника <dicts-external_dicts_dict_sources>`:
* У текстового файла проверяется время модификации. Если время изменилось по отношению к запомненному ранее, то словарь обновляется.
* Для таблиц типа MyISAM, время модификации проверяется запросом ``SHOW TABLE STATUS``.
* Словари из других источников по умолчанию обновляются каждый раз.
Для источников MySQL (InnoDB), ODBC можно настроить запрос, который позволит обновлять словари только в случае их фактического изменения, а не каждый раз. Чтобы это сделать необходимо выполнить следующие условия/действия:
* В таблице словаря должно быть поле, которое гарантированно изменяется при обновлении данных в источнике.
* В настройках источника указывается запрос, который получает изменяющееся поле. Результат запроса сервер ClickHouse интерпретирует как строку и если эта строка изменилась по отношению к предыдущему состоянию, то словарь обновляется. Запрос следует указывать в поле ``<invalidate_query>`` настроек :ref:`источника <dicts-external_dicts_dict_sources>`.
Пример настройки:
.. code-block:: xml
<dictionary>
...
<odbc>
...
<invalidate_query>SELECT update_time FROM dictionary_source where id = 1</invalidate_query>
</odbc>
...
</dictionary>

View File

@ -125,13 +125,15 @@ ODBC
<db>DatabaseName</db>
<table>TableName</table>
<connection_string>DSN=some_parameters</connection_string>
<invalidate_query>SQL_REQUEST</invalidate_query>
</odbc>
Поля настройки:
* ``db`` - Имя базы данных. Не указывать, если имя базы задано в параметрах ``<connection_string>``.
* ``table`` - Имя таблицы.
* ``connection_string`` - Строка соединения.
* ``db`` - имя базы данных. Не указывать, если имя базы задано в параметрах ``<connection_string>``.
* ``table`` - имя таблицы.
* ``connection_string`` - строка соединения.
* ``invalidate_query`` - запрос для проверки статуса словаря. Необязательный параметр. Читайте подробнее в разделе :ref:`dicts-external_dicts_dict_lifetime`.
Пример подключения PostgreSQL
@ -308,6 +310,7 @@ MySQL
<db>conv_main</db>
<table>counters</table>
<where>id=10</where>
<invalidate_query>SQL_REQUEST</invalidate_query>
</mysql>
</source>
@ -323,7 +326,8 @@ MySQL
* ``replica/priority`` - приоритет реплики. При попытке соединения ClickHouse обходит реплики в соответствии с приоритетом. Чем меньше цифра, тем выше приоритет.
* ``db`` - имя базы данных.
* ``table`` - имя таблицы.
* ``where`` - условие выбора. Может отсутствовать.
* ``where`` - условие выбора. Необязательный параметр.
* ``invalidate_query`` - запрос для проверки статуса словаря. Необязательный параметр. Читайте подробнее в разделе :ref:`dicts-external_dicts_dict_lifetime`.
.. _dicts-external_dicts_dict_sources-clickhouse:
@ -385,4 +389,4 @@ MongoDB
* ``user`` - имя пользователя MongoDB.
* ``password`` - пароль пользователя MongoDB.
* ``db`` - имя базы данных.
* ``collection`` - имя коллекции.
* ``collection`` - имя коллекции.