From ea1234f517814f0578a753fcc98dc534f8ec90ea Mon Sep 17 00:00:00 2001 From: Ivan Blinkov Date: Mon, 1 Apr 2024 14:06:43 +0700 Subject: [PATCH 01/13] development/ -> contributor/ --- ydb/docs/en/core/administration/upgrade.md | 2 +- .../_includes/corp_cli_tags.md | 0 .../_includes/corp_release_stable.md | 0 .../_includes/corp_release_testing.md | 0 .../_includes/index.md | 0 .../{development => contributor}/build-ya.md | 0 .../datashard-locks-and-change-visibility.md | 0 .../{development => contributor}/index.md | 0 .../load-actors-key-value.md | 0 .../load-actors-kqp.md | 0 .../load-actors-memory.md | 0 .../load-actors-overview.md | 0 .../load-actors-pdisk-log.md | 0 .../load-actors-pdisk-read.md | 0 .../load-actors-pdisk-write.md | 0 .../load-actors-stop.md | 0 .../load-actors-storage.md | 0 .../load-actors-vdisk.md | 0 .../localdb-uncommitted-txs.md | 0 .../manage-releases.md | 0 .../suggest-change.md | 0 .../{development => contributor}/toc_i.yaml | 0 .../{development => contributor}/toc_p.yaml | 0 ydb/docs/en/core/toc_i.yaml | 17 +++++---- ydb/docs/redirects.yaml | 38 ++++++++++++++++++- ydb/docs/ru/core/administration/upgrade.md | 2 +- .../_includes/corp_cli_tags.md | 0 .../_includes/corp_release_stable.md | 0 .../_includes/corp_release_testing.md | 0 .../_includes/index.md | 0 .../{development => contributor}/build-ya.md | 0 .../datashard-locks-and-change-visibility.md | 0 .../{development => contributor}/index.md | 0 .../load-actors-key-value.md | 0 .../load-actors-kqp.md | 0 .../load-actors-memory.md | 0 .../load-actors-overview.md | 0 .../load-actors-pdisk-log.md | 0 .../load-actors-pdisk-read.md | 0 .../load-actors-pdisk-write.md | 0 .../load-actors-stop.md | 0 .../load-actors-storage.md | 0 .../load-actors-vdisk.md | 0 .../localdb-uncommitted-txs.md | 0 .../manage-releases.md | 0 .../suggest-change.md | 0 .../{development => contributor}/toc_i.yaml | 0 .../{development => contributor}/toc_p.yaml | 0 ydb/docs/ru/core/toc_i.yaml | 14 +++++-- 49 files changed, 58 insertions(+), 15 deletions(-) rename ydb/docs/en/core/{development => contributor}/_includes/corp_cli_tags.md (100%) rename ydb/docs/en/core/{development => contributor}/_includes/corp_release_stable.md (100%) rename ydb/docs/en/core/{development => contributor}/_includes/corp_release_testing.md (100%) rename ydb/docs/en/core/{development => contributor}/_includes/index.md (100%) rename ydb/docs/en/core/{development => contributor}/build-ya.md (100%) rename ydb/docs/en/core/{development => contributor}/datashard-locks-and-change-visibility.md (100%) rename ydb/docs/en/core/{development => contributor}/index.md (100%) rename ydb/docs/en/core/{development => contributor}/load-actors-key-value.md (100%) rename ydb/docs/en/core/{development => contributor}/load-actors-kqp.md (100%) rename ydb/docs/en/core/{development => contributor}/load-actors-memory.md (100%) rename ydb/docs/en/core/{development => contributor}/load-actors-overview.md (100%) rename ydb/docs/en/core/{development => contributor}/load-actors-pdisk-log.md (100%) rename ydb/docs/en/core/{development => contributor}/load-actors-pdisk-read.md (100%) rename ydb/docs/en/core/{development => contributor}/load-actors-pdisk-write.md (100%) rename ydb/docs/en/core/{development => contributor}/load-actors-stop.md (100%) rename ydb/docs/en/core/{development => contributor}/load-actors-storage.md (100%) rename ydb/docs/en/core/{development => contributor}/load-actors-vdisk.md (100%) rename ydb/docs/en/core/{development => contributor}/localdb-uncommitted-txs.md (100%) rename ydb/docs/en/core/{development => contributor}/manage-releases.md (100%) rename ydb/docs/en/core/{development => contributor}/suggest-change.md (100%) rename ydb/docs/en/core/{development => contributor}/toc_i.yaml (100%) rename ydb/docs/en/core/{development => contributor}/toc_p.yaml (100%) rename ydb/docs/ru/core/{development => contributor}/_includes/corp_cli_tags.md (100%) rename ydb/docs/ru/core/{development => contributor}/_includes/corp_release_stable.md (100%) rename ydb/docs/ru/core/{development => contributor}/_includes/corp_release_testing.md (100%) rename ydb/docs/ru/core/{development => contributor}/_includes/index.md (100%) rename ydb/docs/ru/core/{development => contributor}/build-ya.md (100%) rename ydb/docs/ru/core/{development => contributor}/datashard-locks-and-change-visibility.md (100%) rename ydb/docs/ru/core/{development => contributor}/index.md (100%) rename ydb/docs/ru/core/{development => contributor}/load-actors-key-value.md (100%) rename ydb/docs/ru/core/{development => contributor}/load-actors-kqp.md (100%) rename ydb/docs/ru/core/{development => contributor}/load-actors-memory.md (100%) rename ydb/docs/ru/core/{development => contributor}/load-actors-overview.md (100%) rename ydb/docs/ru/core/{development => contributor}/load-actors-pdisk-log.md (100%) rename ydb/docs/ru/core/{development => contributor}/load-actors-pdisk-read.md (100%) rename ydb/docs/ru/core/{development => contributor}/load-actors-pdisk-write.md (100%) rename ydb/docs/ru/core/{development => contributor}/load-actors-stop.md (100%) rename ydb/docs/ru/core/{development => contributor}/load-actors-storage.md (100%) rename ydb/docs/ru/core/{development => contributor}/load-actors-vdisk.md (100%) rename ydb/docs/ru/core/{development => contributor}/localdb-uncommitted-txs.md (100%) rename ydb/docs/ru/core/{development => contributor}/manage-releases.md (100%) rename ydb/docs/ru/core/{development => contributor}/suggest-change.md (100%) rename ydb/docs/ru/core/{development => contributor}/toc_i.yaml (100%) rename ydb/docs/ru/core/{development => contributor}/toc_p.yaml (100%) diff --git a/ydb/docs/en/core/administration/upgrade.md b/ydb/docs/en/core/administration/upgrade.md index a378f3b705da..8188ae63d095 100644 --- a/ydb/docs/en/core/administration/upgrade.md +++ b/ydb/docs/en/core/administration/upgrade.md @@ -23,7 +23,7 @@ All minor versions within a major version are compatible for updates. Major vers * X.Y.* → X.Y+2.*: Update is impossible, major versions are inconsistent. * X.Y.* → X.Y-2.*: Update is impossible, major versions are inconsistent. -A list of available versions can be found on the [download page](https://ydb.tech/en/docs/downloads/). The YDB release policy is described in more details in the [Release management](../development/manage-releases.md) article of the YDB development documentation. +A list of available versions can be found on the [download page](https://ydb.tech/en/docs/downloads/). The YDB release policy is described in more details in the [Release management](../contributor/manage-releases.md) article of the YDB development documentation. {% note warning %} diff --git a/ydb/docs/en/core/development/_includes/corp_cli_tags.md b/ydb/docs/en/core/contributor/_includes/corp_cli_tags.md similarity index 100% rename from ydb/docs/en/core/development/_includes/corp_cli_tags.md rename to ydb/docs/en/core/contributor/_includes/corp_cli_tags.md diff --git a/ydb/docs/en/core/development/_includes/corp_release_stable.md b/ydb/docs/en/core/contributor/_includes/corp_release_stable.md similarity index 100% rename from ydb/docs/en/core/development/_includes/corp_release_stable.md rename to ydb/docs/en/core/contributor/_includes/corp_release_stable.md diff --git a/ydb/docs/en/core/development/_includes/corp_release_testing.md b/ydb/docs/en/core/contributor/_includes/corp_release_testing.md similarity index 100% rename from ydb/docs/en/core/development/_includes/corp_release_testing.md rename to ydb/docs/en/core/contributor/_includes/corp_release_testing.md diff --git a/ydb/docs/en/core/development/_includes/index.md b/ydb/docs/en/core/contributor/_includes/index.md similarity index 100% rename from ydb/docs/en/core/development/_includes/index.md rename to ydb/docs/en/core/contributor/_includes/index.md diff --git a/ydb/docs/en/core/development/build-ya.md b/ydb/docs/en/core/contributor/build-ya.md similarity index 100% rename from ydb/docs/en/core/development/build-ya.md rename to ydb/docs/en/core/contributor/build-ya.md diff --git a/ydb/docs/en/core/development/datashard-locks-and-change-visibility.md b/ydb/docs/en/core/contributor/datashard-locks-and-change-visibility.md similarity index 100% rename from ydb/docs/en/core/development/datashard-locks-and-change-visibility.md rename to ydb/docs/en/core/contributor/datashard-locks-and-change-visibility.md diff --git a/ydb/docs/en/core/development/index.md b/ydb/docs/en/core/contributor/index.md similarity index 100% rename from ydb/docs/en/core/development/index.md rename to ydb/docs/en/core/contributor/index.md diff --git a/ydb/docs/en/core/development/load-actors-key-value.md b/ydb/docs/en/core/contributor/load-actors-key-value.md similarity index 100% rename from ydb/docs/en/core/development/load-actors-key-value.md rename to ydb/docs/en/core/contributor/load-actors-key-value.md diff --git a/ydb/docs/en/core/development/load-actors-kqp.md b/ydb/docs/en/core/contributor/load-actors-kqp.md similarity index 100% rename from ydb/docs/en/core/development/load-actors-kqp.md rename to ydb/docs/en/core/contributor/load-actors-kqp.md diff --git a/ydb/docs/en/core/development/load-actors-memory.md b/ydb/docs/en/core/contributor/load-actors-memory.md similarity index 100% rename from ydb/docs/en/core/development/load-actors-memory.md rename to ydb/docs/en/core/contributor/load-actors-memory.md diff --git a/ydb/docs/en/core/development/load-actors-overview.md b/ydb/docs/en/core/contributor/load-actors-overview.md similarity index 100% rename from ydb/docs/en/core/development/load-actors-overview.md rename to ydb/docs/en/core/contributor/load-actors-overview.md diff --git a/ydb/docs/en/core/development/load-actors-pdisk-log.md b/ydb/docs/en/core/contributor/load-actors-pdisk-log.md similarity index 100% rename from ydb/docs/en/core/development/load-actors-pdisk-log.md rename to ydb/docs/en/core/contributor/load-actors-pdisk-log.md diff --git a/ydb/docs/en/core/development/load-actors-pdisk-read.md b/ydb/docs/en/core/contributor/load-actors-pdisk-read.md similarity index 100% rename from ydb/docs/en/core/development/load-actors-pdisk-read.md rename to ydb/docs/en/core/contributor/load-actors-pdisk-read.md diff --git a/ydb/docs/en/core/development/load-actors-pdisk-write.md b/ydb/docs/en/core/contributor/load-actors-pdisk-write.md similarity index 100% rename from ydb/docs/en/core/development/load-actors-pdisk-write.md rename to ydb/docs/en/core/contributor/load-actors-pdisk-write.md diff --git a/ydb/docs/en/core/development/load-actors-stop.md b/ydb/docs/en/core/contributor/load-actors-stop.md similarity index 100% rename from ydb/docs/en/core/development/load-actors-stop.md rename to ydb/docs/en/core/contributor/load-actors-stop.md diff --git a/ydb/docs/en/core/development/load-actors-storage.md b/ydb/docs/en/core/contributor/load-actors-storage.md similarity index 100% rename from ydb/docs/en/core/development/load-actors-storage.md rename to ydb/docs/en/core/contributor/load-actors-storage.md diff --git a/ydb/docs/en/core/development/load-actors-vdisk.md b/ydb/docs/en/core/contributor/load-actors-vdisk.md similarity index 100% rename from ydb/docs/en/core/development/load-actors-vdisk.md rename to ydb/docs/en/core/contributor/load-actors-vdisk.md diff --git a/ydb/docs/en/core/development/localdb-uncommitted-txs.md b/ydb/docs/en/core/contributor/localdb-uncommitted-txs.md similarity index 100% rename from ydb/docs/en/core/development/localdb-uncommitted-txs.md rename to ydb/docs/en/core/contributor/localdb-uncommitted-txs.md diff --git a/ydb/docs/en/core/development/manage-releases.md b/ydb/docs/en/core/contributor/manage-releases.md similarity index 100% rename from ydb/docs/en/core/development/manage-releases.md rename to ydb/docs/en/core/contributor/manage-releases.md diff --git a/ydb/docs/en/core/development/suggest-change.md b/ydb/docs/en/core/contributor/suggest-change.md similarity index 100% rename from ydb/docs/en/core/development/suggest-change.md rename to ydb/docs/en/core/contributor/suggest-change.md diff --git a/ydb/docs/en/core/development/toc_i.yaml b/ydb/docs/en/core/contributor/toc_i.yaml similarity index 100% rename from ydb/docs/en/core/development/toc_i.yaml rename to ydb/docs/en/core/contributor/toc_i.yaml diff --git a/ydb/docs/en/core/development/toc_p.yaml b/ydb/docs/en/core/contributor/toc_p.yaml similarity index 100% rename from ydb/docs/en/core/development/toc_p.yaml rename to ydb/docs/en/core/contributor/toc_p.yaml diff --git a/ydb/docs/en/core/toc_i.yaml b/ydb/docs/en/core/toc_i.yaml index 65f14dfa2f12..a951e680416a 100644 --- a/ydb/docs/en/core/toc_i.yaml +++ b/ydb/docs/en/core/toc_i.yaml @@ -11,7 +11,10 @@ items: include: mode: link path: devops/toc_p.yaml - +- name: For contributors + include: + mode: link + path: contributor/toc_p.yaml - { name: Tutorials, include: { mode: link, path: operations/toc_p.yaml } } - { name: Recommendations, include: { mode: link, path: best_practices/toc_p.yaml } } @@ -22,17 +25,17 @@ items: include: mode: link path: reference/toc_p.yaml - - - name: Questions and answers include: mode: link path: faq/toc_p.yaml -- name: For contributors +- name: Downloads include: mode: link - path: development/toc_p.yaml -- include: { mode: link, path: downloads/toc_p.yaml } + path: downloads/toc_p.yaml - name: Public talks href: public-talks.md -- { name: Changelog, include: { mode: link, path: toc_changelog.yaml } } +- name: Changelog + include: + mode: link + path: toc_changelog.yaml diff --git a/ydb/docs/redirects.yaml b/ydb/docs/redirects.yaml index 402c4a3b9b48..ee4c69e05ec3 100644 --- a/ydb/docs/redirects.yaml +++ b/ydb/docs/redirects.yaml @@ -38,7 +38,41 @@ common: - from: /getting_started/yql.md to: /yql/reference/index.md -# Redirects for ydb-dstoo +# Redirects from development to contributor + - from: /development/build-ya.md + to: /contributor/build-ya.md + - from: /development/datashard-locks-and-change-visibility.md + to: /contributor/datashard-locks-and-change-visibility.md + - from: /development/index.md + to: /contributor/index.md + - from: /development/load-actors-key-value.md + to: /contributor/load-actors-key-value.md + - from: /development/load-actors-kqp.md + to: /contributor/load-actors-kqp.md + - from: /development/load-actors-memory.md + to: /contributor/load-actors-memory.md + - from: /development/load-actors-overview.md + to: /contributor/load-actors-overview.md + - from: /development/load-actors-pdisk-log.md + to: /contributor/load-actors-pdisk-log.md + - from: /development/load-actors-pdisk-read.md + to: /contributor/load-actors-pdisk-read.md + - from: /development/load-actors-pdisk-write.md + to: /contributor/load-actors-pdisk-write.md + - from: /development/load-actors-stop.md + to: /contributor/load-actors-stop.md + - from: /development/load-actors-storage.md + to: /contributor/load-actors-storage.md + - from: /development/load-actors-vdisk.md + to: /contributor/load-actors-vdisk.md + - from: /development/localdb-uncommitted-txs.md + to: /contributor/localdb-uncommitted-txs.md + - from: /development/manage-releases.md + to: /contributor/manage-releases.md + - from: /development/suggest-change.md + to: /contributor/suggest-change.md + +# Redirects for ydb-dstool - from: /administration/ydb-dstool-device-list.md to: /reference/ydb-dstool/device-list.md - from: /administration/ydb-dstool-global-options.md @@ -48,7 +82,7 @@ common: - from: /administration/ydb-dstool-setup.md to: /reference/ydb-dstool/install.md -# Redirect from export_import to export-import +# Redirects from export_import to export-import - from: /reference/ydb-cli/export_import/s3_conn.md to: /reference/ydb-cli/export-import/auth-s3.md - from: /reference/ydb-cli/export_import/s3_export.md diff --git a/ydb/docs/ru/core/administration/upgrade.md b/ydb/docs/ru/core/administration/upgrade.md index 0e8d2abe8822..e7625656c606 100644 --- a/ydb/docs/ru/core/administration/upgrade.md +++ b/ydb/docs/ru/core/administration/upgrade.md @@ -29,7 +29,7 @@ {% endnote %} -Список доступных версий можно получить на [странице загрузки](https://ydb.tech/ru/docs/downloads/). Релизная политика YDB описана более детально в статье [Управление релизами](../development/manage-releases.md) в разделе документации для разработчиков YDB. +Список доступных версий можно получить на [странице загрузки](https://ydb.tech/ru/docs/downloads/). Релизная политика YDB описана более детально в статье [Управление релизами](../contributor/manage-releases.md) в разделе документации для разработчиков YDB. ### Примеры совместимости версий diff --git a/ydb/docs/ru/core/development/_includes/corp_cli_tags.md b/ydb/docs/ru/core/contributor/_includes/corp_cli_tags.md similarity index 100% rename from ydb/docs/ru/core/development/_includes/corp_cli_tags.md rename to ydb/docs/ru/core/contributor/_includes/corp_cli_tags.md diff --git a/ydb/docs/ru/core/development/_includes/corp_release_stable.md b/ydb/docs/ru/core/contributor/_includes/corp_release_stable.md similarity index 100% rename from ydb/docs/ru/core/development/_includes/corp_release_stable.md rename to ydb/docs/ru/core/contributor/_includes/corp_release_stable.md diff --git a/ydb/docs/ru/core/development/_includes/corp_release_testing.md b/ydb/docs/ru/core/contributor/_includes/corp_release_testing.md similarity index 100% rename from ydb/docs/ru/core/development/_includes/corp_release_testing.md rename to ydb/docs/ru/core/contributor/_includes/corp_release_testing.md diff --git a/ydb/docs/ru/core/development/_includes/index.md b/ydb/docs/ru/core/contributor/_includes/index.md similarity index 100% rename from ydb/docs/ru/core/development/_includes/index.md rename to ydb/docs/ru/core/contributor/_includes/index.md diff --git a/ydb/docs/ru/core/development/build-ya.md b/ydb/docs/ru/core/contributor/build-ya.md similarity index 100% rename from ydb/docs/ru/core/development/build-ya.md rename to ydb/docs/ru/core/contributor/build-ya.md diff --git a/ydb/docs/ru/core/development/datashard-locks-and-change-visibility.md b/ydb/docs/ru/core/contributor/datashard-locks-and-change-visibility.md similarity index 100% rename from ydb/docs/ru/core/development/datashard-locks-and-change-visibility.md rename to ydb/docs/ru/core/contributor/datashard-locks-and-change-visibility.md diff --git a/ydb/docs/ru/core/development/index.md b/ydb/docs/ru/core/contributor/index.md similarity index 100% rename from ydb/docs/ru/core/development/index.md rename to ydb/docs/ru/core/contributor/index.md diff --git a/ydb/docs/ru/core/development/load-actors-key-value.md b/ydb/docs/ru/core/contributor/load-actors-key-value.md similarity index 100% rename from ydb/docs/ru/core/development/load-actors-key-value.md rename to ydb/docs/ru/core/contributor/load-actors-key-value.md diff --git a/ydb/docs/ru/core/development/load-actors-kqp.md b/ydb/docs/ru/core/contributor/load-actors-kqp.md similarity index 100% rename from ydb/docs/ru/core/development/load-actors-kqp.md rename to ydb/docs/ru/core/contributor/load-actors-kqp.md diff --git a/ydb/docs/ru/core/development/load-actors-memory.md b/ydb/docs/ru/core/contributor/load-actors-memory.md similarity index 100% rename from ydb/docs/ru/core/development/load-actors-memory.md rename to ydb/docs/ru/core/contributor/load-actors-memory.md diff --git a/ydb/docs/ru/core/development/load-actors-overview.md b/ydb/docs/ru/core/contributor/load-actors-overview.md similarity index 100% rename from ydb/docs/ru/core/development/load-actors-overview.md rename to ydb/docs/ru/core/contributor/load-actors-overview.md diff --git a/ydb/docs/ru/core/development/load-actors-pdisk-log.md b/ydb/docs/ru/core/contributor/load-actors-pdisk-log.md similarity index 100% rename from ydb/docs/ru/core/development/load-actors-pdisk-log.md rename to ydb/docs/ru/core/contributor/load-actors-pdisk-log.md diff --git a/ydb/docs/ru/core/development/load-actors-pdisk-read.md b/ydb/docs/ru/core/contributor/load-actors-pdisk-read.md similarity index 100% rename from ydb/docs/ru/core/development/load-actors-pdisk-read.md rename to ydb/docs/ru/core/contributor/load-actors-pdisk-read.md diff --git a/ydb/docs/ru/core/development/load-actors-pdisk-write.md b/ydb/docs/ru/core/contributor/load-actors-pdisk-write.md similarity index 100% rename from ydb/docs/ru/core/development/load-actors-pdisk-write.md rename to ydb/docs/ru/core/contributor/load-actors-pdisk-write.md diff --git a/ydb/docs/ru/core/development/load-actors-stop.md b/ydb/docs/ru/core/contributor/load-actors-stop.md similarity index 100% rename from ydb/docs/ru/core/development/load-actors-stop.md rename to ydb/docs/ru/core/contributor/load-actors-stop.md diff --git a/ydb/docs/ru/core/development/load-actors-storage.md b/ydb/docs/ru/core/contributor/load-actors-storage.md similarity index 100% rename from ydb/docs/ru/core/development/load-actors-storage.md rename to ydb/docs/ru/core/contributor/load-actors-storage.md diff --git a/ydb/docs/ru/core/development/load-actors-vdisk.md b/ydb/docs/ru/core/contributor/load-actors-vdisk.md similarity index 100% rename from ydb/docs/ru/core/development/load-actors-vdisk.md rename to ydb/docs/ru/core/contributor/load-actors-vdisk.md diff --git a/ydb/docs/ru/core/development/localdb-uncommitted-txs.md b/ydb/docs/ru/core/contributor/localdb-uncommitted-txs.md similarity index 100% rename from ydb/docs/ru/core/development/localdb-uncommitted-txs.md rename to ydb/docs/ru/core/contributor/localdb-uncommitted-txs.md diff --git a/ydb/docs/ru/core/development/manage-releases.md b/ydb/docs/ru/core/contributor/manage-releases.md similarity index 100% rename from ydb/docs/ru/core/development/manage-releases.md rename to ydb/docs/ru/core/contributor/manage-releases.md diff --git a/ydb/docs/ru/core/development/suggest-change.md b/ydb/docs/ru/core/contributor/suggest-change.md similarity index 100% rename from ydb/docs/ru/core/development/suggest-change.md rename to ydb/docs/ru/core/contributor/suggest-change.md diff --git a/ydb/docs/ru/core/development/toc_i.yaml b/ydb/docs/ru/core/contributor/toc_i.yaml similarity index 100% rename from ydb/docs/ru/core/development/toc_i.yaml rename to ydb/docs/ru/core/contributor/toc_i.yaml diff --git a/ydb/docs/ru/core/development/toc_p.yaml b/ydb/docs/ru/core/contributor/toc_p.yaml similarity index 100% rename from ydb/docs/ru/core/development/toc_p.yaml rename to ydb/docs/ru/core/contributor/toc_p.yaml diff --git a/ydb/docs/ru/core/toc_i.yaml b/ydb/docs/ru/core/toc_i.yaml index b1af84c30ce7..b3d6f0f2b0b6 100644 --- a/ydb/docs/ru/core/toc_i.yaml +++ b/ydb/docs/ru/core/toc_i.yaml @@ -11,6 +11,10 @@ items: include: mode: link path: devops/toc_p.yaml +- name: Для контрибьюторов + include: + mode: link + path: contributor/toc_p.yaml # Main - { name: Практические руководства, include: { mode: link, path: operations/toc_p.yaml } } @@ -29,11 +33,13 @@ items: include: mode: link path: faq/toc_p.yaml -- name: Для контрибьюторов +- name: Загрузки include: mode: link - path: development/toc_p.yaml -- include: { mode: link, path: downloads/toc_p.yaml } + path: downloads/toc_p.yaml - name: Публичные материалы href: public-talks.md -- { name: Список изменений, include: { mode: link, path: toc_changelog.yaml } } +- name: Список изменений + include: + mode: link + path: toc_changelog.yaml From 53ba441cb6ce5d86003ec2c8772be46fc434f240 Mon Sep 17 00:00:00 2001 From: Ivan Blinkov Date: Mon, 1 Apr 2024 14:25:04 +0700 Subject: [PATCH 02/13] introduce "For DBA" section --- ydb/docs/en/core/{db => dba}/_includes/cloud_remark.md | 0 ydb/docs/en/core/{db => dba}/index.md | 0 ydb/docs/en/core/{db => dba}/toc_i.yaml | 0 ydb/docs/en/core/{db => dba}/toc_p.yaml | 0 ydb/docs/en/core/toc_i.yaml | 6 +++++- ydb/docs/redirects.yaml | 7 +++++++ ydb/docs/ru/core/{db => dba}/_includes/cloud_remark.md | 0 ydb/docs/ru/core/{db => dba}/index.md | 0 ydb/docs/ru/core/{db => dba}/terraform.md | 0 ydb/docs/ru/core/{db => dba}/toc_i.yaml | 0 ydb/docs/ru/core/{db => dba}/toc_p.yaml | 0 ydb/docs/ru/core/toc_i.yaml | 5 ++++- 12 files changed, 16 insertions(+), 2 deletions(-) rename ydb/docs/en/core/{db => dba}/_includes/cloud_remark.md (100%) rename ydb/docs/en/core/{db => dba}/index.md (100%) rename ydb/docs/en/core/{db => dba}/toc_i.yaml (100%) rename ydb/docs/en/core/{db => dba}/toc_p.yaml (100%) rename ydb/docs/ru/core/{db => dba}/_includes/cloud_remark.md (100%) rename ydb/docs/ru/core/{db => dba}/index.md (100%) rename ydb/docs/ru/core/{db => dba}/terraform.md (100%) rename ydb/docs/ru/core/{db => dba}/toc_i.yaml (100%) rename ydb/docs/ru/core/{db => dba}/toc_p.yaml (100%) diff --git a/ydb/docs/en/core/db/_includes/cloud_remark.md b/ydb/docs/en/core/dba/_includes/cloud_remark.md similarity index 100% rename from ydb/docs/en/core/db/_includes/cloud_remark.md rename to ydb/docs/en/core/dba/_includes/cloud_remark.md diff --git a/ydb/docs/en/core/db/index.md b/ydb/docs/en/core/dba/index.md similarity index 100% rename from ydb/docs/en/core/db/index.md rename to ydb/docs/en/core/dba/index.md diff --git a/ydb/docs/en/core/db/toc_i.yaml b/ydb/docs/en/core/dba/toc_i.yaml similarity index 100% rename from ydb/docs/en/core/db/toc_i.yaml rename to ydb/docs/en/core/dba/toc_i.yaml diff --git a/ydb/docs/en/core/db/toc_p.yaml b/ydb/docs/en/core/dba/toc_p.yaml similarity index 100% rename from ydb/docs/en/core/db/toc_p.yaml rename to ydb/docs/en/core/dba/toc_p.yaml diff --git a/ydb/docs/en/core/toc_i.yaml b/ydb/docs/en/core/toc_i.yaml index a951e680416a..33151e37c285 100644 --- a/ydb/docs/en/core/toc_i.yaml +++ b/ydb/docs/en/core/toc_i.yaml @@ -11,6 +11,10 @@ items: include: mode: link path: devops/toc_p.yaml +- name: For DBA + include: + mode: link + path: dba/toc_p.yaml - name: For contributors include: mode: link @@ -18,7 +22,7 @@ items: - { name: Tutorials, include: { mode: link, path: operations/toc_p.yaml } } - { name: Recommendations, include: { mode: link, path: best_practices/toc_p.yaml } } -- { name: Managing databases, include: { mode: link, path: db/toc_p.yaml } } + - { name: Managing a cluster, include: { mode: link, path: cluster/toc_p.yaml } } - name: Reference diff --git a/ydb/docs/redirects.yaml b/ydb/docs/redirects.yaml index ee4c69e05ec3..fe0d88c333d2 100644 --- a/ydb/docs/redirects.yaml +++ b/ydb/docs/redirects.yaml @@ -38,6 +38,11 @@ common: - from: /getting_started/yql.md to: /yql/reference/index.md +# Redirects from db to dba + + - from: /db/index.md + to: /dba/index.md + # Redirects from development to contributor - from: /development/build-ya.md to: /contributor/build-ya.md @@ -105,3 +110,5 @@ ru: to: /concepts/datamodel/table.md - from: /postgresql/index.md to: /postgresql/intro.md + - from: /db/terraform.md + to: /dba/terraform.md \ No newline at end of file diff --git a/ydb/docs/ru/core/db/_includes/cloud_remark.md b/ydb/docs/ru/core/dba/_includes/cloud_remark.md similarity index 100% rename from ydb/docs/ru/core/db/_includes/cloud_remark.md rename to ydb/docs/ru/core/dba/_includes/cloud_remark.md diff --git a/ydb/docs/ru/core/db/index.md b/ydb/docs/ru/core/dba/index.md similarity index 100% rename from ydb/docs/ru/core/db/index.md rename to ydb/docs/ru/core/dba/index.md diff --git a/ydb/docs/ru/core/db/terraform.md b/ydb/docs/ru/core/dba/terraform.md similarity index 100% rename from ydb/docs/ru/core/db/terraform.md rename to ydb/docs/ru/core/dba/terraform.md diff --git a/ydb/docs/ru/core/db/toc_i.yaml b/ydb/docs/ru/core/dba/toc_i.yaml similarity index 100% rename from ydb/docs/ru/core/db/toc_i.yaml rename to ydb/docs/ru/core/dba/toc_i.yaml diff --git a/ydb/docs/ru/core/db/toc_p.yaml b/ydb/docs/ru/core/dba/toc_p.yaml similarity index 100% rename from ydb/docs/ru/core/db/toc_p.yaml rename to ydb/docs/ru/core/dba/toc_p.yaml diff --git a/ydb/docs/ru/core/toc_i.yaml b/ydb/docs/ru/core/toc_i.yaml index b3d6f0f2b0b6..226df42a4d21 100644 --- a/ydb/docs/ru/core/toc_i.yaml +++ b/ydb/docs/ru/core/toc_i.yaml @@ -11,6 +11,10 @@ items: include: mode: link path: devops/toc_p.yaml +- name: For DBA + include: + mode: link + path: dba/toc_p.yaml - name: Для контрибьюторов include: mode: link @@ -19,7 +23,6 @@ items: # Main - { name: Практические руководства, include: { mode: link, path: operations/toc_p.yaml } } - { name: Рекомендации, include: { mode: link, path: best_practices/toc_p.yaml } } -- { name: Управление базами данных, include: { mode: link, path: db/toc_p.yaml } } - { name: Управление кластером, include: { mode: link, path: cluster/toc_p.yaml } } From 0092ff53e9590c2aa34426d0a66dc313f3cde169 Mon Sep 17 00:00:00 2001 From: Ivan Blinkov Date: Mon, 1 Apr 2024 14:26:27 +0700 Subject: [PATCH 03/13] remove "sre" folder as it somehow got copied instead of moved --- .../ansible/_assets/terraform/AiC_scheme.png | Bin 343691 -> 0 bytes .../_includes/ansible-install-steps.md | 89 ----- .../core/sre/ansible/_includes/repo-tree.md | 18 - .../sre/ansible/_includes/terraform/aws.md | 26 -- .../sre/ansible/_includes/terraform/azure.md | 10 - .../sre/ansible/_includes/terraform/gcp.md | 18 - .../sre/ansible/_includes/terraform/yc.md | 45 --- ydb/docs/en/core/sre/ansible/index.md | 8 - .../en/core/sre/ansible/initial-deployment.md | 281 --------------- .../ansible/preparing-vms-with-terraform.md | 168 --------- ydb/docs/en/core/sre/ansible/toc_p.yaml | 7 - ydb/docs/en/core/sre/index.md | 7 - ydb/docs/en/core/sre/kubernetes/index.md | 7 - .../core/sre/kubernetes/initial-deployment.md | 325 ------------------ ydb/docs/en/core/sre/kubernetes/toc_p.yaml | 5 - ydb/docs/en/core/sre/toc_p.yaml | 15 - .../ansible/_assets/terraform/AiC_scheme.png | Bin 343691 -> 0 bytes .../_includes/ansible-install-steps.md | 85 ----- .../core/sre/ansible/_includes/repo-tree.md | 18 - .../sre/ansible/_includes/terraform/aws.md | 0 .../sre/ansible/_includes/terraform/azure.md | 9 - .../sre/ansible/_includes/terraform/gcp.md | 18 - .../sre/ansible/_includes/terraform/yc.md | 44 --- ydb/docs/ru/core/sre/ansible/index.md | 8 - .../ru/core/sre/ansible/initial-deployment.md | 277 --------------- .../ansible/preparing-vms-with-terraform.md | 141 -------- ydb/docs/ru/core/sre/ansible/toc_p.yaml | 7 - 27 files changed, 1636 deletions(-) delete mode 100644 ydb/docs/en/core/sre/ansible/_assets/terraform/AiC_scheme.png delete mode 100644 ydb/docs/en/core/sre/ansible/_includes/ansible-install-steps.md delete mode 100644 ydb/docs/en/core/sre/ansible/_includes/repo-tree.md delete mode 100644 ydb/docs/en/core/sre/ansible/_includes/terraform/aws.md delete mode 100644 ydb/docs/en/core/sre/ansible/_includes/terraform/azure.md delete mode 100644 ydb/docs/en/core/sre/ansible/_includes/terraform/gcp.md delete mode 100644 ydb/docs/en/core/sre/ansible/_includes/terraform/yc.md delete mode 100644 ydb/docs/en/core/sre/ansible/index.md delete mode 100644 ydb/docs/en/core/sre/ansible/initial-deployment.md delete mode 100644 ydb/docs/en/core/sre/ansible/preparing-vms-with-terraform.md delete mode 100644 ydb/docs/en/core/sre/ansible/toc_p.yaml delete mode 100644 ydb/docs/en/core/sre/index.md delete mode 100644 ydb/docs/en/core/sre/kubernetes/index.md delete mode 100644 ydb/docs/en/core/sre/kubernetes/initial-deployment.md delete mode 100644 ydb/docs/en/core/sre/kubernetes/toc_p.yaml delete mode 100644 ydb/docs/en/core/sre/toc_p.yaml delete mode 100644 ydb/docs/ru/core/sre/ansible/_assets/terraform/AiC_scheme.png delete mode 100644 ydb/docs/ru/core/sre/ansible/_includes/ansible-install-steps.md delete mode 100644 ydb/docs/ru/core/sre/ansible/_includes/repo-tree.md delete mode 100644 ydb/docs/ru/core/sre/ansible/_includes/terraform/aws.md delete mode 100644 ydb/docs/ru/core/sre/ansible/_includes/terraform/azure.md delete mode 100644 ydb/docs/ru/core/sre/ansible/_includes/terraform/gcp.md delete mode 100644 ydb/docs/ru/core/sre/ansible/_includes/terraform/yc.md delete mode 100644 ydb/docs/ru/core/sre/ansible/index.md delete mode 100644 ydb/docs/ru/core/sre/ansible/initial-deployment.md delete mode 100644 ydb/docs/ru/core/sre/ansible/preparing-vms-with-terraform.md delete mode 100644 ydb/docs/ru/core/sre/ansible/toc_p.yaml diff --git a/ydb/docs/en/core/sre/ansible/_assets/terraform/AiC_scheme.png b/ydb/docs/en/core/sre/ansible/_assets/terraform/AiC_scheme.png deleted file mode 100644 index e01304fa935dd8e92f1c6dbf538f89cda36a6634..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 343691 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 z

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%0AeEnEK< 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 Ux5EngYxZ95hurG-9slKj0N7aX&;S4c diff --git a/ydb/docs/en/core/sre/ansible/_includes/ansible-install-steps.md b/ydb/docs/en/core/sre/ansible/_includes/ansible-install-steps.md deleted file mode 100644 index ada789bc5df5..000000000000 --- a/ydb/docs/en/core/sre/ansible/_includes/ansible-install-steps.md +++ /dev/null @@ -1,89 +0,0 @@ -1. [Role `packages`](https://github.com/ydb-platform/ydb-ansible/blob/main/roles/packages/tasks/main.yaml). Tasks: - * `check dpkg audit` – Verifies the [dpkg](https://en.wikipedia.org/wiki/Dpkg) state using the `dpkg --audit` command and saves the command results in the `dpkg_audit_result` variable. The task will terminate with an error if the `dpkg_audit_result.rc` command returns a value other than 0 or 1. - * `run the equivalent of "apt-get clean" as a separate step` – Cleans the apt cache, similarly to the `apt-get clean` command. - * `run the equivalent of "apt-get update" as a separate step` – Updates the apt cache, akin to the `apt-get update` command. - * `fix unconfigured packages` – Fixes packages that are not configured using the `dpkg --configure --pending` command. - * `set vars_for_distribution_version variables` – Sets variables for a specific Linux distribution version. - * `setup apt repositories` – Configures apt repositories from a specified list. - * `setup apt preferences` – Configures apt preferences (variable contents are specified in `roles/packages/vars/distributions///main.yaml`). - * `setup apt configs`– Configures apt settings. - * `flush handlers` – Forcibly runs all accumulated handlers. In this context, it triggers a handler that updates the apt cache. - * `install packages` – Installs apt packages considering specified parameters and cache validity. - -Links to the lists of packages that will be installed for Ubuntu 22.04 or Astra Linux 1.7: -* [List](https://github.com/ydb-platform/ydb-ansible/blob/main/roles/packages/vars/distributions/Ubuntu/22.04/main.yaml) of packages for Ubuntu 22.04; -* [List](https://github.com/ydb-platform/ydb-ansible/blob/main/roles/packages/vars/distributions/Astra%20Linux/1.7_x86-64/main.yaml) of packages for Astra Linux 1.7. - -2. [Role `system`](https://github.com/ydb-platform/ydb-ansible/blob/main/roles/system/tasks/main.yaml). Tasks: - * `configure clock` – A block of tasks for setting up system clocks: - + `assert required variables are defined` – Checks for the existence of the `system_timezone` variable. This check ensures that the necessary variable is available for the next task in the block. - + `set system timezone` – Sets the system timezone. The timezone is determined by the value of the `system_timezone` variable, and the hardware clock (`hwclock`) is set to UTC. After completing the task, a notification is sent to restart the `cron` service. - + `flush handlers` – Forces the execution of accumulated handlers using the `meta` directive. This will restart the following processes: `timesyncd`, `journald`, `cron`, `cpufrequtils`, and execute the `sysctl -p` command. - * `configure systemd-timesyncd` – A task block for configuring `systemd-timesyncd`: - + `assert required variables are defined` asserts that the number of NTP servers (`system_ntp_servers`) is more than one if the variable `system_ntp_servers` is defined. If the variable `system_ntp_servers` is not defined, the execution of the `configure systemd-timesyncd` task block will be skipped, including the check for the number of NTP servers and the configuration of `systemd-timesyncd`. - + `create conf.d directory for timesyncd` - Creates the `/etc/systemd/timesyncd.conf.d` directory if the `system_ntp_servers` variable is defined. - + `configure systemd-timesyncd` - Creates a configuration file `/etc/systemd/timesyncd.conf.d/ydb.conf` for the `systemd-timesyncd` service with primary and backup NTP servers. The task is executed if the `system_ntp_servers` variable is defined. After completing the task, a notification is sent to restart the `timesyncd` service. - + `flush handlers` - Calls accumulated handlers. Executes the handler `restart timesyncd`, which restarts the `systemd-timesyncd.service`. - + `start timesyncd` - Starts and enables the `systemd-timesyncd.service`. Subsequently, the service will start automatically at system boot. - * `configure systemd-journald` – A block of tasks for configuring the `systemd-journald` service: - + `create conf.d directory for journald` - Creates the `/etc/systemd/journald.conf.d` directory for storing `systemd-journald` configuration files. - + `configure systemd-journald` - Creates a configuration file `/etc/systemd/journald.conf.d/ydb.conf` for `systemd-journald`, specifying a `Journal` section with the option `ForwardToWall=no`. The `ForwardToWall=no` setting in the `systemd-journald` configuration means that system log messages will not be forwarded as "wall" messages to all logged-in users. After completing the task, a notification is sent to restart the `journald` service. - + `flush handlers` - Calls accumulated handlers. Executes the handler `restart journald`, which restarts the `systemd-journald` service. - + `start journald` - Starts and enables the `systemd-journald.service`. Subsequently, the service will start automatically at system boot. - * `configure kernel` – A block of tasks for kernel configuration: - + `configure /etc/modules-load.d dir` - Creates the `/etc/modules-load.d` directory with owner and group permissions for the root user and `0755` permissions. - + `setup conntrack module` - Copies the `nf_conntrack` line into the file `/etc/modules-load.d/conntrack.conf` to load the `nf_conntrack` module at system start. - + `load conntrack module` - Loads the `nf_conntrack` module in the current session. - + `setup sysctl files` - Applies templates to create configuration files in `/etc/sysctl.d/` for various system settings (such as security, network, and filesystem settings). The list of files includes `10-console-messages.conf`, `10-link-restrictions.conf`, and others. After completing this task, a notification is sent to apply the kernel settings changes. - + `flush handlers` - Calls accumulated handlers. Executes the handler `apply kernel settings`, which runs the `sysctl -p` command to apply the kernel parameters specified in `/etc/sysctl.conf` or in other files in the `/etc/sysctl.d/` directory. - * `configure cpu governor` – A block of tasks for configuring the CPU frequency management mode: - + `install cpufrequtils` - Installs the `cpufrequtils` package from apt. The task is set with cache check parameters and a task timeout of 300 seconds to expedite task execution and avoid an infinite loop waiting for apt package updates. - + `use performance cpu governor` - Creates the file `/etc/default/cpufrequtils` with content "GOVERNOR=performance", which sets the CPU governor mode to "performance" (disabling power-saving mode when CPU cores are idle). After completing the task, a notification is sent to restart the `cpufrequtils` service. - + `disable ondemand.service` - Disables the `ondemand.service` if it is present in the system. The service is stopped, its automatic start is disabled, and it is masked (preventing its start). After completing the task, a notification is sent to restart cpufrequtils. - + `flush handlers` - Calls accumulated handlers. Executes the handler `restart cpufrequtils`, which restarts the `cpufrequtils` service. - + `start cpufrequtils` - Starts and enables the `cpufrequtils.service`. Subsequently, the service will start automatically at system boot. - -3. [Role](https://github.com/ydb-platform/ydb-ansible/blob/main/roles/ydbd/tasks/main.yaml) `ydbd`. Tasks: - * `check if required variables are defined` – Checks that the variables `ydb_archive`, `ydb_config`, `ydb_tls_dir` are defined. If any of these are undefined, Ansible will display an appropriate error message and stop the playbook execution. - * `set vars_for_distribution variables` – Sets variables from the specified file in the `vars_for_distribution_file` variable during playbook execution. This task manages a set of variables dependent on the specific Linux distribution. - * `ensure libaio is installed` – Ensures that the `libaio` package is installed. - * `install custom libidn from archive` – Installs a custom version of the `libidn` library from an archive. - * `create certs group` – Creates a system group `certs`. - * `create ydb group` – Creates a system group `ydb`. - * `create ydb user` – Creates a system user `ydb` with a home directory. - * `install YDB server binary package from archive` – Installs {{ ydb-short-name }} from a downloaded archive. - * `create YDB audit directory` – Creates an `audit` subdirectory in the {{ ydb-short-name }} installation directory. - * `setup certificates` – A block of tasks for setting up security certificates: - + `create YDB certs directory` – Creates a `certs` subdirectory in the {{ ydb-short-name }} installation directory. - + `copy the TLS ca.crt` – Copies the root certificate `ca.crt` to the server. - + `copy the TLS node.crt` – Copies the TLS certificate `node.crt` from the generated certificates directory. - + `copy the TLS node.key` – Copies the TLS certificate `node.key` from the generated certificates directory. - + `copy the TLS web.pem` – Copies the TLS pem key `web.pem` from the generated certificates directory. - * `copy configuration file` – Copies the configuration file `config.yaml` to the server. - * `add configuration file updater script` – Copies the `update_config_file.sh` script to the server. - -4. [Role `ydbd_static`](https://github.com/ydb-platform/ydb-ansible/blob/main/roles/ydbd_static/tasks/main.yaml). Tasks: - * `check if required variables are defined` – Checks that the variables `ydb_cores_static`, `ydb_disks`, `ydb_domain`, `ydb_user` are defined. If any of these variables are undefined, the task will fail and an appropriate error message will be displayed for each undefined variable. - * `check if required secrets are defined` – Verifies that the secret variable `ydb_password` is defined. If this variable is undefined, the task will fail and an error message will be displayed. - * `create static node configuration file` – Creates a static node configuration file by running the copied `update_config_file.sh` script with `ydbd-config.yaml` and `ydbd-config-static.yaml` configurations. - * `create static node systemd unit` – Creates a `ydbd-storage.service` file for the static node based on a template. After completing the task, a notification is sent to restart the `systemd` service. - * `flush handlers` – Executes accumulated handlers. Restarts all `systemd` services. - * `format drives confirmation block` – A block of tasks for formatting disks and interrupting playbook execution in case the user declines confirmation. A confirmation request to format the connected disk will be displayed in the terminal. Response options: `yes` – to continue executing the playbook with disk formatting. Any other value will be interpreted as a refusal to format. By default, disks are formatted automatically without asking the user for permission, as the variables `ydb_allow_format_drives` and `ydb_skip_data_loss_confirmation_prompt` are set to `true`. If user confirmation is required, the value of the `ydb_skip_data_loss_confirmation_prompt` variable should be changed to `false` in the inventory file `50-inventory.yaml`. - * `prepare drives` – A task for formatting connected disks. Calls the `drive_prepare` plugin – a specially developed Ansible module for {{ ydb-short-name }} installation, which is part of the {{ ydb-short-name }} collection and is located in the directory `.../.ansible/collections/ansible_collections/ydb_platform/ydb/plugins/action/drive_prepare.py`. The module will format the connected disk specified in the `ydb_disks` variable if the `ydb_allow_format_drives` variable is set to `true`. - * `start storage node` – Starts the storage node process using `systemd`. If any errors occur during service startup, playbook execution will be interrupted. - * `get ydb token` – Requests a YDB token to perform the storage initialization command. The token is stored in the `ydb_credentials` variable. The task calls the `get_token` module from the directory `.../.ansible/collections/ansible_collections/ydb_platform/ydb/plugins/modules`. If any errors occur at this step, playbook execution will be interrupted. - * `wait for ydb discovery to start working locally` – Calls the `wait_discovery` module, which performs a `ListEndpoints` request to YDB to check the operability of the cluster's basic subsystems. If the subsystems are working properly, storage initialization commands and database creation can be executed. - * `init YDB storage if not initialized` – Initializes the storage if it has not already been created. The task calls the `init_storage` plugin, which performs the storage initialization command using a grpcs request to the static node on port 2135. The command result is stored in the `init_storage` variable. - * `wait for ydb healthcheck switch to "GOOD" status` – Waits for the YDB healthcheck system to switch to a `GOOD` status. The task calls the `wait_healthcheck` plugin, which performs a health check command on YDB. - * `set cluster root password` – Sets the password for the YDB root user. The task is executed by the `set_user_password` plugin, which performs a grpcs request to YDB and sets a pre-defined password for the YDB root user. The password is specified in the `ydb_password` variable in the inventory file `/examples/9-nodes-mirror-3-dc/inventory/99-inventory-vault.yaml` in an encrypted form. - - -5. [Role `ydbd_dynamic`](https://github.com/ydb-platform/ydb-ansible/blob/main/roles/ydbd_dynamic/tasks/main.yaml). Tasks: - * `check if required variables are defined` – Verifies the presence of required variables (`ydb_domain`, `ydb_pool_kind`, `ydb_cores_dynamic`, `ydb_brokers`, `ydb_dbname`, `ydb_dynnodes`) and displays an error if any variable is missing. - * `create dynamic node configuration file` – Creates a configuration file for dynamic nodes. - * `create dynamic node systemd unit` – Creates a systemd service for dynamic nodes. After completing the task, a notification is sent to restart the `systemd` service. - * `flush handlers` – Executes accumulated handlers. This will restart `systemd`. - * `start dynamic nodes` – Starts the process of dynamic nodes using `systemd`. - * `get ydb token` – Obtains a token for creating a database. - * `create YDB database` – Creates a database. The task is executed by the `create_database` plugin, which performs a request to 99-inventory-vault.yaml to create the database. - * `wait for ydb discovery to start working locally` – Calls the `wait_discovery` module again to check the operability of the cluster's basic subsystems. \ No newline at end of file diff --git a/ydb/docs/en/core/sre/ansible/_includes/repo-tree.md b/ydb/docs/en/core/sre/ansible/_includes/repo-tree.md deleted file mode 100644 index aa1eab9c8dcd..000000000000 --- a/ydb/docs/en/core/sre/ansible/_includes/repo-tree.md +++ /dev/null @@ -1,18 +0,0 @@ -```text -├── 8-nodes-block-4-2 / 9-nodes-mirror-3-dc -│   ├── ansible.cfg # An Ansible configuration file containing settings for connecting to servers and project structure options. It is essential for customizing Ansible's behavior and specifying default settings. -│   ├── ansible_vault_password_file # A file containing the password for decrypting encrypted data with Ansible Vault, such as sensitive variables or configuration details. This is crucial for securely managing secrets like the root user password. -│   ├── creds # A directory for environment variables that specify the username and password for YDB, facilitating secure access to the database. -│   ├── files -│   │   ├── config.yaml # A YDB configuration file, which contains settings for the database instances. -│   ├── inventory # A directory containing inventory files, which list and organize the servers Ansible will manage. -│   │   ├── 50-inventory.yaml # The main inventory file, specifying the hosts and groups for Ansible tasks. -│   │   └── 99-inventory-vault.yaml # An encrypted inventory file storing sensitive information, such as the root user's password for YDB, using Ansible Vault. -│   ├── setup_playbook.yaml # A playbook file that initiates the installation and configuration roles for setting up YDB on the cluster. -├── README.md # A markdown file providing a description of the repository, including how to use it, prerequisites, and any other relevant information. -├── requirements.txt # A file listing Python package dependencies required for the virtual environment, ensuring all necessary tools and libraries are installed. -├── requirements.yaml # Specifies the Ansible collections needed, pointing to the latest versions or specific versions required for the project. -├── TLS #A directory intended for storing TLS (Transport Layer Security) certificates and keys for secure communication. -│   ├── ydb-ca-nodes.txt # Contains a list of Fully Qualified Domain Names (FQDNs) of the servers for which TLS certificates will be generated, ensuring secure connections to each node. -│   └── ydb-ca-update.sh # A script for generating TLS certificates from the ydb-ca-nodes.txt list, automating the process of securing communication within the cluster. -``` \ No newline at end of file diff --git a/ydb/docs/en/core/sre/ansible/_includes/terraform/aws.md b/ydb/docs/en/core/sre/ansible/_includes/terraform/aws.md deleted file mode 100644 index 365f3f643c62..000000000000 --- a/ydb/docs/en/core/sre/ansible/_includes/terraform/aws.md +++ /dev/null @@ -1,26 +0,0 @@ -Create an [account](https://console.aws.amazon.com) in AWS and add enough balance to run 9 VMs. You can calculate the approximate cost of maintaining infrastructure depending on the region and other circumstances using the [AWS calculator](https://calculator.aws/#/createCalculator/ec2-enhancement). - -Create a user and connection key in AWS Cloud to run the AWS CLI: - -* The user is created in the Security credentials → Access management → [Users](https://console.aws.amazon.com/iam/home#/users) → Create User section. -* The next step is to assign rights to the user. Select `AmazonEC2FullAccess`. -* After creating a user, go to it, open the `Security credentials` tab and click the **Create access key** button in the **Access keys** section. -* From the proposed options for sets of options, select `Command Line Interface`. -* Next, come up with a tag for marking the key and click the **Create access key** button. -* Copy the values of the `Access key` and `Secret access key` fields. - -Install [AWS CLI](https://aws.amazon.com/cli/) and run the `aws configure` command. Enter the values of the `Access key` and `Secret access key` fields saved earlier. Edit the `~/.aws/credentials` and `~/.aws/config` files as follows: -* Add `[AWS_def_reg]` to `~/.aws/config` before `region = ...`. -* Add `[AWS]` before the connection key secret information. - -Go to the `aws` directory in the downloaded repository and edit the following variables in the `variable.tf` file: -* `aws_region` – the region in which the infrastructure will be deployed. -* `aws_profile` – security profile name from the file `~/.aws/credentials`. -* `availability_zones` – list of region availability zones. It is formed from the name of the region and the serial letter. For example, for the `us-west-2` region the list of availability zones will look like this: `["us-west-2a", "us-west-2b", "us-west-2c"]`. - -To create the infrastructure for the first time, you need to run the following commands: -* `terraform init` – installing the provider and initializing modules. -* `terraform plan` – creating a plan for future infrastructure. -* `terraform apply` (re-execute) - Create resources in the cloud. - -Next, the commands `terraform plan`, `terraform init` and `terraform destroy` (destruction of the created infrastructure) are used. \ No newline at end of file diff --git a/ydb/docs/en/core/sre/ansible/_includes/terraform/azure.md b/ydb/docs/en/core/sre/ansible/_includes/terraform/azure.md deleted file mode 100644 index 854b17387b43..000000000000 --- a/ydb/docs/en/core/sre/ansible/_includes/terraform/azure.md +++ /dev/null @@ -1,10 +0,0 @@ -Create an [account](https://portal.azure.com/#home) in Azure and top up your [account](https://portal.azure.com/#view/Microsoft_Azure_GTM/ModernBillingMenuBlade/~/BillingAccounts) account with the amount , sufficient to operate nine VMs. You can calculate the approximate cost of maintaining infrastructure depending on the region and other circumstances using [calculator](https://azure.com/e/26977c150e854617a888fb3a7d1a399d). - -Authentication to the Azure Provider for Terraform is done through the CLI. You can download, install and configure the Azure CLI by following [this](https://learn.microsoft.com/ru-ru/cli/azure/install-azure-cli) instructions. You can log in to Azure using the Azure CLI interactively with the `az login` command, and the easiest way to create a pair of SSH keys (Linux, macOS) is to use the `ssh-keygen` command. - -After logging into Azure and generating SSH keys, you need to change the default value of the following variables in the root file `variables.tf`: - -* `auth_location` – name of the region where the infrastructure will be deployed. A list of available regions depending on the subscription can be obtained with the command `az account list-locations | grep "displayName"`. -* `ssh_key_path` – path to the public part of the generated SSH key. - -The values of the remaining variables can be left unchanged. While in the root directory of the Terraform script, run the `terraform init` command - the Terraform provider will be installed and the modules will be initialized. Then run the `terraform plan` command to create an infrastructure plan and then run the `terraform apply` command to create the infrastructure in the Azure cloud. \ No newline at end of file diff --git a/ydb/docs/en/core/sre/ansible/_includes/terraform/gcp.md b/ydb/docs/en/core/sre/ansible/_includes/terraform/gcp.md deleted file mode 100644 index b4a43f2ab8e2..000000000000 --- a/ydb/docs/en/core/sre/ansible/_includes/terraform/gcp.md +++ /dev/null @@ -1,18 +0,0 @@ -1. Register in the Google Cloud console and [create](https://console.cloud.google.com/projectselector2/home) a project. -3. Activate your [payment account](https://console.cloud.google.com/billing/manage) and top it up with funds to launch nine VMs. You can calculate the cost in [calculator](https://cloud.google.com/products/calculator). -4. Activate [Compute Engine API](https://console.cloud.google.com/apis/api/compute.googleapis.com/metrics) and [Cloud DNS API](https://console.cloud.google. com/apis/api/dns.googleapis.com/metrics). -5. Download and install GCP CLI by following [this](https://cloud.google.com/sdk/docs/install) instructions. -6. Go to the `.../google-cloud-sdk/bin` subdirectory and run the `./gcloud compute regions list` command to get a list of available regions. -7. Run the command `./gcloud auth application-default login` to configure the connection profile. -8. Download the repository using the `git clone https://github.com/ydb-platform/ydb-terraform` command. -9. Go to the `gcp` subdirectory (located in the downloaded repository) and in the `variables.tf` file set the current values for the following variables: - * `project` – the name of the project that was set in the Google Cloud cloud console. - * `region` – the region where the infrastructure will be deployed. - * `zones` – list of availability zones in which subnets and VMs will be created. - -Now, being in the `gcp` subdirectory, you can run the following sequence of commands to install the provider, initialize modules and create the infrastructure: -* `terraform init` – installing the provider and initializing modules. -* `terraform plan` – creating a plan for future infrastructure. -* `terraform init` (re-execute) – create resources in the cloud. - -Next, the commands `terraform plan`, `terraform init` and `terraform destroy` (destruction of the created infrastructure) are used. \ No newline at end of file diff --git a/ydb/docs/en/core/sre/ansible/_includes/terraform/yc.md b/ydb/docs/en/core/sre/ansible/_includes/terraform/yc.md deleted file mode 100644 index 120abb759d03..000000000000 --- a/ydb/docs/en/core/sre/ansible/_includes/terraform/yc.md +++ /dev/null @@ -1,45 +0,0 @@ -To create infrastructure in Yandex Cloud using Terraform you need: - -1. Prepare the cloud for work: - * [Register](https://console.cloud.yandex.ru/) in Yandex Cloud. - * [Connect](https://cloud.yandex.com/ru/docs/billing/concepts/billing-account) payment account. - * [Make sure](https://console.cloud.yandex.ru/billing) that there are enough funds to create nine VMs. -2. Install and configure Yandex Cloud CLI: - * [Download](https://cloud.yandex.ru/ru/docs/cli/quickstart) Yandex Cloud CLI. - * [Create](https://cloud.yandex.ru/ru/docs/cli/quickstart#initialize) profile -3. [Create](https://cloud.yandex.com/ru/docs/tutorials/infrastructure-management/terraform-quickstart#get-credentials) service account using the CLI. -4. [Generate](https://cloud.yandex.ru/ru/docs/cli/operations/authentication/service-account#auth-as-sa) SA key in JSON format for connecting Terraform to the cloud using the CLI: `yc iam key create --service-account-name --output --folder-id `. An SA key will be generated, and secret information will be output to the terminal: - ``` - access_key: - id: ajenhnhaqgd3vp... - service_account_id: aje90em65r6922... - created_at: "2024-03-05T20:10:50.0150..." - key_id: YCAJElaLsa0z3snzH4E... - secret: YCPKNJDVhRZgyywl4hQwVdcSRC... - ``` - Copy `access_key.id` and `secret`. The values of these fields will be needed later when working with AWS CLI. -5. [Download](https://aws.amazon.com/ru/cli/) AWS CLI. -6. Set up the AWS CLI environment: - * Run the `aws configure` command and sequentially enter the previously saved `access_key.id` and `secret`. For the region value use `ru-central1`: - ``` - aws configure - AWS Access Key ID [None]: AKIAIOSFODNN******** - AWS Secret Access Key [None]: wJalr********/*******/bPxRfiCYEX******** - Default region name [None]: ru-central1 - Default output format [None]: - ``` - The files `~/.aws/credentials` and `~/.aws/config` will be created. -7. Edit `~/.aws/credentials` and `~/.aws/config` as follows: - * Add `[Ya_def_reg]` to `~/.aws/config` before `region = ru-central1-a`. - * Add `[Yandex]` before the secret information about connection keys. -8. [Configure](https://cloud.yandex.com/ru/docs/tutorials/infrastructure-management/terraform-quickstart#configure-provider) Yandex Cloud Terraform provider. -9. Download this repository with the command `git clone https://github.com/ydb-platform/ydb-terraform.git`. -10. Go to the `yandex_cloud` directory (directory in the downloaded repository) and make changes to the following variables in the `variables.tf` file: - * `key_path` – path to the SA key generated using the CLI. - * `cloud_id` – cloud ID. You can get a list of available clouds with the command `yc resource-manager cloud list`. - * `profile` – profile name from the file `~/.aws/config`. - * `folder_id` – Cloud folder ID. Can be obtained with the command `yc resource-manager folder list`. - -Now, being in the `yandex_cloud` directory, you can run the `terraform init` command to install the provider and initialize the modules. Next you need to run a series of commands: -* `terraform plan` – creating a plan for future infrastructure. -* `terraform init` (re-call) – creating resources in the cloud. \ No newline at end of file diff --git a/ydb/docs/en/core/sre/ansible/index.md b/ydb/docs/en/core/sre/ansible/index.md deleted file mode 100644 index 550d19d5725d..000000000000 --- a/ydb/docs/en/core/sre/ansible/index.md +++ /dev/null @@ -1,8 +0,0 @@ -# Working with {{ ydb-short-name }} using Ansible - -This section of {{ ydb-short-name }} documentation contains a collection of articles intended for SRE's managin {{ ydb-short-name }} clusters using [Ansible](https://www.ansible.com/). This is the recommended approach to running production {{ ydb-short-name }} clusters unless your organization have already embraced [Kubernetes](../kubernetes/index.md). - -The key articles to get started with this section: - -* [Initial deployment](initial-deployment.md) -* [Preparing VMs with Terraform](preparing-vms-with-terraform.md) \ No newline at end of file diff --git a/ydb/docs/en/core/sre/ansible/initial-deployment.md b/ydb/docs/en/core/sre/ansible/initial-deployment.md deleted file mode 100644 index e1f29c3601b2..000000000000 --- a/ydb/docs/en/core/sre/ansible/initial-deployment.md +++ /dev/null @@ -1,281 +0,0 @@ -# Deploying {{ ydb-short-name }} cluster with Ansible - -This guide outlines the process of deploying a {{ ydb-short-name }} cluster on a group of servers using Ansible. {{ ydb-short-name }} can be deployed on any desired number of servers, but the minimum number of servers in the cluster should not be less than eight for the `block-4-2` redundancy model and nine servers for the `mirror-3-dc` redundancy model. You can learn about redundancy models from the article [{#T}](../../deploy/configuration/config.md#domains-blob). - -During operation, the cluster can be [expanded](../../maintenance/manual/cluster_expansion.md) without suspending access to the databases for users. - -{% note info %} - -**Recommended Server Requirements**: - -* 16 CPUs (calculated based on the utilization of 8 CPUs by the storage node and 8 CPUs by the dynamic node). -* 16 GB RAM (recommended minimum RAM). -* An additional 120 GB network SSD drive (cannot be smaller – installation requirements for {{ ydb-short-name }}). -* SSH access; -* Network connectivity between machines in the cluster. -* OS: Ubuntu 18+, Debian 9+. -* Internet access for updating repositories and downloading necessary packages. - -{% endnote %} - -You can download the repository with the playbook for installing {{ ydb-short-name }} on the cluster from GitHub – `git clone https://github.com/ydb-platform/ydb-ansible-examples.git`. This repository contains: installation templates for deploying {{ ydb-short-name }} on a cluster of eight servers – `8-nodes-block-4-2`, and nine servers – `9-nodes-mirror-3-dc`, as well as scripts for generating TLS certificates and requirement files for installing necessary Python packages. - -{% cut "Repository Structure" %} - -{% include [repo-tree](./_includes/repo-tree.md) %} - -{% endcut %} - - -To work with the project on a local (intermediate or installation) machine, you will need: Python 3 version 3.10+ and Ansible core version 2.15.2 or higher. Ansible can be installed and run globally (installed in the system) or in a virtual environment. If Ansible is already installed – you can move on to the step ["Configuring the Ansible project"](#ansible-project-setup), if Ansible is not yet installed, install it using one of the following methods: - -{% list tabs %} - -- Installing Ansible globally (in the system) - - * Update the apt package list – `sudo apt update`. - * Upgrade packages – `sudo apt upgrade`. - * Install the `software-properties-common` package to manage your distribution's software sources – `sudo apt install software-properties-common`. - * Add a new PPA to apt – `sudo add-apt-repository --yes --update ppa:ansible/ansible`. - * Install Ansible – `sudo apt install ansible-core`. - * Check the Ansible core version – `ansible --version` - -- Installing Ansible in a Python virtual environment - - * Update the apt package list – `sudo apt update`. - * Install the `venv` package for Python3 – `sudo apt install python3-venv` - * Create a directory where the virtual environment will be created and where the playbooks will be downloaded. For example, `mkdir ydb-install-ansible`. - * Go to the created directory and create a virtual environment – `python3 -m venv ydb-ansible`. - * Activate the virtual environment – `source venv/bin/activate`. All further actions with Ansible are performed inside the virtual environment. You can exit it with the command `deactivate`. - * Install the recommended version of Ansible using the command `pip install -r requirements.txt`, while in the root directory of the downloaded repository. - * Check the Ansible core version – `ansible --version` - -{% endlist %} - - -## Configuring the Ansible project {#ansible-project-setup} - -Navigate to the root directory of the downloaded repository and execute the command `ansible-galaxy install -r requirements.yaml` – this will download the Ansible collections `ydb_platform.ydb` and `community.general`, which contain roles and plugins for installing {{ ydb-short-name }}. - -[Download](../../downloads/index.md#ydb-server) the archive of the current version of {{ ydb-short-name }} into the project's root directory. For example, using wget: `wget https://binaries.ydb.tech/release/23.3.17/ydbd-23.3.17-linux-amd64.tar.gz` and also copy the private part of the SSH key for accessing the {{ ydb-short-name }} cluster servers to the same location. The SSH key should have the following permissions: -```text --rw------- (600) # Only the owner has read and write permission. -``` -You can set the required permissions with the command `sudo chmod 600 `. - -Next, you can go to the TLS directory and specify in the file ydb-ca-nodes.txt a list of FQDNs for which TLS certificates will be generated. By default, the list looks as follows: -```text -static-node-1 static-node-1.ydb-cluster.com -static-node-2 static-node-2.ydb-cluster.com -static-node-3 static-node-3.ydb-cluster.com -static-node-4 static-node-4.ydb-cluster.com -static-node-5 static-node-5.ydb-cluster.com -static-node-6 static-node-6.ydb-cluster.com -static-node-7 static-node-7.ydb-cluster.com -static-node-8 static-node-8.ydb-cluster.com -static-node-9 static-node-9.ydb-cluster.com -``` - -Generate a set of TLS certificates, which will be placed in the CA subdirectory (`TLS/CA/certs/`) using the script `ydb-ca-update.sh`. - -After generating the TLS certificates, installing the Ansible collections, uploading the private part of the SSH key, and downloading the current version of {{ ydb-short-name }}, you need to update the inventory files according to the chosen type of cluster for deployment. - -### Editing the project's inventory files {#inventory-edit} - -Regardless of the type of cluster being created (eight servers – `8-nodes-block-4-2` or nine servers – `9-nodes-mirror-3-dc`), the main parameters for installing and configuring {{ ydb-short-name }} are contained in the inventory file `50-inventory.yaml`, which is located in the `/inventory/` directory. - -In the inventory file `50-inventory.yaml`, you need to specify the current list of FQDNs of the servers where {{ ydb-short-name }} will be installed. By default, the list appears as follows: - ```yaml - all: - children: - ydb: - hosts: - static-node-1.ydb-cluster.com: - static-node-2.ydb-cluster.com: - static-node-3.ydb-cluster.com: - static-node-4.ydb-cluster.com: - static-node-5.ydb-cluster.com: - static-node-6.ydb-cluster.com: - static-node-7.ydb-cluster.com: - static-node-8.ydb-cluster.com: - static-node-9.ydb-cluster.com: - ``` - -Next, you need to make the following changes in the `vars` section of the inventory file: - * `ansible_user` – specify the user for Ansible to connect via SSH. - * `ansible_ssh_common_args: "-o ProxyJump=@"` – option for connecting Ansible to a server by IP, from which {{ ydb-short-name }} will be installed (including ProxyJump server). It is used when installing {{ ydb-short-name }} from a local machine that is not included in the private DNS zone. - * `ansible_ssh_private_key_file` – change the default ssh-key name to the actual one: `"../"`. - * `ydb_tls_dir` – specify the current path part (`/files/CA/certs/`) to the security certificates after they have been generated by the `ydb-ca-update.sh` script. - * `ydb_brokers` – list the FQDNs of the broker nodes. For example: - ```yaml - ydb_brokers: - - static-node-1.ydb-cluster.com - - static-node-2.ydb-cluster.com - - static-node-3.ydb-cluster.com - ``` - * `ydb_cores_static` – set the number of CPU cores consumed by the static node; - * `ydb_cores_dynamic` – set the number of CPU cores consumed by the dynamic node; - -The value of the `ydb_database_groups` variable in the `vars` section has a fixed value tied to the redundancy type and does not depend on the size of the cluster: -* For the redundancy type `block-4-2`, the value of `ydb_database_groups` is seven. -* For the redundancy type `mirror-3-dc`, the value of `ydb_database_groups` is eight. - -The values of the `system_timezone` and `system_ntp_servers` variables depend on the infrastructure properties where the YDB cluster is being deployed. By default, `system_ntp_servers` includes a set of NTP servers without considering the geographical location of the infrastructure on which the YDB cluster will be deployed. We strongly recommend using a local NTP server for on-premise infrastructure and the following NTP servers for cloud providers: - -{% list tabs %} - -- AWS - * `system_timezone`: USA/ - * `system_ntp_servers`: [169.254.169.123, time.aws.com] [Learn more](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/set-time.html#configure-time-sync) about AWS NTP server settings. - -- Azure - * You can read about how time synchronization is configured on Azure virtual machines in [this](https://learn.microsoft.com/en-us/azure/virtual-machines/linux/time-sync) article. - -- Alibaba - * The specifics of connecting to NTP servers in Alibaba are described in [this article](https://www.alibabacloud.com/help/en/ecs/user-guide/alibaba-cloud-ntp-server). - -- Yandex Cloud - * `system_timezone`: Europe/Moscow - * `system_ntp_servers`: [0.ru.pool.ntp.org, 1.ru.pool.ntp.org, ntp0.NL.net, ntp2.vniiftri.ru, ntp.ix.ru, ntps1-1.cs.tu-berlin.de] [Learn more](https://cloud.yandex.ru/en/docs/tutorials/infrastructure-management/ntp) about Yandex Cloud NTP server settings. - -{% endlist %} - -No changes to other sections of the `50-inventory.yaml` configuration file are required. Next, you can change the standard YDB root user password contained in the encrypted inventory file `99-inventory-vault.yaml` and in the file `ansible_vault_password_file.txt`. To change the password – specify the new password in the `ansible_vault_password_file.txt` file and duplicate it in the `99-inventory-vault.yaml` file in the format: - ```yaml - all: - children: - ydb: - vars: - ydb_password: - ``` - -To encrypt `99-inventory-vault.yaml`, execute the command `ansible-vault encrypt inventory/99-inventory-vault.yaml`. - -After modifying the inventory files, you can proceed to prepare the {{ ydb-short-name }} configuration file. - - -### Preparing the {{ ydb-short-name }} Configuration File {#ydb-config-prepare} - -The {{ ydb-short-name }} configuration file contains the settings for {{ ydb-short-name }} nodes and is located in the subdirectory `/files/config.yaml`. A detailed description of the configuration file settings for {{ ydb-short-name }} can be found in the article [{#T}](../../deploy/configuration/config.md). - -The default {{ ydb-short-name }} configuration file already includes almost all the necessary settings for deploying the cluster. You need to replace the standard FQDNs of hosts with the current FQDNs in the `hosts` and `blob_storage_config` sections: -* `hosts` section: - ```yaml - ... - hosts: - - host: static-node-1.ydb-cluster.com - host_config_id: 1 - walle_location: - body: 1 - data_center: 'zone-a' - rack: '1' - ... - ``` -* `blob_storage_config` section: - ```yaml - ... - - fail_domains: - - vdisk_locations: - - node_id: static-node-1.ydb-cluster.com - pdisk_category: SSD - path: /dev/disk/by-partlabel/ydb_disk_1 - ... - ``` - -The rest of the sections and settings in the configuration file can remain unchanged. - - -## Deploying the {{ ydb-short-name }} cluster {#erasure-setup} - -{% note info %} - -The minimum number of servers in a {{ ydb-short-name }} cluster is eight servers for the `block-4-2` redundancy model and nine servers for the `mirror-3-dc` redundancy model. - -In `mirror-3-dc` servers should be distributed across three availability zones or datacenters as evenly as possible. - -{% endnote %} - -The [repository](https://github.com/ydb-platform/ydb-ansible-examples) contains two ready sets of templates for deploying a {{ ydb-short-name }} cluster of eight (redundancy model `block-4-2`) and nine servers (`mirror-3-dc`). Either of the provided options can be scaled to any required number of servers, taking into account a number of technical requirements. - -To prepare your own template, you can follow the instructions below: -1. Create a copy of the directory with the ready example (`9-nodes-mirror-3-dc` or `8-nodes-block-4-2`). -2. Specify the FQDNs of the servers in the file `TLS/ydb-ca-nodes.txt` and execute the script `ydb-ca-update.sh` to generate sets of TLS certificates. -3. Make changes to the inventory files of the template according to the [instructions](#inventory-edit). -4. Make changes to the {{ ydb-short-name }} configuration file according to the [instructions](#ydb-config-prepare). -5. Execute the command `ansible-playbook setup_playbook.yaml`, while in the directory of the cloned template. - - -## Installation script execution plan for {{ ydb-short-name }} {#ydb-playbook-run} - -The sequence of role executions and their brief descriptions: -1. The `packages` role configures repositories, manages APT preferences and configurations, fixes unconfigured packages, and installs necessary software packages depending on the distribution version. -2. The `system` role sets up system settings, including clock and timezone configuration, time synchronization via NTP with `systemd-timesyncd`, configuring `systemd-journald` for log management, kernel module loading configuration, kernel parameter optimization through `sysctl`, and CPU performance tuning using `cpufrequtils`. -3. The `ydb` role performs tasks related to checking necessary variables, installing base components and dependencies, setting up system users and groups, deploying and configuring {{ ydb-short-name }}, including managing TLS certificates and updating configuration files. -4. The `ydb-static` role prepares and launches static nodes of {{ ydb-short-name }}, including checking necessary variables and secrets, formatting and preparing disks, creating and launching `systemd unit` for the storage node, as well as initializing the storage and managing database access. -5. The `ydb-dynamic` role configures and manages dynamic nodes of {{ ydb-short-name }}, including checking necessary variables, creating configuration and `systemd unit` files for each dynamic node, launching these nodes, obtaining a token for {{ ydb-short-name }} access, and creating a database in {{ ydb-short-name }}. - -{% cut "Detailed step-by-step installation process description" %} - -{% include [ansible-install-steps](./_includes/ansible-install-steps.md) %} - -{% endcut %} - -As a result of executing the playbook, a {{ ydb-short-name }} cluster will be created, with a test database named `database`, a `root` user with maximum access rights created, and [Embedded UI](../../maintenance/embedded_monitoring/index.md) running on port 8765. To connect to the Embedded UI, you can set up SSH tunneling. For this, execute the command `ssh -L 8765:localhost:8765 -i @` on your local machine. After successfully establishing the connection, you can navigate to the URL [localhost:8765](http://localhost:8765): - -![ydb-web-ui](../../_assets/ydb-web-console.png) - -## Monitoring the cluster state {#troubleshooting} - -After successfully creating the {{ ydb-short-name }} cluster, you can check its state using the Embedded UI – [http://localhost:8765/monitoring/cluster/tenants](http://localhost:8765/monitoring/cluster/tenants): - -![ydb-cluster-check](../../_assets/ydb-cluster-check.png) - -This section displays the following parameters of the {{ ydb-short-name }} cluster, reflecting its state: -* `Tablets` – a list of running [tablets](../../concepts/cluster/common_scheme_ydb.md#tablets). All tablet state indicators should be green; -* `Nodes` – the number and state of static and dynamic nodes launched in the cluster. The node state indicator should be green, and the ratio of created to launched nodes should be equal. For example, 27/27 for a nine-node cluster. -The `Load` indicators (amount of RAM used) and `Storage` (amount of disk space used) should also be green. - -You can check the state of the storage group in the `storage` section – [http://localhost:8765/monitoring/cluster/storage](http://localhost:8765/monitoring/cluster/storage): - -![ydb-storage-gr-check](../../_assets/ydb-storage-gr-check.png) - -The `VDisks` indicators should be green, and the `state` status (found in the tooltip when hovering over the Vdisk indicator) should be `Ok`. More about the cluster state indicators and monitoring can be read in the article [{#T}](../../maintenance/embedded_monitoring/ydb_monitoring.md). - -## Cluster Testing { #testing } - -You can test the cluster using the built-in load tests in YDB CLI. To do this, download YDB CLI version [2.5.0](https://storage.yandexcloud.net/yandexcloud-ydb/release/2.5.0/linux/amd64/ydb) to the machine where Ansible is installed. For example, using wget: `wget https://storage.yandexcloud.net/yandexcloud-ydb/release/2.5.0/linux/amd64/ydb`. - -Make the downloaded binary file executable – `chmod +x ydb` and execute the connection check command: -```shell -./ydb \ -config profile create \ --d /Root/database \ --e grpcs://< FQDN node >:2135 \ ---ca-file /CA/certs/ca.crt \ ---user root \ ---password-file /ansible_vault_password_file -``` -Command parameters and their values: -* `config profile create` – This command is used to create a connection profile. You specify the profile name. More detailed information on how to create and modify profiles can be found in the article [{#T}](../../reference/ydb-cli/profile/create.md). -* `-e` – Endpoint, a string in the format `protocol://host:port`. You can specify the FQDN of any cluster node and omit the port. By default, port 2135 is used. -* `--ca-file` – Path to the root certificate for connections to the database using `grpcs`. The certificate is created by the `ydb-ca-update.sh` script in the `TLS` directory and is located at the path `TLS/CA/certs/` relative to the root of the ydb-ansible-examples repository. -* `--user` – The user for connecting to the database. By default, the user `root` is created when executing the `setup_playbook.yaml` playbook. -* `--password-file` – Path to the password file. In each folder with a YDB cluster deployment template, there is an `ansible_vault_password_file` that contains the password for the user `root`. - -You can check if the profile has been created using the command `./ydb config profile list`, which will display a list of profiles. After creating a profile, you need to activate it with the command `./ydb config profile activate `. To verify that the profile has been activated, you can rerun the command `./ydb config profile list` – the active profile will have an (active) mark. - -To execute a YQL query, you can use the command `./ydb yql -s 'select 1;'`, which will return the result of the `select 1` command in table form to the terminal. After checking the connection, you can create a test table with the command: -`./ydb workload kv init --init-upserts 1000 --cols 4`. This will create a test table `kv_test` consisting of 4 columns and 1000 rows. You can verify that the `kv_test` table was created and filled with test data by using the command `./ydb yql -s 'select * from kv_test limit 10;'`. - -The terminal will display a table of 10 rows. Now you can perform cluster performance testing. The article [{#T}](../../reference/ydb-cli/workload-kv.md) describes 5 types of workloads (`upsert`, `insert`, `select`, `read-rows`, `mixed`) and the parameters for their execution. An example of executing the `upsert` test workload with the parameter to print the execution time `--print-timestamp` and standard execution parameters is: `./ydb workload kv run upsert --print-timestamp`. - -A report of the following type will be displayed in the terminal: -``` -Window Txs/Sec Retries Errors p50(ms) p95(ms) p99(ms) pMax(ms) Timestamp -1 727 0 0 11 27 71 116 2024-02-14T12:56:39Z -2 882 0 0 10 21 29 38 2024-02-14T12:56:40Z -3 848 0 0 10 22 30 105 2024-02-14T12:56:41Z -... -``` - -After completing the tests, the `kv_test` table can be deleted with the command: `./ydb workload kv clean`. More details on the options for creating a test table and tests can be read in the article [{#T}](../../reference/ydb-cli/workload-kv.md). diff --git a/ydb/docs/en/core/sre/ansible/preparing-vms-with-terraform.md b/ydb/docs/en/core/sre/ansible/preparing-vms-with-terraform.md deleted file mode 100644 index c533cb8d55c2..000000000000 --- a/ydb/docs/en/core/sre/ansible/preparing-vms-with-terraform.md +++ /dev/null @@ -1,168 +0,0 @@ -# Deploying infrastructure for cluster {{ ydb-short-name }} using Terraform - -There are three recommended ways to deploy {{ ydb-short-name }} clusters for production use: using [Ansible](initial-deployment.md), [Kubernetes](../kubernetes/initial-deployment.md) or [manually](../../deploy/index.md). If the option with Kubernetes is practically self-sufficient, then for the options with Ansible and manually, you need ssh access to the required number of correctly configured servers or virtual machines to start. This article describes how you can create and configure the set of virtual machines required for the {{ ydb-short-name }} cluster on various cloud providers. - -**[Terraform](https://www.terraform.io/)** is open source infrastructure management software based on the Infrastructure as Code model. The same approach is used in Ansible, a configuration management system. Terraform and Ansible work at different levels: Terraform manages the infrastructure, and Ansible configures the environments on the VM: - -![AiC_scheme](./_assets/terraform/AiC_scheme.png) - -The configuration for setting up the VM environment is described in YAML format, and the infrastructure code is written in [HCL](https://github.com/hashicorp/hcl) (Terraform configuration language). The basic logical unit of recording in HCL is the "block". A block consists of a keyword identifying its type, a name, and curly braces indicating the body of the block. For example, this is what a virtual server control block in AWS might look like: -```hcl -resource "aws_instance" "ydb-vm" { - count = var.instance_count - ami = "ami-008fe2fc65df48dac" - instance_type = "t2.micro" - key_name = var.req_key_pair - vpc_security_group_ids = [var.input_security_group_id] - subnet_id = element(var.input_subnet_ids, count.index % length(var.input_subnet_ids)) - - tags = { - Name = "ydb-node-${count.index +1}" - Username = "ubuntu" - } - -} -``` - -Blocks can be located one after another in one file and be independent, they can refer to each other and be dependent, and they can also be nested inside each other. - -Main block types: -* `resource` – block for initializing an infrastructure resource (VM, network, subnet, disk, DNS zone, etc.); -* `provider` – block initialization of the provider, API version and authentication data; -* `variable` – a variable with both a default value and an empty one for storing data entered by the user or transmitted by other blocks; -* `output` – output data to the terminal and save it in a variable; -* `data` – variable for requesting data from external cloud resources that are not represented in the created infrastructure; -* `module` – logical grouping of resources that can be reused several times within the same or different projects; -* `terraform` – a block for setting the behavior of Terraform itself, including the version of Terraform and the providers used, as well as settings for the backend, which is used to store Terraform state. - -Blocks are written in files with a `.tf` extension and are logically grouped in directories, which in Terraform terminology are called modules. A module usually consists of the following files: -* `main.tf` – the main file that contains the infrastructure code. There may be multiple files containing infrastructure code. -* `variables.tf` – local module variables that receive data from other modules or have default values. -* `outputs.tf` – variables that contain the results of the resource (VM IP addresses, network/subnet IDs, etc.). - -Modules are connected to the project in the root file `main.tf` as follows: -``` -module "vpc" { - source = "./modules/vpc" - subnets_count = var.subnets_count - subnets_availability_zones = var.availability_zones -} -``` -In the example, the `vpc` module is connected (the module name is assigned when connecting). The required parameter is `source` - the path to the directory where the module is located. `subnets_count` and `subnets_availability_zones` are variables inside the `vpc` module that take values from the global level variables `var.subnets_count`, `var.availability_zones`. - -Modules, as well as blocks, are located one after another in the root `main.tf` of the project. The main advantage of the modular approach to project organization is the ability to easily manage logically related sets of resources. Therefore, our [repository](https://github.com/ydb-platform/ydb-terraform) with ready-made Terraform scripts is organized as follows: -```txt -. -├── README.md -├── README_RU.md -├── aws -│   ├── README.md -│   ├── README_RU.md -│   ├── main.tf -│   ├── modules -│   │   ├── dns -│   │   ├── eip -│   │   ├── instance -│   │   ├── key_pair -│   │   ├── security -│   │   └── vpc -│   └── variables.tf -├── azure -│   ├── README.md -│   ├── README_RU.md -│   ├── main.tf -│   ├── modules -│   │   ├── dns -│   │   ├── resource_group -│   │   ├── security -│   │   ├── vm -│   │   └── vpc -│   └── variables.tf -├── ... -``` - -Поддиректории содержат два `readme`, файл `variables.td` с локальными переменными модуля и основной файл `main.tf`, который подключает модули из поддиректории `modules`. Набор модулей зависит от облачного провайдера. Базовые модули, функционально одинаковые для всех провайдеров имеют одинаковые названия: -* `vpc` – модуль управления облачной сетью и подсетями. -* `dns` – модуль управления DNS-зоной и DNS-записями. -* `security` – модуль управления группами безопасности. -* `instance` – модуль управления ВМ. - -Для того, чтобы воспользоваться готовыми Terraform сценариями из репозитория, нужно скачать репозиторий командой `git clone https://github.com/ydb-platform/ydb-terraform.git`, внести изменения в конфигурационный файл Terraform `~/.terraformrc`, задать актуальные значения глобальных переменных сценария и скачать CLI того облачного провайдера, где будет создана инфраструктура. - -Если вы планируете использовать несколько провайдеров, можно добавить следующий код в `~/.terraformrc`, который установит пути скачивания для всех провайдеров описанных ниже: -``` -provider_installation { - network_mirror { - url = "https://terraform-mirror.yandexcloud.net/" - include = ["registry.terraform.io/*/*"] - } - direct { - exclude = ["registry.terraform.io/*/*"] - exclude = ["terraform.storage.ydb.tech/*/*"] - } - - filesystem_mirror { - path = "/Applications/ - } - } -``` - -The subdirectories contain two `readme`, a file `variables.td` with local module variables and a main file `main.tf`, which includes modules from the `modules` subdirectory. The set of modules depends on the cloud provider. Basic modules, functionally the same for all providers, have the same names: -* `vpc` – cloud network and subnet management module. -* `dns` – module for managing DNS zone and DNS records. -* `security` – security group management module. -* `instance` – VM control module. - -In order to use ready-made Terraform scripts from the repository, you need to download the repository with the command `git clone https://github.com/ydb-platform/ydb-terraform.git`, make changes to the Terraform configuration file `~/.terraformrc`, set the current values of global script variables and download the CLI of the cloud provider where the infrastructure will be created. - -If you plan to use multiple providers, you can add the following code to `~/.terraformrc`, which will set the download paths for all providers described below: -``` -provider_installation { - network_mirror { - url = "https://terraform-mirror.yandexcloud.net/" - include = ["registry.terraform.io/*/*"] - } - direct { - exclude = ["registry.terraform.io/*/*"] - exclude = ["terraform.storage.ydb.tech/*/*"] - } - - filesystem_mirror { - path = "/Applications/ - } - } -``` - -If you are already using Terraform providers provided in the [official repository](https://registry.terraform.io/browse/providers), they will continue to work. - -The following are step-by-step instructions for creating infrastructure in [AWS](#aws-cluster), [Azure](#aws-cluster), [GCP](#gcp-cluster), [Yandex Cloud](#gcp-cluster). The scenarios proposed by Terraform deploy the same type of infrastructure: - -The infrastructure includes: - -* Nine virtual VMs (16 CPU, 32 GB RAM, additional 200 GB disk). -* Cloud network and three subnets (one subnet per availability zone). -* Private DNS zone. -* Security groups allowing traffic on ports: 22, icmp, 8765. - -Most cluster parameters are adjustable (number of VMs, size and type of connected disk, number of networks, DNS zone domain, etc.), but please note that there are recommended values for cluster parameters that are already defined as default values. Changing them downward can render the cluster inoperable. These recommended values for cluster parameters are: -* Number of CPU cores. The minimum recommended number of CPU cores is 16 pieces. -* RAM size. The minimum recommended amount of RAM is 32 GB. -* Volume of the attached disk. The minimum recommended size of the attached disk is 200 GB. - -## Create infrastructure in AWS to deploy {{ ydb-short-name }} cluster {#aws-cluster} - -{% include [aws](./_includes/terraform/aws.md) %} - -## Create infrastructure in Azure to deploy {{ ydb-short-name }} cluster {#azure-cluster} - -{% include [azure](./_includes/terraform/azure.md) %} - -## Creating infrastructure in Google Cloud Platform to deploy {{ ydb-short-name }} cluster {#gcp-cluster} - -{% include [gcp](./_includes/terraform/gcp.md) %} - -## Creating an infrastructure in Yandex Cloud for deploying the {{ ydb-short-name }} cluster {#yc-cluster} - -{% include [yc](./_includes/terraform/yc.md) %} - -With the help of Yandex Cloud provider, you can not only create an infrastructure for further deployment of a YDB cluster on it using [Ansible](./initial-deployment.md), but also manage [serverless or dedicated](https://cloud.yandex.ru/ru /services/ydb) version of YDB directly from Terraform. Read about the possibilities of working with YDB in Yandex Cloud in the section [Working with YDB via Terraform](https://cloud.yandex.ru/ru/docs/ydb/terraform/intro) of the Yandex Cloud documentation. \ No newline at end of file diff --git a/ydb/docs/en/core/sre/ansible/toc_p.yaml b/ydb/docs/en/core/sre/ansible/toc_p.yaml deleted file mode 100644 index 729ed7802c3c..000000000000 --- a/ydb/docs/en/core/sre/ansible/toc_p.yaml +++ /dev/null @@ -1,7 +0,0 @@ -items: -- name: Overview - href: index.md -- name: Initial deployment - href: initial-deployment.md -- name: Preparing VMs with Terraform - href: preparing-vms-with-terraform.md \ No newline at end of file diff --git a/ydb/docs/en/core/sre/index.md b/ydb/docs/en/core/sre/index.md deleted file mode 100644 index 19eed406896d..000000000000 --- a/ydb/docs/en/core/sre/index.md +++ /dev/null @@ -1,7 +0,0 @@ -# {{ ydb-short-name }} for SRE - -This section of {{ ydb-short-name }} documentation covers everything you need to know to run a production-grade {{ ydb-short-name }} cluster. It is subdivided based on what's your preferred approach to managing infrastructure: - -* **[Ansible](ansible/index.md).** For deployments on bare metal and virtual machines. -* **[Kubernetes](kubernetes/index.md).** For containerized deployments. -* **[Manual](../cluster/index.md).** Generic instructions. \ No newline at end of file diff --git a/ydb/docs/en/core/sre/kubernetes/index.md b/ydb/docs/en/core/sre/kubernetes/index.md deleted file mode 100644 index 18d1c36ffafb..000000000000 --- a/ydb/docs/en/core/sre/kubernetes/index.md +++ /dev/null @@ -1,7 +0,0 @@ -# Working with {{ ydb-short-name }} using Kubernetes - -This section of {{ ydb-short-name }} documentation contains a collection of articles intended for SRE's deploying {{ ydb-short-name }} clusters using [Kubernetes](https://kubernetes.io/). This is the recommended approach to running production {{ ydb-short-name }} clusters. If your organization is not comfortable with Kubernetes yet, we'd recommend [using Ansible instead](../ansible/index.md). - -The key articles to get started with this section: - -* [Initial deployment](initial-deployment.md) \ No newline at end of file diff --git a/ydb/docs/en/core/sre/kubernetes/initial-deployment.md b/ydb/docs/en/core/sre/kubernetes/initial-deployment.md deleted file mode 100644 index c9f4fc26e09f..000000000000 --- a/ydb/docs/en/core/sre/kubernetes/initial-deployment.md +++ /dev/null @@ -1,325 +0,0 @@ -# Getting started with {{ ydb-short-name }} in {{ k8s }} - -Deploying {{ ydb-short-name }} in {{ k8s }} is a simple way to set up and run a {{ ydb-short-name }} cluster. {{ k8s }} allows to use an universal approach to managing your application in any cloud service provider. This guide provides instructions on how to deploy {{ ydb-short-name }} in [AWS EKS](https://aws.amazon.com/eks/) or [{{ managed-k8s-full-name }}](https://cloud.yandex.com/services/managed-kubernetes). - -## Prerequisites - -{{ ydb-short-name }} is delivered as a [Helm](https://helm.sh/) chart that is a package with templates of {{ k8s }} structures. For more information about Helm, see the [documentation](https://helm.sh/docs/). The {{ ydb-short-name }} chart can be deployed in the following environment: - -1. A {{ k8s }} cluster with version 1.20 or higher. It needs to support [Dynamic Volume Provisioning](https://kubernetes.io/docs/concepts/storage/dynamic-provisioning/). Follow the instructions below if you don't have a suitable cluster yet. -2. The `kubectl` command line tool is [installed](https://kubernetes.io/docs/tasks/tools/install-kubectl) and {{ k8s }} cluster access is configured. -3. The Helm package manager with a version higher than 3.1.0 is [installed](https://helm.sh/docs/intro/install/). - -{% include [_includes/storage-device-requirements.md](../../_includes/storage-device-requirements.md) %} - -## Creating a {{ k8s }} cluster - -Skip this section if you have already configured a suitable {{ k8s }} cluster. - -{% list tabs %} - -- AWS EKS - - 1. Configure `awscli` and `eksctl` to work with AWS resources according to the [documentation](https://docs.aws.amazon.com/eks/latest/userguide/getting-started-eksctl.html). - - 2. Configure `kubectl` to work with a {{ k8s }} cluster. - - 3. Run the following command: - - ```bash - eksctl create cluster \ - --name ydb \ - --nodegroup-name standard-workers \ - --node-type c5a.2xlarge \ - --nodes 3 \ - --nodes-min 1 \ - --nodes-max 4 - ``` - - This command will create a {{ k8s }} cluster named `ydb`. The `--node-type` flag indicates that the cluster is deployed using `c5a.2xlarge` (8vCPUs, 16 GiB RAM) instances. This meets minimal guidelines for running {{ ydb-short-name }}. - - It takes 10 to 15 minutes on average to create a {{ k8s }} cluster. Wait for the process to complete before proceeding to the next step of {{ ydb-short-name }} deployment. The `kubectl` configuration will be automatically updated to work with the cluster after it is created. - - -- {{ managed-k8s-full-name }} - - Follow the instructions in the [{{ managed-k8s-full-name }} quick start guide](https://cloud.yandex.com/en/docs/managed-kubernetes/quickstart). - -{% endlist %} - -## Overview of {{ ydb-short-name }} Helm chart - -The Helm chart installs [YDB Kubernetes Operator](https://github.com/ydb-platform/ydb-kubernetes-operator) to the {{ k8s }} cluster. It is a controller that follows the [Operator](https://kubernetes.io/docs/concepts/extend-kubernetes/operator/) design pattern. It implements the logic required for deploying and managing {{ ydb-short-name }} components. - -A {{ ydb-short-name }} cluster consists of two kinds of nodes: - -* **Storage nodes** ([Storage](https://github.com/ydb-platform/ydb-kubernetes-operator/tree/master/samples/storage-block-4-2.yaml) resource) provide the data persistence layer. -* **Dynamic nodes** ([Database](https://github.com/ydb-platform/ydb-kubernetes-operator/tree/master/samples/database.yaml) resource) implement data access and processing. - -Create both resources with the desired parameters to deploy a {{ ydb-short-name }} cluster in {{ k8s }}. We'll follow this process in more detail below. The schema for these resources is [hosted on GitHub](https://github.com/ydb-platform/ydb-kubernetes-operator/tree/master/deploy/ydb-operator/crds). - -After the chart data is processed by the controller, the following resources are created: - -* [StatefulSet](https://kubernetes.io/docs/concepts/workloads/controllers/statefulset/): A workload controller that assigns stable network IDs and disk resources to each container. -* [Service](https://kubernetes.io/docs/concepts/services-networking/service/): An object that is used to access the created databases from applications. -* [ConfigMap](https://kubernetes.io/docs/concepts/configuration/configmap/): An object that is used to store the cluster configuration. - -See the operator's source code [on GitHub](https://github.com/ydb-platform/ydb-kubernetes-operator). The Helm chart is in the [deploy](https://github.com/ydb-platform/ydb-kubernetes-operator/tree/master/deploy) folder. -{{ ydb-short-name }} containers are deployed using `cr.yandex/yc/ydb` images. Currently, they are only available as prebuilt artifacts. - -## Environment preparation - -1. Clone the [ydb-kubernetes-operator](https://github.com/ydb-platform/ydb-kubernetes-operator) repository: - - ```bash - git clone https://github.com/ydb-platform/ydb-kubernetes-operator && cd ydb-kubernetes-operator - ``` - -2. Add the {{ ydb-short-name }} repository to Helm: - - Run the command: - - ```bash - helm repo add ydb https://charts.ydb.tech/ - ``` - * `ydb`: The repository alias. - * `https://charts.ydb.tech/`: The {{ ydb-short-name }} repository URL. - - Output: - - ```text - "ydb" has been added to your repositories - ``` - -3. Update the Helm chart index: - - Run the command: - - ```bash - helm repo update - ``` - - Output: - - ```text - Hang tight while we grab the latest from your chart repositories... - ...Successfully got an update from the "ydb" chart repository - Update Complete. ⎈Happy Helming!⎈ - ``` - -## Deploying a {{ ydb-short-name }} cluster - -### Install the {{ ydb-short-name }} {{ k8s }} operator - -Use `helm` to deploy the {{ ydb-short-name }} {{ k8s }} operator to the cluster: - - Run the command: - - ```bash - helm install ydb-operator ydb/ydb-operator - ``` - - * `ydb-operator`: The installation name. - * `ydb/ydb-operator`: The name of the chart in the repository you have added earlier. - - Result: - - ```text - NAME: ydb-operator - LAST DEPLOYED: Thu Aug 12 19:32:28 2021 - NAMESPACE: default - STATUS: deployed - REVISION: 1 - TEST SUITE: None - ``` - -### Deploy storage nodes - -{{ ydb-short-name }} supports a number of [storage topologies](../../cluster/topology.md). {{ ydb-short-name }} {{ k8s }} operator comes with a few sample configuration files for the most common topologies. This guide uses them as-is, but feel free to adjust them as needed or implement a new configuration file from scratch. - -Apply the manifest for creating storage nodes: - -{% list tabs %} - -- block-4-2 - - ```bash - kubectl apply -f samples/storage-block-4-2.yaml - ``` - - This will create 8 {{ ydb-short-name }} storage nodes that persist data using erasure coding. This takes only 50% of additional storage space to provide fault-tolerance. - -- mirror-3-dc - - ```bash - kubectl apply -f samples/storage-mirror-3-dc.yaml - ``` - - This will create 9 {{ ydb-short-name }} storage nodes that store data with replication factor 3. - -{% endlist %} - -This command creates a `StatefulSet` object that describes a set of {{ ydb-short-name }} containers with stable network IDs and disks assigned to them, as well as `Service` and `ConfigMap` objects that are required for the cluster to work. - -{{ ydb-short-name }} storage nodes take a while to initialize. You can check the initialization progress with `kubectl get storages.ydb.tech` or `kubectl describe storages.ydb.tech`. Wait until the status of the Storage resource changes to `Ready`. - -{% note warning %} - -The cluster configuration is static. The controller won't process any changes when the manifest is reapplied. You can only update cluster parameters such as version or disk size by creating a new cluster. - -{% endnote %} - -### Create a database and dynamic nodes - -{{ ydb-short-name }} database is a logical entity that is served by a number of dynamic nodes. A sample manifest that comes with {{ ydb-short-name }} {{ k8s }} operator creates a database named `database-sample` with 3 dynamic nodes. As with storage nodes, feel free to adjust the configuration as needed. - -Apply the manifest for creating a database and dynamic nodes: - -```bash -kubectl apply -f samples/database.yaml -``` - -{% note info %} - -The value referenced by `.spec.storageClusterRef.name` key must match the name of the `Storage` resource with storage nodes. - -{% endnote %} - -A `StatefulSet` object that describes a set of dynamic nodes is created after processing the manifest. The created database will be accessible from inside the {{ k8s }} cluster by the `database-sample` hostname or the `database-sample..svc.cluster.local` FQDN, where `namespace` indicates the namespace that was used for the installation. You can connect the database via port 2135. - -View the status of the created resource: - -```bash -kubectl describe database.ydb.tech -``` - -Result: - -``` -Name: database-sample -Namespace: default -Labels: -Annotations: -API Version: ydb.tech/v1alpha1 -Kind: Database -... -Status: - State: Ready -Events: - Type Reason Age From Message - ---- ------ ---- ---- ------- - Normal Provisioning 8m10s ydb-operator Resource sync is in progress - Normal Provisioning 8m9s ydb-operator Resource sync complete - Normal TenantInitialized 8m9s ydb-operator Tenant /root/database-sample created -``` - -`State: Ready` means that the database is ready to be used. - - -### Test cluster operation - -Check how {{ ydb-short-name }} works: - - - 1. Check that all nodes are in the `Running` status: - - ```bash - kubectl get pods - ``` - - Result: - - ``` - NAME READY STATUS RESTARTS AGE - database-sample-0 1/1 Running 0 1m - database-sample-1 1/1 Running 0 1m - database-sample-2 1/1 Running 0 1m - database-sample-3 1/1 Running 0 1m - database-sample-4 1/1 Running 0 1m - database-sample-5 1/1 Running 0 1m - storage-sample-0 1/1 Running 0 1m - storage-sample-1 1/1 Running 0 1m - storage-sample-2 1/1 Running 0 1m - storage-sample-3 1/1 Running 0 1m - storage-sample-4 1/1 Running 0 1m - storage-sample-5 1/1 Running 0 1m - storage-sample-6 1/1 Running 0 1m - storage-sample-7 1/1 Running 0 1m - storage-sample-8 1/1 Running 0 1m - ``` - - 2. Start a new pod with [{{ ydb-short-name }} CLI]((../reference/ydb-cli/index.md)): - - ```bash - kubectl run -it --image=cr.yandex/crptqonuodf51kdj7a7d/ydb:22.4.44 --rm ydb-cli bash - ``` - - 3. Query the {{ ydb-short-name }} database: - - ```bash - ydb \ - --endpoint grpc://database-sample-grpc:2135 \ - --database /root/database-sample \ - table query execute --query 'SELECT 2 + 2;' - ``` - - * `--endpoint`: The database endpoint. - * `--database`: The name of the created database. - * `--query`: The query text. - - Result: - - ```text - ┌─────────┐ - | column0 | - ├─────────┤ - | 4 | - └─────────┘ - ``` - - -## Further steps - -After you have tested that the created {{ ydb-short-name }} cluster operates fine you can continue using it as you see fit. For example, if you just want to continue experimenting, you can use it to follow the [YQL tutorial](../../yql/tutorial/index.md). - -Below are a few more things to consider. - -### Monitoring - -{{ ydb-short-name }} provides standard mechanisms for collecting logs and metrics. Logging is done to standard `stdout` and `stderr` streams and can be redirected using popular solutions. For example, you can use a combination of [Fluentd](https://www.fluentd.org/) and [Elastic Stack](https://www.elastic.co/elastic-stack/). - -To collect metrics, `ydb-controller` provides resources like `ServiceMonitor`. They can be handled using [kube-prometheus-stack](https://github.com/prometheus-community/helm-charts/tree/main/charts/kube-prometheus-stack). - - -### Tuning allocated resources {#resource-allocation} - -You can limit resource consumption for each {{ ydb-short-name }} pod. If you leave the limit values empty, a pod can use the entire CPU time and VM RAM. This may cause undesirable effects. We recommend that you always specify the resource limits explicitly. - -To learn more about resource allocation and limits, see the [{{ k8s }} documentation](https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/). - - -### Release the resources you don't use {#cleanup} - -If you no longer need the created {{ ydb-short-name }} cluster, delete it by following these steps: - - -1. To delete a {{ ydb-short-name }} database and its dynamic nodes, just delete the respective `Database` resource: - - ```bash - kubectl delete database.ydb.tech database-sample - ``` - -2. To delete {{ ydb-short-name }} storage nodes, run the following commands: - - ```bash - kubectl delete storage.ydb.tech storage-sample - kubectl delete pvc -l app.kubernetes.io/name=ydb - ``` - -3. To remove the {{ ydb-short-name }} {{ k8s }} operator, delete it with Helm: - - ```bash - helm delete ydb-operator - ``` - - * `ydb-operator`: The name of the release that the controller was installed under. \ No newline at end of file diff --git a/ydb/docs/en/core/sre/kubernetes/toc_p.yaml b/ydb/docs/en/core/sre/kubernetes/toc_p.yaml deleted file mode 100644 index b296a61c4a0e..000000000000 --- a/ydb/docs/en/core/sre/kubernetes/toc_p.yaml +++ /dev/null @@ -1,5 +0,0 @@ -items: -- name: Overview - href: index.md -- name: Initial deployment - href: initial-deployment.md \ No newline at end of file diff --git a/ydb/docs/en/core/sre/toc_p.yaml b/ydb/docs/en/core/sre/toc_p.yaml deleted file mode 100644 index 95bb58995760..000000000000 --- a/ydb/docs/en/core/sre/toc_p.yaml +++ /dev/null @@ -1,15 +0,0 @@ -items: -- name: Overview - href: index.md -- name: Ansible - include: - mode: link - path: ansible/toc_p.yaml -- name: Kubernetes - include: - mode: link - path: kubernetes/toc_p.yaml -- name: Manual - include: - mode: link - path: ../cluster/toc_p.yaml \ No newline at end of file diff --git a/ydb/docs/ru/core/sre/ansible/_assets/terraform/AiC_scheme.png b/ydb/docs/ru/core/sre/ansible/_assets/terraform/AiC_scheme.png deleted file mode 100644 index e01304fa935dd8e92f1c6dbf538f89cda36a6634..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 343691 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 z

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%0AeEnEK< zhiqTh2}sJs&45Ql*bj~ySri6Bh7N%1eTE3md!#1;T7-L_W8t`N96DgGz9HWFa?8I4 z0`ZP-xseuS3@{gvv$%-JhAeWFkEnIqP6>R9QR^m_aadTQwDT3fq-X^l+l0;F%Z>3u z^WxC}UqjeG4wYiYKl-7Y;LNGPLQr7}`m}W(82(mFrTDrU8@bnANCVMRv3fisLWtm3 zpstm;8C<{t1inxN2D#V|6)o3Ev>cy&bcM)f1)`zzqCQBq;21#ZS^VgS?$&EyQG6aC zU+xA+odVGXFY2Ke#5`C3Truux422bsG&NZu;URMFPf+_c;0kK7kHR*h zify|nn(wmOK&J~4JghtvM#jVTpoZ;XZvlXKNLe3`qZy2!1He54_R@n&lS+ygv}{3kw^XP=Vz|Sr&4ndmr-T8lz1$-o7ss@AnC9;UG39SC{fpgR4S=+Xo<>6-rO4m0C@FMnrR`0xhe$b57K&KN&XC{TTjjOP+W28>8y z5(qRnn=4RJ>DB!aiGlH30d#~3bic?sd3AL%qi*Y<< zYtu)jKB#Q|5?rn+iS-HrzDL>@Xgnf?qK&JN+lV{u3{mL?0}pJI_E@&ZemXCw4-$og z<(FqiEFR=uG>^tiA1%vMrlAuk!|gTM6zbFcdj*tTS%I-2Y=-^r5^N!L zA0*Ad1*~i3c`2pLwC1mTlW}p(0zs**W}?)d3)BdFi&$rm4wI(GW}artR>%0 zS-~9he*mOXM{p%COdob5 z1AiaHNR!*Rklf>T%s&M7qT2Toy|59_PRj{l6Txty z#D0}PBXUP3uo)P;CmLtJ^dZ5IG0Y9{68-SG`$cXd%eVv^iy=%V{5H*q$Dtcc34;U` z*e3-Id&{=|$q(LNrq>WDZl~rNmej=rrjrR)jW+Z=>dGt-i@g`fYTU#m-(r2K-5JW@ zl-PFxb&?#aSrK_8dpH|$T)dQg);}j` z;w6a|eb^#YRRy$7*FGt1j^trO5|7WZh^hvU7un;4;SmuL+YpN>vm>=Cx=?F*s_-7v zl(>CdK!g&E7fKAOQGd&YV4tuVlrY1k_V0F!q#U!26jpUT!|}=5v}i>tz|2o)iI#mj zaY=I=Jv(2=$Ft>QW3faMDy_|Pf2p0Tb2bE1XV&@LYc7k1!~UsELVdk#2J%Kr-zWj; zJb6A4#b@&ujEMd=%&`@ue~6H+PJ1bxIkbt(5gOQ`yCXUIJ|bOIh2R#{0aU<+DKfL1 zXS|Eelm|avKOcas%XK6(itMg0kTPSz&DZtgqqQ!L;uU!vN-dEgTp_?(T4{LGUP)$R ztu)x(^A1D?$%&jq`{(Sv4^H0|lbDSt|6sQ2K)U~SkoVv@MMu&W=I{e+rGnKSuHe&k z9+S$v_WOd6P{qxM6m7~Q=>11@0l^@Y+Fvw)l&?E%7_ZNaeBb}NcEMo0?yV0J@gTBD zg}7B*yp}VEna1T1mh?X#xM3KDWG6)kBvZPqpgfYeIlFX<)XFnHfSN#iG?OaJy+ql} zK}0q24yd(uAx@`{qKv^cQ@7G|SKIpDQXV{A-2Tqi>(?Nx&BIOkh&)v>p1t4^#Aa+^ z*BJuK++0kCVj5MqxNoJLIiM>FsS z0;t`2pdKVn1@MyNb?h5xLPg!&DtSd7rOqf`6?acj*I=(Sv|UuVA%Vbh4Hg-c>$T{i zXS%WlcGj8vrRzK>?y2{-<5NP=cLn0;xG$Md=8KyTPLmL_92rp8m2klTsl0(tJ=u_q zKg6>ar{D`!yo=Rfp|se)LL2f+L?WyaPSKBMkR1Pn5~Gtqe^`w1l3L2}Th{30N;3(3 z^97nmMI!a+ND1FVg?W|^bfWn4-BwK9sHCKq$CI=#FL1#=$#JK zFO3yE0Ssuxj|@5Sv<}{c56J!Sv&>O1=MrF#Liyic&)E6yv(u z@G0lHs}Lo0Z?J}0LR}f6?Q-NHMe+2b8FUX_NyaaOg5L{&_vWKe8Q=1nSee3ldU}32 z{X_U{mO61@*20ZztXXeuB}T~Mz_x%fG~uBr=}t}PD|ahc6O1VqgZ6rW7QK!PG6%XI37e6=13ah~O+xpZ ziK=R>{TbW8-|tPI`sPSVsv|Jm!6@%~2|D@GEt-GT0z@mar>CVI^>UvA%sJ*TgbMf5 zkCzIvd`UV01^z3tPAW8D6o$miGn_AW-Qyz!aK>;9h$uig*-66g;;1;2uG!51wMC4xqnqJ^>j3o1LJ;ty_n8 zbT1bC{n!nlNqcF0>!;vCpo%ERxZjmE?Sjvv(w}6`*+y~LW%BOUS#%`Hu~NYyC`zXV zx;4FPfDh$@0R$!`i1Ow%0lz`@`wE0FY!?U!kd`vyX6U22^YcECtECSchWPFi^dHB% zm%*M#W#mCUFkv$^@!Z0z4pnh@ASPXzV0qI`E0jLo?ZPiKn4-+X~)c#$=2 z2T4@zEYb@PBl7IAhaklJ;RNZLF&D}JEAx`aA|n(?$Qb*)(IMQ=BaUmRoeXM5u?qIR`( zC_}9Z8lufiau6QLeHS_dWG5g(3uvAnkT)1$4w<+#Ca#Dz!4?TTH zQy>rKiz#f^dUYgH4N!_IW;BiBm~SkUC2Xr}A2iM?Q1dm&w(Y%{>~9`CMG&AM$fR z(`02?`~5wn;}%($Y`yll-*NL1uEH>?4e$|&njw$K3?>sLlXtY)5wGrvS_8st!H&SE zAzK8%vrDIAm;`>J-x!^J9DT=XFST;~)2!grOf3R0|LC(QqtKD4VqSw5m7$px)jP!X zk!!@oGd4!6NfV#s=Eqhg2DUp0){xBjukHs4m&e4#n|+$-^mV_d*nzw90*F``K{`>| z1Bj6Q5x@_1|6=eyZU9i$OMh-+wFV@M!43pPM2JawY`y*cHO$Z-kY|digoB7#x2KgPz? zsX|Up+0nIytMAPpqM`tSA%SRWwVI=)p+Ryd$dJA_f%RE1DPz5A*c31|ulkDXHd;B41Uw{mDtawDFlX)7&f}~BT;1AoW)h#Ov&(|Q} z4$s4BLf}`Np@0NN)a+Vj{51!TI}pJW2^9EIeVPhY5Xag>W3_tOrN-ZV;8tVWCnRO7 zlqM1CbM$2AjQEgb3!>UMC4f8Wq5cmmaAR5qz%_LZL1Uh@T}N8mskz6#+NT z3#3CN5L|5=D#CD3#EviPp+CeQnUR7Irdg%;|KdWjJuG2BX@?k)Y7;&v1`tIViG5wx zAPwCwQugI5qN1`6D0y)O6wbHRE8fk}6+wpxoeVe7E)aMR@nEnr1n}NS37UOsF8D(_ zK=n~?j>q0O<DW^DnA9dS9*_T_6wG z1iT)KLJA3DoWZ^-T4aN@m>>rIeXt-TVt-z5J|kcDV@6h%>~&8rWF9J%oHQJzmU+hw z3p?B%UiB*f1qbCFBlQQIzB8-Jv(FEg7az@F(J$9%-#n~2z_xi1H^YJ3kr`7pFX*_B zn-Aga#r(67M!d%)FrpVIBZ}`d7!1iwLN!yHdh4(_aE&ZKu6jcC4^x^_6tLOa&>d~K7LiBeucg#Rh$?yk( z3xuo6jsg}#yzmv2$}PlI`GaW=`Xi1+(+4muB+htpC%d$vOJ+iZpg&+ZA)c1XD&;qn z$RmUWs2`H1M~X(ZyStmP860VLF%w9I9$7Ks+}Y&FtRLG5wn-8ZWGKClo_QNe>X}c8 zka4+o<(2FeSB`lqFx^s!DH*?lihE&G3KxaAOBB8urwYmJ=K}yZ_mV*#Cie)dvfvFe zdF`*DLrM(MFI8w6$Yj5)M^dfyD03CsKtGOMTQ8=i^tbp$vxEVSU|!pQhgKkRP}hRA zh`_Q;!6`e@`v*WRqx@4vK{zjFL<7kEZ2#H-p0O)9-lAw~h^I(Xv{kMJS}ak3FKV>~ zPkwIV>SgaQaMI6;T&=|bB2+5EXMiOE(v+T##0PO=DklBTAawv_2H!}A7HQB4x~KbC zd?b`N-vqLzdP$45YJv=qzmd92PjwIg!H?%ucl#I)e+;Bt2%FK=N61aY9hEK)1ZrL$ z^T<{C9zTBU1y(ajUc%KpUDm2)d8clv-qzbzRp_b%V8s<2&I|k!=Lj8*KW92MJ^kAI z^N0dO7Com9<}67kq;2}8>ghdogpI5vH6ug%jOQh)XxUmE@!p!CSvTG7OZo&1hXxl> zKOP5%rXaZx#D)6;uHR3KQc{}0iyS8YyyVdeLB+>k|Gp%H#8mg!G=3d6bJ( z>`XTcl_n^_>N!&05(R3efgkS@g@jXRU{S;-pbF(kSPa%6!t(xRhu9`!!;du)KkL0( zX5oD88cy5`HJ68sSy3Hye!MCCjeVV`Q95?rwoGr`n;d8&t?UDB*ai!1CYWYw#vRW;;5g zr_AH*dKj3VkgT4nd}Hv<5dtsVG$TZ#^>7=+?wg?kyw%xA>@p@mc|Y*i(zlwT86J1( zvwyofS4KNhcpmleCS0?_QbcT>>|t(Qh?FSj=cGYd7khu*wq=Uo!o!2_m^^Os`WU2o zC%;_zsOWJp7n*MCViRg$~di(m;{|5#NYAK3WuJGj9x6o znO@oEJv1XOF2)d&&S(kQ71$4R#du&!=V9+SjYd&S}xPG!=^ zHr2ZT?m)`n`V)cul*{9l4k7o2iVcWON~4a};NO=U%+PYXvyx!yT)TFtNfH{nX)rMd z<@)DO=XlG{YAm?@;OAKJ&7=yJq>`w3{fDV)K@O`$P)6KUUaP7=Dsmbwq7ki((loZ!S_YdAYNKpup5@9Oe z?RB^a@+rEfJB2QRH|l%4JWV^^J3FowyS?bJ-NvyuZ?5x}P&sb`7~vop;xGK?)h-|@ z*_k_CQus7QFl{V3HMTC_LxuiA^#WYlS zxRTv|(8X$fR=eYA+xv!#v_iX3j1(;Z^gfklFR^9n!FAgHBm(`h)HCHVvHlDJs@|k;%g)~w>>Y*VT$CUrRP&IuP&}K!SaZj{3Nh!@n zg=nyMBs#ow6?(c;;BWzX-U@yfRcXv@^q1+%_G9-DStHA_U~H`{Q+A#Iltqy0O1+eH z)?1M=u;ycZHaW&!r>);6_6f`#nWA#2Wr$70x>iRJo4d`(SlGU{52>KgZk5=|R7LFx z#(_8}?Uyhsl@S~I@nCd&=VKDV_rUyTV~^xRYR;>5UwxQ079Rw^PK$HO$DJo@v#q^t%Mo1U5xSq<=686~4QM{!#Kw(=Pj{TnC5 z-;Y`Xt>PkLuCZ0GA+YlLrPcIgY)xL9EzV%EBJI=Vdpk8&qa)0qqY2Nbn4jp=K#|My zM|)=j^n|+q93f`EwtnSHHnEr}6<&K*;%$N#+%tqE8fBX6bDHE5V{UlcCMTP5_zS$f zZEx;mX64Si2U~T~#MY$ehu#;OK5HJgn7*idbyUzWzu%%;gu|2eL^BME{=%?JP;EF# zUtJR$tDmX+k0;C;R|48*PZhAFN?#=?4f}Jdz2ETgJGdlN7up4u*#PM1pRZcjgHLC2 zWUa84yLIk#%J<8l)s79Xoi->)%&cl(ZKXYS%m4J{fo^~kQPrpZ=bwUqD1#PV;3(p+ z5=v%Vs+b+$?i%*FMMZGdhz5I|vx2G>yAr~oXGF>8NgRMa{+IMh!H>gv4W0sQNP?-Y zW;y3o2dz`44;in4#)1aXmlE=O zd68tCOp==g(4{>MgUB;Tyii=3UOJc_r1h5!y9W zLB?*~cko%>*U__`S7JDyQ+J|W2HMvpr2_li4jcQQNUIL<+WjtY*q`@7JLddpPEe^G zri-1t%VXxcFYsN?pUU{J8*|3NL8vTWvACYLIx&xC!LK7R3Y6F=*6KM4eduen+7#3F ziMGFSHC$SfFwSno|HLd0#`8?~h>3~{#ai}EbLc#ThOc|s+nWjC+xGc)9WFmZl+AiBQVHgf47K{ zO26Ywdx;{g7mI@ilZD5heY_5d6&^yt*zq-ig`WMJstohNBgI1zj^sR-d_Z=!pi?T&unyAKn%!rLp1D!LiZE(NS!v z{K)f2`*ulYlcBq(rwe9Wf_wmM%e#{Co?|UMH@Bm1m@0U+4z;Ha9$x=);@o}zWe0i0 z`7?vw ztnvBK#ywbc`!lv=_q*Fzyu+>P%Ob)pH2XQAC#=>#`zos_neF z{TDs?+{Ky3>l|qcdwUU=$K)K?-hL@9y~$sO&Z92dV)1Iq9;I>KO1*k!8$h|Ps+((H zi?kR9-^tK;Vh!rnLy_a4Qa|HPhtyfMtGaTj#_QYt3MTQ%rd|kj`9EGpTBUCk(SF)d zhuOUIA3SQKrb!BS6eJCyWq4xA>U;Fh+@oUa{26lCs*mK=Cw0qN2&E9@R5~CJD(!)JqksFSaL!+t_S-=fb^D%VoWlDP9^2#{I|5 zA?x$-DrK`Ku>vi#*THAvx~=3aqG&bzBAbNXzNrwq)-IcL8{2QZ zykymxsxB_m$N0PFCRVFg!{cExHIdtnvS{o9QHa!k?tuK1N!5@v_Kb|UHgy+sBmba; z9x6uW1w*O5Z27%7b`@)hE^odu-%R&)6(S*UVk0cL21>iKSGJY~Gt5D|?^pm3^1JSG zfyXa8^I)~~O;YUrq1A-T<1Vi&DcADtGOLW@^KM_Om(K88TmInX{#k*5L5enxMM@w2 zVJXJXhINEDS=dnoPp#Mxq!q8dYV_*~HNzjjQ}zaTEu`K_yn>8JBkxxs?1zn5h0%k@ zR!cpVV~Mf$UWpm3R~?-Hh(tG1gBNtuZIypz{@kXwri1z@AcKup)Jq&6sI4AWqXt@n zy%e@0DDSv$s7_d8;jB7y(-j2OEYIoj(Dp9Q%G+`1R%4Fv1y~#YP9Bh|{Bnablt42=@mC(nPHQvIQHEaJs+-izox%S-h zr20NzW)IDn`sh6A^k^?1V_GAmMc4>4aA1+Ju9~ig&)<&qZ7q|3=AMJT%-qqf6Eo^9 zv%gAxz~$f+#kbi~GTDfm`y+ox$xR3xz2z#+v9xpLwH(t*;wcet&VyD-N(AXz{vovT z8bf}id^z_?VwXkvS^lb%7SIa1K@c6_2N~bmgA`jo&8@kcsY+!X0un+VLSOx|yj#ST z0H3a$oucG>;FsxxeT`?yU}(5+JR&!Y=Ai9^aPk=eLiGMjb$|n`CPMi zrqgn_vVsa&B{$hgqS^lC_QJ80Eqnis`^mSEN#OjQF;KL4WVU2I*?hclzFvhDhcM~H zPyq?o=Zm-yEB|-x+>e_{R@)Li9r+H%=|V}YJrGycR*nVpNsYZ)6ZXA4J$);7P5xt= zq(1u18{Unfjd3y;i|a{A7TIULw*?;^4=y|pgKDHa)F=!+)+$S8JLRZCo5aC5RvHFU z=Z@?UaZD<^jlH3?efve6dg;nbw#VRy7L_a2QXcSgZw`Ctg0706UOle+za4%-glc=O zGPZ8zZmWOFK?%F{2J-Mw{bdsBU1D#r+`sb9`;B7jMO^#`Fq{4HHqyH-vQ{5yM&F>( z1@t0cOY6RfyZ#vI-2NIX?2XySCTxGJOv+8(R8h@8q3qwZk;o*DO|1!eyX?4Kz1BK^ zZ9b!~tSz;Gndr59y6J+u$YTw@+3~Q$y}U!Gn1@61;cqlF-85W>zx12T;~-7yID|Gw-zYSdsmR;22=` zEv)u7NtO%tT=erbuEEL2(pRaco7X7o7U+b09Y(dTmTHWoU;M{?q2h@iRDg{?^IL^2 z_d81mlj6|fFwYjzZk29=Wm*7&*QEz!;wg7{I zY7mGOR%+H?zNPSZy7S4=qf>oZGHtqpejQa$RA zES4u^@=Jcb!B_J7Bzo_%$K693Ev8!(kb{L>yw zD?{!r-gxWb45Z3Q5x$Y#L2PboT;Y`s)c82}D_&l7?lo#&4>$k3wQzIc7gkKp{EhEd zC9M0hU2L!~H4RP}?FafS4Bp96TLF{U8jj0`2bGm}*{MlM=mgo>=6be>sDZCVw85RC z9S<3Ms3%2)4zS7-^~xBrk~2B2GxJQZ^_t^i-oM~;{Jt+(YNfShvNg(^efQ$>GDp|3 zg%ml>WPNz38hq!n3vcY*jrZ#t_=(K(WDD%NpF^TnUrJ!x`2rO}-0uCj)%57Erug5X2k}(`CpGt?(L+`l}%F&B-ic>XUcMM^V|K#)HO7e$be#-aN-YpvAf&! z+l>?Z?0lmdS}mXnv#lbu=SPDbXW56Dq4!>J_)+5OK5{lZUs?R>sC!=P9!YRWM{v~E ze)MXacE4aCoqx|&&)+}%gQFQ4adkVRX+vIZp)0nAhHueLDsTP$W4mnQ=6*>(p~5>U z+MIlW+G&^zcx;3#~A_&q&0>Tpbsit#3#Jb%@E654stUIzk1!V#9Mi;6d z3hEaA^MZc{--hGVpSS>!#N#EB$V6)&#_`lw9(>fm2GY%GJxY>q*u3j7q25=SKjEdRVRr1@P~cZbILR?II?9gY+V=&SZt z#yC`Y{Lvc2Bghu}b)iY2w@i|2Hfk`a&CO=Fd3O>goY%M@8HE>^cC76ga*Z-#6q@~^ zZ8xzh2Ii%=>7uw;b?dsf0^7U-nXuJ20`tFF3i8e8jNm2G>9Ft@V@aX+ZjKlZSj(Dk{wg~sZBx$h z)KM|5f#RHWOK@=o!?`MRsqa@&rt{eJ<4!1QL!lSVgsBvubZv^)@Q`sZDcm_Hvrr`` zUiD*q)@iZ)J{^O?HdXNZ(y#dgN(pPxu?r#o(JK+Yq&@FxP^JNW$2*Cu&*!XqO~l`! zY_hV{3OhHol?lzN+!5$_ zdd{;t=EDBR))?0HuMaeWQa-MG!6W z3=2-kjIUYYfn?R@cX6A#fXjvrpAO3U?wHsrTsmw|bX`TS%(_0ZL3dJTPQ%WVXIb-N zvxr^86gw0-HrUGGTsLkrIU&r~v5jg0Vh&rA-Nkm3Lu~?KOOu6Vy$Xb4$ug9|ZEhZt ze%s9-Y;9>@vMKjTwPZHnyl!bO^l&uQy5o?*$yG{#IwCKswlIiAQ%jX18C^elOdcZ}bDBHxtL`;ff(qq%wT zNp)Ghrre8`j942;plCI?TQu2zS^7)&jg9@H{K^DA%7f;by+z?&>+b{pdL4rM45m|Q z1d3@AHm0i|yR>5jwJ~B55w7BRKU^0|M}vGR)LSOCovGaf<<4?&6_fD&*#5<7W9XO9 z?)$&vN}ClJi+f8d?aH$;%K07l!$4_aF+5q#3_Pr@o0d1DKl@Qens70A$6FAYR~Xv} zS&ek>eV+=(4vJGq%S)V*$;fBy(OWK-ZCasQ1fEe^d>lsrg798gE%O?1pI%YT`%@pS zH|X12P?Q-xJs0=%89!Z-9!9r5+y2nK-cN42hB*It+BYX;XfJ<~@99$fUOk3Q&cnm) z8o9URZNt~SuJg)w@^|mnC#RN5KVp#X~d*Bv#AZ=%#b-&?dR<9ac1dtta7I@Re{Ht_o~nJ|;ZXYKjNS$u$nG z8X*doG|`wnC;eg5G)^ME?H?R`yRQ}UYyF_F#325Di6mDlXDHuvJh^qNQ+AtgxGpEI z4!JVKR!V=sZ z)e{q*Klt)Q$m@IMv|Gcdg=X-zkrL`q4?|;Tm&UTb^|8=`>9tVlwsK)^p_au$LLnJ) zoJMN>k@Z%5YizK~#ZZ)yh*t5j2|>-jPzzwf3`Ztxx&F$dRUE%GsmK@%Yx@X0$Y!AT zny2VO_=jl?#lYT2VyvYm*-?(Gt+NX^lNeBMw=4RNKeOk?Jyj`rCF_s%lr8lmUxTq* zn?04u$;pxln4 zA|CCEm8&df(%#wrJiDZ&x)qTu&1T&xEZ5pF8WuHG^o$dTu(+f_BT2Koj^({8yxVdx z;M6z3aAE(f(e^avgoewAJ-g#QWHsD)bL&;s-g=&RS8-a^2BBDhOtDdeld@&lzJJWS zsm)Gm{9MVxX8UsAmNv_No@F7ka_E5K!qsteI(O1t*-6i!N#&ZP(^d}%9I0Z*V61B2 ze3;)jS1@TK91*UJaZ*IzewqFBT#~#@a>WO((Xs_D>_X^PV~JG)azPi86Bk73vpB^w zVSA1JrxG28V_#D&q`E)>H1(n5r|l@afpy>TL2A7*+z+rGn-kq_X2F#E))=!QYyqLz zdk)n6_}$-+hXyD|$-~BpfL(9b_39*St1@LvUj6R8R#*2dB+K->tk(_eQ{4WLX|Ewo zfu)5qD4 zlOLk)EQ>jHJUtKK)TN9CZD4$B(#beSC$~MSA;_5Lf9mXrEfZC4T z`s>63|A;b?XzQek6?8Uk<^TSk+0D^uSc>#+76aw>cDL);SgJ8uPlTk6d1Z8rB$q^^ z>v~4$^tr>GIVWfJX;ASk^1GC67FptkBp`Z}BOQ=JQku=pWBi@>tnx|}O=@X8~ zs;x}z>1{19NZUU?8v>NU@ezk5u3{EDP7WiR&o~CKcDh~Nirt0D(GHOz<_)2ZXtwc#MtyeHA{KHs5@4-&`37VRgM7fn{uS-kUm z^qCCj5yuHHOh8+oWma8lV%LzZtz(z@%jt_0*)B4Ri#-d6tyX-~qse-WK9QuWQiGCQ z#uf}Vtq%5I`dU3+{P~Ng-Iqxcd%;^8R1!-&c9sx4nQo8%cFzj^?AdLfrR4_vJ|Q$& zmK(JX#Y{`Jh_U@~`$IY;qTN|s5z#ez;8?B z%StrzjPsH#e6S17Kc7>+hSM5Oc>dyj3n94ur(GB8@rtFMC5)Ap1M$e{oeVC;b1u&( z<<_U?W1WBXsKm~)?aF8kpl``Vhj-|v863CwaUY4q6f7_%`UmUj=hh-#)K64@zMrC& znFwKIPr-oH*VR-@xu)eT?U;)~n~vVeRQl$_^X4|D0nysRztKfkDBSnAu*t{Ccmc7N zW&+0@t!^PRE<8rdROY}YR+UxXKfS22^DXJt1GrN1A+*Qut>ebgu05eVsvdL8UK=eu zRKR%p^oESBkqP5!TAy!2XhN}()=p0z;)6e6+Y}Q+;;K%`(0|?W0yr4 z3Fxz^?oA&=tt`=CKN)MPc4!_xe9fSsZe8c3yY@cYPiD8~wwS)&M#iB0)Z%hvw5hwt zLwnaA0}CqDtL8W@r~UoOcSofL|G945Gol7f%xqh(3rlmG$F_=6W*Wq4p;fMCRgTz# zip9iSV+*!(*q+62kJB1Vw<6I^SwnQo!p?WM@KE;-vpP;_s#of&QfMk=*QC4ki~012 z(?vV4r8#+&*9I%ar=^6$LzEXrG-65BdP&K66Q-m0^Yf$H?TuRa}cCHNExii3CIQ z@N`Q)-pDFP@5s}h-`%!O>UmS`a2HF>V1M!o>e20m&h^dp6y~NfB~BY98(Hk90@oi+ z(ZZ=p+}zYut-T21-n z65M~D7b37zEmHO89y)3@rq=1HYUUEx+hsFJb@i|BqDT=*K1Q1-Gs^KbaP8eMpctuIgb8^s^(9jkFcIBc3Jy)nq+c|$3BG_R|ZvWL-1eU zOUK5*#Ln9BMf{$ zzIiZF_dy-rtCLSp`iH8N#de3c>qK1E-U520`>Y8=le{kKL-{X(YOBe*b>OB)`rU|y zcdrUxLF7C3SHD<+Y+svvZw7j1^wV!w!BVo*8msh2j- z1WN|+-Suq?`Rdp7LQ08NB3as0rciB$_4oyD-B*=5tE99#EXUU5-|8YzA1lZaY1W&? zfyy9ByJsJ75`b?|G)sTtkJMD9l$cpoXFpRm5NBJo{8sPZFu{;XdRpXO`bmW{pO6U?hFwjkroR7LM6n4**W2<7>tx3WT* z#MR=-(oRcbin+%uYo=41*PYuY>p$*`C`uo9av+uYW9Pe=X50DD2k3J5{M*76A58nR zg{g6_oj$EkJUkkRI7mDiyAP0`pFQhbIIfR?anhIa6RB1h((V*bZ z8AGEn)cVHpCx-61q3q$o2Wb-Bhd9?RlB`cm#b&829z=SSQNg>glXvmtCsnMj89V3v z`lQ-Gp*|bJCH@C%4@Pxc@kE9Z$_sOUIbnLCX6w&Wv?m@5MH=NF+*xnT~E_kN+Js)ol zjcDCCnfnJ&JF_h}I>VvArZk*eKdY`h2&bM6dpHqyS-R0an?iV@j}q4JJ{v`FJUXb* za8z3{=H_vY3MI-y>5ATF7#qVWGhtRuA7xN;vX(M7Qu>P;9_;7*m(5yn=xnp>58?j? zu7>%lP%M1x^`LV|zM)xlF`O^m4N<-lb~$umyE_u$yh${n?i=3)oDW6NiECmqd^2GZ z116EV1}8#0R9x#>a`s0sh|1xTioLJ8YwhS@33Nl38bnAZl`X3J{6q4zYg}AJ;oJ!_ zNGsW~*ZnZ>lUGM^a{upDHoX7eUoI={L_7!EEt@$o>2g-{bIb;{1ou#h;I)*3WcpW! zga5sUUa7WuKhxOj5i4B`6_oobWSG5KF&~ECInu$I(U%=|QX6@G=UUbd5kNvdi(P%W zsr@GO6U@Q8Gtzi?L8^`(a_+n7N!Z2g5Cb^kx^bPp<%Ib|<&3EBiCAV~GF%FGvoRTW zeJE$h|E$AW@6ci0`NQJv>&?vkB*n*`0 z+D-F(ra#?ZPm(k>mfKtSfoo~Qw0a$TT!dd17@rJL7JQnpe?zAghFlUB}LMnU0yISRF>3G@_gfYq~_u?vWzkqD7jAWV@8 zU5`m2&=~z$xSJv!j_&PMdW&pnm3zHNOCWeB-xOcZiOR@`C7ZV=!<-7RK^=YzbVKfD z>>9Min6Dr$*7F&F7^)AzvucY6fJ4W5cOmD+ePq%ze*1fhbpB*K5j=wP)&KwGe6>HA zYKx5py44BQEd=fjdXl1P|E-~OM*bBaiQGf5&=3#`!(kqmO|yT9RYvIl%bWgBO87`? z-jcJlv_vOnW@fVXEzi$O!8>PX=RDx%E+{BStgI9yCnq-sIG_^uYydtL6cn7DnR(#i zQogH;-)&N8>)>DrxLdPJOR}b>rV){mcL0>MtasyZ^t0Hb#MD#oJOl252U~pwXxvl*6e!ow%+lPvr8`w2b|VZLm8PJHtc|632n}83YzT5+ zSy>sH8jy@zfPpkzHQzuV0E&P>Q#M&HR%pU5Tch+gfJKNSSa(Bze#XbvvbpCD=CV08 zNaX?eE`r3{1Xw*Guy-<6?BEes0q{%E{3}4E6%Vc;k^>FkF}aob`F8-j%V`AD_Uzd+ z=t?9n1;$LMexk zX+l?j)*kS(x8Ra!yh9)fRqFwDQE31G8uFpZZCanrMHK;Ec%sQ!08m1EvvMAd2qXuy zO3tqcBHtQd@X!F*Lo2`!Mj&*i0GedX4G(7q4>JHvRV?TKmX^6zm{xOF5v>jYnEiwHL84vDN@NBW(T^fEXj8 z1C1M?0kLuOi%Uzb@CU(wXfhAm!KHU544@Io#8}ozvD?z~H2hGh`34og|Sl`&#A6`NFHP`B)T^Hj~ z39x9B0AfShDfa8>)2B;;nRN}h$0cuys6D0WmQ#1U>UhOG_F+%rpSlx@#lA1HH_;=g2C& z{qeFjK=SEBJ5d|J_;Gv~$-cN%uYgbvRcvHhwulSwba1J`6|;a0>ZaqjXHKw8v50WB zb0L@md;t7n10Ycu_TTGmumG~w8KQ~%0YLp`xc+)mOEVBlg$2TGPq#*R;*=0Rw#&c?O8Ck3F zM@Z?c;jVbI%ZmV7)wqXUvjOBV%(vJojv$1SFba?^N~a=BU#(XF?wSWOF9_@w9}sEX z22Q9~<-#$0Qj+0KY#0H$Xxq+r`v+N7J98Sqk;@12m=C)Q6BmI%RX~+3-UCat{hljEpKPD<$NMF~wUO8%f2*JfM?Qfd)%WO%1YmF@Ao2zwH_a z-D>bAV(RSb3WWCs#l_{qy&{=PQVtFd05%%~>rzlulw4ZM2e>bk1cxJla26U*-`U+A z6i+Xp2wied4Bvhn)I~OwhdF_hy?-leTidfnOKNKbOZK zzCyJcqEU`S5gnWLBgkVX#iJ1b1_FWC$oZ{5BIi647lmV1E0^8a#2!rm-KiYt%wgwB zpeMTt@T#TIpZ$7~6hXp;XR!vzuN3)I&gT690W3$oL)BVzlvUl0&z|@O8Ma2GBOAL6bIs0t`jy9syxi0*z=jK+bChJiOZgas$AZbO7f~xmu>2r4f$ss{**H zA%gA<=*-de`l^$Mlpdp7Ev&zu_kQ|d?0Jdat6+4K(d~rP1no7lNv%6cd;_l{bR#Ay zv~AMqZOjytU@WwYMqanO}xrlJxC+EI80A@c1?mU#?-JX9XCN=hLB=i^ zz3>ngcbDepnb_E}pK2RwX~kT+$r}d{B{RT(%WpOI*VSv+?8a)mBK1$5I%NymY!=|w zl!nXf9+%sj4}+RV8ubdvDS0$1ogcrxMBWL_>!2N9}z7UY#wU_?wx8EASe0f-Izt~-3rORd1E&?Fr zk3YY{SG7fa5Rp`>`Z!mN%Ww6bH(!kTs$2gn*~mLaDb+SyRPq<~KIW}z+IKhE)8gH1 zU2SZ^xU{Qli;{vansok#lISIih4-G$S$S#_@o>F&i9mEbhnpASlJXz?^RV%m8 z6c7-&z~b`#6D~fbP{o6dvuDnHkcs350KG2g$HWWV^)MaC)AxS!hQ4EoAW0t>`D!Ki zfDZ9x1gCL4EdD&egDcC*$_BLV09G*|?xzYb7YDKL8tKt}r-2{t`1OhRvS544Kge_d&Be`r2Zfh}@q z29{D&a3x-CBqb-CG=;Df-$a_>0R}h;zVrI43jn&qH&wy<#`sYPswLW7q7=#i^v2OW zCjeA-23_e&XdpHLsbAkq7Ik^o96YpPoEMJ5j~!8&eEz(19CMJ=(c^i zL=K@4bDmRkAprAx}MG8AWLpLrr}RV7e@SQ_5HZoXI*^ZUJ_ zt{#8l`a50ZckqgvX*~$a%vRF8sD{`>fnJU$!U62xepi3kuw^*Hz^q<~uX$Gv-#)6;Z@hKBlvhJc(Qa|ryng|@Tu zUC#a#f@v^AOacNG?cBgUr+DMWjaMsQzB~YeLj@C%W0UR=R%?##?p45$nds|_xBuhw zWoH1B3__!ys9ct4fB=$JT`hv$-u_}zI0xtul2TG#;OB7yyy4<-dEbvc7-(&6 zEx> zCV)B^A?#5#G(7BdlsEpMc>B(sLf~DOiQr5Xod&)Lt@*y}z6z(c?sA9at8)FquG=|) zc>MtYuy}0+fdBvqQ@a5Biwp4GE^NdA2LjhVxCQNiG7uaRGWAdsxNF?T@ zg7wT?SbLRmY`f%1UzTPBzg^nq@~HM0f05;A*5cPr)2lzVOR0kAT^+&~fGI z=N)i`6Y$BnX8_Ow5vS2`^9+nH=!-iHya2yaf;m`2xt}9R<<={sca_Wh&6J z7S{r^0dQWYfPN4JL=%W3!XXy0Q0arE;L@o^;hs5j9djjGC=;-7ItpaKOYZVAnkA$ z7&*e-53q(^&R{Ziu9FG5mH+_#!wF3yH#fHpAX}b|b{OGcUIQ%E5EsnU=y>HtiTlehzjOe2i;;6Hpo%c9?Xxw&;`Y}@;8 z+q?d#Wvy#n*Lj`Sc^=1p?8mgOClG^zdJn6l^BwI?hHB43ZDH0;0EZL`(-Dt@b(`~p z+gcBA&HuFUFRiV#X9X9}Jxz8!924Pv^X6il;ON1F2PH&UvEfj5nSVN{=l%Miy%+N0 zJ*FmpZpb5@dIL&Sz8R0@Fi!`gpxN9rsKZf(nheDWX51RdI+ubzfBuYqslFU^GO;~a z!r@)w*WKOSrA0+hBxw0X+k4vqYQY}VSh22p#``htqFK%;8h-pQSQa=Ve>OzZAVo!|CL}5c>Fj95Ko{nHW$ploTFuSP?bS*8g)GNJr{Xm>O2_r)3lWy z3=F`=E#^OX7Bw6r)RRmHw1ol#X*X_+8tJK_XK2ARMr))f>deiDT$k<7N9k^v`|r0& z0WwzHT)k}=fRvs=J5K)&ex5Urgq?}qI5#Z6iGd*u>yw?IUkM#)ENyI5Y-|!y<&?nL z6X2KxqJE-x{XXcIw>de>OmcwACEaRc8iK?`*LY29y#KIu0xAR zaU5wWDPD(jeU;%ACjEEG)@^}mR`)>F;q~&CXlff{H_~n0Fpzg=!v@D6C=Dxs(nl4J zi&w6!!PS(r938Oi3o9yy^f|b>k3l0#rf<3iB83U6`~rA0JZKEKZxA|_7rURvP?Vq>>%-9oji zJJMFsSy@?KTr@YPI;XKlmY>o07F>G9=0JOfa4VRll(%6M+c+^5x6& zR-ztYNGpEnF~YLBy7r=}5E>VllmY=a&z z$e0xF&0nyf3!AH=I!ayO(sv!Aj)1N1G4dM(hsp)8Z{2zbE500WX&D)f)G+C3OQ+I@ zhpouQt?DNhrG`32}sY#sEXDU zF7e|%3^^>=q-up$*`Y1%Sos#M!lZ`3{{utd!9>%h2(+9IL)YU7&9ub8pdh`tx<6E` zHLx$U!|=U4Pi8YUqGILf?e9K^fe_%4u%X5Ed}H!)@I=~GkU)f`82tIu7cYpe7a*9w zV#&v?S+j;8w_1^k!oDvdWCxsx4Ww|sjp0708cbrLQutb3X{&&Z%}eB7wH zPW5$1#ZDZ!Q3~6>F5vb&>(yBcrGVyJw2ZHRtzIltOM-Xu7eZMyX@q-h&6Boa%`Td5h3sMNm-CwVrPMdP9a? z2Au&|my8dXh0KHNlg#?fuLv4`6vsz<+?j=K+-EHq=@872TI}f?qeZ`54d}of`sVr~V{~eQ4BEpX z2!8WWRuI{OxJVzDtp z%=$cj{P?i-=;$az9+!6Jc{@|oJ4`^2x4CD~leab z0L~*R7uI707)asx*0UCx$>wjq@5{-_fk=v3lkoy|MU_xz^EQjDpMuW*ZQGuG^z=kc zvQ|H)-CzL-~KWE95jbChO3MAjT>Ef^q_R_i$K}J zN5`@-`Lqj`kvX{U4Nr_dFjfPf=w2&sZ!uU zQ0h72+o+J^WU?;D=FMV6=p{u#KuXKYb1By0aT(y*xeTBQ#C^4_MT-_~$diAxzwi?Q zz6yq@TApyqZBZl2jxDOVq?=|!7k{RW2C#oeDjhvNJ#O@6_5zmeUEl%RQ?s4xoNuEL zsu~v;*N*5kfb-D)d>;q5U&7t32yN!A!eMcl31yoLe?p0m{8 z{Jk6NiT^7!@GIo3)8O$(!p3yZ4_;pwD$F)rU+B#$fO`d}(OpS^%n4XN>(;EK z?ZC~)$9EqZ8X5|np>_%gD8qi)XZ7{&=e{syTl;U#84WyibaX0xy*oL|I{=45eyCy| zU1Hz86K`*8dsVT5%*|44jafkxwC+k#iL}uFfa0s6r2c4hbabxi3GiV)cpN(K zD=OkNCTc1wPI!up8(fV=!R6v7sms)}pYeHmq5&Wbq+A{mSa!J9-pWJ}8Sp8bTafqR z(Sgeib2kfL?BjoF{3-jY5nABoOf@~1S_>$n3NxCG$MIV&FX*YEPgIq|hNZN^a=9s3 znK!fRsc%2C_BlCq+OX?Vb!y`(sa)F|^h#f7<2D@K7O>#IA}NW{m2L2X$OBl177j0v zI(igH_if4JG^?(s7z!Z{3A=EM<@Ws-peTZbEDkMN!Bhqu)_>}nqy!T)x*_hf9el3a zSX><0*kILOw65Y3y2Ga=w4($%%NP;JVmJ0!eN}K}HT-`OuqkP2^pSFV0;1l^zFkQ} zQw3tP_<7%3o7$J}Tet1lksIF(BqD6@5T%yD=Z;dsO*Y?ZTFjB98UV^hqyo zZvnJFViy+iU=}rHShjev0uWPNYPo!=q{r30v#8^CPGMa{i}g>%v=5uqR$b6qbg^wGx2q%6-`(xIH1Qh+k@I`h zZy2~j0mAbajuLaAQ3^hfE1o#9ZtdD^j*^$kLFb zlgZw#XcFGQ-v^1*XM#S6iZ@cYv5xnrlkq4S%!;dmG;OH3CwibDLeWwYC_|1Ao`5qx z_wF5!>N{a-8qKAV9L(%EdXNyEs6ts8ckUP{Q=jvBD*)~^po5lh8obQ}tbie5P*eYLTN2~7n)43y%rrh6NAWA4|%aspj; zU)li%a2cs%%goG7vvFU1(H+mXHuNcL3z@%B>rzrAI(vH^Bt^6Egcx~GJEJo3)S+Uu zN>qfgoIZ8|41Z;mx}bnrvj(&m_{7M{pTNY2ySlohj~zRyrsj{y_wn+2ie=V?_6t!q zt!L2I)+H9e$I|SWuA40r_=8H3;`4k`r%yk%w6tV@C;yI2IQt%0ny@Nz5C6RYc75lf zmzz>I>22_SQG2qK?Psd;5BqUg$x6pKNL;1DovN_ohjC*{AXY(iF5Sj5 z)5cSfpzBimck}UCeR;QJqma4S20_#GGj2zf-VNLXup~~Ayo~hpq71nk=!A0nHhWUy zB(N#`;4f6#7-%Ph#B8@w?JF^h#tT_;L)A4^9iy@iKi(*}YbD8ixoC^q&v=zR zAA>uapa!P><)=?NBYjQk#IAw;VD# zTO$glx(bW+hKoxCo;NWNJUu;Oh(|PK09py&(N49J!Zv8HXTfsGIfY3cMqAzcGQz-w zlT%Z+Vq|K<%Glp-x8~;NCe`Ns_n7#T4q0nz;v6PyOj5#JjWl^meAsiVtSH=*->%n$dMx{NwCK&c!21_ot!A9r1b%1 zk{P_vmio`&Hvym`z=iq?7(Y-{RAh?a#@gcL<-HAS7X&VWzhB|FPkWXorVkH*h=^89 z=6D3wIs@~KVV{S>v2kBv^s>KqC@d*y|4b!)q=7rfXYW=_SvU4nTUYy2-_Yc*Z5GEk zZ|{xSE!nFm;sAYA^dK@IL8(aSZIKC?C|wLZWYMNeV&JP^0xCZzvVin8uF>CEISq%8!^fmMCikHd~qt& zr0BzkYOE}pRx+G-x7IFelFE^V)#;P*0{x;0eW|X)As~>TB+`mTQI&qYXO_BWe1E&F zyEeA9xnO}lCKC<(B&^hrW*OFFgL-#19Z1!n zmp>{eR|OW;8mNCw5Hs8^h$P?1!9jeE7-=San{91v#3QIu$g5C0m9p0ReBZmLbUS*{ z_XtZ_x_~##?hi06(4x(`)U5x>0_|kufyv_Wn(11e(H_q%P9~?l^pl*$es8Dth^nAR=h`TfkWIpRdIu-J7_l31}`JP42E~OFN#p zXm0+>P_wi2F?T|n=ll1v8zIlLPbnze?XHe0o=3zHMH+r0LM}nS6Z{=2`|v68^#YaF zzt(dD>2O=K6Fse-p=H(4)vH&xThiF1X=49KsA+5kHAm#Rfk7Ckn$1_PTp@0!+}x1* zrppjX6{FZVvjcltXU=pJp6IQHPgDSORu8ac70LdYZg6B03(?y;w5sLV)1CB+~9$KG@*FS!%SDMT#35SH9WST;2zU+ zbO6BGeMiusEcAav&esd43Ql%axhw{bFQ_gYS=ykF)RJuK|0Ck?-tH1Xfs2 zj#_{+?grp1N8j$-N~MSyh}SP+RE^ThDi}i_%>?{W!3P~#1sk#|LV4F-Vc`qULJqNh zzMp^gNz35yFu%K=zW!@(Lheu|m+oEI#^6Uh;RFZ=?+eq+*L-#^xhKC>b^LK>=`O*B z&~zrEjqk4rD0wQM^|R)BkiB)^u(gz8(|EL{b(~Ler|^B-&J)F|Q`*An@Cny$ z#1ZUiRDB1ep1pBDAO}rPfbhj=5Dcx~tvfqAiObw&0DRuycQSY?lgE@ruBy;HJ}#-rJka?80!N9W zpJp7m-}d9@@zTelW(<)aWFBfi1~Soo4<{es>5gb&Fwo!%UVd!N$%RN_As+C_Pm4BDgnYNB80Gs$%|WI6sR`ljzf$ z;q&W8&>o-rhTg3o(`_$U_cu3vPlq1g$G^TEwi3hE34+nP?^oiwD!*r;tUB zKRTh&R#f%0w})U|Mw+!`hW1bB^|s7RC&3AEn!)q-ZLffUfWwc$U_yYp*1hw9dfdye z+UasFujP(tR?zu1Oibt1eCygmzZAWH&wt)`TgwS@4KZ74oXOj}XUuoaE~D-@O*v9I zkA7Cgdm8WB-YB()bsQp9Nj@Y|>p@B3Q@e{P;mw++ulL5j!pC9~ zpg=iq&W@6R7X(F|vL$1tT@+=hMm>Q|szn@%8 z=@Ql1e*dSVFZSHC1Ocj5F^AVB6vbzX>=Fd+eTmo2R1<@ zvA`foiQezJ(zg<%WSPyw9aqlk>2+Z3e{gQk}U?1o9?#qGu<1htf-g_2pda$}Gz`)$;6H$boD zP(8ePj*iW2K-*9l-tfh4mpU1vRRtnH4B2gfA;Lzuh^*R?WbgA-oBxN~Y}PIjcJNg+C*Wq4!s^Y<(nll6D{#oaSwgf8|4 zlEC9N3A*h?KDY1Oi5fif91Fw_E(n@d<|~u2aFgy(<#=$qDh-iy4ro^4V)0DV0E3Mt zOcH>?f;{Y?aF7K)mukup2HuTs<^1lFl9I&;Yo#hxCuu4!xP9#p>`9qynJ|(&cVKsF z;}(M-c8y=$fxEA42uO9mrn1${~ws9l<7{ z3x8Rnf5OTt9zKvyWh1tiE*SvG-(XpCG)s0num4enyWhW?!ze@in6*Ej-fi8K4O9LP zAF3MW--?WkgdZ$~h-(%np)b&YiV)AYH8SC@!4y?{Figg2d`fy=+N! zoJvK@rYi=ZU2i-{Xz2BEba!@f@#p%=gJ3ZjBI5AUa9IYi9($yO8`9msefvA}fwh0A znBmJ$pkoZsCM|TCJMDHD)v%TJ1b*5cUKXT6^kp#IGoM5YczKR^ylL7`rAQl}ng+Y- zN14}TWqzo*^adM@^RKyD;$9ysDSF1 z8L>kqz!J_=uf(joE04qciOdxWSB(oLGlwVdYm@;%I6m6yIReE*H_-^;V1!Vm+((Va zX%SeRMSQdf_I7op8b7qxu{M!C!J7jr`99e?-|T+&HoQRS`g`-Ij`+;p!C{$0lE7=A z@r?)K>i%-RH0!rA3c`c_Gb? z)jCL+28<1#pdb@9F2oHWLQMfon>9%6980M0P+@-;SJwc?PPE?8&loJ)wGW=&d(q{l zNhE%>2FBP38qRHa;0Dq{OpLOUI0z^{!2G$A9tXR&p+4eR7H+6_Ik8*eS} ze|<`o3fVYj>9-Po<7!#(I-K6(E}{s*LLlCWpncZ2t+haM66#RV@Nkyn6t)ucPCV%+ zcGs?5i-%y612dOkT=QW2jT<)%LD5#74y=5sdIH{$a#++dA(@ygS-2{!4H^lAzwPPC zUG@Av9A$>+S7`L{`I423$ne;%5@5pf0FnV}T`o}QIE>!o^70fCp>02KgZQbZ@N|=W@QawPPFZw|+;+sB(5aRe zE|}dyEGLOMBb?&G6-;594%ivwdu){GYd{#sS2)`Qd)SK((XBh~%_7H-zK0cjc=Hi4 zb0mV}vE#TDF6s3g&dhE?H6Q{u60v0lZ3XuP&n!SNzswVFcX;(j#(QD{xPBl^_WzS6 z@9wXQAkU*=_SBV5sUC{mD+28_sAJ|LU1&i z5g$K&`t+>^;GRl2BjE_&#lyR+SblW)cs1TC73yu^};U5t;B1?bxu4CPR zC0vvX@<4u9C7P&XS$AO`8Nsswo1EC0UkJ$?f#pS_8C~>j`kSNRpoTq#(@}$YvO2w= z|E~MK)i#96ZCJ2yAv-IpB)J^Guv;Y;uq?dTQQ|En$n5*J_@Ez=B1KS_Us*%-9Js*z2bEe0)N{7?Mpx zAV^^4cXh(UkT`kV5SIGOcT&t*K0tVXyC4y~jQE8IuCA^yEtC+)g!s;a!f*rQ5Xd!g zSZOr~c1pO=DG%PGX$_J?st{}$17!s{D+NGtgJowM0v2Ii5icBx9!CUI5uA-8A|gfz ztOJ=Gfmu;biM0gDMyPbKBbm0nS&wuo;7UZ$;!)5aM$PFdi~>eVp;P8l&;MYdRS?A`m& zV~*3-QQ{OsT>bhyL_mf^hObj2nK;As#xd&{8e-45_GM0(y4FAR^CPZ<_3&Hp?mOk_B8suShg6{Z_VHn2d~>=?S$Y z(;(1fiUwmZ9@$AlfJ9iewz>ew84iCf4|S6jIt{wU4m7Kq^#_>j{FZG6d>fNUSTu4F zbLOq4Fio!53TH&(88!zvqY-n^DU9d6^Y0)Y@Kj~kMz*E%DW3!rXNDra=<64FnT70T zU!NwR9UIVHP*URa0SePdo*KF}($Uu!jZmgAAYT&H4ofZ!F&evsh1Kio>d=+fEBEw0 z0DgpR1Fy5dR01x!U&0+GFAr+m16eI6o^O;|R`F7GHx|#gj#5A^Wjnjnz`($^-rguY zFxtx(mjsm9#5F_5o(zcnf=>~ki9Q#N`-wz{1W!p$zF*Y0CHHf8cLW%*2!xXp*@EzJ zYgm+sRFJ?!jN5&$EArne5KM`|SgJ|YTtjtZ+(&`bke@{Qeu#TqPrS3N$`o{UW z4r_B1dr5Hc1Je}IQ-di!(P7Pl(hPrH)7jOv^VqRtrdB&Gu({&mhBlhP<#!x3v=X9= z5dZJGfogKMgWl68=_C*_&p;DCFlxFoUh$Z8XbuB($=$~dAqBfK6K2(C^9=}%c>%kU zXh~N2KsJj5pdE>~W}nTsOBY^L6A`*$k1RG|^kD0A{N5jZTmc!LV+#vwv>??k6tVL# zCzIY;lWvvJ$;62i&S}q!_+WI`zSbX1o&05O48cOPEVh&OrAxK^=E+%h!!xR8SvC?o z7eyC8GJA0b$Rb6@b{9FGyqx$xefe^l@#0^)DfZ*h0zqTfx^pusAeQO4G{TUvC4&L4 zNQ%VHA@TmsOV-}bNPb5{3`0EKb(=QzDX0S+AtoXi#?+mS!ilw=Nk&!Dz`GxD?^Q4+ z1Mu9us*I{4V=^NUfgUSv63Nlpx)4+aF)_6rMtr7`so@(YN8AR8fJZontSg;w@)IBr zpk-x*Qi8UW)+mJo^%-!P5@43B2-QtMy$^*jHAgQ0;poR&{`A3WZ|L^Tr#KmH7j22Y zaPD=2@D|OqwI8kfWD^IA4d3i^Ycf4&xGVTJ@*^_aI{_)#_w0EvTMYGn(d7=rA4DTc zuZ&l@5dnJwP`!vJWo4~Es10fINgP{nUBx4UrnfHc#nH}@Z*?btXHP(OS7BYK)15XK zhi4jm9a11dD=U@s&YmrRFx<3h6G%r72wibs1;)k2A>cm} z=3NA?Wz>)u1@$~uypp0fyipwS9VYn-pYj1 zS@$3+q=E~6h=NDQ9xL(N7-yaqtb)AS6*PxpUXT!(GQPPZ-ow#h>Ot$1jT$5GYsVu# zcPWKF?tk}psbDcf1P`7>x)}jE2p?0V=hmvktpRdJf#E?AN8#yMh)p?UF9IogBMbr1 zrs(+rU|+$;o`cwF^?oTW5PgrL>zzS0!5JXM=b>MLxm0v%@AMhn8=Eqb!tLWuN7CkDuUUh zT-bF&wSLU-fv$b$3)SvwR+*6v$-b%^n6z}h)K_UZthz9ssLXdrIJx^_?1*ws#Vui) z*>U{yUxoQ2*BkkFRx3~Z)Hm)M>eNf9J4=lj3j6lq`C0mKSye6`UF-O30#`&YH$W9w z4fph@4gHL3B+=`?y_`nLNDRMC*i&No%>*azDqZcOtxY{f)^oA(rt%kqNVqEEg zjibLFLkq?(|G4OjJXJLRdMa9PH#hHTW2YGXsPM?@d!{5t+Wh9>WwL=%gHX+R$*~yD@E561=u}@0FTtlGu8ubfN)mjf|JelK&)@qkTM=tCc+JjEKQ-oj zw9TS(=;7PTgApMOgIG0uHygelsMAAf zb4hg2?=J=GOLlt=3kuZihL{toK5dFT|AEY@&Q<*L`^$+v+-9SoT%h(z?)T9B&rh-Gwszn>VNgz3-i zAFK?pupX)GNoZG9f6dcMi!3uwG@i&gSny{oz+b!hU(XQ{ZWE+2+#xwqdD+?bY>Dq# z>Y9K0pPn(}g$qd$rE8o0f2syE9?SSbx25r2SZ_y4!dD*TNcmy`;{E@-FZ| zO0@QLKFxe)zr58!a;%`HG(@)HQ<-R&scE(1&VRcjoo?qCC4}YVY`WdFChUV}noPC* zKAdNf#EQ=1^8o#{cIilth<+ZR+`@QHIvuor2$=j|}1F|1uW!H_r8 zW6L}?o?`w>541n-o1HhSUf#}H-XvpxR-(~DwX?AwVcOrnALpigaY0&7w9ZdUb&W%o z=2w?Ubyue)y2uUs1|+q2@Cur_;r+>^=7f~EzozhC-zbX@Re!MC9sTGLL(h)11CMWj znG6#TWQxkxj|Lgx5PeE#7%IIrs)W!$zG1 z>05nlxvNZz`h?Up8aV}o;?{`gt19q(P%+uD+DiKPZN-Dmw=CC(t1;Yu)9&@0dyc=X zQ=1iQQ)iRtD~*7PUgy9IsR2LjMP`CJr-FVu^h`unsyB5F9gy)ZNJ0_J(12^dNH)gP zb+I>9sl|=NJiVyruN=}q!x9CE9s#-w)!qzKncD3>vcnAkC_>3jN~>ak5@l3=$G9( zV0e<^w`Nnyzn+XjkqzH2bvpN6NbTs9ghjJYQ28Fo^7#~gf62c=8TAJhXgT;rv(x6? z$joKO!0E^P?#oid=Gngg8;X;|c%t-6cfOP4>T~Zg>%X-?Qld@$>|C)uA%^dkr5*Wl z&t!(q^ZZ28CEc2%&$}u$(l$H(b1?eX9@*xOzD=UbpBWo5Z?tcc;Z0}V8db2s={#Hi zhC6cF8*fVXb9n|ZUsT!2m45#C{rU~+bMD1Kiu~*AJ*|}2yNFg9i`JiX`6<5d??~H; zu~E*x?G3O|_Cc@K{dO1knzqD8ey)j;dGoIJ6r+Q1(Li>o%a^NX?#ud_Td}f#CZkJ%DK=GLda!#3ud$6=(89mZi+7*yzW1-9qo1)>Uv3}Iq@C7L z#V}biee<>k<dOV7H3ja78 zrP83>OVR$bdd2{K&4~ErlWU~pSt#kYOhR|7_2f8>?5uv6aOWQu4NTwB`h@wxv;NI$ z{Qo?`C!O>u_tTRl9Sa7U-S%xQyzz7iMd+x&0lq~xD{Az9fq+aePw!;zbWGlDIzDji z)F87Lbq`D*5LhSc?h$IO`imYgQwq;m^>}9d%V^A%nzb3O^jixH=Tlf(dH=a(vIFXi zM7i?l&3f*5YFBJ9+!u;yYnD#~Kyd%^$_~)tdhB+hxsLJ5OxzBOqDATp=2Bv=P&=ys z%VAD04NOY%^SOKOaJR&6p8ncaee>vzxs)e5|6I6E%e%Wc-)T?Dnb~(6UwBsOAUydksWIuM=uDLvYr3Wv)whk@!)1$vncEI^b46YRl;u4 zEEEIjO;`S9TzJcWqq=%KS6V1*^wfthr+%=G9euWymg4X7>qY&GUbjnWI8;m~54$Le zKfgB$gGnyCmFhkC>x@pJ-ld&ilGoaO>9|avpH^MsVK2kxPuX0tzvHiCsBa9U(F;%H zvD=Wy9@fmsrUe#n)70^>usB{uKbzKUX0t@6GK ztCAKbLtF4Qu+Kvl0fs7 z!bU02tQqdkBM^Lt`=2Nj2grnIXjcF0smc4Zb!i_SGH;9Y>@C}NwJhPc|p(Mw*JO@3MQ6tUgK^j<;5mF0jV{(Tx3nalOdz$xP5>b%UmRBYbe_Stwsg=_Wd;}9C> z(l2Yh4`^Ww$eKR1{J=>xe|yxPlKjc5dDOeLvsU$&+i)^ex$s8ZOXhS{cZ$U~!A>Gz zw{CrU@t}I!&@DnI{^OO@mu}fyB5D{F$#rG{@3M35zE{88@4VG`n}Ej`WOFZa7(xTdS3?V{C61a z9JfEZ9LltMb@57WiPFi$qh5L1>c3z4y3fx$xuW(_qSIs1gUMq9{am?{)!ZJ6mouN# zl-B)ocY{64OKlatuH3$6_39b>lY9F{Kj`GdX!~Bf6&uSxp6J^;{dh(0l<3CWnZ4}{ z8)SO9ei>QW@c6|Q`P_-$f`&)&@15zO9GVQ*Ls6`k+S}(1B$W2McRD(J`WbpSb~1`H zcDg=<_pH8e>+z>rh{~RnFuW z@lGjAU%_;==XEF@miagPXr`4dd-rz@xb`!71eN;q{(5vae?+*>=~rgST*klL1H~ZF ze<{lm$%@pMzb>|53(Mc0MZuo`=41RndX4?}2Dgx%?t-=IiDkdvF-`nr!H?9J;WvKY zH4D2R)i8Fx><=6s-PGl; zX^%b^?X1viw{lL}hWT&Kj( z^ar)}6>hQTg0Vd=(6@iNCexW~!CI2=n>AGNvg6t<4X#_Q$NJorBRlh!UEj8Pb$Qw= z&ZRfRf3p&Hi#;)AW#1laVEBKR1iLgacCU8YYVX#qD}Aw<+0#u4lT9wwFlaaY%lm90jB+K-M%Kqw&UKs*s%w1 zj-J@?tM=uOnYZX8_K<|!g0&6}#RFw4SG&Ii{RaV-_92KlPQUX^&z-bZvAqyr4;0sQYBsNX5#4Jz zI%3T3Co~!6any3Pq28BPDXuTyeK!6kf((ox!(Idla5vkiom@VAM_l~f(;X(|D({aK zj$BAcPl=1%F+F)ZTFP@~Y@KF#UDN5`c%H3Kqx?MANhaps-q!Hqr3UbmLeCOJB66p8 zCcS$QlfjU7Q3W3w8*+Wn7UlL(KTtyg#{cn>jq_i|;-#_1>_GT#m8N}yk6HvE_J-)= zB{J_G{ihWP+H)aWWsmsSp*3y~Xm@}P`NxYVr%n7HAK;I>Cckg=|7qa#`vUl1L3Poa zf1M$xJeggF>935h?4P*uQ$qY5=K9&igT~uao`0@U`F)A$O#JZ3OPZF{-tX97kUSRK zZ{RjF*|np*xx9Ai%|OmyXUO1XfAgMG%D~VAqZ!){vKtLR=tP;E7@?o0%#K&2* z4UW@_crO{^RsSnV9o#k2%a$+N6l?aeb;c?`^J~L#)2|1JCTl))!SeA{H1kiJ)LTVmtB*)hd5{K$WxzG&OO z17cM0M3rMxARr>IGzxYNXiv3fer-9P`0GU|6=8YTZhiiDV9SWzk71)+&+C8k3IwDU z-uh*zl+6wQvrqef7{mXM4vsPG)W0<^VR)C__UZi(2(7ZJg7J!tYUlI(nQyN@eC;+g zA?v~RLhSv>V#Z&l(}`okv%lxgUdwQRNgj#$z|XHm z{^FT8tI|K+-H$YdL*!-(Zlcnh1o^VEL@;YiZVTRJFMm$8Hk}Szw%wB?=c8=iCLQ9n z3U9&!;y&z?`SWDBB8ucKqh1jaL92-%6g%?Vkeyi9-5p2`Uq?QYMJui|HQDC-N8OqR zK5^URM_>IMrWD#SbAH(u*ACu&`(}@4@vYD#D&p=s#~SblVh6?=tnsH`ZDz)^fs(9V z&nshN-;>99U(mO5N2@XQZoCua^j$QkOkB%xOpgp)L6DP^^N_(@L>R6i*R6=q;991; zbX0RC{utrsh$#tL&7Es|B$z{Z`gSG znVIC7EaxXsvp+KTF$!w8&>s`w$ODa#A`b|sgzGN6H{4dNU*Bo z#L(c6&)3!B&Z>s%{=6GGGGEQ~FUcFaq*AuMiVrYfXRO%yhd5F~FRsK#Z z@8PGP&Q)~WEmodcUydBU1(^QqEhus%>5Q)^F}n$91ewb2_q9RGL)-C6%k%szV^a?0 zNg3x~==zg{DC!c*EjViZ#sFpFb^M*oZh@rMNnN*e!4_F>1R_!|dH7>Xi)i1-&KH5; z{qQK}kW;qsYWNC>o#D{V)R;X>S=rrH{z~CWvky^v?DMcKDln3vh-osR+WR5Ab6Ot^ zoLgQV&t>eCN9q?+pOD+tt8=#SBd%J130aheRn5&@&W5j%B~D!*^pYE`?~?;{78cy1 zyf#MQIXPD_*CWSqL;UW;2YGTFPt?AB`B1DHgpzz`D$QYH9r8lnWgcg!uFtSp*zo5GUb&<^eesIjb>O4Zg zuVIXzXc~}%nOw8hhtW%}si}#KN2e%#_@m4rzauCHNBx;V15$0OUcPuC$%C(X=CS!X zu?!)am^!EaW3LVl`RzU@Uv>V{rBmbp{&$}~1+NM%FJyg8y}r>8>_p`fukF+UlQ9Gr zHrjRuQSV(JQNwhH)^1>6pxz}KNjU(RLB$Le}`ly4rfC|VSkLM!_(BkhnEiTIbXY(Oo!hS zT3N9?hfnjEsaF)RMeb>YKDG~??Apr+J`(G-za$R z{vdRiD!UG22Hn+@&2_8JKQ()Vh3ZszzV_9@#d3XXACEedyY-`E4K%;DDzx@;%S1D7 zIJJk1+^~5WB4{)PgggAs%qJY@Zs%)D3=W}myC+$m*;^*Q&}U&WAQp#_T(Zpk%$YOF zaR|&+<2mu|F!MNdCWX$DQt4GMLqa5|&y$RX<@>mHfeEUqvEgS-_Yw3JQHSWT1r=uz zWU4F>@b$1LzEE&G_sBNXsJgChr{B&*gsn!@iMNQ5iXCfJ5jswNObfwA%6&o!1zIdf ziYqqprf`2!l9ER*G%YR7=tn@yhfTSb9s)Iv~>M$93jOF*1tDG^FwD=^H^XxAP%!ar-VA zZR)Cj<*WKeN`%RJr=mFkbxq}kf;%g&sH`yp7{4DZC0z6zN-iXKg0S*NZm}ZXYZz0FIG@?+4a@;l#p+h`! zMhJ^jj=Ohn^&5PpK#$VW;#Keaw}h4=Ks!<&)m>*rMZr0dq4ng~**$?{na!iM)}{MEwele|>g? zjM-Uatnk>vc_7MW zy}na*b@vsw8m-GwIyj$@0ops9bj}t+d@wy(Xx2yp>9B|?-9IGzL^ci~oGK-Gd3n^? zbOuq5|md&sHObbdWB$^vw<;^O~lK8(-lE+kzU@-n8YVjOo6 zt-&&kZLd_)JoM=2;?P0|grjcyIgWgR)dV~UL@Kc>?+$UP=%>mCQl5#d7M(+aO;#1j zHDds`iyA`}b4b?o?ZmiY5r8y5QT&&LVhWm+UDT_K$Nj+wK-dz-~;6`>b7s-*# zd-(NSE~x^=BWG%E&eQxOG3ibK$@Sz#W0uc2z`TGoLl8m<^t_TsC{G11jZnq={+swp zh~e^&Z?}-La3^4DG+)%?jK|(1wCIu(93d(-xG9((H20ziwf$z z39WT7{)$!{I~Y!*^q+EEzeE3Jax=j!q+dv+e$ftn7c=|T4a#wrDI5%Bm}770GZh3* zpr8fr(3@qk0UzlrP<7tQN{MI2GedZ#dqnDl==8%K55HYrth?c@M?vP!FNYS)3BPF_ zqh`zAr>NfJf=)S6((8IMoyNm**UizRU#BpicC|vC@7cv?TapUDWr?02^I^RurtkG$ zwmIese`oWB&PSyg7rd75Z6Sh)B1Ect8kGHLXqkSXQx=B8Ax=bA0G(K*Xyn_Y@xaBk z(s%uYEKXlfM0=ELI@B-oFQMX*$5<*7pQ+D>B6jy__WZIBq?rUwz1F4A3&@>AG*;Da z^{A~qb?xf*F727|lh^me)W{GyLUGbZt$DMuA1FTOuXD}0@T^f8Do*Ynvln?w{pC?F z#57h1_d+XgCzC~?T%%pU;$#yVyWrq4k+JQ|4pKiv1Vq;4>w^u*npv_?^3M9*p$8kF z*r*Z{*C3#XF&oPgX+lKSwgiz_BkKyDxmMO10(30T?7w1RrCPB!OJm6E2u*{+B4+QE6q2Qe;F zIez@$>^yk`a6DLOa%HSodojym#KcA%Y(PB+DeAXn9<~`;P3SU1Q!nYxaF8ri3S~a; z_0rCv)$_`xkstOI*@7aWQAm(MbsL(`0?>Pc&7eZ2?Y zADu5YQHgxMg(e8xRg#xq@y7*`IXk-01gSk+82F0}_>GXlkRMMoFTb$;u6%+n}+z~+o;fZf? z?L%XWsiUsHhZGflHFNW_;DgTBSp`TmEwkq@lEs~%-dz~#0d&`$dwd{t>e1!Ca^wasA$o^WKPRan3cWyL4gwiA zELkMFi1)DEDJJ^8ARESGIM;1n}T1L~er*mDuS#PQ{&UoE$AR=-gEIKc;p4~HWMU3p~ zBNF0_w1&KFdp?Bu33-3yL)^C5{yB3gYIojr4vpQMW6(mLU?S?9MW9HCGZE&L-tQOR zlHx$9(!H69>7z7-#nkO`dSx6jQ?*S$LN z*SPoZI{d+{TJERK4h4!>ENt(}@g%LX!?rj}7EFs(V|;`7W|U`Rk{@xN&!*s0zzwa>U{jrb%h# zU)G>N-LvHRhpHoTbH~4?EWKuMc;1ItgO0~h^XF`SPD{UUxbW$kC~bv?m)DS+an!4{ z=Y++R6MGkRZ_-KLZZoa9&t7EZsZ9G6JbWc$lgn*`7{5+?OP^whdd^42vVdznj|$<8%&_t z+99f7Sf$_H-Ob3!HIOwkkwxp9E#>CnQB6|q7WO7JS}vn*Rf#M7f^WC@51R2%UC=Dk! zJ5H8#tr!##X$f{f(-1~MQ>HmjRHM;0X`u;e+kk|GSqZgS$`0CTg9$T_4&}3R7?$K7 zH62TY!CUSNnw@>!(@54K)m}Eln>8fLExdl!3F5DI!b&Q(+3}_92eoR%hfQAGUK35T ztjE7GQ&%_0qpeNqT>G=*>yxe&yPnUA86)Q5oBSU|vi6l6mrHPqT<&}q z$uChTzBT(D!1bEHK8)q3*p+TF|WY3=&3~L?2Rh z7xv=TcLc7gskQcb4l};Evvs8jwmoHYCGe>XaudzUrb(JCGSH~QR!@o$U-pQdbumRO zyKQ5{$^wz;?~&QgrK}l(Nn&;CjC5WF&0juVzOd|F*1CC5cI?_ELscb??LH@sAf;xf zWXpS_ggy0{#x-1z*ym=Uv`;sZl+4PSQM2n0W%Rzws@r|{2ZORqgYvDa9CUM+qNxOv zK|I8IAMHbokK(lI0rDM?z9C>R1Kbdb8VjpdVc%U2sP^d!$}e6#m$FL1G>Loj#Ar^; z+_jP`>Jn@XD~@e$Os|aI=6dPSmQ_Z`TMwqH-w9-eC7|Zd?BuO#9UAlJ;EE+B#ooPJ zwPx-Ymkp){@l&Azrdz4iFAQGTAz?EZrk4fkdNF)qN0KK&;(BjPa5pV|whR|87s(9y-oSb?OtDos5pLV!HY zwRj5HlWTDUHMro0_!%UoLhsC{bs?#{K(zv?CfQDNP_c}83t4JnchkB;1N=D{9tH); zi9xq(hDF&JSM?~*pF>%!eq<}<`vug~^lm`u45d@2j?Rw7S!DFnJfa55O;8@=BQ(~M zC7hw8ZUUAyV?5fB_=xVK?gbki>_1XMi81~Ph%)J;M>hxaRHJ>%k!8oEKazTsNZwsV z&5WD>qMU3Z?= z7a#W){nV}jE3*0JfVzm&T1(QU3V0PmBUl%MSw~B|ir7Gu_$Q=u5@ue`bOtp~e0+Q) z6buA_W6wV8MUR&nkRY?T;_Z6~R^*JkFYHC4IuZxH7l&;uEGQ^LI+%Z>2FF9sr$!>2@w0}@MrMY-`Lyj4R4(7zIZkV>u~vFW z@-$|Su}K8=X;AV<9zw#q?)@-%V3eqKps;;NsSapFCyf_9Xe4s)jm~C{cqC~up+FMm z3*GRZpvl-_0BPabHFR@m%>K@FAFC9}io`FZj`k{`rU6p6H`#sNf{f~zH$Nmd*@~l; z$xYBBA;^zi%|Naezb2+8l2m+)$@rn>Jpt}Cy0B#g>+-FtZMe*b`fOTz9{-RntyQO>5%|yDp87R$&Nsip!Gw*%hd+-1K-+fR9Z2O(xiKotazE450 z4Bk(GD6wD$xu~EO4z8zw+k->&^?{-%55m5D$6YS{3K$QN|An!44gk!*XJB4(wlNM` z-M;EqR$fkp5CCX*FlfLm|L|w_-Ua3Ark6fM;Q$nXK=N_4A4eWIS&C8zBjLOt17162 zFYx2fYe|>(j&UGNW;V8sS3$~~^YF9)tQI>UL)yL9* z1t1X;YU2;M%MODzU=U}@#|%;}>gu{3Y8sab@T_&L=+5D-{<%VlZ+R-Y>7o@Sc3 z?>?Azc0iqe{4;ePE&+>v9B|pG5Qm^dqXzsGfx3PpG7BsOB!IJks$!AAtesdBf0g1E zo0WDmClq9J4&pkIRuZ|f!4EFp2;3rx`gu^06Qmw1T$HXKhCVBL^XM8%n!Cy9CHj=y z2BC@^m*BDPh!3}4kh^?W`{rH>gl4f_UetPRjp4^-yvrOnRq(8?_NA17_(Yu= zgX)iwSzuWh;Cg|Wh)DV^?!AMzL1y_lAVr4Nn_@BNl@?uum=w}2O|(gA-LI0#pT0Ee zCF2s%IMf8UoSOgGCq4HivrFG^6fnD-jzN!(hj0?&vKak6fH5ZIraS<%28k<2x!nY! zJ%H>y1~RX8fJpswt=AU;D2)xwCje_bt!ZNfP#R7E!P9zvQECe?{>A_%Vs`1!q|plp zEB(jfmqLQlS|?KrgkbvwctsFhusA^-h<)IFU^gLLO-C8Pg5m-c6(D3}Oki=parg97 z2-tD16UH80ww0;RoC835uQedw{1IkH)rmL5OwZ+$Db)S(-lfZftfLDNiHWR$2nURB z8jpF9vu!<^rvb44l%noMfN;W^HX!eh`&ioik`gr>0=Y=H5PU&Eg$bJKfjfe;>7ahj zM%9dC)KF)K*mVe?S&ai?6IeZ<5)-&vkPMpi?av1&6dBj+>K0aZU5p3xN5Er92N~Tr zZarEGWGfj2au)|1SlspoDwYkHH8_L>98(9z_WE7i+c6G+093aS$Ofpl`~c03OP}x9 z+5@8uQdILnZLG^c_y0C6IA?!6loogmI=CHoPsx*}X*I5|WcZ$N^t241la$_B}Gdq{VS@#J^&2^;Ym7JjnwDm9*Rd z+NIXEHfpp@HlSNZgHZ-SjO%|~*y&C{3jpnN+p3%psKwQ>t$<=7z{|SWqR5?~0_ut; zMS~P~P&4w^$CD>VKm7nH;^)x72q<204~HVzef#7xE@DQzsiUJ~1B#!5LD(Fc4`NbJ zEdo+J^%)lYkGow!p!^7IjzRyx$Q9_g{bQy4^@xwx@veITkupdKXcRc)qvw+cIAR}Q zAJwbXpth>#=hC-8{mwxkSU_Na>jzFq+>N}C{{@sT$RiLxk_6m=gAIM)4(b9~a-HPm zFWkU@oL^8aF`Ws0j0^TD;@Gz(_1hvh3&6YaBySa#l#GMmQXbe9INOAPahqy>cne|(f)GCi}|MA6vCLwV=V%@W7s4Q8k?MRC?|@))~M zS+cUS4yR$yUIFuBAu9~1*84y+tbRn}N>PI9Kow5&;(&?22CfRS!IwV(!zjP7a0Iv% zqnYvqfH^{V9glYH*rzEITEh*(JtQO~Hb8F{?@p_W9Yp7-rLdMKgt^>>00uaiP!+&@ zHHI87t8Sy$GQ%GD5^#ceJ_wA{Kf!g(^}9gp;ZnsXOrhsDw%}km0JGHZ=iS#}UJE3t zn!xlxKaYdu^Ln^LA0UYVea=PG7t}B-02KhOLC7gG3&ctFJNcQP3%s z0jDLV>)Z-&-nwOU<_01#MPNEf0T%TyI`F!R$WYw}$(Ql2-zieS8??n`#e*Q1Vx;TQ z@0X1@=?KTK*xh{t%B-ENO#lmW75CwI*Krm5Dv#`*fL(;d$1gu*WMo{wzxBf=Hzfy{ z1h|z}2mEoU`+N{6R=kFVf*m0MAH9CzPs_|3Ip^&EYYPmr2ieD(L6JWYL{$qGuX9EDT5ugSNKw(8@dU`*}cTCAp%rRI}U_%9t zt3^(P{3rBnKfVg&QjL;;vVBm?`0c*zx z@;*H(JUktYk}W91DnFy7q*MVQXuy4`X@2!5mUI`1(^DyK;|92@7l6Nd0}L4Lb%P9M zaB51ZDY`;IH7OyhZ9tc=&Ud<(Av>#b6NQ10#QO&dTm?>-^<&|LJ{*V+C@L5jS&Vi4 z$hx+JLvcZ2p^mX}aX|qqD1VSwRHOn}G2MXu2V`y~09QT5O^ZQRTxkKb*6ToxxPi)r z;5-AUn4$~#@qi_atEy8|BLtRhxAl?>VY)EbdSguLW6B-L2U~fj;2&1;z!XS#0A}== zJqO_!9F3e6Xckb*0LQGiwM7o0`P9#GLpC^_tdu{{3oNct&|d(4 zGeZXx1%c}nfcx@^eIFhP*a|p<@yEv-xRQj7ieNdrxw#eO=WD2{hJZN{+LQ~F3h<_I z7?pKg-BwUj0jMM}IY_{7bbubm@f85BoQ;uD7Syo-Uehxlp9WCr6o7fyg4&+ygV#R% z2taY~i1=UH))7YbdZF?)g>8K#d}#uB*LEecZ1)YiI4~!muRD<>YcRWk1-Vl zc$bv`mL3dM3z&{PP%SJd zFAwk@!?I+?GR%KID!r|8JmUqPH@?WlBhXMw?9|TSkQ}B ziX`L>sq?W){2Z*b)cr>cg3-~iDmTDI$N`TJ=e8<|w10V*H>ekLeP&}qG-_^%|L;^xjsLp(|U$JaI`t^7pX0_cD!`ty+L zvKPS3JODOFPL)4;4-z@rY%3q^9RQt^JEA5U^5UN_#C@~wxV@G2dTXmwMHJruE9jXTyX(UYCz?W6#uvP;GVvF{mcDSTj!UiY=UwO38yf%xG=Se@J8b> zoJ@i$d%>l%4%K87#%bJRJYhleixx6?TuahRwdI373jiJHV|^&$BmDiT>^F7wK=@vU z+eo7^h0(1y^$jACMz9a`_{%>Qv>UyEWg({o{Is`0^%f3}fte@+(P%`e@p7xZ`(S_K!wKl5K}G3{sd? zQ@W$QzyquAwoS_D@=?PYzK4WH$B9&Wyeck3Pga^|8n;cQMj@RZEBUtTk9xe0t~&_U zML|l7P1p-+2EU%y+Z`-cS5EJRNb`deS<(s?MN-t>3H+~JE3SqpJ*(ax;`w;g@Zl%e z%KN*X>im721>(@tb@@tEaT9s$6GY$4X)r^@EfV7j1rgdAy%4LA)VsMDzlBkLHW3EW z2+{iwd{3MMkQ-`{_Zt*Mkz=J=qlyRlC2wpH-8>v=dMvP{(kqu>6S=eY^-c57v)zJh z6Duc=Wn!jhSu1N9$EY1P-V_*QK58wT|1JdXdCUrxG<*M4am(~u?lD;{^ZeJmwJ6h3 z$5QgKhvi#0-z-s=OjNw@49s*q zH9@K$PiM_V^>dxzMfSS$Qke^5_0UH2axD)Hjc*kyNkKVmiJu*k!D!0Stv zk}M;+>o$yt?~VO};wprvfc5!_yY#1V-{%MmjhLukMF;DH?s51I9yU{KI^AoQ!vXHKYc$+7+atY6@PL}jO{96E)VtzWIgjs|(x?0U;_alDZ|+e~V^p)7j`9o{ zg;NDY!_sb6Mk}-Gy&=m~OS+${@rsG1Tv@v?#cyI`gdX1KP&wfZg7b>mj}T6soW{*k1=yy|@^@Vx&>(*Zb z8d?rccB6QTee30#NQ=5OYvwZvR-!j9#T2gQDWr%oYS8y9+zfcCcOCLydX2+7MIOY< zHx_G`%k(M`X4n?dS+6awwm>!3Ay2(W$bIK7C8bd7xCsW->qZlZ5Erew!z+6X8_OHp zg9XB3?`o#C{^GN5dTcAYHf^)4DVRci)tbk$DRpwZrIit2nN)11Xl|Vh-{V`=PTm@t zJq?PUf~kx^k_xoGFm+nkLW9;?JWXP z?doRBy4PL>Y82#Lex<&|iPu*>E34XzufSIA7U{f`8k#0J8nIzKzV$hByxZGZ(G{Ih zNYtLKo8;f_y0V@` zI$<-iAd&+0{m>8RleTg>Wu_a{ZNgS*I$<(v`p7!c@}y^sy$%VkP`*~HEop3wA|#}b z*OMNNkalm}eVuv}UF{o@=Ql5Mu%Cv%5!zA5%DvvY&63+vD2rtsOg!e7in7V?EADU- z%IHC<4Na|PcUxOvTDy1&|8A&g$=^N^FE%j9fU8OnkG3&ljKF*2wmC+F!d42(evrgY zv~3)$w+P<)QB@hBx5 zA+c&q@(SA0c2xIfJC_lLga3>9hGrU|IAsZ5yuDo%F?ZQ<4j@RJ#DS~5cNW?{=>B)DuOS@&aqXR;d-z~+fTAmOh3v$B!n4x z9lST=IMaJSTQUg8{#np4IQzuxY2b&G`vg8)qxCMgC=t4vOQRAfv5ei8ug)+INYzuY z%Y8ZdHVD7|&0|_+?w6O?VZC(saX*QGx#5}pr#UEx=>v6ZvIPCcEFpU`sV~EmVCQV3 z)_ZSx?=$MjPxm7})YpqTx-}nH*jQg%_tOv*zJ@>AY(MO>)A9O+`l6#lF^yIb8Yr9* z&_f=;iNCbgLe4c(+##lJDn2M;Tbd^DZEN*f92TKBZy zBq0-7vdgBSV)qw82@~)q@|#j03NevH(xST@3Ob#{KYCFfFp^u;`e&sw+7Tx z8+%}AilHS_k%c}lC1|usybiW|j(5FUphX;CD<<=EUr}r5ygbsSo2o4_!8S=Nq4V zR>o-GEQK3$%^J~~`umFFCeGe6Bd`vyI1zVOjggd1{M>`;*mYE~GPT^@`9<|<`Y-_O z=~St2p8O7pzt}wg))9KTA^~!AEi4v##pGZ zY8u%*JJNm=U$k=R;7#pj6PO5LX)tZ)R4pp9DQS#h!=6eh1|-uRoJ(;6^*jz8+(#cC z(2OF<$VLmb;_^sEufcDrXzSJP&zcfo(+b$L%kV=69iZzOM<1`3{56Xm*Q=6|OM55# zbF&voURC#AJh-r`&u4F+>~$D)Zu840*x;&ki%VW1@F&JI6K$)Nf|5^8_H568d-?_? zk1V`mv)H021~#kT>GV-n*c_+k&;|7)gvUbxf$EuDv?=G!HEylCMAv@U!dRwLaGic8 z35kR4VJR!ybCGYkx)Sy!W7TZPi*+@#8?jA@XJ7ZY93eY+nM3K$dTlJ;af=^MmwZ-j z4>#O|$Jkw#y10;P>p!tBOYoBh7142_ix2|CFY#_G(K2_)6VsQXqfFU0^U&541pFtq zI+j7b#We6|`Mr*$cc^1pXGcEkHtH^;xlfWGf6#=|~-vj=Ce~XSN72Y)wpksR0aw5b~&^-K3Q1 z(n>>9_QK(>TP5#O7iZxlYZx*PCDpLo({_7{v6R3(WMW6vKckxI-_j{_aJjam&&_hx z*i|b~E+v5>sEs(>oQX-+dUB274pmB44{UEO>44 zfzQGs<8!czcGm&E!)cCE8dsjCf#c7c91SONW_?~$8U2Wi1n;N4?_AhLwq`FMY}4ds z5xqs-mM|8S#+0(SlR`&5{Ce%5!HaF<%23sW65AOt03U%oM8sj7G9#ND8g$;4i7VteSh z!(Su`?nmp@o4ZJU?9O+N&uYDV$Veki{>=)81Qm<~I0D13Y2J}*yLqI&ygXgG7Gj2* z`;z^YCB37b+T`Cd5Qje*I_>wLqv^P`t~W86@kNs|Vr* zB&)Tfd(qbI;~(!7UUF&Da#9=>jsm4Y?Ho((Gc#00?4B0Lg{Tgn40Kn#P^+EqDC$MC zdP9r74uZ@V>_7A@k0oK*!v!C^DUAB+f5fbYr9?;A+&HSuvDD|od~gjBl~6VHHOZ-_ zxzmfjP~DPCM$H+nsWf-7D$h1A@v( z*P+T10hYIZgTE%!FJF;Is$0|ityY&jU3uem(5`j-M)cyI_KFQ}lNo-Gknh6o5pe?%NmzYdj^Zf^zA1AVtmVn)CBrTlt8W6y|} zp86)wKMBv_Ueq+?$j!5kYRB>z8y9JK?O-kn+n#yDoTi@1z7I&-Io>6tJ{zY9H&<;E zmx|)rPVZDO4@xcXvKTZV(j2QzlI4=nPcL|i)fnz*W=7e<{v4-!P44=)|ErQFn%-^xohG~Pl;)#dw8??tN)8U@UmNcbDRAOV zg+R(wnEY@zCU)AkHU=llW9V2!bH_F6Wf*O5kdjV}TF2(hC1;f`Mv;)wn5Zi|^^`iy zKL?jB@n$xrA5d_N+B~@vJkiJ{w^o|ua?Z+AifJ)CM^eJ*=z@Qg+F#qKSX;jd455@feHZyQJPS?ITx7fjk4zaB>q*>~O$>8O5Yq6s>O%d6jq2rV)gJDe zZ>`%Oz^dt$RnO?DQiUGnipn?3q@{u6y0N$aoXA z8*%*ifdO8bzgd8I){3Vd6V_cpF%X(Z`B56^C-d1lfy!sqMJA<*2NgOkOtPoGMJS2l ziRQ-2hfvjl8U|egIKnuJ6M5IYjd9w`-Uwc>Q;6kygq8FVDJv7)&)w5( z3&ehug0rFLD55J6nvNIIj;G$ax?G$)G+iwB5|39MMbLupJ`$MbSAC_LSl8NX$TOwa!m@R7nm!ubL`RXXtIKbRqm$@hZ~L^C|brGt9^YwqdEAVrAoBjOr ze9a_i&{ra!;JPiC@r=(e2iIVOiTOB|@-}#G5bC)e3@F8?+lD!={OkR~#$%c4_LGR* zW}d1aK3{z1R?u*3uWJ+`pVK=>UxYKM>^Tj2+_}OO`U@N(LN8hdC zKKDkLx~t9?6=huW`KlVE53SH!-k)WS>*cTMR3W@tnYqi4l?@8nSRU`pAEF90njc_! z*2UR@z-7uDBgLfow`N^8_721DA?rNsv^9xEZf&%ue11=d*#9*O4?)7S1L&D4^X5tdqsHow^0@5|R-yCCdDLY%yrEK2r|N0HfQ!$HpwkF)q%$ zcK(xIixl5a(A5f$Osy{tZV#QQN9vMXJ2H)95+6{wqpiP%^tq=W2Q7A}s@|;gQ3cXQ z%>natz2MDFm9uI$wsWq@y%`DjNXBkrS92=9CmOGee_@})9d#&N)Tsi2q&o2yWnry5 zK$VL7nO*d1u-jJE$}Mrws>qc$#kOl2f|Iv=A^&Ab>`cioLk?)%q=Nes;whue>(>%* zGg=%~%bilNn%d2JwHE&(YPfvV$v#~pUWF!z8^V#U= z^atiDMFw$mkw7r{nAi-2@%M^3(28`WKg^siVV3?9`ku|6`#6z7R;CKUb5?V7-AyF> z*k$!sBj*LxuYbD=X@8ExIMIbz&k>^NNK%SX^ZUXAibINhT<>-kr@h8z#H2)i-1z{7991cSSSUP{+fm6@A($Tsw;OP^{SES&@#*D*lMiovKodis zly3#`SRDHQJ|$l@A%TJZPYPq?9D<*=Zte1TX6&Su|3ByhPORNk0KR_bYDZmr05&Rp zX|yw(d?UYQ;T#El;bHtN)NZg=0~t#~6pMcKEws3)=~z8kec<{WTDdVrwjXoiTF>g^yOQq(h3#qEtP#LVk+WPQ1S>dMRTOJmX zq?L=G(5$0PpS(I&8b#>0@MM871VTd(qTA1c8JYU$FA|w3GF`xu{eATD!Xj|7(0YBQ zw^ODDiuP|ScLq-Y0UgY;W4Ny(TYfTARjXt0OVdnKW-vIv!(ZV5c&50{3v>ASt@T^a z6YMu>>n0%o8@5-_VM>oXr|FrN+QnYT6oEt0hg;w5j@FyCikOpu@t`WccUS=zr)X$@C?flDL7HGYtJe$emhlG!iwxu+<{q{VZfP zIX?ixWq(Ka*ORIjmB)LwPpw;yU-pg)$;y15d$X|Jc$TDB4b^y*7FL_fFT+S49Z7j# zmZJ9_2C;ETEet9Ln8bgP8RRokSW;=UF#rBd71z!C%X-+1C$FA` zbj*K3G_xmnkOuFDf#60^5barbWBnWqb4kAa(^3tus5}en*JBcjZUS!|!_61lHdk_k z10tKr?~n1)(VdBg6^U!SbhTuDd@s02%>3eizkGb71Rwmnj7)_TqU@>DJxBXw17kIQ z!Fp&a$6HdVTvvV;u@=Huw3Sd82f61H@y1ilhf+uDUtniRTHgEkeLt=;l}oj>%L83A zd*2((gxS^9ZC?&4xA`ObN@<2Dd_#9}g`m+-)r|bL=Ram5qa(-5&|krzWn_e0nEI0f z^&g`FR@TWA$25q((flUHS1m}}!os>laYLf)_|{h!cVR!P`z?@r^nMSYpaxz)F#6^! z(%`ik^JMF|TZ$aQ%;l2LJ~6V1$;@f(B(%IawPSQDa~x+H5LBB>;#wv5sZSqlXkIj& z_9V;MK%Q!nP@G~PeeTrvD{11=Sv8KITYxzo=DGl9nIbrHVCKl(ZztFHFRlCY<1g4_ zxJkdEY5A$g8u7g{bJT1fU4ET`Z`kIWu2rpP?2`RRD(WiqE6`{9ZyUw8rZh4connwb ztJN;hv&OF}erxEK~jFrQofWp8r&!_2adTcte6*@+<*jwzogK?zRk)J&)fT`&`U zhSJ00KWzFfF*U&7U8(b6C3T$KG*Z~U-7EkYcZNHV@_37_dm~8L23quRc5fs)^1)Yh z8i$7LoO+B;qzHxER4?Bh>V(diKSy}~vyJcE>AYb$BT)M2eMdkSCdJ#hSdY8ZK_WC> z$YpXa4Xn7>pJ2<~cv)BHlXA>5r%rU8w&4;k_$7ZRs#7yBt-v9cyM5@Srn+&LVt7$q zHe=14gcO#*14=o4UmI0Z)ikThI@kXH{x;sK>Yc(O3*<$ zAn5FwuLS}stQ>FhD>}0mpk(39lhPLg($lnVB}#DZQ&>hclTWi@?_6am4>PDL?qf62 z)@W^*9wr?Aky|GNwxYp_4#^tc|A%M8HG%f-nZa$uoG|rVx)4FRun*Y;xOYru!H;Yp zhw*2SF^%;mq5?wNMn6t@h&>y{bw~uDCcqOVBo%IL<%bJNPrY0jizQ9FFW$y`do)&3 zRO)Xv{kwS(1O;2imxol;a>MQpvM*<=IZWy2SKcbrj+EvO_?AF)#x4>Sd+#2puuO*l z{N4MRUr{6LIu=`J^#7g(@DSmZM(Knz zFtfgp;#1Ime8|{JUarASb&Jw`s&!J~FfQI0(W=U~qPkmtg^0v{lHZJ70~~#zYkrWW z_{w@@#uwXJ-=twB_iOIGXz%J?++Olt@~ZH>*2;%u)W1z4T8GNYNad_dwX?~qs;c=% zr=l@Cv&kXcXbkIx(p<;v^w$$YN2brBt?n06F~(aplQ3%YVx*N9%~sR*() zY#{xOvUJ1YaL(Ja64lZZ#8vPqRn`-Vk0VSj`XwgjFmKt5SH@%zc8R7pM!fhB)%LDp zOk42gQ%a;QV|=>XEt8r1)z2%LSjQ9D4oB7Xo_({se>Tvgp5+ELm+rQ(l@{*$NGmBy z{}+m@O<}(KnizG+uFK#DWWnbe>>>Zo{uarHq4%TXS=G5KD7qU=l*1}_BjVD`c`lq0 z-C+9niHoOTq#ASk#=5nw(v6Eo2K$bdy+_9d`g`cZ>ZZCoD(yqLt^s#8s1|-<>$_e! zW+M5}qsENQGOCtd&dkgz@hW&&ng7=_S_p>gHrA18e$e4(^TaOOrc?xHIlhcm3QID< z!UfFuPl{ZE$qfi=J%x8xzl>83ZcS+w4$o-q?RkV;Cek6XY5z)V^S3Px8@@i(D+_kmJJj49IBKzab1t4N~vFwop3yk=v5`pqUI;H z+0L)5SNIUXu~7}Du@vjoqZQ3g)GT#(GiEo?Cb@Ud?+dB?z}#^}r_HHv&m*;eT@^eV z*42+zsSin;uQ&Pxef%C z_19|5c0K7Oy#lW6RxkM>psp?_Prv^BoOvseFXCO1md?~&!SjU{{UhzIjuMoowUp24 z{Au+u$_&2#A3MJaMp7@;4AGC?(22yX$f<=oCFd^Y!|Vb@q4ha^)AM_SA0}77N0L_< zz1*jMMtP*BC3grTsNrAtG)Z3;vQJYm~Iy%9UZB-4wZ+8F-dN! zXu4`zTEu0deC^gc{>oBU4ILSo+mwd)#k@#leyskZsW z$_+^9Jm?`4u&C&};JwnGMO5ETcE}pgZ@hcCHibpSMZI|H3ZY7osZrecd0VzH6JfZH z_;X$Afq@d+!HD%4?Jo z?EP;8{(P^mJ3F&jT9V_-c9v_ZD_{u}4Pd11$+>gjJOC54C~6c>8wi1=jM2+&8dC}j zHz_tCw)1V6;wKyOzalzbY!ysbY@@XQ^naO|P2a16k=Pqd!)lE#=-@FUMnH6m$G&x# z6*I5Yz@4%DzsDLLVSvBmrD4%tBb_Pca91H1yn+SEszqV5@smiTtqse|e0X1nsa8f* z?^*cVy`R~rv8q$@qUR>y)_qUN;uR!yZLAe6v(!X}Pqxa;JXOyQw!2AtuwEXPMfxV@ zS^qKKBJcVeM^qmV(fYeGgK+^hH5KbqWYk)#G3sGL$D0@p?PRuZ_3x6CWugz}Fy`M; z4a1lLG^eL%<7Fb>Yov(^cxh+nk^OyavAVCa{-osm-+gSEt~#zW#_N}tsohLDG?Mf3}DZa*+5SSJmTIXozRqn!DEPR;nl9-CTcW2t37r$6s_YN9to9Ar9=nZMyF z8?ZLSHqUVJ=wk(;%IHKckLG`vv+oXJdhmvdZPR_-7~0{l?D5sYTLSpW&+jijavzu$ zFEJi^kzTEZeYwu4pkH5Cg*fz`S}3qqGDijr)zC(EeN?>s`-bq-|7$Yti6qnJ;c*7| z$luQ$vV2y#sXKqf4J#K6XPc@eA8m<8bS}8;7m`j;tZh}CKKQiWhG{uWda;1`v|b#7 zK(q6`$4h+p7a32%{o=LP4WJnWWRFF@46TzVCTi|9ZyeZEI!{h?XVhpp>Y{gAswrof{!pZ*vp`B0ur3YJ*~^SRUd^9X?lD8Pj8TITHWnNc-nJm|FH& zdtPZud0iMu5*6K;MNze08stiZg1K_asidX0P8Iwz&GH7)?0BAXI5_1p5nf-{AG+JW zI)LY4g#YAf_`+Lo$Q-+JOfXj*8j;yEZ9I=^bkk`#jO%u2;(8=_ZzKmDBz{i)dD~i` zs8D$WGXO26^*UhbM2b63&Avz0IV6E}NsUMnk zqz<0-O3igE)#>5|KIy-xARenp|BSaHRT9murdCb?^tt=N4GqceBddWN2RlbJ0`ep7 zso75UN(n;LgLPwIhLLmEF>jpK*gIFgR~zvklATF;0ji=czY?gfzf1%ZH;ouSrzhYH zmiaMz!CEc!Pjb-z-EcU|B@boPpm*DJ&RbMpp!?YBF_#ncO~8jpnf-Mm>jhWIn3xb7 z#C)xtJM@~TmKN*EZ0(R_uFdan`-h{RVcH$BeFs}P@Qv}&wuUbw$|^jz&+`K=4PN|< zp6-k{@x7Umr|e})jr~ECG_4BN0>;Z8Vg}pf4b6WXS$l&h_mXX%oze!TjB_gG#R3YY z-5w}Nb=x)Z}?cyLTPEP9OaO(x@_42yE^q!(QKBsDZh$ok$Et#(>`tJG9m$FPM z*J65=f!*WiNN0Cis>QV`>OM$=~nXidEvZ+zh3Hm{K2`;-T{Y3Z3%a=z@b=P z`Hf41H~-ped18kwK_)H3r&o_pA>|JR9P+sfqi!jW~y^(I0V1rPL!{9awu?p?G%Hvgdq#si?&zOP|934+QYd$xnF$C62mM0 zt3?;w-KW~B@yJ89Fr=iD5^%Sm0$a`*lms^^h=kjxLC^*p8SVdWoX$dMaOt-%0hX2Ke z45spxTxH&lH97nUpEIUF!L=gXeC>dFv;{XN8KcsgLCB$-Yq{TO=LZbGcVkuLYHqzn zpeF++V&TdD3RTh~fnE`Bjl+xCm&U`6i|^+hfrSg}3^fbXZ7!hdeilqCZ3IJUhsBX@F#Jy48*L!mI_1gSmidJvdbY}1$&=a*`7$gGxJ^?x-2JezKvl&-^>Y{dex{jjiv37CI- zySDEB`qmYrh0wyD5!=jf?Dx#^H|;;TzRtE>r}+%EKRhW~Q$DV%J33gVku$dJ{$BO9 z1)FU*?a+WWbC|_I^{o0*Pmn=W3(H@I)uVZStvNDX4?nm{z}Byj;;QhUM}{Pmn75M2 zzCg?Qw%k+Gj7dBO^eI$TMbVP`$^#DmcKxOls(02aT{hQ^GxCHcF0cPoQgT_`yGE8Z z*52@?aM20oFlXbdkWFWjQqPUqOSUX^mW`5fFi)E==kvOwoP+3}JuO^_sMkg9V}OA| z20cT$*;Kond5Fl*V?N=URd>)C)-}I1Y<9eaau0A6+nw2`9#(p+p&uU=A@UzxwVBwi zj-(8@eV^AGSrz#9#R^hk>*IZ#MU_VLoJtUD?J(_dXOdSCUpS*aKuShtQ?yBI+F|xY z!p;nVoTkQX1L?o;IgKl5gUgsGW`lBOi6SI~C2A>+Au2#Nwa{eNU+1zf100@+;czWGL*-p}In4_>Ou02N?b(;`lja}ZsE*jr>< zb+aiw1OEqrpF;kbhw_i%k-X+U_!R;65!65r21wWk(4>_L;pT&;s)I*OYBJ+DTq<1PHD;*zS42N*sfY zpnEUdBb7J3T{VL5>sV>xZD~RvYPYA0g|2StHb_T>WuNDpFF1>3x=hT*AM_k(lpoW; zvv2hfIuCzBm}9xz`OE%e)=@vFyXU+BKL~Ae;tYv#63jx(t&FKUpJ&^dh22P6ESyJD zoL?ic+%yJC?X635Y|ZLtx6*~a&%u>5z-qdGFqX=6$*4F)Iybr<0iO+bH=@$xYvW%n z4wi=3GKLD5>P1JdSS?YrRq?f+#R;~V^9r^n!UeYnkBW}H&Dp)G=|1~5wOSlMvNYaZ zFp4`2+`#zi$W6~Q)UiNZhLA$9cVmTiKRy`BHGL^J@3EJ2qJK0U8}G8(9(;!H?+eY7+2#FB~+60x>_e6DVO^bD{1tgWAbVIJG)Y8^>_W!IEVNsp2Fe`LE+~mBR z(3AO9ASOa!{!Cf5;W*B62z{%T+g(%9=OrqVT&RXQvNpiMHn*;hJGQ};#0joJ;X+gB zf2SvjXAT<$pI{S-SxUTazx=bMzAbr1ux({5A;Ci(p?hzjuOzqyZa}$+zeU-2N^0*y z1&oOHQzxBvy8)*F!PLAE?UDYV0f&j=04FSM!jKG4{Rc7mn6{U>+U-%$*~n4>(*_u; zNrRKkZSn-FYt#mm^oJ}V;^#N%BPI{4kQ<2$h-y}|ZLOrm>}v&}Ei9{UA=_ems+Zq6 zM3<^(dL9dNzxFrn$HVgxI6lVQ{R49Xqi&&V=B);5g5!y5W8cdL+*M_ zh`Z>}OvmzmRWZqrj$i3LH!82~<>&A+4U0gXD2}v^lo?2Tv zA=Oqovl^J;GSR@yswUSe(e$pNq>9DXF3GHC<+FZegFx(gqrjYZB~zxNt{k-XvDd*s zScl_WgE1QRw)`RF#Hq&&^~XQ{ur@0uNQq1|YdLAxudU%E<;nv)-&2C_SRchNNunKT zqil0N`69ZFBjH2taoFOA+h;SM{U`69A9jYE<8Kig*DcE`8t?#dpIO5|ks`uK9}(q0 zotTq1IeeGIh|;Vl=ksL4*N5E`e67l1I&wOm1*#`voA1uZp>G9~u6=h8-@c9aE@h#c z4HgXK9wsvl5LsCMk#q+93`3A&NP8XR65`)~++@doBIou*tUNmIEis zjcxzcame?(!WQmV*P1LQfU^mC<_>p1-6{3?wcL9pU)5O7=8;W zU@^liR&q<&CUKzhSRUO9irgtip##_k^yjPw^mnYJpZs3QDOz^{c7^jw+c`a#L`VCD zZ`2I&cx6hes;Yea{5LL3UVH3w^t%SI%oYKIF?hzYo&(hBB>~B17jXw=D%dJ3D=~j+ zW0dvo4M@<$J%6Kk|Mm9^&VbH#QZ9-|4N!F&41_n{`wEhslA)&|Nq@^zW zG;ccYbGnI(+6{81cp>vYfM<9HNC12bz@;+M;-yo7)WP6B^PK zUpH???KqL$_IGU5ZCm86+Klu)o2@w$S{C)CPhhLRoYv>xsJvK6Hr^@*pB>yjEkn2d zI2yllo{@J%)1hDQHV~vH770w-A<1gl2K3f_GLxj>4ahehB&$cCD^)t{XeV<0# z;`@bR+UCpQ&Y<6S04SstWG&vs!Fu1}8v4(NMFdE;Zc_&}+rx|j0?+h0pu}-I&ekw9 zGv8%+@kL>U$*h~jH`55#P_y`Ixn6r7wj9eOM^zFwpl}t?{mFh*tmFyr$G*dDs24lYW$aGc=pM0K! zuulc+hrhwvEJHse7|0CD2H7$PWVZl3uL&%qIOF492&5v5h~szT8_Ju;mWYw}Vu z?P63=Hi4*}&3rmHpPW2%-|KH_U+Exlq9isauo177k&%IkUn#|wMqaL{1Y&ma6wCYg z1oHJ9Du4d1^w@cb>zX3xg>b3br+D@-VV9Lw04gZ$LsPqrYH*vi`jhinKLd1+M_z}U z6d)5b2(Ve?c@l_mX}kY?yyMH(%%3c?RE~~|>i`%)bAa_IwVx_`i#->0QBU zjJ3{~uxo9;)g_^ioDh+fs06)ee^~Mif4ll7si$XJDy`M9UR?)U7<-s@6t|-?!fUAm zZp#1oL42)1YGY=G@!_vRGWQVau+0Y`?t7J()(=RFswq)a1CjiF=hjyR-o4x%tpHy} z1(4HUzW-ZOsu6Yw01tNAR%<2?^nLUTD>?u+}I%=$F8r z2?1PG#f6QsNuap5WfN9Zlc6XunH znfo4CcjF?X+4vaLlvCL3QQSyfN9T}bgo@JSr9oXVcH&Wh^3n>3Plm<3fTBV!=$QQC z-$t!M8Zd&KXPrCRoI9w=a9n$kyG}Fk1ikLA+du|3% zk~!XR3tfia*0%zZWrC;SF2R$9pj=+YlkL;Kb`S%zYy%|7M_i#I`F5L)POAzlRFK-(TsBifA4Vu;YyQBiumV^%ZmZsS(jLHz!>Fr@|64Ceo|Xg3gb;v= z7_q|v7s?C(N-tj7yqhF2-cf&xZQ+27ZDCBl&_lm0;7l!G65F{jX@`v@FI870CRV`v z(LXjB9|&)(5`J*ja-xr^t`gf3H}jF&^j1*ZEQcCI$1YcP)nR%vL9*X9Reg0Y@hJ zla~I^NnBs!xwp~=C@+Z|-hl6AUX5@k0*a-e#MWOHrQ0^YqSG2gpeJ|G-b)>&4EAa$ zQpo5Dm_r9p2o~T^+&?~ULZobtj7A57P~?Iix?rJCuW%vckzK}DfyT@7yT;+kSbTQVhv&-Fwe?&$;jWPC3dn z_n8{W-5ubY)w!-m9Y3}{dUzr}Y3oQ*WM6aAR+YN2*u1kdlc~~r>s-m)o&FNW=g0C+8e85WSfG`RC@n-#k9aKaKcp!9ZV(qN!hM zwV#<8V2?WX_shwsViea$mw)eG)OoM^=`)XTGlTv?1sPS1EjmUcpz zJwC1(KKPj%`Y@EQ-az@O z859B(5V1zzT!;5*WV(Qe(%lCUKIQ^j*Y`i<9g|sSYAN^qn!O4eHYlXs|B&+Q3q5nC zES|AX=g!v#$4XXr`!Jtp#ez5>oXZyeu`O-Y#0PN5bfhC-P6b*iaUdW0;hPBP!)5vP zVaQJ>DhCbTbwSKh-`z8{Pkjeq)1y15``$ioW%PxdR3?)B?N0_Th~=I8uEUAUo$DIy z1iG~}lT`gH-}ImF?H?GZ0^*~**4Y!s_Q;=ib6bWEnD?jk3I%hejJiXTn}c+xYh`V0 z5vz6I{i|!%3kcu7-no7==rFv5aI&aml9md`-RpZ~`)h;!`?tyZTpGW58L zD|-Ss%*q3=)0TPx1UZ5g6x~0`LSj&7PUSq7`sPGgzi;0jL66q)$QV;sR~Ov571W_O z%g6wS`Sg`VRQ?%>&@@WMmwA%L1g?ET9?^5wI_QJ-B}U4Qaf8h8rX_UoQI(xDpL)XF+Qr zlF31*TY4?LKNu}h+*+uZ8hrdTyt&y3E@OA1JPBAXzrBFH)K?FM-6y@V9S1R+|8U&LQ;9C!t?| z_1bw{QF6WU-sPGE9w&wy43Xe3h?8vT)rCzBnOleMf8np!`vDn5pZ-pIm+!bGx|F5Y z=~5t5|MSa1OXlCl&>Kg(9axMZ?`Qxm01v&`Qe6CEha#H7YUe&|{`XgB!G5E!-WRh^ z=?26_fu8NAVXz;&O-AP8%Jq!Gl_k|8Yo~ebeb#7cRzVUHF4)SzM+dBeS?>Yvh$T{c8g7$Fw#5 zCQ_vBSswAi6!LVBN>gD_h3R$QM?m=U?YQnec+$c`z|O@XK!T}ucK#UpPe%#m7GUCx zb+cWdnLs2z+g9Y{z_ZX$s0)O~HB7BzOLkY){-F~W9}hIY|9hP^+rR(nX88B3V?^I8 zVNm)(KtiNc*B)fCLqmH*R)WDb^nM@-Ebm8GZQ6YZeR%0rn*dx&g2|AqqKum8L*MFO*oFdD%2x{H5(x8MSkG5|GY|Hp4uXK>$J<$jEsoZ42vSm6k~-n zdoo^UCK=du9e^oWnW(rvOmxTTSB4l|N1i+|*0sC$0K=exon6Z1!Cmz^z?*nr-@ez! z0&;-Y+Hl*Q^Z9cte}xj=)2-p*;WC;LDS_o;IEIlJSYpyNe;%z+Jzl?Ac$1; z(v$AHpo49Hv1JXIO3Ar05Ta06v#0;2sG5U8q^O$AG?SU{Tb7CIOyjds`C&G=^1@ba z;E;DTzPJ0?Q5qdc&7wgkptvIsjN5kL!OP3+P9s$Tzkk}JNBwE3njYN=g;R@%AB=#Q-5#k)@rzz4S_9rS=C?GwqHsh1PiRefZm_erWdv zI9l3m2a(J4e8Uy5!EB`Tx-h06ypx28N8-#^HB_*lp zd@{&NINT^Vfw}fRX-|HuHsqOqUB0@?3IuSnV<7+qA&V(t%DmsxD4(<)P&+jh$+ciI*Vdi^xstM|KEK0zXbKH$vfeR@7rb z_7 z{O6}`RGYdr8e>bFAAYFC(g9RzYsZtuMzycwr&M=#=dnElx6Q|Nc?)zbPikObK+S9L zz4@5L#o8@Duj*_Es=_{?``Y+R`}Y8(4ZNK14O;fY(yjX5?;u!~pS%cC@2LJgj>+_3 z4h=a!yahG8Olwo22wFyXXy}%=5ospmH-{924vM00UNVo8)FHJ_1HHFAk4xk0l>m#p z^VAOT8Ris--e~PWZoOJqvH_UuHZ7O*{-8m#IB`M<$i{L3{jw|%^m(76rvqXbS&iOP zfTK9hjdz$@TAqU^pUD6|Nv)sPN_DHy_`s+d-Q(MZy@AoZYkUwEcun@5+qWx$jQioU zXTN8Wa4-M9?hi_2)=Fg7U}6iNzwheLcR5S%*t!$q86%x$u~wJqDcb1c;$o zp$Lyb<8x_QZMHD!b!R`G@cd|MIPtNza3PQU8(G&xI-WfiFgPIW-9`6-b(;Jy}e5w_mzs0;TJDo`*YAlp~cK(PifUOJoxIx*|A-V?@e?Lp)B1H z(vW-&=h@j=Q(Id}z>gLF+yq2|4uEIC8_J?OA6}e!>(Hn-@17eBY`$$Vv$-ecsUVhh z=&^6|*~J?Y7Y}hh-@v#RHh}Ds7{uWU`b+mT{_x^8!S9#c|FpCeMHm(W9+leyfNGZx zz+GeeuA%pLTh6ltH;aR;b#ZagneywezslS?R1io2YQsz*!OR!~6iMy$t4mqgR4TOw z$TTGYWWkq#mKUQ|HpT!xhB6(X=0w-o{k$CL(2Ev0FnE=q+*4H2Tj)mJs;t~I8VFv% z%*a)L9J=vM-OK;zk+= zy|^%VqWP_Cl&nG+iY2+j^_iNR&owoo1%lS4RLD$I)@U1*YPf&@{<4L>2o#Zo42qrt z(rwQkA1c;|>w;lh1p{$2ZFCVxwqX&zKS#lUM>)Y3JZoc7c*+(E$JCEQqrlgvg7rnec>a zQZmN2ATOTmzDQA4o*R0Wo)Ql9o6d3`Kr$S)f6bmpRnv$mdk$ziGwr3Zp_(^vI_#A z0SXpzOOEZ5t?}31u$#(gtlIr(A%Ocq3Ct1jda-~u4vT4{jG;&FdU*f-{Z{RI$s>Fv zr!M4HCM(#J2|LdGk-xmu)ym1qiNlB?L;_-32_*^Mvl~M;yTH9JEK z#;N*xj)xD+$e=?vev)q}zhM+f6ZCU2;88HAQL3fL>bf{RMhv>k9 znd~^y{MZ#U1d}E--X33EHNAhW-p9prP*8I0_HH@q$*2->DVsoL(qmeG{{?bB0i{+1 zy}+4JSZL2%1rrXKxH~hKF8{QM%-00S>M`UG2x>31#Df*A1itL%z-qx<<5LM-YHeLd zG2t4I!)&Yp3vuob_ZujLf+e?bcWeqOE^0vV-%j8|8CP{`7tIeWbj_|tUD;1vBQ0%= zAq=18TZC6QmehWp1sW2~_-eE)mBiuF(yOy%vtyn-d9pB@Ly)vM<#_-eNJpNNC+Kw` zSJPF$Nq79kTL%;a%#9FjJaVo6=c42+zPc!l6Hko8mP-e}sG0@`su!)*7dqiVXh_@HPjhl& z#CACsSi1lQ()(acQ3&#{7*TESb4u0)Pdlc;{?`E1O$w^mt)Wp3*;l6n3)T~O6;k4C zZrWTXpgTM9j0pSSCjq-I_ScH)`d^qCqpE^)1D0!*?d7a2`M| zc}9jkcN^r6d3Z^MxVo2M2I;StOA9>X7zZRpLqYRR7XTzz`u{A>rLWoTS&)ybF0kf( z*uNI*cO?wgj``XHsTba?Xez?dGNbB2aKI7Z!Uzx}tGe|4j}IY>F+F*5BdT4$dGjU< zeBAt`vQ!%nP9qwpaJ2LBU;{`+!kGJkdVv-&sXr_zDCn3zyHgCTljo<)%d0Ohml8$m zD+#LN$g4SzVIaWFg`ga6_{Fu-)gGl2B$K1Zc0jx(S%TlW1%tsL3CJ4AAbZ_eP~8#% zMTQ87p0O5?FY)n8r(VJwfHhQ@F^jHRgO;z)`TX`Jh*d(3DR5@^B}kMwR)(&#xpRj| zJP1MyjxgOLAsO8Rgwfdv`XPZ4Sg=BhDZ$fqTAAl?wjlZ%QcSj?d!YdkD8 zCnsZ=-XbW1MlA~phgO0$b_6S@OymOxcVtfR!1h~*zh1v)M-hG~hW^m661#6?<7|8K0&Wt#Q z1V3y<8F@!v>4D(D<52{22&~eRE*^=L*t4@@t}y37NJvQjEJ)+NLyqM3?b`(rJ^?6s zh9w~l59(C@0Q!kE02qZiAB~dn8RNMo_=>kh)e7p$Qzq%4j8)!a&-Y6=MQXFJ2d>2t4*r%Q2x|4SQS?*VYa^<&!hAKgT6z_x&e*NX0+3fzm z@ta!?u+DBs&k!lL`}5}k;m_N)0;K%|@jPopou_ zt1QkPiya(qNhu)Hn4fiLG7IN{7&U0(%tSdY$;TWR%jW}o!1uXzBFl%>c!JQNRbo5O z=En=LhnUYI9;*+DWY8TmS(!drY1W}6$kkkhwm@99iG+o>(hbF0r!Kr+7Hc$v$}BBJkdabI^O=H(q07m*C5r4W2AV90#6ASiF;3Af zrc6WK!#7{Z7y%fr6vSyi3}o{Rh6zGd5M0qhvj>z*(#Kv2EA|>XXlrW= ziNwrZ1`;x=Q3d@>%NM8jr4OLnN3hZwy_rA1xshwJ%^ZW#vrrNcOreWyTW&}+JFy_Y zEwx&q0IDBxBzK5VkoQSi0e=w=bKJ*T9~uD?G_ck&Z6^WOgINEN4FdEIdU|>uuPcpI%Wof&iBKMS z_2b&{oqOH^ItkUH$xvXHe--@?Y@pHd;Y<~S&>$^AuJFXB4@hHh7gk9Udt9uTyR2Ro zC}F;~PJg(2<;oQl^feP30YaKEqE4Yog$e~(fTYCK8a%Ihdfk$mlzM&-jwLxO{UlK0jC-5U<6gU~R7QEpyA>~eYjn6wR~6$BZ_6HY5_~&w;?j?6hVwY6pAB+< z4=PBQBo#OTeD)^_!PD`6_Uw%Lu5c2GWLfHqh5S$fq_#F9X=_33UR{0g_2G8te50dP z4I%ArV6QJKW}GlL7e*@#b($p;G2nC5pdjW!ZTa|d1BgNzbxy-Lib_xA`!o7fC_xwB z4?lxkyuhgu!w*iCNCY7>&)HUs8h8}(qy_-%=ny@I#m2^Fb+)0n2^2m{t157ik^A;8 zJ%zK6?(a}tgLxtY`%87rmAXXNfqVt=psUquVHPiPz45A!2U~dqMgwZh($&dCJ|+I0 z3Vjs{!;lK+F9)2NUN;JDYQAFfWsxkz*M z>eZ$&%MpBHVIczW2NZ{6{UMA;nWV^lC1i1oleE+j&JI3M5A}Y8DH3Z78D8yYZafBy z3b9%hgaeK>l78bCC6Q&`z1thFItc~F7*M|zm!3Lt;zWxRYo%)0&2~R1FFsZVK})*= z66v6+DXr8#5Wu`DC|!z^p+`|$IaSBcLwDxGeuS9gT7B`KuS!RPMorZkB*}qZm-N#M zGB^8*Q3(+Q+?glawH&MujPEGhI$2(!vWe&mB_!5UjuzueczY1}b)eu|mm)(z65bfL zry)S#u~B?Abo?}{V9@lZVjyuyV%Ni9Y3px+$AMfzCFM_y4VHbh{)Oeo-tG=nSyY%+h?Sg2!BZL)9QK9pg)g5Q9!!xQXhx-H1g&3b~opPw~!tgeG)zFS|r z$rg6*J}WOTZ>;uwpP8R#yGSSM@b zSXq0#PF`@ehd!c62u!1q4IWwppvE*>kXcbtK@oY1;W1)XUWh*D>U#LBp17t*Btk{? zXCACQtn%92@74FqA1SjzJ!vD%8dpjxIKFcrK2k6a$BM|y+euFoa-(L~-z60k7S4`X zrhuPO1C^hG0RRYGkW2jepG_k(>v*@nlyE}cz#OKlj6(rhRl(2Yr;cn6d<>e}4_h?PJiAS94I0ZpqQaZVe~6GUvd3f7a?|7;Zv z+4}%hZeaq57$@x5f*?%R^guGP5fD5Wtn{P$sQ^EB`lLX7sCMDgUbs+%Z6BmiKYpx) zP)7)g*vE5-sSxLmLpq!b@umRpgJ93p%1R7yItBzN!Fz093B2=8Gk$xdj;X!ZSaxqclMi*=2=F=Mdp zPB@CD3{@Lrq%r#Xi%l_tPGrDaqQT#wU;(1Qv0w5W0FjDlMT$!*%SsSh;ij7q1TKYhAGzhnpK0~R>N=r5iFgWb6~=2kQ3@HLO05d#B>df=ZZr|$7`1|Tgo^eZ6oC@bjm>*XuYUFi)A!hs~` zeJTZdxN|8L`UsB_r!5@3edo^Xq7Gn!K0C!a011>lrw zLrnmd&+EGE!{hP6f3LJ3zGzcC{4fHVus2@$hbv>xk*`tfBETI_9w`TbV{rtCd|lJ* z%FY{-zLt0uG86?Nn`SY{a4G)m31<0eY{08Ui4__T5OBgf##LcR&CH zLrCNDQBkQy8!R{)>P^x;PqVWp^MU~g4-27!#%dpgMw2sSP#O2|>hgq-A@C3j`)5yd zLxkSc+w1Y+pY^k536#`FrbV9-X7Wgx0O7f;j050Eu475w&4(dIR7^;8{q*WGc$vV< z9c1ev(r80doh5SN8;yE zG}{|ARrvkQTofg$4$`3FkP9%iKiJ_G6~gd?8=Iu{y!&q%K2a_O_|_53p%}psUfp1K zTq%BC*dpvj9TiZMhc=w26m1CS{`!7t`_6ZJ4lNCP63ih@Fe2K@Y>GW^y&!ON0%f|7 z(AfBL^V}a`<2v)uI9iOkpFbZCi^Jt(HYC_8UEPq{jrsU_dsjkcmBu^_O%rx#6kI8M z-aNSmsu>?#JD|x~3am>6qiH{A$DfWL06h2If)274WIlJQrP>$fZ`U|U7YgvGh_>qd z(jy#p{F)!$ZxjP`EeW*3Tq!6Ie4-2zYWKdY$SN%K$sb)Swo?w<0a57&us*%x8r^{B zs6prwiLU`Q(iWon?%kCTfCZILBJb$|PC$PQLaoFJ&_s?@V)5Ar7M1M7gln~ zy}^X}{(I=Zrx~u%X6GrvMN8}cFwCWXXH^t9quwjujp>kd6gWXt*yo&;0Yb@?X=LVW zR4<{Y3g|Nvl><^3xbbZa=&LlrPsg3Z0o3QCp{ZE|8Qw+_TW`}MpA$Bt*=xG~g7l;s zV*CzQD_B6C10_d{bCsiF9?e-n^1-;<82p5y4N_B{0BCyn8oQl8-v<%!`Q5vBKg#lg zAQQ{%ng-Aim4t(s#4gK)e}~H-XFGt zyWeYH0LhL4EMb(v)liaPsdaJeZxhI{*CJgRYBKD;f|g?uYlA=isAo-m=}AY$yhyML z*)7vBF*ZYCUc#O`YLNz=G!ubj-q4m!n8@@fc^^ld*=Dk^<=G9T5N zYb3mkp;@4`Wg6|mpaQz~5*bHusgu4TuullobEQGb?+jpV+g- zNq7mOo1}O1gdrVT7!rxh2%ZOgm=2lNi~UPB>vVoMf&I?kdF}}za`USAIl6)krox92|J{p+vOGhaG2tW2$~H-Ut1n=^NI20-E9 z(uflls&1O<>Q(9buqPJWsUu_?rhw`}Sr=go$L!mcw{8tZVHv^-AKSvc^ooIBi-w>` z5tYP{$49kPv~6T|v{lV-vb#Pow<29&O+zm0%k+WZVl*Hi)oAAkis;_F;g=t1ZfaTw zF(w0Y76i@pLGDA#oT@-$x+|4s3^f!bZEbCtJ4bxj5B0l>%I7+_gJ$N#?CfmAS@4a+ z6VAbM#f|V*IOOcRQ85l#JMU!J!t^IfW(4>rN}(XQatD3P^7ID4Q^iorwO}0W&FN->-vY$Wy>L6e~UaHRv9;x;p@11p}NSFGBNbqu_ zOx2(7cEi?cy{;^&ZhOfHcVblA+wewOTGgD%eOmn3TWY6I-%1f=ikr8iW+^GEBxHBv zC=#%Z{CV}J4bTA7^x?w?*8nJlp7LouImH@>%H}b)$lnMf@F3@BXR9Fa8)vQ)5gy(r zfI74=}2+M@PA%sDkwg8cZ1jIABkRtm7SeyoxIm)aF%&`=J zo{mvan;Js&0bJ8F&jw!Ol)&>GHkn`g{Sj+~(KqZFnmLygDW#`92ktAfB1aV#{JfRy z!N|}laKWC`_T)9x_daVxd%4eTV>!`QJZ`q$$E=sC)sjWHGnw>?f1 zn2p-#T*sPfh$aHf<^g4G@6Tz*t%bTs-*$V}5r?rZkpJvkj#=2(H&Hf0>gq%2&FnPf zS3&d37?Ti2Rf8Tg9hH=!7)KbM8(cp4>=i}32jge$0!JR7J9jP=cBY6Xd5-~v zJZ4&sCIo;IyB4!6cI(IXx*RY-m_6FeHTTp5hKmCZDF*f-?SiURij*Rd>MWq%s5C$CcIS64@ z(#3bb>pc(pux~lG$Wt5Iao5|@3^9vM2K?h(Xe{0cHT9_I=;+8cFUZy^QJKYnFjl9S zDgmE~ae$44V)Cyp%|mK;3U%If1;Xc#_Oln87Y+rc&NkrPV5&ei^Qw}n2Wj|1&lFw+ zCKT1TR8IsNy`Y@y^uJ5Kc%}}Upbh`)td9Z;2Oc)fTgk|O2 zzrPtJZVPQi6?d8f*MJ~y0>q(7kRz{KC#IMX8ma~9Asxzs0SF*Un;i$!?a7`fszFU4 zAVwPz8j5D5J~SDKd&_A=AH#5GRK_G=4;wUd-j1*l53f95#KF0v!tff$l zIHg8LMlHmRA|igJ!BDV2NWn#;90osMN~?lSll4~i@NN<;9|nMQ3aHRpZ|w_~66Nox z>MMn=s(*;=Q|bUIMRFSeZ!zG8rLuJ3H`w&D300f{j=7Lepr!;(iqTjNetl2~3w;ZC zY7gmv0m2{&ydgq$JZy2at8q7)^)uNB9f=Tb1ho!kDR(j6dk4=~0(SA@z`Sj-u6|y5 zV_;2tt|J|=lSs7h6g3Xm!p&{?xw4G|#tZGJg5Ix>PRS6p z%9CO`@0D~Ko_(0HU}kQv%~@E)DsqaS5a&r;D0H}QQv98 z%qbcsy>oeWOVJlJ?ivO09Ft7{b4&rz8gnv>8LVvQx!`rYZo+p7O`xh`3tE{*@N+`u15 zo?mnBr4PaX-RWPW7Mlkw%7;g?tD3a@|qECr6`w{I_XeJhzjKnJ{(1)HTl>2-E?{;Mb40M>4Zl6gd8UdJrT!2w9DoDw$%<@Z)|K*dzg-~l0T+h5K&IlDT#GoTl8Tb{~+|)@49R2;$0k)Z2RQXxjdnY>~H=;48AU@su=a&-*ehwEx+>_{KvmUc`VaC5G=1aC_>{N9kK`AmmZ-gufnOuR}JOCwK~% z=0}Ey_1_xc@xHr^`&~+|tR)o4MC-YIP)MDcz16J6Nq7(_cCi~g>A#+7B`n>tAsU2+ z#QSi}7d>un6Z)?W_MM4VOn7S5E0Ir_9#lx>bN$5Wn&hXgl$&&DbS*lnpOKRzf*#+} zYdz`{6^wRQc^h$3$aup*;FT~oE+fj!aL8$G564+4(D7=@bqRAbvw}Jo)JMGRpE-+S zthNqm-6So~hp*s>a237nP1xjzeVk0vmb606k44p9WLmpZ^3ag_sOzv}1vDZ3Yfuxh z(3_hWY<~Q>%nmq!`}{o(@6^)|U&^UwU~9L&uDtGp?P+_K;o8!2lb-#u@7HffZnGnw zAf>O^S4kZpj!ceCfKRJdFwaFm}!R=_wqUy znD=Ne&@11ZG}(?XEZcAU?R%&;^?Zmcw8U-VswVs+i-Yp8LkR9My+ZdI(w6rPrkbWFQf|qL4a2Mm4zrf7l#I^g6Rp`zEtUmj08_Ti@}DTNxIG z!*GlSEqdfpeRg||zVI`%Bj~eBui=lN|D0Rr0{Fx2SMcVmu1%vQCOb?`t!~fy0`l*0 z&dIaL=X^Zaw-5oWH5Ekb>SqFSWAW`_+AARjlLs`GB6bjt39d z$|bZvc=)nQJ4df)y`<#tR}?n4|Uay2a4!A2<+6BR}d2 z+#atv<}4Z$%C|J8E+-vA@~_aUDHNH@cTJ}q0pFh;dB+fEixH&)Ra)RG%mU749o&E%u!2ZI{{}uWrcyep&9@7kvOxcRA3KQ!9@gj8d5( zHBcINkAN9Lc?1gx+6vr3SYFMoO=%xI%B5HP8q}Za8fOH%B@Hj4V*K!f*ybxwrMe&j zFe06U%?N+3H;xo-4Y?9#k$NtSNL*9CI^;dXZFFcPh04iF`-MNuEG%kZSEbCKOGkzO zcio2yAz+s%&?L18I!vL$t%^SKVYyuFX@?5|re@LGhe>upi9ZQ_5IJdXUfp7XNhWcg zrbUMXe&>(Y%RiMM*a#y20$PyK5m82lO-4~5YPk9p735~tu?}aQOMScOXI0UXa=^4L z=g-OqF`J-~9`$M3wz1H{fn8@PA~&?LNxToXXz4YhhPX}Oj0roPj>ONV1PtCq9jePv zb!YKr<$7ad?xBDUcLp9S^J~eg)?tU~0R5qsXn2;HDr2_Lp{C|L-j1#e!QjxPyzC#$ z5SH}vEGQ0pKt_r_0B6yHPLR?}0-|Mrs<;E}p1p$L_Yh;dZFi2y7v{yMxJ8atyzDEt zzbWn6XW@WR; zg1fsUmt|9=0w;Y4K@4gxg-!?zg8ZYQJF(un5v5hgKm!Q9avOYO#xzU;QW;BX`=$um zx$tW_>IbaISK7Ur?>`mwnEsA*59F)8Vq$f>V6?(O!+vD+Z1~hg)w1Z@tpk z%z$8HZVYwwLI2OcNKK^uP+9?dZZ-l?dIgO{*DtVJv$7Bp*%Kyu8{=(#tq_Ft!#DHv z!}3!E?yP6!Izs~p2A3fVMcN1PkrlPKR|I z_b}Q;6io^h=X)I}D}LgWQFP+}?*X(6=J_27q%zl|+j!IM_p*AA{r@03@JxuK z&HIMc4!BeVrHEGC-!SEeIVn&bM(>|L~0_JndX^2{Ncx@? z8$mBt`DL;dd}+$VGd>YnUwV)JcaYjWh1(P9*CQ+p3~lCp*cKZqn^H4t!+dctm)%Bf z=(oBywGeY`o7QRC7Av*oxaFVx@4)X#dr+aCO+M?IY17)2wwNB`b8eM{*=->#tq*OF z>1xL&A7~_1*IOt@tR9oU`@d6v`HfUjxH^k*6{i%|N$mHUt4AwLiFPu0<^?SuPkZd9E~-SonW!Wmue*2j)l2|uY` zPcrz=Q8v5T`Ono`^8T=i8RMrmu8!UxBXKXE?2;j$0IoBF&%P^3zhpAgl{sJ+QYNp0 z@$%%1_+_M(>p4aIcb%;-T8N6$%hs95+~+yYxU+{FG+i_pFCsip^K9s3)oaBWTIPUt z;&IQRI~nxr+l6ZueXyh>|GgYjCvG4y_V2WzRnal2W?}&W#pp1;KZb`-({Foa^gZ3R z96Oh%+JKF=A(tw3TI;y~Yr=4Je>n;MMbHZXhu-U;Fuvh2Ol#IgjjC}MKjP|&e-c`^ZgqxD-`rGAXuOo$q$xL9QMigqE{ah8uLV4G zD#&JATefQyGz<=7?!PeMUFV!~H)DP1Tj-Y8saavK5>qBsaG`G>*FEY#7qS;DP83Xp zrnb&o?b<7UWjfpl@6%5_B_kt)jP1qZ%MtwCEt4-v3PfFMr)vONa=I_EC^Gu>{&4q! z{~YUuWCs``_3if@t71|8q1u1s*^{RMS$Z-uM}F?FD&T8s>3h$7*!sJ2`=sL?ChEqq zw$|=z>hSU8&r=OXQ`i4xHfatTO{X@>9=zjRz#EL3$US@JMA_n-MN8Wj;en0UOzliX zufB_L_;CM?=#Hm5eqN>Y;`M*7;+62nf(Lq=Xzmf!g;}}2M{P2#dN$2wbUyU8a?A8D zS2yRTm3R3V--9MIe1O@84gFYZ?l>qL^ycDiZIo<3ZkYAS%553WYxg|sxL4dPPvXJT^+>zwr$LP{$!7EdBqm)vrxek@J&7hI+Bt%m3*;CsliIw)W-!j~+cUe={ybXW2IKeYg!b?80JlPf7 z#W1?S7T3#G+9uS?8$D0!YFrm(5dl2^M)@X5KSl*|y^EG}$}Ki6+ZZT{R`*ZCj5i=-5YQkXGsJxyV*A0V+a2{ zcKj)Q-XMpO#UJn7idXaiDkB z<~W<|Ue7Q0BAof#ZH1k^`9Loxgp^IY7{ZSo=Dt>{w{LCRU4yQNXA{eyRI|LA=P~Qa zgp^P4vB^d`H9Tz(Mp93ugOzcL#)~bhcyGR|p|E z&%FGraqaqGp1gQtJn(5|Sg6-L)V%l5*_Ejg!uJab*6-^XqfvLIk{jP~&Px09Hb3Kf zna4=)3FI8jBT%-7JIrL)^!z@do_IKs(V4bGpV0AitF(1eQ=mpBE<)PAT*)p_sbe9khpg4WU91(=+WK|@ z8?1xR7mB9+^=5(Nq;r6^=5Aq*>;9nb>Ey?ZH_~xYG?lpCPTtRJ8Ztwal_foEW+{Cm z%j2T#AF_GW@D5OOutE?PK zUy)36DI^GqN~0T&idPLgKrou)$UkFdKwRk=A{>nil0GS%$~u1Xhan3rgYHJGiHK3? zA|JLT02C%%bShuTE-CTa7}Mxr)%{gn)R!c64^CV2LQUCOwqK*{5&HX_$jH1^MZj{2 zlg6YRnp?4{m4w>aepOO8c2(SDF|f9dZk*5WoEVGt z>nkdBhbP7;-(TC)QNcK2)HlA;(7C&!jTrrsd4ob%&DW6A=TEaJhE;1e-nAvSQVT2B zR^;wBFH1^fmMYgvGV;gbL9ZaToOcw~vJG?our1jMxa&T$m=FVcGF$5!W2OT49!_FP z%R278&a^m+CICS-VhEp_NF{fK+aDil?9k>LjdFH_5BkWx>u$?eP$%5Uf&=n4+fd_+ zrO0wq_Rd(m^5r4>JRdxU_bFD3?RGbn?=;4nITj>bwJhFQACr>Bj!)CK6cssDa$;4- znXU>J@i-Vl<|4IEOiP8XY)QjqzYCm;q!x{sm2+KH$F=lKVwgE zcpcY8WhNiiBj3sz%8v`DbzX0K`S*1H(2dx8WL$8*x<|=Ht1_OMhZG@SouEB>^_u5v zCmknVuq|?s6~YuzlAy(o z(%h?5pA8A+7jor&@HewqJ&&>*^L+?gp0UX8lC;=hyt4SzaycKub{nQeF%NHcoat7~ z;~0@9Qx(Ns~bQ5BX>l7HVY`ajT}ap*y26-d~YrYti{*Q$22T<*7|>%JgGK6>2quK2|kXm zHBojeS8w~v8K~Ly*bz8+RpO3=^P{lGqt&R(5qrXGT+ivx_`3;s&#rg=ie5t^|JW?L=J}VMRHfCk>TsdpEG9HMG)<_xaKCWEgctp`q8ECQSLx zUgJTZK1J?y)w|$_<+wTv)BVmlGfJn@w+p3q6I|FCHu-7_l1Ww^JTszmfgahv_Pa3) zzsiSI;tua_?2Mr0Ol3!5Xz{`P3ahSl6d)1rU$s~SIC~LqKF{*=S);y*jDR#{>t8z^ z-st}rR31GyXT}+R{y2BX-*uGG&^tLr2ZB6p#??Ge9~`S|TR3OgE0sajsHs@)q@h2_ zV*o3BQE^8F$_o}oA2SwPl&wZ+(Xn&wAvxcd+d%`~Hhl2W>A0)7sF=BP+s{Yn%{92Q zOZg4={HHC%^YRJLIz;2vO5Sc_?IT6w#zwUr>Y7*Q60Wm{O7R6sJPk$GPY$aoooN+n zOy*Vh*{RNZ(UzuN8{*d1jdO6-M=6dx*}59sZ1bFD{sT6XKKZ^RLxC4;KUqDMooG=> z8$3J0De!b0kNbOW{*zuI!;;uw60g*ClfmNt=tr$i&AWiVW5D9$ zke1CDe`boJ?(Y`xI2C#0AnSNNv$C{|=YW-TimGw5$wK z^;`spH=)M6`r}S1@?l!H@#sQg{RFPc4ZF_it|SdQ{B*MIi3@ML)~(BkFEE6nO78sa z*J6cJ4dTQaX2&^N-<&12TS91F`gT*`;Ct(hd@n;s^Fe!IRoC#}#ZHk6iyrqG@(Xth zbCq?NrFR?n2MlzB?T_jP`Vj}Gb|u*d%`Z;Wb(i7Ya3)nTPgE%lJo(Gaq0rD$oShVb zjh&`S&l+{5o$0A=AG)+^i0@%9Mqv5)Hsq`?Cf|I#An(abnqZRU8ce3hj!u25IR-DSEF^UHUUG0a5! zkJZvs?|O!Ecta0Pstu(_S-IM;pO2YbY|5*YZZH8$oXAu?d`cQAfAB5@nDf4~Sl_tz zKtGSUoV;M=n=*B({E=R7Fq_qEe3rS8SjqAtO`0fr@?z^*sbs<#crQ1vO6H!#a(L1GMdU{f zCi#VY8=IDO+sy|inMV)5&vEkN1;EhWI`WCt;;x4&2=olfbaSm6=KTRtC5Dan%_fY+ zlWOkG*5}TDe|2Xkzh{wV6>h(lMjP>9myW!1vg+W)YGM567d2NhOL1+!m3gaZ_O*lD zYX*b-xV2l0x_GP4b`~tyq!4eE14Ei89NCC1(~2Jf}A>;SkIP*hXPJ0 zV0|OsiOCxcr^Xf&_P8B9+E-^I+j}q7-IAKr#5$<~UdO*eE^$ga%P#gkQ@kUv!hhl& znAk4SxF;T^%(#wjewOt|De+DlhaB$D@-MiB&Q2T!Pr?=(D$dQq*P#A+R4(n~zCCPS zldNA(*nvhxGM4Pvu5t~Q^Xpta3N3{YYf^H?#v zYcO_G+`77Z*V__8D2Y~XG=$(SQ=R3_=bR#`ZC9NqJNCXkn!6xf9%GMU(YZFI>M4_Y zMkfW{n0PnnKQlRwB{cGU9hCyh=eaEqlS!2XVB0$97f&cNrkPP^& zxMl^p?|(S6b%k>t1i{42x}Qz%rBw4aQ|hd-F9O)(V{e)BOj#wXnxSqlsF98bDKDQF zCRfZzZ;BtP!1Q6+bKX%2WxDE9VYrl=X*iS7&UvF!7K4dPyAR4OVZ*s5J5-7_9y4$g5_e z5`#~9_GXww*5RvIoL4F90tV838)+wKlEk;+5{K;@6Y41H%oKKS=qibAyeV?f(2K*K zpUU{W>J@wNA889SBZQApIX-OOn7Cs9LT(=$M@un{i%ERXZY4+6?zLwSc(2RT6yjym zho=0lpWM?>w8o^ik&G3wFJG)o7^h}7RniQ%R$&M@ z4{=|fsvCa5nu%Km3#A?wFe*P6fKbXpX+{SHQ7t;a-(I7tZXh!TbL!g)f|rNYYZ?6X8twG@#M5W z(&cIT4jEzbSloPQU5y2Po-;RhYenl~-=clR1u@M0e01UlmwNUrA^PytPn$<-v(Jr(Pmc)=%9 znLnv|J44U85(!+m{OtI`g6f67=2$Xt{-x%uAYG7|c*m6rY}`-q}zFyQ;WCYCE$!`F$hPs}wK% zV0*3vK&u&OqDJIDtbC}o4`X$P@}@e~)0YEUt3&j`FZT6B+%U46;DV3CnRP@qhEuiF z%3wL0u$&KMM_j?j=9N zVqAzyy#7lA5idrk08jjSHSh7V%`2|I1(3D#%O7f1#FT^RFZ~0T-ve8+#1EJ71)m6z zZyw2N1|7@wmwXio3Z#$0Zn4a|OcL10k;1ksyU^5MrRw>gA*9rl`Q0g!L+T!Uu2>TI zn-CSsU9mD3rX0(3KBG~^C^u&*{0e^;i<`taw(<+28tu$E;Q~DTf_Yh%dsN!O6EFU7 zwj8wK;y3~#fd5$5ueRX|upEw{3`jaP(vaN$f}ED|^*A$)(jEM;mP4j=>y&KRvz<>n z1LX-|$^H|yK!!T*83$DjYH3n1>50;+_qs|9K4yvli8+WX1`qLvZA2|QK$9$Kg}G)5 zQGJ$Z>pnft)!h*rvR!7RbI=J8BT}b#1Pl~=^3T^x*4PE!ZOW#~i$#hXYjCmHmGj9Y z+~*YaRk7StJ>vO!DlP33eTQwpdfEMw4F|VN`u2iiYX`zINVq0lx$O%TTv8E^nE})> z%jBNr5Lmrnq@(@-><`tD=)fY0ED9XyxgMYy;>*?3TR1}AQGp30-T$(YBbWLE-|{rq zN6O!T^+1iz2=`;#0Q^ozEHZY$3+eg{8b7I z5%eM4ab2R?>O#b?7vdjXqklIWj#M_6I1I!_e~ zS~l+`(GBqs75rIsLo6Sb1bl$@#ZU!;+|}jahi=Zrg~AWr*5wfJ&x;TrS-lC*5$nGi z!;$DX%V{LA90&1>FaLt56E0!>R$^`^qUL)kP9j8gU?t`P7FUcAXSw1V40LI^7_*fG z7<8elmLG)GOF>BY54HN~PT4K-Rm22DIQuG{jq!@i>jB}^+tNv`KHN%lHf9+7PpQ)0-B%iibKE3$*FkLLa%T&8T@t8Af-yOyU?8-<29Xy z5JM&N%lU9@c!8Ocpzm1uV`=WaW_m)KfZx%mKx2bdUqY8Y7`wTnsgl#%km^_vy(;FM z7wn4D)5m#OZd?>nE6MZTc3ZNDVS~(Cp7e3GgQcVql>GKc50TLmLM5ETu>=p}u2uD> z*fVE+y^UjCm>G(iCi~cNAVG3b!k>6oP!M%braJ5bY^30T6a9GhCX5HE;vOc>Ta`nv zl{>|eMu+Y+=i=9%8X4N86*w84n$^;?PNNDHV+M~~>0GcH2qKsqGswSDIVDIx9p`Mc z*Up%oA!#~KZP#S+z%~J0I}>3e6=bud=_#a|Fsgl|7{i6LFNYamu03aNpYasLPr&)r zIX%W~C1d9`cw&Y~u`J3waH_!+`)nRJ4>K&UEjA_2E%4i}Oe{Iw&FJ3+k2T z*@Iq{<4W|gV%PdZ=#J@mWkG#bkMSGj(CU4tUxUYvrt5i7;0Nn>RA{JX5hiH{H|#?r zhnYDmMLG_`2ARSmt!=|mNrHtiS<{5L;$HR8n^Md0nQnq|$s=CzB~X~YuMLct6Qh;c zx`z9n0)r#?QKug(Y6g|6k79L&qesgCc!uN2l?%p^IvXuenGRRBpHO2hJE0lv)H(6q zFLs=Fx=gdYpdD#xwiy7uRUe=o!i4pbz|w9c-4TFJldvU1P;0I0;Um5zLzYrNCKrOR z;OL=ZYU6;|W631UaJ?p_pVb^&-KF-I2)zY%AU{nDszgRV6|+oc6vq@3DIn&-t-Y^q z(s%4S4@qO05D)@U5hfTTwl>=T6dcORPoiu;R!y^hPSN<5g1S}A5PRIdrXr#SuaNs;?Y370tQ(r%YG-7cL$H z+aj#M=9fQCE z_I%I>MUk(D{Clp&r$JVDZICdz^^0o$mZ(>uUe%knIafdq;l9 zMejr0$k6I=jh;K33kpT%g)-hc5L-25>lMuD$em74{fyy zNw!gUm006*J>tco7Hs&8rV*xPuv)VY`Smb)aWmcbb!Qi>xsu$-yxRVdZENlhSQhp<5JQ6Iae28MbUPKal8Nz`#H#g6C;iBool4uR)p=XYc%yH%Erj?qj%oS~k9x zpEiMcn!nY8byVu)Z)-_3oTitJBpZr|PMU}Hl-F0#vj|b7J}U=}M1%J^b^r38yO2^x?174zE}l6+ zpM(l}??wqvN0<7e2N5(&hG52#y;3>uwybbQE?}wIN=jfVVBqIg!PsI#ZJc*Qnz-41_=jk`@mzf)mRBzv=}LqHrRSVR|1sda_& zBk1qLyV??8f?~|%!faW8Ct>>Y!`Wn6LjKbO-6hu|+P9bl6Is2!$wzxDk%f4ErD4o` z{{drolhXXgb1AxHP5#XTN!TsI`no(>%bmXQ?CAKxCWFvstF4x_sQ})l;&VxEl>}{M zqw~wyQmZEaHYEQ=#6@zGo3U86v}UF`Ye(J9UeU%=c9eK-FJz`&R692H_cb{Qwi=F- zzoI=fvy9V!6HVmZ&DxYO%!~?k!=?b)=M={yAK4y5!gdca&V*_=TUlNw-uWVSqpQYL zhwCDm9(qgynI*$R?ao$6`=lJo#?%J3(Ay@}(qiqBdtY~Ex}z0PE$WMXKj)i}>JN6>vt zca$}{f?EvBh`eT7vn&OVS)qU1%h%hj9ltSoQ8n7=7Tw32o1RK4QVNLf+!UmyQYC{(V9fw>UiZ{ug2#jnCkHMDO%?d|D&t_4s0HM!R+H z8^nYd_K4<1GoFr^Lbi6+H9t5Ivcv;Vo;$?ZF_T^LiiN~MF<6&rKlE&e=_E0$uk&f? zqS_J5l|zqa8XF_m_k5_gB_Q-+wBZW6DPF1yWkVBSgo)9{PPv{$s#1KoK%~>~gbD{rV)Zdn5i>B@yqP8fI9m!w~p(OGeXD+O9mNkiy4@8E4uiq!oSA zlx{}tNRnFxBD1}hc$-jnHjDK#m)l!nA>&Up?=)Fn+&YOf*YlVz_dGkj5L+`Mq`rY4 zH(Q#@$#s!I^ug|`f6-8%WW&^(PZ$I4_ca7eXb%L}hpaD3-Bef9N9W>zdGCe*q78tP z6*-3{T&IwX!iR?#tTL`4F8!a3r``nPX(#ecZAXknreJ%ok%LT;t=(O-ftL$sh>sHYixLFz@YNd8cC8V0&;U42UBuMP83iyDL)SLEbFzA^{e^iS zC!*(PV_3V}HA$twB?C+d*E3@3cT!Y7n0yahc!@q3+svebIBl(NipFLF*vQt+lq4B| zA)Pu!Klr!F2g5>B1DhylISW5OK64%|$KuOnecje-F{` z6z)Db^pbrH9f>9p^KnTA)UaAWd|hc83^zs77y)BzFO~oUEnT0E;FAi0=BF6eD3wLr z`84<0Q)@F?HtVz}ze90Ulk{@xygJoMEH1NU;){yRyX6=wej4|X9G)B&Qq$!6T6J;e z_&L`>AqDwM@7vDC@5DuP>C|cOG#{3SuUKr+OOsnfFmb0OXnG&Aw?S3^7%|C25{hMj zo}5-CG}-VT@7UZ*2c0+KclG!+TV4W~iDQ5s+%ya$v1&H>9^MmK-|>bG4+-QgKXJi~ z>j{$4=oM3GTdT^!`a02+ez6z`DT4yq+7#2y90=DwGxMUh&3v1$e&_T%iPx@iC-N0a zOJrHzy5g$o0-=5Um}PW4JKZ9RKOYz`oOEEsc-KX=T@>;E$hM5Bt~qqT&R~rSpFcJ> z7TW&tOMibqYh$9JG-eo=HF8NGjw)PDcN z+D{7GNwdaUmptWluUp&RQ{1DkTnSpCtM}>MMEhcN-^l&|+gIQNTPPos%Z8F3k2K?;nD1*toj#fbJaSE@t5xd%Jh|ypM(Lu)qJh;&$be z&R=d0FZ%lQ_Z){>v%dGEp=GR^))A`%HMk86ntJOcOLsji!%VmBnbT{fVh-_eX^ZS^ z;$Dv%RWCL`y|)YuF1*FkU|UxQi~VU!chyJYzYcx-yIlF=!Io*2#f2k<_I5iD=M^%$ zbaJ|QXEjM&VBKDS$;A+aE?3JVZ~E!CQ$f*`MX8J zj8U(rkz)NM8DD+Db5ON7VZ3YdQP1q^7*$NMu-S zQX<-P7IHh`@eLvqX2zlJIG}FE^P!Dp8hNR~#(RsG$dVMa{R-NzB*uH(P|DPVBxd3$ zGvZAIg*~N8je5G-6I!s>*!kbhzskI*RyjBWt-Cc!GP7|`8v+ni_qNI4YaAG-BPX7g zFV9hO%&~vCq6yB-Z#YyM9J`L%Ziw%bmTE^pLX&}FRmqq-{ju!L7s}g@>S(P*$m&e7 z6K6(jyAOD>VARi_Q8D=wFTfVB%?wNMo#sTNCL%N1jx=$IUdd8}MU5a3^{c>-x0 zO`xUmf&);;#RbE?(j*|ENMqjz?sNw3GVwD{$d0fB1Zgf@0Ynn?^g2vy4WRY;cC&Qh zNL)-HD2Z&<{K2HW=OcTAIn-%Y(kji%VhCqwP+oA^c+Tb0PO9YUeh7xl zEwuG_=ilwY4VZt|ZU4LDKicgVN&hax{U3dQKR)REKN0Gf{yp%&+y4g$-)p`$V#k$z Ux5EngYxZ95hurG-9slKj0N7aX&;S4c diff --git a/ydb/docs/ru/core/sre/ansible/_includes/ansible-install-steps.md b/ydb/docs/ru/core/sre/ansible/_includes/ansible-install-steps.md deleted file mode 100644 index e6e4dd217696..000000000000 --- a/ydb/docs/ru/core/sre/ansible/_includes/ansible-install-steps.md +++ /dev/null @@ -1,85 +0,0 @@ -1. [Роль](https://github.com/ydb-platform/ydb-ansible/blob/main/roles/packages/tasks/main.yaml) `packages`. Задачи: - * `check dpkg audit` – проверка состояния dpkg с помощью команды `dpkg --audit` и сохранение результатов команды в переменной `dpkg_audit_result`. Задача завершится с ошибкой, если команда `dpkg_audit_result.rc` вернет значение отличное от 0 или 1. - * `run the equivalent of "apt-get clean" as a separate step` – очистка кеша apt, аналогично команде `apt-get clean`. - * `run the equivalent of "apt-get update" as a separate step` – обновление кеша apt, аналогично команде `apt-get update`. - * `fix unconfigured packages` – исправление неконфигурированных пакетов с помощью команды `dpkg --configure --pending`. - * `set vars_for_distribution_version variables` – установка переменных для конкретной версии дистрибутива. - * `setup apt repositories` – настройка репозиториев apt из заданного списка. - * `setup apt preferences` – настройка предпочтений apt (содержание переменных указано в `roles/packages/vars/distributions///main.yaml`). - * `setup apt configs`– настройка конфигураций apt. - * `flush handlers` – принудительный запуск всех накопленных обработчиков (хендлеров). В данном случае запускается хендлер, который обновляет кеш apt. - * `install packages` – установка пакетов apt с учетом заданных параметров и времени валидности кеша. - -Ссылки на списки пакетов, которые будут установлены для Ubuntu 22.04 или Astra Linux 1.7: -* [Список](https://github.com/ydb-platform/ydb-ansible/blob/main/roles/packages/vars/distributions/Ubuntu/22.04/main.yaml) пакетов для Ubuntu 22.04; -* [Список](https://github.com/ydb-platform/ydb-ansible/blob/main/roles/packages/vars/distributions/Astra%20Linux/1.7_x86-64/main.yaml) пакетов для Astra Linux 1.7. - -2. [Роль](https://github.com/ydb-platform/ydb-ansible/blob/main/roles/system/tasks/main.yaml) `system`. Задачи: - * `configure clock` – блок задач настройки системных часов: - + `assert required variables are defined` – проверка переменной `system_timezone` на существование. Эта проверка гарантирует, что необходимая переменная доступна для следующей задачи в блоке. - + `set system timezone` – установка системного часового пояса. Часовой пояс задаётся значением переменной `system_timezone`, а аппаратные часы (`hwclock`) устанавливаются на UTC. После выполнения задачи отправляется уведомление для перезапуска службы `cron`. - + `flush handlers` – принудительное выполнение накопленных обработчиков директивой `meta`. Будет произведен рестарт следующих процессов: `timesyncd`, `journald`, `cron`, `cpufrequtils`, и выполнена команда `sysctl -p`. - * `configure systemd-timesyncd` – блок задач настройки `systemd-timesyncd`: - + `assert required variables are defined` - утверждает, что количество NTP серверов (`system_ntp_servers`) больше одного, если переменная `system_ntp_servers` определена. Если переменная `system_ntp_servers` не определена, выполнение блока задач `configure systemd-timesyncd` будет пропущено, включая проверку количества NTP серверов и настройку `systemd-timesyncd`. - + `create conf.d directory for timesyncd` - создаёт директорию `/etc/systemd/timesyncd.conf.d`, если переменная `system_ntp_servers` определена. - + `configure systemd-timesyncd` - создаёт конфигурационный файл `/etc/systemd/timesyncd.conf.d/ydb.conf` для службы `systemd-timesyncd` с основным и резервными NTP серверами. Задача будет выполнена, если переменная `system_ntp_servers` определена. После выполнения задачи отправляется уведомление для перезапуска службы `timesyncd`. - + `flush handlers` - вызываются накопленные обработчики. Выполняется обработчик `restart timesyncd`, который выполняет перезапуск сервиса `systemd-timesyncd.service`. - + `start timesyncd` - запуск и активация службы `systemd-timesyncd.service`. Далее служба будет стартовать автоматически при загрузке системы. - * `configure systemd-journald` – блок задач по настройке сервиса `systemd-journald`: - + `create conf.d directory for journald` - создание директории `/etc/systemd/journald.conf.d` для хранения конфигурационных файлов `systemd-journald`. - + `configure systemd-journald` - создание конфигурационного файла в `/etc/systemd/journald.conf.d/ydb.conf` для `systemd-journald`, в котором указывается секция `Journal` с опцией `ForwardToWall=no`. Параметр `ForwardToWall=no` в конфигурации `systemd-journald` означает, что журнал сообщений (логи) системы не будет перенаправляться как сообщения "wall" всем вошедшим в систему пользователям. После выполнения задачи отправляется уведомление для перезапуска службы `journald`. - + `flush handlers` - вызывает накопленные хендлеры. Будет выполнен хендлер `restart journald`, который перезапустит сервис `systemd-journald`. - + `start journald` - запуск и активация службы `systemd-journald.service`. Далее служба будет стартовать автоматически при загрузке системы. - * `configure kernel` – блок задач конфигурирования ядра: - + `configure /etc/modules-load.d dir` - создание директории `/etc/modules-load.d` с правами владельца и группы для пользователя root и разрешениями `0755`. - + `setup conntrack module` - копирование строки `nf_conntrack` в файл `/etc/modules-load.d/conntrack.conf` для загрузки модуля `nf_conntrack` при старте системы. - + `load conntrack module` - загрузка модуля `nf_conntrack` в текущей сессии. - + `setup sysctl files` - применяет шаблоны для создания конфигурационных файлов в `/etc/sysctl.d/` для различных системных настроек (таких, как настройки безопасности, сети и файловой системы). Список файлов включает `10-console-messages.conf`, `10-link-restrictions.conf` и другие. После выполнения этой задачи отправляется уведомление для применения изменений в настройках ядра. - + `flush handlers` - вызывает накопленные хендлеры. Будет вызван хендлер `apply kernel settings`, который выполнит команду `sysctl -p` для применения параметров ядра, указанных в файле `/etc/sysctl.conf` или в других файлах в каталоге `/etc/sysctl.d/`. - * `configure cpu governor` – блок задач настройки режима управления частотой процессора: - + `install cpufrequtils` - установка пакета `cpufrequtils` из apt. В задаче установлены параметры проверки кеша apt и таймаут выполнения задачи в 300 секунд, чтобы ускорить выполнения задачи и избежать бесконечного цикла ожидания обновления пакетов apt. - + `use performance cpu governor` - создание файла `/etc/default/cpufrequtils` с содержимым "GOVERNOR=performance", что устанавливает режим работы CPU governor в "performance" (Отключения режима энергосбережения при простое ядер CPU). После выполнения задачи отправляется уведомление для перезапуска службы `cpufrequtils`. - + `disable ondemand.service` - отключение сервиса `ondemand.service`, если он присутствует в системе. Сервис останавливается, его автоматический запуск отключается, и он маскируется (предотвращается его запуск). После выполнения задачи отправляется уведомление для перезапуска cpufrequtils. - + `flush handlers` - вызывает накопленные хендлеры. Будет вызван хендлер `restart cpufrequtils`, который перезапустит сервис `cpufrequtils`. - + `start cpufrequtils` - запуск и активация службы `cpufrequtils.service`. Далее служба будет стартовать автоматически при загрузке системы. -3. [Роль](https://github.com/ydb-platform/ydb-ansible/blob/main/roles/ydbd/tasks/main.yaml) `ydbd`. Задачи: - * `check if required variables are defined` – проверка, что переменные `ydb_archive`, `ydb_config`, `ydb_tls_dir` определены. Если какая-либо из них не определена, Ansible выведет соответствующее сообщение об ошибке и остановит выполнение плейбука. - * `set vars_for_distribution variables` – установка переменных из указанного файла в переменной `vars_for_distribution_file` во время выполнения плейбука. Задача управляет набором переменных, зависящих от конкретного дистрибутива Linux. - * `ensure libaio is installed` – проверка, что пакет `libaio` установлен. - * `install custom libidn from archive` – установка пользовательской версии библиотеки `libidn` из архива. - * `create certs group` – создание системной группы `certs`. - * `create ydb group` – создание системной группы `ydb`. - * `create ydb user` – создание системного пользователя `ydb` с домашней директорией. - * `install YDB server binary package from archive` – установка YDB из скаченного архива. - * `create YDB audit directory` – создание поддиректории `audit` в директории установки YDB. - * `setup certificates` – блок задач по установки сертификатов безопасности: - + `create YDB certs directory` – создание поддиректории `certs` в директории установки YDB. - + `copy the TLS ca.crt` – копирование корневого сертификата `ca.crt` на сервер. - + `copy the TLS node.crt` – копирование TLS-сертификата `node.crt` из директории сгенерированных сертификатов. - + `copy the TLS node.key` – копирование TLS-сертификата `node.key` из директории сгенерированных сертификатов. - + `copy the TLS web.pem` – копирование TLS pem ключа `web.pem` из директории сгенерированных сертификатов. - * `copy configuration file` – копирование конфигурационного файла `config.yaml` на сервер. - * `add configuration file updater script` – копирование скрипта `update_config_file.sh` на сервер. -4. [Роль](https://github.com/ydb-platform/ydb-ansible/blob/main/roles/ydbd_static/tasks/main.yaml) `ydbd_static`. Задачи: - * `check if required variables are defined` – проверка, что переменные `ydb_cores_static`, `ydb_disks`, `ydb_domain`, `ydb_user` определены. Если хотя бы одна из этих переменных не определена, задача завершится с ошибкой, и будет выведено соответствующее сообщение об ошибке для каждой переменной, которая не была определена. - * `check if required secrets are defined` – проверка определения секретной переменной `ydb_password`. Если эта переменная не определена, задача завершится с ошибкой, и будет выведено сообщение об ошибке. - * `create static node configuration file` – создание конфигурационного файла статической ноды путём запуска скопированного скрипта `update_config_file.sh` и передачи в него конфигураций `ydbd-config.yaml`, `ydbd-config-static.yaml`. - * `create static node systemd unit` – создание файла `ydbd-storage.service` для статического узла на основе шаблона. После выполнения задачи отправляется уведомление для перезапуска службы `systemd`. - * `flush handlers` – выполнение накопленных хендлеров. Выполняется перезапуск всех служб `systemd`. - * `format drives confirmation block` – блок задач по форматированию дисков и прерывания выполнения плейбука в случае отказа пользователя от подтверждения. В терминал будет выведен запрос на подтверждение форматирования подключенного к серверу диска. Варианты ответа: `yes` – продолжить выполнение плейбука с форматированием диска. Любое другое значение, будет восприниматься как отказ от форматирования. По умолчанию диски форматируется автоматически без запроса разрешения у пользователя, так как переменные `ydb_allow_format_drives` и `ydb_skip_data_loss_confirmation_prompt` равны `true`. Если нужно запросить подтверждение от пользователя, то нужно изменить значение переменной `ydb_skip_data_loss_confirmation_prompt` на `false` в инвентаризационном файле `50-inventory.yaml`. - * `prepare drives` – задача по форматированию подключенных дисков. Вызывается плагин `drive_prepare` – это специально разработанный Ansible-модуль для установки YDB, который входит в состав поставки коллекции YDB и располагается в директории `.../.ansible/collections/ansible_collections/ydb_platform/ydb/plugins/action/drive_prepare.py`. Модуль выполнит форматирование подключенного к серверу диска, указанного в переменной `ydb_disks`. Форматирование будет произведено если переменная `ydb_allow_format_drives` имеет значение `true`. - * `start storage node` – запуск процесса сторадж ноды с помощью `systemd`. В случае возникновения любых ошибок запуска сервиса исполнение плейбука будет прервано. - * `get ydb token` – запрос токена YDB для выполнения команды инициализации стораджа. Токен сохраняется в переменной `ydb_credentials`. В задаче вызывается модуль `get_token` из директории `.../.ansible/collections/ansible_collections/ydb_platform/ydb/plugins/modules`. В случае возникновение любых ошибок на данном шаге выполнение плейбука будет прервано. - * `wait for ydb discovery to start working locally` – вызывается модуль `wait_discovery`, который выполняет запрос `ListEndpoints` к YDB для проверки работоспособности базовых подсистем кластера. Если подсистемы работают исправно – можно выполнять команды инициализации стороджа и создания базы данных. - * `init YDB storage if not initialized` – инициализация хранилища в случае если оно еще не создано. В задаче вызывается плагин `init_storage`, который выполняет команду инициализации хранилища с помощью grpcs-запроса к статической ноде на порт 2135. Результат выполнения команды сохраняется в переменной `init_storage`. - * `wait for ydb healthcheck switch to "GOOD" status` – ожидание получения статуса `GOOD` от системы проверки состояния YDB. В задаче вызывается плагин `wait_healthcheck`, который выполняет команду проверке состояния YDB. - * `set cluster root password` – установка пароля для root пользователя YDB. В задаче выполняется плагин `set_user_password`, который выполняет grpcs запрос к YDB и устанавливает заранее заданный пароль для root пользователя YDB. Пароль задаётся переменной `ydb_password` в инвентаризационном файле `/examples/9-nodes-mirror-3-dc/inventory/99-inventory-vault.yaml` в зашифрованном виде. -5. [Роль](https://github.com/ydb-platform/ydb-ansible/blob/main/roles/ydbd_dynamic/tasks/main.yaml) `ydbd_dynamic`. Задачи: - * `check if required variables are defined` – проверка наличия установленных переменных (`ydb_domain`,`ydb_pool_kind`, `ydb_cores_dynamic`, `ydb_brokers`, `ydb_dbname`, `ydb_dynnodes`) и вывод ошибки в случае отсутствия любой из переменных. - * `create dynamic node configuration file` – создание конфигурационного файла для динамических нод. - * `create dynamic node systemd unit` – создание сервиса для systemd динамических нод. После выполнения задачи отправляется уведомление для перезапуска службы `systemd`. - * `flush handlers` – выполнение накопившихся хендлеров. Будет выполнен рестарт `systemd`. - * `start dynamic nodes` – запуск процесса динамических нод с помощью `systemd`. - * `get ydb token` – получение токена для создания базы данных. - * `create YDB database` – создание базы данных. В задаче выполняется плагин `create_database`, который выполняет запрос создания БД к YDB. - * `wait for ydb discovery to start working locally` – повторно вызывается модуль `wait_discovery` для проверки работоспособности базовых подсистем кластера. \ No newline at end of file diff --git a/ydb/docs/ru/core/sre/ansible/_includes/repo-tree.md b/ydb/docs/ru/core/sre/ansible/_includes/repo-tree.md deleted file mode 100644 index 4b157e5f220b..000000000000 --- a/ydb/docs/ru/core/sre/ansible/_includes/repo-tree.md +++ /dev/null @@ -1,18 +0,0 @@ -```text -├── 8-nodes-block-4-2 / 9-nodes-mirror-3-dc -│   ├── ansible.cfg #Конфигурационный файл Ansible, который содержит настройки подключения к серверам и опции структуры проекта. -│   ├── ansible_vault_password_file #Пароль для пользователя root. -│   ├── creds #Переменные окружения, задающие имя пользователя и пароль для YDB. -│   ├── files -│   │   ├── config.yaml #Конфигурационный файл YDB. -│   ├── inventory #Директория с инвентаризационными файлами. -│   │   ├── 50-inventory.yaml #Основной инвентаризационный файл. -│   │   └── 99-inventory-vault.yaml #Зашифрованный инвентаризационный файл, содержащий пароль root пользователя от YDB. -│   ├── setup_playbook.yaml #Плейбук, который запускает роли установки и настройки {{ ydb-short-name }} на кластере. -├── README.md #Описание репозитория. -├── requirements.txt #Файл со списком зависимостей для установки Python пакетов в виртуальное окружение. -├── requirements.yaml #Файл с указателем на актуальные Ansible коллекции. -├── TLS #Директория, в которой создаётся поддиректория CA с TLS сертификатами. -│   ├── ydb-ca-nodes.txt #Список FQDN серверов для генерации TLS сертификатов -│   └── ydb-ca-update.sh #Скрипт для генерации TLS сертификатов из списка ydb-ca-nodes.txt -``` \ No newline at end of file diff --git a/ydb/docs/ru/core/sre/ansible/_includes/terraform/aws.md b/ydb/docs/ru/core/sre/ansible/_includes/terraform/aws.md deleted file mode 100644 index e69de29bb2d1..000000000000 diff --git a/ydb/docs/ru/core/sre/ansible/_includes/terraform/azure.md b/ydb/docs/ru/core/sre/ansible/_includes/terraform/azure.md deleted file mode 100644 index b8f342615aa3..000000000000 --- a/ydb/docs/ru/core/sre/ansible/_includes/terraform/azure.md +++ /dev/null @@ -1,9 +0,0 @@ -Создайте [аккаунт](https://portal.azure.com/#home) в Azure и пополните [счёт](https://portal.azure.com/#view/Microsoft_Azure_GTM/ModernBillingMenuBlade/~/BillingAccounts) аккаунта на сумму, достаточную для работы девяти ВМ. Рассчитать примерную стоимость содержания инфраструктуры в зависимости от региона и прочих обстоятельств можно с помощью [калькулятора](https://azure.com/e/26977c150e854617a888fb3a7d1a399d). - -Аутентификация в провайдере Azure для Terraform осуществляется через CLI. Скачать, установить и настроить Azure CLI можно, следуя [этой](https://learn.microsoft.com/ru-ru/cli/azure/install-azure-cli) инструкции. Авторизоваться в Azure с помощью Azure CLI можно в интерактивном режиме командой `az login`, а для создания пары SSH-ключей (Linux, macOS) проще всего будет воспользоваться командой `ssh-keygen`. - -После авторизации в Azure и генерации SSH-ключей нужно изменить дефолтное значение следующих переменных в корневом файле `variables.tf`: -* `auth_location` – название региона, где будет развернута инфраструктура. Список доступных регионов в зависимости от подписки можно получить командой `az account list-locations | grep "displayName"`. -* `ssh_key_path` – путь к публичной части сгенерированного SSH-ключа. - -Значение остальных переменных можно оставить без изменения. Находясь в корневой директории Terraform сценария, выполните команду `terraform init` – будет установлен Terraform провайдер и инициализированы модули. После выполните команду `terraform plan` для создания плана создания инфраструктуры и далее выполните команду `terraform apply` для создания инфраструктуры в облаке Azure. \ No newline at end of file diff --git a/ydb/docs/ru/core/sre/ansible/_includes/terraform/gcp.md b/ydb/docs/ru/core/sre/ansible/_includes/terraform/gcp.md deleted file mode 100644 index 706db7b9b28b..000000000000 --- a/ydb/docs/ru/core/sre/ansible/_includes/terraform/gcp.md +++ /dev/null @@ -1,18 +0,0 @@ -1. Зарегистрируйтесь в Google Cloud console и [создайте](https://console.cloud.google.com/projectselector2/home) проект. -3. Активируйте [платежный аккаунт](https://console.cloud.google.com/billing/manage) и пополните его средствами для запуска девяти ВМ. Рассчитать стоимость можно в [калькуляторе](https://cloud.google.com/products/calculator). -4. Актируйте [Compute Engine API](https://console.cloud.google.com/apis/api/compute.googleapis.com/metrics) и [Cloud DNS API](https://console.cloud.google.com/apis/api/dns.googleapis.com/metrics). -5. Скачайте и установите GCP CLI, следуя [этой](https://cloud.google.com/sdk/docs/install) инструкции. -6. Перейдите в поддиректорию `.../google-cloud-sdk/bin` и выполните команду `./gcloud compute regions list` для получения списка доступных регионов. -7. Выполните команду `./gcloud auth application-default login` для настройки профиля подключения. -8. Скачайте репозиторий с помощью команды `git clone https://github.com/ydb-platform/ydb-terraform`. -9. Перейдите в поддиректорию `gcp` (находится в скаченном репозитории) и в файле `variables.tf` задайте актуальные значения следующим переменным: - * `project` – название проекта, которое было задано в облачной консоли Google Cloud. - * `region` – регион, где будет развернута инфраструктура. - * `zones` – список зон доступности, в которых будут созданы подсети и ВМ. - -Теперь, находясь в поддиректории `gcp` можно выполнить последовательность следующих команд для установки провайдера, инициализации модулей и создания инфраструктуры: -* `terraform init` – установка провайдера и инициализация модулей. -* `terraform plan` – создание плана будущей инфраструктуры. -* `terraform init` (повторное выполнение) – создание ресурсов в облаке. - -Далее используются команды `terraform plan`, `terraform init` и `terraform destroy` (уничтожение созданной инфраструктуры). \ No newline at end of file diff --git a/ydb/docs/ru/core/sre/ansible/_includes/terraform/yc.md b/ydb/docs/ru/core/sre/ansible/_includes/terraform/yc.md deleted file mode 100644 index 04e2f91aaae5..000000000000 --- a/ydb/docs/ru/core/sre/ansible/_includes/terraform/yc.md +++ /dev/null @@ -1,44 +0,0 @@ -Для создания инфраструктуры в Yandex Cloud с помощью Terraform нужно: -1. Подготовить облако к работе: - * [Зарегистрироваться](https://console.cloud.yandex.ru/) в Yandex Cloud. - * [Подключить](https://cloud.yandex.com/ru/docs/billing/concepts/billing-account) платежный аккаунт. - * [Убедится](https://console.cloud.yandex.ru/billing) в наличии достаточного количества средств для создания девяти ВМ. -2. Установить и настроить Yandex Cloud CLI: - * [Скачать](https://cloud.yandex.ru/ru/docs/cli/quickstart) Yandex Cloud CLI. - * [Создать](https://cloud.yandex.ru/ru/docs/cli/quickstart#initialize) профиль -3. [Создать](https://cloud.yandex.com/ru/docs/tutorials/infrastructure-management/terraform-quickstart#get-credentials) сервисный аккаунт с помощью CLI. -4. [Сгенерировать](https://cloud.yandex.ru/ru/docs/cli/operations/authentication/service-account#auth-as-sa) SA ключ в JSON формате для подключения Terraform к облаку с помощью CLI: `yc iam key create --service-account-name --output --folder-id `. Будет сгенерирован SA ключ, а в терминал будет выведена секретная информация: - ``` - access_key: - id: ajenhnhaqgd3vp... - service_account_id: aje90em65r6922... - created_at: "2024-03-05T20:10:50.0150..." - key_id: YCAJElaLsa0z3snzH4E... - secret: YCPKNJDVhRZgyywl4hQwVdcSRC... - ``` - Скопируйте `access_key.id` и `secret`. Значения этих полей нужны будут в дальнейшем при работе с AWS CLI. -5. [Скачать](https://aws.amazon.com/ru/cli/) AWS CLI. -6. Настроить окружение AWS CLI: - * Запустите команду `aws configure` и последовательно введите сохраненные ранее `access_key.id` и `secret`. Для значения региона используйте `ru-central1`: - ``` - aws configure - AWS Access Key ID [None]: AKIAIOSFODNN******** - AWS Secret Access Key [None]: wJalr********/*******/bPxRfiCYEX******** - Default region name [None]: ru-central1 - Default output format [None]: - ``` - Будут созданы файлы `~/.aws/credentials` и `~/.aws/config`. -7. Отредактировать `~/.aws/credentials` и `~/.aws/config` следующим образом: - * Добавьте `[Ya_def_reg]` в `~/.aws/config` перед `region = ru-central1-a`. - * Добавьте `[Yandex]` перед секретной информацией о ключах подключения. -8. [Настроить](https://cloud.yandex.com/ru/docs/tutorials/infrastructure-management/terraform-quickstart#configure-provider) Yandex Cloud Terraform провайдера. -9. Скачать данный репозиторий командой `git clone https://github.com/ydb-platform/ydb-terraform.git`. -10. Перейти в директорию `yandex_cloud` (директория в скаченном репозитории) и внести изменения в следующие переменные, в файле `variables.tf`: - * `key_path` – путь к сгенерированному SA ключу с помощью CLI. - * `cloud_id` – ID облака. Можно получить список доступных облаков командой `yc resource-manager cloud list`. - * `profile` – название профиля из файла `~/.aws/config`. - * `folder_id` – ID Cloud folder. Можно получить командой `yc resource-manager folder list`. - -Теперь, находясь в директории `yandex_cloud`, можно выполните команду `terraform init` для установки провайдера и инициализации модулей. Далее нужно выполнить серию команд: -* `terraform plan` – создание плана будущей инфраструктуры. -* `terraform init` (повторный вызов) – создание ресурсов в облаке. \ No newline at end of file diff --git a/ydb/docs/ru/core/sre/ansible/index.md b/ydb/docs/ru/core/sre/ansible/index.md deleted file mode 100644 index 45c5772ff3c2..000000000000 --- a/ydb/docs/ru/core/sre/ansible/index.md +++ /dev/null @@ -1,8 +0,0 @@ -# Работа с {{ ydb-short-name }} с помощью Ansible - -Этот раздел документации {{ ydb-short-name }} содержит набор статей, предназначенных для работы SRE с кластерами {{ ydb-short-name }} при помощи [Ansible](https://www.ansible.com/). Это рекомендуемый подход к запуску produciton кластеров {{ ydb-short-name }}, если ваша организация ещё не внедрила [Kubernetes](../kubernetes/index.md). - -Ключевые статьи для начала работы с этим разделом: - -* [Первоначальное развертывание](initial-deployment.md) -* [Подготовка виртуальных машин с помощью Terraform](preparing-vms-with-terraform.md) diff --git a/ydb/docs/ru/core/sre/ansible/initial-deployment.md b/ydb/docs/ru/core/sre/ansible/initial-deployment.md deleted file mode 100644 index 04e1dcddec88..000000000000 --- a/ydb/docs/ru/core/sre/ansible/initial-deployment.md +++ /dev/null @@ -1,277 +0,0 @@ -# Развертывание {{ ydb-short-name }} кластера с помощью Ansible - -В инструкции изложен процесс развертывания {{ ydb-short-name }} кластера на группе серверов с помощью Ansible. {{ ydb-short-name }} может быть развернут на любом желаемом количестве серверов, но минимальное количество серверов в кластере не должно быть меньше восемь штук для модели избыточности `block-4-2` и девяти серверов для модели избыточности `mirror-3-dc`. О моделях избыточности можно узнать из статьи [{#T}](../../cluster/topology.md). - -В процессе эксплуатации кластер может быть [расширен](../../maintenance/manual/cluster_expansion.md) без приостановки доступа пользователей к базам данных. - -{% note info %} - -**Рекомендуемые требования к серверам**: -* 16 CPU (рассчитывается исходя из утилизации 8 CPU сторадж нодой и 8 CPU динамической нодой). -* 16 GB RAM (рекомендуемый минимальный объем RAM). -* Дополнительный сетевой SSD-диск размером 120 GB (не может быть меньшего размера – требования инсталляции {{ ydb-short-name }}). -* Доступ по SSH; -* Сетевая связность машин в кластере. -* OS: Ubuntu 18+, Debian 9+. -* Доступ в интернет для обновления репозиториев и скачивания нужных пакетов. - -{% endnote %} - -Скачать репозиторий с плейбуком для установки {{ ydb-short-name }} на кластер можно с GitHub – `git clone https://github.com/ydb-platform/ydb-ansible-examples.git`. Этот репозиторий содержит: шаблоны установки {{ ydb-short-name }} на кластер из восьми серверов – `8-nodes-block-4-2`и девяти серверов – `9-nodes-mirror-3-dc`, а также скрипты для генерации TLS-сертификатов и файлы requirements для установки необходимых Python пакетов. - -{% cut "Структура репозитория" %} - -{% include [repo-tree](./_includes/repo-tree.md) %} - -{% endcut %} - -Для работы с проектом на локальной (промежуточной или инсталляционной) машине понадобится: Python 3 версии 3.10+ и Ansible core не ниже версии 2.15.2. Ansible можно установить и запустить глобально (устанавливается в систему) или в виртуальном окружении. Если Ansible уже установлен – можно переходить к шагу [«Настройка Ansible проекта»](#ansible-project-setup), если Ansible ещё не установлен, установите его одним из предложенных способов: - -{% list tabs %} - -- Установка Ansible в систему (глобально) - - * Обновите список пакетов apt репозитория – `sudo apt update`. - * Обновите пакеты – `sudo apt upgrade`. - * Установите пакет `software-properties-common` для управления источниками программного обеспечения вашего дистрибутива – `sudo apt install software-properties-common`. - * Добавьте новый PPA в apt – `sudo add-apt-repository --yes --update ppa:ansible/ansible`. - * Установите Ansible – `sudo apt install ansible-core`. - * Проверьте версию Ansible core – `ansible --version` - -- Установка Ansible в виртуальное окружение Python - - * Обновите список пакетов apt репозитория – `sudo apt update`. - * Установите пакет `venv` для Python3 – `sudo apt install python3-venv` - * Создайте директорию, где будет создано виртуальное окружение и куда будут скачены плейбуки. Например, `mkdir ydb-install-ansible`. - * Перейдите в созданную директорию и создайте виртуальное окружение – `sudo python3 -m venv ydb-ansible`. - * Активируйте виртуальное окружение – `source venv/bin/activate`. В дальнейшем все действия по работе с Ansible выполняются внутри виртуального окружения. Выйти из него можно командой `deactivate`. - * Установите Ansible рекомендуемой версии с помощью команды `pip install -r requirements.txt`, находясь в корневой директории скаченного репозитория. - * Проверьте версию Ansible core – `ansible --version` - -{% endlist %} - - -## Настройка Ansible проекта { #ansible-project-setup } - -Перейдите в корневую директорию скаченного репозитория и выполните команду `ansible-galaxy install -r requirements.yaml` – будут скачены Ansible коллекции `ydb_platform.ydb` и `community.general`, которые содержат роли и плагины для установки {{ ydb-short-name }}. - -[Скачайте](../../downloads/index.md#ydb-server) архив актуальной версию {{ ydb-short-name }} в корневую директорию проекта. Например, с помощью wget: `wget https://binaries.ydb.tech/release/23.3.17/ydbd-23.3.17-linux-amd64.tar.gz` и скопируйте сюда же приватную часть SSH-ключа для доступа к серверам кластера {{ ydb-short-name }}. На SSH-ключе должны быть установлены следующие права: -```text --rw------- (600) #Только владелец имеет разрешение на чтение и запись. -``` -Установить нужные права можно командой `sudo chmod 600 `. - -Далее можно перейти в директорию TLS и указать в файле `ydb-ca-nodes.txt` список FQDN серверов, для которых будут сгенерированы TLS сертификаты. По умолчанию список выглядит следующим образом: -```text -static-node-1 static-node-1.ydb-cluster.com -static-node-2 static-node-2.ydb-cluster.com -static-node-3 static-node-3.ydb-cluster.com -static-node-4 static-node-4.ydb-cluster.com -static-node-5 static-node-5.ydb-cluster.com -static-node-6 static-node-6.ydb-cluster.com -static-node-7 static-node-7.ydb-cluster.com -static-node-8 static-node-8.ydb-cluster.com -static-node-9 static-node-9.ydb-cluster.com -``` - -Сгенерировать набор TLS сертификатов, который будут размещены в поддиректории CA (`TLS/CA/certs/`) можно скриптом `ydb-ca-update.sh`. - -После генерации TLS сертификатов, установки Ansible коллекций, загрузки приватной части ssh-ключа и скачивания актуальной версии {{ ydb-short-name }} необходимо обновить инвентаризационные файлы в соответствии с выбранным видом кластера для развертывания. - -### Изменения инвентаризационных файлов проекта { #inventory-edit } - -Вне зависимости от вида создаваемого кластера (восемь серверов – `8-nodes-block-4-2` или девять серверов – `9-nodes-mirror-3-dc`) основные параметра установки и настройки {{ ydb-short-name }} содержатся в инвентаризационном файле `50-inventory.yaml`, который расположен в директории `/inventory/`. - -В инвентаризационном файле `50-inventory.yaml` нужно указать актуальный список FQDN серверов, на которые будет установлена {{ ydb-short-name }}. По умолчанию список выглядит следующим образом: - ```yaml - all: - children: - ydb: - hosts: - static-node-1.ydb-cluster.com: - static-node-2.ydb-cluster.com: - static-node-3.ydb-cluster.com: - static-node-4.ydb-cluster.com: - static-node-5.ydb-cluster.com: - static-node-6.ydb-cluster.com: - static-node-7.ydb-cluster.com: - static-node-8.ydb-cluster.com: - static-node-9.ydb-cluster.com: - ``` - -Далее нужно внести следующие изменения в раздел `vars` инвентаризационного файла: - * `ansible_user` – укажите пользователь для подключения Ansible по SSH. - * `ansible_ssh_common_args: "-o ProxyJump=@"` – опция для подключения Ansible к серверу по IP, с которого будет устанавливаться {{ ydb-short-name }} (включая ProxyJump сервер). Используется при установки {{ ydb-short-name }} с локальной машины, не входящей в приватную DNS-зону. - * `ansible_ssh_private_key_file` – измените дефолтное название ssh-ключа, на актуальное: `"../"`. - * `ydb_tls_dir` – укажите актуальную часть пути (`/files/CA/certs/`) к сертификатам безопасности после их генерации скриптом `ydb-ca-update.sh`. - * `ydb_brokers` – укажите список FQDN нод брокеров. Например: - ```yaml - ydb_brokers: - - static-node-1.ydb-cluster.com - - static-node-2.ydb-cluster.com - - static-node-3.ydb-cluster.com - ``` - * `ydb_cores_static` – задайте количество ядер CPU, потребляемое статической нодой; - * `ydb_cores_dynamic` – задайте количество ядер CPU, потребляемое динамической нодой; - -Значение переменной `ydb_database_groups` в разделе `vars` имеет фиксированное значение, которое привязано к типу избыточности и не зависит от размера кластера: -* Для типа избыточности `block-4-2` значение `ydb_database_groups` равно семи. -* Для типа избыточности `mirror-3-dc` значение `ydb_database_groups` равно восьми. - - -Значение переменных `system_timezone` и `system_ntp_servers` зависит от свойств инфраструктуры, на которой развертывается YDB кластер. По умолчанию в `system_ntp_servers` указан набор NTP-серверов без учёта географического расположения инфраструктуры, на которой будет развертываться YDB кластер. Мы настоятельно рекомендуем использовать локальный NTP-сервер для on-premise инфраструктуры и следующие NTP-серверы для облачных провайдеров: - -{% list tabs %} - -- Yandex Cloud - * `system_timezone`: Europe/Moscow - * `system_ntp_servers`: [0.ru.pool.ntp.org, 1.ru.pool.ntp.org, ntp0.NL.net, ntp2.vniiftri.ru, ntp.ix.ru, ntps1-1.cs.tu-berlin.de] [Подробнее](https://cloud.yandex.ru/ru/docs/tutorials/infrastructure-management/ntp) о настройках NTP-серверов Yandex Cloud. - -- AWS - * `system_timezone`: USA/ - * `system_ntp_servers`: [169.254.169.123, time.aws.com] [Подробнее](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/set-time.html#configure-time-sync) о настройках NTP-серверов AWS. - -- Azure - * О том как настраивается синхронизация времени на виртуальных машинах Azure можно прочесть в [данной](https://learn.microsoft.com/en-us/azure/virtual-machines/linux/time-sync) статье. - -- Alibaba - * Cпецифика подключения к NTP-серверам в Alibaba описана в этой [статье](https://www.alibabacloud.com/help/en/ecs/user-guide/alibaba-cloud-ntp-server). - -{% endlist %} - -Изменения других секций конфигурационного файла `50-inventory.yaml` не требуется. Далее можно изменить стандартный пароль root пользователя YDB, который содержится в зашифрованном инвентаризационном файле `99-inventory-vault.yaml` и файле `ansible_vault_password_file.txt`. Для изменения пароля – укажите новый пароль в файле `ansible_vault_password_file.txt` и продублируйте его в файле `99-inventory-vault.yaml` в формате: - ```yaml - all: - children: - ydb: - vars: - ydb_password: - ``` - -Для шифрования `99-inventory-vault.yaml` выполните команду `ansible-vault encrypt inventory/99-inventory-vault.yaml`. - -После изменения инвентаризационных файлов можно переходить к подготовке конфигурационного файла {{ ydb-short-name }}. - -### Подготовка конфигурационного файла {{ ydb-short-name }} { #ydb-config-prepare } - -Конфигурационный файл {{ ydb-short-name }} – содержит настройки нод {{ ydb-short-name }} и располагается в поддиректории `/files/config.yaml`. С подробным описанием секций настройки конфигурационного файла {{ ydb-short-name }} можно ознакомиться в стать [{#T}](../../deploy/configuration/config.md). - -Дефолтный конфигурационный файл {{ ydb-short-name }} уже содержит почти все необходимые настройки для развертывания кластера. Необходимо заменить стандартные FQDN хостов на актуальные FQDN в разделе `hosts` и `blob_storage_config`: -* Раздел `hosts`: - ```yaml - ... - hosts: - - host: static-node-1.ydb-cluster.com #FQDN ВМ - host_config_id: 1 - walle_location: - body: 1 - data_center: 'zone-a' - rack: '1' - ... - ``` -* Раздел `blob_storage_config`: - ```yaml - ... - - fail_domains: - - vdisk_locations: - - node_id: static-node-1.ydb-cluster.com #FQDN ВМ - pdisk_category: SSD - path: /dev/disk/by-partlabel/ydb_disk_1 - ... - ``` - -Остальные секции и настройки конфигурационного файла остаются без изменений. - - -## Развертывания кластера {{ ydb-short-name }} { #erasure-setup } - -{% note info %} - -Минимальное количество серверов в кластере {{ ydb-short-name }} – восемь серверов для модели избыточности `block-4-2` и девять серверов для модели избыточности `mirror-3-dc`. - -{% endnote %} - -[Репозиторий](https://github.com/ydb-platform/ydb-ansible-examples) содержит два готовых набора шаблонов для развертывания {{ ydb-short-name }} кластера из восьми (модель избыточности `block-4-2`) и девяти серверов (`mirror-3-dc`). Любой из предложенных вариантов может быть масштабирован на любое нужное количество серверов с учётом ряда технических требований. - -Для подготовки собственного шаблона можно воспользоваться следующей инструкцией: -1. Создайте копию директории с готовым примером (`9-nodes-mirror-3-dc` или `8-nodes-block-4-2`). -2. Укажите FQDN серверов в файле `TLS/ydb-ca-nodes.txt` и выполните скрипт `ydb-ca-update.sh` для генерации наборов TLS сертификатов. -3. Внесите изменения в инвентаризационные файлы шаблона в соответствии с [инструкцией](#inventory-edit). -4. Внесите изменения в конфигурационный файл {{ ydb-short-name }} в соответствии с [инструкцией](#ydb-config-prepare). -5. Выполните команду `ansible-playbook setup_playbook.yaml`, находясь в директории клонированного шаблона. - -## План выполнения сценария установки {{ ydb-short-name }} { #ydb-playbook-run } - -Последовательность выполнение ролей и их краткое описание: -1. Роль `packages` настраивает репозитории, управляет предпочтениями и конфигурациями APT, а также исправляет неконфигурированные пакеты и устанавливает необходимые программные пакеты в зависимости от версии дистрибутива. -2. Роль `system` устанавливает системные настройки, включая конфигурацию часов и временной зоны, синхронизацию времени через NTP с помощью `systemd-timesyncd`, настройку `systemd-journald` для управления журналами, конфигурацию загрузки модулей ядра и оптимизацию параметров ядра через `sysctl`, а также настройку производительности процессора с использованием `cpufrequtils`. -3. Роль `ydb` выполняет задачи по проверке необходимых переменных, установке базовых компонентов и зависимостей, настройке системных пользователей и групп, развертыванию и конфигурированию {{ ydb-short-name }}, включая управление сертификатами TLS и обновление конфигурационных файлов. -4. Роль `ydb-static` отвечает за подготовку и запуск статических нод {{ ydb-short-name }}, включая проверку необходимых переменных и секретов, форматирование и подготовку дисков, создание и запуск `systemd unit` для узла хранения, а также инициализацию хранилища и управление доступом к базе данных. -5. Роль `ydb-dynamic` настраивает и управляет динамическими узлами {{ ydb-short-name }}, включая проверку необходимых переменных, создание конфигурационных файлов и `systemd unit` файлов для каждого динамического узла, запуск этих узлов, получение токена для доступа к {{ ydb-short-name }}, создание базы данных в {{ ydb-short-name }}. - -{% cut "Подробное пошаговое описание установки {{ ydb-short-name }}" %} - -{% include [ansible-install-steps](./_includes/ansible-install-steps.md) %} - -{% endcut %} - -В результате выполнения плейбука будет создан кластер {{ ydb-short-name }}, на котором развернута тестовая база данных – `database`, создан `root` пользователь с максимальными правами доступа и запущен Embedded UI на порту 8765. Для подключения к Embedded UI можно настроить SSH-туннелирование. Для этого на локальной машине выполните команду `ssh -L 8765:localhost:8765 -i @`. После успешной установки соединения можно перейти по URL [localhost:8765](http://localhost:8765): - -![ydb-web-ui](../../_assets/ydb-web-console.png) - -## Мониторинг состояния кластера { #troubleshooting } - -После успешного создания кластера {{ ydb-short-name }} проверить его состояние с помощью Embedded UI – [http://localhost:8765/monitoring/cluster/tenants](http://localhost:8765/monitoring/cluster/tenants): - -![ydb-cluster-check](../../_assets/ydb-cluster-check.png) - -В разделе отражены следующие параметры кластера {{ ydb-short-name }}, которые отражают состояние кластера: -* `Tablets` – список запущенных [таблеток](../../concepts/cluster/common_scheme_ydb.md#tablets). Все индикаторы состояния таблеток должны быть зеленого цвета; -* `Nodes` – количество и состояние запущенных статических и динамических нод в кластере. Индикатор состояния нод должен быть зеленым, а пропорция созданных и запущенных нод должна быть равной. Например, 27/27 для кластера из девяти нод. -Индикаторы показателей `Load` (количество используемой RAM) и `Storage` (количество используемого дискового пространства) должны быть зелеными. - -Проверь состояние сторадж группы можно в разделе `storage` – [http://localhost:8765/monitoring/cluster/storage](http://localhost:8765/monitoring/cluster/storage): - -![ydb-storage-gr-check](../../_assets/ydb-storage-gr-check.png) - -Индикаторы `VDisks` должны быть зелеными, а статус `state` (находится в сплывающей подсказке при наведении на индикатор Vdisk) должен быть `Ok`. Подробнее о показателях состояния кластера и мониторинге можно прочитать в статье [{#T}](../../maintenance/embedded_monitoring/ydb_monitoring.md). - -## Тестирование кластера { #testing } - -Протестировать кластер можно с помощью встроенных в YDB CLI нагрузочных тестов. Для этого скачайте на машину, на которой установлен Ansible, YDB CLI версии [2.5.0](https://storage.yandexcloud.net/yandexcloud-ydb/release/2.5.0/linux/amd64/ydb). Например, с помощью wget: `wget https://storage.yandexcloud.net/yandexcloud-ydb/release/2.5.0/linux/amd64/ydb`. - -Сделайте скаченный бинарный файл исполняемым – `chmod +x ydb` и создайте [профиль](../../reference/ydb-cli/profile/index.md) подключения к YDB: -```shell -./ydb \ -config profile create \ --d /Root/database \ --e grpcs://< FQDN node >:2135 \ ---ca-file /CA/certs/ca.crt \ ---user root \ ---password-file /ansible_vault_password_file -``` - -Параметры команды и их значения: -* `config profile create` – команда создания профиля подключения. Задаётся имя профиля. Более детальную информацию, о том как создавать и изменять профили можно найти в статье [{#T}](../../reference/ydb-cli/profile/create.md). -* `-e` – эндпоинт (endpoint) - строка в формате `protocol://host:port`. Можно указать FQDN любой ноды кластера и не указывать порт. По умолчанию будет использован 2135 порт. -* `--ca-file` – путь к корневому сертификату для подключения к базе по `grpcs`. Сертификат создаётся скриптом `ydb-ca-update.sh` в директории `TLS` и располагается по пути `TLS/CA/certs/` относительно корня репозитория ydb-ansible-examples. -* `--user` – пользователь для подключения к БД. По умолчанию при выполнении `setup_playbook.yaml` плейбука создаётся пользователь root. -* `--password-file` – путь к файлу с паролем. В каждой папке с шаблоном развертывания YDB кластера находится файл `ansible_vault_password_file`, который содержит пароль пользователя `root`. - -Проверить создался ли профиль можно командой `./ydb config profile list` – будет выведен список профилей. После создания профиля, его нужно активировать командой `./ydb config profile activate `. Проверить, что профиль был активирован можно повторным выполнением команды `./ydb config profile list` – активный профиль будет иметь отметку (active). - -Теперь можно выполнить YQL запрос `./ydb yql -s 'select 1;'`, который вернет в терминал результат выполнения команды `select 1` в табличной форме. После проверки соединения можно создать тестовую таблицу командой: -`./ydb workload kv init --init-upserts 1000 --cols 4`. Будет создана тестовая таблица `kv_test`, состоящая из 4 столбцов и 1000 строк. Проверь, что таблица `kv_test` создалась и заполнилась тестовыми данными, можно командой `./ydb yql -s 'select * from kv_test limit 10;'`. - -В терминал будет выведена таблица из 10 строк. Теперь можно выполнять тестирование производительности кластера. В статье [{#T}](../../reference/ydb-cli/workload-kv.md) описаны 5 видов нагрузок (`upsert`, `insert`, `select`, `read-rows`, `mixed`) и параметры их выполнения. Пример выполнения тестовой нагрузки `upsert` с параметром вывода времени выполнения запроса `--print-timestamp` и стандартными параметрами исполнения: `./ydb workload kv run upsert --print-timestamp`. - -В терминал будет выведен отчёт следующего вида: -``` -Window Txs/Sec Retries Errors p50(ms) p95(ms) p99(ms) pMax(ms) Timestamp -1 727 0 0 11 27 71 116 2024-02-14T12:56:39Z -2 882 0 0 10 21 29 38 2024-02-14T12:56:40Z -3 848 0 0 10 22 30 105 2024-02-14T12:56:41Z -... -``` - -После завершения тестов удалить таблицу `kv_test` можно командой: `./ydb workload kv clean`. Подробнее об опциях создания тестовой таблицы и тестах можно прочесть в статье [{#T}](../../reference/ydb-cli/workload-kv.md). \ No newline at end of file diff --git a/ydb/docs/ru/core/sre/ansible/preparing-vms-with-terraform.md b/ydb/docs/ru/core/sre/ansible/preparing-vms-with-terraform.md deleted file mode 100644 index e1d489a85745..000000000000 --- a/ydb/docs/ru/core/sre/ansible/preparing-vms-with-terraform.md +++ /dev/null @@ -1,141 +0,0 @@ -# Разворачивание инфраструктуры для кластера {{ ydb-short-name }} с помощью Terraform - -Существует три рекомендованных способа разворачивать кластера {{ ydb-short-name }} для production использования: c помощью [Ansible](initial-deployment.md), [Kubernetes](../kubernetes/initial-deployment.md) или [вручную](../../deploy/index.md). Если вариант с Kubernetes практически самодостаточен, то для вариантов с Ansible и вручную для старта нужен ssh доступ на необходимое количество правильно сконфигурированных серверов или виртуальных машин. В данной статье описывается как можно создать и сконфигурировать необходимый для кластера {{ ydb-short-name }} набор виртуальных машин в различных облачных провайдерах. - -**[Terraform](https://www.terraform.io/)** – это программное обеспечение с открытым исходным кодом для управления инфраструктурой по модели "инфраструктура как код" (Infrastructure as Code). Такой же подход используется в Ansible, в системе управления конфигурациями. Terraform и Ansible работают на разных уровнях: Terraform управляет инфраструктурой, а Ansible настраивает окружения на ВМ: - -![AiC_scheme](./_assets/terraform/AiC_scheme.png) - -Конфигурация настройки окружения ВМ описывается в YAML формате, а инфраструктурный код пишется на [HCL](https://github.com/hashicorp/hcl) (язык конфигурации Terraform). Основной логической единицей записи в HCL является "блок". Блок состоит из ключевого слова, идентифицирующего его тип, названия и фигурных скобок, обозначающих тело блока. Например, так может выглядеть блок управления виртуальным сервером в AWS: -```hcl -resource "aws_instance" "ydb-vm" { - count = var.instance_count - ami = "ami-008fe2fc65df48dac" - instance_type = "t2.micro" - key_name = var.req_key_pair - vpc_security_group_ids = [var.input_security_group_id] - subnet_id = element(var.input_subnet_ids, count.index % length(var.input_subnet_ids)) - - tags = { - Name = "ydb-node-${count.index +1}" - Username = "ubuntu" - } - -} -``` - -Блоки могут располагаться друг за другом в одном файле и быть независимыми, могут ссылать друг на друга и быть зависимыми, а также могут вкладываться друг в друга. - -Основные типы блоков: -* `resource` – блок инициализация ресурса инфраструктуры (ВМ, сеть, подсеть, диск, DNS-зона и т.д.); -* `provider` – блок инициализация провайдера, версии API и данных для аутентификации; -* `variable` – переменная как со значением по умолчанию, так и пустая для хранения данных, введенных пользователем или переданных другими блоками; -* `output` – вывод данных в терминал и сохранение в переменной; -* `data` – переменная для запроса данных от внешних облачных ресурсов, не представленных в создаваемой инфраструктуре; -* `module` – логическая группировка ресурсов, которые можно переиспользовать несколько раз в рамках одного или разных проектов; -* `terraform` – блок настройки поведения самого Terraform, включая версию Terraform и используемых провайдеров, а также настройки бэкенда, который используется для хранения состояния Terraform. - -Блоки записываются в файлы с расширением `.tf` и логически группируются в директориях, которые в терминологии Terraform называют модулями. Модуль обычно состоит из следующих файлов: -* `main.tf` – основной файл, в котором находится код инфраструктуры. Может быть несколько файлов, содержащих инфраструктурный код. -* `variables.tf` – локальные переменные модуля, которые принимают данные от других модулей или имеют дефолтные значения. -* `outputs.tf` – переменные, которые содержат результаты работы ресурса (IP адреса ВМ, ID сетей/подсетей и т.д). - -Модули подключаются к проекту в корневом файле `main.tf` следующим образом: -``` -module "vpc" { - source = "./modules/vpc" - subnets_count = var.subnets_count - subnets_availability_zones = var.availability_zones -} -``` -В примере подключается модуль `vpc` (имя модуля назначается при подключении). Обязательный параметр – это `source` – путь к директории, где располагается модуль. `subnets_count` и `subnets_availability_zones` – это переменные внутри модуля `vpc`, которые принимают значения из переменных глобального уровня `var.subnets_count`, `var.availability_zones`. - -Модули так же как и блоки располагаются друг за другом в корневом `main.tf` проекта. Основное преимущество модульного подхода организации проекта – возможность легко управлять логически связанными наборами ресурсов. Поэтому наш [репозиторий](https://github.com/ydb-platform/ydb-terraform) с готовыми Terraform сценариями организован следующим образом: -```txt -. -├── README.md -├── README_RU.md -├── aws -│   ├── README.md -│   ├── README_RU.md -│   ├── main.tf -│   ├── modules -│   │   ├── dns -│   │   ├── eip -│   │   ├── instance -│   │   ├── key_pair -│   │   ├── security -│   │   └── vpc -│   └── variables.tf -├── azure -│   ├── README.md -│   ├── README_RU.md -│   ├── main.tf -│   ├── modules -│   │   ├── dns -│   │   ├── resource_group -│   │   ├── security -│   │   ├── vm -│   │   └── vpc -│   └── variables.tf -├── ... -``` - -Поддиректории содержат два `readme`, файл `variables.td` с локальными переменными модуля и основной файл `main.tf`, который подключает модули из поддиректории `modules`. Набор модулей зависит от облачного провайдера. Базовые модули, функционально одинаковые для всех провайдеров имеют одинаковые названия: -* `vpc` – модуль управления облачной сетью и подсетями. -* `dns` – модуль управления DNS-зоной и DNS-записями. -* `security` – модуль управления группами безопасности. -* `instance` – модуль управления ВМ. - -Для того, чтобы воспользоваться готовыми Terraform сценариями из репозитория, нужно скачать репозиторий командой `git clone https://github.com/ydb-platform/ydb-terraform.git`, внести изменения в конфигурационный файл Terraform `~/.terraformrc`, задать актуальные значения глобальных переменных сценария и скачать CLI того облачного провайдера, где будет создана инфраструктура. - -Если вы планируете использовать несколько провайдеров, можно добавить следующий код в `~/.terraformrc`, который установит пути скачивания для всех провайдеров описанных ниже: -``` -provider_installation { - network_mirror { - url = "https://terraform-mirror.yandexcloud.net/" - include = ["registry.terraform.io/*/*"] - } - direct { - exclude = ["registry.terraform.io/*/*"] - exclude = ["terraform.storage.ydb.tech/*/*"] - } - - filesystem_mirror { - path = "/Applications/ - } - } -``` - -Если уже используются Terraform провайдеры, представленные в [официальном репозитории](https://registry.terraform.io/browse/providers), они продолжат работать. - -Далее приведены пошаговые инструкции создания инфраструктуры в [AWS](#aws-cluster), [Azure](#aws-cluster), [GCP](#gcp-cluster), [Yandex Cloud](#gcp-cluster). Предложенные Terraform сценарии развертывают однотипную инфраструктуру: - -В инфраструктуру входят: -* Девять виртуальных ВМ (16 CPU, 32 GB RAM, дополнительный диск на 200 GB). -* Облачная сеть и три подсети (по подсети на зону доступности). -* Приватная DNS-зона. -* Группы безопасности, разрешающие трафик на портах: 22, icmp, 8765. - -Большинство параметров кластера регулируется (количество ВМ, объём и тип подключаемого диска, количество сетей, домен DNS-зоны и т.д.), однако обратите внимание на то, что есть рекомендуемые значения параметров кластера, которые уже определены как дефолтные значения. Их изменения в меньшую сторону может привести кластер в нерабочее состояние. Такими рекомендуемыми значениями параметров кластера являются: -* Количество ядер CPU. Минимальное рекомендуемое количество ядер CPU – 16 штук. -* Размер RAM. Минимальный рекомендуемый объём RAM – 32 GB. -* Объём присоединенного диска. Минимальный рекомендуемый объём присоединенного диска – 200 GB. - -## Создание инфраструктуры в AWS для развертывания {{ ydb-short-name }} кластера {#aws-cluster} - -{% include [aws](./_includes/terraform/aws.md) %} - -## Создание инфраструктуры в Azure для развертывания {{ ydb-short-name }} кластера {#azure-cluster} - -{% include [azure](./_includes/terraform/azure.md) %} - -## Создание инфраструктуры в Google Cloud Platform для развертывания {{ ydb-short-name }} кластера {#gcp-cluster} - -{% include [gcp](./_includes/terraform/gcp.md) %} - -## Создание инфраструктуры в Yandex Cloud для развертывания {{ ydb-short-name }} кластера {#yc-cluster} - -{% include [yc](./_includes/terraform/yc.md) %} - -С помощью Yandex Cloud провайдера можно не только создавать инфраструктуру для дальнейшего развертывания на ней YDB кластера с помощью [Ansible](./initial-deployment.md), но и управлять [serverless или dedicated](https://cloud.yandex.ru/ru/services/ydb) версией YDB прямо из Terraform. О возможностях работы с YDB в Yandex Cloud читайте в разделе [Работа с YDB через Terraform](https://cloud.yandex.ru/ru/docs/ydb/terraform/intro) документации Yandex Cloud. diff --git a/ydb/docs/ru/core/sre/ansible/toc_p.yaml b/ydb/docs/ru/core/sre/ansible/toc_p.yaml deleted file mode 100644 index 3d19c2b59864..000000000000 --- a/ydb/docs/ru/core/sre/ansible/toc_p.yaml +++ /dev/null @@ -1,7 +0,0 @@ -items: -- name: Обзор - href: index.md -- name: Изначальное развёртывание - href: initial-deployment.md -- name: Подготовка виртуальных машин с Terraform - href: preparing-vms-with-terraform.md \ No newline at end of file From a9ef769c1709de0f128c4383d4589f823dd6641f Mon Sep 17 00:00:00 2001 From: Ivan Blinkov Date: Mon, 1 Apr 2024 15:07:01 +0700 Subject: [PATCH 04/13] move backup-and-recovery to dba + rewrite intro --- .../_includes/backup_and_recovery/cli_overlay.md | 0 .../_includes/backup_and_recovery/options_overlay.md | 0 .../_includes/backup_and_recovery/others_overlay.md | 0 ydb/docs/en/core/dba/_includes/cloud_remark.md | 2 -- .../backup-and-recovery.md} | 0 ydb/docs/en/core/dba/index.md | 9 +++------ ydb/docs/en/core/dba/toc_i.yaml | 2 +- ydb/docs/redirects.yaml | 3 ++- .../_includes/backup_and_recovery/cli_overlay.md | 0 .../_includes/backup_and_recovery/options_overlay.md | 0 .../_includes/backup_and_recovery/others_overlay.md | 0 ydb/docs/ru/core/dba/_includes/cloud_remark.md | 1 - .../backup-and-recovery.md} | 0 ydb/docs/ru/core/dba/index.md | 8 +++----- ydb/docs/ru/core/dba/toc_i.yaml | 2 +- ydb/docs/ru/core/toc_i.yaml | 2 +- 16 files changed, 11 insertions(+), 18 deletions(-) rename ydb/docs/en/core/{maintenance => dba}/_includes/backup_and_recovery/cli_overlay.md (100%) rename ydb/docs/en/core/{maintenance => dba}/_includes/backup_and_recovery/options_overlay.md (100%) rename ydb/docs/en/core/{maintenance => dba}/_includes/backup_and_recovery/others_overlay.md (100%) delete mode 100644 ydb/docs/en/core/dba/_includes/cloud_remark.md rename ydb/docs/en/core/{maintenance/backup_and_recovery.md => dba/backup-and-recovery.md} (100%) rename ydb/docs/ru/core/{maintenance => dba}/_includes/backup_and_recovery/cli_overlay.md (100%) rename ydb/docs/ru/core/{maintenance => dba}/_includes/backup_and_recovery/options_overlay.md (100%) rename ydb/docs/ru/core/{maintenance => dba}/_includes/backup_and_recovery/others_overlay.md (100%) delete mode 100644 ydb/docs/ru/core/dba/_includes/cloud_remark.md rename ydb/docs/ru/core/{maintenance/backup_and_recovery.md => dba/backup-and-recovery.md} (100%) diff --git a/ydb/docs/en/core/maintenance/_includes/backup_and_recovery/cli_overlay.md b/ydb/docs/en/core/dba/_includes/backup_and_recovery/cli_overlay.md similarity index 100% rename from ydb/docs/en/core/maintenance/_includes/backup_and_recovery/cli_overlay.md rename to ydb/docs/en/core/dba/_includes/backup_and_recovery/cli_overlay.md diff --git a/ydb/docs/en/core/maintenance/_includes/backup_and_recovery/options_overlay.md b/ydb/docs/en/core/dba/_includes/backup_and_recovery/options_overlay.md similarity index 100% rename from ydb/docs/en/core/maintenance/_includes/backup_and_recovery/options_overlay.md rename to ydb/docs/en/core/dba/_includes/backup_and_recovery/options_overlay.md diff --git a/ydb/docs/en/core/maintenance/_includes/backup_and_recovery/others_overlay.md b/ydb/docs/en/core/dba/_includes/backup_and_recovery/others_overlay.md similarity index 100% rename from ydb/docs/en/core/maintenance/_includes/backup_and_recovery/others_overlay.md rename to ydb/docs/en/core/dba/_includes/backup_and_recovery/others_overlay.md diff --git a/ydb/docs/en/core/dba/_includes/cloud_remark.md b/ydb/docs/en/core/dba/_includes/cloud_remark.md deleted file mode 100644 index b56e3099144b..000000000000 --- a/ydb/docs/en/core/dba/_includes/cloud_remark.md +++ /dev/null @@ -1,2 +0,0 @@ -YDB cloud services provide self-service tools for creating, modifying, and deleting databases. Documentation for these features is available as part of the documentation for the respective cloud services. - diff --git a/ydb/docs/en/core/maintenance/backup_and_recovery.md b/ydb/docs/en/core/dba/backup-and-recovery.md similarity index 100% rename from ydb/docs/en/core/maintenance/backup_and_recovery.md rename to ydb/docs/en/core/dba/backup-and-recovery.md diff --git a/ydb/docs/en/core/dba/index.md b/ydb/docs/en/core/dba/index.md index 395e7166132b..ad46b4a88b3c 100644 --- a/ydb/docs/en/core/dba/index.md +++ b/ydb/docs/en/core/dba/index.md @@ -1,8 +1,5 @@ -# Managing databases +# {{ ydb-short-name }} for Database Administrators (DBA) -This section contains articles describing YDB tools for database management and maintenance intended for SREs and application developers and administrators. - -{% include [cloud_remark.md](_includes/cloud_remark.md) %} - -In YDB non-cloud configurations, the operations for creating, modifying, and deleting databases are run by cluster administrators. For operation descriptions, see [Managing a cluster](../cluster/index.md). +This section of {{ ydb-short-name }} documentation covers everything you need to know to properly manage contents of {{ ydb-short-name}} databases: [tables](../concepts/datamodel/table.md), [topics](../concepts/topic.md), and other entities. +The creation and management of databases are out of the scope of this section because in {{ ydb-short-name }} clusters these operations are either [executed by DevOps Engineers](../devops/index.md) or automated externally if you are using a managed service. \ No newline at end of file diff --git a/ydb/docs/en/core/dba/toc_i.yaml b/ydb/docs/en/core/dba/toc_i.yaml index 0657e8201adf..a3a3954e6bb5 100644 --- a/ydb/docs/en/core/dba/toc_i.yaml +++ b/ydb/docs/en/core/dba/toc_i.yaml @@ -1,6 +1,6 @@ items: - name: Backup and recovery - href: ../maintenance/backup_and_recovery.md + href: backup-and-recovery.md - name: Diagnostics hidden: true include: { mode: link, path: ../troubleshooting/toc_p.yaml } diff --git a/ydb/docs/redirects.yaml b/ydb/docs/redirects.yaml index fe0d88c333d2..eaefff1618fb 100644 --- a/ydb/docs/redirects.yaml +++ b/ydb/docs/redirects.yaml @@ -39,9 +39,10 @@ common: to: /yql/reference/index.md # Redirects from db to dba - - from: /db/index.md to: /dba/index.md + - from: /maintenance/backup_and_recovery.md + to: /dba/backup-and-recovery.md # Redirects from development to contributor - from: /development/build-ya.md diff --git a/ydb/docs/ru/core/maintenance/_includes/backup_and_recovery/cli_overlay.md b/ydb/docs/ru/core/dba/_includes/backup_and_recovery/cli_overlay.md similarity index 100% rename from ydb/docs/ru/core/maintenance/_includes/backup_and_recovery/cli_overlay.md rename to ydb/docs/ru/core/dba/_includes/backup_and_recovery/cli_overlay.md diff --git a/ydb/docs/ru/core/maintenance/_includes/backup_and_recovery/options_overlay.md b/ydb/docs/ru/core/dba/_includes/backup_and_recovery/options_overlay.md similarity index 100% rename from ydb/docs/ru/core/maintenance/_includes/backup_and_recovery/options_overlay.md rename to ydb/docs/ru/core/dba/_includes/backup_and_recovery/options_overlay.md diff --git a/ydb/docs/ru/core/maintenance/_includes/backup_and_recovery/others_overlay.md b/ydb/docs/ru/core/dba/_includes/backup_and_recovery/others_overlay.md similarity index 100% rename from ydb/docs/ru/core/maintenance/_includes/backup_and_recovery/others_overlay.md rename to ydb/docs/ru/core/dba/_includes/backup_and_recovery/others_overlay.md diff --git a/ydb/docs/ru/core/dba/_includes/cloud_remark.md b/ydb/docs/ru/core/dba/_includes/cloud_remark.md deleted file mode 100644 index 173c7ae74ed8..000000000000 --- a/ydb/docs/ru/core/dba/_includes/cloud_remark.md +++ /dev/null @@ -1 +0,0 @@ -Облачные сервисы YDB предоставляют инструменты самообслуживания, позволяющие создавать, изменять и удалять базы данных. Документация по этим функциям доступна в составе документации таких облачных сервисов. diff --git a/ydb/docs/ru/core/maintenance/backup_and_recovery.md b/ydb/docs/ru/core/dba/backup-and-recovery.md similarity index 100% rename from ydb/docs/ru/core/maintenance/backup_and_recovery.md rename to ydb/docs/ru/core/dba/backup-and-recovery.md diff --git a/ydb/docs/ru/core/dba/index.md b/ydb/docs/ru/core/dba/index.md index 1228210d3985..0d7b2b8911c5 100644 --- a/ydb/docs/ru/core/dba/index.md +++ b/ydb/docs/ru/core/dba/index.md @@ -1,7 +1,5 @@ -# Управление базами данных +# {{ ydb-short-name }} для администраторов баз данных (DBA) -В данном разделе находятся статьи для разработчиков приложений, SRE и администраторов приложений, описывающие инструменты YDB по управлению базами данных и их обслуживанию. +Этот раздел документации {{ ydb-short-name }} содержит всё, что вам нужно знать для управления содержимым баз данных {{ ydb-short-name}}: [таблицами](../concepts/datamodel/table.md), [топиками](../concepts/topic.md) и других сущностями. -{% include [cloud_remark.md](_includes/cloud_remark.md) %} - -В необлачных конфигурациях YDB операции создания, модификации и удаления баз данных выполняются администраторами кластеров и описаны в разделе [Управление кластером](../cluster/index.md). +Создание самих баз данных и управление ими выходит за рамки данного раздела, поскольку в кластерах {{ ydb-short-name }} эти операции либо [выполняются DevOps-инженерами] (../devops/index.md), либо автоматизированы извне, если вы используете управляемый сервис. \ No newline at end of file diff --git a/ydb/docs/ru/core/dba/toc_i.yaml b/ydb/docs/ru/core/dba/toc_i.yaml index ba73e7c9b355..83a5dc9ccd8a 100644 --- a/ydb/docs/ru/core/dba/toc_i.yaml +++ b/ydb/docs/ru/core/dba/toc_i.yaml @@ -1,6 +1,6 @@ items: - name: Резервное копирование и восстановление - href: ../maintenance/backup_and_recovery.md + href: backup-and-recovery.md - name: Диагностика hidden: true include: { mode: link, path: ../troubleshooting/toc_p.yaml } diff --git a/ydb/docs/ru/core/toc_i.yaml b/ydb/docs/ru/core/toc_i.yaml index 226df42a4d21..2bb5c8fcd1d8 100644 --- a/ydb/docs/ru/core/toc_i.yaml +++ b/ydb/docs/ru/core/toc_i.yaml @@ -11,7 +11,7 @@ items: include: mode: link path: devops/toc_p.yaml -- name: For DBA +- name: Для DBA include: mode: link path: dba/toc_p.yaml From ce85beb2bca0ef78a6b6b8d2c079a46a303d0871 Mon Sep 17 00:00:00 2001 From: Ivan Blinkov Date: Mon, 1 Apr 2024 15:49:16 +0700 Subject: [PATCH 05/13] move system_views_db to dba/ --- .../en/core/concepts/_includes/scan_query.md | 2 +- ydb/docs/en/core/dba/index.md | 5 +- ydb/docs/en/core/dba/system-views.md | 303 ++++++++++++++++++ ydb/docs/en/core/dba/toc_i.yaml | 7 +- .../_includes/system_views/intro_db.md | 14 - .../_includes/system_views/partitions.md | 6 - .../system_views/partitions_example_yql.md | 24 -- .../system_views/partitions_header.md | 37 --- .../_includes/system_views/query_metrics.md | 6 - .../system_views/query_metrics_example_yql.md | 27 -- .../system_views/query_metrics_header.md | 44 --- .../system_views/top-overload-partitions.md | 60 ---- .../_includes/system_views/tops.md | 6 - .../system_views/tops_example_yql.md | 30 -- .../_includes/system_views/tops_header.md | 49 --- .../en/core/troubleshooting/system_views.md | 7 - .../core/troubleshooting/system_views_db.md | 9 - ydb/docs/en/core/troubleshooting/toc_i.yaml | 5 +- ydb/docs/redirects.yaml | 4 + .../ru/core/concepts/_includes/scan_query.md | 2 +- ydb/docs/ru/core/dba/index.md | 6 +- ydb/docs/ru/core/dba/system-views.md | 303 ++++++++++++++++++ ydb/docs/ru/core/dba/toc_i.yaml | 5 +- .../_includes/system_views/intro_db.md | 14 - .../_includes/system_views/partitions.md | 6 - .../system_views/partitions_example_yql.md | 24 -- .../system_views/partitions_header.md | 37 --- .../_includes/system_views/query_metrics.md | 6 - .../system_views/query_metrics_example_yql.md | 27 -- .../system_views/query_metrics_header.md | 44 --- .../system_views/top-overload-partitions.md | 60 ---- .../_includes/system_views/tops.md | 6 - .../system_views/tops_example_yql.md | 30 -- .../_includes/system_views/tops_header.md | 49 --- .../ru/core/troubleshooting/system_views.md | 7 - .../core/troubleshooting/system_views_db.md | 9 - ydb/docs/ru/core/troubleshooting/toc_i.yaml | 6 +- 37 files changed, 627 insertions(+), 659 deletions(-) create mode 100644 ydb/docs/en/core/dba/system-views.md delete mode 100644 ydb/docs/en/core/troubleshooting/_includes/system_views/intro_db.md delete mode 100644 ydb/docs/en/core/troubleshooting/_includes/system_views/partitions.md delete mode 100644 ydb/docs/en/core/troubleshooting/_includes/system_views/partitions_example_yql.md delete mode 100644 ydb/docs/en/core/troubleshooting/_includes/system_views/partitions_header.md delete mode 100644 ydb/docs/en/core/troubleshooting/_includes/system_views/query_metrics.md delete mode 100644 ydb/docs/en/core/troubleshooting/_includes/system_views/query_metrics_example_yql.md delete mode 100644 ydb/docs/en/core/troubleshooting/_includes/system_views/query_metrics_header.md delete mode 100644 ydb/docs/en/core/troubleshooting/_includes/system_views/top-overload-partitions.md delete mode 100644 ydb/docs/en/core/troubleshooting/_includes/system_views/tops.md delete mode 100644 ydb/docs/en/core/troubleshooting/_includes/system_views/tops_example_yql.md delete mode 100644 ydb/docs/en/core/troubleshooting/_includes/system_views/tops_header.md delete mode 100644 ydb/docs/en/core/troubleshooting/system_views.md delete mode 100644 ydb/docs/en/core/troubleshooting/system_views_db.md create mode 100644 ydb/docs/ru/core/dba/system-views.md delete mode 100644 ydb/docs/ru/core/troubleshooting/_includes/system_views/intro_db.md delete mode 100644 ydb/docs/ru/core/troubleshooting/_includes/system_views/partitions.md delete mode 100644 ydb/docs/ru/core/troubleshooting/_includes/system_views/partitions_example_yql.md delete mode 100644 ydb/docs/ru/core/troubleshooting/_includes/system_views/partitions_header.md delete mode 100644 ydb/docs/ru/core/troubleshooting/_includes/system_views/query_metrics.md delete mode 100644 ydb/docs/ru/core/troubleshooting/_includes/system_views/query_metrics_example_yql.md delete mode 100644 ydb/docs/ru/core/troubleshooting/_includes/system_views/query_metrics_header.md delete mode 100644 ydb/docs/ru/core/troubleshooting/_includes/system_views/top-overload-partitions.md delete mode 100644 ydb/docs/ru/core/troubleshooting/_includes/system_views/tops.md delete mode 100644 ydb/docs/ru/core/troubleshooting/_includes/system_views/tops_example_yql.md delete mode 100644 ydb/docs/ru/core/troubleshooting/_includes/system_views/tops_header.md delete mode 100644 ydb/docs/ru/core/troubleshooting/system_views.md delete mode 100644 ydb/docs/ru/core/troubleshooting/system_views_db.md diff --git a/ydb/docs/en/core/concepts/_includes/scan_query.md b/ydb/docs/en/core/concepts/_includes/scan_query.md index b4cba8cc41ca..98fd0080dd6c 100644 --- a/ydb/docs/en/core/concepts/_includes/scan_query.md +++ b/ydb/docs/en/core/concepts/_includes/scan_query.md @@ -11,7 +11,7 @@ This method of executing queries has the following unique features: {% node info %} -From the *Scan Queries* interface, you can query [system tables](../../troubleshooting/system_views_db.md). +From the *Scan Queries* interface, you can query [system tables](../../dba/system-views.md). {% endnote %} diff --git a/ydb/docs/en/core/dba/index.md b/ydb/docs/en/core/dba/index.md index ad46b4a88b3c..f72dbeec13b3 100644 --- a/ydb/docs/en/core/dba/index.md +++ b/ydb/docs/en/core/dba/index.md @@ -2,4 +2,7 @@ This section of {{ ydb-short-name }} documentation covers everything you need to know to properly manage contents of {{ ydb-short-name}} databases: [tables](../concepts/datamodel/table.md), [topics](../concepts/topic.md), and other entities. -The creation and management of databases are out of the scope of this section because in {{ ydb-short-name }} clusters these operations are either [executed by DevOps Engineers](../devops/index.md) or automated externally if you are using a managed service. \ No newline at end of file +The creation and management of databases are out of the scope of this section because in {{ ydb-short-name }} clusters these operations are either [executed by DevOps Engineers](../devops/index.md) or automated externally if you are using a managed service. + +- [Backup and recovery](backup-and-recovery.md) +- [Database system views](system-views.md) \ No newline at end of file diff --git a/ydb/docs/en/core/dba/system-views.md b/ydb/docs/en/core/dba/system-views.md new file mode 100644 index 000000000000..d2eca07c2b5a --- /dev/null +++ b/ydb/docs/en/core/dba/system-views.md @@ -0,0 +1,303 @@ +# Database system views + +You can make queries to special service tables (system views) to monitor the DB status. These tables are accessible from the root of the database tree and use the `.sys` system path prefix. + +You can find the corresponding table's primary key field index in the descriptions of available fields below. + +DB system views contain: + +* [Details of individual DB table partitions](#partitions). +* [Top queries by certain characteristics](#top-queries). +* [Query details](#query-metrics). +* [History of overloaded partitions](#top-overload-partitions). + +{% note info %} + +Loads caused by accessing system views are more analytical in nature. Making frequent queries to them in large DBs will consume a lot of system resources. The recommended load is no more than 1-2 RPS. + +{% endnote %} + +## Partitions {#partitions} + +The following system view stores detailed information about individual [partitions](../concepts/datamodel/table.md#partitioning) of all DB tables: + +* `partition_stats`: Contains information about instant metrics and cumulative operation counters. Instant metrics are, for example, CPU load or count of in-flight [transactions](../concepts/transactions.md). Cumulative counters, for example, count the total number of rows read. + +The system view is designed to detect various irregularities in the load on a table partition or show the size of table partition data. + +Cumulative fields (`RowReads`, `RowUpdates`, and so on) store the accumulated values since the last start of the tablet serving the partition. + +Table structure: + +| Field | Description | +--- | --- +| `OwnerId` | ID of the SchemeShard serving the table.
Type: `Uint64`.
Key: `0`. | +| `PathId` | ID of the SchemeShard path.
Type: `Uint64`.
Key: `1`. | +| `PartIdx` | Partition sequence number.
Type: `Uint64`.
Key: `2`. | +| `DataSize` | Approximate partition size in bytes.
Type: `Uint64`. | +| `RowCount` | Approximate number of rows.
Type: `Uint64`. | +| `IndexSize` | Partition index size in a tablet.
Type: `Uint64`. | +| `CPUCores` | Double Instant value of load per partition (CPU share) | +| `TabletId` | ID of the tablet serving the partition.
Type: `Uint64`. | +| `Path` | Full path to the table.
Type: `Utf8`. | +| `NodeId` | ID of the node that the partition is being served on.
Type: `Uint32`. | +| `StartTime` | Last time when the tablet serving the partition was started.
Type: `Timestamp`. | +| `AccessTime` | Last time when data from the partition was read.
Type: `Timestamp`. | +| `UpdateTime` | Last time when data was written to the partition.
Type: `Timestamp`. | +| `RowReads` | Number of point reads since the start of the partition tablet.
Type: `Uint64`. | +| `RowUpdates` | Number of rows written since the start.
Type: `Uint64`. | +| `RowDeletes` | Number of rows deleted since the start.
Type: `Uint64`. | +| `RangeReads` | Number of row range reads since the start.
Type: `Uint64`. | +| `RangeReadRows` | Number of rows read in the ranges since the start.
Type: `Uint64`. | +| `InFlightTxCount` | Number of in-flight transactions.
Type: `Uint64`. | +| `ImmediateTxCompleted` | Number of one-shard transactions completed since the start.
Type: `Uint64`. | +| `CoordinatedTxCompleted` | Number of coordinated transactions completed since the start.
Type: `Uint64`. | +| `TxRejectedByOverload` | Number of transactions rejected due to overload (since the start).
Type: `Uint64`. | +| `TxRejectedByOutOfStorage` | Number of transactions rejected due to lack of storage space (since the start).
Type: `Uint64`. | + +### Example queries + +Top 5 of most loaded partitions among all DB tables: + +```sql +SELECT + Path, + PartIdx, + CPUCores +FROM `.sys/partition_stats` +ORDER BY CPUCores DESC +LIMIT 5 +``` + +List of DB tables with in-flight sizes and loads: + +```sql +SELECT + Path, + COUNT(*) as Partitions, + SUM(RowCount) as Rows, + SUM(DataSize) as Size, + SUM(CPUCores) as CPU +FROM `.sys/partition_stats` +GROUP BY Path +``` + +## Top queries {#top-queries} + +The following system views store data for analyzing the flow of user queries: + +* `top_queries_by_duration_one_minute`: Data is split into one-minute intervals, contains Top 5 queries with the maximum total execution time for the last 6 hours. +* `top_queries_by_duration_one_hour`: Data is split into one-hour intervals, contains Top 5 queries with the maximum total execution time for the last 2 weeks. +* `top_queries_by_read_bytes_one_minute`: Data is split into one-minute intervals, contains Top 5 queries with the maximum number of bytes read from the table for the last 6 hours. +* `top_queries_by_read_bytes_one_hour`: Data is split into one-hour intervals, contains Top 5 queries with the maximum number of bytes read from the table for the last 2 weeks. +* `top_queries_by_cpu_time_one_minute`: Data is split into one-minute intervals, contains Top 5 queries with the maximum CPU time used for the last 6 hours. +* ` top_queries_by_cpu_time_one_hour`: Data is split into one-hour intervals, contains Top 5 queries with the maximum CPU time used for the last 2 weeks. + +Different runs of a query with the same text are deduplicated. The top list contains information about a specific run with the maximum value of the corresponding query metric within a single interval. + +Fields that provide information about the used CPU time (...`CPUTime`) are expressed in microseconds. + +Query text limit is 4 KB. + +All tables have the same set of fields: + +| Field | Description | +--- | --- +| `IntervalEnd` | The end of a one-minute or one-hour interval.
Type: `Timestamp`.
Key: `0`. | +| `Rank` | Rank of a top query.
Type: `Uint32`.
Key: `1`. | +| `QueryText` | Query text.
Type: `Utf8`. | +| `Duration` | Total query execution time.
Type: `Interval`. | +| `EndTime` | Query execution end time.
Type: `Timestamp`. | +| `Type` | Query type (data, scan, or script).
Type: `String`. | +| `ReadRows` | Number of rows read.
Type: `Uint64`. | +| `ReadBytes` | Number of bytes read.
Type: `Uint64`. | +| `UpdateRows` | Number of rows written.
Type: `Uint64`. | +| `UpdateBytes` | Number of bytes written.
Type: `Uint64`. | +| `DeleteRows` | Number of rows deleted.
Type: `Uint64`. | +| `DeleteBytes` | Number of bytes deleted.
Type: `Uint64`. | +| `Partitions` | Number of table partitions used during query execution.
Type: `Uint64`. | +| `UserSID` | User Security ID.
Type: `String`. | +| `ParametersSize` | Size of query parameters in bytes.
Type: `Uint64`. | +| `CompileDuration` | Duration of query compilation.
Type: `Interval`. | +| `FromQueryCache` | Shows whether the cache of prepared queries was used.
Type: `Bool`. | +| `CPUTime` | Total CPU time used to execute the query (microseconds).
Type: `Uint64`. | +| `ShardCount` | Number of shards used during query execution.
Type: `Uint64`. | +| `SumShardCPUTime` | Total CPU time used in shards.
Type: `Uint64`. | +| `MinShardCPUTime` | Minimum CPU time used in shards.
Type: `Uint64`. | +| `MaxShardCPUTime` | Maximum CPU time used in shards.
Type: `Uint64`. | +| `ComputeNodesCount` | Number of compute nodes used during query execution.
Type: `Uint64`. | +| `SumComputeCPUTime` | Total CPU time used in compute nodes.
Type: `Uint64`. | +| `MinComputeCPUTime` | Minimum CPU time used in compute nodes.
Type: `Uint64`. | +| `MaxComputeCPUTime` | Maximum CPU time used in compute nodes.
Type: `Uint64`. | +| `CompileCPUTime` | CPU time used to compile a query.
Type: `Uint64`. | +| `ProcessCPUTime` | CPU time used for overall query handling.
Type: `Uint64`. | + +### Example queries + +Top queries by execution time for the last minute when queries were made: + +```sql +PRAGMA AnsiInForEmptyOrNullableItemsCollections; +$last = ( + SELECT + MAX(IntervalEnd) + FROM `.sys/top_queries_by_duration_one_minute` +); +SELECT + IntervalEnd, + Rank, + QueryText, + Duration +FROM `.sys/top_queries_by_duration_one_minute` +WHERE IntervalEnd IN $last +``` + +Queries that read the most bytes, broken down by minute: + +```sql +SELECT + IntervalEnd, + QueryText, + ReadBytes, + ReadRows, + Partitions +FROM `.sys/top_queries_by_read_bytes_one_minute` +WHERE Rank = 1 +``` + +## Query details {#query-metrics} + +The following system view stores detailed information about queries: + +* `query_metrics_one_minute`: Data is split into one-minute intervals, contains up to 256 queries for the last 6 hours. + +Each table row contains information about a set of queries with identical text that were made during one minute. The table fields provide the minimum, maximum, and total values for each query metric tracked. Within the interval, queries are sorted in descending order of the total CPU time used. + +Restrictions: + +* Query text limit is 4 KB. +* Statistics may be incomplete if the database is under heavy load. + +Table structure: + +| Field | Description | +---|--- +| `IntervalEnd` | The end of a one-minute interval.
Type: `Timestamp`.
Key: `0`. | +| `Rank` | Query rank within an interval (by the SumCPUTime field).
Type: `Uint32`.
Key: `1`. | +| `QueryText` | Query text.
Type: `Utf8`. | +| `Count` | Number of query runs.
Type: `Uint64`. | +| `SumDuration` | Total duration of queries.
Type: `Interval`. | +| `Count` | Number of query runs.
Type: `Uint64`. | +| `SumDuration` | Total duration of queries.
Type: `Interval`. | +| `MinDuration` | Minimum query duration.
Type: `Interval`. | +| `MaxDuration` | Maximum query duration.
Type: `Interval`. | +| `SumCPUTime` | Total CPU time used.
Type: `Uint64`. | +| `MinCPUTime` | Minimum CPU time used.
Type: `Uint64`. | +| `MaxCPUTime` | Maximum CPU time used.
Type: `Uint64`. | +| `SumReadRows` | Total number of rows read.
Type: `Uint64`. | +| `MinReadRows` | Minimum number of rows read.
Type: `Uint64`. | +| `MaxReadRows` | Maximum number of rows read.
Type: `Uint64`. | +| `SumReadBytes` | Total number of bytes read.
Type: `Uint64`. | +| `MinReadBytes` | Minimum number of bytes read.
Type: `Uint64`. | +| `MaxReadBytes` | Maximum number of bytes read.
Type: `Uint64`. | +| `SumUpdateRows` | Total number of rows written.
Type: `Uint64`. | +| `MinUpdateRows` | Minimum number of rows written.
Type: `Uint64`. | +| `MaxUpdateRows` | Maximum number of rows written.
Type: `Uint64`. | +| `SumUpdateBytes` | Total number of bytes written.
Type: `Uint64`. | +| `MinUpdateBytes` | Minimum number of bytes written.
Type: `Uint64`. | +| `MaxUpdateBytes` | Maximum number of bytes written.
Type: `Uint64`. | +| `SumDeleteRows` | Total number of rows deleted.
Type: `Uint64`. | +| `MinDeleteRows` | Minimum number of rows deleted.
Type: `Uint64`. | +| `MaxDeleteRows` | Maximum number of rows deleted.
Type: `Uint64`. | + + +### Example queries + +Top 10 queries for the last 6 hours by the total number of rows updated per minute: + +```sql +SELECT + SumUpdateRows, + Count, + QueryText, + IntervalEnd +FROM `.sys/query_metrics_one_minute` +ORDER BY SumUpdateRows DESC LIMIT 10 +``` + +Recent queries that read the most bytes per minute: + +```sql +SELECT + IntervalEnd, + SumReadBytes, + MinReadBytes, + SumReadBytes / Count as AvgReadBytes, + MaxReadBytes, + QueryText +FROM `.sys/query_metrics_one_minute` +WHERE SumReadBytes > 0 +ORDER BY IntervalEnd DESC, SumReadBytes DESC +LIMIT 100 +``` + +## History of overloaded partitions {#top-overload-partitions} + +The following system views (tables) store the history of points in time when the load on individual DB table partitions was high: + +* `top_partitions_one_minute`: The data is split into one-minute intervals, contains the history for the last 6 hours. +* `top_partitions_one_hour`: The data is split into one-hour intervals, contains the history for the last 2 weeks. + +These tables contain partitions with peak loads of more than 70% (`CPUCores` > 0.7). Partitions within a single interval are ranked by peak load value. + +Both tables have the same set of fields: + +| Field | Description | +--- | --- +| `IntervalEnd` | The end of a one-minute or one-hour interval.
Type: `Timestamp`.
Key: `0`. | +| `Rank` | Partition rank within an interval (by CPUCores).
Type: `Uint32`.
Key: `1`. | +| `TabletId` | ID of the tablet serving the partition.
Type: `Uint64`. | +| `Path` | Full path to the table.
Type: `Utf8`. | +| `PeakTime` | Peak time within an interval.
Type: `Timestamp`. | +| `CPUCores` | Peak load per partition (CPU share).
Type: `Double`. | +| `NodeId` | ID of the node where the partition was located during the peak load.
Type: `Uint32`. | +| `DataSize` | Approximate partition size, in bytes, during the peak load.
Type: `Uint64`. | +| `RowCount` | Approximate row count during the peak load.
Type: `Uint64`. | +| `IndexSize` | Partition index size per tablet during the peak load.
Type: `Uint64`. | +| `InFlightTxCount` | The number of in-flight transactions during the peak load.
Type: `Uint32`. | + +### Example queries + +The following query returns partitions with CPU usage of more than 70% in the specified interval, with tablet IDs and sizes as of the time when the percentage was exceeded. The query is made to the `.sys/top_partitions_one_minute` table with data over the last six hours split into one-minute intervals: + +```sql +SELECT + IntervalEnd, + CPUCores, + Path, + TabletId, + DataSize +FROM `.sys/top_partitions_one_minute` +WHERE CPUCores > 0.7 +AND IntervalEnd BETWEEN Timestamp("YYYY-MM-DDThh:mm:ss.uuuuuuZ") AND Timestamp("YYYY-MM-DDThh:mm:ss.uuuuuuZ") +ORDER BY IntervalEnd desc, CPUCores desc +``` + +* `"YYYY-MM-DDTHH:MM:SS.UUUUUUZ"`: Time in the UTC 0 zone (`YYYY` stands for year, `MM`, for month, `DD`, for date, `hh`, for hours, `mm`, for minutes, `ss`, for seconds, and `uuuuuu`, for microseconds). For example, `"2023-01-26T13:00:00.000000Z"`. + +The following query returns partitions with CPU usage of over 90% in the specified interval, with tablet IDs and sizes as of the time when the percentage was exceeded. The query is made to the `.sys/top_partitions_one_hour` table with data over the last two weeks split into one-hour intervals: + +```sql +SELECT + IntervalEnd, + CPUCores, + Path, + TabletId, + DataSize +FROM `.sys/top_partitions_one_hour` +WHERE CPUCores > 0.9 +AND IntervalEnd BETWEEN Timestamp("YYYY-MM-DDThh:mm:ss.uuuuuuZ") AND Timestamp("YYYY-MM-DDThh:mm:ss.uuuuuuZ") +ORDER BY IntervalEnd desc, CPUCores desc +``` + +* `"YYYY-MM-DDTHH:MM:SS.UUUUUUZ"`: Time in the UTC 0 zone (`YYYY` stands for year, `MM`, for month, `DD`, for date, `hh`, for hours, `mm`, for minutes, `ss`, for seconds, and `uuuuuu`, for microseconds). For example, `"2023-01-26T13:00:00.000000Z"`. diff --git a/ydb/docs/en/core/dba/toc_i.yaml b/ydb/docs/en/core/dba/toc_i.yaml index a3a3954e6bb5..56be0e676091 100644 --- a/ydb/docs/en/core/dba/toc_i.yaml +++ b/ydb/docs/en/core/dba/toc_i.yaml @@ -1,8 +1,5 @@ items: - name: Backup and recovery href: backup-and-recovery.md -- name: Diagnostics - hidden: true - include: { mode: link, path: ../troubleshooting/toc_p.yaml } -- name: DB system views - href: ../troubleshooting/system_views_db.md +- name: System views + href: system-views.md diff --git a/ydb/docs/en/core/troubleshooting/_includes/system_views/intro_db.md b/ydb/docs/en/core/troubleshooting/_includes/system_views/intro_db.md deleted file mode 100644 index eaf9f9093057..000000000000 --- a/ydb/docs/en/core/troubleshooting/_includes/system_views/intro_db.md +++ /dev/null @@ -1,14 +0,0 @@ -# Database system views - -You can make queries to special service tables (system views) to monitor the DB status. These tables are accessible from the root of the database tree and use the `.sys` system path prefix. - -You can find the corresponding table's primary key field index in the descriptions of available fields below. - -DB system views contain: - -* [Details of individual DB table partitions](#partitions). -* [Top queries by certain characteristics](#top-queries). -* [Query details](#query-metrics). -* [History of overloaded partitions](#top-overload-partitions). - -{% include [notes](notes.md) %} diff --git a/ydb/docs/en/core/troubleshooting/_includes/system_views/partitions.md b/ydb/docs/en/core/troubleshooting/_includes/system_views/partitions.md deleted file mode 100644 index df3c85f771cb..000000000000 --- a/ydb/docs/en/core/troubleshooting/_includes/system_views/partitions.md +++ /dev/null @@ -1,6 +0,0 @@ -{% include [header.md](partitions_header.md) %} - -Examples: - -{% include [example_yql](partitions_example_yql.md) %} - diff --git a/ydb/docs/en/core/troubleshooting/_includes/system_views/partitions_example_yql.md b/ydb/docs/en/core/troubleshooting/_includes/system_views/partitions_example_yql.md deleted file mode 100644 index c703e8b226ba..000000000000 --- a/ydb/docs/en/core/troubleshooting/_includes/system_views/partitions_example_yql.md +++ /dev/null @@ -1,24 +0,0 @@ -Top 5 of most loaded partitions among all DB tables: - -> ```sql -> SELECT -> Path, -> PartIdx, -> CPUCores -> FROM `.sys/partition_stats` -> ORDER BY CPUCores DESC -> LIMIT 5 -> ``` - -List of DB tables with in-flight sizes and loads: - -> ```sql -> SELECT -> Path, -> COUNT(*) as Partitions, -> SUM(RowCount) as Rows, -> SUM(DataSize) as Size, -> SUM(CPUCores) as CPU -> FROM `.sys/partition_stats` -> GROUP BY Path -> ``` diff --git a/ydb/docs/en/core/troubleshooting/_includes/system_views/partitions_header.md b/ydb/docs/en/core/troubleshooting/_includes/system_views/partitions_header.md deleted file mode 100644 index bc6d74116c07..000000000000 --- a/ydb/docs/en/core/troubleshooting/_includes/system_views/partitions_header.md +++ /dev/null @@ -1,37 +0,0 @@ -## Partitions {#partitions} - -The following system view stores detailed information about individual [partitions](../../../concepts/datamodel/table.md#partitioning) of all DB tables: - -* `partition_stats`: Contains information about instant metrics and cumulative operation counters. Instant metrics are, for example, CPU load or count of in-flight [transactions](../../../concepts/transactions.md). Cumulative counters, for example, count the total number of rows read. - -The system view is designed to detect various irregularities in the load on a table partition or show the size of table partition data. - -Cumulative fields (`RowReads`, `RowUpdates`, and so on) store the accumulated values since the last start of the tablet serving the partition. - -Table structure: - -| Field | Description | ---- | --- -| `OwnerId` | ID of the SchemeShard serving the table.
Type: `Uint64`.
Key: `0`. | -| `PathId` | ID of the SchemeShard path.
Type: `Uint64`.
Key: `1`. | -| `PartIdx` | Partition sequence number.
Type: `Uint64`.
Key: `2`. | -| `DataSize` | Approximate partition size in bytes.
Type: `Uint64`. | -| `RowCount` | Approximate number of rows.
Type: `Uint64`. | -| `IndexSize` | Partition index size in a tablet.
Type: `Uint64`. | -| `CPUCores` | Double Instant value of load per partition (CPU share) | -| `TabletId` | ID of the tablet serving the partition.
Type: `Uint64`. | -| `Path` | Full path to the table.
Type: `Utf8`. | -| `NodeId` | ID of the node that the partition is being served on.
Type: `Uint32`. | -| `StartTime` | Last time when the tablet serving the partition was started.
Type: `Timestamp`. | -| `AccessTime` | Last time when data from the partition was read.
Type: `Timestamp`. | -| `UpdateTime` | Last time when data was written to the partition.
Type: `Timestamp`. | -| `RowReads` | Number of point reads since the start of the partition tablet.
Type: `Uint64`. | -| `RowUpdates` | Number of rows written since the start.
Type: `Uint64`. | -| `RowDeletes` | Number of rows deleted since the start.
Type: `Uint64`. | -| `RangeReads` | Number of row range reads since the start.
Type: `Uint64`. | -| `RangeReadRows` | Number of rows read in the ranges since the start.
Type: `Uint64`. | -| `InFlightTxCount` | Number of in-flight transactions.
Type: `Uint64`. | -| `ImmediateTxCompleted` | Number of one-shard transactions completed since the start.
Type: `Uint64`. | -| `CoordinatedTxCompleted` | Number of coordinated transactions completed since the start.
Type: `Uint64`. | -| `TxRejectedByOverload` | Number of transactions rejected due to overload (since the start).
Type: `Uint64`. | -| `TxRejectedByOutOfStorage` | Number of transactions rejected due to lack of storage space (since the start).
Type: `Uint64`. | diff --git a/ydb/docs/en/core/troubleshooting/_includes/system_views/query_metrics.md b/ydb/docs/en/core/troubleshooting/_includes/system_views/query_metrics.md deleted file mode 100644 index e2fc18f71584..000000000000 --- a/ydb/docs/en/core/troubleshooting/_includes/system_views/query_metrics.md +++ /dev/null @@ -1,6 +0,0 @@ -{% include [header.md](query_metrics_header.md) %} - -Examples: - -{% include [example_yql](query_metrics_example_yql.md) %} - diff --git a/ydb/docs/en/core/troubleshooting/_includes/system_views/query_metrics_example_yql.md b/ydb/docs/en/core/troubleshooting/_includes/system_views/query_metrics_example_yql.md deleted file mode 100644 index af2330e85f43..000000000000 --- a/ydb/docs/en/core/troubleshooting/_includes/system_views/query_metrics_example_yql.md +++ /dev/null @@ -1,27 +0,0 @@ -Top 10 queries for the last 6 hours by the total number of rows updated per minute: - -> ```sql -> SELECT -> SumUpdateRows, -> Count, -> QueryText, -> IntervalEnd -> FROM `.sys/query_metrics_one_minute` -> ORDER BY SumUpdateRows DESC LIMIT 10 -> ``` - -Recent queries that read the most bytes per minute: - -> ```sql -> SELECT -> IntervalEnd, -> SumReadBytes, -> MinReadBytes, -> SumReadBytes / Count as AvgReadBytes, -> MaxReadBytes, -> QueryText -> FROM `.sys/query_metrics_one_minute` -> WHERE SumReadBytes > 0 -> ORDER BY IntervalEnd DESC, SumReadBytes DESC -> LIMIT 100 -> ``` diff --git a/ydb/docs/en/core/troubleshooting/_includes/system_views/query_metrics_header.md b/ydb/docs/en/core/troubleshooting/_includes/system_views/query_metrics_header.md deleted file mode 100644 index 58b0fac22486..000000000000 --- a/ydb/docs/en/core/troubleshooting/_includes/system_views/query_metrics_header.md +++ /dev/null @@ -1,44 +0,0 @@ -## Query details {#query-metrics} - -The following system view stores detailed information about queries: - -* `query_metrics_one_minute`: Data is split into one-minute intervals, contains up to 256 queries for the last 6 hours. - -Each table row contains information about a set of queries with identical text that were made during one minute. The table fields provide the minimum, maximum, and total values for each query metric tracked. Within the interval, queries are sorted in descending order of the total CPU time used. - -Restrictions: - -* Query text limit is 4 KB. -* Statistics may be incomplete if the database is under heavy load. - -Table structure: - -| Field | Description | ----|--- -| `IntervalEnd` | The end of a one-minute interval.
Type: `Timestamp`.
Key: `0`. | -| `Rank` | Query rank within an interval (by the SumCPUTime field).
Type: `Uint32`.
Key: `1`. | -| `QueryText` | Query text.
Type: `Utf8`. | -| `Count` | Number of query runs.
Type: `Uint64`. | -| `SumDuration` | Total duration of queries.
Type: `Interval`. | -| `Count` | Number of query runs.
Type: `Uint64`. | -| `SumDuration` | Total duration of queries.
Type: `Interval`. | -| `MinDuration` | Minimum query duration.
Type: `Interval`. | -| `MaxDuration` | Maximum query duration.
Type: `Interval`. | -| `SumCPUTime` | Total CPU time used.
Type: `Uint64`. | -| `MinCPUTime` | Minimum CPU time used.
Type: `Uint64`. | -| `MaxCPUTime` | Maximum CPU time used.
Type: `Uint64`. | -| `SumReadRows` | Total number of rows read.
Type: `Uint64`. | -| `MinReadRows` | Minimum number of rows read.
Type: `Uint64`. | -| `MaxReadRows` | Maximum number of rows read.
Type: `Uint64`. | -| `SumReadBytes` | Total number of bytes read.
Type: `Uint64`. | -| `MinReadBytes` | Minimum number of bytes read.
Type: `Uint64`. | -| `MaxReadBytes` | Maximum number of bytes read.
Type: `Uint64`. | -| `SumUpdateRows` | Total number of rows written.
Type: `Uint64`. | -| `MinUpdateRows` | Minimum number of rows written.
Type: `Uint64`. | -| `MaxUpdateRows` | Maximum number of rows written.
Type: `Uint64`. | -| `SumUpdateBytes` | Total number of bytes written.
Type: `Uint64`. | -| `MinUpdateBytes` | Minimum number of bytes written.
Type: `Uint64`. | -| `MaxUpdateBytes` | Maximum number of bytes written.
Type: `Uint64`. | -| `SumDeleteRows` | Total number of rows deleted.
Type: `Uint64`. | -| `MinDeleteRows` | Minimum number of rows deleted.
Type: `Uint64`. | -| `MaxDeleteRows` | Maximum number of rows deleted.
Type: `Uint64`. | diff --git a/ydb/docs/en/core/troubleshooting/_includes/system_views/top-overload-partitions.md b/ydb/docs/en/core/troubleshooting/_includes/system_views/top-overload-partitions.md deleted file mode 100644 index d553386fe3b2..000000000000 --- a/ydb/docs/en/core/troubleshooting/_includes/system_views/top-overload-partitions.md +++ /dev/null @@ -1,60 +0,0 @@ -## History of overloaded partitions {#top-overload-partitions} - -The following system views (tables) store the history of points in time when the load on individual DB table partitions was high: - -* `top_partitions_one_minute`: The data is split into one-minute intervals, contains the history for the last 6 hours. -* `top_partitions_one_hour`: The data is split into one-hour intervals, contains the history for the last 2 weeks. - -These tables contain partitions with peak loads of more than 70% (`CPUCores` > 0.7). Partitions within a single interval are ranked by peak load value. - -Both tables have the same set of fields: - -| Field | Description | ---- | --- -| `IntervalEnd` | The end of a one-minute or one-hour interval.
Type: `Timestamp`.
Key: `0`. | -| `Rank` | Partition rank within an interval (by CPUCores).
Type: `Uint32`.
Key: `1`. | -| `TabletId` | ID of the tablet serving the partition.
Type: `Uint64`. | -| `Path` | Full path to the table.
Type: `Utf8`. | -| `PeakTime` | Peak time within an interval.
Type: `Timestamp`. | -| `CPUCores` | Peak load per partition (CPU share).
Type: `Double`. | -| `NodeId` | ID of the node where the partition was located during the peak load.
Type: `Uint32`. | -| `DataSize` | Approximate partition size, in bytes, during the peak load.
Type: `Uint64`. | -| `RowCount` | Approximate row count during the peak load.
Type: `Uint64`. | -| `IndexSize` | Partition index size per tablet during the peak load.
Type: `Uint64`. | -| `InFlightTxCount` | The number of in-flight transactions during the peak load.
Type: `Uint32`. | - -Examples: - -The following query returns partitions with CPU usage of more than 70% in the specified interval, with tablet IDs and sizes as of the time when the percentage was exceeded. The query is made to the `.sys/top_partitions_one_minute` table with data over the last six hours split into one-minute intervals: - -> ```yql -> SELECT -> IntervalEnd, -> CPUCores, -> Path, -> TabletId, -> DataSize -> FROM `.sys/top_partitions_one_minute` -> WHERE CPUCores > 0.7 -> AND IntervalEnd BETWEEN Timestamp("YYYY-MM-DDThh:mm:ss.uuuuuuZ") AND Timestamp("YYYY-MM-DDThh:mm:ss.uuuuuuZ") -> ORDER BY IntervalEnd desc, CPUCores desc -> ``` - -* `"YYYY-MM-DDTHH:MM:SS.UUUUUUZ"`: Time in the UTC 0 zone (`YYYY` stands for year, `MM`, for month, `DD`, for date, `hh`, for hours, `mm`, for minutes, `ss`, for seconds, and `uuuuuu`, for microseconds). For example, `"2023-01-26T13:00:00.000000Z"`. - -The following query returns partitions with CPU usage of over 90% in the specified interval, with tablet IDs and sizes as of the time when the percentage was exceeded. The query is made to the `.sys/top_partitions_one_hour` table with data over the last two weeks split into one-hour intervals: - -> ```yql -> SELECT -> IntervalEnd, -> CPUCores, -> Path, -> TabletId, -> DataSize -> FROM `.sys/top_partitions_one_hour` -> WHERE CPUCores > 0.9 -> AND IntervalEnd BETWEEN Timestamp("YYYY-MM-DDThh:mm:ss.uuuuuuZ") AND Timestamp("YYYY-MM-DDThh:mm:ss.uuuuuuZ") -> ORDER BY IntervalEnd desc, CPUCores desc -> ``` - -* `"YYYY-MM-DDTHH:MM:SS.UUUUUUZ"`: Time in the UTC 0 zone (`YYYY` stands for year, `MM`, for month, `DD`, for date, `hh`, for hours, `mm`, for minutes, `ss`, for seconds, and `uuuuuu`, for microseconds). For example, `"2023-01-26T13:00:00.000000Z"`. diff --git a/ydb/docs/en/core/troubleshooting/_includes/system_views/tops.md b/ydb/docs/en/core/troubleshooting/_includes/system_views/tops.md deleted file mode 100644 index acb4488ba7d7..000000000000 --- a/ydb/docs/en/core/troubleshooting/_includes/system_views/tops.md +++ /dev/null @@ -1,6 +0,0 @@ -{% include [header.md](tops_header.md) %} - -Examples: - -{% include [example_yql.md](tops_example_yql.md) %} - diff --git a/ydb/docs/en/core/troubleshooting/_includes/system_views/tops_example_yql.md b/ydb/docs/en/core/troubleshooting/_includes/system_views/tops_example_yql.md deleted file mode 100644 index 91134b6ab9a2..000000000000 --- a/ydb/docs/en/core/troubleshooting/_includes/system_views/tops_example_yql.md +++ /dev/null @@ -1,30 +0,0 @@ -Top queries by execution time for the last minute when queries were made: - -> ```sql -> PRAGMA AnsiInForEmptyOrNullableItemsCollections; -> $last = ( -> SELECT -> MAX(IntervalEnd) -> FROM `.sys/top_queries_by_duration_one_minute` -> ); -> SELECT -> IntervalEnd, -> Rank, -> QueryText, -> Duration -> FROM `.sys/top_queries_by_duration_one_minute` -> WHERE IntervalEnd IN $last -> ``` - -Queries that read the most bytes, broken down by minute: - -> ```sql -> SELECT -> IntervalEnd, -> QueryText, -> ReadBytes, -> ReadRows, -> Partitions -> FROM `.sys/top_queries_by_read_bytes_one_minute` -> WHERE Rank = 1 -> ``` diff --git a/ydb/docs/en/core/troubleshooting/_includes/system_views/tops_header.md b/ydb/docs/en/core/troubleshooting/_includes/system_views/tops_header.md deleted file mode 100644 index 5bc627f7d64b..000000000000 --- a/ydb/docs/en/core/troubleshooting/_includes/system_views/tops_header.md +++ /dev/null @@ -1,49 +0,0 @@ -## Top queries {#top-queries} - -The following system views store data for analyzing the flow of user queries: - -* `top_queries_by_duration_one_minute`: Data is split into one-minute intervals, contains Top 5 queries with the maximum total execution time for the last 6 hours. -* `top_queries_by_duration_one_hour`: Data is split into one-hour intervals, contains Top 5 queries with the maximum total execution time for the last 2 weeks. -* `top_queries_by_read_bytes_one_minute`: Data is split into one-minute intervals, contains Top 5 queries with the maximum number of bytes read from the table for the last 6 hours. -* `top_queries_by_read_bytes_one_hour`: Data is split into one-hour intervals, contains Top 5 queries with the maximum number of bytes read from the table for the last 2 weeks. -* `top_queries_by_cpu_time_one_minute`: Data is split into one-minute intervals, contains Top 5 queries with the maximum CPU time used for the last 6 hours. -* ` top_queries_by_cpu_time_one_hour`: Data is split into one-hour intervals, contains Top 5 queries with the maximum CPU time used for the last 2 weeks. - -Different runs of a query with the same text are deduplicated. The top list contains information about a specific run with the maximum value of the corresponding query metric within a single interval. - -Fields that provide information about the used CPU time (...`CPUTime`) are expressed in microseconds. - -Query text limit is 4 KB. - -All tables have the same set of fields: - -| Field | Description | ---- | --- -| `IntervalEnd` | The end of a one-minute or one-hour interval.
Type: `Timestamp`.
Key: `0`. | -| `Rank` | Rank of a top query.
Type: `Uint32`.
Key: `1`. | -| `QueryText` | Query text.
Type: `Utf8`. | -| `Duration` | Total query execution time.
Type: `Interval`. | -| `EndTime` | Query execution end time.
Type: `Timestamp`. | -| `Type` | Query type (data, scan, or script).
Type: `String`. | -| `ReadRows` | Number of rows read.
Type: `Uint64`. | -| `ReadBytes` | Number of bytes read.
Type: `Uint64`. | -| `UpdateRows` | Number of rows written.
Type: `Uint64`. | -| `UpdateBytes` | Number of bytes written.
Type: `Uint64`. | -| `DeleteRows` | Number of rows deleted.
Type: `Uint64`. | -| `DeleteBytes` | Number of bytes deleted.
Type: `Uint64`. | -| `Partitions` | Number of table partitions used during query execution.
Type: `Uint64`. | -| `UserSID` | User Security ID.
Type: `String`. | -| `ParametersSize` | Size of query parameters in bytes.
Type: `Uint64`. | -| `CompileDuration` | Duration of query compilation.
Type: `Interval`. | -| `FromQueryCache` | Shows whether the cache of prepared queries was used.
Type: `Bool`. | -| `CPUTime` | Total CPU time used to execute the query (microseconds).
Type: `Uint64`. | -| `ShardCount` | Number of shards used during query execution.
Type: `Uint64`. | -| `SumShardCPUTime` | Total CPU time used in shards.
Type: `Uint64`. | -| `MinShardCPUTime` | Minimum CPU time used in shards.
Type: `Uint64`. | -| `MaxShardCPUTime` | Maximum CPU time used in shards.
Type: `Uint64`. | -| `ComputeNodesCount` | Number of compute nodes used during query execution.
Type: `Uint64`. | -| `SumComputeCPUTime` | Total CPU time used in compute nodes.
Type: `Uint64`. | -| `MinComputeCPUTime` | Minimum CPU time used in compute nodes.
Type: `Uint64`. | -| `MaxComputeCPUTime` | Maximum CPU time used in compute nodes.
Type: `Uint64`. | -| `CompileCPUTime` | CPU time used to compile a query.
Type: `Uint64`. | -| `ProcessCPUTime` | CPU time used for overall query handling.
Type: `Uint64`. | diff --git a/ydb/docs/en/core/troubleshooting/system_views.md b/ydb/docs/en/core/troubleshooting/system_views.md deleted file mode 100644 index a07410916b3a..000000000000 --- a/ydb/docs/en/core/troubleshooting/system_views.md +++ /dev/null @@ -1,7 +0,0 @@ -# System views - -You can find information about system views in the following articles: - -- [Database system tables](system_views_db.md) -- [Cluster system tables](system_views_cluster.md) - diff --git a/ydb/docs/en/core/troubleshooting/system_views_db.md b/ydb/docs/en/core/troubleshooting/system_views_db.md deleted file mode 100644 index 0c8c26a75905..000000000000 --- a/ydb/docs/en/core/troubleshooting/system_views_db.md +++ /dev/null @@ -1,9 +0,0 @@ -{% include [intro.md](_includes/system_views/intro_db.md) %} - -{% include [partitions.md](_includes/system_views/partitions.md) %} - -{% include [tops.md](_includes/system_views/tops.md) %} - -{% include [query_metrics.md](_includes/system_views/query_metrics.md) %} - -{% include [top-overload-partitions.md](_includes/system_views/top-overload-partitions.md) %} diff --git a/ydb/docs/en/core/troubleshooting/toc_i.yaml b/ydb/docs/en/core/troubleshooting/toc_i.yaml index 2639d6c0a583..d01b7fbb1a1a 100644 --- a/ydb/docs/en/core/troubleshooting/toc_i.yaml +++ b/ydb/docs/en/core/troubleshooting/toc_i.yaml @@ -2,7 +2,4 @@ items: - name: System views href: system_views_db.md - name: Monitoring - href: monitoring.md -- name: System views (deprecated) - href: system_views.md - hidden: true \ No newline at end of file + href: monitoring.md \ No newline at end of file diff --git a/ydb/docs/redirects.yaml b/ydb/docs/redirects.yaml index eaefff1618fb..13e9e2880e04 100644 --- a/ydb/docs/redirects.yaml +++ b/ydb/docs/redirects.yaml @@ -43,6 +43,10 @@ common: to: /dba/index.md - from: /maintenance/backup_and_recovery.md to: /dba/backup-and-recovery.md + - from: /troubleshooting/system_views.md + to: /dba/system-views.md + - from: /troubleshooting/system_views_db.md + to: /dba/system-views.md # Redirects from development to contributor - from: /development/build-ya.md diff --git a/ydb/docs/ru/core/concepts/_includes/scan_query.md b/ydb/docs/ru/core/concepts/_includes/scan_query.md index 2c245e2709c8..b11069d1748b 100644 --- a/ydb/docs/ru/core/concepts/_includes/scan_query.md +++ b/ydb/docs/ru/core/concepts/_includes/scan_query.md @@ -11,7 +11,7 @@ {% node info %} -Через интерфейс *Scan Queries* можно выполнять запросы к [системным таблицам](../../troubleshooting/system_views_db.md). +Через интерфейс *Scan Queries* можно выполнять запросы к [системным таблицам](../../dba/system-views.md). {% endnote %} diff --git a/ydb/docs/ru/core/dba/index.md b/ydb/docs/ru/core/dba/index.md index 0d7b2b8911c5..f2c62286b98e 100644 --- a/ydb/docs/ru/core/dba/index.md +++ b/ydb/docs/ru/core/dba/index.md @@ -2,4 +2,8 @@ Этот раздел документации {{ ydb-short-name }} содержит всё, что вам нужно знать для управления содержимым баз данных {{ ydb-short-name}}: [таблицами](../concepts/datamodel/table.md), [топиками](../concepts/topic.md) и других сущностями. -Создание самих баз данных и управление ими выходит за рамки данного раздела, поскольку в кластерах {{ ydb-short-name }} эти операции либо [выполняются DevOps-инженерами] (../devops/index.md), либо автоматизированы извне, если вы используете управляемый сервис. \ No newline at end of file +Создание самих баз данных и управление ими выходит за рамки данного раздела, поскольку в кластерах {{ ydb-short-name }} эти операции либо [выполняются DevOps-инженерами] (../devops/index.md), либо автоматизированы извне, если вы используете управляемый сервис. + +- [Резервное копирование и восстановление](backup-and-recovery.md) +- [Системные таблицы базы данных](system-views.md) +- [Управление {{ ydb-short-name }} с помощью Terraform](terraform.md) \ No newline at end of file diff --git a/ydb/docs/ru/core/dba/system-views.md b/ydb/docs/ru/core/dba/system-views.md new file mode 100644 index 000000000000..396bad1737ef --- /dev/null +++ b/ydb/docs/ru/core/dba/system-views.md @@ -0,0 +1,303 @@ +# Системные таблицы базы данных + +Вы можете отправлять запросы в специальные служебные таблицы (system views), чтобы следить за состоянием базы данных. Эти таблицы доступны из корня дерева базы данных и используют системный префикс пути `.sys`. + +Индекс поля первичного ключа соответствующей таблицы содержится в описаниях доступных полей далее по тексту. + +Системные таблицы содержат: + +* [Детальные данные об отдельных партициях таблиц БД](#partitions). +* [Топы запросов по определенным характеристикам](#top-queries). +* [Подробная информация о запросах](#query-metrics). +* [История перегруженных партиций](#top-overload-partitions). + +{% note info %} + +Обращение к системным таблицам имеет скорее аналитический характер нагрузки. Частое обращение к ним в больших базах будет существенно расходовать системные ресурсы. Рекомендуемая нагрузка не более 1-2 RPS. + +{% endnote %} + +## Партиции {#partitions} + +Следующая системная таблица хранит детализированную информацию об отдельных [партициях](../concepts/datamodel/table.md#partitioning) всех таблиц базы данных: + +* `partition_stats` — cодержит информацию о моментальных метриках и кумулятивные счетчики операций. К первым относятся, например, данные о нагрузке на CPU или количестве выполняемых [транзакций](../concepts/transactions.md). Ко вторым — общее количество прочитанных строк. + +Предназначена для выявления различных неравномерностей в нагрузке на партицию или отображения размера данных в ней. + +Кумулятивные поля (`RowReads`, `RowUpdates` и т.д.) хранят накопленные значения с момента последнего старта таблетки, обслуживающей партицию. + +Структура таблицы: + +Поле | Описание +--- | --- +`OwnerId` | Идентификатор SchemeShard, обслуживающего таблицу.
Тип: `Uint64`.
Ключ: `0`. +`PathId` | Идентификатор пути в SchemeShard.
Тип: `Uint64`.
Ключ: `1`. +`PartIdx` | Порядковый номер партиции.
Тип: `Uint64`.
Ключ: `2`. +`DataSize` | Приблизительный размер партиции в байтах.
Тип: `Uint64`. +`RowCount` | Приблизительное количество строк.
Тип: `Uint64`. +`IndexSize` | Размер индекса партиции в таблетке.
Тип: `Uint64`. +`CPUCores` | Double Моментальное значение нагрузки на партицию (доля ядра) +`TabletId` | Идентификатор таблетки, обслуживающей партицию.
Тип: `Uint64`. +`Path` | Полный путь к таблице.
Тип: `Utf8`. +`NodeId` | Идентификатор ноды, на которой в данный момент обслуживается партиция.
Тип: `Uint32`. +`StartTime` | Последний момент запуска таблетки, обслуживающей партицию.
Тип: `Timestamp`. +`AccessTime` | Последний момент чтения из партиции.
Тип: `Timestamp`. +`UpdateTime` | Последний момент записи в партицию.
Тип: `Timestamp`. +`RowReads` | Количество точечных чтений с момента старта таблетки партиции.
Тип: `Uint64`. +`RowUpdates` | Количество записанных строк с момента старта.
Тип: `Uint64`. +`RowDeletes` | Количество удалённых строк с момента старта.
Тип: `Uint64`. +`RangeReads` | Количество чтений диапазонов строк с момента старта.
Тип: `Uint64`. +`RangeReadRows` | Количество строк, прочитанных в диапазонах с момента старта.
Тип: `Uint64`. +`InFlightTxCount` | Количество транзакций, находящихся в процессе исполнения.
Тип: `Uint64`. +`ImmediateTxCompleted` | Количество завершившихся одношардовых транзакций с момента старта.
Тип: `Uint64`. +`CoordinatedTxCompleted` | Количество завершившихся координируемых транзакций с момента старта.
Тип: `Uint64`. +`TxRejectedByOverload` | Количество транзакций, отменённых по причине слишком высокой нагрузки (с момента старта).
Тип: `Uint64`. +`TxRejectedByOutOfStorage` | Количество транзакций, отменённых из-за нехватки места (с момента старта).
Тип: `Uint64`. + +### Примеры запросов + +Топ-5 самых загруженных партиций среди всех таблиц базы данных: + +```sql +SELECT + Path, + PartIdx, + CPUCores +FROM `.sys/partition_stats` +ORDER BY CPUCores DESC +LIMIT 5 +``` + +Список таблиц базы с размерами и нагрузкой в моменте: + +```sql +SELECT + Path, + COUNT(*) as Partitions, + SUM(RowCount) as Rows, + SUM(DataSize) as Size, + SUM(CPUCores) as CPU +FROM `.sys/partition_stats` +GROUP BY Path +``` +## Топы запросов {#top-queries} + +Следующие системные таблицы хранят данные для анализа потока пользовательских запросов: + +* `top_queries_by_duration_one_minute` — данные разбиты на минутные интервалы, содержит топ-5 запросов с наибольшим полным временем исполнения за последние 6 часов; +* `top_queries_by_duration_one_hour` — данные разбиты на часовые интервалы, содержит топ-5 запросов с наибольшим полным временем исполнения за последние 2 недели; +* `top_queries_by_read_bytes_one_minute` — данные разбиты на минутные интервалы, содержит топ-5 запросов с наибольшим количеством прочитанных из таблицы байт за последние 6 часов; +* `top_queries_by_read_bytes_one_hour` — данные разбиты на часовые интервалы, содержит топ-5 запросов с наибольшим количеством прочитанных из таблицы байт за последние 2 недели; +* `top_queries_by_cpu_time_one_minute` — данные разбиты на минутные интервалы, содержит топ-5 запросов с наибольшим затраченным процессорным временем за последние 6 часов; +* ` top_queries_by_cpu_time_one_hour` — данные разбиты на часовые интервалы, содержит топ-5 запросов с наибольшим затраченным процессорным временем за последние 2 недели. + +Различные запуски запроса с одним и тем же текстом дедуплицируются. Топ содержит информацию о конкретном запуске с максимальным значением соответствующей характеристики запроса в пределах одного временного интервала. + +Поля, предоставляющие информацию о затраченном процессорном времени (...`CPUTime`), выражены в микросекундах. + +Текст запроса ограничен 4 килобайтами. + +Все таблицы содержат одинаковый набор полей: + +Поле | Описание +--- | --- +`IntervalEnd` | Момент закрытия минутного или часового интервала.
Тип: `Timestamp`.
Ключ: `0`. +`Rank` | Ранг запроса в топе.
Тип: `Uint32`.
Ключ: `1`. +`QueryText` | Текст запроса.
Тип: `Utf8`. +`Duration` | Полное время исполнения запроса.
Тип: `Interval`. +`EndTime` | Момент окончания исполнения запроса.
Тип: `Timestamp`. +`Type` | Тип запроса ("data", "scan", "script").
Тип: `String`. +`ReadRows` | Количество прочитанных строк.
Тип: `Uint64`. +`ReadBytes` | Количество прочитанных байт.
Тип: `Uint64`. +`UpdateRows` | Количество записанных строк.
Тип: `Uint64`. +`UpdateBytes` | Количество записанных байт.
Тип: `Uint64`. +`DeleteRows` | Количество удалённых строк.
Тип: `Uint64`. +`DeleteBytes` | Количество удалённых байт.
Тип: `Uint64`. +`Partitions` | Количество партиций таблиц, участвовавших в исполнении запроса.
Тип: `Uint64`. +`UserSID` | Security ID пользователя.
Тип: `String`. +`ParametersSize` | Размер параметров запроса в байтах.
Тип: `Uint64`. +`CompileDuration` | Длительность компиляции запроса.
Тип: `Interval`. +`FromQueryCache` | Использовался ли кэш подготовленных запросов.
Тип: `Bool`. +`CPUTime` | Общее процессорное время, использованное для исполнения запроса (микросекунды).
Тип: `Uint64`. +`ShardCount` | Количество шардов, участвующих в исполнении запроса.
Тип: `Uint64`. +`SumShardCPUTime` | Общее процессорное время, затраченное в шардах.
Тип: `Uint64`. +`MinShardCPUTime` | Минимальное процесорное время, затраченное в шардах.
Тип: `Uint64`. +`MaxShardCPUTime` | Максимальное процессорное время, затраченное в шардах.
Тип: `Uint64`. +`ComputeNodesCount` | Количество вычислительных нод, задействованных в исполнении запроса.
Тип: `Uint64`. +`SumComputeCPUTime` | Общее процессорное время, затраченное в вычислительных нодах.
Тип: `Uint64`. +`MinComputeCPUTime` | Минимальное процессорное время, затраченное в вычислительных нодах.
Тип: `Uint64`. +`MaxComputeCPUTime` | Максимальное процессорное время, затраченное в вычислительных нодах.
Тип: `Uint64`. +`CompileCPUTime` | Процессорное время, затраченное на компиляцию запроса.
Тип: `Uint64`. +`ProcessCPUTime` | Процессорное время, затраченное на общую обработку запроса.
Тип: `Uint64`. + + +### Примеры запросов + +Топ запросов по времени выполнения за последнюю минуту их отправки: + +```sql +PRAGMA AnsiInForEmptyOrNullableItemsCollections; +$last = ( + SELECT + MAX(IntervalEnd) + FROM `.sys/top_queries_by_duration_one_minute` +); +SELECT + IntervalEnd, + Rank, + QueryText, + Duration +FROM `.sys/top_queries_by_duration_one_minute` +WHERE IntervalEnd IN $last +``` + +Запросы, прочитавшие больше всего байт, в разбивке по минутам: + +```sql +SELECT + IntervalEnd, + QueryText, + ReadBytes, + ReadRows, + Partitions +FROM `.sys/top_queries_by_read_bytes_one_minute` +WHERE Rank = 1 +``` + +## Подробная информация о запросах {#query-metrics} + +Следующая системная таблица хранит подробную информацию о запросах: + +* `query_metrics_one_minute` — данные разбиты по минутным интервалам, содержит до 256 запросов за последние 6 часов. + +Каждая строка таблицы содержит информацию о множестве случившихся за интервал запросов с одинаковым текстом. Поля таблицы предоставляют минимальное, максимальное и суммарное значение по каждой отслеживаемой характеристике запроса. В пределах интервала запросы отсортированы по убыванию суммарного потраченного процессорного времени. + +Ограничения: + +* текст запроса ограничен 4 килобайтами; +* статистика может быть неполной, если база испытывает сильную нагрузку. + +Структура таблицы: + +Поле | Описание +---|--- +`IntervalEnd` | Момент закрытия минутного интервала.
Тип: `Timestamp`.
Ключ: `0`. +`Rank` | Ранг запроса в пределах интервала (по полю SumCPUTime).
Тип: `Uint32`.
Ключ: `1`. +`QueryText` | Текст запроса.
Тип: `Utf8`. +`Count` | Количество запусков запроса.
Тип: `Uint64`. +`SumDuration` | Общая длительность запросов.
Тип: `Interval`. +`Count` | Количество запусков запроса.
Тип: `Uint64`. +`SumDuration` | Общая длительность запросов.
Тип: `Interval`. +`MinDuration` | Минимальная длительность запроса.
Тип: `Interval`. +`MaxDuration` | Максимальная длительность запроса.
Тип: `Interval`. +`SumCPUTime` | Общее затраченное процессорное время.
Тип: `Uint64`. +`MinCPUTime` | Минимальное затраченное процессорное время.
Тип: `Uint64`. +`MaxCPUTime` | Максимальное затраченное процессорное время.
Тип: `Uint64`. +`SumReadRows` | Общее количество прочитанных строк.
Тип: `Uint64`. +`MinReadRows` | Минимальное количество прочитанных строк.
Тип: `Uint64`. +`MaxReadRows` | Максимальное количество прочитанных строк.
Тип: `Uint64`. +`SumReadBytes` | Общее количество прочитанных байт.
Тип: `Uint64`. +`MinReadBytes` | Минимальное количество прочитанных байт.
Тип: `Uint64`. +`MaxReadBytes` | Максимальное количество прочитанных байт.
Тип: `Uint64`. +`SumUpdateRows` | Общее количество записанных строк.
Тип: `Uint64`. +`MinUpdateRows` | Минимальное количество записанных строк.
Тип: `Uint64`. +`MaxUpdateRows` | Максимальное количество записанных строк.
Тип: `Uint64`. +`SumUpdateBytes` | Общее количество записанных байт.
Тип: `Uint64`. +`MinUpdateBytes` | Минимальное количество записанных байт.
Тип: `Uint64`. +`MaxUpdateBytes` | Максимальное количество записанных байт.
Тип: `Uint64`. +`SumDeleteRows` | Общее количество удалённых строк.
Тип: `Uint64`. +`MinDeleteRows` | Минимальное количество удалённых строк.
Тип: `Uint64`. +`MaxDeleteRows` | Максимальное количество удалённых строк.
Тип: `Uint64`. + +### Примеры запросов + +Топ-10 запросов за последние 6 часов по общему количеству записанных строк в минутном интервале: + +```sql +SELECT + SumUpdateRows, + Count, + QueryText, + IntervalEnd +FROM `.sys/query_metrics_one_minute` +ORDER BY SumUpdateRows DESC LIMIT 10 +``` + +Недавние запросы, прочитавшие больше всего байт за минуту: + +```sql +SELECT + IntervalEnd, + SumReadBytes, + MinReadBytes, + SumReadBytes / Count as AvgReadBytes, + MaxReadBytes, + QueryText +FROM `.sys/query_metrics_one_minute` +WHERE SumReadBytes > 0 +ORDER BY IntervalEnd DESC, SumReadBytes DESC +LIMIT 100 + +``` +## История перегруженных партиций {#top-overload-partitions} + +Следующие системные таблицы хранят историю моментов высокой нагрузки на отдельные партиции таблиц БД: + +* `top_partitions_one_minute` — данные разбиты на минутные интервалы, содержит историю за последние 6 часов; +* `top_partitions_one_hour` — данные разбиты на часовые интервалы, содержит историю за последние 2 недели. + +В таблицы попадают партиции с пиковой нагрузкой более 70 % (`CPUCores` > 0,7). В пределах одного интервала партиции ранжированы по пиковому значению нагрузки. + +Обе таблицы содержат одинаковый набор полей: + +Поле | Описание +--- | --- +`IntervalEnd` | Момент закрытия минутного или часового интервала.
Тип: `Timestamp`.
Ключ: `0`. +`Rank` | Ранг партиции в пределах интервала (по CPUCores).
Тип: `Uint32`.
Ключ: `1`. +`TabletId` | Идентификатор таблетки, обслуживающей партицию.
Тип: `Uint64`. +`Path` | Полный путь к таблице.
Тип: `Utf8`. +`PeakTime` | Момент пикового значения в пределах интервала.
Тип: `Timestamp`. +`CPUCores` | Пиковое значение нагрузки на партицию (доля ядра).
Тип: `Double`. +`NodeId` | Идентификатор ноды, на которой находилась партиция в момент пика.
Тип: `Uint32`. +`DataSize` | Приблизительный размер партиции в байтах в момент пика.
Тип: `Uint64`. +`RowCount` | Приблизительное количество строк в момент пика.
Тип: `Uint64`. +`IndexSize` | Размер индекса партиции в таблетке в момент пика.
Тип: `Uint64`. +`InFlightTxCount` | Количество транзакций, находящихся в процессе исполнения в момент пика.
Тип: `Uint32`. + +### Примеры запросов + +Следующий запрос выводит партиции с потреблением CPU более 70% в указанном интервале времени, с идентификаторами таблеток и их размерами на момент превышения. Запрос выполняется к таблице `.sys/top_partitions_one_minute`, которая содержит данные за последние 6 часов с разбиением по часовым интервалам: + +```yql +SELECT + IntervalEnd, + CPUCores, + Path, + TabletId, + DataSize +FROM `.sys/top_partitions_one_minute` +WHERE CPUCores > 0.7 +AND IntervalEnd BETWEEN Timestamp("YYYY-MM-DDThh:mm:ss.uuuuuuZ") AND Timestamp("YYYY-MM-DDThh:mm:ss.uuuuuuZ") +ORDER BY IntervalEnd desc, CPUCores desc +``` + +* `"YYYY-MM-DDTHH:MM:SS.UUUUUUZ"` — время в зоне UTC 0 (`YYYY` — год, `MM` — месяц, `DD` — число, `hh` — часы, `mm` — минуты, `ss` — секунды, `uuuuuu` — микросекунды). Например, `"2023-01-26T13:00:00.000000Z"`. + +Следующий запрос выводит партиции с потреблением CPU более 90% в указанном интервале времени, с идентификаторами таблеток и их размерами на момент превышения. Запрос выполняется к таблице `.sys/top_partitions_one_hour`, которая содержит данные за последние 2 недели с разбиением по минутным интервалам: + +```yql +SELECT + IntervalEnd, + CPUCores, + Path, + TabletId, + DataSize +FROM `.sys/top_partitions_one_hour` +WHERE CPUCores > 0.9 +AND IntervalEnd BETWEEN Timestamp("YYYY-MM-DDThh:mm:ss.uuuuuuZ") AND Timestamp("YYYY-MM-DDThh:mm:ss.uuuuuuZ") +ORDER BY IntervalEnd desc, CPUCores desc +``` + +* `"YYYY-MM-DDTHH:MM:SS.UUUUUUZ"` — время в зоне UTC 0 (`YYYY` — год, `MM` — месяц, `DD` — число, `hh` — часы, `mm` — минуты, `ss` — секунды, `uuuuuu` — микросекунды). Например, `"2023-01-26T13:00:00.000000Z"`. + diff --git a/ydb/docs/ru/core/dba/toc_i.yaml b/ydb/docs/ru/core/dba/toc_i.yaml index 83a5dc9ccd8a..ff24a7d2ef86 100644 --- a/ydb/docs/ru/core/dba/toc_i.yaml +++ b/ydb/docs/ru/core/dba/toc_i.yaml @@ -1,10 +1,7 @@ items: - name: Резервное копирование и восстановление href: backup-and-recovery.md -- name: Диагностика - hidden: true - include: { mode: link, path: ../troubleshooting/toc_p.yaml } - name: Системные таблицы БД - href: ../troubleshooting/system_views_db.md + href: system-views.md - name: Terraform href: terraform.md diff --git a/ydb/docs/ru/core/troubleshooting/_includes/system_views/intro_db.md b/ydb/docs/ru/core/troubleshooting/_includes/system_views/intro_db.md deleted file mode 100644 index 5e320902a04f..000000000000 --- a/ydb/docs/ru/core/troubleshooting/_includes/system_views/intro_db.md +++ /dev/null @@ -1,14 +0,0 @@ -# Системные таблицы базы данных - -Вы можете отправлять запросы в специальные служебные таблицы (system views), чтобы следить за состоянием базы данных. Эти таблицы доступны из корня дерева базы данных и используют системный префикс пути `.sys`. - -Индекс поля первичного ключа соответствующей таблицы содержится в описаниях доступных полей далее по тексту. - -Системные таблицы содержат: - -* [Детальные данные об отдельных партициях таблиц БД](#partitions). -* [Топы запросов по определенным характеристикам](#top-queries). -* [Подробная информация о запросах](#query-metrics). -* [История перегруженных партиций](#top-overload-partitions). - -{% include [notes](notes.md) %} diff --git a/ydb/docs/ru/core/troubleshooting/_includes/system_views/partitions.md b/ydb/docs/ru/core/troubleshooting/_includes/system_views/partitions.md deleted file mode 100644 index 513630b06843..000000000000 --- a/ydb/docs/ru/core/troubleshooting/_includes/system_views/partitions.md +++ /dev/null @@ -1,6 +0,0 @@ - -{% include [header.md](partitions_header.md) %} - -Примеры: - -{% include [example_yql](partitions_example_yql.md) %} diff --git a/ydb/docs/ru/core/troubleshooting/_includes/system_views/partitions_example_yql.md b/ydb/docs/ru/core/troubleshooting/_includes/system_views/partitions_example_yql.md deleted file mode 100644 index af8c100f86a0..000000000000 --- a/ydb/docs/ru/core/troubleshooting/_includes/system_views/partitions_example_yql.md +++ /dev/null @@ -1,24 +0,0 @@ - Топ-5 самых загруженных партиций среди всех таблиц базы данных: - - > ```sql - > SELECT - > Path, - > PartIdx, - > CPUCores - > FROM `.sys/partition_stats` - > ORDER BY CPUCores DESC - > LIMIT 5 - > ``` - - Список таблиц базы с размерами и нагрузкой в моменте: - - > ```sql - > SELECT - > Path, - > COUNT(*) as Partitions, - > SUM(RowCount) as Rows, - > SUM(DataSize) as Size, - > SUM(CPUCores) as CPU - > FROM `.sys/partition_stats` - > GROUP BY Path - > ``` \ No newline at end of file diff --git a/ydb/docs/ru/core/troubleshooting/_includes/system_views/partitions_header.md b/ydb/docs/ru/core/troubleshooting/_includes/system_views/partitions_header.md deleted file mode 100644 index 1f653e5f1ca0..000000000000 --- a/ydb/docs/ru/core/troubleshooting/_includes/system_views/partitions_header.md +++ /dev/null @@ -1,37 +0,0 @@ -## Партиции {#partitions} - -Следующая системная таблица хранит детализированную информацию об отдельных [партициях](../../../concepts/datamodel/table.md#partitioning) всех таблиц базы данных: - -* `partition_stats` — cодержит информацию о моментальных метриках и кумулятивные счетчики операций. К первым относятся, например, данные о нагрузке на CPU или количестве выполняемых [транзакций](../../../concepts/transactions.md). Ко вторым — общее количество прочитанных строк. - -Предназначена для выявления различных неравномерностей в нагрузке на партицию или отображения размера данных в ней. - -Кумулятивные поля (`RowReads`, `RowUpdates` и т.д.) хранят накопленные значения с момента последнего старта таблетки, обслуживающей партицию. - -Структура таблицы: - -Поле | Описание ---- | --- -`OwnerId` | Идентификатор SchemeShard, обслуживающего таблицу.
Тип: `Uint64`.
Ключ: `0`. -`PathId` | Идентификатор пути в SchemeShard.
Тип: `Uint64`.
Ключ: `1`. -`PartIdx` | Порядковый номер партиции.
Тип: `Uint64`.
Ключ: `2`. -`DataSize` | Приблизительный размер партиции в байтах.
Тип: `Uint64`. -`RowCount` | Приблизительное количество строк.
Тип: `Uint64`. -`IndexSize` | Размер индекса партиции в таблетке.
Тип: `Uint64`. -`CPUCores` | Double Моментальное значение нагрузки на партицию (доля ядра) -`TabletId` | Идентификатор таблетки, обслуживающей партицию.
Тип: `Uint64`. -`Path` | Полный путь к таблице.
Тип: `Utf8`. -`NodeId` | Идентификатор ноды, на которой в данный момент обслуживается партиция.
Тип: `Uint32`. -`StartTime` | Последний момент запуска таблетки, обслуживающей партицию.
Тип: `Timestamp`. -`AccessTime` | Последний момент чтения из партиции.
Тип: `Timestamp`. -`UpdateTime` | Последний момент записи в партицию.
Тип: `Timestamp`. -`RowReads` | Количество точечных чтений с момента старта таблетки партиции.
Тип: `Uint64`. -`RowUpdates` | Количество записанных строк с момента старта.
Тип: `Uint64`. -`RowDeletes` | Количество удалённых строк с момента старта.
Тип: `Uint64`. -`RangeReads` | Количество чтений диапазонов строк с момента старта.
Тип: `Uint64`. -`RangeReadRows` | Количество строк, прочитанных в диапазонах с момента старта.
Тип: `Uint64`. -`InFlightTxCount` | Количество транзакций, находящихся в процессе исполнения.
Тип: `Uint64`. -`ImmediateTxCompleted` | Количество завершившихся одношардовых транзакций с момента старта.
Тип: `Uint64`. -`CoordinatedTxCompleted` | Количество завершившихся координируемых транзакций с момента старта.
Тип: `Uint64`. -`TxRejectedByOverload` | Количество транзакций, отменённых по причине слишком высокой нагрузки (с момента старта).
Тип: `Uint64`. -`TxRejectedByOutOfStorage` | Количество транзакций, отменённых из-за нехватки места (с момента старта).
Тип: `Uint64`. diff --git a/ydb/docs/ru/core/troubleshooting/_includes/system_views/query_metrics.md b/ydb/docs/ru/core/troubleshooting/_includes/system_views/query_metrics.md deleted file mode 100644 index ffeef9ec25b9..000000000000 --- a/ydb/docs/ru/core/troubleshooting/_includes/system_views/query_metrics.md +++ /dev/null @@ -1,6 +0,0 @@ - -{% include [header.md](query_metrics_header.md) %} - -Примеры: - -{% include [example_yql](query_metrics_example_yql.md) %} \ No newline at end of file diff --git a/ydb/docs/ru/core/troubleshooting/_includes/system_views/query_metrics_example_yql.md b/ydb/docs/ru/core/troubleshooting/_includes/system_views/query_metrics_example_yql.md deleted file mode 100644 index 043c1029f2dd..000000000000 --- a/ydb/docs/ru/core/troubleshooting/_includes/system_views/query_metrics_example_yql.md +++ /dev/null @@ -1,27 +0,0 @@ - Топ-10 запросов за последние 6 часов по общему количеству записанных строк в минутном интервале: - - > ```sql - > SELECT - > SumUpdateRows, - > Count, - > QueryText, - > IntervalEnd - > FROM `.sys/query_metrics_one_minute` - > ORDER BY SumUpdateRows DESC LIMIT 10 - > ``` - - Недавние запросы, прочитавшие больше всего байт за минуту: - - > ```sql - > SELECT - > IntervalEnd, - > SumReadBytes, - > MinReadBytes, - > SumReadBytes / Count as AvgReadBytes, - > MaxReadBytes, - > QueryText - > FROM `.sys/query_metrics_one_minute` - > WHERE SumReadBytes > 0 - > ORDER BY IntervalEnd DESC, SumReadBytes DESC - > LIMIT 100 - > ``` \ No newline at end of file diff --git a/ydb/docs/ru/core/troubleshooting/_includes/system_views/query_metrics_header.md b/ydb/docs/ru/core/troubleshooting/_includes/system_views/query_metrics_header.md deleted file mode 100644 index b78881d0165f..000000000000 --- a/ydb/docs/ru/core/troubleshooting/_includes/system_views/query_metrics_header.md +++ /dev/null @@ -1,44 +0,0 @@ -## Подробная информация о запросах {#query-metrics} - -Следующая системная таблица хранит подробную информацию о запросах: - -* `query_metrics_one_minute` — данные разбиты по минутным интервалам, содержит до 256 запросов за последние 6 часов. - -Каждая строка таблицы содержит информацию о множестве случившихся за интервал запросов с одинаковым текстом. Поля таблицы предоставляют минимальное, максимальное и суммарное значение по каждой отслеживаемой характеристике запроса. В пределах интервала запросы отсортированы по убыванию суммарного потраченного процессорного времени. - -Ограничения: - -* текст запроса ограничен 4 килобайтами; -* статистика может быть неполной, если база испытывает сильную нагрузку. - -Структура таблицы: - -Поле | Описание ----|--- -`IntervalEnd` | Момент закрытия минутного интервала.
Тип: `Timestamp`.
Ключ: `0`. -`Rank` | Ранг запроса в пределах интервала (по полю SumCPUTime).
Тип: `Uint32`.
Ключ: `1`. -`QueryText` | Текст запроса.
Тип: `Utf8`. -`Count` | Количество запусков запроса.
Тип: `Uint64`. -`SumDuration` | Общая длительность запросов.
Тип: `Interval`. -`Count` | Количество запусков запроса.
Тип: `Uint64`. -`SumDuration` | Общая длительность запросов.
Тип: `Interval`. -`MinDuration` | Минимальная длительность запроса.
Тип: `Interval`. -`MaxDuration` | Максимальная длительность запроса.
Тип: `Interval`. -`SumCPUTime` | Общее затраченное процессорное время.
Тип: `Uint64`. -`MinCPUTime` | Минимальное затраченное процессорное время.
Тип: `Uint64`. -`MaxCPUTime` | Максимальное затраченное процессорное время.
Тип: `Uint64`. -`SumReadRows` | Общее количество прочитанных строк.
Тип: `Uint64`. -`MinReadRows` | Минимальное количество прочитанных строк.
Тип: `Uint64`. -`MaxReadRows` | Максимальное количество прочитанных строк.
Тип: `Uint64`. -`SumReadBytes` | Общее количество прочитанных байт.
Тип: `Uint64`. -`MinReadBytes` | Минимальное количество прочитанных байт.
Тип: `Uint64`. -`MaxReadBytes` | Максимальное количество прочитанных байт.
Тип: `Uint64`. -`SumUpdateRows` | Общее количество записанных строк.
Тип: `Uint64`. -`MinUpdateRows` | Минимальное количество записанных строк.
Тип: `Uint64`. -`MaxUpdateRows` | Максимальное количество записанных строк.
Тип: `Uint64`. -`SumUpdateBytes` | Общее количество записанных байт.
Тип: `Uint64`. -`MinUpdateBytes` | Минимальное количество записанных байт.
Тип: `Uint64`. -`MaxUpdateBytes` | Максимальное количество записанных байт.
Тип: `Uint64`. -`SumDeleteRows` | Общее количество удалённых строк.
Тип: `Uint64`. -`MinDeleteRows` | Минимальное количество удалённых строк.
Тип: `Uint64`. -`MaxDeleteRows` | Максимальное количество удалённых строк.
Тип: `Uint64`. diff --git a/ydb/docs/ru/core/troubleshooting/_includes/system_views/top-overload-partitions.md b/ydb/docs/ru/core/troubleshooting/_includes/system_views/top-overload-partitions.md deleted file mode 100644 index 0772eee6a1a9..000000000000 --- a/ydb/docs/ru/core/troubleshooting/_includes/system_views/top-overload-partitions.md +++ /dev/null @@ -1,60 +0,0 @@ -## История перегруженных партиций {#top-overload-partitions} - -Следующие системные таблицы хранят историю моментов высокой нагрузки на отдельные партиции таблиц БД: - -* `top_partitions_one_minute` — данные разбиты на минутные интервалы, содержит историю за последние 6 часов; -* `top_partitions_one_hour` — данные разбиты на часовые интервалы, содержит историю за последние 2 недели. - -В таблицы попадают партиции с пиковой нагрузкой более 70 % (`CPUCores` > 0,7). В пределах одного интервала партиции ранжированы по пиковому значению нагрузки. - -Обе таблицы содержат одинаковый набор полей: - -Поле | Описание ---- | --- -`IntervalEnd` | Момент закрытия минутного или часового интервала.
Тип: `Timestamp`.
Ключ: `0`. -`Rank` | Ранг партиции в пределах интервала (по CPUCores).
Тип: `Uint32`.
Ключ: `1`. -`TabletId` | Идентификатор таблетки, обслуживающей партицию.
Тип: `Uint64`. -`Path` | Полный путь к таблице.
Тип: `Utf8`. -`PeakTime` | Момент пикового значения в пределах интервала.
Тип: `Timestamp`. -`CPUCores` | Пиковое значение нагрузки на партицию (доля ядра).
Тип: `Double`. -`NodeId` | Идентификатор ноды, на которой находилась партиция в момент пика.
Тип: `Uint32`. -`DataSize` | Приблизительный размер партиции в байтах в момент пика.
Тип: `Uint64`. -`RowCount` | Приблизительное количество строк в момент пика.
Тип: `Uint64`. -`IndexSize` | Размер индекса партиции в таблетке в момент пика.
Тип: `Uint64`. -`InFlightTxCount` | Количество транзакций, находящихся в процессе исполнения в момент пика.
Тип: `Uint32`. - -Примеры: - -Следующий запрос выводит партиции с потреблением CPU более 70% в указанном интервале времени, с идентификаторами таблеток и их размерами на момент превышения. Запрос выполняется к таблице `.sys/top_partitions_one_minute`, которая содержит данные за последние 6 часов с разбиением по часовым интервалам: - ->```yql ->SELECT -> IntervalEnd, -> CPUCores, -> Path, -> TabletId, -> DataSize ->FROM `.sys/top_partitions_one_minute` ->WHERE CPUCores > 0.7 ->AND IntervalEnd BETWEEN Timestamp("YYYY-MM-DDThh:mm:ss.uuuuuuZ") AND Timestamp("YYYY-MM-DDThh:mm:ss.uuuuuuZ") ->ORDER BY IntervalEnd desc, CPUCores desc ->``` - -* `"YYYY-MM-DDTHH:MM:SS.UUUUUUZ"` — время в зоне UTC 0 (`YYYY` — год, `MM` — месяц, `DD` — число, `hh` — часы, `mm` — минуты, `ss` — секунды, `uuuuuu` — микросекунды). Например, `"2023-01-26T13:00:00.000000Z"`. - -Следующий запрос выводит партиции с потреблением CPU более 90% в указанном интервале времени, с идентификаторами таблеток и их размерами на момент превышения. Запрос выполняется к таблице `.sys/top_partitions_one_hour`, которая содержит данные за последние 2 недели с разбиением по минутным интервалам: - ->```yql ->SELECT -> IntervalEnd, -> CPUCores, -> Path, -> TabletId, -> DataSize ->FROM `.sys/top_partitions_one_hour` ->WHERE CPUCores > 0.9 ->AND IntervalEnd BETWEEN Timestamp("YYYY-MM-DDThh:mm:ss.uuuuuuZ") AND Timestamp("YYYY-MM-DDThh:mm:ss.uuuuuuZ") ->ORDER BY IntervalEnd desc, CPUCores desc ->``` - -* `"YYYY-MM-DDTHH:MM:SS.UUUUUUZ"` — время в зоне UTC 0 (`YYYY` — год, `MM` — месяц, `DD` — число, `hh` — часы, `mm` — минуты, `ss` — секунды, `uuuuuu` — микросекунды). Например, `"2023-01-26T13:00:00.000000Z"`. diff --git a/ydb/docs/ru/core/troubleshooting/_includes/system_views/tops.md b/ydb/docs/ru/core/troubleshooting/_includes/system_views/tops.md deleted file mode 100644 index f5fedd8fd4db..000000000000 --- a/ydb/docs/ru/core/troubleshooting/_includes/system_views/tops.md +++ /dev/null @@ -1,6 +0,0 @@ - -{% include [header.md](tops_header.md) %} - -Примеры: - -{% include [example_yql.md](tops_example_yql.md) %} diff --git a/ydb/docs/ru/core/troubleshooting/_includes/system_views/tops_example_yql.md b/ydb/docs/ru/core/troubleshooting/_includes/system_views/tops_example_yql.md deleted file mode 100644 index ba6c6dd68ee5..000000000000 --- a/ydb/docs/ru/core/troubleshooting/_includes/system_views/tops_example_yql.md +++ /dev/null @@ -1,30 +0,0 @@ - Топ запросов по времени выполнения за последнюю минуту их отправки: - - > ```sql - > PRAGMA AnsiInForEmptyOrNullableItemsCollections; - > $last = ( - > SELECT - > MAX(IntervalEnd) - > FROM `.sys/top_queries_by_duration_one_minute` - > ); - > SELECT - > IntervalEnd, - > Rank, - > QueryText, - > Duration - > FROM `.sys/top_queries_by_duration_one_minute` - > WHERE IntervalEnd IN $last - > ``` - - Запросы, прочитавшие больше всего байт, в разбивке по минутам: - - > ```sql - > SELECT - > IntervalEnd, - > QueryText, - > ReadBytes, - > ReadRows, - > Partitions - > FROM `.sys/top_queries_by_read_bytes_one_minute` - > WHERE Rank = 1 - > ``` \ No newline at end of file diff --git a/ydb/docs/ru/core/troubleshooting/_includes/system_views/tops_header.md b/ydb/docs/ru/core/troubleshooting/_includes/system_views/tops_header.md deleted file mode 100644 index d4ed4f2fe359..000000000000 --- a/ydb/docs/ru/core/troubleshooting/_includes/system_views/tops_header.md +++ /dev/null @@ -1,49 +0,0 @@ -## Топы запросов {#top-queries} - -Следующие системные таблицы хранят данные для анализа потока пользовательских запросов: - -* `top_queries_by_duration_one_minute` — данные разбиты на минутные интервалы, содержит топ-5 запросов с наибольшим полным временем исполнения за последние 6 часов; -* `top_queries_by_duration_one_hour` — данные разбиты на часовые интервалы, содержит топ-5 запросов с наибольшим полным временем исполнения за последние 2 недели; -* `top_queries_by_read_bytes_one_minute` — данные разбиты на минутные интервалы, содержит топ-5 запросов с наибольшим количеством прочитанных из таблицы байт за последние 6 часов; -* `top_queries_by_read_bytes_one_hour` — данные разбиты на часовые интервалы, содержит топ-5 запросов с наибольшим количеством прочитанных из таблицы байт за последние 2 недели; -* `top_queries_by_cpu_time_one_minute` — данные разбиты на минутные интервалы, содержит топ-5 запросов с наибольшим затраченным процессорным временем за последние 6 часов; -* ` top_queries_by_cpu_time_one_hour` — данные разбиты на часовые интервалы, содержит топ-5 запросов с наибольшим затраченным процессорным временем за последние 2 недели. - -Различные запуски запроса с одним и тем же текстом дедуплицируются. Топ содержит информацию о конкретном запуске с максимальным значением соответствующей характеристики запроса в пределах одного временного интервала. - -Поля, предоставляющие информацию о затраченном процессорном времени (...`CPUTime`), выражены в микросекундах. - -Текст запроса ограничен 4 килобайтами. - -Все таблицы содержат одинаковый набор полей: - -Поле | Описание ---- | --- -`IntervalEnd` | Момент закрытия минутного или часового интервала.
Тип: `Timestamp`.
Ключ: `0`. -`Rank` | Ранг запроса в топе.
Тип: `Uint32`.
Ключ: `1`. -`QueryText` | Текст запроса.
Тип: `Utf8`. -`Duration` | Полное время исполнения запроса.
Тип: `Interval`. -`EndTime` | Момент окончания исполнения запроса.
Тип: `Timestamp`. -`Type` | Тип запроса ("data", "scan", "script").
Тип: `String`. -`ReadRows` | Количество прочитанных строк.
Тип: `Uint64`. -`ReadBytes` | Количество прочитанных байт.
Тип: `Uint64`. -`UpdateRows` | Количество записанных строк.
Тип: `Uint64`. -`UpdateBytes` | Количество записанных байт.
Тип: `Uint64`. -`DeleteRows` | Количество удалённых строк.
Тип: `Uint64`. -`DeleteBytes` | Количество удалённых байт.
Тип: `Uint64`. -`Partitions` | Количество партиций таблиц, участвовавших в исполнении запроса.
Тип: `Uint64`. -`UserSID` | Security ID пользователя.
Тип: `String`. -`ParametersSize` | Размер параметров запроса в байтах.
Тип: `Uint64`. -`CompileDuration` | Длительность компиляции запроса.
Тип: `Interval`. -`FromQueryCache` | Использовался ли кэш подготовленных запросов.
Тип: `Bool`. -`CPUTime` | Общее процессорное время, использованное для исполнения запроса (микросекунды).
Тип: `Uint64`. -`ShardCount` | Количество шардов, участвующих в исполнении запроса.
Тип: `Uint64`. -`SumShardCPUTime` | Общее процессорное время, затраченное в шардах.
Тип: `Uint64`. -`MinShardCPUTime` | Минимальное процесорное время, затраченное в шардах.
Тип: `Uint64`. -`MaxShardCPUTime` | Максимальное процессорное время, затраченное в шардах.
Тип: `Uint64`. -`ComputeNodesCount` | Количество вычислительных нод, задействованных в исполнении запроса.
Тип: `Uint64`. -`SumComputeCPUTime` | Общее процессорное время, затраченное в вычислительных нодах.
Тип: `Uint64`. -`MinComputeCPUTime` | Минимальное процессорное время, затраченное в вычислительных нодах.
Тип: `Uint64`. -`MaxComputeCPUTime` | Максимальное процессорное время, затраченное в вычислительных нодах.
Тип: `Uint64`. -`CompileCPUTime` | Процессорное время, затраченное на компиляцию запроса.
Тип: `Uint64`. -`ProcessCPUTime` | Процессорное время, затраченное на общую обработку запроса.
Тип: `Uint64`. diff --git a/ydb/docs/ru/core/troubleshooting/system_views.md b/ydb/docs/ru/core/troubleshooting/system_views.md deleted file mode 100644 index 72b417be784f..000000000000 --- a/ydb/docs/ru/core/troubleshooting/system_views.md +++ /dev/null @@ -1,7 +0,0 @@ -# Системные таблицы - -Информация по системным таблицам доступна в следующих статьях: - -- [Системные таблицы базы данных](system_views_db.md) -- [Системные таблицы кластера](system_views_cluster.md) - diff --git a/ydb/docs/ru/core/troubleshooting/system_views_db.md b/ydb/docs/ru/core/troubleshooting/system_views_db.md deleted file mode 100644 index 0c8c26a75905..000000000000 --- a/ydb/docs/ru/core/troubleshooting/system_views_db.md +++ /dev/null @@ -1,9 +0,0 @@ -{% include [intro.md](_includes/system_views/intro_db.md) %} - -{% include [partitions.md](_includes/system_views/partitions.md) %} - -{% include [tops.md](_includes/system_views/tops.md) %} - -{% include [query_metrics.md](_includes/system_views/query_metrics.md) %} - -{% include [top-overload-partitions.md](_includes/system_views/top-overload-partitions.md) %} diff --git a/ydb/docs/ru/core/troubleshooting/toc_i.yaml b/ydb/docs/ru/core/troubleshooting/toc_i.yaml index 1557851b33bb..fd3e716f0e19 100644 --- a/ydb/docs/ru/core/troubleshooting/toc_i.yaml +++ b/ydb/docs/ru/core/troubleshooting/toc_i.yaml @@ -1,9 +1,7 @@ items: - name: Системные таблицы - href: system_views_db.md + href: system_views_cluster.md - name: Мониторинг href: monitoring.md -- name: System views (deprecated) - href: system_views.md - hidden: true + \ No newline at end of file From 9ac767f828b226306197dd5253e6f4489765cf13 Mon Sep 17 00:00:00 2001 From: Ivan Blinkov Date: Mon, 1 Apr 2024 15:57:50 +0700 Subject: [PATCH 06/13] prepare for consolidation of devops/manual --- ydb/docs/en/core/devops/manual/toc_p.yaml | 4 ++++ ydb/docs/en/core/devops/toc_p.yaml | 2 +- ydb/docs/en/core/toc_i.yaml | 2 -- ydb/docs/ru/core/devops/manual/toc_p.yaml | 4 ++++ ydb/docs/ru/core/devops/toc_p.yaml | 2 +- ydb/docs/ru/core/toc_i.yaml | 1 - 6 files changed, 10 insertions(+), 5 deletions(-) create mode 100644 ydb/docs/en/core/devops/manual/toc_p.yaml create mode 100644 ydb/docs/ru/core/devops/manual/toc_p.yaml diff --git a/ydb/docs/en/core/devops/manual/toc_p.yaml b/ydb/docs/en/core/devops/manual/toc_p.yaml new file mode 100644 index 000000000000..6d6c7b9c8e7e --- /dev/null +++ b/ydb/docs/en/core/devops/manual/toc_p.yaml @@ -0,0 +1,4 @@ +items: +- include: + mode: link + path: ../../cluster/toc_p.yaml diff --git a/ydb/docs/en/core/devops/toc_p.yaml b/ydb/docs/en/core/devops/toc_p.yaml index 95bb58995760..aa8b686ce610 100644 --- a/ydb/docs/en/core/devops/toc_p.yaml +++ b/ydb/docs/en/core/devops/toc_p.yaml @@ -12,4 +12,4 @@ items: - name: Manual include: mode: link - path: ../cluster/toc_p.yaml \ No newline at end of file + path: manual/toc_p.yaml \ No newline at end of file diff --git a/ydb/docs/en/core/toc_i.yaml b/ydb/docs/en/core/toc_i.yaml index 33151e37c285..a0130f91169a 100644 --- a/ydb/docs/en/core/toc_i.yaml +++ b/ydb/docs/en/core/toc_i.yaml @@ -23,8 +23,6 @@ items: - { name: Tutorials, include: { mode: link, path: operations/toc_p.yaml } } - { name: Recommendations, include: { mode: link, path: best_practices/toc_p.yaml } } -- { name: Managing a cluster, include: { mode: link, path: cluster/toc_p.yaml } } - - name: Reference include: mode: link diff --git a/ydb/docs/ru/core/devops/manual/toc_p.yaml b/ydb/docs/ru/core/devops/manual/toc_p.yaml new file mode 100644 index 000000000000..6d6c7b9c8e7e --- /dev/null +++ b/ydb/docs/ru/core/devops/manual/toc_p.yaml @@ -0,0 +1,4 @@ +items: +- include: + mode: link + path: ../../cluster/toc_p.yaml diff --git a/ydb/docs/ru/core/devops/toc_p.yaml b/ydb/docs/ru/core/devops/toc_p.yaml index ac66f9ead864..c226875d7971 100644 --- a/ydb/docs/ru/core/devops/toc_p.yaml +++ b/ydb/docs/ru/core/devops/toc_p.yaml @@ -12,4 +12,4 @@ items: - name: Вручную include: mode: link - path: ../cluster/toc_p.yaml \ No newline at end of file + path: manual/toc_p.yaml \ No newline at end of file diff --git a/ydb/docs/ru/core/toc_i.yaml b/ydb/docs/ru/core/toc_i.yaml index 2bb5c8fcd1d8..1c8224eb9b51 100644 --- a/ydb/docs/ru/core/toc_i.yaml +++ b/ydb/docs/ru/core/toc_i.yaml @@ -23,7 +23,6 @@ items: # Main - { name: Практические руководства, include: { mode: link, path: operations/toc_p.yaml } } - { name: Рекомендации, include: { mode: link, path: best_practices/toc_p.yaml } } -- { name: Управление кластером, include: { mode: link, path: cluster/toc_p.yaml } } - name: Справка From 221dcc2842471944b698ed41ebc731acc8bcf2c7 Mon Sep 17 00:00:00 2001 From: Ivan Blinkov Date: Mon, 1 Apr 2024 16:30:16 +0700 Subject: [PATCH 07/13] move out the rest of troubleshooting/ --- ydb/docs/en/core/cluster/index.md | 2 +- ydb/docs/en/core/cluster/toc_i.yaml | 2 +- .../manual/system-views.md} | 20 +++++++++ ydb/docs/en/core/devops/manual/toc_p.yaml | 2 + .../observability/metrics/index.md} | 32 +++++++------- .../core/reference/observability/toc_p.yaml | 3 ++ ydb/docs/en/core/reference/toc_p.yaml | 6 ++- .../_includes/system_views/intro_cluster.md | 5 --- .../_includes/system_views/notes.md | 5 --- ydb/docs/en/core/troubleshooting/index.md | 7 --- .../en/core/troubleshooting/monitoring.md | 7 --- .../troubleshooting/system_views_cluster.md | 7 --- ydb/docs/en/core/troubleshooting/toc_i.yaml | 5 --- ydb/docs/en/core/troubleshooting/toc_p.yaml | 4 -- ydb/docs/redirects.yaml | 2 + ydb/docs/ru/core/cluster/index.md | 3 +- ydb/docs/ru/core/cluster/toc_i.yaml | 4 +- ydb/docs/ru/core/dba/toc_i.yaml | 2 +- .../manual/system-views.md} | 22 +++++++++- ydb/docs/ru/core/devops/manual/toc_p.yaml | 2 + .../observability/metrics/index.md} | 43 +++++++++---------- .../core/reference/observability/toc_p.yaml | 3 ++ ydb/docs/ru/core/reference/toc_p.yaml | 6 ++- .../_includes/system_views/intro_cluster.md | 5 --- .../_includes/system_views/notes.md | 5 --- ydb/docs/ru/core/troubleshooting/index.md | 7 --- .../ru/core/troubleshooting/monitoring.md | 7 --- .../troubleshooting/system_views_cluster.md | 7 --- ydb/docs/ru/core/troubleshooting/toc_i.yaml | 7 --- ydb/docs/ru/core/troubleshooting/toc_p.yaml | 4 -- 30 files changed, 104 insertions(+), 132 deletions(-) rename ydb/docs/en/core/{troubleshooting/_includes/system_views/distributed_storage.md => devops/manual/system-views.md} (89%) rename ydb/docs/en/core/{troubleshooting/_includes/monitoring_sensors.md => reference/observability/metrics/index.md} (91%) create mode 100644 ydb/docs/en/core/reference/observability/toc_p.yaml delete mode 100644 ydb/docs/en/core/troubleshooting/_includes/system_views/intro_cluster.md delete mode 100644 ydb/docs/en/core/troubleshooting/_includes/system_views/notes.md delete mode 100644 ydb/docs/en/core/troubleshooting/index.md delete mode 100644 ydb/docs/en/core/troubleshooting/monitoring.md delete mode 100644 ydb/docs/en/core/troubleshooting/system_views_cluster.md delete mode 100644 ydb/docs/en/core/troubleshooting/toc_i.yaml delete mode 100644 ydb/docs/en/core/troubleshooting/toc_p.yaml rename ydb/docs/ru/core/{troubleshooting/_includes/system_views/distributed_storage.md => devops/manual/system-views.md} (89%) rename ydb/docs/ru/core/{troubleshooting/_includes/monitoring_sensors.md => reference/observability/metrics/index.md} (95%) create mode 100644 ydb/docs/ru/core/reference/observability/toc_p.yaml delete mode 100644 ydb/docs/ru/core/troubleshooting/_includes/system_views/intro_cluster.md delete mode 100644 ydb/docs/ru/core/troubleshooting/_includes/system_views/notes.md delete mode 100644 ydb/docs/ru/core/troubleshooting/index.md delete mode 100644 ydb/docs/ru/core/troubleshooting/monitoring.md delete mode 100644 ydb/docs/ru/core/troubleshooting/system_views_cluster.md delete mode 100644 ydb/docs/ru/core/troubleshooting/toc_i.yaml delete mode 100644 ydb/docs/ru/core/troubleshooting/toc_p.yaml diff --git a/ydb/docs/en/core/cluster/index.md b/ydb/docs/en/core/cluster/index.md index 485908e4631f..6ae4da5f7359 100644 --- a/ydb/docs/en/core/cluster/index.md +++ b/ydb/docs/en/core/cluster/index.md @@ -5,6 +5,6 @@ This section provides information about deploying, configuring, maintaining, mon * [{#T}](../deploy/index.md). * [{#T}](../maintenance/embedded_monitoring/index.md). * [{#T}](../maintenance/manual/index.md). -* [{#T}](../troubleshooting/system_views_cluster.md). +* [{#T}](../devops/manual/system-views.md). * [{#T}](../administration/monitoring.md). * [{#T}](../administration/upgrade.md). diff --git a/ydb/docs/en/core/cluster/toc_i.yaml b/ydb/docs/en/core/cluster/toc_i.yaml index 29766fc6f98c..2b4297cc9ab7 100644 --- a/ydb/docs/en/core/cluster/toc_i.yaml +++ b/ydb/docs/en/core/cluster/toc_i.yaml @@ -8,7 +8,7 @@ items: - name: Embedded UI include: { mode: link, path: ../maintenance/embedded_monitoring/toc_p.yaml } - name: Cluster system views - href: ../troubleshooting/system_views_cluster.md + href: ../devops/manual/system-views.md - name: Audit log href: audit-log.md - name: Short access control notation diff --git a/ydb/docs/en/core/troubleshooting/_includes/system_views/distributed_storage.md b/ydb/docs/en/core/devops/manual/system-views.md similarity index 89% rename from ydb/docs/en/core/troubleshooting/_includes/system_views/distributed_storage.md rename to ydb/docs/en/core/devops/manual/system-views.md index b6cd28b3a4ee..a07ea319fd79 100644 --- a/ydb/docs/en/core/troubleshooting/_includes/system_views/distributed_storage.md +++ b/ydb/docs/en/core/devops/manual/system-views.md @@ -1,3 +1,17 @@ +# Cluster system views + +To enable internal introspection of the cluster state, the user can make queries to special system views. These tables are accessible from the cluster's root directory and use the `.sys` system path prefix. + +Cloud database users usually don't have access to cluster system tables, as cluster support and timely diagnostics are the prerogatives of the cloud team. + +Hereinafter, in the descriptions of available fields, the **Key** column contains the corresponding table's primary key field index. + +{% note info %} + +There are also similar system views describing what's happening inside a given database, they are covered in a [separate article for DBAs](../../dba/system-views.md). + +{% endnote %} + ## Distributed Storage Information about the operation of distributed storage is contained in several interconnected tables, each of which is responsible for describing its entity, such as: @@ -101,3 +115,9 @@ Unlike other tables that show physical entities, the `ds_storage_stats` table sh It should be noted that AvailableGroupsToCreate shows the maximum number of groups that can be created if no other types of groups are created. So when extending a storage pool, the count of AvailableGroupsToCreate in several rows of statistics may change. + +{% note info %} + +Loads caused by accessing system views are more analytical in nature. Making frequent queries to them in large DBs will consume a lot of system resources. The recommended load is no more than 1-2 RPS. + +{% endnote %} diff --git a/ydb/docs/en/core/devops/manual/toc_p.yaml b/ydb/docs/en/core/devops/manual/toc_p.yaml index 6d6c7b9c8e7e..3ecf84f5d7d5 100644 --- a/ydb/docs/en/core/devops/manual/toc_p.yaml +++ b/ydb/docs/en/core/devops/manual/toc_p.yaml @@ -2,3 +2,5 @@ items: - include: mode: link path: ../../cluster/toc_p.yaml +- name: System views + href: system-views.md diff --git a/ydb/docs/en/core/troubleshooting/_includes/monitoring_sensors.md b/ydb/docs/en/core/reference/observability/metrics/index.md similarity index 91% rename from ydb/docs/en/core/troubleshooting/_includes/monitoring_sensors.md rename to ydb/docs/en/core/reference/observability/metrics/index.md index 6c78d0b42a7a..e99e4b54911b 100644 --- a/ydb/docs/en/core/troubleshooting/_includes/monitoring_sensors.md +++ b/ydb/docs/en/core/reference/observability/metrics/index.md @@ -1,15 +1,13 @@ - +# Metrics reference -## {{ ydb-full-name }} {#ydb} - -### Resource usage metrics {#resources} +## Resource usage metrics {#resources} | Metric name
Type, units of measurement | Description
Labels | | ----- | ----- | -| `resources.storage.used_bytes`
`IGAUGE`, bytes | The size of user and service data stored in distributed network storage. Housekeeping data include the data of the primary and [secondary indexes](../../concepts/secondary_indexes.md). | +| `resources.storage.used_bytes`
`IGAUGE`, bytes | The size of user and service data stored in distributed network storage. Housekeeping data include the data of the primary and [secondary indexes](../../../concepts/secondary_indexes.md). | | `resources.storage.limit_bytes`
`IGAUGE`, bytes | A limit on the size of user and service data that a database can store in distributed network storage. | -### API metrics {#api} +## API metrics {#api} | Metric name
Type, units of measurement | Description
Labels | | ----- | ----- | @@ -18,18 +16,18 @@ | `api.grpc.request.inflight_count`
`IGAUGE`, pieces | The number of requests that a database is simultaneously handling in a certain period of time.
Labels:
- _api_service_: The name of the gRPC API service, such as `table`.
- _method_: The name of a gRPC API service method, such as `ExecuteDataQuery`. | | `api.grpc.request.inflight_bytes`
`IGAUGE`, bytes | The size of requests that a database is simultaneously handling in a certain period of time.
Labels:
- _api_service_: The name of the gRPC API service, such as `table`.
- _method_: The name of a gRPC API service method, such as `ExecuteDataQuery`. | | `api.grpc.response.bytes`
`RATE`, bytes | The size of responses sent by the database in a certain period of time.
Labels:
- _api_service_: The name of the gRPC API service, such as `table`.
- _method_: The name of a gRPC API service method, such as `ExecuteDataQuery`. | -| `api.grpc.response.count`
`RATE`, pieces | The number of responses sent by the database in a certain period of time.
Labels:
- _api_service_: The name of the gRPC API service, such as `table`.
- _method_: The name of a gRPC API service method, such as `ExecuteDataQuery`.
- _status_ is the request execution status. See a more detailed description of statuses under [Error Handling](../../reference/ydb-sdk/error_handling.md). | +| `api.grpc.response.count`
`RATE`, pieces | The number of responses sent by the database in a certain period of time.
Labels:
- _api_service_: The name of the gRPC API service, such as `table`.
- _method_: The name of a gRPC API service method, such as `ExecuteDataQuery`.
- _status_ is the request execution status. See a more detailed description of statuses under [Error Handling](../../../reference/ydb-sdk/error_handling.md). | | `api.grpc.response.dropped_count`
`RATE`, pieces | The number of responses dropped at the transport (gRPC) layer due to an error.
Labels:
- _api_service_: The name of the gRPC API service, such as `table`.
- _method_: The name of a gRPC API service method, such as `ExecuteDataQuery`. | -| `api.grpc.response.issues`
`RATE`, pieces | The number of errors of a certain type arising in the execution of a request over a certain period of time.
Tags:
- _issue_type_ is the error type wth the only value being `optimistic_locks_invalidation`. For more on lock invalidation, review [Transactions and requests to {{ ydb-short-name }}](../../concepts/transactions.md). | +| `api.grpc.response.issues`
`RATE`, pieces | The number of errors of a certain type arising in the execution of a request over a certain period of time.
Tags:
- _issue_type_ is the error type wth the only value being `optimistic_locks_invalidation`. For more on lock invalidation, review [Transactions and requests to {{ ydb-short-name }}](../../../concepts/transactions.md). | -### Session metrics {#sessions} +## Session metrics {#sessions} | Metric name
Type, units of measurement | Description
Labels | | ----- | ----- | | `table.session.active_count`
`IGAUGE`, pieces | The number of sessions started by clients and running at a given time. | | `table.session.closed_by_idle_count`
`RATE`, pieces | The number of sessions closed by the DB server in a certain period of time due to exceeding the lifetime allowed for an idle session. | -### Transaction processing metrics {#transactions} +## Transaction processing metrics {#transactions} You can analyze a transaction's execution time using a histogram counter. The intervals are set in milliseconds. The chart shows the number of transactions whose duration falls within a certain time interval. @@ -39,7 +37,7 @@ You can analyze a transaction's execution time using a histogram counter. The in | `table.transaction.server_duration_milliseconds`
`HIST_RATE`, pieces | The number of transactions with a certain duration on the server. The duration is the time of executing requests within a transaction on the server. Does not include the waiting time on the client between sending separate requests within a single transaction.
Labels:
-_tx_kind_: The transaction type, possible values are`read_only`, `read_write`, `write_only`, and `pure`. | | `table.transaction.client_duration_milliseconds`
`HIST_RATE`, pieces | The number of transactions with a certain duration on the client. The duration is the waiting time on the client between sending individual requests within a single transaction. Does not include the time of executing requests on the server.
Labels:
- _tx_kind_: The transaction type, possible values are `read_only`, `read_write`, `write_only`, and `pure`. | -### Query processing metrics {#queries} +## Query processing metrics {#queries} | Metric name
Type, units of measurement | Description
Labels | | ----- | ----- | @@ -54,7 +52,7 @@ You can analyze a transaction's execution time using a histogram counter. The in | `table.query.compilation.cache_misses`
`RATE`, pieces | The number of queries in a certain period of time that required query compilation. | | `table.query.execution.latency_milliseconds`
`HIST_RATE`, pieces | Histogram counter. The intervals are set in milliseconds. Shows the number of queries whose execution time falls within a certain interval. | -### Table partition metrics {#datashards} +## Table partition metrics {#datashards} | Metric name
Type, units of measurement | Description
Labels | | ----- | ----- | @@ -72,7 +70,7 @@ You can analyze a transaction's execution time using a histogram counter. The in | `table.datashard.erase.rows`
`RATE`, pieces | The number of rows deleted from the database in a certain period of time. | | `table.datashard.erase.bytes`
`RATE`, bytes | The size of data deleted from the database in a certain period of time. | -### Resource usage metrics (for Dedicated mode only) {#ydb_dedicated_resources} +## Resource usage metrics (for Dedicated mode only) {#ydb_dedicated_resources} | Metric name
Type
units of measurement | Description
Labels | | ----- | ----- | @@ -81,11 +79,11 @@ You can analyze a transaction's execution time using a histogram counter. The in | `resources.memory.used_bytes`
`IGAUGE`, bytes | The amount of RAM used by the database nodes. | | `resources.memory.limit_bytes`
`IGAUGE`, bytes | RAM available to the database nodes. | -### Query processing metrics (for Dedicated mode only) {#ydb_dedicated_queries} +## Query processing metrics (for Dedicated mode only) {#ydb_dedicated_queries} | Metric name
Type
units of measurement | Description
Labels | | ----- | ----- | -| `table.query.compilation.cache_evictions`
`RATE`, pieces | The number of queries evicted from the cache of [prepared queries](../../reference/ydb-sdk/example/index.md#param-queries) in a certain period of time. | -| `table.query.compilation.cache_size_bytes`
`IGAUGE`, bytes | The size of the cache of [prepared queries](../../reference/ydb-sdk/example/index.md#param-queries). | -| `table.query.compilation.cached_query_count`
`IGAUGE`, pieces | The size of the cache of [prepared queries](../../reference/ydb-sdk/example/index.md#param-queries). | +| `table.query.compilation.cache_evictions`
`RATE`, pieces | The number of queries evicted from the cache of [prepared queries](../../../reference/ydb-sdk/example/index.md#param-queries) in a certain period of time. | +| `table.query.compilation.cache_size_bytes`
`IGAUGE`, bytes | The size of the cache of [prepared queries](../../../reference/ydb-sdk/example/index.md#param-queries). | +| `table.query.compilation.cached_query_count`
`IGAUGE`, pieces | The size of the cache of [prepared queries](../../../reference/ydb-sdk/example/index.md#param-queries). | diff --git a/ydb/docs/en/core/reference/observability/toc_p.yaml b/ydb/docs/en/core/reference/observability/toc_p.yaml new file mode 100644 index 000000000000..2175b824d839 --- /dev/null +++ b/ydb/docs/en/core/reference/observability/toc_p.yaml @@ -0,0 +1,3 @@ +items: +- name: Metrics reference + href: metrics/index.md diff --git a/ydb/docs/en/core/reference/toc_p.yaml b/ydb/docs/en/core/reference/toc_p.yaml index 9d3a47952ce1..ab0514de2446 100644 --- a/ydb/docs/en/core/reference/toc_p.yaml +++ b/ydb/docs/en/core/reference/toc_p.yaml @@ -26,4 +26,8 @@ items: - name: YDB DStool include: mode: link - path: ydb-dstool/toc_p.yaml \ No newline at end of file + path: ydb-dstool/toc_p.yaml +- name: Observability + include: + mode: link + path: observability/toc_p.yaml \ No newline at end of file diff --git a/ydb/docs/en/core/troubleshooting/_includes/system_views/intro_cluster.md b/ydb/docs/en/core/troubleshooting/_includes/system_views/intro_cluster.md deleted file mode 100644 index e678dc5ba812..000000000000 --- a/ydb/docs/en/core/troubleshooting/_includes/system_views/intro_cluster.md +++ /dev/null @@ -1,5 +0,0 @@ -To enable internal introspection of the cluster state, the user can make queries to special system views. These tables are accessible from the cluster's root directory and use the `.sys` system path prefix. - -Cloud database users usually don't have access to cluster system tables, as cluster support and timely diagnostics are the prerogative of the cloud team. - -Hereinafter, in the descriptions of available fields, the **Key** column contains the corresponding table's primary key field index. diff --git a/ydb/docs/en/core/troubleshooting/_includes/system_views/notes.md b/ydb/docs/en/core/troubleshooting/_includes/system_views/notes.md deleted file mode 100644 index da3a535d0df6..000000000000 --- a/ydb/docs/en/core/troubleshooting/_includes/system_views/notes.md +++ /dev/null @@ -1,5 +0,0 @@ -{% note info %} - -Loads caused by accessing system views are more analytical in nature. Making frequent queries to them in large DBs will consume a lot of system resources. The recommended load is no more than 1-2 RPS. - -{% endnote %} diff --git a/ydb/docs/en/core/troubleshooting/index.md b/ydb/docs/en/core/troubleshooting/index.md deleted file mode 100644 index 38f4912563ea..000000000000 --- a/ydb/docs/en/core/troubleshooting/index.md +++ /dev/null @@ -1,7 +0,0 @@ -# Diagnostics - -This section contains articles about YDB database diagnostics tools. - -- [System views](system_views_db.md) -- [Metrics](monitoring.md) -- [Grafana dashboards](../administration/grafana-dashboards.md) diff --git a/ydb/docs/en/core/troubleshooting/monitoring.md b/ydb/docs/en/core/troubleshooting/monitoring.md deleted file mode 100644 index 598b0fed1282..000000000000 --- a/ydb/docs/en/core/troubleshooting/monitoring.md +++ /dev/null @@ -1,7 +0,0 @@ ---- -editable: false ---- -# Metric reference - -{% include notitle [ydb_monitoring_sensors.md](_includes/monitoring_sensors.md) %} - diff --git a/ydb/docs/en/core/troubleshooting/system_views_cluster.md b/ydb/docs/en/core/troubleshooting/system_views_cluster.md deleted file mode 100644 index 5f3045eda0b1..000000000000 --- a/ydb/docs/en/core/troubleshooting/system_views_cluster.md +++ /dev/null @@ -1,7 +0,0 @@ -# Cluster system views - -{% include [intro.md](_includes/system_views/intro_cluster.md) %} - -{% include [distributed_storage.md](_includes/system_views/distributed_storage.md) %} - -{% include [notes.md](_includes/system_views/notes.md) %} diff --git a/ydb/docs/en/core/troubleshooting/toc_i.yaml b/ydb/docs/en/core/troubleshooting/toc_i.yaml deleted file mode 100644 index d01b7fbb1a1a..000000000000 --- a/ydb/docs/en/core/troubleshooting/toc_i.yaml +++ /dev/null @@ -1,5 +0,0 @@ -items: -- name: System views - href: system_views_db.md -- name: Monitoring - href: monitoring.md \ No newline at end of file diff --git a/ydb/docs/en/core/troubleshooting/toc_p.yaml b/ydb/docs/en/core/troubleshooting/toc_p.yaml deleted file mode 100644 index 94ce11086840..000000000000 --- a/ydb/docs/en/core/troubleshooting/toc_p.yaml +++ /dev/null @@ -1,4 +0,0 @@ -items: -- name: Overview - href: index.md -- include: { mode: link, path: toc_i.yaml } \ No newline at end of file diff --git a/ydb/docs/redirects.yaml b/ydb/docs/redirects.yaml index 13e9e2880e04..a21978f730ad 100644 --- a/ydb/docs/redirects.yaml +++ b/ydb/docs/redirects.yaml @@ -37,6 +37,8 @@ common: to: /devops/ansible/initial-deployment.md - from: /getting_started/yql.md to: /yql/reference/index.md + - from: /troubleshooting/system_views_cluster.md + to: /devops/manuakl/system-views.md # Redirects from db to dba - from: /db/index.md diff --git a/ydb/docs/ru/core/cluster/index.md b/ydb/docs/ru/core/cluster/index.md index 7b8cf0c0f2c1..82996d7958fa 100644 --- a/ydb/docs/ru/core/cluster/index.md +++ b/ydb/docs/ru/core/cluster/index.md @@ -5,7 +5,6 @@ * [{#T}](../deploy/index.md). * [{#T}](../maintenance/embedded_monitoring/index.md). * [{#T}](../maintenance/manual/index.md). -* [{#T}](../troubleshooting/system_views_cluster.md). +* [{#T}](../devops/manual/system-views.md). * [{#T}](../administration/monitoring.md). * [{#T}](../administration/upgrade.md). - diff --git a/ydb/docs/ru/core/cluster/toc_i.yaml b/ydb/docs/ru/core/cluster/toc_i.yaml index ef074ff587d7..15c356fcd3cf 100644 --- a/ydb/docs/ru/core/cluster/toc_i.yaml +++ b/ydb/docs/ru/core/cluster/toc_i.yaml @@ -7,8 +7,6 @@ items: include: { mode: link, path: ../maintenance/manual/toc_p.yaml } - name: Встроенный UI include: { mode: link, path: ../maintenance/embedded_monitoring/toc_p.yaml } -- name: Системные таблицы кластера - href: ../troubleshooting/system_views_cluster.md - name: Аудитный лог href: audit-log.md - name: Краткая запись управления доступом @@ -20,7 +18,7 @@ items: - name: Дашборды Grafana href: ../administration/grafana-dashboards.md - name: Справочник метрик - href: ../troubleshooting/monitoring.md + href: ../reference/observability/metrics/index.md - name: Обновление href: ../administration/upgrade.md - name: Изменение конфигурации актор-системы diff --git a/ydb/docs/ru/core/dba/toc_i.yaml b/ydb/docs/ru/core/dba/toc_i.yaml index ff24a7d2ef86..24718e3bbab3 100644 --- a/ydb/docs/ru/core/dba/toc_i.yaml +++ b/ydb/docs/ru/core/dba/toc_i.yaml @@ -1,7 +1,7 @@ items: - name: Резервное копирование и восстановление href: backup-and-recovery.md -- name: Системные таблицы БД +- name: Системные таблицы href: system-views.md - name: Terraform href: terraform.md diff --git a/ydb/docs/ru/core/troubleshooting/_includes/system_views/distributed_storage.md b/ydb/docs/ru/core/devops/manual/system-views.md similarity index 89% rename from ydb/docs/ru/core/troubleshooting/_includes/system_views/distributed_storage.md rename to ydb/docs/ru/core/devops/manual/system-views.md index 0e319abe8a93..7583852da945 100644 --- a/ydb/docs/ru/core/troubleshooting/_includes/system_views/distributed_storage.md +++ b/ydb/docs/ru/core/devops/manual/system-views.md @@ -1,3 +1,17 @@ +# Системные таблицы кластера + +Для возможности внутренней интроспекции состояния кластера пользователю предоставляется возможность осуществлять запросы в специальные служебные таблицы (system views). Эти таблицы доступны из корневой директории кластера и используют системный префикс пути `.sys`. + +Пользователи облачных баз данных обычно не имеют доступа к системным таблицам кластера, так как за его поддержку и своевременную диагностику отвечает команда облака. + +В описаниях доступных полей далее по тексту колонка **Ключ** содержит индекс поля первичного ключа соответствующей таблицы. + +{% note info %} + +Аналогичные системные таблицы существуют и для происходящего внутри конкретной базы данных, они описаны в [отдельной статье для DBA](../../dba/system-views.md). + +{% endnote %} + ## Distributed Storage Информация о работе распределённого хранилища содержится в нескольких взаимосвязанных таблицах, каждая из которых отвечает за описание своей сущности, а именно: @@ -98,4 +112,10 @@ | AvailableGroupsToCreate | Uint32 | | Число групп с указанными характеристиками, которое можно создать с учётом необходимости резерва | | AvailableSizeToCreate | Uint64 | | Число доступных байт, которое получится при создании всех групп из AvailableGroupsToCreate | -Здесь стоит заметить, что AvailableGroupsToCreate показывают максимальное количество групп, которое можно создать, если не создавать другие виды групп. Таким образом, при расширении одного пула хранения могут поменяться числа AvailableGroupsToCreate в нескольких строках статистики. \ No newline at end of file +Здесь стоит заметить, что AvailableGroupsToCreate показывают максимальное количество групп, которое можно создать, если не создавать другие виды групп. Таким образом, при расширении одного пула хранения могут поменяться числа AvailableGroupsToCreate в нескольких строках статистики. + +{% note info %} + +Обращение к системным таблицам имеет скорее аналитический характер нагрузки. Частое обращение к ним в больших базах будет существенно расходовать системные ресурсы. Рекомендуемая нагрузка не более 1-2 RPS. + +{% endnote %} diff --git a/ydb/docs/ru/core/devops/manual/toc_p.yaml b/ydb/docs/ru/core/devops/manual/toc_p.yaml index 6d6c7b9c8e7e..df0e4d41e093 100644 --- a/ydb/docs/ru/core/devops/manual/toc_p.yaml +++ b/ydb/docs/ru/core/devops/manual/toc_p.yaml @@ -2,3 +2,5 @@ items: - include: mode: link path: ../../cluster/toc_p.yaml +- name: Системные таблицы + href: system-views.md diff --git a/ydb/docs/ru/core/troubleshooting/_includes/monitoring_sensors.md b/ydb/docs/ru/core/reference/observability/metrics/index.md similarity index 95% rename from ydb/docs/ru/core/troubleshooting/_includes/monitoring_sensors.md rename to ydb/docs/ru/core/reference/observability/metrics/index.md index 9275e76de56e..90de6e91b86e 100644 --- a/ydb/docs/ru/core/troubleshooting/_includes/monitoring_sensors.md +++ b/ydb/docs/ru/core/reference/observability/metrics/index.md @@ -1,14 +1,13 @@ - -## Сервис {{ ydb-full-name }} {#ydb} +# Справка по метрикам -### Метрики использования ресурсов {#resources} +## Метрики использования ресурсов {#resources} Имя метрики
Тип, единицы измерения | Описание
Метки ----- | ----- -`resources.storage.used_bytes`
`IGAUGE`, байты | Размер пользовательских и служебных данных, сохраненных в распределенном сетевом хранилище. К служебным данным относятся данные первичного и [вторичных индексов](../../concepts/secondary_indexes.md). +`resources.storage.used_bytes`
`IGAUGE`, байты | Размер пользовательских и служебных данных, сохраненных в распределенном сетевом хранилище. К служебным данным относятся данные первичного и [вторичных индексов](../../../concepts/secondary_indexes.md). `resources.storage.limit_bytes`
`IGAUGE`, байты | Ограничение на размер пользовательских и служебных данных, которые база данных может сохранить в распределенном сетевом хранилище. -### Метрики GRPC API общие {#grpc_api} +## Метрики GRPC API общие {#grpc_api} Имя метрики
Тип, единицы измерения | Описание
Метки ----- | ----- @@ -17,11 +16,11 @@ `api.grpc.request.inflight_count`
`IGAUGE`, штуки | Количество запросов, которые одновременно обрабатываются базой данных в определенный период времени.
Метки:
- _api_service_ – название сервиса gRPC API, например `table`.
- _method_ – название метода сервиса gRPC API, например `ExecuteDataQuery`. `api.grpc.request.inflight_bytes`
`IGAUGE`, байты | Размер запросов, которые одновременно обрабатываются базой данных в определенный период времени.
Метки:
- _api_service_ – название сервиса gRPC API, например `table`.
- _method_ – название метода сервиса gRPC API, например `ExecuteDataQuery`. `api.grpc.response.bytes`
`RATE`, байты | Размер ответов, которые отправлены базой данный в определенный период времени.
Метки:
- _api_service_ – название сервиса gRPC API, например `table`.
- _method_ – название метода сервиса gRPC API, например `ExecuteDataQuery`. -`api.grpc.response.count`
`RATE`, штуки | Количество ответов, которые отправлены базой в определенный период времени.
Метки:
- _api_service_ – название сервиса gRPC API, например `table`.
- _method_ – название метода сервиса gRPC API, например `ExecuteDataQuery`.
- _status_ – статус выполнения запроса, подробнее статусы описаны в разделе [Обработка ошибок](../../reference/ydb-sdk/error_handling.md). +`api.grpc.response.count`
`RATE`, штуки | Количество ответов, которые отправлены базой в определенный период времени.
Метки:
- _api_service_ – название сервиса gRPC API, например `table`.
- _method_ – название метода сервиса gRPC API, например `ExecuteDataQuery`.
- _status_ – статус выполнения запроса, подробнее статусы описаны в разделе [Обработка ошибок](../../../reference/ydb-sdk/error_handling.md). `api.grpc.response.dropped_count`
`RATE`, штуки | Количество ответов, отправка которых была прекращена на на транспортном (gRPC) уровне из-за ошибки.
Метки:
- _api_service_ – название сервиса gRPC API, например `table`.
- _method_ – название метода сервиса gRPC API, например `ExecuteDataQuery`. -`api.grpc.response.issues`
`RATE`, штуки | Количество ошибок определенного типа, возникших при выполнении запросов в определенный период времени.
Метки:
- _issue_type_ – тип ошибки, единственное значение – `optimistic_locks_invalidation`, подробнее инвалидация блокировок описана в разделе [Транзакции и запросы к {{ ydb-short-name }}](../../concepts/transactions.md). +`api.grpc.response.issues`
`RATE`, штуки | Количество ошибок определенного типа, возникших при выполнении запросов в определенный период времени.
Метки:
- _issue_type_ – тип ошибки, единственное значение – `optimistic_locks_invalidation`, подробнее инвалидация блокировок описана в разделе [Транзакции и запросы к {{ ydb-short-name }}](../../../concepts/transactions.md). -### Метрики GRPC API для топиков {#grpc_api_topics} +## Метрики GRPC API для топиков {#grpc_api_topics} Имя метрики
Тип, единицы измерения | Описание
Метки ----- | ----- @@ -41,7 +40,7 @@ `grpc.topic.stream_write.sessions_active_count`
`GAUGE`, штуки | Количество открытых сессий записи.
Метки:
- _topic_ – название топика. `grpc.topic.stream_write.sessions_created`
`RATE`, штуки | Количество созданных сессий записи.
Метки:
- _topic_ – название топика. -### Метрики HTTP API {#http_api} +## Метрики HTTP API {#http_api} Имя метрики
Тип, единицы измерения | Описание
Метки ----- | ----- @@ -56,7 +55,7 @@ `api.http.data_streams.put_records.successful_messages`
`RATE`, штуки | Количество сообщений, отправленных методом `PutRecords`, которые были успешно записаны.
Метки:
- _topic_ – название топика. `api.http.data_streams.put_records.total_messages`
`RATE`, штуки | Количество сообщений, отправленных методом `PutRecords`.
Метки:
- _topic_ – название топика. -### Метрики Kafka API {#kafka_api} +## Метрики Kafka API {#kafka_api} Имя метрики
Тип, единицы измерения | Описание
Метки ----- | ----- @@ -69,14 +68,14 @@ `api.kafka.produce.successful_messages`
`RATE`, штуки | Количество сообщений в единицу времени, отправленных методом `PRODUCE`, которые были успешно записаны.
Метки:
- _topic_ – название топика. `api.kafka.produce.total_messages`
`RATE`, штуки | Количество сообщений в единицу времени, отправленных методом `PRODUCE`
Метки:
- _topic_ – название топика. -### Метрики сессий {#sessions} +## Метрики сессий {#sessions} Имя метрики
Тип, единицы измерения | Описание
Метки ----- | ----- `table.session.active_count`
`IGAUGE`, штуки | Количество сессий, открытых клиентами в данный момент времени. `table.session.closed_by_idle_count`
`RATE`, штуки | Количество сессий, которые закрыты по инициативе сервера баз данных в определенный период времени из-за превышения времени, выделенного на существование неактивной сессии. -### Метрики обработки транзакций {#transactions} +## Метрики обработки транзакций {#transactions} Длительность выполнения транзакции можно анализировать с помощью гистограммного счетчика. Интервалы заданы в миллисекундах. График показывает количество транзакций, длительность которых попадает в определенный интервал времени. @@ -86,7 +85,7 @@ `table.transaction.server_duration_milliseconds`
`HIST_RATE`, штуки | Количество транзакций определенной длительности выполнения на сервере. Длительность выполнения – это время выполнения запросов в транзакции на сервере. Не включет время ожидания на клиенте между отправкой отдельных запросов в одной транзакции.
Метки:
-_tx_kind_ – тип транзакции, возможные значения `read_only`, `read_write`, `write_only`, `pure`. `table.transaction.client_duration_milliseconds`
`HIST_RATE`, штуки | Количество транзакций определенной длительности выполнения на клиенте. Длительность выполнения – это время ожидания на клиенте между отправкой отдельных запросов в одной транзакции. Не включает время выполнения запросов на сервере.
Метки:
- _tx_kind_ – тип транзакции, возможные значения `read_only`, `read_write`, `write_only`, `pure`. -### Метрики обработки запросов {#queries} +## Метрики обработки запросов {#queries} Имя метрики
Тип, единицы измерения | Описание
Метки ----- | ----- @@ -101,7 +100,7 @@ `table.query.compilation.cache_misses`
`RATE`, штуки | Количество запросов в определенный период времени, для выполнения которых потребовалось компилировать запрос. `table.query.execution.latency_milliseconds`
`HIST_RATE`, штуки | Гистограммный счетчик. Интервалы заданы в миллисекундах. Показывает количество запросов, время выполнения которых попадает в определенный интервал. -### Метрики партиций таблиц {#datashards} +## Метрики партиций таблиц {#datashards} Имя метрики
Тип, единицы измерения | Описание
Метки ----- | ----- @@ -119,7 +118,7 @@ `table.datashard.erase.rows`
`RATE`, штуки | Количество строк, которые удалены в базе данных в определенный период времени. `table.datashard.erase.bytes`
`RATE`, байты | Размер данных, которые удалены в базе в определенный период времени. -### Метрики использования ресурсов (только для режима Dedicated) {#ydb_dedicated_resources} +## Метрики использования ресурсов (только для режима Dedicated) {#ydb_dedicated_resources} Имя метрики
Тип
единицы измерения | Описание
Метки ----- | ----- @@ -128,19 +127,19 @@ `resources.memory.used_bytes`
`IGAUGE`, байты | Использованная нодами базы данных оперативная память. `resources.memory.limit_bytes`
`IGAUGE`, байты | Доступная нодам базы данных оперативная память. -### Метрики обработки запросов (только для режима Dedicated) {#ydb_dedicated_queries} +## Метрики обработки запросов (только для режима Dedicated) {#ydb_dedicated_queries} Имя метрики
Тип
единицы измерения | Описание
Метки ----- | ----- -`table.query.compilation.cache_evictions`
`RATE`, штуки | Количество запросов, вытесненных из кэша [подготовленных запросов](../../reference/ydb-sdk/example/index.md#param-queries) в определенный период времени. -`table.query.compilation.cache_size_bytes`
`IGAUGE`, байты | Размер кэша [подготовленных запросов](../../reference/ydb-sdk/example/index.md#param-queries). -`table.query.compilation.cached_query_count`
`IGAUGE`, штуки | Размер кэша [подготовленных запросов](../../reference/ydb-sdk/example/index.md#param-queries). +`table.query.compilation.cache_evictions`
`RATE`, штуки | Количество запросов, вытесненных из кэша [подготовленных запросов](../../../reference/ydb-sdk/example/index.md#param-queries) в определенный период времени. +`table.query.compilation.cache_size_bytes`
`IGAUGE`, байты | Размер кэша [подготовленных запросов](../../../reference/ydb-sdk/example/index.md#param-queries). +`table.query.compilation.cached_query_count`
`IGAUGE`, штуки | Размер кэша [подготовленных запросов](../../../reference/ydb-sdk/example/index.md#param-queries). -### Метрики топиков {#topics} +## Метрики топиков {#topics} Имя метрики
Тип, единицы измерения | Описание
Метки ----- | ----- -`topic.producers_count`
`GAUGE`, штуки | Количество уникальных [источников](../concepts/topic#producer-id) топика.
Метки:
- _topic_ – название топика. +`topic.producers_count`
`GAUGE`, штуки | Количество уникальных [источников](../../../concepts/topic#producer-id) топика.
Метки:
- _topic_ – название топика. `topic.storage_bytes`
`GAUGE`, байты | Размер топика в байтах.
Метки:
- _topic_ – название топика. `topic.read.bytes`
`RATE`, байты | Количество байт, прочитанных из топика.
Метки:
- _topic_ – название топика.
- _consumer_ – имя читателя. `topic.read.messages`
`RATE`, штуки | Количество сообщений, прочитанных из топика.
Метки:
- _topic_ – название топика.
- _consumer_ – имя читателя. @@ -152,7 +151,7 @@ `topic.write.message_size_bytes`
`HIST_RATE`, штуки | Гистограммный счетчик. Интервалы заданы в байтах. Показывает количество сообщений, размер которых соответствует границам интервала.
Метки:
- _topic_ – название топика. `topic.write.lag_milliseconds`
`HIST_RATE`, штуки | Гистограммный счетчик. Интервалы заданы в миллисекундах. Показывает количество сообщений, у которых разница между временем записи и временем создания сообщения попадает в заданный интервал.
Метки:
- _topic_ – название топика. -### Агрегированные метрики партиций топика {#topics_partitions} +## Агрегированные метрики партиций топика {#topics_partitions} В следующей таблице приведены агрегированные метрики партиций для топика. Максимальные и минимальные значения считаются по всем партициям заданного топика. diff --git a/ydb/docs/ru/core/reference/observability/toc_p.yaml b/ydb/docs/ru/core/reference/observability/toc_p.yaml new file mode 100644 index 000000000000..b9a22a9f082e --- /dev/null +++ b/ydb/docs/ru/core/reference/observability/toc_p.yaml @@ -0,0 +1,3 @@ +items: +- name: Справка по метрикам + href: metrics/index.md diff --git a/ydb/docs/ru/core/reference/toc_p.yaml b/ydb/docs/ru/core/reference/toc_p.yaml index 8aae90523111..b1faf930907c 100644 --- a/ydb/docs/ru/core/reference/toc_p.yaml +++ b/ydb/docs/ru/core/reference/toc_p.yaml @@ -26,4 +26,8 @@ items: - name: YDB DStool include: mode: link - path: ydb-dstool/toc_p.yaml \ No newline at end of file + path: ydb-dstool/toc_p.yaml +- name: Observability + include: + mode: link + path: observability/toc_p.yaml \ No newline at end of file diff --git a/ydb/docs/ru/core/troubleshooting/_includes/system_views/intro_cluster.md b/ydb/docs/ru/core/troubleshooting/_includes/system_views/intro_cluster.md deleted file mode 100644 index 6c9d4a4cdeb9..000000000000 --- a/ydb/docs/ru/core/troubleshooting/_includes/system_views/intro_cluster.md +++ /dev/null @@ -1,5 +0,0 @@ -Для возможности внутренней интроспекции состояния кластера пользователю предоставляется возможность осуществлять запросы в специальные служебные таблицы (system views). Эти таблицы доступны из корневой директории кластера и используют системный префикс пути `.sys`. - -Пользователи облачных баз данных обычно не имеют доступа к системным таблицам кластера, так как за его поддержку и своевременную диагностику отвечает команда облака. - -В описаниях доступных полей далее по тексту колонка **Ключ** содержит индекс поля первичного ключа соответствующей таблицы. diff --git a/ydb/docs/ru/core/troubleshooting/_includes/system_views/notes.md b/ydb/docs/ru/core/troubleshooting/_includes/system_views/notes.md deleted file mode 100644 index bb8de470c003..000000000000 --- a/ydb/docs/ru/core/troubleshooting/_includes/system_views/notes.md +++ /dev/null @@ -1,5 +0,0 @@ -{% note info %} - -Обращение к системным таблицам имеет скорее аналитический характер нагрузки. Частое обращение к ним в больших базах будет существенно расходовать системные ресурсы. Рекомендуемая нагрузка не более 1-2 RPS. - -{% endnote %} diff --git a/ydb/docs/ru/core/troubleshooting/index.md b/ydb/docs/ru/core/troubleshooting/index.md deleted file mode 100644 index 81a913a87e1e..000000000000 --- a/ydb/docs/ru/core/troubleshooting/index.md +++ /dev/null @@ -1,7 +0,0 @@ -# Диагностика - -В данном разделе собраны статьи по инструментам диагностики баз данных YDB. - -- [Системные таблицы](system_views_db.md) -- [Метрики](monitoring.md) -- [Дашборды Grafana](../administration/grafana-dashboards.md) diff --git a/ydb/docs/ru/core/troubleshooting/monitoring.md b/ydb/docs/ru/core/troubleshooting/monitoring.md deleted file mode 100644 index 3204845af8ad..000000000000 --- a/ydb/docs/ru/core/troubleshooting/monitoring.md +++ /dev/null @@ -1,7 +0,0 @@ ---- -editable: false ---- - -# Справочник метрик - -{% include notitle [ydb_monitoring_sensors.md](_includes/monitoring_sensors.md) %} diff --git a/ydb/docs/ru/core/troubleshooting/system_views_cluster.md b/ydb/docs/ru/core/troubleshooting/system_views_cluster.md deleted file mode 100644 index d9700500622a..000000000000 --- a/ydb/docs/ru/core/troubleshooting/system_views_cluster.md +++ /dev/null @@ -1,7 +0,0 @@ -# Системные таблицы кластера - -{% include [intro.md](_includes/system_views/intro_cluster.md) %} - -{% include [distributed_storage.md](_includes/system_views/distributed_storage.md) %} - -{% include [notes.md](_includes/system_views/notes.md) %} diff --git a/ydb/docs/ru/core/troubleshooting/toc_i.yaml b/ydb/docs/ru/core/troubleshooting/toc_i.yaml deleted file mode 100644 index fd3e716f0e19..000000000000 --- a/ydb/docs/ru/core/troubleshooting/toc_i.yaml +++ /dev/null @@ -1,7 +0,0 @@ -items: -- name: Системные таблицы - href: system_views_cluster.md -- name: Мониторинг - href: monitoring.md - - \ No newline at end of file diff --git a/ydb/docs/ru/core/troubleshooting/toc_p.yaml b/ydb/docs/ru/core/troubleshooting/toc_p.yaml deleted file mode 100644 index 3e62ad228bcc..000000000000 --- a/ydb/docs/ru/core/troubleshooting/toc_p.yaml +++ /dev/null @@ -1,4 +0,0 @@ -items: -- name: Обзор - href: index.md -- include: { mode: link, path: toc_i.yaml } \ No newline at end of file From 272e18a097848811e3eb20c766d52272ddda7af7 Mon Sep 17 00:00:00 2001 From: Ivan Blinkov Date: Mon, 1 Apr 2024 16:58:07 +0700 Subject: [PATCH 08/13] move out operations/ --- .../manage-users-attr.md => dba/custom-attributes.md} | 0 ydb/docs/en/core/dba/index.md | 3 ++- .../crud.md => dba/query-plans-optimization.md} | 0 ydb/docs/en/core/dba/toc_i.yaml | 5 +++++ .../en/core/operations/query_plans_optimization.md | 1 - ydb/docs/en/core/operations/toc_i.yaml | 8 -------- ydb/docs/en/core/operations/toc_p.yaml | 2 -- ydb/docs/en/core/toc_i.yaml | 1 - ydb/docs/redirects.yaml | 10 +++++++--- ydb/docs/ru/core/concepts/datamodel/_includes/table.md | 2 +- .../manage-users-attr.md => dba/custom-attributes.md} | 0 ydb/docs/ru/core/dba/index.md | 3 ++- .../query-plans-optimization.md} | 0 ydb/docs/ru/core/dba/toc_i.yaml | 4 ++++ ydb/docs/ru/core/operations/crud.md | 0 ydb/docs/ru/core/operations/toc_i.yaml | 8 -------- ydb/docs/ru/core/operations/toc_p.yaml | 2 -- ydb/docs/ru/core/toc_i.yaml | 2 -- ydb/docs/ru/core/yql/query_plans.md | 2 +- 19 files changed, 22 insertions(+), 31 deletions(-) rename ydb/docs/en/core/{operations/manage-users-attr.md => dba/custom-attributes.md} (100%) rename ydb/docs/en/core/{operations/crud.md => dba/query-plans-optimization.md} (100%) delete mode 100644 ydb/docs/en/core/operations/query_plans_optimization.md delete mode 100644 ydb/docs/en/core/operations/toc_i.yaml delete mode 100644 ydb/docs/en/core/operations/toc_p.yaml rename ydb/docs/ru/core/{operations/manage-users-attr.md => dba/custom-attributes.md} (100%) rename ydb/docs/ru/core/{operations/query_plans_optimization.md => dba/query-plans-optimization.md} (100%) delete mode 100644 ydb/docs/ru/core/operations/crud.md delete mode 100644 ydb/docs/ru/core/operations/toc_i.yaml delete mode 100644 ydb/docs/ru/core/operations/toc_p.yaml diff --git a/ydb/docs/en/core/operations/manage-users-attr.md b/ydb/docs/en/core/dba/custom-attributes.md similarity index 100% rename from ydb/docs/en/core/operations/manage-users-attr.md rename to ydb/docs/en/core/dba/custom-attributes.md diff --git a/ydb/docs/en/core/dba/index.md b/ydb/docs/en/core/dba/index.md index f72dbeec13b3..a5bb289b6a7a 100644 --- a/ydb/docs/en/core/dba/index.md +++ b/ydb/docs/en/core/dba/index.md @@ -5,4 +5,5 @@ This section of {{ ydb-short-name }} documentation covers everything you need to The creation and management of databases are out of the scope of this section because in {{ ydb-short-name }} clusters these operations are either [executed by DevOps Engineers](../devops/index.md) or automated externally if you are using a managed service. - [Backup and recovery](backup-and-recovery.md) -- [Database system views](system-views.md) \ No newline at end of file +- [Database system views](system-views.md) +- [Custom attributes](custom-attributes.md) \ No newline at end of file diff --git a/ydb/docs/en/core/operations/crud.md b/ydb/docs/en/core/dba/query-plans-optimization.md similarity index 100% rename from ydb/docs/en/core/operations/crud.md rename to ydb/docs/en/core/dba/query-plans-optimization.md diff --git a/ydb/docs/en/core/dba/toc_i.yaml b/ydb/docs/en/core/dba/toc_i.yaml index 56be0e676091..e2fd4d426f6d 100644 --- a/ydb/docs/en/core/dba/toc_i.yaml +++ b/ydb/docs/en/core/dba/toc_i.yaml @@ -1,5 +1,10 @@ items: - name: Backup and recovery href: backup-and-recovery.md +- name: Query plans optimization + href: query-plans-optimization.md + hidden: true - name: System views href: system-views.md +- name: Custom attributes + href: custom-attributes.md diff --git a/ydb/docs/en/core/operations/query_plans_optimization.md b/ydb/docs/en/core/operations/query_plans_optimization.md deleted file mode 100644 index 3667a042788f..000000000000 --- a/ydb/docs/en/core/operations/query_plans_optimization.md +++ /dev/null @@ -1 +0,0 @@ -{% include [no-translation](../_includes/alerts/no-translation.md) %} \ No newline at end of file diff --git a/ydb/docs/en/core/operations/toc_i.yaml b/ydb/docs/en/core/operations/toc_i.yaml deleted file mode 100644 index e030da13fea9..000000000000 --- a/ydb/docs/en/core/operations/toc_i.yaml +++ /dev/null @@ -1,8 +0,0 @@ -items: -- name: Reading and writing data - href: crud.md - hidden: true -- name: Custom attributes in tables - href: manage-users-attr.md -- name: Query plans optimization - href: query_plans_optimization.md \ No newline at end of file diff --git a/ydb/docs/en/core/operations/toc_p.yaml b/ydb/docs/en/core/operations/toc_p.yaml deleted file mode 100644 index 5bfec4365def..000000000000 --- a/ydb/docs/en/core/operations/toc_p.yaml +++ /dev/null @@ -1,2 +0,0 @@ -items: -- include: { mode: link, path: toc_i.yaml } \ No newline at end of file diff --git a/ydb/docs/en/core/toc_i.yaml b/ydb/docs/en/core/toc_i.yaml index a0130f91169a..7fab90b5fdeb 100644 --- a/ydb/docs/en/core/toc_i.yaml +++ b/ydb/docs/en/core/toc_i.yaml @@ -20,7 +20,6 @@ items: mode: link path: contributor/toc_p.yaml -- { name: Tutorials, include: { mode: link, path: operations/toc_p.yaml } } - { name: Recommendations, include: { mode: link, path: best_practices/toc_p.yaml } } - name: Reference diff --git a/ydb/docs/redirects.yaml b/ydb/docs/redirects.yaml index a21978f730ad..7a726c55b019 100644 --- a/ydb/docs/redirects.yaml +++ b/ydb/docs/redirects.yaml @@ -38,9 +38,9 @@ common: - from: /getting_started/yql.md to: /yql/reference/index.md - from: /troubleshooting/system_views_cluster.md - to: /devops/manuakl/system-views.md + to: /devops/manual/system-views.md -# Redirects from db to dba +# DBA-related redirects - from: /db/index.md to: /dba/index.md - from: /maintenance/backup_and_recovery.md @@ -49,8 +49,12 @@ common: to: /dba/system-views.md - from: /troubleshooting/system_views_db.md to: /dba/system-views.md + - from: /operations/manage-users-attr.md + to: /dba/custom-attributes.md + - from: /operations/query_plans_optimization.md + to: /dba/query-plans-optimization.md -# Redirects from development to contributor +# Contributors-related redirects - from: /development/build-ya.md to: /contributor/build-ya.md - from: /development/datashard-locks-and-change-visibility.md diff --git a/ydb/docs/ru/core/concepts/datamodel/_includes/table.md b/ydb/docs/ru/core/concepts/datamodel/_includes/table.md index 65d27d43c100..2f86ebcc2886 100644 --- a/ydb/docs/ru/core/concepts/datamodel/_includes/table.md +++ b/ydb/docs/ru/core/concepts/datamodel/_includes/table.md @@ -188,7 +188,7 @@ YDB поддерживает создание строковых и колоно * длина значения — 1–4096 байт; * максимальный общий размер атрибутов (сумма длин всех ключей и значений) — 10240 байт. -О том, как добавить, изменить, получить текущие значения или удалить атрибуты читайте в статье [{#T}](../../../operations/manage-users-attr.md). +О том, как добавить, изменить, получить текущие значения или удалить атрибуты читайте в статье [{#T}](../../../dba/custom-attributes.md). diff --git a/ydb/docs/ru/core/operations/manage-users-attr.md b/ydb/docs/ru/core/dba/custom-attributes.md similarity index 100% rename from ydb/docs/ru/core/operations/manage-users-attr.md rename to ydb/docs/ru/core/dba/custom-attributes.md diff --git a/ydb/docs/ru/core/dba/index.md b/ydb/docs/ru/core/dba/index.md index f2c62286b98e..41bb2752d62b 100644 --- a/ydb/docs/ru/core/dba/index.md +++ b/ydb/docs/ru/core/dba/index.md @@ -6,4 +6,5 @@ - [Резервное копирование и восстановление](backup-and-recovery.md) - [Системные таблицы базы данных](system-views.md) -- [Управление {{ ydb-short-name }} с помощью Terraform](terraform.md) \ No newline at end of file +- [Управление {{ ydb-short-name }} с помощью Terraform](terraform.md) +- [Пользовательские атрибуты таблиц](custom-attributes.md) \ No newline at end of file diff --git a/ydb/docs/ru/core/operations/query_plans_optimization.md b/ydb/docs/ru/core/dba/query-plans-optimization.md similarity index 100% rename from ydb/docs/ru/core/operations/query_plans_optimization.md rename to ydb/docs/ru/core/dba/query-plans-optimization.md diff --git a/ydb/docs/ru/core/dba/toc_i.yaml b/ydb/docs/ru/core/dba/toc_i.yaml index 24718e3bbab3..8ef330c183d5 100644 --- a/ydb/docs/ru/core/dba/toc_i.yaml +++ b/ydb/docs/ru/core/dba/toc_i.yaml @@ -1,7 +1,11 @@ items: - name: Резервное копирование и восстановление href: backup-and-recovery.md +- name: Оптимизация планов запросов + href: query-plans-optimization.md - name: Системные таблицы href: system-views.md - name: Terraform href: terraform.md +- name: Пользовательские атрибуты + href: custom-attributes.md \ No newline at end of file diff --git a/ydb/docs/ru/core/operations/crud.md b/ydb/docs/ru/core/operations/crud.md deleted file mode 100644 index e69de29bb2d1..000000000000 diff --git a/ydb/docs/ru/core/operations/toc_i.yaml b/ydb/docs/ru/core/operations/toc_i.yaml deleted file mode 100644 index 1d5ad668c08b..000000000000 --- a/ydb/docs/ru/core/operations/toc_i.yaml +++ /dev/null @@ -1,8 +0,0 @@ -items: -- name: Чтение и запись данных - href: crud.md - hidden: true -- name: Пользовательские атрибуты таблицы - href: manage-users-attr.md -- name: Использование планов при оптимизации запросов - href: query_plans_optimization.md diff --git a/ydb/docs/ru/core/operations/toc_p.yaml b/ydb/docs/ru/core/operations/toc_p.yaml deleted file mode 100644 index 5bfec4365def..000000000000 --- a/ydb/docs/ru/core/operations/toc_p.yaml +++ /dev/null @@ -1,2 +0,0 @@ -items: -- include: { mode: link, path: toc_i.yaml } \ No newline at end of file diff --git a/ydb/docs/ru/core/toc_i.yaml b/ydb/docs/ru/core/toc_i.yaml index 1c8224eb9b51..3fea68476f84 100644 --- a/ydb/docs/ru/core/toc_i.yaml +++ b/ydb/docs/ru/core/toc_i.yaml @@ -20,8 +20,6 @@ items: mode: link path: contributor/toc_p.yaml -# Main -- { name: Практические руководства, include: { mode: link, path: operations/toc_p.yaml } } - { name: Рекомендации, include: { mode: link, path: best_practices/toc_p.yaml } } diff --git a/ydb/docs/ru/core/yql/query_plans.md b/ydb/docs/ru/core/yql/query_plans.md index 1c22e2b7b27d..ffdf74590137 100644 --- a/ydb/docs/ru/core/yql/query_plans.md +++ b/ydb/docs/ru/core/yql/query_plans.md @@ -3,7 +3,7 @@ Чтобы лучше понимать работу запроса, вы можете получить и проанализировать его план. Структура плана запроса в {{ ydb-short-name }} представляет собой граф, где каждый узел содержит информацию об операциях и таблицах. -Ниже представлена справочная информация по типам узлов, а пример анализа конкретного плана запроса можно посмотреть [здесь](../operations/query_plans_optimization.md). +Ниже представлена справочная информация по типам узлов, а пример анализа конкретного плана запроса можно посмотреть [здесь](../dba/query-plans-optimization.md). ## Типы узлов ### Stage From 4d1cf86c109b29c191a51b74cbbdc58939a60532 Mon Sep 17 00:00:00 2001 From: Ivan Blinkov Date: Mon, 1 Apr 2024 17:07:50 +0700 Subject: [PATCH 09/13] "For Developers" section stub --- ydb/docs/en/core/dev/index.md | 5 +++++ ydb/docs/en/core/dev/toc_p.yaml | 3 +++ ydb/docs/en/core/devops/index.md | 2 +- ydb/docs/en/core/toc_i.yaml | 6 +++++- ydb/docs/ru/core/dev/index.md | 5 +++++ ydb/docs/ru/core/dev/toc_p.yaml | 3 +++ ydb/docs/ru/core/toc_i.yaml | 4 ++++ 7 files changed, 26 insertions(+), 2 deletions(-) create mode 100644 ydb/docs/en/core/dev/index.md create mode 100644 ydb/docs/en/core/dev/toc_p.yaml create mode 100644 ydb/docs/ru/core/dev/index.md create mode 100644 ydb/docs/ru/core/dev/toc_p.yaml diff --git a/ydb/docs/en/core/dev/index.md b/ydb/docs/en/core/dev/index.md new file mode 100644 index 000000000000..18f081feb70e --- /dev/null +++ b/ydb/docs/en/core/dev/index.md @@ -0,0 +1,5 @@ +# {{ ydb-short-name }} for Application Developers / Software Engineers + +This section of {{ ydb-short-name }} documentation covers everything you need to know to develop applications interacting with YDB. + +If you're interested in developing {{ ydb-short-name }} core or satellite projects, refer to the[documentation for contributors](../contributor/index.md). \ No newline at end of file diff --git a/ydb/docs/en/core/dev/toc_p.yaml b/ydb/docs/en/core/dev/toc_p.yaml new file mode 100644 index 000000000000..b73cf38b3a85 --- /dev/null +++ b/ydb/docs/en/core/dev/toc_p.yaml @@ -0,0 +1,3 @@ +items: +- name: Overview + href: index.md \ No newline at end of file diff --git a/ydb/docs/en/core/devops/index.md b/ydb/docs/en/core/devops/index.md index 9bf028b1b0ae..39eb4c39d192 100644 --- a/ydb/docs/en/core/devops/index.md +++ b/ydb/docs/en/core/devops/index.md @@ -1,4 +1,4 @@ -# {{ ydb-short-name }} for SRE +# {{ ydb-short-name }} for DevOps Engineers This section of {{ ydb-short-name }} documentation covers everything you need to know to run a production-grade {{ ydb-short-name }} cluster. It is subdivided based on what's your preferred approach to managing infrastructure: diff --git a/ydb/docs/en/core/toc_i.yaml b/ydb/docs/en/core/toc_i.yaml index 7fab90b5fdeb..8726a570a177 100644 --- a/ydb/docs/en/core/toc_i.yaml +++ b/ydb/docs/en/core/toc_i.yaml @@ -15,7 +15,11 @@ items: include: mode: link path: dba/toc_p.yaml -- name: For contributors +- name: For Developers + include: + mode: link + path: dev/toc_p.yaml +- name: For Contributors include: mode: link path: contributor/toc_p.yaml diff --git a/ydb/docs/ru/core/dev/index.md b/ydb/docs/ru/core/dev/index.md new file mode 100644 index 000000000000..c7024fd656d7 --- /dev/null +++ b/ydb/docs/ru/core/dev/index.md @@ -0,0 +1,5 @@ +# {{ ydb-short-name }} для разработчиков приложений + +В этом разделе документации {{ ydb-short-name }} описано всё, что нужно знать для разработки приложений, взаимодействующих с {{ ydb-short-name }}. + +Если же вам интересная разработка ядра {{ ydb-short-name }} или сопутствующих проектов, обратитесь к [документации для контрибьюторов](../contributor/index.md). \ No newline at end of file diff --git a/ydb/docs/ru/core/dev/toc_p.yaml b/ydb/docs/ru/core/dev/toc_p.yaml new file mode 100644 index 000000000000..b73cf38b3a85 --- /dev/null +++ b/ydb/docs/ru/core/dev/toc_p.yaml @@ -0,0 +1,3 @@ +items: +- name: Overview + href: index.md \ No newline at end of file diff --git a/ydb/docs/ru/core/toc_i.yaml b/ydb/docs/ru/core/toc_i.yaml index 3fea68476f84..17ae3db27a80 100644 --- a/ydb/docs/ru/core/toc_i.yaml +++ b/ydb/docs/ru/core/toc_i.yaml @@ -15,6 +15,10 @@ items: include: mode: link path: dba/toc_p.yaml +- name: Для разработчиков + include: + mode: link + path: dev/toc_p.yaml - name: Для контрибьюторов include: mode: link From 55a9f0c95229eb6cb86fa2a77dd25c90bb31981a Mon Sep 17 00:00:00 2001 From: Ivan Blinkov Date: Mon, 1 Apr 2024 18:20:22 +0700 Subject: [PATCH 10/13] move out best_practices/ --- .../en/core/best_practices/_includes/index.md | 10 -------- .../best_practices/_includes/schema_design.md | 2 -- .../_includes/table_sharding.md | 2 -- .../en/core/best_practices/batch_upload.md | 2 -- ydb/docs/en/core/best_practices/index.md | 1 - ydb/docs/en/core/best_practices/paging.md | 3 --- .../en/core/best_practices/pk_scalability.md | 6 ----- .../en/core/best_practices/schema_design.md | 2 -- .../core/best_practices/secondary_indexes.md | 3 --- .../en/core/best_practices/table_sharding.md | 2 -- ydb/docs/en/core/best_practices/timeouts.md | 2 -- ydb/docs/en/core/best_practices/toc_i.yaml | 24 ------------------- ydb/docs/en/core/best_practices/toc_p.yaml | 2 -- ydb/docs/en/core/changelog-cli.md | 2 +- ydb/docs/en/core/changelog-server.md | 2 +- .../concepts/_includes/secondary_indexes.md | 2 +- ydb/docs/en/core/concepts/cdc.md | 2 +- .../concepts/datamodel/_includes/table.md | 8 +++---- .../en/core/{best_practices => dba}/cdc.md | 2 +- ydb/docs/en/core/dba/index.md | 7 +++++- .../primary-key/column-oriented.md} | 2 +- ydb/docs/en/core/dba/primary-key/index.md | 6 +++++ .../primary-key/row-oriented.md} | 2 +- ydb/docs/en/core/dba/primary-key/toc_p.yaml | 7 ++++++ .../secondary-indexes.md} | 22 ++++++++--------- ydb/docs/en/core/dba/terraform.md | 1 + ydb/docs/en/core/dba/toc_i.yaml | 11 +++++++++ .../batch_upload.md => dev/batch-upload.md} | 0 .../_includes => dev}/paging.md | 0 .../_includes => dev}/timeouts.md | 0 ydb/docs/en/core/dev/toc_p.yaml | 8 ++++++- ydb/docs/en/core/faq/_includes/common.md | 6 ++--- ydb/docs/en/core/faq/_includes/yql.md | 2 +- ydb/docs/en/core/quickstart.md | 2 +- .../commands/_includes/secondary_index.md | 2 +- .../commands/workload/_includes/stock.md | 6 ++--- .../en/core/reference/ydb-cli/workload-kv.md | 6 ++--- ydb/docs/en/core/toc_i.yaml | 3 --- ydb/docs/redirects.yaml | 20 ++++++++++++++++ .../ru/core/best_practices/_includes/index.md | 10 -------- .../best_practices/_includes/schema_design.md | 1 - .../_includes/table_sharding.md | 1 - .../ru/core/best_practices/batch_upload.md | 2 -- ydb/docs/ru/core/best_practices/index.md | 1 - ydb/docs/ru/core/best_practices/paging.md | 3 --- .../ru/core/best_practices/pk_scalability.md | 6 ----- .../ru/core/best_practices/schema_design.md | 2 -- .../core/best_practices/secondary_indexes.md | 3 --- .../ru/core/best_practices/table_sharding.md | 2 -- ydb/docs/ru/core/best_practices/timeouts.md | 2 -- ydb/docs/ru/core/best_practices/toc_i.yaml | 24 ------------------- ydb/docs/ru/core/best_practices/toc_p.yaml | 2 -- ydb/docs/ru/core/changelog-cli.md | 2 +- ydb/docs/ru/core/changelog-server.md | 2 +- .../concepts/_includes/secondary_indexes.md | 2 +- ydb/docs/ru/core/concepts/cdc.md | 2 +- .../concepts/datamodel/_includes/table.md | 6 ++--- .../ru/core/{best_practices => dba}/cdc.md | 0 .../primary-key/column-oriented.md} | 0 ydb/docs/ru/core/dba/primary-key/index.md | 6 +++++ .../primary-key/row-oriented.md} | 0 ydb/docs/ru/core/dba/primary-key/toc_p.yaml | 7 ++++++ .../ru/core/dba/query-plans-optimization.md | 2 +- .../secondary-indexes.md} | 18 +++++++------- ydb/docs/ru/core/dba/terraform.md | 2 +- ydb/docs/ru/core/dba/toc_i.yaml | 14 ++++++++--- .../batch_upload.md => dev/batch-upload.md} | 0 .../_includes => dev}/paging.md | 0 .../_includes => dev}/timeouts.md | 6 +---- ydb/docs/ru/core/dev/toc_p.yaml | 8 ++++++- ydb/docs/ru/core/faq/_includes/common.md | 6 ++--- ydb/docs/ru/core/faq/_includes/yql.md | 2 +- ydb/docs/ru/core/quickstart.md | 2 +- .../commands/_includes/secondary_index.md | 2 +- .../commands/workload/_includes/stock.md | 6 ++--- .../ru/core/reference/ydb-cli/workload-kv.md | 6 ++--- ydb/docs/ru/core/toc_i.yaml | 3 --- 77 files changed, 154 insertions(+), 201 deletions(-) delete mode 100644 ydb/docs/en/core/best_practices/_includes/index.md delete mode 100644 ydb/docs/en/core/best_practices/_includes/schema_design.md delete mode 100644 ydb/docs/en/core/best_practices/_includes/table_sharding.md delete mode 100644 ydb/docs/en/core/best_practices/batch_upload.md delete mode 100644 ydb/docs/en/core/best_practices/index.md delete mode 100644 ydb/docs/en/core/best_practices/paging.md delete mode 100644 ydb/docs/en/core/best_practices/pk_scalability.md delete mode 100644 ydb/docs/en/core/best_practices/schema_design.md delete mode 100644 ydb/docs/en/core/best_practices/secondary_indexes.md delete mode 100644 ydb/docs/en/core/best_practices/table_sharding.md delete mode 100644 ydb/docs/en/core/best_practices/timeouts.md delete mode 100644 ydb/docs/en/core/best_practices/toc_i.yaml delete mode 100644 ydb/docs/en/core/best_practices/toc_p.yaml rename ydb/docs/en/core/{best_practices => dba}/cdc.md (94%) rename ydb/docs/en/core/{best_practices/pk-olap-scalability.md => dba/primary-key/column-oriented.md} (98%) create mode 100644 ydb/docs/en/core/dba/primary-key/index.md rename ydb/docs/en/core/{best_practices/_includes/pk_scalability.md => dba/primary-key/row-oriented.md} (98%) create mode 100644 ydb/docs/en/core/dba/primary-key/toc_p.yaml rename ydb/docs/en/core/{best_practices/_includes/secondary_indexes.md => dba/secondary-indexes.md} (71%) create mode 100644 ydb/docs/en/core/dba/terraform.md rename ydb/docs/en/core/{best_practices/_includes/batch_upload.md => dev/batch-upload.md} (100%) rename ydb/docs/en/core/{best_practices/_includes => dev}/paging.md (100%) rename ydb/docs/en/core/{best_practices/_includes => dev}/timeouts.md (100%) delete mode 100644 ydb/docs/ru/core/best_practices/_includes/index.md delete mode 100644 ydb/docs/ru/core/best_practices/_includes/schema_design.md delete mode 100644 ydb/docs/ru/core/best_practices/_includes/table_sharding.md delete mode 100644 ydb/docs/ru/core/best_practices/batch_upload.md delete mode 100644 ydb/docs/ru/core/best_practices/index.md delete mode 100644 ydb/docs/ru/core/best_practices/paging.md delete mode 100644 ydb/docs/ru/core/best_practices/pk_scalability.md delete mode 100644 ydb/docs/ru/core/best_practices/schema_design.md delete mode 100644 ydb/docs/ru/core/best_practices/secondary_indexes.md delete mode 100644 ydb/docs/ru/core/best_practices/table_sharding.md delete mode 100644 ydb/docs/ru/core/best_practices/timeouts.md delete mode 100644 ydb/docs/ru/core/best_practices/toc_i.yaml delete mode 100644 ydb/docs/ru/core/best_practices/toc_p.yaml rename ydb/docs/ru/core/{best_practices => dba}/cdc.md (100%) rename ydb/docs/ru/core/{best_practices/pk-olap-scalability.md => dba/primary-key/column-oriented.md} (100%) create mode 100644 ydb/docs/ru/core/dba/primary-key/index.md rename ydb/docs/ru/core/{best_practices/_includes/pk_scalability.md => dba/primary-key/row-oriented.md} (100%) create mode 100644 ydb/docs/ru/core/dba/primary-key/toc_p.yaml rename ydb/docs/ru/core/{best_practices/_includes/secondary_indexes.md => dba/secondary-indexes.md} (82%) rename ydb/docs/ru/core/{best_practices/_includes/batch_upload.md => dev/batch-upload.md} (100%) rename ydb/docs/ru/core/{best_practices/_includes => dev}/paging.md (100%) rename ydb/docs/ru/core/{best_practices/_includes => dev}/timeouts.md (88%) diff --git a/ydb/docs/en/core/best_practices/_includes/index.md b/ydb/docs/en/core/best_practices/_includes/index.md deleted file mode 100644 index 4aa758e4b800..000000000000 --- a/ydb/docs/en/core/best_practices/_includes/index.md +++ /dev/null @@ -1,10 +0,0 @@ -# Recommendations - -This section contains articles about the purpose, specifics, and best practices of using YDB tools for app development. - -- [Choosing a primary key for maximum performance](../pk_scalability.md) -- [Secondary indexes](../secondary_indexes.md) -- [Paginated output](../paging.md) -- [Uploading large data volumes](../batch_upload.md) -- [Using timeouts](../timeouts.md) - diff --git a/ydb/docs/en/core/best_practices/_includes/schema_design.md b/ydb/docs/en/core/best_practices/_includes/schema_design.md deleted file mode 100644 index 331cf83b08c8..000000000000 --- a/ydb/docs/en/core/best_practices/_includes/schema_design.md +++ /dev/null @@ -1,2 +0,0 @@ -This article has been deleted. Its content has been moved to [Impact of the primary key on performance](../pk_scalability.md). - diff --git a/ydb/docs/en/core/best_practices/_includes/table_sharding.md b/ydb/docs/en/core/best_practices/_includes/table_sharding.md deleted file mode 100644 index 57291253c345..000000000000 --- a/ydb/docs/en/core/best_practices/_includes/table_sharding.md +++ /dev/null @@ -1,2 +0,0 @@ -This article has been deleted. Its content has been moved to [Partitioning tables](../../concepts/datamodel/table.md#partitioning) in the article about data schema objects in the "Concepts" section. - diff --git a/ydb/docs/en/core/best_practices/batch_upload.md b/ydb/docs/en/core/best_practices/batch_upload.md deleted file mode 100644 index e2e399826c4b..000000000000 --- a/ydb/docs/en/core/best_practices/batch_upload.md +++ /dev/null @@ -1,2 +0,0 @@ -{% include [batch_upload.md](_includes/batch_upload.md) %} - diff --git a/ydb/docs/en/core/best_practices/index.md b/ydb/docs/en/core/best_practices/index.md deleted file mode 100644 index eb2590567da8..000000000000 --- a/ydb/docs/en/core/best_practices/index.md +++ /dev/null @@ -1 +0,0 @@ -{% include [_includes/index.md](_includes/index.md) %} \ No newline at end of file diff --git a/ydb/docs/en/core/best_practices/paging.md b/ydb/docs/en/core/best_practices/paging.md deleted file mode 100644 index 93d9375281d1..000000000000 --- a/ydb/docs/en/core/best_practices/paging.md +++ /dev/null @@ -1,3 +0,0 @@ - -{% include [paging.md](_includes/paging.md) %} - diff --git a/ydb/docs/en/core/best_practices/pk_scalability.md b/ydb/docs/en/core/best_practices/pk_scalability.md deleted file mode 100644 index 1cbf3a123c42..000000000000 --- a/ydb/docs/en/core/best_practices/pk_scalability.md +++ /dev/null @@ -1,6 +0,0 @@ ---- -title: "Instructions for selecting a primary key for maximum performance in {{ ydb-short-name }}" -description: "This article describes general guidelines for selecting a primary key in {{ ydb-short-name }}. We review the methods of distributing the load evenly across table partitions." ---- - -{% include [pk_scalability.md](_includes/pk_scalability.md) %} diff --git a/ydb/docs/en/core/best_practices/schema_design.md b/ydb/docs/en/core/best_practices/schema_design.md deleted file mode 100644 index 18ab3a34ac44..000000000000 --- a/ydb/docs/en/core/best_practices/schema_design.md +++ /dev/null @@ -1,2 +0,0 @@ - -{% include [timeouts.md](_includes/schema_design.md) %} diff --git a/ydb/docs/en/core/best_practices/secondary_indexes.md b/ydb/docs/en/core/best_practices/secondary_indexes.md deleted file mode 100644 index 7a4630af6756..000000000000 --- a/ydb/docs/en/core/best_practices/secondary_indexes.md +++ /dev/null @@ -1,3 +0,0 @@ - -{% include [secondary_indexes.md](_includes/secondary_indexes.md) %} - diff --git a/ydb/docs/en/core/best_practices/table_sharding.md b/ydb/docs/en/core/best_practices/table_sharding.md deleted file mode 100644 index 05274ea28927..000000000000 --- a/ydb/docs/en/core/best_practices/table_sharding.md +++ /dev/null @@ -1,2 +0,0 @@ - -{% include [timeouts.md](_includes/table_sharding.md) %} diff --git a/ydb/docs/en/core/best_practices/timeouts.md b/ydb/docs/en/core/best_practices/timeouts.md deleted file mode 100644 index 48cb4d6cf339..000000000000 --- a/ydb/docs/en/core/best_practices/timeouts.md +++ /dev/null @@ -1,2 +0,0 @@ - -{% include [timeouts.md](_includes/timeouts.md) %} diff --git a/ydb/docs/en/core/best_practices/toc_i.yaml b/ydb/docs/en/core/best_practices/toc_i.yaml deleted file mode 100644 index 2f92347f1a5a..000000000000 --- a/ydb/docs/en/core/best_practices/toc_i.yaml +++ /dev/null @@ -1,24 +0,0 @@ -items: -- name: Overview - href: index.md -- name: Selecting a primary key for maximum performance - href: pk_scalability.md -- name: Selecting a primary key for maximum analytical table performance - href: pk-olap-scalability.md -- name: Schema design - href: schema_design.md - hidden: true -- name: Partitioning tables - href: table_sharding.md - hidden: true -- name: Secondary indexes - href: secondary_indexes.md -- name: Change Data Capture - href: cdc.md - when: feature_changefeed -- name: Paginated output - href: paging.md -- name: Uploading large data volumes - href: batch_upload.md -- name: Using timeouts - href: timeouts.md diff --git a/ydb/docs/en/core/best_practices/toc_p.yaml b/ydb/docs/en/core/best_practices/toc_p.yaml deleted file mode 100644 index 5bfec4365def..000000000000 --- a/ydb/docs/en/core/best_practices/toc_p.yaml +++ /dev/null @@ -1,2 +0,0 @@ -items: -- include: { mode: link, path: toc_i.yaml } \ No newline at end of file diff --git a/ydb/docs/en/core/changelog-cli.md b/ydb/docs/en/core/changelog-cli.md index 0642920827b2..755ce6bc0199 100644 --- a/ydb/docs/en/core/changelog-cli.md +++ b/ydb/docs/en/core/changelog-cli.md @@ -137,7 +137,7 @@ Release date: May 1, 2023. To update to version **2.3.0**, select the [Downloads **Features:** * Added the interactive mode of query execution. To switch to the interactive mode, run [ydb yql](reference/ydb-cli/yql.md) without arguments. This mode is experimental: backward compatibility is not guaranteed yet. -* Added the [ydb index rename](reference/ydb-cli/commands/secondary_index.md#rename) command for [atomic replacement](best_practices/secondary_indexes.md#atomic-index-replacement) or renaming of a secondary index. +* Added the [ydb index rename](reference/ydb-cli/commands/secondary_index.md#rename) command for [atomic replacement](dba/secondary-indexes.md#atomic-index-replacement) or renaming of a secondary index. * Added the `ydb workload topic` command for generating the load that reads messages from topics and writes messages to topics. * Added the [--recursive](reference/ydb-cli/commands/dir.md#rmdir-options) option for the `ydb scheme rmdir` command. Use it to delete a directory recursively, with all its content. * Added support for the `topic` and `coordination node` types in the [ydb scheme describe](reference/ydb-cli/commands/scheme-describe.md) command. diff --git a/ydb/docs/en/core/changelog-server.md b/ydb/docs/en/core/changelog-server.md index 6536982f3094..890cef609d1f 100644 --- a/ydb/docs/en/core/changelog-server.md +++ b/ydb/docs/en/core/changelog-server.md @@ -154,7 +154,7 @@ Release date: May 5, 2023. To update to version 23.1, select the [Downloads](dow **Functionality:** * Added [initial table scan](concepts/cdc.md#initial-scan) when creating a CDC changefeed. Now, you can export all the data existing at the time of changefeed creation. -* Added [atomic index replacement](best_practices/secondary_indexes.md#atomic-index-replacement). Now, you can atomically replace one pre-defined index with another. This operation is absolutely transparent for your application. Indexes are replaced seamlessly, with no downtime. +* Added [atomic index replacement](dba/secondary-indexes.md#atomic-index-replacement). Now, you can atomically replace one pre-defined index with another. This operation is absolutely transparent for your application. Indexes are replaced seamlessly, with no downtime. * Added the [audit log](cluster/audit-log.md): Event stream including data about all the operations on {{ ydb-short-name }} objects. **Performance:** diff --git a/ydb/docs/en/core/concepts/_includes/secondary_indexes.md b/ydb/docs/en/core/concepts/_includes/secondary_indexes.md index e57ce1cf7ad0..deaaca26fc08 100644 --- a/ydb/docs/en/core/concepts/_includes/secondary_indexes.md +++ b/ydb/docs/en/core/concepts/_includes/secondary_indexes.md @@ -59,5 +59,5 @@ A secondary index can be: ## Purpose and use of secondary indexes {#best_practices} -For information about the purpose and use of secondary indexes for app development, see the [recommendations](../../best_practices/secondary_indexes.md). +For information about the purpose and use of secondary indexes for app development, see the [recommendations](../../dba/secondary-indexes.md). diff --git a/ydb/docs/en/core/concepts/cdc.md b/ydb/docs/en/core/concepts/cdc.md index d4118d57ff13..bdc9c215818d 100644 --- a/ydb/docs/en/core/concepts/cdc.md +++ b/ydb/docs/en/core/concepts/cdc.md @@ -243,4 +243,4 @@ You can add a changefeed to an existing table or erase it using the [ADD CHANGEF ## CDC purpose and use {#best_practices} -For information about using CDC when developing apps, see [best practices](../best_practices/cdc.md). +For information about using CDC when developing apps, see [best practices](../dba/cdc.md). diff --git a/ydb/docs/en/core/concepts/datamodel/_includes/table.md b/ydb/docs/en/core/concepts/datamodel/_includes/table.md index beb675136da4..11281be52bc0 100644 --- a/ydb/docs/en/core/concepts/datamodel/_includes/table.md +++ b/ydb/docs/en/core/concepts/datamodel/_includes/table.md @@ -28,7 +28,7 @@ Searching using an index allows you to swiftly locate the required rows without You can create a row-oriented table through the YDB web interface, CLI, or SDK. Regardless of the method you choose to interact with YDB, it's important to keep in mind the following rule: the table must have at least one primary key column, and it's permissible to create a table consisting solely of primary key columns. -By default, when creating a row-oriented table, all columns are optional and can have `NULL` values. This behavior can be modified by setting the `NOT NULL` conditions for key columns that are part of the primary key. Primary keys are unique, and row-oriented tables are always sorted by this key. This means that point reads by the key, as well as range queries by key or key prefix, are efficiently executed (essentially using an index). It's permissible to create a table consisting solely of key columns. When choosing a key, it's crucial to be careful, so we recommend reviewing the article: ["Choosing a Primary Key for Maximum Performance"](../../../best_practices/pk_scalability.md). +By default, when creating a row-oriented table, all columns are optional and can have `NULL` values. This behavior can be modified by setting the `NOT NULL` conditions for key columns that are part of the primary key. Primary keys are unique, and row-oriented tables are always sorted by this key. This means that point reads by the key, as well as range queries by key or key prefix, are efficiently executed (essentially using an index). It's permissible to create a table consisting solely of key columns. When choosing a key, it's crucial to be careful, so we recommend reviewing the article: ["Choosing a Primary Key for Maximum Performance"](../../../dba/primary-key/row-oriented.md). ### Partitioning row-oriented tables {#partitioning} @@ -167,9 +167,9 @@ Column-oriented {{ ydb-short-name }} tables are in the Preview mode. {% endnote %} -YDB's column-oriented tables stores data of each column separately (independently) from each other. This data storage principle is optimized for handling Online Analytical Processing (OLAP) workloads, as only the columns directly involved in the query are read during its execution. One of the key advantages of this approach is the high data compression ratios since columns often contain repetitive or similar data. A downside, however, is that operations on whole rows become more resource-intensive. +YDB's column-oriented tables store data of each column separately (independently) from each other. This data storage principle is optimized for handling Online Analytical Processing (OLAP) workloads, as only the columns directly involved in the query are read during its execution. One of the key advantages of this approach is the high data compression ratios since columns often contain repetitive or similar data. A downside, however, is that operations on whole rows become more resource-intensive. -At the moment, the main use case for YDB column-oriented tables is writing data with an increasing primary key (for example, event time), analyzing this data, and deleting outdated data based on TTL. The optimal way to add data to YDB column-oriented tables is [batch upload](../../../best_practices/batch_upload.md), performed in MB-sized blocks. Data packet insertion is atomic: data will be written either to all partitions or none. +At the moment, the main use case for YDB column-oriented tables is writing data with an increasing primary key (for example, event time), analyzing this data, and deleting outdated data based on TTL. The optimal way to add data to YDB column-oriented tables is [batch upload](../../../dev/batch-upload.md), performed in MB-sized blocks. Data packet insertion is atomic: data will be written either to all partitions or none. In most cases, working with YDB column-oriented tables is similar to working with row tables, but there are differences: * Only `NOT NULL` columns can be used as the primary key. @@ -221,7 +221,7 @@ WITH (STORE = COLUMN); Unlike data partitioning in row-oriented {{ ydb-short-name }} tables, key values are not used to partition data in column-oriented tables. This way, you can uniformly distribute data across all your existing partitions. This kind of partitioning enables you to avoid hotspots at data inserta and speeding up analytical queries that process (that is, read) large amounts of data. -How you select partitioning keys substantially affects the performance of queries to your column-oriented tables. Learn more in [{#T}](../../../best_practices/pk-olap-scalability.md). +How you select partitioning keys substantially affects the performance of queries to your column-oriented tables. Learn more in [{#T}](../../../dba/primary-key/column-oriented.md). To manage data partitioning, use the `AUTO_PARTITIONING_MIN_PARTITIONS_COUNT` additional parameter. The system ignores other partitioning parameters for column-oriented tables. diff --git a/ydb/docs/en/core/best_practices/cdc.md b/ydb/docs/en/core/dba/cdc.md similarity index 94% rename from ydb/docs/en/core/best_practices/cdc.md rename to ydb/docs/en/core/dba/cdc.md index 80ad1f79f8c0..3d007e3b2168 100644 --- a/ydb/docs/en/core/best_practices/cdc.md +++ b/ydb/docs/en/core/dba/cdc.md @@ -8,7 +8,7 @@ CDC is represented as a data schema object: a changefeed that can be added to a ## Reading data from a topic {#read} -You can read data using an [SDK](../reference/ydb-sdk/) or the [{{ ydb-short-name }} CLI](../reference/ydb-cli/). As with any other data schema object, you can access a changefeed using its path that has the following format: +You can read data using an [SDK](../reference/ydb-sdk/index.md) or the [{{ ydb-short-name }} CLI](../reference/ydb-cli/index.md). As with any other data schema object, you can access a changefeed using its path that has the following format: ```txt path/to/table/changefeed_name diff --git a/ydb/docs/en/core/dba/index.md b/ydb/docs/en/core/dba/index.md index a5bb289b6a7a..25d338219011 100644 --- a/ydb/docs/en/core/dba/index.md +++ b/ydb/docs/en/core/dba/index.md @@ -5,5 +5,10 @@ This section of {{ ydb-short-name }} documentation covers everything you need to The creation and management of databases are out of the scope of this section because in {{ ydb-short-name }} clusters these operations are either [executed by DevOps Engineers](../devops/index.md) or automated externally if you are using a managed service. - [Backup and recovery](backup-and-recovery.md) +- Choosing a primary key for: + - [Row-oriented tables](primary-key/row-oriented.md) + - [Column-oriented tables](primary-key/column-oriented.md) +- [Secondary indices](secondary-indexes.md) +- [Change Data Capture](cdc.md) - [Database system views](system-views.md) -- [Custom attributes](custom-attributes.md) \ No newline at end of file +- [Custom attributes](custom-attributes.md) diff --git a/ydb/docs/en/core/best_practices/pk-olap-scalability.md b/ydb/docs/en/core/dba/primary-key/column-oriented.md similarity index 98% rename from ydb/docs/en/core/best_practices/pk-olap-scalability.md rename to ydb/docs/en/core/dba/primary-key/column-oriented.md index 67a620606113..2e705258d7bd 100644 --- a/ydb/docs/en/core/best_practices/pk-olap-scalability.md +++ b/ydb/docs/en/core/dba/primary-key/column-oriented.md @@ -20,4 +20,4 @@ Column-oriented tables do not support automatic repartitioning at the moment. Th Example: -When your data stream is 1 GB per second, an analytical table with 1,000 partitions is an optimal choice. Nevertheless, it is not advisable to create tables with an excessive number of partitions: this could raise resource consumption in the cluster and negatively impact the query rate. +When your data stream is 1 GB per second, an analytical table with 1,000 partitions is an optimal choice. Nevertheless, it is not advisable to create tables with an excessive number of partitions: this could raise resource consumption in the cluster and negatively impact the query rate. \ No newline at end of file diff --git a/ydb/docs/en/core/dba/primary-key/index.md b/ydb/docs/en/core/dba/primary-key/index.md new file mode 100644 index 000000000000..a71756d94f79 --- /dev/null +++ b/ydb/docs/en/core/dba/primary-key/index.md @@ -0,0 +1,6 @@ +# Choosing a primary key + +The recommendations for choosing a proper primary key for a table depend on its type: + +- [Row-oriented tables](row-oriented.md) +- [Column-oriented tables](column-oriented.md) \ No newline at end of file diff --git a/ydb/docs/en/core/best_practices/_includes/pk_scalability.md b/ydb/docs/en/core/dba/primary-key/row-oriented.md similarity index 98% rename from ydb/docs/en/core/best_practices/_includes/pk_scalability.md rename to ydb/docs/en/core/dba/primary-key/row-oriented.md index 4d6142b2ca8d..f217287c5ffa 100644 --- a/ydb/docs/en/core/best_practices/_includes/pk_scalability.md +++ b/ydb/docs/en/core/dba/primary-key/row-oriented.md @@ -44,4 +44,4 @@ In {{ ydb-short-name }}, all columns, including key ones, may contain a NULL val ## Row size limit {#limit-string} -To achieve high performance, we don't recommend writing rows larger than 8 MB and key columns larger than 2 KB to the DB. +To achieve high performance, we don't recommend writing rows larger than 8 MB and key columns larger than 2 KB to the DB. \ No newline at end of file diff --git a/ydb/docs/en/core/dba/primary-key/toc_p.yaml b/ydb/docs/en/core/dba/primary-key/toc_p.yaml new file mode 100644 index 000000000000..ec46c2af983c --- /dev/null +++ b/ydb/docs/en/core/dba/primary-key/toc_p.yaml @@ -0,0 +1,7 @@ +items: +- name: Overview + href: index.md +- name: Row-oriented + href: row-oriented.md +- name: Column-oriented + href: column-oriented.md \ No newline at end of file diff --git a/ydb/docs/en/core/best_practices/_includes/secondary_indexes.md b/ydb/docs/en/core/dba/secondary-indexes.md similarity index 71% rename from ydb/docs/en/core/best_practices/_includes/secondary_indexes.md rename to ydb/docs/en/core/dba/secondary-indexes.md index 982a60f58434..86098f4ad4d9 100644 --- a/ydb/docs/en/core/best_practices/_includes/secondary_indexes.md +++ b/ydb/docs/en/core/dba/secondary-indexes.md @@ -1,6 +1,6 @@ # Secondary indexes -[Indexes]{% if lang == "ru" %}(https://ru.wikipedia.org/wiki/Индекс_(базы_данных)){% endif %}{% if lang == "en" %}(https://en.wikipedia.org/wiki/Database_index){% endif %} are auxiliary structures within databases that help find data by certain criteria without having to search an entire database, and retrieve sorted samples without actually sorting, which would require processing the entire dataset. +[Indexes](https://en.wikipedia.org/wiki/Database_index) are auxiliary structures within databases that help find data by certain criteria without having to search an entire database, and retrieve sorted samples without actually sorting, which would require processing the entire dataset. Data in a YDB table is always sorted by the primary key. That means that retrieving any entry from the table with specified field values comprising the primary key always takes the minimum fixed time, regardless of the total number of table entries. Indexing by the primary key makes it possible to retrieve any consecutive range of entries in ascending or descending order of the primary key. Execution time for this operation depends only on the number of retrieved entries rather than on the total number of table records. @@ -8,13 +8,13 @@ To use a similar feature with any field or combination of fields, additional ind In transactional systems, indexes are used to limit or avoid performance degradation and increase of query cost as your data grows. -This article describes the main operations with secondary indexes and gives references to detailed information on each operation. For more information about various types of secondary indexes and their specifics, see [Secondary indexes](../../concepts/secondary_indexes.md) in the Concepts section. +This article describes the main operations with secondary indexes and gives references to detailed information on each operation. For more information about various types of secondary indexes and their specifics, see [Secondary indexes](../concepts/secondary_indexes.md) in the Concepts section. ## Creating secondary indexes {#create} -A secondary index is a data schema object that can be defined when creating a table with the [`CREATE TABLE` YQL command](../../yql/reference/syntax/create_table.md) or added to it later with the [`ALTER TABLE` YQL command](../../yql/reference/syntax/alter_table.md). +A secondary index is a data schema object that can be defined when creating a table with the [`CREATE TABLE` YQL command](../yql/reference/syntax/create_table.md) or added to it later with the [`ALTER TABLE` YQL command](../yql/reference/syntax/alter_table.md). -The [`table index add` command](../../reference/ydb-cli/commands/secondary_index.md#add) is supported in the YDB CLI. +The [`table index add` command](../reference/ydb-cli/commands/secondary_index.md#add) is supported in the YDB CLI. Since an index contains its own data derived from table data, when creating an index on an existing table with data, an operation is performed to initially build an index. This may take a long time. This operation is executed in the background and you can keep working with the table while it's in progress. However, you can't use the new index until it's build is completed. @@ -33,7 +33,7 @@ Considering the above, there's no use in pre-indexing all possible combinations ## Using secondary indexes when selecting data {#use} -For a table to be accessed by a secondary index, its name must be explicitly specified in the `VIEW` section after the table name as described in the article about the YQL [`SELECT` statement](../../yql/reference/syntax/select#secondary_index). For example, a query to retrieve orders from the `orders` table by the specified customer ID (`id_customer`) looks like this: +For a table to be accessed by a secondary index, its name must be explicitly specified in the `VIEW` section after the table name as described in the article about the YQL [`SELECT` statement](../yql/reference/syntax/select#secondary_index). For example, a query to retrieve orders from the `orders` table by the specified customer ID (`id_customer`) looks like this: ```sql DECLARE $customer_id AS Uint64; @@ -44,9 +44,9 @@ WHERE o.id_customer = $customer_id Where `idx_customer` is the name of the secondary index on the `orders` table with the `id_customer` field specified first. -If no `VIEW` section is specified, making a query like this results in a full scan of the `orders` table . +If no `VIEW` section is specified, making a query like this results in a full scan of the `orders` table. -In transactional applications, such information queries are executed with paginated data output. This eliminates an increase in the cost and time of query execution if the number of entries that meet the filtering conditions grows. The described approach to writing [paginated queries](../paging.md) using the primary key can also be applied to columns that are part of a secondary index. +In transactional applications, such information queries are executed with paginated data output. This eliminates an increase in the cost and time of query execution if the number of entries that meet the filtering conditions grows. The described approach to writing [paginated queries](../dev/paging.md) using the primary key can also be applied to columns that are part of a secondary index. ## Checking the cost of queries {#cost} @@ -56,7 +56,7 @@ If you use the YDB CLI, select the `--stats` option to enable printing statistic ## Updating data using a secondary index {#update} -The [`UPDATE`](../../yql/reference/syntax/update.md), [`UPSERT`](../../yql/reference/syntax/upsert_into.md), and [`REPLACE`](../../yql/reference/syntax/replace_into.md) YQL statements don't permit specifying a secondary index to perform a search for data, so an attempt to make an `UPDATE ... WHERE indexed_field = $value` will result in a full scan of the table. To avoid this, you can first run `SELECT` by index to get the primary key value and then `UPDATE` by the primary key. You can also use `UPDATE ON`. +The [`UPDATE`](../yql/reference/syntax/update.md), [`UPSERT`](../yql/reference/syntax/upsert_into.md), and [`REPLACE`](../yql/reference/syntax/replace_into.md) YQL statements don't permit specifying a secondary index to perform a search for data, so an attempt to make an `UPDATE ... WHERE indexed_field = $value` will result in a full scan of the table. To avoid this, you can first run `SELECT` by index to get the primary key value and then `UPDATE` by the primary key. You can also use `UPDATE ON`. To update data in the `table1` table, run the query: @@ -84,14 +84,14 @@ WHERE views = 0; ## Atomic replacement of a secondary index {#atomic-index-replacement} -You can atomically replace a secondary index. This can be useful if you want your index to become [covering](../../concepts/secondary_indexes.md#covering). This operation is totally transparent for your running applications: when you replace the index, the compiled queries are invalidated. +You can atomically replace a secondary index. This can be useful if you want your index to become [covering](../concepts/secondary_indexes.md#covering). This operation is totally transparent for your running applications: when you replace the index, the compiled queries are invalidated. -To replace an existing index atomically, use the YDB CLI command [{{ ydb-cli }} table index rename](../../reference/ydb-cli/commands/secondary_index.md#rename) with the `--replace` parameter. +To replace an existing index atomically, use the YDB CLI command [{{ ydb-cli }} table index rename](../reference/ydb-cli/commands/secondary_index.md#rename) with the `--replace` parameter. ## Performance of data writes to tables with secondary indexes {#write_performance} You need additional data structures to enable secondary indexes. Support for these structures makes table data update operations more costly. -During synchronous index updates, a transaction is only committed after all the necessary data is written in both a table and synchronous indexes. As a result, it takes longer to execute it and makes it necessary to use [distributed transactions](../../concepts/transactions#distributed-tx) even if adding or updating entries in a single partition. +During synchronous index updates, a transaction is only committed after all the necessary data is written in both a table and synchronous indexes. As a result, it takes longer to execute it and makes it necessary to use [distributed transactions](../concepts/transactions.md#distributed-tx) even if adding or updating entries in a single partition. Indexes that are updated asynchronously let you use single-shard transactions. However, they only guarantee eventual consistency and still put a load on the database. diff --git a/ydb/docs/en/core/dba/terraform.md b/ydb/docs/en/core/dba/terraform.md new file mode 100644 index 000000000000..3667a042788f --- /dev/null +++ b/ydb/docs/en/core/dba/terraform.md @@ -0,0 +1 @@ +{% include [no-translation](../_includes/alerts/no-translation.md) %} \ No newline at end of file diff --git a/ydb/docs/en/core/dba/toc_i.yaml b/ydb/docs/en/core/dba/toc_i.yaml index e2fd4d426f6d..82222d4446a5 100644 --- a/ydb/docs/en/core/dba/toc_i.yaml +++ b/ydb/docs/en/core/dba/toc_i.yaml @@ -1,6 +1,12 @@ items: - name: Backup and recovery href: backup-and-recovery.md +- name: Primary keys + include: + mode: link + path: primary-key/toc_p.yaml +- name: Secondary indexes + href: secondary-indexes.md - name: Query plans optimization href: query-plans-optimization.md hidden: true @@ -8,3 +14,8 @@ items: href: system-views.md - name: Custom attributes href: custom-attributes.md +- name: Change Data Capture + href: cdc.md +- name: Terraform + href: terraform.md + hidden: true \ No newline at end of file diff --git a/ydb/docs/en/core/best_practices/_includes/batch_upload.md b/ydb/docs/en/core/dev/batch-upload.md similarity index 100% rename from ydb/docs/en/core/best_practices/_includes/batch_upload.md rename to ydb/docs/en/core/dev/batch-upload.md diff --git a/ydb/docs/en/core/best_practices/_includes/paging.md b/ydb/docs/en/core/dev/paging.md similarity index 100% rename from ydb/docs/en/core/best_practices/_includes/paging.md rename to ydb/docs/en/core/dev/paging.md diff --git a/ydb/docs/en/core/best_practices/_includes/timeouts.md b/ydb/docs/en/core/dev/timeouts.md similarity index 100% rename from ydb/docs/en/core/best_practices/_includes/timeouts.md rename to ydb/docs/en/core/dev/timeouts.md diff --git a/ydb/docs/en/core/dev/toc_p.yaml b/ydb/docs/en/core/dev/toc_p.yaml index b73cf38b3a85..b8224fd6af3c 100644 --- a/ydb/docs/en/core/dev/toc_p.yaml +++ b/ydb/docs/en/core/dev/toc_p.yaml @@ -1,3 +1,9 @@ items: - name: Overview - href: index.md \ No newline at end of file + href: index.md +- name: Batch upload + href: batch-upload.md +- name: Paging + href: paging.md +- name: Timeouts + href: timeouts.md \ No newline at end of file diff --git a/ydb/docs/en/core/faq/_includes/common.md b/ydb/docs/en/core/faq/_includes/common.md index 83d46f1addc2..13748000eaee 100644 --- a/ydb/docs/en/core/faq/_includes/common.md +++ b/ydb/docs/en/core/faq/_includes/common.md @@ -29,7 +29,7 @@ To design a primary key properly, follow the rules below. * The fewer table partitions a query uses, the faster it runs. For greater performance, follow the one query — one partition rule. * Avoid situations where a small part of the DB is under much heavier load than the rest of the DB. -For more information, see [Schema design](../../best_practices/schema_design.md). +For more information, see [choosing a primary key](../../dba/primary-key/index.md). #### How do I evenly distribute load across table partitions? {#balance-shard-load} @@ -40,7 +40,7 @@ You can use the following techniques to distribute the load evenly across table * use a hash of the key column values as the primary key. * Reduce the number of partitions used in a single query. -For more information, see [Schema design](../../best_practices/schema_design.md#balance-shard-load). +For more information, see [choosing a primary key](../../dba/primary-key/index.md). #### Can I use NULL in a key column? {#null} @@ -64,7 +64,7 @@ For more information, see [Secondary indexes](../../concepts/secondary_indexes.m To print paginated results, we recommend selecting data sorted by primary key sequentially, limiting the number of rows with the `LIMIT` keyword. We do not recommend using the `OFFSET` keyword to solve this problem. -For more information, see [Paginated results](../../best_practices/paging.md). +For more information, see [Paginated results](../../dev/paging.md). #### How do I delete expired data? {#ttl} diff --git a/ydb/docs/en/core/faq/_includes/yql.md b/ydb/docs/en/core/faq/_includes/yql.md index 99da7090b050..95e4ffa990e7 100644 --- a/ydb/docs/en/core/faq/_includes/yql.md +++ b/ydb/docs/en/core/faq/_includes/yql.md @@ -35,7 +35,7 @@ WHERE Key LIKE "some_prefix%"; #### Why does a query return only 1000 rows? {#result-rows-limit} -1000 rows is the response size limit per YQL query. If a response is shortened, it is flagged as `Truncated`. To output more table rows, you can use [paginated output](../../best_practices/paging.md) or the `ReadTable` operation. +1000 rows is the response size limit per YQL query. If a response is shortened, it is flagged as `Truncated`. To output more table rows, you can use [paginated output](../../dev/paging.md) or the `ReadTable` operation. #### How to escape quotes of JSON strings when adding them to a table? {#escaping-quotes} diff --git a/ydb/docs/en/core/quickstart.md b/ydb/docs/en/core/quickstart.md index 983a24031c81..d89ce13b0334 100644 --- a/ydb/docs/en/core/quickstart.md +++ b/ydb/docs/en/core/quickstart.md @@ -143,7 +143,7 @@ As you can see, it is a simple key-value table. Let's walk through the query ste * Each SQL statement kind like `CREATE TABLE` has more detailed explanation in [YQL reference](yql/reference/index.md). * `example` is the table name identifier, while `key` and `value` are column name identifiers. It is recommended to use simple names for identifiers like these, but if you need one that contains non-trivial symbols, wrap the name in backticks. * `UInt64` and `String` are data type names. `String` represents a binary string, and `UInt64` is a 64-bit unsigned integer. Thus, our example table stores string values identified by unsigned integer keys. More details [about data types](yql/reference/types/index.md). -* `PRIMARY KEY` is one of the fundamental concepts of SQL that has a significant impact on both application logic and performance. Following the SQL standard, the primary key also implies an unique constraint, meaning the table cannot have multiple rows with equal primary keys. In this example table, it's quite straightforward which column should be chosen as the primary key, which we specify as `(key)` in round brackets after the respective keyword. In real-world scenarios, tables often have dozens of columns, and primary keys can be compound (consisting of multiple columns in a specified order), making choosing the right primary key more of an art. If you are interested in this topic, there's a [guide on choosing the primary key for maximizing performance](best_practices/pk_scalability.md). YDB tables are required to have a primary key. +* `PRIMARY KEY` is one of the fundamental concepts of SQL that has a significant impact on both application logic and performance. Following the SQL standard, the primary key also implies an unique constraint, meaning the table cannot have multiple rows with equal primary keys. In this example table, it's quite straightforward which column should be chosen as the primary key, which we specify as `(key)` in round brackets after the respective keyword. In real-world scenarios, tables often have dozens of columns, and primary keys can be compound (consisting of multiple columns in a specified order), making choosing the right primary key more of an art. If you are interested in this topic, there's a [guide on choosing the primary key for maximizing performance](dba/primary-key/row-oriented.md). YDB tables are required to have a primary key. ## Add sample data diff --git a/ydb/docs/en/core/reference/ydb-cli/commands/_includes/secondary_index.md b/ydb/docs/en/core/reference/ydb-cli/commands/_includes/secondary_index.md index 809be3a496cb..7c732383a5df 100644 --- a/ydb/docs/en/core/reference/ydb-cli/commands/_includes/secondary_index.md +++ b/ydb/docs/en/core/reference/ydb-cli/commands/_includes/secondary_index.md @@ -10,7 +10,7 @@ By using the `table index` command, you can create and delete [secondary indexes You can also add or delete a secondary index with the [ADD INDEX and DROP INDEX](../../../../yql/reference/syntax/alter_table.md#secondary-index) directives of YQL ALTER TABLE. -To learn about secondary indexes and their use in application development, see [Secondary indexes](../../../../best_practices/secondary_indexes.md) under "Recommendations". +To learn about secondary indexes and their use in application development, see [Secondary indexes](../../../../dba/secondary-indexes.md) under "Recommendations". ## Creating a secondary index {#add} diff --git a/ydb/docs/en/core/reference/ydb-cli/commands/workload/_includes/stock.md b/ydb/docs/en/core/reference/ydb-cli/commands/workload/_includes/stock.md index 3a8b6ac2aef5..99f293e03761 100644 --- a/ydb/docs/en/core/reference/ydb-cli/commands/workload/_includes/stock.md +++ b/ydb/docs/en/core/reference/ydb-cli/commands/workload/_includes/stock.md @@ -83,9 +83,9 @@ See the description of the command to run the data load: | `--rate ` | - | Total rate for all threads, in transactions per second. Default: 0 (no rate limit). | | `--quiet` | - | Outputs only the total result. | | `--print-timestamp` | - | Print the time together with the statistics of each time window. | -| `--client-timeout` | - | [Transport timeout in milliseconds](../../../../../best_practices/timeouts.md). | -| `--operation-timeout` | - | [Operation timeout in milliseconds](../../../../../best_practices/timeouts.md). | -| `--cancel-after` | - | [Timeout for canceling an operation in milliseconds](../../../../../best_practices/timeouts.md). | +| `--client-timeout` | - | [Transport timeout in milliseconds](../../../../../dev/timeouts.md). | +| `--operation-timeout` | - | [Operation timeout in milliseconds](../../../../../dev/timeouts.md). | +| `--cancel-after` | - | [Timeout for canceling an operation in milliseconds](../../../../../dev/timeouts.md). | | `--window` | - | Statistics collection window in seconds. Default: 1. | diff --git a/ydb/docs/en/core/reference/ydb-cli/workload-kv.md b/ydb/docs/en/core/reference/ydb-cli/workload-kv.md index 93538a03d936..d13ee3fba8af 100644 --- a/ydb/docs/en/core/reference/ydb-cli/workload-kv.md +++ b/ydb/docs/en/core/reference/ydb-cli/workload-kv.md @@ -120,9 +120,9 @@ Parameter name | Short name | Parameter description `--rate ` | - | Total rate for all threads, in requests per second. Default: 0 (no rate limit). `--quiet` | - | Outputs only the total result. `--print-timestamp` | - | Print the time together with the statistics of each time window. -`--client-timeout` | - | [Transport timeout in milliseconds](../../best_practices/timeouts.md). -`--operation-timeout` | - | [Operation timeout in milliseconds](../../best_practices/timeouts.md). -`--cancel-after` | - | [Timeout for canceling an operation in milliseconds](../../best_practices/timeouts.md). +`--client-timeout` | - | [Transport timeout in milliseconds](../../dev/timeouts.md). +`--operation-timeout` | - | [Operation timeout in milliseconds](../../dev/timeouts.md). +`--cancel-after` | - | [Timeout for canceling an operation in milliseconds](../../dev/timeouts.md). `--window` | - | Statistics collection window in seconds. Default: 1. `--max-first-key` | - | Maximum value of the primary key of the table. Default: $2^{64} - 1$. `--cols` | - | Number of columns in the table. Default: 2 counting Key. diff --git a/ydb/docs/en/core/toc_i.yaml b/ydb/docs/en/core/toc_i.yaml index 8726a570a177..77e474af50ba 100644 --- a/ydb/docs/en/core/toc_i.yaml +++ b/ydb/docs/en/core/toc_i.yaml @@ -23,9 +23,6 @@ items: include: mode: link path: contributor/toc_p.yaml - -- { name: Recommendations, include: { mode: link, path: best_practices/toc_p.yaml } } - - name: Reference include: mode: link diff --git a/ydb/docs/redirects.yaml b/ydb/docs/redirects.yaml index 7a726c55b019..217e2f59bb79 100644 --- a/ydb/docs/redirects.yaml +++ b/ydb/docs/redirects.yaml @@ -53,6 +53,26 @@ common: to: /dba/custom-attributes.md - from: /operations/query_plans_optimization.md to: /dba/query-plans-optimization.md + - from: /best_practices/cdc.md + to: /dba/cdc.md + - from: /best_practices/pk-olap-scalability.md + to: /dba/primary-key/row-oriented.md + - from: /best_practices/pk-olap-scalability.md + to: /dba/primary-key/column-oriented.md + - from: /best_practices/schema_design.md + to: /dba/primary-key/index.md + - from: /best_practices/secondary_indexes.md + to: /dba/secondary-indexes.md + - from: /best_practices/table_sharding.md + to: /dba/primary-key/index.md + +# Dev-related redirects + - from: /best_practices/batch_upload.md + to: /dev/batch-upload.md + - from: /best_practices/paging.md + to: /dev/paging.md + - from: /best_practices/timeouts.md + to: /dev/timeouts.md # Contributors-related redirects - from: /development/build-ya.md diff --git a/ydb/docs/ru/core/best_practices/_includes/index.md b/ydb/docs/ru/core/best_practices/_includes/index.md deleted file mode 100644 index 316a4decc875..000000000000 --- a/ydb/docs/ru/core/best_practices/_includes/index.md +++ /dev/null @@ -1,10 +0,0 @@ -# Рекомендации - -В данном разделе собраны статьи, рассказывающие про назначение, особенности и лучшие практики применения инструментов YDB при разработке приложений. - -- [Выбор первичного ключа для максимальной производительности](../pk_scalability.md) -- [Вторичные индексы](../secondary_indexes.md) -- [Постраничный вывод](../paging.md) -- [Загрузка больших объемов данных](../batch_upload.md) -- [Использование таймаутов](../timeouts.md) - \ No newline at end of file diff --git a/ydb/docs/ru/core/best_practices/_includes/schema_design.md b/ydb/docs/ru/core/best_practices/_includes/schema_design.md deleted file mode 100644 index f47c3a0ae401..000000000000 --- a/ydb/docs/ru/core/best_practices/_includes/schema_design.md +++ /dev/null @@ -1 +0,0 @@ -Данная статья удалена, материал перемещен в статью [Влияние первичного ключа на производительность](../pk_scalability.md). \ No newline at end of file diff --git a/ydb/docs/ru/core/best_practices/_includes/table_sharding.md b/ydb/docs/ru/core/best_practices/_includes/table_sharding.md deleted file mode 100644 index a8f8442d8a6a..000000000000 --- a/ydb/docs/ru/core/best_practices/_includes/table_sharding.md +++ /dev/null @@ -1 +0,0 @@ -Данная статья удалена, материал перемещен в пункт [Партиционирование таблиц](../../concepts/datamodel/table.md#partitioning) статьи об объектах схемы данных в разделе "Концепции". \ No newline at end of file diff --git a/ydb/docs/ru/core/best_practices/batch_upload.md b/ydb/docs/ru/core/best_practices/batch_upload.md deleted file mode 100644 index e2e399826c4b..000000000000 --- a/ydb/docs/ru/core/best_practices/batch_upload.md +++ /dev/null @@ -1,2 +0,0 @@ -{% include [batch_upload.md](_includes/batch_upload.md) %} - diff --git a/ydb/docs/ru/core/best_practices/index.md b/ydb/docs/ru/core/best_practices/index.md deleted file mode 100644 index eb2590567da8..000000000000 --- a/ydb/docs/ru/core/best_practices/index.md +++ /dev/null @@ -1 +0,0 @@ -{% include [_includes/index.md](_includes/index.md) %} \ No newline at end of file diff --git a/ydb/docs/ru/core/best_practices/paging.md b/ydb/docs/ru/core/best_practices/paging.md deleted file mode 100644 index 93d9375281d1..000000000000 --- a/ydb/docs/ru/core/best_practices/paging.md +++ /dev/null @@ -1,3 +0,0 @@ - -{% include [paging.md](_includes/paging.md) %} - diff --git a/ydb/docs/ru/core/best_practices/pk_scalability.md b/ydb/docs/ru/core/best_practices/pk_scalability.md deleted file mode 100644 index 4b13db54fc46..000000000000 --- a/ydb/docs/ru/core/best_practices/pk_scalability.md +++ /dev/null @@ -1,6 +0,0 @@ ---- -title: "Инструкция по выбору первичного ключа для максимальной производительности в {{ ydb-short-name }}" -description: "В статье описываем общие рекомендации по выбору первичного ключа в {{ ydb-short-name }}. Рассматриваем приемы равномерного распределения нагрузки по партициям таблицы." ---- - -{% include [pk_scalability.md](_includes/pk_scalability.md) %} diff --git a/ydb/docs/ru/core/best_practices/schema_design.md b/ydb/docs/ru/core/best_practices/schema_design.md deleted file mode 100644 index 18ab3a34ac44..000000000000 --- a/ydb/docs/ru/core/best_practices/schema_design.md +++ /dev/null @@ -1,2 +0,0 @@ - -{% include [timeouts.md](_includes/schema_design.md) %} diff --git a/ydb/docs/ru/core/best_practices/secondary_indexes.md b/ydb/docs/ru/core/best_practices/secondary_indexes.md deleted file mode 100644 index 7a4630af6756..000000000000 --- a/ydb/docs/ru/core/best_practices/secondary_indexes.md +++ /dev/null @@ -1,3 +0,0 @@ - -{% include [secondary_indexes.md](_includes/secondary_indexes.md) %} - diff --git a/ydb/docs/ru/core/best_practices/table_sharding.md b/ydb/docs/ru/core/best_practices/table_sharding.md deleted file mode 100644 index 05274ea28927..000000000000 --- a/ydb/docs/ru/core/best_practices/table_sharding.md +++ /dev/null @@ -1,2 +0,0 @@ - -{% include [timeouts.md](_includes/table_sharding.md) %} diff --git a/ydb/docs/ru/core/best_practices/timeouts.md b/ydb/docs/ru/core/best_practices/timeouts.md deleted file mode 100644 index 48cb4d6cf339..000000000000 --- a/ydb/docs/ru/core/best_practices/timeouts.md +++ /dev/null @@ -1,2 +0,0 @@ - -{% include [timeouts.md](_includes/timeouts.md) %} diff --git a/ydb/docs/ru/core/best_practices/toc_i.yaml b/ydb/docs/ru/core/best_practices/toc_i.yaml deleted file mode 100644 index 57ce8346f50e..000000000000 --- a/ydb/docs/ru/core/best_practices/toc_i.yaml +++ /dev/null @@ -1,24 +0,0 @@ -items: -- name: Обзор - href: index.md -- name: Выбор первичного ключа для максимальной производительности - href: pk_scalability.md -- name: Выбор первичного ключа для максимальной производительности аналитических таблиц - href: pk-olap-scalability.md -- name: Проектирование схемы - href: schema_design.md - hidden: true -- name: Партиционирование таблиц - href: table_sharding.md - hidden: true -- name: Вторичные индексы - href: secondary_indexes.md -- name: Change Data Capture - href: cdc.md - when: feature_changefeed -- name: Постраничный вывод - href: paging.md -- name: Загрузка больших объемов данных - href: batch_upload.md -- name: Использование таймаутов - href: timeouts.md diff --git a/ydb/docs/ru/core/best_practices/toc_p.yaml b/ydb/docs/ru/core/best_practices/toc_p.yaml deleted file mode 100644 index 5bfec4365def..000000000000 --- a/ydb/docs/ru/core/best_practices/toc_p.yaml +++ /dev/null @@ -1,2 +0,0 @@ -items: -- include: { mode: link, path: toc_i.yaml } \ No newline at end of file diff --git a/ydb/docs/ru/core/changelog-cli.md b/ydb/docs/ru/core/changelog-cli.md index 2c983fc6413c..ff2f5350eecc 100644 --- a/ydb/docs/ru/core/changelog-cli.md +++ b/ydb/docs/ru/core/changelog-cli.md @@ -139,7 +139,7 @@ **Функциональность:** * Добавлен интерактивный режим выполнения запросов. Для перехода в интерактивный режим выполните команду [ydb yql](reference/ydb-cli/yql.md) без аргументов. Режим экспериментальный, обратная совместимость пока не гарантируется. -* Добавлена команда [ydb index rename](reference/ydb-cli/commands/secondary_index.md#rename) для [атомарной замены](best_practices/secondary_indexes.md#atomic-index-replacement) или переименования вторичного индекса. +* Добавлена команда [ydb index rename](reference/ydb-cli/commands/secondary_index.md#rename) для [атомарной замены](dba/secondary-indexes.md#atomic-index-replacement) или переименования вторичного индекса. * Добавлена команда `ydb workload topic` для запуска нагрузки, которая читает и записывает сообщения в топики. * Для команды `ydb scheme rmdir` добавлен параметр [--recursive](reference/ydb-cli/commands/dir.md#rmdir-options), который позволяет рекурсивно удалить директорию вместе со всем содержимым. * Для команды [ydb scheme describe](reference/ydb-cli/commands/scheme-describe.md) добавлена поддержка типов `topic` и `coordination node`. diff --git a/ydb/docs/ru/core/changelog-server.md b/ydb/docs/ru/core/changelog-server.md index d5c49b895816..3d276a60eec1 100644 --- a/ydb/docs/ru/core/changelog-server.md +++ b/ydb/docs/ru/core/changelog-server.md @@ -154,7 +154,7 @@ **Функциональность:** * Добавлено [первоначальное сканирование таблицы](concepts/cdc.md#initial-scan) при создании потока изменений CDC. Теперь можно выгрузить все данные, которые существуют на момент создания потока. -* Добавлена возможность [атомарной замены индекса](best_practices/secondary_indexes.md#atomic-index-replacement). Теперь можно атомарно и прозрачно для приложения подменить один индекс другим заранее созданным индексом. Замена выполняется без простоя. +* Добавлена возможность [атомарной замены индекса](dba/secondary-indexes.md#atomic-index-replacement). Теперь можно атомарно и прозрачно для приложения подменить один индекс другим заранее созданным индексом. Замена выполняется без простоя. * Добавлен [аудитный лог](cluster/audit-log.md) — поток событий, который содержит информацию обо всех операциях над объектами {{ ydb-short-name }}. **Производительность:** diff --git a/ydb/docs/ru/core/concepts/_includes/secondary_indexes.md b/ydb/docs/ru/core/concepts/_includes/secondary_indexes.md index ae03b53bcab4..692317a996ce 100644 --- a/ydb/docs/ru/core/concepts/_includes/secondary_indexes.md +++ b/ydb/docs/ru/core/concepts/_includes/secondary_indexes.md @@ -57,4 +57,4 @@ ## Назначение и применение вторичных индексов {#best_practices} -О назначении и применении вторичных индексов при разработке приложений смотрите в [рекомендациях](../../best_practices/secondary_indexes.md). +О назначении и применении вторичных индексов при разработке приложений смотрите в [рекомендациях](../../dba/secondary-indexes.md). diff --git a/ydb/docs/ru/core/concepts/cdc.md b/ydb/docs/ru/core/concepts/cdc.md index 4d7d458b2fee..316d2d87c018 100644 --- a/ydb/docs/ru/core/concepts/cdc.md +++ b/ydb/docs/ru/core/concepts/cdc.md @@ -243,4 +243,4 @@ Change Data Capture (CDC) обеспечивает захват изменени ## Назначение и применение CDC {#best_practices} -Об использовании CDC при разработке приложений смотрите в [рекомендациях](../best_practices/cdc.md). +Об использовании CDC при разработке приложений смотрите в [рекомендациях](../dba/cdc.md). diff --git a/ydb/docs/ru/core/concepts/datamodel/_includes/table.md b/ydb/docs/ru/core/concepts/datamodel/_includes/table.md index 2f86ebcc2886..21d0812813e6 100644 --- a/ydb/docs/ru/core/concepts/datamodel/_includes/table.md +++ b/ydb/docs/ru/core/concepts/datamodel/_includes/table.md @@ -22,7 +22,7 @@ YDB поддерживает создание строковых и колоно Создать строковую таблицу можно через web-интерфейс YDB, с помощью CLI или SDK. Вне зависимости от способа взаимодействия с YDB стоит помнить об общем правиле создания строковой таблицы: таблица должна иметь минимум одну ключевую колонку, при этом допускается создание таблицы, состоящий только из ключевых колонок. -По умолчанию при создании строковой таблицы все столбцы опциональны и могут иметь значения `NULL`, такое поведение можно изменить и задать условия `NOT NULL` для ключевых колонок, которые входят в состав первичного ключа. Первичные ключи уникальны, и строковые таблицы всегда упорядочена по ключу. Это означает, что точечное чтение по ключу, а также диапазонные запросы по ключу или префиксу ключа выполняются эффективно (фактически используя индекс). Допускается создание таблицы, состоящей только из ключевых столбцов. К выбору ключа нужно подходить аккуратно, поэтому рекомендуем ознакомиться со статьей: ["Выбор первичного ключа для максимальной производительности"](../../../best_practices/pk_scalability.md). +По умолчанию при создании строковой таблицы все столбцы опциональны и могут иметь значения `NULL`, такое поведение можно изменить и задать условия `NOT NULL` для ключевых колонок, которые входят в состав первичного ключа. Первичные ключи уникальны, и строковые таблицы всегда упорядочена по ключу. Это означает, что точечное чтение по ключу, а также диапазонные запросы по ключу или префиксу ключа выполняются эффективно (фактически используя индекс). Допускается создание таблицы, состоящей только из ключевых столбцов. К выбору ключа нужно подходить аккуратно, поэтому рекомендуем ознакомиться со статьей: ["Выбор первичного ключа для максимальной производительности"](../../../dba/primary-key/row-oriented.md). ### Партиционирование строковой таблицы {#partitioning_row_table} @@ -202,7 +202,7 @@ YDB поддерживает создание строковых и колоно Колоночные таблицы YDB хранят данные каждого столбца отдельно (независимо) от других столбцов. Такой принцип хранения данных оптимизирован для работы с Online Analytical Processing-нагрузками (OLAP), так как при выполнении запроса считываются только те столбцы, которые непосредственно участвуют в запросе. Еще один плюс такого подхода — высокая степень сжатия данных, так как в столбцах зачастую хранятся повторяющиеся или близкие данные. Минусом является то, что выполнение операций над строками становится более затратным. -На данный момент основной сценарий использования колоночных таблиц YDB — запись данных с возрастающим первичным ключом (например, время события), анализ этих данных и удаление устаревших данных по TTL. Оптимальным способом добавления данных в колоночные таблицы YDB является [пакетная запись](../../../best_practices/batch_upload.md), выполняемая блоками в единицы МБ. Вставка пакетов данных производится атомарно: данные будут записаны или во все партиции, или ни в одну. +На данный момент основной сценарий использования колоночных таблиц YDB — запись данных с возрастающим первичным ключом (например, время события), анализ этих данных и удаление устаревших данных по TTL. Оптимальным способом добавления данных в колоночные таблицы YDB является [пакетная запись](../../../dev/batch-upload.md), выполняемая блоками в единицы МБ. Вставка пакетов данных производится атомарно: данные будут записаны или во все партиции, или ни в одну. В большинстве случаев работа с колоночными таблицами YDB аналогична работе со строковыми, но есть и отличия: @@ -243,7 +243,7 @@ WITH (STORE = COLUMN); В отличие от партицирования данных в строковых таблицах YDB, партицирование данных для колоночных таблиц выполняется не по значениям ключей, а по hash-значениям от ключей, что позволяет равномерно распределить данные во все существующие партиции. Такое партицирование позволяет избежать хотспотов при вставке и ускоряет аналитические запросы, обрабатывающие (считывающие) большие объемы данных. -Выбор ключей партицирования существенно влияет на производительность колоночных таблиц. Подробнее смотрите: ["Выбор первичного ключа для максимальной производительности колоночных таблиц"](../../../best_practices/pk-olap-scalability.md). +Выбор ключей партицирования существенно влияет на производительность колоночных таблиц. Подробнее смотрите: ["Выбор первичного ключа для максимальной производительности колоночных таблиц"](../../../dba/primary-key/column-oriented.md). Для управления партицированием данных используется дополнительный параметр партиционирования: AUTO_PARTITIONING_MIN_PARTITIONS_COUNT. Остальные параметры партицирования для колоночных таблиц игнорируются. diff --git a/ydb/docs/ru/core/best_practices/cdc.md b/ydb/docs/ru/core/dba/cdc.md similarity index 100% rename from ydb/docs/ru/core/best_practices/cdc.md rename to ydb/docs/ru/core/dba/cdc.md diff --git a/ydb/docs/ru/core/best_practices/pk-olap-scalability.md b/ydb/docs/ru/core/dba/primary-key/column-oriented.md similarity index 100% rename from ydb/docs/ru/core/best_practices/pk-olap-scalability.md rename to ydb/docs/ru/core/dba/primary-key/column-oriented.md diff --git a/ydb/docs/ru/core/dba/primary-key/index.md b/ydb/docs/ru/core/dba/primary-key/index.md new file mode 100644 index 000000000000..f11c5c525d87 --- /dev/null +++ b/ydb/docs/ru/core/dba/primary-key/index.md @@ -0,0 +1,6 @@ +# Выбор первичного ключа + +Рекомендации по выбору правильного первичного ключа для таблицы зависят от ее типа: + +- [Строковые таблицы](row-oriented.md) +- [Колоночные таблицы](column-oriented.md) \ No newline at end of file diff --git a/ydb/docs/ru/core/best_practices/_includes/pk_scalability.md b/ydb/docs/ru/core/dba/primary-key/row-oriented.md similarity index 100% rename from ydb/docs/ru/core/best_practices/_includes/pk_scalability.md rename to ydb/docs/ru/core/dba/primary-key/row-oriented.md diff --git a/ydb/docs/ru/core/dba/primary-key/toc_p.yaml b/ydb/docs/ru/core/dba/primary-key/toc_p.yaml new file mode 100644 index 000000000000..1c93af5f098f --- /dev/null +++ b/ydb/docs/ru/core/dba/primary-key/toc_p.yaml @@ -0,0 +1,7 @@ +items: +- name: Обзор + href: index.md +- name: Строковые + href: row-oriented.md +- name: Колоночные + href: column-oriented.md \ No newline at end of file diff --git a/ydb/docs/ru/core/dba/query-plans-optimization.md b/ydb/docs/ru/core/dba/query-plans-optimization.md index 7bba702ea5aa..60d668afc740 100644 --- a/ydb/docs/ru/core/dba/query-plans-optimization.md +++ b/ydb/docs/ru/core/dba/query-plans-optimization.md @@ -54,7 +54,7 @@ SELECT season_id, episode_id И в визуальном и в текстовом представлении видно, что в корне этого плана возвращение данных на клиент, в листьях работа с таблицами, а на промежуточных узлах — преобразования данных. Важно обратить внимание на узел, показывающий обращение к таблице `episodes`. В данном случае это `TableFullScan`, который означает выполнение полного сканирования таблицы. А полное сканирование таблицы потребляет времени и ресурсов пропорционально её размеру, из-за чего по возможности их стараются избегать в таблицах, которые имеют тенденцию расти с течением времени или просто большие. -Одним из типовых способов избежать полного сканирования таблицы является добавление [вторичного индекса](../best_practices/_includes/secondary_indexes.md). В данном случае имеет смысл добавить вторичный индекс для колонки `title`, для этого воспользуемся запросом: +Одним из типовых способов избежать полного сканирования таблицы является добавление [вторичного индекса](secondary-indexes.md). В данном случае имеет смысл добавить вторичный индекс для колонки `title`, для этого воспользуемся запросом: ``` sql ALTER TABLE episodes diff --git a/ydb/docs/ru/core/best_practices/_includes/secondary_indexes.md b/ydb/docs/ru/core/dba/secondary-indexes.md similarity index 82% rename from ydb/docs/ru/core/best_practices/_includes/secondary_indexes.md rename to ydb/docs/ru/core/dba/secondary-indexes.md index 6c5c482d5103..757b8816c040 100644 --- a/ydb/docs/ru/core/best_practices/_includes/secondary_indexes.md +++ b/ydb/docs/ru/core/dba/secondary-indexes.md @@ -8,13 +8,13 @@ В транзакционных системах использование индексов позволяет сократить или исключить деградацию производительности и повышение стоимости выполнения запросов при росте объема хранимых данных. -В данной статье описаны основные операции по работе со вторичными индексами и даны ссылки на подробные материалы по каждой операции. Информация о разных типах вторичных индексов и особенностях их устройства находится в статье [Вторичные индексы](../../concepts/secondary_indexes.md) раздела "Концепции". +В данной статье описаны основные операции по работе со вторичными индексами и даны ссылки на подробные материалы по каждой операции. Информация о разных типах вторичных индексов и особенностях их устройства находится в статье [Вторичные индексы](../concepts/secondary_indexes.md) раздела "Концепции". ## Создание вторичных индексов {#create} -Вторичный индекс является объектом схемы данных и может быть определен при создании таблицы [командой YQL `CREATE TABLE`](../../yql/reference/syntax/create_table.md), или добавлен к ней позднее [командой YQL `ALTER TABLE`](../../yql/reference/syntax/alter_table.md). +Вторичный индекс является объектом схемы данных и может быть определен при создании таблицы [командой YQL `CREATE TABLE`](../yql/reference/syntax/create_table.md), или добавлен к ней позднее [командой YQL `ALTER TABLE`](../yql/reference/syntax/alter_table.md). -Команда [создания индекса `table index add`](../../reference/ydb-cli/commands/secondary_index.md#add) поддерживается в YDB CLI. +Команда [создания индекса `table index add`](../reference/ydb-cli/commands/secondary_index.md#add) поддерживается в YDB CLI. Так как индекс содержит собственные данные, являющиеся производными от данных в таблице, то при создании индекса на существующей таблице с данными будет выполнена операция начального построения индекса, которая может занимать продолжительное время. Данная операция выполняется в фоновом режиме, не блокирует работу с таблицей, но до окончания построения новым индексом воспользоваться будет невозможно. @@ -33,7 +33,7 @@ ## Применение вторичных индексов при выборке данных {#use} -Для обращения к таблице по вторичному индексу его имя должно быть явно указано в секции `VIEW` после имени таблицы, как описано в статье про [команду `SELECT`](../../yql/reference/syntax/select#secondary_index) YQL. Например, для получения из таблицы Заказов (`orders`) выборки заказов клиента с заданным ID (`id_customer`) запрос будет выглядеть следующим образом: +Для обращения к таблице по вторичному индексу его имя должно быть явно указано в секции `VIEW` после имени таблицы, как описано в статье про [команду `SELECT`](../yql/reference/syntax/select#secondary_index) YQL. Например, для получения из таблицы Заказов (`orders`) выборки заказов клиента с заданным ID (`id_customer`) запрос будет выглядеть следующим образом: ```sql DECLARE $customer_id AS Uint64; @@ -46,7 +46,7 @@ WHERE o.id_customer = $customer_id Без указания секции `VIEW` для выполнения такого запроса будет полностью просканирована таблица `orders`. -В транзакционных приложениях подобные информационные запросы выполняются с использованием поcтраничного вывода данных, что исключает рост стоимости и времени исполнения при увеличении количества записей, подходящих под условия фильтрации. Описанный на примере первичного ключа подход к написанию [постраничных запросов](../paging.md) применим также и к колонкам, включенным во вторичный индекс. +В транзакционных приложениях подобные информационные запросы выполняются с использованием поcтраничного вывода данных, что исключает рост стоимости и времени исполнения при увеличении количества записей, подходящих под условия фильтрации. Описанный на примере первичного ключа подход к написанию [постраничных запросов](../dev/paging.md) применим также и к колонкам, включенным во вторичный индекс. ## Проверка стоимости запроса {#cost} @@ -56,7 +56,7 @@ WHERE o.id_customer = $customer_id ## Обновление данных с использованием вторичного индекса {#update} -Команды YQL изменения записей ([`UPDATE`](../../yql/reference/syntax/update.md), [`UPSERT`](../../yql/reference/syntax/upsert_into.md), [`REPLACE`](../../yql/reference/syntax/replace_into.md)) не позволяют указать на использование вторичного индекса для поиска данных, поэтому попытка выполнить `UPDATE ... WHERE indexed_field = $value` приведет к полному сканированию таблицы. Чтобы избежать этого, можно предварительно выполнить `SELECT` по индексу с получением значения первичного ключа, а затем выполнить `UPDATE` по первичному ключу. Также можно воспользоваться инструкцией `UPDATE ON`. +Команды YQL изменения записей ([`UPDATE`](../yql/reference/syntax/update.md), [`UPSERT`](../yql/reference/syntax/upsert_into.md), [`REPLACE`](../yql/reference/syntax/replace_into.md)) не позволяют указать на использование вторичного индекса для поиска данных, поэтому попытка выполнить `UPDATE ... WHERE indexed_field = $value` приведет к полному сканированию таблицы. Чтобы избежать этого, можно предварительно выполнить `SELECT` по индексу с получением значения первичного ключа, а затем выполнить `UPDATE` по первичному ключу. Также можно воспользоваться инструкцией `UPDATE ON`. Чтобы обновить данные в таблице `table1`, выполните запрос: @@ -84,14 +84,14 @@ WHERE views = 0; ## Атомарная замена вторичного индекса {#atomic-index-replacement} -Существующий вторичный индекс можно заменить атомарно. Это может быть полезно, например, для замены индекса на [покрывающий](../../concepts/secondary_indexes.md#covering). Для работающих приложений эта операция прозрачна — в момент замены индекса произойдет инвалидация скомпилированных запросов. +Существующий вторичный индекс можно заменить атомарно. Это может быть полезно, например, для замены индекса на [покрывающий](../concepts/secondary_indexes.md#covering). Для работающих приложений эта операция прозрачна — в момент замены индекса произойдет инвалидация скомпилированных запросов. -Атомарно заменить существующий индекс можно с помощью команды YDB CLI [{{ ydb-cli }} table index rename](../../reference/ydb-cli/commands/secondary_index.md#rename) с параметром `--replace`. +Атомарно заменить существующий индекс можно с помощью команды YDB CLI [{{ ydb-cli }} table index rename](../reference/ydb-cli/commands/secondary_index.md#rename) с параметром `--replace`. ## Производительность записи в таблицы со вторичными индексами {#write_performance} Для работы вторичных индексов необходимы дополнительные структуры данных. Поддержка этих структур приводит к повышению стоимости операций изменения данных в таблицах. -При синхронном обновлении индексов транзакция подтверждается только после записи всех необходимых данных, как в таблице, так и в синхронных индексах. Это приводит как к увеличению времени исполнения, так и к необходимости применения [распределенных транзакций](../../concepts/transactions#distributed-tx) даже при добавлении или изменении записей в единственной партиции. +При синхронном обновлении индексов транзакция подтверждается только после записи всех необходимых данных, как в таблице, так и в синхронных индексах. Это приводит как к увеличению времени исполнения, так и к необходимости применения [распределенных транзакций](../concepts/transactions#distributed-tx) даже при добавлении или изменении записей в единственной партиции. Асинхронно обновляемые индексы сохраняют возможность применения одношардовых транзакций, однако гарантируют только консистентность "в конечном счете", и все равно создают нагрузку на базу данных. diff --git a/ydb/docs/ru/core/dba/terraform.md b/ydb/docs/ru/core/dba/terraform.md index 00e885b4f1b0..feb81d641f2a 100644 --- a/ydb/docs/ru/core/dba/terraform.md +++ b/ydb/docs/ru/core/dba/terraform.md @@ -402,7 +402,7 @@ resource "ydb_table_changefeed" "ydb_table_changefeed" { #### consumer {#consumer} -Аргумент `consumer` описывает [читателя](../best_practices/cdc.md#read) потока изменений. +Аргумент `consumer` описывает [читателя](cdc.md#read) потока изменений. * `name` — (обязательный) имя читателя. * `supported_codecs` — (необязательный) поддерживаемые кодек данных. diff --git a/ydb/docs/ru/core/dba/toc_i.yaml b/ydb/docs/ru/core/dba/toc_i.yaml index 8ef330c183d5..8171a950af64 100644 --- a/ydb/docs/ru/core/dba/toc_i.yaml +++ b/ydb/docs/ru/core/dba/toc_i.yaml @@ -1,11 +1,19 @@ items: - name: Резервное копирование и восстановление href: backup-and-recovery.md +- name: Первичный ключ + include: + mode: link + path: primary-key/toc_p.yaml +- name: Вторичные индексы + href: secondary-indexes.md - name: Оптимизация планов запросов href: query-plans-optimization.md - name: Системные таблицы href: system-views.md -- name: Terraform - href: terraform.md - name: Пользовательские атрибуты - href: custom-attributes.md \ No newline at end of file + href: custom-attributes.md +- name: Change Data Capture + href: cdc.md +- name: Terraform + href: terraform.md \ No newline at end of file diff --git a/ydb/docs/ru/core/best_practices/_includes/batch_upload.md b/ydb/docs/ru/core/dev/batch-upload.md similarity index 100% rename from ydb/docs/ru/core/best_practices/_includes/batch_upload.md rename to ydb/docs/ru/core/dev/batch-upload.md diff --git a/ydb/docs/ru/core/best_practices/_includes/paging.md b/ydb/docs/ru/core/dev/paging.md similarity index 100% rename from ydb/docs/ru/core/best_practices/_includes/paging.md rename to ydb/docs/ru/core/dev/paging.md diff --git a/ydb/docs/ru/core/best_practices/_includes/timeouts.md b/ydb/docs/ru/core/dev/timeouts.md similarity index 88% rename from ydb/docs/ru/core/best_practices/_includes/timeouts.md rename to ydb/docs/ru/core/dev/timeouts.md index feff8c55a1ff..638a328cea6f 100644 --- a/ydb/docs/ru/core/best_practices/_includes/timeouts.md +++ b/ydb/docs/ru/core/dev/timeouts.md @@ -1,7 +1,3 @@ ---- -title: Использование таймаутов в YDB -description: 'Значение operation_timeout определяет время, в течение которого результат запроса интересен пользователю. Если за данное время операция не выполнилась, сервер возвращает ошибку c кодом Timeout и попытается прекратить выполнение запроса, однако отмена запроса не гарантируется. Всегда рекомендуется устанавливать и таймаут на операцию, и транспортный таймаут. ' ---- # Использование таймаутов В разделе приведено описание доступных таймаутов и представлены примеры использования на различных языках программирования. @@ -98,4 +94,4 @@ description: 'Значение operation_timeout определяет время } ``` -{% endlist %} +{% endlist %} \ No newline at end of file diff --git a/ydb/docs/ru/core/dev/toc_p.yaml b/ydb/docs/ru/core/dev/toc_p.yaml index b73cf38b3a85..6437e1f2326b 100644 --- a/ydb/docs/ru/core/dev/toc_p.yaml +++ b/ydb/docs/ru/core/dev/toc_p.yaml @@ -1,3 +1,9 @@ items: - name: Overview - href: index.md \ No newline at end of file + href: index.md +- name: Пакетная загрузка + href: batch-upload.md +- name: Постраничный вывод + href: paging.md +- name: Таймауты + href: timeouts.md \ No newline at end of file diff --git a/ydb/docs/ru/core/faq/_includes/common.md b/ydb/docs/ru/core/faq/_includes/common.md index 1c8f7cb3180f..f10bc05001c4 100644 --- a/ydb/docs/ru/core/faq/_includes/common.md +++ b/ydb/docs/ru/core/faq/_includes/common.md @@ -29,7 +29,7 @@ description: "Что такое YDB? Для каких задач стоит и * Чем меньше партиций таблиц будет задействовано во время исполнения запроса, тем быстрее он будет исполнен. Чтобы достичь большей производительности стоит руководствоваться правилом: один запрос — одна партиция. * Необходимо избегать ситуаций, при которых какая-то малая часть БД нагружена существенно больше, чем остальные части БД. -Подробнее читайте в разделе [Проектирование схемы](../../best_practices/schema_design.md). +Подробнее читайте в разделе [{#T}](../../dba/primary-key/index.md). #### Как равномерно распределить нагрузку по партициям таблицы? {#balance-shard-load} @@ -40,7 +40,7 @@ description: "Что такое YDB? Для каких задач стоит и * использовать хеш от значений ключевых колонок в качестве первичного ключа. * Необходимо уменьшать количество партиций таблиц, задействованных в одном запросе. -Подробнее читайте в разделе [Проектирование схемы](../../best_practices/schema_design.md#balance-shard-load). +Подробнее читайте в разделе [{#T}](../../dba/primary-key/index.md). #### Можно ли использовать NULL в ключевой колонке? {#null} @@ -64,7 +64,7 @@ description: "Что такое YDB? Для каких задач стоит и Для организации постраничного вывода рекомендуется последовательно выбирать данные, отсортированные по первичному ключу, ограничивая количество строк ключевым словом `LIMIT`. Использование ключевого слова `OFFSET` для решения этой задачи крайне не желательно. -Подробнее читайте в разделе [Постраничный вывод](../../best_practices/paging.md). +Подробнее читайте в разделе [Постраничный вывод](../../dev/paging.md). #### Как удалять устаревшие данные? {#ttl} diff --git a/ydb/docs/ru/core/faq/_includes/yql.md b/ydb/docs/ru/core/faq/_includes/yql.md index 1efe5230796c..d964a980164e 100644 --- a/ydb/docs/ru/core/faq/_includes/yql.md +++ b/ydb/docs/ru/core/faq/_includes/yql.md @@ -35,7 +35,7 @@ WHERE Key LIKE "some_prefix%"; #### Почему в результате запроса выводится только 1000 строк? {#result-rows-limit} -1000 строк — ограничение на размер одного результата для YQL запроса. В случае если результат запроса был обрезан, он будет помечен флагом `Truncated`. Чтобы получить большее количество строк из таблицы, можно воспользоваться [постраничным выводом](../../best_practices/paging.md) или операцией `ReadTable`. +1000 строк — ограничение на размер одного результата для YQL запроса. В случае если результат запроса был обрезан, он будет помечен флагом `Truncated`. Чтобы получить большее количество строк из таблицы, можно воспользоваться [постраничным выводом](../../dev/paging.md) или операцией `ReadTable`. #### Как экранировать кавычки JSON-строк при добавлении их в таблицу? {#escaping-quotes} diff --git a/ydb/docs/ru/core/quickstart.md b/ydb/docs/ru/core/quickstart.md index 8c7c49ea7532..906938359ac8 100644 --- a/ydb/docs/ru/core/quickstart.md +++ b/ydb/docs/ru/core/quickstart.md @@ -142,7 +142,7 @@ CREATE TABLE example * Каждый тип оператора SQL вроде `CREATE TABLE` имеет подробное описание в [справке по YQL](yql/reference/index.md). * `example` - это идентификатор имени таблицы, а `key` и `value` - идентификаторы имен столбцов. Рекомендуется использовать простые имена для таких идентификаторов, но если вам нужно использовать имя с необычными символами, оберните его в обратные кавычки. * `UInt64` и `String` - это названия типов данных. `String` представляет собой двоичную строку, а `UInt64` - 64-разрядное беззнаковое целое число. Таким образом, наша таблица-пример хранит строковые значения, идентифицируемые беззнаковыми целочисленными ключами. Подробнее [о типах данных](yql/reference/types/index.md). -* `PRIMARY KEY` - одно из основных понятий SQL, которое оказывает огромное влияние на логику приложения и производительность. В соответствии со стандартом SQL, первичный ключ также подразумевает ограничение уникальности, поэтому таблица не может иметь несколько строк с одинаковыми первичными ключами. В этой примерной таблице довольно просто определить, какой столбец пользователь должен выбрать в качестве первичного ключа, и мы указываем его как `(key)` в круглых скобках после соответствующего ключевого слова. В реальных сценариях таблицы часто содержат десятки столбцов, и первичные ключи могут быть составными (состоять из нескольких столбцов в указанном порядке), поэтому выбор правильного первичного ключа становится больше похожим на искусство. Если вас интересует эта тема, есть [руководство по выбору первичного ключа для максимизации производительности](best_practices/pk_scalability.md). YDB таблицы обязаны иметь первичный ключ. +* `PRIMARY KEY` - одно из основных понятий SQL, которое оказывает огромное влияние на логику приложения и производительность. В соответствии со стандартом SQL, первичный ключ также подразумевает ограничение уникальности, поэтому таблица не может иметь несколько строк с одинаковыми первичными ключами. В этой примерной таблице довольно просто определить, какой столбец пользователь должен выбрать в качестве первичного ключа, и мы указываем его как `(key)` в круглых скобках после соответствующего ключевого слова. В реальных сценариях таблицы часто содержат десятки столбцов, и первичные ключи могут быть составными (состоять из нескольких столбцов в указанном порядке), поэтому выбор правильного первичного ключа становится больше похожим на искусство. Если вас интересует эта тема, есть [руководство по выбору первичного ключа для максимизации производительности](dba/primary-key/row-oriented.md). YDB таблицы обязаны иметь первичный ключ. ## Добавление тестовых данных diff --git a/ydb/docs/ru/core/reference/ydb-cli/commands/_includes/secondary_index.md b/ydb/docs/ru/core/reference/ydb-cli/commands/_includes/secondary_index.md index 5793ab8a1eb1..72d454399fe1 100644 --- a/ydb/docs/ru/core/reference/ydb-cli/commands/_includes/secondary_index.md +++ b/ydb/docs/ru/core/reference/ydb-cli/commands/_includes/secondary_index.md @@ -10,7 +10,7 @@ Также добавить или удалить вторичный индекс можно с помощью директив [ADD INDEX и DROP INDEX](../../../../yql/reference/syntax/alter_table.md#secondary-index) операции YQL ALTER TABLE. -О назначении и применении вторичных индексов при разработке приложений можно прочитать в статье [Вторичные индексы](../../../../best_practices/secondary_indexes.md) в разделе "Рекомендации". +О назначении и применении вторичных индексов при разработке приложений можно прочитать в статье [Вторичные индексы](../../../../dba/secondary-indexes.md). ## Создание вторичного индекса {#add} diff --git a/ydb/docs/ru/core/reference/ydb-cli/commands/workload/_includes/stock.md b/ydb/docs/ru/core/reference/ydb-cli/commands/workload/_includes/stock.md index d2e3e0495cb8..fe88c807ba44 100644 --- a/ydb/docs/ru/core/reference/ydb-cli/commands/workload/_includes/stock.md +++ b/ydb/docs/ru/core/reference/ydb-cli/commands/workload/_includes/stock.md @@ -83,9 +83,9 @@ CREATE TABLE `orderLines`(id_order Uint64, product Utf8, quantity Int64, PRIMARY `--rate <значение>` | - | Суммарная частота запросов всех потоков, в транзакциях в секунду. Значение по умолчанию: 0 (не ограничена). `--quiet` | - | Выводит только итоговый результат теста. `--print-timestamp` | - | Печатать время вместе со статистикой каждого временного окна. -`--client-timeout` | - | [Транспортный таймаут в миллисекундах](../../../../../best_practices/timeouts.md). -`--operation-timeout` | - | [Таймаут на операцию в миллисекундах](../../../../../best_practices/timeouts.md). -`--cancel-after` | - | [Таймаут отмены операции в миллисекундах](../../../../../best_practices/timeouts.md). +`--client-timeout` | - | [Транспортный таймаут в миллисекундах](../../../../../dev/timeouts.md). +`--operation-timeout` | - | [Таймаут на операцию в миллисекундах](../../../../../dev/timeouts.md). +`--cancel-after` | - | [Таймаут отмены операции в миллисекундах](../../../../../dev/timeouts.md). `--window` | - | Длительность окна сбора статистики в секундах. Значение по умолчанию: 1. diff --git a/ydb/docs/ru/core/reference/ydb-cli/workload-kv.md b/ydb/docs/ru/core/reference/ydb-cli/workload-kv.md index 806243ce226d..2c12b5d17a92 100644 --- a/ydb/docs/ru/core/reference/ydb-cli/workload-kv.md +++ b/ydb/docs/ru/core/reference/ydb-cli/workload-kv.md @@ -120,9 +120,9 @@ DROP TABLE `kv_test` `--rate <значение>` | - | Суммарная частота запросов всех потоков, в транзакциях в секунду Значение по умолчанию: 0 (не ограничена). `--quiet` | - | Выводит только итоговый результат теста. `--print-timestamp` | - | Печатать время вместе со статистикой каждого временного окна. -`--client-timeout` | - | [Транспортный таймаут в миллисекундах](../../best_practices/timeouts.md). -`--operation-timeout` | - | [Таймаут на операцию в миллисекундах](../../best_practices/timeouts.md). -`--cancel-after` | - | [Таймаут отмены операции в миллисекундах](../../best_practices/timeouts.md). +`--client-timeout` | - | [Транспортный таймаут в миллисекундах](../../dev/timeouts.md). +`--operation-timeout` | - | [Таймаут на операцию в миллисекундах](../../dev/timeouts.md). +`--cancel-after` | - | [Таймаут отмены операции в миллисекундах](../../dev/timeouts.md). `--window` | - | Длительность окна сбора статистики в секундах. Значение по умолчанию: 1. `--max-first-key` | - | Максимальное значение primary ключа таблицы. Значение по умолчанию: $2^{64} - 1$. `--cols` | - | Количество колонок в таблице. Значение по умолчанию: 2, считая Key. diff --git a/ydb/docs/ru/core/toc_i.yaml b/ydb/docs/ru/core/toc_i.yaml index 17ae3db27a80..d793cd8da00d 100644 --- a/ydb/docs/ru/core/toc_i.yaml +++ b/ydb/docs/ru/core/toc_i.yaml @@ -24,9 +24,6 @@ items: mode: link path: contributor/toc_p.yaml -- { name: Рекомендации, include: { mode: link, path: best_practices/toc_p.yaml } } - - - name: Справка include: mode: link From 6464ef256c800da73067ef882037cbf44f572679 Mon Sep 17 00:00:00 2001 From: Ivan Blinkov Date: Mon, 1 Apr 2024 18:30:29 +0700 Subject: [PATCH 11/13] finish export_import rename in ru --- ydb/docs/ru/core/changelog-cli.md | 36 +++++++++---------- .../reference/ydb-cli/_includes/commands.md | 4 +-- .../ydb-cli/export_import/file_structure.md | 1 - .../ydb-cli/export_import/import-file.md | 1 - .../reference/ydb-cli/export_import/index.md | 1 - .../ydb-cli/export_import/s3_conn.md | 1 - .../ydb-cli/export_import/s3_export.md | 1 - .../ydb-cli/export_import/s3_import.md | 1 - .../ydb-cli/export_import/toc_i.yaml | 15 -------- .../ydb-cli/export_import/toc_p.yaml | 4 --- .../ydb-cli/export_import/tools_dump.md | 1 - .../ydb-cli/export_import/tools_restore.md | 1 - ydb/docs/ru/core/reference/ydb-cli/toc_i.yaml | 7 ++-- 13 files changed, 23 insertions(+), 51 deletions(-) delete mode 100644 ydb/docs/ru/core/reference/ydb-cli/export_import/file_structure.md delete mode 100644 ydb/docs/ru/core/reference/ydb-cli/export_import/import-file.md delete mode 100644 ydb/docs/ru/core/reference/ydb-cli/export_import/index.md delete mode 100644 ydb/docs/ru/core/reference/ydb-cli/export_import/s3_conn.md delete mode 100644 ydb/docs/ru/core/reference/ydb-cli/export_import/s3_export.md delete mode 100644 ydb/docs/ru/core/reference/ydb-cli/export_import/s3_import.md delete mode 100644 ydb/docs/ru/core/reference/ydb-cli/export_import/toc_i.yaml delete mode 100644 ydb/docs/ru/core/reference/ydb-cli/export_import/toc_p.yaml delete mode 100644 ydb/docs/ru/core/reference/ydb-cli/export_import/tools_dump.md delete mode 100644 ydb/docs/ru/core/reference/ydb-cli/export_import/tools_restore.md diff --git a/ydb/docs/ru/core/changelog-cli.md b/ydb/docs/ru/core/changelog-cli.md index ff2f5350eecc..d4ec61c06578 100644 --- a/ydb/docs/ru/core/changelog-cli.md +++ b/ydb/docs/ru/core/changelog-cli.md @@ -10,9 +10,9 @@ * Добавлены команды управления конфигурациями кластера [ydb admin config](reference/ydb-cli/configs.md) и [ydb admin volatile-config](reference/ydb-cli/configs.md). -* Добавлена поддержка загрузки PostgreSQL-совместимых типов командой [ydb import file csv|tsv|json](reference/ydb-cli/export_import/import-file.md). Только для строковых таблиц. +* Добавлена поддержка загрузки PostgreSQL-совместимых типов командой [ydb import file csv|tsv|json](reference/ydb-cli/export-import/import-file.md). Только для строковых таблиц. -* Добавлена поддержка загрузки директории из S3-совместимого хранилища в команде [ydb import s3](reference/ydb-cli/export_import/s3_import.md). Пока доступна только под Linux и Mac OS. +* Добавлена поддержка загрузки директории из S3-совместимого хранилища в команде [ydb import s3](reference/ydb-cli/export-import/import-s3.md). Пока доступна только под Linux и Mac OS. * Добавлена поддержка вывода результата выполнения команд [ydb table query execute](reference/ydb-cli/table-query-execute.md), [ydb yql](reference/ydb-cli/yql.md) и [ydb scripting yql](reference/ydb-cli/scripting-yql.md) в формате [Apache Parquet](https://parquet.apache.org/docs/). @@ -90,17 +90,17 @@ **Исправления ошибок:** -* Исправлена потеря строк при загрузке командой [ydb import file json](reference/ydb-cli/export_import/import-file.md). +* Исправлена потеря строк при загрузке командой [ydb import file json](reference/ydb-cli/export-import/import-file.md). * Исправлен неучет статистики во время прогрева команд [ydb workload topic run write|read|full](reference/ydb-cli/workload-topic.md#run-write). * Исправлен неполный вывод статистики в командах [ydb scripting yql](reference/ydb-cli/scripting-yql.md) и [ydb yql](reference/ydb-cli/yql.md). -* Исправлен неправильный вывод progress bar'a в командах [ydb tools dump](reference/ydb-cli/export_import/tools_dump.md) и [ydb tools restore](reference/ydb-cli/export_import/tools_restore.md). +* Исправлен неправильный вывод progress bar'a в командах [ydb tools dump](reference/ydb-cli/export-import/tools-dump.md) и [ydb tools restore](reference/ydb-cli/export-import/tools-restore.md). -* Исправлена ошибка загрузки больших файлов с заголовком в команде [ydb import file csv|tsv](reference/ydb-cli/export_import/import-file.md). +* Исправлена ошибка загрузки больших файлов с заголовком в команде [ydb import file csv|tsv](reference/ydb-cli/export-import/import-file.md). -* Исправлено зависание команды [ydb tools restore --import-data](reference/ydb-cli/export_import/tools_restore.md#optional). +* Исправлено зависание команды [ydb tools restore --import-data](reference/ydb-cli/export-import/tools-restore.md#optional). * Исправлена ошибка `Unknown value Rejected` при выполнении команды [ydb operation list buildindex](reference/ydb-cli/operation-list.md). @@ -110,17 +110,17 @@ **Функциональность:** -* Для команды `ydb import file` добавлен параметр [--timeout](reference/ydb-cli/export_import/import-file.md#optional), задающий время, в течение которого должна быть выполнена операция на сервере. -* Добавлен индикатор прогресса в командах [ydb scheme rmdir --recursive](reference/ydb-cli/commands/dir.md#rmdir) и [ydb import file](reference/ydb-cli/export_import/import-file.md). +* Для команды `ydb import file` добавлен параметр [--timeout](reference/ydb-cli/export-import/import-file.md#optional), задающий время, в течение которого должна быть выполнена операция на сервере. +* Добавлен индикатор прогресса в командах [ydb scheme rmdir --recursive](reference/ydb-cli/commands/dir.md#rmdir) и [ydb import file](reference/ydb-cli/export-import/import-file.md). * Добавлена команда [ydb workload kv run read-rows](reference/ydb-cli/workload-kv.md#read-rows-kv), которая нагружает базу запросами на чтение строк, используя новый экспериментальный API вызов ReadRows (реализован только в ветке [main](https://github.com/ydb-platform/ydb)), выполняющий более быстрое чтение по ключу, чем [select](reference/ydb-cli/workload-kv.md#select-kv). * В [ydb workload topic](reference/ydb-cli/workload-topic.md) добавлены новые параметры `--warmup-time`, `--percentile`, `--topic`, задающие время прогрева теста, процентиль в выводе статистики и имя топика соответственно. * Добавлена команда [ydb workload tpch](reference/ydb-cli/workload-tpch.md) для запуска нагрузочного теста TPC-H. -* Добавлен флаг `--ordered` в команде [ydb tools dump](reference/ydb-cli/export_import/tools_dump.md), сохраняющий порядок по первичному ключу в таблицах. +* Добавлен флаг `--ordered` в команде [ydb tools dump](reference/ydb-cli/export-import/tools-dump.md), сохраняющий порядок по первичному ключу в таблицах. **Производительность:** -* Увеличена скорость загрузки данных в команде `ydb import file` за счет добавления параллельной загрузки. Число потоков задается новым параметром [--threads](reference/ydb-cli/export_import/import-file.md#optional). -* Увеличена производительность команды [ydb import file json](reference/ydb-cli/export_import/import-file.md), за счет уменьшения числа копирований данных. +* Увеличена скорость загрузки данных в команде `ydb import file` за счет добавления параллельной загрузки. Число потоков задается новым параметром [--threads](reference/ydb-cli/export-import/import-file.md#optional). +* Увеличена производительность команды [ydb import file json](reference/ydb-cli/export-import/import-file.md), за счет уменьшения числа копирований данных. ## Версия 2.4.0 {#2-4-0} @@ -128,7 +128,7 @@ **Функциональность:** -* Добавлена возможность загрузки нескольких файлов командой [ydb import file](reference/ydb-cli/export_import/import-file.md). +* Добавлена возможность загрузки нескольких файлов командой [ydb import file](reference/ydb-cli/export-import/import-file.md). * Добавлена поддержка удаления колоночных таблиц для команды [ydb scheme rmdir --recursive](reference/ydb-cli/commands/dir.md#rmdir). * Повышена стабильность работы команды [ydb workload topic](reference/ydb-cli/workload-topic.md). @@ -144,8 +144,8 @@ * Для команды `ydb scheme rmdir` добавлен параметр [--recursive](reference/ydb-cli/commands/dir.md#rmdir-options), который позволяет рекурсивно удалить директорию вместе со всем содержимым. * Для команды [ydb scheme describe](reference/ydb-cli/commands/scheme-describe.md) добавлена поддержка типов `topic` и `coordination node`. * Для команды `ydb topic consumer` добавлен параметр [--commit](reference/ydb-cli/topic-read.md#osnovnye-opcionalnye-parametry) для подтверждения прочитанных сообщений. -* Для команды `ydb import file csv|tsv` добавлен параметр [--columns](reference/ydb-cli/export_import/import-file.md#optional), с помощью которого можно указать список колонок вместо заголовка в файле. -* Для команды `ydb import file csv|tsv` добавлен параметр [--newline-delimited](reference/ydb-cli/export_import/import-file.md#optional), который подтверждает отсутствие символа переноса строки в данных. Использование этого параметра ускоряет импорт за счет параллельного чтения из нескольких секций файла. +* Для команды `ydb import file csv|tsv` добавлен параметр [--columns](reference/ydb-cli/export-import/import-file.md#optional), с помощью которого можно указать список колонок вместо заголовка в файле. +* Для команды `ydb import file csv|tsv` добавлен параметр [--newline-delimited](reference/ydb-cli/export-import/import-file.md#optional), который подтверждает отсутствие символа переноса строки в данных. Использование этого параметра ускоряет импорт за счет параллельного чтения из нескольких секций файла. **Исправления ошибок:** @@ -172,8 +172,8 @@ **Улучшения:** * Добавлена поддержка параметра `--stats` команды [ydb scheme describe](reference/ydb-cli/commands/scheme-describe.md) для колоночных таблиц. -* Добавлена поддержка файлов в формате Parquet для импорта командой [ydb import](reference/ydb-cli/export_import/import-file.md). -* Поддержаны дополнительное логирование и ретраи для команды [ydb import](reference/ydb-cli/export_import/import-file.md). +* Добавлена поддержка файлов в формате Parquet для импорта командой [ydb import](reference/ydb-cli/export-import/import-file.md). +* Поддержаны дополнительное логирование и ретраи для команды [ydb import](reference/ydb-cli/export-import/import-file.md). ## Версия 2.1.0 {#2-1-0} @@ -186,7 +186,7 @@ * Для команды [ydb scheme ls](reference/ydb-cli/commands/scheme-ls.md) добавлен параметр `-1`, включающая режим вывода по одному объекту на строку. * URL сервиса IAM теперь можно сохранять в профиле. * Добавлена возможность использовать аутентификацию по логину и паролю без указания пароля. -* Добавлена поддержка профилей AWS в команде [ydb export s3](reference/ydb-cli/export_import/s3_conn.md#auth). +* Добавлена поддержка профилей AWS в команде [ydb export s3](reference/ydb-cli/export-import/auth-s3.md#auth). * Добавлена возможность создания профиля используя `stdin`. Например, можно передать вывод команды [YC CLI](https://cloud.yandex.ru/docs/cli/) `yc ydb database get information` на вход команде `ydb config profile create`. **Исправления ошибок:** @@ -230,5 +230,5 @@ **Функциональность:** -* Добавлена возможность сжатия данных при экспорте в S3-совместимое хранилище (см. параметр `--compression` команды [ydb export s3](reference/ydb-cli/export_import/s3_export.md)). +* Добавлена возможность сжатия данных при экспорте в S3-совместимое хранилище (см. параметр `--compression` команды [ydb export s3](reference/ydb-cli/export-import/export-s3.md)). * Добавлена возможность управления автоматической проверкой доступности новой версии {{ ydb-short-name }} CLI (см. параметры `--disable-checks` и `--enable-checks` команды [ydb version](reference/ydb-cli/version.md)). diff --git a/ydb/docs/ru/core/reference/ydb-cli/_includes/commands.md b/ydb/docs/ru/core/reference/ydb-cli/_includes/commands.md index 07a006054114..e412e7fab15d 100644 --- a/ydb/docs/ru/core/reference/ydb-cli/_includes/commands.md +++ b/ydb/docs/ru/core/reference/ydb-cli/_includes/commands.md @@ -64,12 +64,12 @@ table attribute drop | Удаление атрибута таблицы [table ttl set](../table-ttl-set.md) | Установка параметров TTL [table ttl reset](../table-ttl-reset.md) | Сброс параметров TTL [tools copy](../tools-copy.md) | Копирование таблиц -[tools dump](../export_import/tools_dump.md) | Выгрузка директории или таблицы в файловую систему +[tools dump](../export-import/tools-dump.md) | Выгрузка директории или таблицы в файловую систему {% if ydb-cli == "ydb" %} [tools pg-convert](../../../postgresql/pg-dump.md#pg-convert) | Конвертация дампа PostgreSQL, полученного утилитой pg_dump, в формат, понятный YDB {% endif %} [tools rename](../commands/tools/rename.md) | Переименование таблиц -[tools restore](../export_import/tools_restore.md) | Восстановление из файловой системы +[tools restore](../export-import/tools-restore.md) | Восстановление из файловой системы [topic create](../topic-create.md) | Создание топика [topic alter](../topic-alter.md) | Модификация параметров топика и перечня читателей [topic drop](../topic-drop.md) | Удаление топика diff --git a/ydb/docs/ru/core/reference/ydb-cli/export_import/file_structure.md b/ydb/docs/ru/core/reference/ydb-cli/export_import/file_structure.md deleted file mode 100644 index a5c0143d94bd..000000000000 --- a/ydb/docs/ru/core/reference/ydb-cli/export_import/file_structure.md +++ /dev/null @@ -1 +0,0 @@ -{% include [file-structure.md](../export-import/_includes/file-structure.md) %} diff --git a/ydb/docs/ru/core/reference/ydb-cli/export_import/import-file.md b/ydb/docs/ru/core/reference/ydb-cli/export_import/import-file.md deleted file mode 100644 index ebf022961448..000000000000 --- a/ydb/docs/ru/core/reference/ydb-cli/export_import/import-file.md +++ /dev/null @@ -1 +0,0 @@ -{% include [import-file.md](../export-import/_includes/import-file.md) %} diff --git a/ydb/docs/ru/core/reference/ydb-cli/export_import/index.md b/ydb/docs/ru/core/reference/ydb-cli/export_import/index.md deleted file mode 100644 index bac195e986fd..000000000000 --- a/ydb/docs/ru/core/reference/ydb-cli/export_import/index.md +++ /dev/null @@ -1 +0,0 @@ -{% include [index.md](../export-import/_includes/index.md) %} diff --git a/ydb/docs/ru/core/reference/ydb-cli/export_import/s3_conn.md b/ydb/docs/ru/core/reference/ydb-cli/export_import/s3_conn.md deleted file mode 100644 index cada9d45ca31..000000000000 --- a/ydb/docs/ru/core/reference/ydb-cli/export_import/s3_conn.md +++ /dev/null @@ -1 +0,0 @@ -{% include [auth-s3.md](../export-import/_includes/auth-s3.md) %} diff --git a/ydb/docs/ru/core/reference/ydb-cli/export_import/s3_export.md b/ydb/docs/ru/core/reference/ydb-cli/export_import/s3_export.md deleted file mode 100644 index 43fd5f078469..000000000000 --- a/ydb/docs/ru/core/reference/ydb-cli/export_import/s3_export.md +++ /dev/null @@ -1 +0,0 @@ -{% include [export-s3.md](../export-import/_includes/export-s3.md) %} diff --git a/ydb/docs/ru/core/reference/ydb-cli/export_import/s3_import.md b/ydb/docs/ru/core/reference/ydb-cli/export_import/s3_import.md deleted file mode 100644 index 5e45757e1d73..000000000000 --- a/ydb/docs/ru/core/reference/ydb-cli/export_import/s3_import.md +++ /dev/null @@ -1 +0,0 @@ -{% include [import-s3.md](../export-import/_includes/import-s3.md) %} diff --git a/ydb/docs/ru/core/reference/ydb-cli/export_import/toc_i.yaml b/ydb/docs/ru/core/reference/ydb-cli/export_import/toc_i.yaml deleted file mode 100644 index 73b547b49fe4..000000000000 --- a/ydb/docs/ru/core/reference/ydb-cli/export_import/toc_i.yaml +++ /dev/null @@ -1,15 +0,0 @@ -items: -- name: Файловая структура выгрузки - href: file_structure.md -- name: Выгрузка в файловую систему - href: tools_dump.md -- name: Загрузка из файловой системы - href: tools_restore.md -- name: Соединение и аутентификация с S3 - href: s3_conn.md -- name: Выгрузка в S3 - href: s3_export.md -- name: Загрузка из S3 - href: s3_import.md -- name: Импорт данных из файла в существующую таблицу - href: import-file.md diff --git a/ydb/docs/ru/core/reference/ydb-cli/export_import/toc_p.yaml b/ydb/docs/ru/core/reference/ydb-cli/export_import/toc_p.yaml deleted file mode 100644 index 3e62ad228bcc..000000000000 --- a/ydb/docs/ru/core/reference/ydb-cli/export_import/toc_p.yaml +++ /dev/null @@ -1,4 +0,0 @@ -items: -- name: Обзор - href: index.md -- include: { mode: link, path: toc_i.yaml } \ No newline at end of file diff --git a/ydb/docs/ru/core/reference/ydb-cli/export_import/tools_dump.md b/ydb/docs/ru/core/reference/ydb-cli/export_import/tools_dump.md deleted file mode 100644 index e31e5267c471..000000000000 --- a/ydb/docs/ru/core/reference/ydb-cli/export_import/tools_dump.md +++ /dev/null @@ -1 +0,0 @@ -{% include [tools-dump.md](../export-import/_includes/tools-dump.md) %} diff --git a/ydb/docs/ru/core/reference/ydb-cli/export_import/tools_restore.md b/ydb/docs/ru/core/reference/ydb-cli/export_import/tools_restore.md deleted file mode 100644 index 740573207164..000000000000 --- a/ydb/docs/ru/core/reference/ydb-cli/export_import/tools_restore.md +++ /dev/null @@ -1 +0,0 @@ -{% include [tools-restore.md](../export-import/_includes/tools-restore.md) %} diff --git a/ydb/docs/ru/core/reference/ydb-cli/toc_i.yaml b/ydb/docs/ru/core/reference/ydb-cli/toc_i.yaml index 2c98ecf951e0..54f7a86fd23a 100644 --- a/ydb/docs/ru/core/reference/ydb-cli/toc_i.yaml +++ b/ydb/docs/ru/core/reference/ydb-cli/toc_i.yaml @@ -44,10 +44,9 @@ items: - name: Скан запросы href: commands/scan-query.md - name: Выгрузка и загрузка данных - include: { mode: link, path: export-import/toc_p.yaml } - - name: Выгрузка и загрузка данных - include: { mode: link, path: export_import/toc_p.yaml } - hidden: true + include: + mode: link + path: export-import/toc_p.yaml - name: Работа с топиками items: - name: Команды для работы с топиком From a5d8f553494e20895cd99fc83db9937402185016 Mon Sep 17 00:00:00 2001 From: Ivan Blinkov Date: Mon, 1 Apr 2024 18:54:41 +0700 Subject: [PATCH 12/13] remove a deprecated article --- ydb/docs/en/core/concepts/datatypes.md | 2 -- ydb/docs/en/core/concepts/toc_i.yaml | 1 - ydb/docs/redirects.yaml | 2 ++ ydb/docs/ru/core/concepts/datatypes.md | 1 - ydb/docs/ru/core/concepts/toc_i.yaml | 1 - ydb/docs/ru/core/toc_i.yaml | 2 -- 6 files changed, 2 insertions(+), 7 deletions(-) delete mode 100644 ydb/docs/en/core/concepts/datatypes.md delete mode 100644 ydb/docs/ru/core/concepts/datatypes.md diff --git a/ydb/docs/en/core/concepts/datatypes.md b/ydb/docs/en/core/concepts/datatypes.md deleted file mode 100644 index 887ba20535ed..000000000000 --- a/ydb/docs/en/core/concepts/datatypes.md +++ /dev/null @@ -1,2 +0,0 @@ -This page has been deleted, for information about data types, see [YQL Data Types](../yql/reference/types/index.md). - diff --git a/ydb/docs/en/core/concepts/toc_i.yaml b/ydb/docs/en/core/concepts/toc_i.yaml index 00493dad118d..eae2d485a1d3 100644 --- a/ydb/docs/en/core/concepts/toc_i.yaml +++ b/ydb/docs/en/core/concepts/toc_i.yaml @@ -6,7 +6,6 @@ items: href: auth.md - name: Data model and schema include: { path: datamodel/toc_p.yaml, mode: link } -- { name: Data types, href: datatypes.md, hidden: true } # Deprecated - { name: Transactions, href: transactions.md } - { name: Secondary indexes, href: secondary_indexes.md } - { name: Change Data Capture (CDC), href: cdc.md, when: feature_changefeed } diff --git a/ydb/docs/redirects.yaml b/ydb/docs/redirects.yaml index 217e2f59bb79..8fa20d7081b7 100644 --- a/ydb/docs/redirects.yaml +++ b/ydb/docs/redirects.yaml @@ -39,6 +39,8 @@ common: to: /yql/reference/index.md - from: /troubleshooting/system_views_cluster.md to: /devops/manual/system-views.md + - from: /concepts/datatypes.md + to: /yql/reference/types/index.md # DBA-related redirects - from: /db/index.md diff --git a/ydb/docs/ru/core/concepts/datatypes.md b/ydb/docs/ru/core/concepts/datatypes.md deleted file mode 100644 index e46c8263050c..000000000000 --- a/ydb/docs/ru/core/concepts/datatypes.md +++ /dev/null @@ -1 +0,0 @@ -Данная страница удалена, информация по типам данных находится в статье [Типы данных YQL](../yql/reference/types/index.md). \ No newline at end of file diff --git a/ydb/docs/ru/core/concepts/toc_i.yaml b/ydb/docs/ru/core/concepts/toc_i.yaml index f5fe7fbb84b6..1dcebe645495 100644 --- a/ydb/docs/ru/core/concepts/toc_i.yaml +++ b/ydb/docs/ru/core/concepts/toc_i.yaml @@ -6,7 +6,6 @@ items: href: auth.md - name: Модель данных и схема include: { path: datamodel/toc_p.yaml, mode: link } -- { name: Типы данных, href: datatypes.md, hidden: true } # Deprecated - { name: Транзакции, href: transactions.md } - { name: Вторичные индексы, href: secondary_indexes.md } - { name: Change Data Capture (CDC), href: cdc.md, when: feature_changefeed } diff --git a/ydb/docs/ru/core/toc_i.yaml b/ydb/docs/ru/core/toc_i.yaml index d793cd8da00d..80c59e4db517 100644 --- a/ydb/docs/ru/core/toc_i.yaml +++ b/ydb/docs/ru/core/toc_i.yaml @@ -28,8 +28,6 @@ items: include: mode: link path: reference/toc_p.yaml - -# Footer - name: Вопросы и ответы include: mode: link From 0aec07197cd94f3a2578c7d7e8511909efab24c2 Mon Sep 17 00:00:00 2001 From: Ivan Blinkov Date: Mon, 1 Apr 2024 19:04:17 +0700 Subject: [PATCH 13/13] update index.yaml --- ydb/docs/en/core/dev/index.md | 2 +- ydb/docs/en/core/index.yaml | 29 ++++++++++++++++------------- ydb/docs/ru/core/index.yaml | 24 +++++++++++++++--------- 3 files changed, 32 insertions(+), 23 deletions(-) diff --git a/ydb/docs/en/core/dev/index.md b/ydb/docs/en/core/dev/index.md index 18f081feb70e..5ce6df75c358 100644 --- a/ydb/docs/en/core/dev/index.md +++ b/ydb/docs/en/core/dev/index.md @@ -2,4 +2,4 @@ This section of {{ ydb-short-name }} documentation covers everything you need to know to develop applications interacting with YDB. -If you're interested in developing {{ ydb-short-name }} core or satellite projects, refer to the[documentation for contributors](../contributor/index.md). \ No newline at end of file +If you're interested in developing {{ ydb-short-name }} core or satellite projects, refer to the [documentation for contributors](../contributor/index.md). \ No newline at end of file diff --git a/ydb/docs/en/core/index.yaml b/ydb/docs/en/core/index.yaml index 86fe3db61160..037d8cf9e393 100644 --- a/ydb/docs/en/core/index.yaml +++ b/ydb/docs/en/core/index.yaml @@ -8,14 +8,23 @@ meta: title: YDB Documentation links: - title: Getting started - description: Deploy your cluster and perform basic operations with data + description: Deploy your first YDB instance to experiment with href: quickstart - title: Concepts description: How YDB works, its features and available usage modes href: concepts/ - - title: Recommendations - description: A set of recommendations for practical service use - href: best_practices/ + - title: For DevOps + description: How to run production YDB clusters + href: devops/ + - title: For DBA + description: How to run manage YDB databases + href: dba/ + - title: For Developers + description: How to develop applications working with YDB + href: dev/ + - title: For Contributors + description: How to contribute to YDB core and satellite projects + href: contributor/ - title: YQL reference guide description: Description of YQL syntax and built-in functions href: yql/reference/ @@ -25,12 +34,6 @@ links: - title: Working with the SDK description: YDB SDK reference href: reference/ydb-sdk/ - - title: Working with PostgreSQL - description: Compatibility with PostgreSQL - href: postgresql/ - - title: Managing databases - description: Configuring, maintaining, monitoring, and performing diagnostics of YDB databases - href: db/ - - title: Managing a cluster - description: Configuring, maintaining, monitoring, and performing diagnostics of YDB clusters - href: cluster/ + - title: PostgreSQL compatibility + description: Integrate with PostgreSQL ecosystem + href: postgresql/intro/ \ No newline at end of file diff --git a/ydb/docs/ru/core/index.yaml b/ydb/docs/ru/core/index.yaml index 28e98c2f1659..8920f93e11ea 100644 --- a/ydb/docs/ru/core/index.yaml +++ b/ydb/docs/ru/core/index.yaml @@ -16,9 +16,18 @@ links: - title: Концепции description: Как устроена YDB, возможности и доступные режимы использования href: concepts/ - - title: Рекомендации - description: Набор рекомендаций по практическому использованию сервиса - href: best_practices/ + - title: For DevOps + description: How to run production YDB clusters + href: devops/ + - title: For DBA + description: How to run manage YDB databases + href: dba/ + - title: For Developers + description: How to develop applications working with YDB + href: dev/ + - title: For Contributors + description: How to contribute to YDB core and satellite projects + href: contributor/ - title: Справочник YQL description: Описание синтаксиса и встроенных функций YQL href: yql/reference/ @@ -28,9 +37,6 @@ links: - title: Работа с SDK description: Справочник по YDB Software Development Kits href: reference/ydb-sdk/ - - title: Управление базами данных - description: Конфигурация, обслуживание, мониторинг и диагностика баз данных YDB - href: db/ - - title: Управление кластером - description: Конфигурация, обслуживание, мониторинг и диагностика кластеров YDB - href: cluster/ + - title: Совместимость с PostgreSQL + description: Интеграция с экосистемой PostgreSQL + href: postgresql/intro/ \ No newline at end of file