Настройка репликации #14
Notifications
Due Date
No due date set.
Blocks
#10 Расширение, оптимизация и миграции Mnesia
EventHub/EventHubBack
Reference: EventHub/EventHubBack#14
Reference in New Issue
Block a user
Delete Branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Этап 2. Настройка репликации (пункт 3 задачи)
Цель: обеспечить полную репликацию горячих таблиц на все узлы кластера для отказоустойчивости и балансировки чтения.
Шаги:
infra_mnesia:start/0обрабатывать параметрextra_db_nodesиз конфигурации (например, системная переменнаяMNESIA_EXTRA_DB_NODES).mnesia:change_config(extra_db_nodes, Nodes)перед созданием таблиц.mnesia:add_table_replica(Table, node(), disc_copies).mnesia:change_table_copy_type(schema, node(), disc_copies)или черезmnesia:add_table_copyдля каждой таблицы.disc_only_copiesна других узлах, могут не реплицироваться; их реплицировать не нужно.Результат: горячие таблицы реплицированы, кластер устойчив к выходу из строя отдельных узлов.
План выполнения задачи #14 — Настройка репликации Mnesia
Текущая ситуация
cluster_discovery.erlреализует динамическое обнаружение узлов через DNS-запрос (eventhub-node) и устанавливает Erlang-соединение между узлами (net_kernel:connect_node).infra_mnesia.erlсодержитensure_cluster_join/0, которая добавляет узлы в кластер Mnesia черезextra_db_nodesи копирует схему, но не создаёт реплики таблиц с данными.Цель
Обеспечить автоматическую полную репликацию всех горячих таблиц (
user,event,booking,calendarи др.) на каждый новый узел, присоединяющийся к кластеру, а также на существующие узлы при перезапуске.Шаг 1. Доработка
cluster_discovery.erlФайл:
src/infra/cluster_discovery.erlnet_kernel:connect_node(Node)добавить вызов функции, которая выполняет репликацию таблиц Mnesia.replicate_tables/0(илиreplicate_to_node/1), которая:schema) черезmnesia:system_info(tables).disc_copies), вызываетmnesia:add_table_copy(Table, node(), disc_copies).swarmиremote(eventhub_app.erl) вызывать новую функциюcluster_discovery:discover_and_replicate/0, которая объединяет обнаружение и репликацию.Примерный код:
Шаг 2. Доработка
ensure_cluster_join/0вinfra_mnesia.erlЦель
При запуске узла, которому в конфигурации заданы узлы кластера через
extra_db_nodes, автоматически создавать локальные дисковые копии всех таблиц, чтобы новый узел становился полноценной репликой данных, а не только подключался к схеме.Текущее состояние
Функция
ensure_cluster_join/0вsrc/infra/infra_mnesia.erlвызываетmnesia:change_config(extra_db_nodes, Nodes)и, при необходимости, добавляет копию схемы (mnesia:add_table_copy(schema, node(), disc_copies)). Однако реплики остальных таблиц не создаются, поэтому данные на новом узле остаются недоступными до первого обращения (и то не полностью).Необходимые изменения
schema).disc_copies).mnesia:add_table_copy(Tab, node(), disc_copies).Пример реализации
Интеграция
Этот код автоматически выполняется при старте приложения — он вызывается в
infra_mnesia:init_tables/0перед созданием таблиц и индексов.Решение корректно работает как для нового узла, впервые присоединяющегося к кластеру, так и при перезапуске существующего узла: повторные вызовы
mnesia:add_table_copyдля уже существующих реплик игнорируются, не вызывая ошибок.Проверка
extra_db_nodes(например, через переменную окружения или файл конфигурации).Ожидается, что список узлов, хранящих дисковую копию таблицы
user, будет содержать оба узла.Это означает, что после успешной репликации функция
mnesia:table_info(user, disc_copies)на каждом узле должна возвращать список, в котором присутствуют имена обоих узлов, например:Если список содержит только текущий узел — репликация не была выполнена, и данные не будут доступны на другом узле при его отключении.
Проверку необходимо выполнить для всех критически важных таблиц, перечисленных в задаче #14.