Перейти к содержанию

Получение данных о кластере

В данном разделе приведена информация о средствах диагностики запущенного кластера Picodata.

Сбор служебных данных о состоянии кластера возможен после подключения к кластеру в консоли. После этого доступны команды, показывающие состояние raft-группы, отдельных инстансов, собранных из них репликасетов и т.д.

См. также:

Получение лидера raft-группы

Узнать лидера raft-группы, а также ID и статус текущего инстанса:

pico.raft_status();

Пример вывода:

---
- term: 2
  leader_id: 1
  raft_state: Leader
  id: 1
...

Получение состава raft-группы

Просмотр состава raft-группы и данных инстансов:

box.space._pico_instance:fselect();

Пример вывода:

---
- -+-------------+--------------------------------------+-------+---------------+--------------------------------------+-------------+------------+--------------+
  - ​|instance_name|            instance_uuid             |raft_id|replicaset_name|           replicaset_uuid            |current_state|target_state|failure_domain|
  -+-------------+--------------------------------------+-------+---------------+--------------------------------------+-------------+--------------+--------------+
  - ​|   "i1"    |"68d4a766-4144-3248-aeb4-e212356716e4"|   1   |     "r1"      |"e0df68c5-e7f9-395f-86b3-30ad9e1b7b07"|["Online",1] |["Online",1]|      {}      |
  - ​|   "i2"    |"24c4ac5f-4981-3441-879c-aee1edb608a6"|   2   |     "r1"      |"e0df68c5-e7f9-395f-86b3-30ad9e1b7b07"|["Online",1] |["Online",1]|      {}      |
  - ​|   "i3"    |"5d7a7353-3e82-30fd-af0d-261436544389"|   3   |     "r2"      |"eff4449e-feb2-3d73-87bc-75807cb23191"|["Online",1] |["Online",1]|      {}      |
  - ​|   "i4"    |"826cbe5e-6979-3191-9e22-e39deef142f0"|   4   |     "r2"      |"eff4449e-feb2-3d73-87bc-75807cb23191"|["Online",1] |["Online",1]|      {}      |
  -+-------------+--------------------------------------+-------+---------------+--------------------------------------+-------------+------------+--------------+
...

Можно отдельно посмотреть список репликасетов, их UUID и вес:

box.space._pico_replicaset:fselect();

Пример вывода:

---
- — ​+---------------+--------------------------------------+-----------+------+
  - ​|replicaset_name|           replicaset_uuid            |master_name|weight|
  -+---------------+--------------------------------------+-----------+------+
  - ​|     "r1"      |"e0df68c5-e7f9-395f-86b3-30ad9e1b7b07"|   "i1"    |  1   |
  - ​|     "r2"      |"eff4449e-feb2-3d73-87bc-75807cb23191"|   "i3"    |  1   |
  -+---------------+--------------------------------------+-----------+------+
...

Таблицы выше позволяют узнать текущий и целевой уровень (state) каждого инстанса, а также вес (weight) репликасета. Уровни отражают конфигурацию остальных инстансов относительно текущего, а вес репликасета — его наполненность инстансами согласно фактору репликации (см. подробнее). Вес репликасета определяет его приоритет при распределении бакетов с данными.

Получение версии схемы данных

Узнать текущую версию схему данных можно с помощью команды:

box.space._pico_property:get("current_schema_version");
---
- ['current_schema_version', 1]
...

Каждое изменение схемы данных в кластере приводит к увеличению этого номера.

Просмотр отладочного журнала

Способ просмотра отладочного журнала инстансов зависит от того, как был запущен кластер Picodata.

Если при запуске инстанса командой picodata run в консоли не был явно указан способ вывода отладочного журнала, то он выводится в ту же консоль.

Если кластер развернут при помощи файла конфигурации, то в нем вывод отладочного журнала может быть настроен в файл или в службу syslog. Этим поведением управляет параметр конфигурации instance.log.destination.

