Управление часовыми поясами
Doris поддерживает настройку часовых поясов. В этом документе описаны назначение параметров часовых поясов в Doris, способы их просмотра и настройки, влияние часового пояса на функции и типы данных, обработка летнего времени и рекомендации по работе с данными, зависящими от часового пояса.
Сценарии применения
| Сценарий | Описание |
|---|---|
| Инициализация кластера | Настройка time_zone после развертывания с учетом расположения бизнеса или единого стандарта |
| Загрузка данных из разных часовых поясов | Загрузка данных с указанием часового пояса или без него с помощью Stream Load, Broker Load и аналогичных способов |
| Согласование результатов функций | Настройка часового пояса для значений, возвращаемых такими функциями, как NOW(), CURTIME() и FROM_UNIXTIME |
| Обработка летнего времени | Работа с именованными часовыми поясами, предусматривающими переход на летнее время, например America/Los_Angeles |
| Обновление данных о часовых поясах | Обновление данных о часовых поясах на машинах BE после выпуска новой версии tzdata организацией IANA |
Основные понятия
В Doris есть два параметра, связанных с часовыми поясами:
| Параметр | Можно изменить | Описание |
|---|---|---|
system_time_zone | Нет | Автоматически задается системой при запуске сервера на основе локального часового пояса машины. После установки изменить его нельзя. |
time_zone | Да | Текущий часовой пояс кластера. При запуске кластера совпадает с system_time_zone и остается неизменным, пока его не изменят вручную. |
Просмотр и настройка часового пояса
Просмотр текущего часового пояса
Чтобы просмотреть переменные, связанные с часовыми поясами, выполните следующий оператор SQL:
show variables like '%time_zone%';
Настройка часового пояса
Измените time_zone с помощью оператора SET:
SET [global] time_zone = 'Asia/Shanghai';
- Без ключевого слова
global: изменение действует только в текущем сеансе. - С ключевым словом
global: FE Doris сохраняет параметр, и изменение действует для всех последующих новых сеансов.
Источник данных о часовых поясах
Данные о часовых поясах включают названия часовых поясов, соответствующие смещения времени, переходы на летнее время и другую информацию. На машине BE эти данные берутся из каталога, возвращаемого командой TZDIR. Если команда не поддерживается, источником служит каталог /usr/share/zoneinfo.
Форматы значений часового пояса
Значения часового пояса можно задавать в нескольких форматах. Doris полностью поддерживает следующие стандартные форматы:
| Тип | Пример | Описание |
|---|---|---|
| Стандартный именованный часовой пояс | Asia/Shanghai, America/Los_Angeles, Etc/GMT+3 | Берется из локальных данных о часовых поясах |
| Стандартный формат смещения | +02:30, -10:00 | Нестандартные смещения, например +12:03, не поддерживаются |
| Сокращенное обозначение часового пояса | GMT, UTC | Эквивалентно часовому поясу +00:00 |
| Сокращенное обозначение часового пояса | CST | Эквивалентно часовому поясу Asia/Shanghai |
| Одна буква Z | Z | Обозначает часовой пояс Zulu, эквивалентный часовому поясу +00:00 |
Кроме того, регистр букв при разборе не учитывается.
Из-за различий в реализации некоторые способы загрузки в настоящее время поддерживают и другие форматы. В производственных средах нельзя полагаться на форматы, не перечисленные здесь. Их поведение может измениться в любой момент. Следите за соответствующими обновлениями в журнале изменений каждого выпуска.
Влияние часового пояса
Влияние на функции
Часовой пояс влияет на значения, возвращаемые функциями времени, такими как NOW() и CURTIME(), а также на значения времени, отображаемые в SHOW LOAD и SHOW BACKENDS.
Однако он не влияет на значения LESS THAN для столбцов секционирования временных типов в CREATE TABLE и на отображаемые значения данных, хранящихся в типах DATE, DATETIME или TIMESTAMP_NS.
Функции, на которые влияет часовой пояс:
| Функция | Поведение |
|---|---|
FROM_UNIXTIME | Принимает временную метку UTC и возвращает дату и время в часовом поясе, заданном переменной сеанса Doris time_zone. Например, если time_zone имеет значение CST, функция FROM_UNIXTIME(0) возвращает 1970-01-01 08:00:00. |
UNIX_TIMESTAMP | Принимает дату и время и возвращает временную метку UTC с учетом часового пояса, заданного переменной сеанса Doris time_zone. Например, если time_zone имеет значение CST, функция UNIX_TIMESTAMP('1970-01-01 08:00:00') возвращает 0. |
CURTIME | Возвращает текущее время в часовом поясе, заданном переменной сеанса Doris time_zone. |
NOW | Возвращает текущую дату и время в часовом поясе, заданном переменной сеанса Doris time_zone. |
CONVERT_TZ | Преобразует дату и время из одного указанного часового пояса в другой. |
Влияние на временные типы
Типы DATE / DATETIME / TIMESTAMP_NS
Для типов DATE, DATETIME и TIMESTAMP_NS поддерживается преобразование часовых поясов при загрузке данных. Тип TIMESTAMP_NS хранит значения без учета часового пояса по тем же правилам, что и DATETIME, сохраняя при этом девять знаков дробной части секунды:
- Данные с указанием часового пояса: например, если задано значение
2020-12-12 12:12:12+08:00, а заголовок Stream Loadtimezoneимеет значение+00:00, в Doris фактически сохраняется значение2020-12-12 04:12:12. - Данные без указания часового пояса: например, значение
2020-12-12 12:12:12трактуется как абсолютное время, и преобразование не выполняется.
Тип TIMESTAMPTZ
Тип TIMESTAMPTZ также поддерживает преобразование часовых поясов при загрузке данных: входное значение времени всегда преобразуется в UTC (всемирное координированное время), а при выводе применяется часовой пояс текущего сеанса.
- Данные с указанием часового пояса: например, для значения
2020-12-12 12:12:12+08:00Doris использует при преобразовании указанную информацию о часовом поясе. - Данные без указания часового пояса: например, для значения
2020-12-12 12:12:12Doris использует при преобразовании настройку часового пояса текущего сеанса.
Значение time_zone текущего сеанса влияет на вывод данных типа TIMESTAMPTZ. Например, если в текущем сеансе задано time_zone="+08:00", а значение типа TIMESTAMPTZ равно 2020-12-12 12:12:12+08:00, изменение time_zone меняет выводимое значение:
set time_zone = "+08:00";
select * from tz_test;
+---------------------------+
| tz |
+---------------------------+
| 2020-12-12 12:12:12+08:00 |
+---------------------------+
set time_zone = "+07:00";
select * from tz_test;
+---------------------------+
| tz |
+---------------------------+
| 2020-12-12 11:12:12+07:00 |
+---------------------------+
Летнее время
Летнее время означает, что фактическое смещение именованного часового пояса меняется в определенный период дат.
Например, в часовом поясе America/Los_Angeles ежегодно предусмотрен один период летнего времени, который начинается примерно в марте и заканчивается примерно в ноябре. При переходе на летнее время в марте фактическое смещение America/Los_Angeles меняется с -08:00 на -07:00. При окончании летнего времени в ноябре оно меняется обратно с -07:00 на -08:00.
Если вы не хотите использовать летнее время, задайте для time_zone значение -08:00 вместо America/Los_Angeles.
Рекомендации
Работа с данными, зависящими от часового пояса
При работе с часовыми поясами нужно учитывать три основных фактора:
- Часовой пояс кластера: переменная сеанса
time_zone. - Часовой пояс загрузки: заголовок
timezone, задаваемый при загрузке через Stream Load, Broker Load и аналогичными способами. - Часовой пояс данных: литерал часового пояса в данных, например
+08:00в2023-12-12 08:00:00+08:00.
В настоящее время Doris поддерживает загрузку данных из любого часового пояса. Поскольку временные типы, такие как DATETIME и TIMESTAMP_NS, не содержат внутри себя информацию о часовом поясе, а сохраненные данные после загрузки не меняются при изменении часового пояса, загружаемые в Doris временные данные делятся на две категории:
-
Абсолютное время
Абсолютное время означает, что сценарий использования данных не зависит от часового пояса. При загрузке таких данных не добавляйте суффикс часового пояса. Данные сохраняются без изменений.
-
Время в определенном часовом поясе
Время в определенном часовом поясе означает, что сценарий использования данных зависит от часового пояса. При загрузке таких данных добавляйте суффикс нужного часового пояса. В процессе загрузки данные преобразуются в часовой пояс, заданный параметром кластера Doris
time_zoneили заголовкомtimezoneв Stream Load или Broker Load.После загрузки такие данные хранятся как абсолютное время в часовом поясе, указанном при загрузке. При последующей загрузке и выполнении запросов необходимо использовать тот же часовой пояс, чтобы сохранить смысл данных.
Пример оператора INSERT
Doris > select @@time_zone;
+---------------+
| @@time_zone |
+---------------+
| Asia/Shanghai |
+---------------+
Doris > insert into dt values('2020-12-12 12:12:12+02:00'); --- The ingested data specifies the time zone as +02:00
Doris > select * from dt;
+---------------------+
| dt |
+---------------------+
| 2020-12-12 18:12:12 | --- Converted to the Doris cluster time zone Asia/Shanghai. Subsequent ingestion and queries must keep this time zone.
+---------------------+
Doris > set time_zone = 'America/Los_Angeles';
Doris > select * from dt;
+---------------------+
| dt |
+---------------------+
| 2020-12-12 18:12:12 | --- If time_zone is changed, the time value does not change, and its meaning at query time becomes inconsistent.
+---------------------+
Пример Stream Load
При загрузке с помощью Stream Load, Broker Load и аналогичных способов преобразование часовых поясов можно выполнить, задав заголовок timezone. Например:
cat dt.csv
2020-12-12 12:12:12+02:00
curl --location-trusted -u root: \
-H "Expect:100-continue" \
-H "strict_mode: true" \
-H "timezone: Asia/Shanghai" \
-T dt.csv -XPUT \
http://127.0.0.1:8030/api/test/dt/_stream_load
Doris > select @@time_zone;
+---------------+
| @@time_zone |
+---------------+
| Asia/Shanghai |
+---------------+
Doris > select * from dt;
+---------------------+
| dt |
+---------------------+
| 2020-12-12 18:12:12 | --- Converted to the Doris cluster time zone Asia/Shanghai. Subsequent ingestion and queries must keep this time zone.
+---------------------+
- При загрузке с помощью Stream Load, Broker Load и аналогичных способов заголовок
timezoneпереопределяет параметр кластера Doristime_zone, поэтому при загрузке их значения должны совпадать. - При загрузке с помощью Stream Load, Broker Load и аналогичных способов заголовок
timezoneвлияет на функции, используемые для преобразований в процессе загрузки. - Если при загрузке заголовок
timezoneне задан, по умолчанию используется текущий часовой пояс кластера.
Основные рекомендации
- Перед использованием определите, в каком часовом поясе должен работать кластер, задайте
time_zoneи больше не меняйте его. - При загрузке задавайте заголовок
timezoneтак, чтобы он совпадал с параметром кластераtime_zone. - Для абсолютного времени не добавляйте суффикс часового пояса при загрузке. Для времени с учетом часового пояса добавляйте суффикс нужного часового пояса при загрузке. После загрузки данные преобразуются в часовой пояс Doris
time_zone.
Рекомендации по летнему времени
Даты и время начала и окончания летнего времени берутся из текущего источника данных о часовых поясах и могут не совпадать в точности с официальными датами и временем, установленными в соответствующем регионе на текущий год. Эти данные поддерживает ICANN.
Чтобы поведение при переходе на летнее время соответствовало официальным правилам текущего года, убедитесь, что Doris использует последние данные о часовых поясах, опубликованные ICANN. Способ скачивания приведен ниже.
Обновление информации о часовых поясах
Фактические данные о часовых поясах и летнем времени периодически меняются по разным причинам. IANA регулярно фиксирует эти изменения и обновляет соответствующие файлы часовых поясов. Чтобы информация о часовых поясах в Doris соответствовала последним данным IANA, используйте один из двух способов:
Способ 1: обновление с помощью менеджера пакетов
Обновите данные о часовых поясах напрямую с помощью команды, соответствующей менеджеру пакетов вашей операционной системы:
# yum
sudo yum update tzdata
# apt
sudo apt update tzdata
Обновленные таким способом данные находятся в системном каталоге $TZDIR (обычно /usr/share/zoneinfo).
Способ 2: скачивание базы данных часовых поясов напрямую из IANA (рекомендуется)
В большинстве дистрибутивов Linux данные tzdata обновляются через менеджер пакетов с задержкой. Если у вас повышенные требования к точности данных о часовых поясах, скачивайте напрямую данные, которые IANA периодически публикует:
wget https://www.iana.org/time-zones/repository/tzdb-latest.tar.lz
Затем следуйте инструкциям README в распакованной папке, чтобы создать необходимые данные zoneinfo. Скопируйте созданные данные в каталог $TZDIR, заменив существующие файлы.
После выполнения всех указанных выше операций на машине BE необходимо перезапустить соответствующий BE, чтобы изменения вступили в силу.
Часто задаваемые вопросы
Вопрос: почему после изменения time_zone результаты запросов к уже загруженным данным неожиданно меняются?
Такие типы, как DATETIME и TIMESTAMP_NS, не содержат внутри себя информацию о часовом поясе, а изменение часового пояса кластера после загрузки не меняет сохраненные значения. Перед использованием определите часовой пояс кластера, задайте time_zone и больше не меняйте его.
Вопрос: почему смещение времени в данных, загруженных через Stream Load, не соответствует ожиданиям?
Заголовок timezone не совпадает с параметром кластера time_zone. Значение заголовка timezone должно совпадать с параметром кластера time_zone.
Вопрос: почему время, возвращаемое NOW(), не совпадает с местным временем?
Параметр кластера time_zone не соответствует местному часовому поясу. Измените его с помощью SET global time_zone = 'Asia/Shanghai'.
Вопрос: почему переход на летнее время в именованном часовом поясе не соответствует правилам текущего года?
Данные tzdata на машине BE устарели. Обновите tzdata с помощью менеджера пакетов или скачайте tzdata напрямую из IANA, затем перезапустите BE.
Вопрос: что делать, если я использую America/Los_Angeles, но не хочу включать летнее время?
Именованные часовые пояса содержат правила перехода на летнее время. Используйте вместо них формат с фиксированным смещением, например -08:00.
Дополнительные материалы
- Список форматов часовых поясов: Список часовых поясов базы данных tz
- База данных часовых поясов IANA: База данных часовых поясов IANA
- База данных часовых поясов ICANN: Архивы tz-announce