Рейтинг:5

Веб-сайт отвечает очень медленно, используя удаленную базу данных

флаг co

Я хочу, чтобы два одинаковых веб-сайта использовали одну базу данных. Один сервер находится в Азии, на нем размещается веб-сайт и база данных. Другой сервер находится в США, на нем размещена та же сеть через удаленную базу данных. Однако сеть в США отвечает очень медленно, но при перемещении базы данных на локальный сервер (сервер в США) сеть отвечает быстро. Как ускорить соединение между сервером в США и базой данных в Азии?

Я использую Centos7+Nginx+MySQL.

Polygorial avatar
флаг cn
Почему у вас есть серверы приложений и в Азии, и в США, а не в Азии, где находится БД? Насколько приложение зависит от БД?
c4f4t0r avatar
флаг nl
выполните ping с сервера в США на сервер в Азии, и вы увидите RTT
Рейтинг:27
флаг ar

Как ускорить соединение между сервером в США и базой данных в Азии?

Вы, наверное, не можете. США-Азия - это большое расстояние, и это связано с задержкой. Проще говоря: свет имеет конечную скорость.

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

флаг cn
Здесь подойдет реплика, но я думаю, это зависит от того, как настроена ваша база данных, может ли она быть доступна для чтения и записи или только для чтения.
vidarlo avatar
флаг ar
Абсолютно. И если он в основном предназначен только для чтения, простой CDN может быть более простым путем.
djdomi avatar
флаг za
возможно, мастер-мастер может помочь, но вопрос в том, что произойдет, если одни и те же значения будут изменены одновременно? ;)
vidarlo avatar
флаг ar
Абсолютно. Подчиненное устройство только для чтения может быть лучше, если большинство обращений к базе данных осуществляется только для чтения. Масштабирование не без проблем.
Рейтинг:13
флаг ke

Ваше веб-приложение делает несколько отдельных запросов к базе данных? Зависит ли один запрос от предыдущего или существуют независимые запросы, которые могут выполняться параллельно, чтобы перекрыть их задержку?

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

Если этого недостаточно или невозможно, вам нужно каким-то образом уменьшить задержку между веб-сервером и базой данных, либо путем репликации БД, чтобы вы могли иметь локальную копию, кэшируя некоторые «горячие» ее части, которые не часто меняться или различные другие вещи, такие как кеширование окончательного вывода веб-сервера или другие вещи, которые может делать CDN (см. ответ vidarlo).

флаг in
Проголосовал за упоминание самого кода и его шаблонов запросов к БД. Я могу легко представить серию запросов, которые достаточно хорошо работают в локальной БД, медленно выполняются в БД с высокой задержкой, но могут быть унифицированы/распараллелены.
Рейтинг:6
флаг in

Вы не можете улучшить скорость света. {нужна цитата}

Вместо межконтинентальных запросов вам, возможно, придется изучить любую репликацию, которую предлагает MySQL. Вам понадобится веб-сервер и сервер базы данных в Азии, дублированные в каждом месте (США, ЕС, Африка, Ближний Восток и т. д.). Когда веб-сервер записывает, локальная БД немедленно обновляется, и это обновление затем передается на удаленные серверы БД MySQL внутри.

Положительные стороны:

  • Сеансы пользователей могут переключаться с одного сайта на другой, а их записи в базе данных будут непротиворечивыми.
  • Вам нужно только создать резервную копию одного сервера базы данных, чтобы получить партию.
  • Можно добавить избыточность и отказоустойчивость за счет наличия основного сайта, а если он выйдет из строя, переключиться на удаленный сайт.
  • Можно горизонтально масштабировать веб-серверы на каждом сайте, чтобы обеспечить обслуживание во время простоя, например обновления/перезагрузки.
  • Вы даже можете иметь резервный сервер БД локально для каждого сайта, что опять же обеспечивает избыточность без необходимости аварийного переключения.

Минусы:

  • Добавленная сложность
  • Увеличение стоимости большего количества ресурсов

В конечном счете, это проблема проектирования инфраструктуры, а не веб-сервера.

rexkogitans avatar
флаг jp
«... затем передаются на удаленные серверы БД» Нет, базы данных MySQL работают так, как это делает клиент репликации.
Criggie avatar
флаг in
@rexkogitans хорошо, вы меня поняли - я не администратор баз данных, но я работаю с несколькими очень талантливыми. Любая приличная БД будет иметь некоторую систему репликации, будь то главный/главный или главный/подчиненный, веб-сервер должен иметь возможность как минимум получать «локальную» скорость из запросов на чтение. Запись может быть медленнее или, в идеале, полной на «локальной» скорости.
флаг jp
Репликация БД по междугородным каналам — еще одна банка неприятных червей. Если вы выберете синхронную репликацию, вы получите медленную запись и полное время простоя в случае разделения сети. Если вы выберете асинхронную репликацию, вы получите несогласованность данных между репликами из-за задержки, и вы не сможете так легко переключать сеансы между сайтами.
Criggie avatar
флаг in
@AlexD полностью согласен. Но, учитывая, что это бэкэнд для веб-сайта, «сеанс пользователя» должен записывать в локальную БД, а затем со временем может произойти синхронизация с удаленной. Сеанс пользователя не должен перемещаться в другое место, и если это произойдет И есть запись в БД, которая не синхронизировалась, то это стоимость избыточности и отработки отказа.
Abigail avatar
флаг in
* Сеансы пользователей могут переключаться с одного сайта на другой, и их записи в базе данных будут непротиворечивыми. * Э, нет. Не сразу после записи. При репликации вам **придется** иметь дело с пользователем, записывающим на мастер, и приложением, получающим данные с подчиненного до того, как запись будет реплицирована.
Abigail avatar
флаг in
* Можно добавить избыточность и отказоустойчивость, имея первичный сайт, а если он выйдет из строя, то переключиться на удаленный сайт. * Сложно получить правильное решение, когда мастер отключается до того, как все подчиненные получат все измененные данные. Вы не получите это из коробки бесплатно.
Рейтинг:3
флаг ng

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

