Поделиться через


Пример разрешения конфликта слияния, основанного на типе подписки и присвоенных приоритетах

Чтобы понять, как разрешаются конфликты на основе присвоенных значений приоритетов и является ли определенная подписка серверной или клиентской, рассмотрим следующий пример, в котором описана последовательность обновлений строки посредством нескольких синхронизаций слияния.

Ниже приводятся начальные значения приоритетов для четырех веб-узлов в базовой топологии репликации слиянием (один издатель, два подписчика с серверными подписками и один подписчик с клиентской подпиской).

Узел

Тип

Значение приоритета

A

Publisher

100.00

B

Server Subscription

75.00 (присвоенный)

C

Server Subscription

50.00 (присвоенный)

D

Client Subscription

0.00 (по умолчанию)

Этап 1. Начальные значения

Первоначально веб-узел A (издатель) создает первую версию строки, содержащей значение «Небраска», которая затем реплицируется на веб-узлы B, C и D во время следующей синхронизации слияния. Ниже представлены значения строки после синхронизации.

Узел

Значение приоритета

Значение строки

A (издатель)

100.00

Небраска

B (серверная подписка)

75.00

Небраска

C (серверная подписка)

50.00

Небраска

D (клиентская подписка)

0.00

Небраска

Этап 2. Строка обновляется как издателем, так и подписчиком с серверной подпиской

Веб-узел A обновляет значение строки на «Техас», а веб-узел B обновляет значение строки на «Нью-Джерси». При следующей синхронизации слияния возникает конфликт между веб-узлами A и B. Веб-узел A побеждает в конфликте. Значение победителя конфликта из веб-узла A передается на веб-узлы B, C и D.

Узел

Значение приоритета

Значение строки

A (издатель)

100.00

Техас

B (серверная подписка)

75.00

Техас

C (серверная подписка)

50.00

Техас

D (клиентская подписка)

0.00

Техас

Этап 3. Внесение нескольких изменений в одну и ту же строку

Предположим, веб-узел C обновляет строку (меняет ее значение на «Северная Каролина») и синхронизируется с издателем. Это не является конфликтом, поскольку веб-узел C уже выполнил успешное слияние с последним обновлением с веб-узла A (слияние со значением «Техас» выполнено успешно). Затем предположим, что строку обновляет веб-узел B (меняет значение на «Айдахо»).

Узел

Значение приоритета

Значение строки

A (издатель)

100.00

Северная Каролина

B (серверная подписка)

75.00

Айдахо

C (серверная подписка)

50.00

Северная Каролина

D (клиентская подписка)

0.00

Техас

При синхронизации узла B с издателем возникает конфликт обновления. Поскольку и веб-узел B, и веб-узел C являются серверными подписками, а приоритет B выше приоритета C, в конфликте побеждает веб-узел B. После выполнения слияния на остальных двух веб-узлах значение B передается другим подписчикам.

Узел

Значение приоритета

Значение строки

A (издатель)

100.00

Айдахо

B (серверная подписка)

75.00

Айдахо

C (серверная подписка)

50.00

Айдахо

D (клиентская подписка)

0.00

Айдахо

Этап 4. Обновление строки как подписчиками с серверными подписками, так и с клиентскими

Предположим, веб-узел D обновляет строку (меняет ее значение на «Нью-Мексико») и синхронизируется с издателем. Затем предположим, что строку обновляет веб-узел B (меняет значение на «Калифорния»).

Узел

Значение приоритета

Значение строки

A (издатель)

100.00

Нью-Мексико

B (серверная подписка)

75.00

Калифорния

C (серверная подписка)

50.00

Айдахо

D (клиентская подписка)

0.00

Нью-Мексико

При синхронизации узла B с издателем возникает конфликт обновления. В отличие от предыдущего примера, поскольку веб-узел D имеет клиентскую подписку, предполагается, что при синхронизации приоритет имеет значение издателя (веб-узел A). Так как приоритет веб-узла A выше, чем B, веб-узел B проигрывает конфликт. Выигрывает значение, первоначально введенное на веб-узле D. (Если бы подписчик B синхронизировался с веб-узлом A до того, как это сделал подписчик D, конфликт выиграл бы веб-узел B). Веб-узел D, выигравший конфликт, полагается на то, что издатель не выполнил изменение и не получил другое изменение с момента последней синхронизации обновленной версии строки. Если первым синхронизируется подписчик с серверной подпиской или любой другой подписчик с клиентской подпиской, соблюдается правило высшего приоритета или правило «выигрывает первый, попавший на издатель».

Ниже представлены окончательные значения после синхронизации всех веб-узлов.

Узел

Значение приоритета

Значение строки

A (издатель)

100.00

Нью-Мексико

B (серверная подписка)

75.00

Нью-Мексико

C (Серверная подписка)

50.00

Нью-Мексико

D (клиентская подписка)

0.00

Нью-Мексико

Порядок синхронизации и значение приоритета определяют исход конфликта, если в топологии сети смешаны серверные и клиентские подписки. Этот последний набор обновлений показывает, почему нужно соблюдать осторожность. Хотя этот подписчик имел самый низкий приоритет из всех трех подписчиков, он победил в конфликте, потому что первым синхронизировался с издателем (соответственно, предполагается, что значение приоритета издателя равно 100.00). Если бы значение «Нью-Мексико» было введено на веб-узле C (серверная подписка с приоритетом, равным 50.00), а не на веб-узле D, конфликт выиграл бы веб-узел B (серверная подписка с приоритетом, равным 75.00), а результатом бы явилось значение «Калифорния».