Реплікація master-master не настільки гарна, як ви можете подумати, те ж саме стосується проксі-сервера і подібних «легких» рішень. Якщо ви зобов’язуєтесь зіштовхувати дані на окремих серверах досить швидко (швидше, ніж затримка між серверами, яка на виробничих серверах може скласти до повної секунди *
), вони приймуть дані. Якщо у вас є аукціонний сервер, ви просто продали одну і ту ж машину двічі . Хто її купив? Це залежить від того, яку БД Ви запитаєте!
Додаток повинен знати, що насправді є 2 бази даних, і він повинен знати обидві їхні IP-адреси. Якщо ви хочете "продати", вам слід подати
DB_number = `auction_number` % `number_of_databases`
( %
є для modulo
)
... і зафіксувати його в базі даних DB_number. Якщо ви отримаєте помилку підключення, можливо, зробіть це з іншим (але у випадку аукціонного сервера я б просто відобразив помилку).
Крім того, IP-адреси повинні бути wackamole -d між обома серверами. У сценарії стихійних ситуацій, коли один сервер баз даних виходить на пару годин у піковий час використання, ви побачите, що програма намагатиметься підключитися до відсутнього сервера та зависнути до TIMEOUT, скажімо, 3 s. Раптом половина ваших запитів запускається на 3 секунди довше (і вони в кінцевому підсумку переходять в одну і ту ж базу даних - що не примушує її працювати швидше, ніж до катастрофи). Це не робить вашого httpd щасливим, оскільки він, ймовірно, має обмежений пул з'єднань одночасних обробників запитів ...
*
затримка реплікації на виробничих серверах може бути до повної секунди - я перевірив це у віддаленій колокації та в нашому центрі обробки даних, і приблизно як 99% часу це 0, але іноді mysql показує 1s. У масовому трафіку у мене було багато зіткнень через те, що клієнтська програма зробила два запити, що призвело до двох запитів, вставлення та вибору. У деяких випадках рядок просто ще не було , тому ми використовували хеш userID і це вирішило проблему
Я сподіваюся, що ви дізнаєтесь з моїх помилок ;-)