Оптимизация производительности записи для экземпляра AWS Aurora

У меня есть работающий кластер БД AWS Aurora, который на 99,9% сосредоточен на записи. На пике он будет выполнять 2-3k операций записи в секунду.

Я знаю, что Aurora по умолчанию несколько оптимизирована для операций записи, но я хотел бы спросить как относительный новичок в AWS: каковы некоторые рекомендации/советы по производительности записи с помощью Aurora?


person griffinjt    schedule 23.09.2017    source источник
comment
Это не вопрос программирования. Вероятно, более уместно спросить на dba.stackexchange.com, а не на stackoverflow.com. Я проголосовал за перенос вопроса на сайт dba.   -  person Bill Karwin    schedule 23.09.2017


Ответы (3)


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

Ранее в 2017 году я работал над некоторыми эталонными тестами для приложения с большим объемом записи, и мы обнаружили, что RDS (не Aurora) намного превосходит Aurora по производительности записи, учитывая наше приложение и базу данных. По сути, Aurora была на два порядка медленнее, чем RDS. Заявления Amazon о высокой производительности Aurora, по-видимому, полностью маркетинговая чушь.

В ноябре 2016 года я посетил конференцию Amazon re:Invent в Лас-Вегасе. Я попытался найти знающего инженера Aurora, чтобы он ответил на мои вопросы о производительности. Все, что я смог найти, это младшие инженеры, которым было приказано повторить утверждение, что Aurora волшебным образом в 5-10 раз быстрее, чем MySQL.

В апреле 2017 года я посетил конференцию Percona Live и увидел презентацию о том, как разработать архитектуру распределенного хранилища, подобную Aurora, с использованием стандартного MySQL с CEPH для уровня распределенного хранилища с открытым исходным кодом. Здесь есть вебинар на ту же тему: https://www.percona.com/resources/webinars/mysql-and-ceph, совместно представленный Ивом Трюдо, инженером, которого я видел на конференции.

Что стало ясно при использовании MySQL с CEPH, так это то, что инженерам пришлось отключить буфер изменений MySQL, потому что нет возможности кэшировать изменения во вторичных индексах, а также распределять хранилище. Это вызывало огромные проблемы с производительностью при записи в таблицы с вторичными (неуникальными) индексами.

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

Поэтому, если вам абсолютно необходимо использовать Aurora для базы данных с высоким трафиком записи, я рекомендую в первую очередь удалить все вторичные индексы.

Очевидно, что это проблема, если индексы нужны для оптимизации некоторых ваших запросов. Конечно, оба запроса SELECT, а также некоторые запросы UPDATE и DELETE могут использовать вторичные индексы.

Одна из стратегий может состоять в том, чтобы создать не-Aurora реплику чтения вашего кластера Aurora и создать вторичные индексы только в реплике чтения для поддержки ваших запросов SELECT. Я никогда этого не делал, но, по-видимому, это возможно, согласно https://aws.amazon.com/premiumsupport/knowledge-center/enable-binary-logging-aurora/

Но это все еще не помогает в случаях, когда вашим операторам UPDATE/DELETE нужны вторичные индексы. У меня нет никаких предложений для этого сценария. Возможно, вам не повезло.

Мой вывод состоит в том, что я бы не стал использовать Aurora для приложений с большим объемом записи. Может быть, это изменится в будущем.


Обновление за апрель 2021 г.:

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

По крайней мере, Aurora намного лучше, чем обычный Amazon RDS для MySQL, использующий хранилище EBS. Вероятно, поэтому они утверждают, что Aurora в 5 раз быстрее, чем MySQL. Но Aurora не быстрее, чем некоторые другие альтернативы, которые я тестировал, и фактически не может сравниться:

  • MySQL Server устанавливался на экземпляры EC2 с использованием локального хранилища, особенно на экземпляры i3 с локально подключенным NVMe. Я понимаю, что хранилище экземпляров ненадежно, поэтому нужно будет запускать избыточные узлы.

  • Сервер MySQL я установил на физические хосты в нашем центре обработки данных, используя SSD-хранилище с прямым подключением.

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

person Bill Karwin    schedule 23.09.2017
comment
Спасибо за ваше понимание. Все запросы разгружаются и выполняются в кластере Redshift, поэтому удаление вторичных индексов вообще не должно быть проблемой, поскольку БД не затрагивается для общего анализа данных. Раньше я не слышал об этой проблеме, но я попробую и посмотрю, будет ли это иметь какое-то значение. - person griffinjt; 24.09.2017
comment
Вау, я могу подтвердить, что это так. Удаление вторичных индексов уменьшило использование ЦП почти вдвое. Похоже, это то, что им нужно решить. - person griffinjt; 24.09.2017
comment
Я рад слышать, что это изменило ситуацию! У меня не было возможности провести такое сравнение с эталонным тестом в моей предыдущей компании, поскольку мы знали, что не можем обойтись без индексов с нашей текущей архитектурой. - person Bill Karwin; 24.09.2017
comment
Извините, я могу проголосовать за вас только один раз. Это именно тот реальный опыт использования, о котором я пытался прочитать, потому что я рассматривал возможность переноса аналогичной базы данных на Aurora, и мне нужно было выяснить, поможет ли это приложению с большим количеством операций записи с МНОЖЕСТВОМ индексов. . - person Fernando Piancastelli; 03.01.2018
comment
Два порядка?! В 100 раз медленнее, чем RDS MySQL? - person Charlie Hileman; 12.04.2019
comment
@CharlieHileman, как и многие проблемы с производительностью, это зависит от рабочей нагрузки. Каждая оптимизация технологии повышает производительность для одного типа рабочей нагрузки за счет других типов рабочих нагрузок. Для нашего приложения это было непригодно. - person Bill Karwin; 12.04.2019
comment
@CharlieHileman, для меня два порядка - это 4. Может быть, я слишком бинаризован :) - person Nikolay Dimitrov; 18.12.2020
comment
@BillKarwin Спасибо за ваши комментарии, очень полезные и интересные. У меня есть вопрос относительно этих показателей. Сколько операций записи одновременно будет считаться «тяжелой записью»? Я знаю, что это, вероятно, зависит от приложения, но не могли бы вы дать оценку или кадр? - person Iker Aguayo; 19.02.2021
comment
@IkerAguayo, это было несколько лет назад, но я помню, что приложение, над которым я работал, имело соотношение операций записи и чтения около 80:1. Это очень необычно. Большинство приложений имеют обратное соотношение, где чтение происходит гораздо чаще, чем запись. Я бы считал приложение ресурсоемким, даже если бы соотношение операций записи и чтения составляло 1:1, потому что даже в этом случае операций записи было бы намного больше, чем в обычном приложении. - person Bill Karwin; 19.02.2021
comment
Мы поговорили с AWS, и у них есть документ для внутреннего обсуждения этой конкретной SO. Мой вывод из того, что они сказали, заключается в том, что буферы изменений не имеют значения при быстром произвольном вводе-выводе в Aurora, и они предпочли бы иметь больший пул буферов. Я не знаю достаточно, чтобы сказать, ошибаются ли они в этом. - person Juliano; 27.04.2021
comment
@Juliano Спасибо, что поделились своим опытом работы с AWS. Я проводил другие тесты с 2017 года, поэтому обновил свой ответ выше. - person Bill Karwin; 27.04.2021

У меня был относительно положительный опыт работы с Aurora для моего варианта использования. Я полагаю (время прошло), что мы нажимали где-то около 20 000 DML в секунду, самый большой тип экземпляра (я думаю, db.r3.8xlarge?). Извиняюсь за неточность, у меня больше нет возможности получать метрики для этой конкретной системы.

Что мы сделали:

Эта система не требовала «немедленного» ответа на данную вставку, поэтому записи ставились в очередь отдельному процессу. Этот процесс будет собирать N запросов и разбивать их на M пакетов, где каждый пакет будет коррелировать с целевой таблицей. Эти пакеты будут помещены в один txn.

Мы сделали это, чтобы добиться эффективности записи за счет массовой записи и избежать межтабличной блокировки. Было 4 отдельных (я полагаю?) процесса, которые выполняли это удаление из очереди и поведение записи.

Из-за такой высокой нагрузки на запись нам абсолютно необходимо было передавать все операции чтения на реплику чтения, так как основной сервер обычно загружал 50-60% ЦП. Мы проверили эту архитектуру заранее, просто создав произвольные процессы записи данных и смоделировав общее поведение системы, прежде чем мы зафиксировали в ней реальное приложение.

Записи почти все были INSERT ON DUPLICATE KEY UPDATE, а таблицы имели ряд вторичных индексов.

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

person Chris Zelenak    schedule 01.05.2018

Для сотрудников Google:

  • Aurora должна записывать в несколько реплик в режиме реального времени, поэтому должна быть очередь с блокировкой, ожиданием, механизмами проверки.
  • Такое поведение неизбежно приводит к сверхвысокой загрузке ЦП и задержкам при непрерывных запросах на запись, которые выполняются только при синхронизации нескольких реплик.
  • Это было примерно с момента создания Aurora до 2020 года, что логически сложно, если не невозможно решить, если мы хотим сохранить низкую стоимость хранения и справедливую стоимость вычислений службы.
  • Производительность Aurora MySQL при записи больших объемов может быть более чем в 10 раз хуже, чем RDS MySQL (из личного опыта и подтверждена приведенными выше ответами)

Чтобы решить проблему (больше похоже на обходной путь):

  • БУДЬТЕ ОСТОРОЖНЫ с Aurora, если более 5% вашей рабочей нагрузки приходится на написание
  • БУДЬТЕ ОСТОРОЖНЫ с Aurora, если вам нужен результат почти в реальном времени при написании больших объемов.
  • Отбросьте вторичные индексы, как указывает @Bill Karwin, чтобы улучшить письмо
  • Пакетное применение вставок и обновлений может улучшить написание

Я сказал БУДЬТЕ ОСТОРОЖНЫ, но не НЕ ИСПОЛЬЗУЙТЕ, так как многие сценарии могут быть решены с помощью продуманной архитектуры. На производительность записи базы данных вряд ли можно положиться.

person theaws.blog    schedule 14.10.2020