При развёртывании кластера через Ansible отладочный журнал по умолчанию выводится в службу syslog.

Для доступа к отладочному журналу:

  • при выводе в файл используйте команду tail -f или любой другой инструмент просмотра файлов
  • при выводе журнала в syslog используйте команду journalctl

При использовании службы syslog для просмотра журнала конкретного инстанса вам понадобится знать имя его сервиса. При развёртывании через Ansible оно по умолчанию формируется как <cluster_name>@<instance_name>.service. Например, для кластера с именем test и инстанса default-1000 команда для просмотра отладочного журнала будет такой:

journalctl -u test@default-1000.service

Пример вывода:

systemd[1]: Starting Picodata cluster test@default-1000...
systemd[1]: Started Picodata cluster test@default-1000.
picodata[4731]: 'cluster.name': "test"
picodata[4731]: 'cluster.tier': {"default": {"replication_factor": 3, "bucket_count": 3000, "can_vote": true}}
picodata[4731]: 'cluster.default_replication_factor': 1
picodata[4731]: 'instance.instance_dir': "/var/lib/picodata/test/default-1000"
picodata[4731]: 'instance.name': "default-1000"
picodata[4731]: 'instance.iproto_listen': "0.0.0.0:13301"
picodata[4731]: 'instance.http_listen': "0.0.0.0:18001"
picodata[4731]: 'instance.admin_socket': "/var/run/picodata/test/default-1000.sock"
picodata[4731]: [supervisor:4731] running StartDiscover
picodata[4733]: entering discovery phase
...

Журнал raft-лидера

Отладочный журнал raft-лидера представляет особый интерес при диагностике неполадок в кластере т.к. содержит важную информацию об изменениях, происходящих с конфигурацией и топологией. Raft-лидером в каждый момент времени является только один инстанс в кластере и именно он управляет остальными. Для доступа к отладочному журналу raft-лидера выполните следующие шаги.

Вычислите raft-лидера в кластере. Для этого подключитесь к административной консоли любого инстанса:

picodata admin ./admin.sock

Переключите язык ввода на Lua и узнайте идентификатор текущего raft-лидера:

\lua;
pico.raft_status();

Пример вывода:

---
- main_loop_status: idle
  leader_id: 2
  id: 1
  term: 30
  raft_state: Follower
...

C помощью полученного leader_id выясните адрес сервера, на котором запущен этот инстанс:

\sql;
SELECT "name", "_pico_instance"."raft_id", "_pico_peer_address"."address"
FROM "_pico_instance" JOIN "_pico_peer_address"
ON "_pico_peer_address"."raft_id"="_pico_instance"."raft_id"
WHERE "_pico_instance"."raft_id" = 2;

Пример вывода:

+-------------------------+---------+--------------------+
| name                    | raft_id | address            |
+========================================================+
| "default-2000"          | 2       | "192.168.0.2:3301" |
+-------------------------+---------+--------------------+
(1 rows)

Дальнейшие шаги зависят от варианта запуска. При развёртывании кластера через Ansible потребуется подключиться к серверу по SSH и открыть диагностический журнал через journalctl, см. Просмотр отладочного журнала.

Проверка состояния инстанса по HTTP API

Инстанс Picodata отдаёт сведения о своём состоянии и работоспособности по HTTP API на эндпоинт /api/v1/health/status. HTTP-код 200 означает положительный результат, 503 — ошибку.

Для формирования корректного URL используйте адрес, указанный для параметра HTTP_LISTEN, например:

http://127.0.0.1:8081/api/v1/health/status

Эндпоинт /api/v1/health/status требует авторизации на инстансе Picodata. Для получения данных авторизации отправьте в терминале запрос следующего вида, указав данные ранее созданного пользователя:

curl -X POST http://127.0.0.1:8081/api/v1/session   -H "Content-Type: application/json"   -d '{
    "username": "alice",
    "password": "T0psecret"
  }' | jq

Примечание

