По вашему запросу ничего не найдено :(
Убедитесь, что запрос написан правильно, или посмотрите другие наши статьи:
img
Атака MITM обычно выполняется во внутренней корпоративной сети. Злоумышленник использует этот тип атаки с целью перехвата конфиденциальной информации, которая передается между устройствами. Как вы понимаете, «человек посередине» (Man-in-the-middle) — это просто указание на то, где находится злоумышленник. Он располагается между устройством (устройствами) жертвы и получателем. Машина злоумышленника используется для перехвата всех сообщений между жертвой получателем. Большинство пользователей не знают о незащищенных сетевых протоколах, которые используются для передачи их сообщений от источника к получателю. Эти незащищенные протоколы передают сообщения в виде обычного текста, позволяя злоумышленнику перехватить и просмотреть фактические данные. Чтобы лучше понять, как работает MITM-атака, давайте посмотрим на следующий рисунок: Как показано на предыдущем рисунке, если PC1 захочет отправить какие-либо данные через Интернет, они отправляются на шлюз по умолчанию, которым является R1. Кроме того, для всех коммуникаций, которые происходят в локальной сети, устройства пересылают сообщения, используя MAC-адрес назначения, найденный в кадре, а не IP-адрес назначения. IP-адрес назначения важен только тогда, когда сообщение должно быть переадресовано за пределы локальной сети, например, в другую подсеть или удаленную сеть. Следовательно, когда PC1 захочет отправить сообщение через Интернет, он пересылает сообщение на MAC-адрес назначения, известный как BBBB.BBBB.BBBB, который принадлежит R1. Когда R1 должен пересылать какие-либо сообщения (пакеты) на PC1, он будет использовать MAC-адрес назначения AAAA.AAAA.AAAA. Таким образом, изначально сообщения на машину злоумышленника не отправляются. Злоумышленник может использовать уязвимость в протоколе разрешения адресов (Address Resolution Protocol - ARP), чтобы гарантировать, что все сообщения, которыми обмениваются между PC1 и R1, отправляются через его машину, как показано на следующем рисунке: Протокол ARP работает между уровнем 2 (канальный уровень) и уровнем 3 (уровень Интернета) стека протоколов TCP/IP. Он предназначен для преобразования IP-адреса в MAC-адрес потому, что коммутаторы не могут считывать адресацию уровня 3, например IP-адресацию внутри пакета. Коммутаторы могут только читать MAC-адреса и пересылать кадры на основе MAC-адреса назначения, найденного в заголовке кадра уровня 2. По этой причине ARP необходим в любой сети. Когда устройство, такое как PC1, не знает MAC-адрес целевого хоста, такого как R1, оно будет отправлять ARP-запрос в сеть, спрашивая, у кого есть MAC-адрес для конкретного пункта назначения, как показано на следующем рисунке: Запрос ARP отправляется на все устройства. Только устройство, имеющее IP-адрес назначения, ответит ARP-ответом, содержащим его MAC-адрес, как показано на следующем рисунке: Затем MAC-адрес временно сохраняется в кэше ARP исходного устройства, PC1. Исходное устройство затем вставляет MAC-адрес назначения в заголовок кадра уровня 2 перед размещением сообщения в сети. Коммутатор, который получает сообщение от PC1, проверяет MAC-адрес назначения, найденный в заголовке уровня 2, и пересылает сообщение на хост назначения. Злоумышленник может обманом заставить PC1 поверить в то, что он — это R1, а также заставить R1 думать, что он — это PC1. Злоумышленник может притвориться PC1 для R1 и наоборот. С технической точки зрения злоумышленник выдает себя за другую машину в сети — это называется подменой MAC-адресов. Кроме того, злоумышленник отправит безвозмездное сообщение ARP, содержащее ложное сопоставление IP-адресов и MAC-адресов. Каждое сообщение создается специально для PC1 и R1. Безвозмездное сообщение ARP — это ответ, который не был инициирован запросом ARP. Другими словами, это когда одно устройство отправляет обновление ARP без запроса. Это позволяет злоумышленнику выполнять атаку с подменой ARP и отправлять ложные сообщения ARP устройствам, заставляя их вставлять неверные сопоставления IP-адресов в MAC-адреса в их кэш ARP. Это известная уязвимость, обнаруженная в ARP и TCP/IP. На следующем рисунке показано, как злоумышленник отправляет безвозмездное сообщения ARP на PC1 и R1: Это приведет к тому, что весь трафик между PC1 и R1 будет отправлен на атакующую машину, что приведет к атаке MITM. На следующем скриншоте показан пример инструмента тестирования на проникновение, известного как arpspoof, который используется для отправки бесплатных сообщений ARP на хост-устройства в сети для создания атак MITM: Как показано на предыдущем скриншоте, инструмент постоянно заполняет компьютер жертвы (10.10.10.11) и шлюз по умолчанию (10.10.10.1) ложными сведениями о сопоставлении IP-адресов с MAC-адресами. На следующем рисунке показан захват Wireshark, отображающий ложные сообщения ARP, отправляемые по сети: Обратите внимание, как Wireshark выделил сообщения желтым цветом как подозрительные для изучения. Существует множество функций безопасности уровня 2, которые уже предварительно загружены в коммутаторы Cisco IOS, и все они могут быть реализованы специалистом по безопасности. Вот некоторые из этих функций безопасности: Port security: Port security используется для фильтрации неавторизованных MAC-адресов от входа в интерфейс коммутатора. Dynamic ARP Inspection (DAI): DAI проверяет информацию об адресе IP-to-MAC, найденную в пакете, поступающем в коммутатор. Если будет найдено поддельное сообщение, коммутатор отклонит его, чтобы защитить сеть уровня 2. IP Source Guard: это еще одна функция безопасности, которая позволяет устройствам Cisco разрешать в сети только IP-адреса доверенных источников, предотвращая атаки с подменой IP-адресов.
img
В этой статье мы рассмотрим протокол маршрутизации Cisco EIGRP. EIGRP (Enhanced Interior Gateway Routing Protocol) - это протокол расширенной векторной маршрутизации, который должен устанавливать отношения соседства перед отправкой обновлений. Из-за этого первое, что нам нужно сделать, это проверить, правильно ли работает соседство. Если это так, мы можем продолжить, проверив, объявляются сети или нет. В этой статье рассмотрим все, что может пойти не так с EIGRP, как это исправить и в каком порядке. Давайте начнем с проверки соседства! Существует ряд элементов, которые вызывают проблемы соседства EIGRP: Неизвестная подсеть: соседи EIGRP с IP-адресами, которые не находятся в одной подсети. Несоответствие значений K: по умолчанию пропускная способность и задержка включены для расчета метрики. Мы можем включить нагрузку и надежность, но мы должны сделать это на всех маршрутизаторах EIGRP. Несоответствие AS: номер автономной системы должен совпадать на обоих маршрутизаторах EIGRP, чтобы сформировать соседство. Проблемы уровня 2: EIGRP работает на уровне 3 модели OSI. Если уровни 1 и 2 не работают должным образом, у нас будут проблемы с формированием соседства. Проблемы со списком доступа: возможно, кто-то создал список доступа, который отфильтровывает многоадресный трафик. EIGRP по умолчанию использует 224.0.0.10 для связи с другими соседями EIGRP. NBMA: по умолчанию Non Broadcast Multi Access сети, такие как Frame Relay, не разрешают широковещательный или многоадресный трафик. Это может препятствовать тому, чтобы EIGRP формировал соседние отношения EIGRP. OFF1(config)#int f0/0 OFF1(config-if)#ip address 192.168.12.1 255.255.255.0 OFF1(config-if)#router eigrp 12 OFF1(config-router)#network 192.168.12.0 OFF2(config)#int f0/0 OFF2(config-if)#ip address 192.168.21.2 255.255.255.0 OFF2(config)#router eigrp 12 OFF2(config-router)#network 192.168.21.0 Ошибку неверной подсети легко обнаружить. В приведенном выше примере у нас есть 2 маршрутизатора, и вы можете видеть, что были настроены разные подсети на каждом интерфейсе. После включения EIGRP всплывают следующие ошибки: Оба маршрутизатора жалуются, что находятся не в одной подсети. OFF2(config-router)#int f0/0 OFF2(config-if)#ip address 192.168.12.2 255.25 OFF2(config)#router eigrp 12 OFF2(config-router)#no network 192.168.21.0 OFF2(config-router)#network 192.168.12.0 Мы изменили IP-адрес на OFF2 и убедились, что для EIGRP правильно настроена команда network. Вуаля! Теперь у нас есть соседство EIGRP. Проверим это с помощью команды show ip eigrp neighbors. Извлеченный урок: убедитесь, что оба маршрутизатора находятся в одной подсети. Case #2 На этот раз IP-адреса верны, но мы используем разные значения K с обеих сторон. OFF1 включил пропускную способность, задержку, нагрузку и надежность. OFF2 использует только пропускную способность и задержку. Эту ошибку легко обнаружить, поскольку сообщение в консоли гласит "Несоответствие K-значений" на обоих маршрутизаторах. Мы можем проверить нашу конфигурацию, посмотрев ее на обоих маршрутизаторах. Как вы видите, что значения K были изменены на OFF1. OFF2(config)#router eigrp 12 OFF2(config-router)#metric weights 0 1 1 1 1 0 Давайте убедимся, что значения K одинаковы на обоих маршрутизаторах, так как мы изменили их на OFF2. После изменения значений K у нас появилось соседство EIGRP-соседей. Еще одна проблема решена! Извлеченный урок: убедитесь, что значения K одинаковы на всех маршрутизаторах EIGRP в одной и той же автономной системе. Case #3 Давайте продолжим со следующей ошибкой ... Вот еще один пример типичной проблемы. Несоответствие номера AS. Когда мы настраиваем EIGRP, мы должны ввести номер AS. В отличие от OSPF (который использует ID процесса) этот номер должен быть одинаковым на обоих маршрутизаторах. В отличие от других неверных настроек конфигурации EIGRP, эта проблема не выдает сообщение об ошибке. Используем команду show ip eigrp neighbors и видим, что соседей нет. Внимательно изучите выходные данные, чтобы обнаружить различия, и вы увидите, что маршрутизаторы используют разные номера AS. Если посмотреть на работающую конфигурацию, и мы увидим то же самое. Давайте изменим номер AS на OFF2. После смены номера AS все заработало как положено. Извлеченный урок: убедитесь, что номера AS одинаковые, если вы хотите соседства EIGRP. Case #4 И последнее, но не менее важное: если вы проверили номер AS, значения K, IP-адреса и у вас все еще нет работающего соседства EIGRP, вам следует подумать о безопасности. Возможно, access-list блокирует EIGRP и/или многоадресный трафик. Следующая ситуация: опять два маршрутизатора EIGRP и отсутствие соседства. Что здесь происходит? Мы видим, что нет соседей ... Если вы посмотрите на вывод команды show ip protocols, то увидите, что сеть была объявлена правильно. Если вы посмотрите внимательно на OFF2, вы увидите, что у нас есть пассивный интерфейс. Удалим настройки пассивного интерфейса! OFF2(config)#router eigrp 12 OFF2(config-router)#no passive-interface fastEthernet 0/0 Еще одна неправильная настройка создала нам проблемы, но мы ее решили. Задача решена! Извлеченный урок: не включайте пассивный интерфейс, если вы хотите установить соседство EIGRP. Case #5 В приведенном выше примере у нас есть те же 2 маршрутизатора, но на этот раз кто-то решил, что было бы неплохо настроить список доступа на OFF2, который блокирует весь входящий многоадресный трафик. Здесь можно запутаться. На OFF1 мы видим, что он считает, что установил соседство EIGRP с OFF2. Это происходит потому, что мы все еще получаем пакеты EIGRP от OFF2. Используем команду debug eigrp neighbors, чтобы посмотреть, что происходит. Очевидно, что OFF1 не получает ответ от своих hello messages, holdtime истекает, и это отбрасывает установление соседства EIGRP. Быстрый способ проверить подключение - отправить эхо-запрос по адресу многоадресной рассылки 224.0.0.10, который использует EIGRP. МЫ видим, что мы ответа нет от этого запроса. Рекомендуется проверить, есть ли в сети списки доступа. Так, так! Мы нашли что-то ... Этот список доступа блокирует весь многоадресный трафик. Давайте сделаем настройку, которая разрешит EIGRP. OFF2(config)#ip access-list extended BLOCKMULTICAST OFF2(config-ext-nacl)#5 permit ip any host 224.0.0.10 Мы создаем специальное правило, которое будет разрешать трафик EIGRP. Как мы видим, что трафик EIGRP разрешен - это соответствует правилу, которое мы выше создали. Оба маршрутизатора теперь показывают рабочее соседство EIGRP. Эхо-запрос, который мы только что отправили, теперь работает. Извлеченный урок: не блокируйте пакеты EIGRP! Case #6 Рассмотрим очередную ситуацию, в которой нет соседства EIGRP. На картинке выше мы имеем сеть Frame Relay и один канал PVC между OFF1 и OFF2. Вот соответствующая конфигурация: Оба маршрутизатора настроены для Frame Relay, а EIGRP настроен. Видно, что нет соседей ... это не хорошо! Можем ли мы пропинговать другую сторону? Пинг проходит, поэтому мы можем предположить, что PVC Frame Relay работает. EIGRP, однако, использует многоадресную передачу, а Frame Relay по умолчанию - NBMA. Можем ли мы пропинговать адрес многоадресной рассылки EIGRP 224.0.0.10? Здесь нет ответа на наш вопрос, по крайней мере, теперь мы знаем, что unicast трафик работает, а multicast не работает. Frame Relay может быть настроен для point-to-point или point-to-multipoint соединения. Физический интерфейс всегда является интерфейсом frame-relay point-tomultipoint, и для него требуются frame-relay maps, давайте проверим это: Мы видим, что оба маршрутизатора имеют DLCI-to-IP карты, поэтому они знают, как связаться друг с другом. Видим, что они используют ключевое слово "статический", а это говорит о том, что это сопоставление было кем-то настроено и не изучено с помощью Inverse ARP (в противном случае вы увидите "динамический"). Мы не видим ключевое слово "broadcast", которое требуется для пересылки широковещательного или многоадресного трафика. На данный момент у нас есть 2 варианта решения этой проблемы: Настроить EIGRP для использования одноадресного трафика вместо многоадресного. Проверить конфигурацию Frame Relay и убедится, что многоадресный трафик не перенаправляется. Давайте сначала сделаем unicast настройку EIGRP: OFF1(config)#router eigrp 12 OFF1(config-router)#neighbor 192.168.12.2 serial 0/0 OFF2(config)#router eigrp 12 OFF2(config-router)#neighbor 192.168.12.1 serial 0/0 Нам нужна команда neighbor для конфигурации EIGRP. Как только вы введете эту команду и нажмете enter, вы увидите это: Задача решена! Теперь давайте попробуем другое решение, где мы отправляем multicast трафик по PVC Frame Relay: OFF1(config)#router eigrp 12 OFF1(config-router)#no neighbor 192.168.12.2 serial 0/0 OFF2(config)#router eigrp 12 OFF2(config-router)#no neighbor 192.168.12.1 serial 0/0 Если это не работает ... не исправляйте это... , но не в этот раз! Пришло время сбросить соседство EIGRP. OFF1(config)#interface serial 0/0 OFF1(config-if)#frame-relay map ip 192.168.12.2 102 broadcast OFF2(config)#interface serial 0/0 OFF2(config-if)#frame-relay map ip 192.168.12.1 201 broadcast Broadcast - это ключевое волшебное слово здесь. Это разрешит широковещательный и многоадресный трафик. После изменения конфигурации frame-relay map появляется соседство EIGRP! Это все, что нужно сделать. Извлеченный урок: проверьте, поддерживает ли ваша сеть Frame Relay broadcast или нет. Настройте EIGRP для использования unicast передачи или измените конфигурацию Frame Relay для поддержки широковещательного трафика. Продолжение цикла про поиск и устранение неисправностей протокола EIGRP можно почитать тут.
img
В интернете можно найти множество статей с описанием шаблонов масштабирования баз данных (БД), но, в основном, это разрозненная информация с перечислением методик и практически без объяснений. Ниже приведено подробное руководство по шаблонам масштабирования БД, пошаговым объяснением принципов их работы и примерами использования. Практический пример Предположим, вы создали стартап, который предлагает совместные поездки по дешевой цене. Вы выбрали город для поездок, а первая реклама привлекла не более 10 клиентов. Вы храните информацию обо всех клиентах, поездках, местах, бронированиях и историях заказов в одной и той же БД и, скорее всего, на одной физической машине. У вас нет навороченного кеширования или конвейера обработки больших данных, ведь ваше приложение только появилось. На данный момент это – идеальный вариант: в базе мало клиентов, и система, вряд ли, бронирует по поездке каждые 5 минут. Но время идет. В вашей системе регистрируется все больше людей, ведь это самый дешевый сервис на рынке. Да и реклама сделала свое дело. Вы получаете по 10 заказов в минуту. Постепенно это количество увеличивается до 20, а затем и 30 бронирований в минуту. В этот момент вы замечаете, что система начинает тормозить: время отклика API сильно увеличилось, а некоторые транзакции блокируются или зависают и, в конечном итоге, не проходят. Время ответа приложения также увеличилось, что вызвало недовольство клиентов. Как же решить эту проблему? Шаблон №1 – оптимизация запросов и реализация пула соединений Первое решение, которое приходит на ум: кэш слишком часто использует нединамические данные (история бронирования, история платежей, профили пользователей и т.д.). Но прикладным уровнем кеширования вы не сможете решить проблему с временем отклика API, предоставляющим динамические данные (текущее местоположение водителя, ближайшая машина для конкретного клиента, текущая стоимость поездки после выхода на маршрут и т.д.). Вы приходите к выводу, что база данных слишком нормализована, поэтому вы решаете ее немного «разбавить» и добавляете несколько избыточных столбцов (такие столбцы часто попадают в операторы WHERE или JOIN ON в запросах). Это сокращает количество запросов на соединение, разбивает большие запросы на несколько маленьких и добавляет их результаты на прикладной уровень. Можно заняться и параллельной оптимизацией – настроить подключения к базам данных. Внешние и клиентские библиотеки БД доступны практически для всех языков программирования. Для кеширования подключений к БД можно воспользоваться библиотеками пула соединений. Либо вы можете настроить размер пула соединений в самой СУБД. Создание сетевого подключения – вещь весьма затратная, поскольку требует двусторонней коммуникации между клиентом и сервером. Пулы соединений помогают оптимизировать количество подключений. Библиотеки пула соединений реализуют мультиплексирование подключений – несколько потоков приложения могут пользоваться одним и тем же подключением. Вы замеряете время отклика API и замечаете снижение задержки на 20-50% (или даже больше). На данный момент это хорошая оптимизация. Затем вы расширили бизнес на еще один город и получили больше клиентов. Постепенно вы доходите до 80-100 бронирований в минуту. Ваша система не в состоянии справиться с таким объемом. Вы вновь замечаете увеличение времени ожидания API, а слой базы данных не справляется с нагрузкой. Но в этот раз оптимизация запросов не дает вам существенного улучшения производительности. Вы проверяете метрики системы и видите, что дисковое пространство заполнено, ЦП занят в 80% времени, а ОЗУ переполняется слишком быстро. Шаблон № 2 – вертикальное масштабирование или масштабирование вверх Изучив все системные метрики, вы не находите другого решения, кроме как обновить аппаратное обеспечение системы. Вы увеличиваете размер оперативной памяти в 2 раза, а объем диска – раза в 3. Это называется вертикальным масштабированием. Вы сообщаете группе по обслуживанию инфраструктуры, команде devops или агентам сторонних центров обработки данных (ЦОД) о необходимости обновления вашей машины. Но как настроить саму машину для вертикального масштабирования? Вы выделяете машину большего объема. Один из подходов заключается в том, чтобы не переносить данные со старой машины вручную, а настроить новую машину в качестве копии, или реплики (replica), уже существующего устройства, или источника (primary), прописав временную конфигурацию первичной реплики (primary replica). После завершения репликации назначьте новую машину в качестве primary и отключите старую. Поскольку обрабатывать запросы планируется на этой новой машине, все чтение/запись также будет вестись на ней. Отлично. Вы прокачали систему, и теперь все работает намного быстрее. Ваш бизнес идет на ура, и вы решаете расшириться еще до 3 городов. Теперь вы ведете деятельность в 5 городах. Трафик увеличился втрое, вы получаете по 300 заказов в минуту. Проблема с производительностью вернулась: размер индекса сильно сказывается на памяти, базу данных необходимо постоянно поддерживать, а сканирование таблицы с индексом замедлилось до невозможности. Вы подсчитали стоимость дальнейшего масштабирования системы, но цена не внушает доверия. Так что же делать? Шаблон №3 – разделение ответственности на команды и запросы (CQRS): Вы понимаете, что та самая большая машина не в состоянии обработать все запросы на чтение/запись. Да и чаще всего компаниям нужны транзакционные возможности на запись (write), а не чтение (read). Вас даже устраивает небольшая несогласованность данных или замедление операций read. В принципе, раньше это тоже не казалось вам проблемой. Вы решаете, что неплохо было бы разделить операции чтения и записи на физической машине. Это позволит отдельным машинам выполнять больше операций чтения/записи. Теперь вы берете целых 2 большие машины и настраиваете их репликами для текущего компьютера. Репликация базы данных решит вопрос с переносом данных с primary машины на реплики. Вы перенаправляете все запросы на чтение (буква Q в CQRS, что означает «запрос» - Query) в реплики – любая реплика может обслуживать любой запрос на чтение. А все запросы на запись остаются на первичной машине. Возможна небольшая задержка в репликации, но в вашем конкретном случае это не критично. Вариант с настройкой primary-replica вполне подходит для большинства стартапов среднего масштаба, получающих по сотням тысяч запросов ежедневно… но при условии, что компании периодически архивируют старые данные. Вы вновь расширились на 2 города, и замечаете, что primary-машина не справляется со всеми запросами на запись. Многие такие запросы приходят с опозданием. Более того, задержка между primary и replica начинает сказываться на клиентах и водителях. Например, поездка завершена, клиент успешно ее оплачивает, но водитель не видит платеж, поскольку активность клиента – это запрос на запись, который идет на машину primary, а активность водителя – это запрос на чтение, который приходит на одну из реплик. Вся система настолько замедлилась, что водитель не видит платежа как минимум секунд 30, и это вызывает недовольство как со стороны клиента, так и у самого водителя. Как же поступить сейчас? Шаблон №4 – репликация с несколькими источниками Конфигурация primary-replica помогла вам успешно масштабироваться, однако теперь для операций записи не хватает возможностей. Быть может, вы согласитесь слегка пожертвовать быстротой запросов на чтение. А почему бы не перенести запросы на запись тоже в реплики? В модели с несколькими источниками (multi-primary) все машины работают как источник, и как реплика. Такая структура чем-то напоминает замкнутый круг из машин: A->B->C->D->A. «B» может реплицировать данные из «A», «C» – реплицирует данные из «В», «D» – дублирует данные из «C», а «A» делает тоже самое из «D». Вы можете выполнять операцию чтения и одновременно записывать данные в любой узел; вы можете транслировать запрос во все узлы, а значение вернет один из откликнувшихся узлов. Все узлы имеют одинаковую схему БД, один и тот же набор таблиц, индекс и т.д. Но нужно следить, чтобы в узлах одной таблицы не было конфликта по id , иначе при трансляции запросов несколько узлов вернут разные данные по одному и тому же id. Вообще считается, что для ID лучше использовать UUID или GUID. Еще один недочет данной системы: из-за трансляции запросов и поиска корректного результата, запросы на чтение могут оказаться неэффективными. Это, своего рода, принцип распределения/сборки в действии. И вот вы вновь масштабировали бизнес. В этот раз на 5 новых городов. Система не справляется. Теперь вам нужно обрабатывать по 50 запросов в секунду. Вам очень не хватает обработки большого количества параллельных запросов. Но как это сделать? Шаблон №5 – декомпозиция Вы знаете, что база данных location получает много трафика на чтение/запись. Вполне возможно, что соотношение записи к чтению составляет 7:3. Это создает большую нагрузку на существующие БД. В таблицах location содержится несколько первичных данных: долгота (longitude), широта (latitude), отметка времени (timestamp), ID водителя (driver id), ID поездки (trip id) и т.д. Там практически нет информации о поездках или данных пользователя, его платежах и т.д. Возможно, стоит разделить таблицы location на отдельную схему? Как насчет того, чтобы распределить эту БД по отдельным машинам с корректно настроенной конфигурацией primary-replica или multi-primary? Это называется декомпозицией данных по функциональности. В разных БД можно хранить данные, разделенные по функциональному признаку, а результат (при необходимости) агрегируется на серверном уровне. Такой способ позволит вам масштабировать нужный функционал с большим количеством запросов на чтение/запись. В то же время прикладной или серверный уровень приложения должен будет заняться объединением результатов, что приведет к значительному изменению кода. Теперь представьте себе, что вы масштабировались до 20 городов в своей стране и планируете открыть филиалы в Австралии. Растущий спрос на ваше приложение требует все более быстрого времени ответа. Ни один из методов выше с этим не поможет. Вам нужно масштабировать систему так, чтобы при расширении в другие страны/регионы не приходилось слишком часто проектировать и менять архитектуру. Как же тогда поступить? Шаблон №6 – горизонтальное масштабирование Вы хорошо загуглили эту тему, почитали массу статей о том, как другие компании решали такую проблему, и поняли, что настал момент масштабироваться горизонтально. Вы выделили, скажем, 50 машин – все с одинаковой схемой БД и одинаковыми наборами таблиц. На каждой машине хранится лишь часть данных. Поскольку во всех БД хранится один и тот же набор таблиц, вы можете спроектировать систему таким образом, чтобы реализовать привязку данных (то есть все связанные данные хранятся на одной машине). В каждой машине может быть своя реплика; реплики используются для восстановления после сбоя. Каждая такая база данных называется «шардом». На физической машине может быть один или несколько шардов – их количество зависит от нужной вам схемы проектирования. Вы должны придумать ключ шардирования, который бы всегда относился к одной и той же машине. Представьте себе много машин с кучей связанных данных в одном наборе таблиц; операции на чтение/запись запрашиваются для одной и той же строки или набора ресурсов на одной и той же машине с БД. Реализовать шардинг довольно сложно. По крайней мере, так говорят инженеры. Но при обслуживании миллионов или даже миллиардов запросов, рано или поздно вам придется пойти на столь непростой шаг. Настроив шардинг, вы уверены, что сможете масштабироваться во многие страны. Ваш бизнес разросся настолько, что инвесторы вынуждают вас расширяться на другие континенты. И тут опять возникают проблемы. Все то же время отклика API. Ваш сервис находится в США, и у пользователей из Вьетнама возникают трудности при бронировании. Но почему? И что же делать? Шаблон №7 – умное сегментирование центров обработки данных Ваш бизнес развивается в Америке, Южной Азии и нескольких странах Европы. Каждый день вы получаете миллионы заказов, а ваш сервер атакуют миллиарды запросов. Поздравляю! Это пиковый момент в вашей деятельности. Запросы из приложения поступают с разных континентов и проходят через сотни или даже тысячи серверов в интернете, поэтому время отклика растет. Может, распределить трафик по центрам обработки данных? Вы могли бы настроить ЦОД в Сингапуре, и он бы обрабатывал все запросы из Южной Азии. Затем сделать еще один в Германии – он займется всеми запросами из европейских стран, и оставить ЦОД в Калифорнии для обработки американских запросов. Кроме того, вам понадобится репликация между ЦОД – на случай, если потребуется восстановление после сбоя. Если центр обработки данных в Калифорнии выполняет репликацию сингапурского ЦОД, то в случае аварии в Калифорнии (стихийные бедствия, отсутствие электричества и т.д.), все запросы из США будут передаваться в Сингапур и наоборот. Такой метод масштабирования подходит для: обслуживания миллионов клиентов из разных стран, сохранения всех данных и поддержания постоянной доступности системы. Заключение В статье приведены общие методы по масштабированию базы данных. Стоит сказать, что у большинства инженеров нет достаточных возможностей для реализации всех шаблонов. Но лучше знать о существовании таких схем, которые в будущем могут помочь вам с проектированием архитектуры и систем.
ВЕСЕННИЕ СКИДКИ
40%
50%
60%
До конца акции: 30 дней 24 : 59 : 59