ClickHouse/docs/ru/dicts/external_dicts_dict_lifetime.rst

64 lines
3.8 KiB
ReStructuredText
Raw Normal View History

.. _dicts-external_dicts_dict_lifetime:
*******************
Обновление словарей
*******************
ClickHouse периодически обновляет словари. Интервал обновления для полностью загружаемых словарей и интервал инвалидации для кэшируемых словарей определяется в теге ``<lifetime>`` в секундах.
Обновление словарей (кроме загрузки при первом использовании) не блокирует запросы - во время обновления используется старая версия словаря. Если при обновлении возникнет ошибка, то ошибка пишется в лог сервера, а запросы продолжат использовать старую версию словарей.
Пример настройки:
.. code-block:: xml
<dictionary>
...
<lifetime>300</lifetime>
...
</dictionary>
Настройка ``<lifetime>0</lifetime>`` запрещает обновление словарей.
Можно задать интервал, внутри которого ClickHouse равномерно-случайно выберет время для обновления. Это необходимо для распределения нагрузки на источник словаря при обновлении на большом количестве серверов.
Пример настройки:
.. code-block:: xml
<dictionary>
...
<lifetime>
<min>300</min>
<max>360</max>
</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>