В этом и последующих примерах используется форматирование JSON-вывода при помощи консольной утилиты jq.

В ответ Picodata пришлёт два токена (auth и refresh). Пример:

{
  "auth": "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJhbGljZSIsImV4cCI6MTc3MzQ5NzQwNSwidHlwIjoiYXV0aCIsInJvbGVzIjpbImV4ZWN1dGUiLCJjcmVhdGUiLCJyZWFkIiwid3JpdGUiLCJsb2dpbiIsImFsdGVyIl19.-NXOef7e9ckRwGlJBuzOdXtRhI2nBhEZj5P1Wip7w30",
  "refresh": "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJhbGljZSIsImV4cCI6MTgwNDk0NzAwNSwidHlwIjoicmVmcmVzaCJ9.gEP-qlJjhlIhzg_05-8ntAaf9MeH4qiFw0ib_DiRM7U"
}

Токен auth действует в течение 24 часов. Теперь вы можете получить данные о состоянии инстанса, указав токен в заголовке Authorization: Bearer <token>:

curl -s "http://127.0.0.1:8081/api/v1/health/status"     -H "Authorization: Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJhbGljZSIsImV4cCI6MTc3MzQ5NzQwNSwidHlwIjoiYXV0aCIsInJvbGVzIjpbImV4ZWN1dGUiLCJjcmVhdGUiLCJyZWFkIiwid3JpdGUiLCJsb2dpbiIsImFsdGVyIl19.-NXOef7e9ckRwGlJBuzOdXtRhI2nBhEZj5P1Wip7w30" | jq
Пример вывода
{
  "status": "healthy",
  "timestamp": 1773411090,
  "uptimeSeconds": 14573,
  "name": "i1",
  "uuid": "2c4a425b-49c7-4e0f-86bd-1a479cd6ce4a",
  "version": "25.5.0-1848-g41efc83dc",
  "raftId": 1,
  "tier": "default",
  "replicaset": "default_1",
  "currentState": "Online",
  "targetState": "Online",
  "targetStateReason": "wakeup",
  "targetStateChangeTime": "2026-03-12 14:45:55.637123218 +00:00:00",
  "limboOwner": 0,
  "raft": {
    "state": "Follower",
    "term": 9,
    "leaderId": 3,
    "leaderName": "i3",
    "appliedIndex": 162,
    "commitedIndex": 162,
    "compactedIndex": 0,
    "persistedIndex": 162
  },
  "buckets": {
    "active": 8192,
    "pinned": 0,
    "sending": 0,
    "receiving": 0,
    "garbage": 0,
    "total": 16384
  },
  "cluster": {
    "uuid": "24502c90-de10-4172-9a4c-82b8856caaf1",
    "version": "25.5.0-1609-g92f7550fa"
  }
}

Токен refresh действует в течение 1 года. Он предназначен для того, чтобы обновить auth-токен без предоставления данных авторизации. Пример запроса на выдачу новых токенов с помощью refresh-токена:

curl -s "http://127.0.0.1:8081/api/v1/session"     -H "Authorization: Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJhbGljZSIsImV4cCI6MTgwNDk0NzAwNSwidHlwIjoicmVmcmVzaCJ9.gEP-qlJjhlIhzg_05-8ntAaf9MeH4qiFw0ib_DiRM7U" | jq

Метрики инстанса

Функциональность сбора метрик позволяет получать параметры работы СУБД из инстанса Picodata и предоставлять доступ к ним для внешних систем в формате Prometheus.

Включение сбора метрик

Модуль сбора метрик автоматически включается при использовании встроенного HTTP-сервера в Picodata. Для этого нужно при запуске инстанса использовать параметр --http-listen и задать адрес веб-сервера. Например:

picodata run --http-listen '127.0.0.1:8081'

См. также:

Метрики в консоли

Метрики инстанса Picodata можно получить в консоли, используя curl:

curl --location 'http://127.0.0.1:8081/metrics'

См. также: