tessob wrote: ↑29 Apr 2018 09:48
Vladimir Kr. wrote: ↑28 Apr 2018 20:36
tessob wrote: ↑28 Apr 2018 16:09
Короче, правильно ли я понимаю, что:
1) В первом случае, если пользователи создадут на двух мастерах записи с одинаковыми ключами (инкремент) консистентность идет лесом?
нет.
если в общем случае, то консистентность решается правилом устранения конфликтов. если с шардингом, то и конфликтов не будет.
Владимир, простите, но мне лень аргументированно приводить примеры по всем вашим примерам. Давайте ограничимся самым первым? Представьте, что что моя база - это справочник сотрудников в некой HCM/HR системе. Предположим, что есть только два мастер-мастер сервака. Пускай на обоих серверах заводится по новому сотруднику и они инкрементом получают идентичные ИД. Но в одной из баз помимо заведения сотрудника ему начисляют бонус за релокацию, и платежные данные с ИД сотрудника передаются в третью систему для выполнения оплаты. Через некоторое время, после получения подтверждения оплаты банком, третья система вернет информацию о факте оплаты обратно, разумеется, с ИД.
Каким правилом вы планируете это разруливать?
Извините, но вы смешали все в кучу: создание записи, ее изменение, связь с 3rd party на грязных данных, отсустствие синхронизации за вменяемое время, да еще и отсутствие шардинга.
Разбейте свой пример на этапы и примените правило "первый" или "последний" на этапе после создания записей, т.е синхронизация должна удалить или изменить ИД на одной из записей, сразу после создания. Вот наличие правил и неявное изменение, и есть основная проблема синхронизации мастер-мастер на commited данных. А какое это будет правило, это вопрос, который был в самом начале трейда - какое правило выберете, такое и будет.
Проще всего проблему создания разрулить шардингом, чтобы ИД выдавались уникальные на разных серверах. Это будет приблизительно, как мастер-слейв только на заранее заданных фрагментах данных.
Использование шардинга, в вашем примере: ИД код сотрудника должен включать код сервера / подразделения.
Но правильнее всего, это использовать 2й способ - XA transaction (двухфазный коммит) или 3й способ.