Уведомления

Группа в Telegram: @pythonsu

#1 Окт. 18, 2012 03:09:01

@cckyi_boxxx
От:
Зарегистрирован: 2012-01-13
Сообщения: 181
Репутация: +  14  -
Профиль   Отправить e-mail  

ищу совета или готовое решение

вобщем цель такова :
имею 10 vps с mysql на борту , юзер коннектиться к какому-то одному из серверов и требуеться что-бы изменения которые он произвел в БД моментально копировались на остальные бд , при этом что-бы не возникало косяков заключающихся в том что 2 юзера на разных серверах изменили одну и ту-же строку в одной и той-же таблице с разницей во времени скажем 0,2 секунды и при этом данные в этих 2-х бд оказались конфликтующими

была мысль перед тем как заносить данные во все бд лочить запросы от остальных юзеров к этой таблице, но тогда я могу пострадать от DDOS-a так как при этом подходе независимо от того сколько у меня серверов достаточно будет положить один



Офлайн

#2 Окт. 18, 2012 06:30:46

PooH
От:
Зарегистрирован: 2006-12-05
Сообщения: 1948
Репутация: +  72  -
Профиль   Отправить e-mail  

ищу совета или готовое решение

Репликация мастер-мастер в реальном времени, на десять инстансов. Нереально. Лучше всего попробовать переформулировать задачу, возможно разнести разные части таблиц по разным серверам.



Вот здесь один из первых отарков съел лаборанта. Это был такой умный отарк, что понимал даже теорию относительности. Он разговаривал с лаборантом, а потом бросился на него и загрыз…

Офлайн

#3 Окт. 18, 2012 07:43:08

@cckyi_boxxx
От:
Зарегистрирован: 2012-01-13
Сообщения: 181
Репутация: +  14  -
Профиль   Отправить e-mail  

ищу совета или готовое решение

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

такое реально реализовать при условии что количество юзеров - 20 000 в сутки , из них доступ к критичной таблице будут иметь только около 2000 - 4000 , при этом селект запросы каждым будут совершаться раз в 10 минут , а количество alter составит максимум 100 за сутки естественно никакой периодичности

если сделать так что-бы возможный ддос не мог затронуть критичную таблицу то тогда реализация вышеописанного реальна ?


######

или лучше сделать на 11-м серве бд содержащую только критичную таблицу и остальные 10 будут делать запросы к ней , а синхронизацию таблиц на 10 серваках производить раз в 1-2 часа

ps: в критичной таблице всего 2 колонки , обе bigint unsigned , одна из них (id) - primary key



Отредактировано @cckyi_boxxx (Окт. 18, 2012 07:44:59)

Офлайн

#4 Окт. 19, 2012 08:20:17

o7412369815963
От:
Зарегистрирован: 2009-06-17
Сообщения: 1986
Репутация: +  32  -
Профиль   Отправить e-mail  

ищу совета или готовое решение

> косяков заключающихся в том что 2 юзера на разных серверах изменили одну и ту-же строку в одной и той-же таблице

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

Офлайн

#5 Окт. 19, 2012 17:29:24

Lexander
От:
Зарегистрирован: 2008-09-19
Сообщения: 1139
Репутация: +  33  -
Профиль   Отправить e-mail  

ищу совета или готовое решение

Гарантированно - только вариант с 11 сервером.

Если будут работать 2 пользователя, то последний либо перепишет данные поверх изменений первого, либо получит ошибку таймаута захвата строки таблицы. Зависит от реализации клиента.

Если серверов несколько, то из-за задержек сети и дисковой подсистемы вы не сможете гарантировать эксклюзивный доступ. Разрешение коллизий в данном случае потребует активных действий пользователя либо более сложного алгоритма.

Аналогия: subversion - первый случай, mercurial - второй.



Офлайн

#6 Окт. 19, 2012 17:33:34

Lexander
От:
Зарегистрирован: 2008-09-19
Сообщения: 1139
Репутация: +  33  -
Профиль   Отправить e-mail  

ищу совета или готовое решение

Есть другой вариант, но он потребует более серьезных изменений в архитектуре.
Сделать разделение (Partitioning) и разнести по серверам критичную таблицу, чтобы защититься от ДДОС.
Каждая запись будет находится только на 1 сервере. Разрешение конфликтов - простое.
В этом случае вы экономите 1 сервер, но требуется настройка Partitioning.



Офлайн

#7 Окт. 19, 2012 18:47:34

@cckyi_boxxx
От:
Зарегистрирован: 2012-01-13
Сообщения: 181
Репутация: +  14  -
Профиль   Отправить e-mail  

ищу совета или готовое решение

архитектура еще даже не начиналась кодиться пока делаеться только гуй , думаю за 2-е суток закончу , потом свой протокол передачи данных мутить буду и только после этого архитектуру бд поэтому интересно где можно увидеть пример (неважно на каком яп) или почитать хороших манов по Partitioning.



Офлайн

#8 Окт. 19, 2012 22:23:53

Lexander
От:
Зарегистрирован: 2008-09-19
Сообщения: 1139
Репутация: +  33  -
Профиль   Отправить e-mail  

ищу совета или готовое решение

В документации по MySQL есть раздел.
Фактически, вам нужно выбрать способ разделения и указать условия.



Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version