Системные таблицы
Начиная с версии 1.16, RethinkDB поддерживает специальные системные таблицы, содержащие конфигурационную и статусную информацию о серверах, базах данных, отдельных таблицах и проблемах кластера. Запрос к системным таблицам возвращает информацию о статусе кластера и текущих объектах (например, серверах и таблицах) внутри кластера. Внося или удаляя записи и обновляя поля в этих таблицах, можно изменить конфигурацию представленных ими объектов.
Обзор
Доступ к системным таблицам осуществляется через базу данных rethinkdb. Эти таблицы не являются реальными хранилищами документов RethinkDB, как пользовательские таблицы, а представляют собой «табличные» интерфейсы к системе, позволяющие использовать большинство команд ReQL для управления. Системные таблицы нельзя создавать, удалять, переконфигурировать или переименовывать.
Метаданные в системных таблицах относятся ко всему кластеру RethinkDB. Каждый сервер в кластере поддерживает свою копию системных таблиц. При изменении системной таблицы на одном сервере изменения синхронизируются на всех серверах.
Примечание: Начиная с версии 2.3, только пользователь admin может получить доступ к системным таблицам. Подробнее об учетных записях пользователей и разрешениях см. в разделе Разрешения и учетные записи пользователей.
Таблицы
-
table_configхранит конфигурации таблиц, включая фрагментацию и репликацию. Запись вtable_configпозволяет создавать, удалять и переконфигурировать таблицы. -
server_configхранит имена и метки серверов. Запись в эту таблицу позволяет переименовывать серверы и назначать им метки. -
db_configхранит UUID и имена баз данных. Запись в эту таблицу позволяет создавать, удалять и изменять базы данных. -
cluster_configхранит ключ аутентификации для кластера. -
table_status— это только для чтения таблица, которая возвращает статус и конфигурацию таблиц в системе. -
server_status— это только для чтения таблица, которая возвращает информацию о процессе и хост-машине для каждого сервера. -
current_issues— это только для чтения таблица, которая возвращает статистику о проблемах кластера. Подробнее см. документацию таблица текущих проблем системы. -
usersхранит учетные записи пользователей RethinkDB. (См. Разрешения и учетные записи пользователей.) -
permissionsхранит разрешения и области, связанные с учетными записями пользователей RethinkDB. (См. Разрешения и учетные записи пользователей.) -
jobsперечисляет задачи (запросы, создание индексов, уплотнение дисков и другие служебные задачи), над которыми работает кластер, а также позволяет прерывать выполняемые запросы. -
stats— это только для чтения таблица, которая возвращает статистику о кластере. -
logs— это только для чтения таблица, хранящая журнальные сообщения со всех серверов кластера.
Ограничения
- Хотя системные таблицы поддерживают changefeed, они не поддерживают все цепочки операций, которые поддерживают реальные таблицы. Например, агрегация (
maxиmin) и командыlimitне будут работать с системными таблицами. - Некоторые системные таблицы только для чтения. Системные таблицы, допускающие запись, требуют определенной схемы документов, описанной ниже.
- Операции записи в системные таблицы не являются атомарными. Избегайте записи в одну и ту же строку системной таблицы с нескольких клиентов одновременно.
- Аргумент
durabilityпри записях игнорируется для системных таблиц.
При использовании только системных таблиц команда table получает новый аргумент identifier_format. Допустимые значения — name и uuid. Если он установлен в uuid, ссылки в системных таблицах на базы данных или другие таблицы будут UUID, а не названиями баз данных/таблиц. Это полезно для написания скриптов и административных задач, так как UUID остаются неизменными даже при изменении названий объектов. По умолчанию установлено значение name.
Конфигурационные таблицы
table_config
Фрагментацию и репликацию можно контролировать через таблицу table_config, а также более сложные настройки подтверждения записи и долговечности. Таблицы также можно переименовать, изменив их строки. Типичная строка в таблице table_config будет выглядеть так:
{
id: "31c92680-f70c-4a4b-a49e-b238eb12c023",
name: "tablename",
db: "test",
primary_key: "id",
shards: [
{
primary_replica: "a",
"replicas": ["a", "b"],
"nonvoting_replicas": []
},
{
primary_replica: "b",
"replicas": ["a", "b"]
"nonvoting_replicas": []
}
],
indexes: ["index1", "index2"],
write_acks: "majority",
durability: "hard"
}
-
id: UUID таблицы. Только для чтения. -
name: имя таблицы. -
db: база данных, в которой находится таблица, либо имя, либо UUID, в зависимости от значенияidentifier_format. Только для чтения. -
primary_key: имя поля, используемого в качестве первичного ключа таблицы, установленного при создании таблицы. Только для чтения. -
shards: список фрагментов таблицы. Каждый фрагмент — это объект со следующими полями:-
primary_replica: имя или UUID сервера, являющегося основным сервером фрагмента. Еслиprimary_replicaимеет значениеnull, таблица будет недоступна. Это может произойти, если сервер, являющийся основным сервером фрагмента, удален. -
replicas: список серверов, включая основной, хранящих копии фрагмента. -
nonvoting_replicas: список серверов, которые не участвуют в «голосовании» в рамках процесса переключения. Если это поле отсутствует, оно рассматривается как пустой список. Этот список должен быть подмножеством поляreplicasи не должен содержать первичной копии.
-
-
indexes: список вторичных индексов в таблице. Только для чтения. -
write_hook: настроенный обработчик записи для этой таблицы, если таковой имеется. Только для чтения.-
function: двоичное представление функции обработчика записи, -
query: строковое представление функции обработчика записи в ReQL
-
-
write_acks: настройки подтверждения записи для таблицы. Если установлено значениеmajority(по умолчанию), записи будут подтверждаться, когда большинство реплик подтвердят свои записи; если установлено значениеsingle, записи будут подтверждаться, когда одна реплика подтвердит ее. -
durability:softилиhard(по умолчанию). В режиме долговечностиhardзаписи сохраняются на диске до отправки подтверждений; в режимеsoftзаписи подтверждаются сразу после получения. Режимsoftбыстрее, но немного менее устойчив к отказам.
Если вы delete строку из table_config, таблица будет удалена. Если вы insert строку, поля name и db обязательны; другие поля необязательны и будут автоматически сгенерированы или установлены по умолчанию, если не указаны. Не включайте поле id. Система автоматически сгенерирует UUID.
Если вы replace строку в table_config, вам необходимо указать все поля. Обычно проще update определенные поля.
Родные команды ReQL, такие как reconfigure, также управляют фрагментацией и репликацией, и если вы не используете метки серверов, вы можете изменить настройки фрагментации/репликации в веб-интерфейсе. Подробнее см. Фрагментация и репликация.
server_config
Эта таблица хранит имена серверов вместе с их метками. Метки серверов организуют серверы в логические группы: серверы могут быть помечены по назначению (база данных, приложение и т. д.) или по расположению дата-центра («us_west», «us_east», «london» и т. д.). Более подробно о метках серверов см. Фрагментация и репликация.
Каждый сервер, который когда-либо был частью кластера и не был постоянно удален, будет иметь строку в этой таблице в следующем формате.
{
id: "de8b75d1-3184-48f0-b1ef-99a9c04e2be5",
name: "servername",
tags: ["default"],
cache_size_mb: "auto"
}
-
id: UUID сервера. (Только для чтения.) -
name: имя сервера. -
tags: список неупорядоченных меток, связанных с сервером. -
cache_size_mb: размер кэша сервера, либо число (желаемый размер в мегабайтах), либо"auto"(позволяет серверу самостоятельно принять решение при запуске, основываясь на доступной памяти системы).
Если метки не указаны при запуске сервера, серверу автоматически назначается метка default. В таблицу server_config вставлять документы нельзя. Новый документ создается при подключении сервера к кластеру.
Удалять документы из этой таблицы нельзя. При потере соединения сервером с кластером соответствующий документ будет автоматически удален.
db_config
В таблице db_config для каждой базы данных в кластере существует один документ с двумя полями.
{
id: "de8b75d1-3184-48f0-b1ef-99a9c04e2be5",
name: "dbname"
}
-
id: UUID базы данных. (Только для чтения.) -
name: имя базы данных.
Документы могут быть вставлены для создания новых баз данных, удалены для удаления баз данных и изменены для переименования баз данных. (Переименование баз данных — единственная задача, которая требует запроса к таблице db_config; для двух других задач существуют команды ReQL, dbCreate и dbDrop.) Как и в случае с таблицами, если вы insert базу данных, не указывайте поле id; система автоматически сгенерирует UUID.
cluster_config
Таблица cluster_config содержит только одну строку. Вставлять и удалять документы из этой таблицы нельзя.
{
id: "heartbeat",
heartbeat_timeout_secs: 10
}
-
id: первичный ключheartbeat. -
heartbeat_timeout_secs: время в секундах между потерей соединения сервером с кластером и началом процесса переключения. По умолчанию 10 секунд.
Таблицы статуса
Все таблицы статуса только для чтения. Некоторая информация в таблицах статуса также возвращается в конфигурационных таблицах (например, имена и UUID объектов).
table_status
Эта таблица хранит информацию о доступности таблиц. Для каждой таблицы (кроме системных) существует один документ.
{
id: "31c92680-f70c-4a4b-a49e-b238eb12c023",
name: "tablename",
db: "test",
status: {
ready_for_outdated_reads: true,
ready_for_reads: true,
ready_for_writes: true,
all_replicas_ready: true
},
shards: [
{
primary_replicas: ["a"],
replicas: [{server: "a", state: "ready"}, {server: "b", state: "ready"}]
},
{
primary_replicas: ["b"],
replicas: [{server: "a", state: "ready"}, {server: "b", state: "ready"}]
}]
}
-
id: UUID таблицы. -
name: имя таблицы. -
db: база данных, в которой находится таблица, либо имя, либо UUID, в зависимости от значенияidentifier_format(см. «ограничения» в обзоре в верхней части этого документа). -
status: подполя в этом поле указывают, готовы ли все фрагменты таблицы принять данный тип запроса:outdated_reads,readsиwrites. Полеall_replicas_readyуказывает, завершены ли все фоновые задачи. -
shards: по одной записи для каждого фрагмента вtable_config. У каждого объекта фрагмента есть следующие поля:-
primary_replicas: список из нуля или более серверов, работающих в качестве первичных реплик для фрагмента. Если список содержит более одного сервера, различные части фрагмента обслуживаются разными первичными репликами; это временное состояние. -
replicas: список всех серверов, работающих в качестве реплик для этого фрагмента. Это может включать серверы, которые больше не настроены как реплики, но по-прежнему хранят данные до тех пор, пока их нельзя безопасно удалить. Полеstateможет принимать следующие значения:-
ready: сервер готов обслуживать запросы. -
transitioning: сервер находится в промежуточном состоянии между вышеперечисленными состояниями. Переходное состояние обычно длится лишь доли секунды. -
backfilling: сервер получает данные с другого сервера. -
disconnected: сервер не подключен к кластеру. -
waiting_for_primary: сервер ожидает доступности своей первичной реплики. -
waiting_for_quorum: первичная реплика ожидает доступности кворума реплик таблицы перед началом приема записей.
-
-
server_status
Эта таблица возвращает информацию о статусе и доступности серверов в кластере RethinkDB. Для каждого сервера, подключенного к кластеру, создается отдельный документ. Если сервер теряет подключение к кластеру, он удаляется из таблицы server_status.
Это типичная схема документа для сервера, подключенного к хост-серверу — то есть серверу, к которому клиент подключается, когда выполняет запрос к таблице server_status.
{
id: "de8b75d1-3184-48f0-b1ef-99a9c04e2be5",
name: "servername",
network: {
hostname: "companion-cube",
cluster_port: 29015,
http_admin_port: 8080,
reql_port: 28015,
time_connected: <ReQL time object>,
connected_to: {
"companion-orb": true,
"companion-dodecahedron": true
},
canonical_addresses: [
{ host: "127.0.0.1", port: 29015 },
{ host: "::1", port: 29015 }
]
},
process: {
argv: ["/usr/bin/rethinkdb"],
cache_size_mb: 100,
pid: 28580,
time_started: <ReQL time object>,
version: "rethinkdb 2.2.5 (CLANG 7.0.2 (clang-700.1.81))"
}
}
-
id: UUID сервера. -
name: имя сервера. -
network: информация о сети, к которой подключен сервер:-
hostname: имя хоста, возвращаемоеgethostname(). -
*_port: порты RethinkDB на этом сервере (с точки зрения самого сервера). -
canonical_addresses: список канонических адресов и портов сервера. Они могут отличаться отhostnameиcluster_portв зависимости от вашей конфигурации сети. -
time_connected: время подключения (или повторного подключения) сервера к кластеру. -
connected_to: список пар «ключ-значение» серверов, к которым этот сервер в настоящее время подключен (true) или о которых он знает, но к которым в настоящее время не подключен (false). В большинстве случаев другие серверы будут идентифицированы по имени, но если сервер, к которому обращаются, не может определить имя сервера в кластере, к которому он не подключен, он будет идентифицирован по UUID.
-
-
process: информация о процессе RethinkDB сервера:-
argv: аргументы командной строки, с которыми был запущен сервер, в виде массива строк. -
cache_size_mb: размер кэша в мегабайтах. (Это можно настроить при запуске или изменив записьserver_statusдля этого сервера.) -
pid: идентификатор процесса. -
time_started: время запуска процесса сервера. -
version: версия сервера RethinkDB.
-
Таблицы учетных записей пользователей
Подробнее об этих двух таблицах см. Разрешения и учетные записи пользователей.
users
Таблица users содержит по одному документу для каждого пользователя в системе, каждый из которых имеет две пары «ключ-значение»: уникальное поле id и поле password. Поле id — это имя учетной записи. Поле password ведет себя по-разному при записи и чтении; вы можете изменить пароль учетной записи, записав значение в это поле (или удалить пароль, записав false), но пароль нельзя прочитать. Вместо этого при чтении password будет true или false, указывая, есть ли у учетной записи пароль или нет.
{
id: "admin",
password: true
}
Документы могут быть вставлены в users для создания новых пользователей и удалены для их удаления. Вы не можете изменить значение id существующего документа, только изменить или удалить пароли через update.
permissions
Документы в таблице разрешений имеют от двух до четырех пар «ключ-значение».
-
id: список из одного-трех элементов, указывающих пользователя и область действия для данного разрешения, элементами которого являются имя пользователя, UUID базы данных (для области действия базы данных и таблицы) и UUID таблицы (только для области действия таблицы). -
permissions: объект с одним-четырьмя логическими ключами, соответствующими допустимым разрешениям (read,write,connectиconfig). -
database: имя базы данных, к которой относятся эти разрешения, присутствует только для разрешений с областью действия базы данных или таблицы. -
table: имя таблицы, к которой относятся эти разрешения, присутствует только для разрешений с областью действия таблицы.
{
id: [
"bob"
],
permissions: {
read: true,
write: false,
config: false
}
}
{
database: "field_notes",
id: [
"bob",
"8b2c3f00-f312-4524-847a-25c79e1a22d4"
],
permissions: {
write: true
}
}
{
database: "field_notes",
table: "calendar",
id: [
"bob",
"8b2c3f00-f312-4524-847a-25c79e1a22d4",
"9d705e8c-4e49-4648-b4a9-4ad82ebba635"
],
permissions: {
write: false
}
}
Примечание: поля table и database будут автоматически заполнены при вставке в permissions, в зависимости от количества элементов в списке id.
В большинстве случаев проще управлять таблицей permissions с помощью команды grant.
Другие таблицы
current_issues
Эта таблица показывает проблемы, которые были обнаружены в кластере RethinkDB. Подробнее см. документацию Системной таблицы текущих проблем.
jobs
Таблица jobs предоставляет информацию о задачах, выполняемых в кластере RethinkDB, включая запросы, уплотнение дисков и создание индексов, а также позволяет убивать задачи запросов, удаляя их из таблицы. Подробнее см. документацию Системной таблицы задач.
stats
Таблица stats предоставляет статистику о пропускной способности сервера при чтении/записи, подключении клиентов и использовании памяти. Подробнее см. документацию Системной таблицы статистики.
logs
Эта таблица хранит файлы журналов кластера. В таблицу добавляется одна строка для каждого сообщения журнала, сгенерированного каждым сервером, подключенным к кластеру. Максимальное количество записей для каждого сервера составляет 1000.
{
id: ["2015-01-09T02:11:55.190829899", "5a59c88f-8f66-4703-bf74-bf4cd7205db3"]
level: "notice",
message: "Running on Linux 3.13.0-24-generic x86_64",
server: "companion_cube_3yz",
timestamp: <ReQL time obj>,
uptime: 0.389226
}
-
id: массив из двух элементов, состоящий из метки времени записи в журнал (в UTC) и UUID сервера, генерирующего сообщение. -
level: строка, указывающая уровень серьезности сообщения журнала. Одно из значенийdebug,info,notice,warn, илиerror. -
message: содержание сообщения журнала. -
server: UUID или имя генерирующего сервера (в зависимости от значенияidentifier_format). -
timestamp: время публикации сообщения журнала. -
uptime: количество секунд, в течение которых сервер работал в момент генерации сообщения журнала.
Таблица logs поддерживает changefeeds. Только сообщения, записываемые в таблицу журналов, будут генерировать события changefeed.
- Таблица хранит не более 1000 сообщений на сервер. Changefeed не будет доставлять события для записей в журнале при их удалении.
- При подключении или отключении сервера его записи в журнал будут добавлены в или удалены из таблицы
logs. Действие подключения или отключения не будет генерировать события changefeed для этих записей в журнал.
© RethinkDB contributors
Licensed under the Creative Commons Attribution-ShareAlike 3.0 Unported License.
https://rethinkdb.com/docs/system-tables/