Каждый из этих запросов, один за другим, требует времени прохождения туда и обратно между веб-сервером и сервером базы данных. Это может быстро добавить.

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

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

Вот почему ваша установка вообще бессмысленна.

Что же тогда можно сделать?

  1. Используйте один веб-сервер рядом с базой данных. Времена, когда географически распределенные серверы были важны для улучшения взаимодействия с пользователем, давно прошли для чего-то меньшего, чем глобальная электронная коммерция или новостной центр.

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

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

Существуют уловки CDN, которые могут улучшить время отклика даже с одним сервером, создавая впечатление, что у вас несколько серверов в разных местах. У крупных провайдеров CDN, таких как Cloudflare или Akamai, есть действительно мощные инструменты.

  1. Используйте репликацию базы данных и поддерживайте базу данных рядом с обоими веб-серверами. Это может потребовать глубокого переосмысления дизайна приложения, а также гораздо более широкого набора навыков и/или более дорогих лицензий на БД.

  2. Проверьте свойства подключения к базе данных на обоих концах (сервер базы данных и веб-сервер).

  • Обширное ведение журнала, сложная аутентификация и обратный DNS на стороне сервера БД могут в значительной степени отставать от результатов каждого запроса к БД.
  • Использование постоянных подключений к базе данных на стороне веб-сервера может сократить количество запросов к базе данных в 2-5 раз.
  1. Измените дизайн своего приложения, чтобы использовать меньше запросов к базе данных на странице. Это, с другой стороны, может привести к тому, что запросы станут более сложными, медленными и трудными в обслуживании. Ваш пробег может отличаться.
vidarlo avatar
флаг ar
Я не согласен с тем, что местоположение веб-сервера не важно; скорее наоборот. Сегодня у большинства пользователей
fraxinus avatar
флаг ng
@vidarlo в этом плане мир вообще поделен между Китаем и всеми остальными. Но если вы работаете в Китае, вы ставите там сервер и отдельную базу данных. Нормативно-правовая база заставляет вас хранить материалы, связанные с Китаем, в Китае и все остальное за пределами Китая.
Рейтинг:2
флаг us

Distance не делает базу данных медленнее, она просто увеличивает задержку.

меры по уменьшению задержки включают

  • параллельное выполнение нескольких запросов
  • уменьшение количества необходимых запросов
  • кэширование результатов локально
  • локальное хранение копии базы данных только для чтения

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

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

Рейтинг:1
флаг in

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

Другой альтернативой является проксирование запроса. С помощью прокси-сервера вы можете настроить веб-сервер в США для ретрансляции на азиатский веб-сервер, локальный для базы данных. Апач определенно может это сделать, и я верю, что Nginx тоже может (но я гораздо меньше знаком с конфигурацией Nginx). Это устранит проблемы с повторяющимися медленными обменами между веб-сервером и базой данных за счет добавления прокси-соединения поверх него. Но прокси-связь может быть одной парой запрос/ответ, что, как правило, будет быстрее.

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

Проксирование также позволяет избежать репликации в обоих направлениях. Если и локальный (США), и удаленный (азиатский) веб-серверы выполняют операции записи, может быть проще выполнить все операции записи непосредственно на полномочном сервере базы данных. Это позволяет избежать проблемы конфликтующих правок, когда каждое из них пытается перезаписать друг друга на расстоянии. Но теперь мы потенциально можем вернуться к выполнению нескольких запросов к удаленной базе данных туда и обратно (хотя и меньше). С прокси вам гарантирован только один запрос/ответ на загрузку страницы.

Это также дает некоторые преимущества по сравнению с постоянным использованием удаленного (азиатского) веб-сервера напрямую. Если какой-то контент является динамическим, и вы проксируете только этот контент, ваш локальный (США) сервер все равно может предоставить весь статический контент. Конечно, вам может быть лучше с CDN для статического контента и прямого доступа клиента к азиатскому веб-серверу.

флаг co
Это звучит как лучший вариант для меня. Спасибо!
jcaron avatar
флаг co
Если цель сервера в США — быть ближе к конечным пользователям для более быстрой доставки страниц, то проксирование всех запросов без какой-либо формы кэширования не принесет многого, если вообще что-нибудь, по сравнению с тем, чтобы все клиенты запрашивали сервер в Азии напрямую. Если соединения от прокси-сервера к исходному серверу могут оставаться открытыми (постоянные соединения), может быть небольшой выигрыш в установлении соединений от конечного пользователя к прокси-серверу (особенно при использовании SSL/TLS), но с другой стороны пользователи в большинстве случаев делают небольшой «обход» через прокси.

Ответить или комментировать

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