Системные таблицы
Начиная с версии 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— это только для чтения таблица, которая хранит журналы сообщений со всех серверов в кластере.
Ограничения
- Хотя системные таблицы поддерживают потоки изменений, они не поддерживают все цепочки, которые есть у реальных таблиц. Например, агрегация (
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: первичный сервер ожидает, пока кворум реплик таблицы станет доступным, прежде чем начать принимать записи.
-
-
Статус_сервера
Эта таблица возвращает информацию о состоянии и доступности серверов в кластере 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.
разрешения
Документы в таблице разрешений имеют от двух до четырёх пар «ключ-значение».
-
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.
Другие таблицы
текущие_проблемы
Эта таблица отображает проблемы, обнаруженные в кластере 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 поддерживает changefeed. Только сообщения, записываемые в таблицу журналов, будут генерировать события changefeed.
- Таблица хранит максимум 1000 сообщений на сервер. Changefeed не будет доставлять события для записей журналов, когда они удаляются.
- При подключении или отключении сервера его записи журнала будут добавлены или удалены из таблицы
logs. Действие подключения или отключения не будет генерировать события changefeed для этих записей журнала.
© RethinkDB contributors
Licensed under the Creative Commons Attribution-ShareAlike 3.0 Unported License.
https://rethinkdb.com/docs/system-tables/