2.10. Ведение журнала

Shardman — критически важная точка в пользовательской инфраструктуре, так как в ней хранятся все пользовательские данные. Это делает ведение журнала обязательным. Поэтому пользователь должен понимать, как работает ведение журнала в Shardman. Из-за сложности устройства Shardman поддерживаются журналы из нескольких источников: журналы демона shardmand, который управляет конфигурацией кластера, и журналы из экземпляров базы данных PostgreSQL.

2.10.1. Журналы PostgreSQL

Shardman использует стандартные параметры ведения журнала PostgreSQL, описанные здесь. Параметры ведения журнала должны быть внесены в файл sdmspec.json в раздел pgParameters, как показано в следующем примере:

                  {
                    "ShardSpec": {
                    "pgParameters": {
                        "log_line_prefix": "%m [%r][%p]",
                        "log_min_messages": "INFO",
                        "log_statement": "none",
                        "log_destination": "stderr",
                        "log_filename": "pg.log",
                        "logging_collector": "on",
                        "log_checkpoints": "false",
                        ...
                    },
                    ...
                    },
                    ...
                  }
                

По умолчанию журналы размещаются в каталоге вида /var/lib/pgpro/sdm-14/data/keeper-cluster0-clover-1-shrn1-0/postgres/log. В этом примере cluster0 — текущий кластер, clover-1-shrn1 — имя текущего сегмента, 0 — идентификатор интегрированного процесса keeper. Чтобы изменить каталог размещения журналов, задайте параметр log_directory.

2.10.2. Журналы shardmand

shardmand — это модуль systemd, его журналы записываются в journald. Ознакомиться с его работой можно, используя команду journalctl. Например, чтобы получить все журналы с 2023-05-09 10:00 для службы shardmand кластера cluster0, можно использовать следующую команду:

                 $ journalctl -u shardmand@cluster0.service
                

Для фильтра журналов по времени можно использовать параметры --since и --until, ограничивающие отображаемые записи после или до заданного времени соответственно. Значения времени могут быть представлены в различных форматах. Для абсолютных значений времени следует использовать YYYY-MM-DD HH:MM:SS. Например можно увидеть все записи с 10:15 10 января 2023 года, выполнив:

                     $ journalctl -u shardmand@cluster0.service --since "2023-01-10 17:15:00"
                 

Если компоненты вышеуказанного формата опущены, будут применены некоторые значения по умолчанию. Например, если дата не указана, предполагается текущая дата. Если компонент времени отсутствует, указывается «00:00:00» (полночь). Секунды также можно не указывать, чтобы по умолчанию подставлялось значение «00»:

                     $ journalctl -u shardmand@cluster0.service --since "2023-01-10" --until "2023-01-11 03:00"
                 

Чтобы задать уровень детализации журнала для всех служб Shardman, укажите SDM_LOG_LEVEL в файле конфигурации shardmand.

2.10.3. Сбор информации о сбоях обслуживающих процессов

Некоторые сбои вызваны отказами оборудования или проблемами самой СУБД. Чтобы понять причину сбоя, используйте crash_info. Для этого задайте параметр, следуя этим указаниям:

  • Создайте каталог на каждом узле кластера, доступный для пользователя Shardman операционной системы (обычно postgres). Записи об ошибках запишутся в этот каталог.

    install -d -o postgres -g postgres -m 700  /var/lib/postgresql/crashinfo
  • Задайте значение параметра crash_info_location.

    Примечание

    Это приведёт к перезапуску СУБД.

    shardmanctl --store-endpoints http://etcdserver:2379 set -y  crash_info_location=/var/lib/postgresql/crashinfo
  • Чтобы убедиться, что изменения вступили в силу, отправьте сигнал процессу СУБД, что приведёт к его отказу с созданием дампа памяти и перезапуску экземпляра.

    Примечание

    Делайте это исключительно в среде тестирования.

Подключитесь к СУБД и узнайте PID обслуживающего процесса текущего сеанса:

postgres=# select pg_backend_pid();
pg_backend_pid
----------------
    23770

Отправьте сигнал SIGSEGV процессу с данным PID:

kill -11 23770

Это приведёт к сбою этого процесса, а в каталог /var/lib/postgresql/crashinfo запишется файл, содержащий время, обратную трассировку и причину ошибки:

 # Signal
Program received signal: 11 (SIGSEGV)
Signal    UTC date time: 25.10.2024 08:37:02


# Program
                        pid: 23770
                        ppid: 17506
    program_invocation_name: postgres: postgres postgres 10.42.42.10(34202) idle
program_invocation_short_name: tgres 10.42.42.10(34202) idle
                    exe_path: /opt/pgpro/sdm-14/bin/postgres
                        exe: postgres

# Backtrace
1   postgres + 0x5b55c0              0x55c5ba8459b7  0x00007ffcbef19070  bt_crash_handler + 0x3f7
2   libc.so.6 + 0x4251f              0x7f01c2caa520  0x00007ffcbef19140  __sigaction + 0x50
unknown  ./signal/../sysdeps/unix/sysv/linux/x86_64/libc_sigaction.c:0
3   libc.so.6 + 0x125f80             0x7f01c2d8df9a  0x00007ffcbef195b8  epoll_wait + 0x1a
epoll_wait  ../sysdeps/unix/sysv/linux/epoll_wait.c:30
4   postgres + 0x433870              0x55c5ba6c39bb  0x00007ffcbef195c0  WaitEventSetWait + 0x14b
5   postgres + 0x320de0              0x55c5ba5b0e74  0x00007ffcbef19650  secure_read + 0x94
6   postgres + 0x327d20              0x55c5ba5b7dae  0x00007ffcbef196a0  pq_recvbuf + 0x8e
7   postgres + 0x328980              0x55c5ba5b8995  0x00007ffcbef196c0  pq_getbyte + 0x15
8   postgres + 0x457da0              0x55c5ba6e909c  0x00007ffcbef196d0  PostgresMain + 0x12fc
9   postgres + 0x3ce210              0x55c5ba65ef86  0x00007ffcbef19a60  ServerLoop + 0xd76
10  postgres + 0x3cf240              0x55c5ba65fe18  0x00007ffcbef1a040  PostmasterMain + 0xbd8
11  postgres + 0x14ecc0              0x55c5ba3df182  0x00007ffcbef1a0c0  main + 0x4c2
12  libc.so.6 + 0x29d10              0x7f01c2c91d90  0x00007ffcbef1a0f0  __libc_init_first + 0x90
__libc_start_call_main  ../sysdeps/nptl/libc_start_call_main.h:58
13  libc.so.6 + 0x29dc0              0x7f01c2c91e40  0x00007ffcbef1a190  __libc_start_main + 0x80
call_init  ../csu/libc-start.c:128
__libc_start_main_impl  ../csu/libc-start.c:379
14  postgres + 0x14f200              0x55c5ba3df225  0x00007ffcbef1a1e0  _start + 0x25