1 Как работает репликация
replica - "живая" и постоянно обновляемая копия БД.K-safety обеспечивает резервные копии партиций, что защищает кластер от сбоев отдельных его узлов.
replica может использоваться:
- для разгрузки (Offloading) read-only объемов работ, подлежащих выполнению (workloads), таких как отчётность (reporting);
- как оперативный резерв (hot standby) в случае аварии master-а.
- запрашивает у master-а завершенные транзакции и применяет их на replica;
- отслеживает процесс репликации и сообщает о возможных ошибках.
DR agent лучше разместить на том же сервере что и replica, это снизит тормоза. Но лучше всего разместить DR agent на отдельном сервере, но в непосредственной близости от replica.
replica создается путем запуска БД действием create и флагом --replica.
Алгоритм активации (promoting) replica в качестве master:
- убедиться в том что master не доступен (мы же не хотим две живые копии одной БД), а если master доступен, но не работает должным образом, то нужно его выключить (shut it down);
- остановить DR agent, если он еще не остановлен;
- активировать режим master на replica командой voltadmin promote
- сделать redirect клиентских приложений на новый master.
2 Репликация на практике
Допустим master-сервер это будет serverA, а replica-сервер это будет serverB.2.1 Запуск репликации
Шаг 1. Запустить master:$ voltdb create catalog.jar \
-d deployment.xml \
-H serverA \
-l license.xml \
--externalinterface=10.11.169.10 \
--internalinterface=10.12.171.14
Вместо create может использоваться recover. Обязательно нужно указывать какие интерфейсы сервер использует для внутренних и внешних коммуникаций.
Шаг 2. Создание replica БД:
$ voltdb create --replica catalog.jar \
-d deployment.xml \
-H serverB \
-l license.xml
На replica должны быть:
- та же самая версия VoltDB;
- тот же самый каталог;
- то же самое количество серверов;
- то же самое значение sites per host;
- то же самое значение K-safety;
Шаг 3. Запуск DR-агента:
$ dragent master serverA:6666 replica serverB:23232
2.2 Остановка репликации
Чтобы остановить репликацию достаточно остановить процесс DR agent или остановить БД replica.Более аккуратный способ:
- поставить master на паузу (voltadmin pause), БД перейдет в admin mode и остановит клиентскую деятельность;
- дождаться (см. мониторинг) когда все транзакции пройдут через DR agent и остановить его;
- остановить replica БД (voltadmin shutdown);
- снять master с паузы (voltadmin resume).
2.3 Активация master на replica
- остановить DR agent;
- выполнить на replica БД команду: $ voltadmin promote --host=serverB
2.4 Мониторинг репликации
При репликации в master БД в памяти создаются очереди данных, а если не помещаются то выгружаются по пути voltdbroot/dr_overflowЕсть два способа мониторинга:
- сообщения в консоли;
- выполнить на master-e хранимую процедуру @Statistics, которая выдаст информацию о текущей очереди репликации (The "DR" keyword returns information about the amount of replication data currently in memory (waiting to be sent to the agent). One VoltTable reports the amount of memory used for queuing transactions and another reports on the current status of any snapshots (if any) waiting to be sent.).
$ export LOG4J_CONFIG_PATH="mylogconfig.xml"
$ dragent master serverA replica serverB
2.5 Перезапуск репликации в случае ошибок
- * остановить DR agent;
- * shutdown и restart для replica БД;
- если master не запущен то сделать для него restart;
- * restart для DR agent-a.
Перезапуск надо делать в следующих случаях:
- остановка replica БД;
- остановка master БД;
- остановка DR agent;
- If communication between the master and the DR agent is delayed to the point where the master cluster's replication queues overflow.
- If any transaction replayed on the replica fails. Note that only successfully completed transactions are sent to the replica. So if a transaction fails, the replica is no longer in sync with the master.
- If any transaction replayed on the replica returns a different result than received on the master. The results are hashed and compared. Just as all replicated transactions must succeed, they must produce the same results or the two databases are out of sync.