Глава 63. Пользовательские менеджеры ресурсов WAL#

Глава 63. Пользовательские менеджеры ресурсов WAL

Глава 63. Пользовательские менеджеры ресурсов WAL

Эта глава объясняет интерфейс между основной системой Tantor SE-1C и настраиваемыми менеджерами ресурсов WAL, которые позволяют расширениям интегрироваться непосредственно с WAL.

Расширение, особенно Метод доступа к таблице или Метод доступа к индексу, может потребоваться использовать WAL для восстановления, репликации и/или Логического декодирования. Пользовательские менеджеры ресурсов являются более гибкой альтернативой Общему WAL (который не поддерживает логическое декодирование), но более сложны для реализации расширением.

Для создания нового пользовательского менеджера ресурсов WAL сначала определите структуру RmgrData с реализацией методов менеджера ресурсов. См. src/backend/access/transam/README и src/include/access/xlog_internal.h в исходном коде Tantor SE-1C.

/*
 * Method table for resource managers.
 *
 * This struct must be kept in sync with the PG_RMGR definition in
 * rmgr.c.
 *
 * rm_identify must return a name for the record based on xl_info (without
 * reference to the rmid). For example, XLOG_BTREE_VACUUM would be named
 * "VACUUM". rm_desc can then be called to obtain additional detail for the
 * record, if available (e.g. the last block).
 *
 * rm_mask takes as input a page modified by the resource manager and masks
 * out bits that shouldn't be flagged by wal_consistency_checking.
 *
 * RmgrTable[] is indexed by RmgrId values (see rmgrlist.h). If rm_name is
 * NULL, the corresponding RmgrTable entry is considered invalid.
 */
typedef struct RmgrData
{
    const char *rm_name;
    void        (*rm_redo) (XLogReaderState *record);
    void        (*rm_desc) (StringInfo buf, XLogReaderState *record);
    const char *(*rm_identify) (uint8 info);
    void        (*rm_startup) (void);
    void        (*rm_cleanup) (void);
    void        (*rm_mask) (char *pagedata, BlockNumber blkno);
    void        (*rm_decode) (struct LogicalDecodingContext *ctx,
                              struct XLogRecordBuffer *buf);
} RmgrData;

Затем зарегистрируйте свой новый менеджер ресурсов.

/*
 * Register a new custom WAL resource manager.
 *
 * Resource manager IDs must be globally unique across all extensions. Refer
 * to https://wiki.postgresql.org/wiki/CustomWALResourceManagers to reserve a
 * unique RmgrId for your extension, to avoid conflicts with other extension
 * developers. During development, use RM_EXPERIMENTAL_ID to avoid needlessly
 * reserving a new ID.
 */
extern void RegisterCustomRmgr(RmgrId rmid, RmgrData *rmgr);

При разработке нового расширения используйте RM_EXPERIMENTAL_ID для rmid. Когда вы будете готовы выпустить расширение для пользователей, зарезервируйте новый идентификатор ресурсного менеджера на странице Custom WAL Resource Manager.

Разместите модуль расширения, реализующий пользовательский менеджер ресурсов, в shared_preload_libraries, чтобы он загружался рано во время запуска Tantor SE-1C.

Примечание

Расширение должно оставаться в shared_preload_libraries до тех пор, пока в системе могут существовать пользовательские записи WAL. В противном случае Tantor SE-1C не сможет применять или декодировать пользовательские записи WAL, что может препятствовать запуску сервера.