Опыт миграции из собственного датацентра в облако AWS

29.07.18

База данных - HighLoad оптимизация

Хотя данная публикация и не имеет прямого отношения к 1С, она может быть интересна тем, кто занимается крупными базами данных на MS SQL Server. Описывается опыт миграции баз данных в облако AWS в компании glassdoor.com, где я занимался этим проектом. Это первый драфт текста, получившийся довольно скомканным - в процессе буду дополнять.

Компания glassdoor.com является вторым по трафику сайтом в США для соискателей работы. SLA установлен на уровне 99.99% без возможности проводить обслуживание серверов и приложений в оффлайн режиме. Объем баз данных, которые должны быть мигрированы в облако - порядка 40Тб. В среднем сервера баз данных выполняют 2 млрд. запросов в день.

 

Ситуация до миграции

Для обеспечения высокой доступности (HADR) используется стандартная технология SQL Server Failover Cluster Instance.

 

 

Существующие особенности, которые надо было учесть при миграции:

  1. Для работы кластера требуется дорогостоящее сетевое хранилище данных (SAN), подключенное оптическими каналами ко всем нодам кластера.

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

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

  4. Клиентские приложения написаны на java и работают под управлением Linux. Используется устаревшая версия jdbc-драйвера, которая официально поддерживает только SQL2008, хотя сами базы данных были переведены на SQL2016.

  5. Лицензии на SQL2016 уже были оплачены.

 

Какие вопросы надо было решить при миграции

  1. AWS не поддерживает общее хранилище данных для Windows. Использование  SQL Server Failover Cluster Instance невозможно.

  2. AWS не поддерживает свободный переход IP-адресов между серверами. Windows не сможет сама переместить клиентский адрес доступа на новую ноду при переключении между нодами.

  3. Требуется повысить уровень отказоустойчивости при авариях.

  4. Убедится, что все клиентские приложения на должном уровне поддерживают подключение к кластеру баз данных в новой архитектуре.

  5. Использовать свои лицензии на SQL Server.

Лицензирование

Политика Microsoft в части лицензирования баз данных в облаке довольно сложная.

Я бы выделил три возможных варианта для AWS:

  1. Для компаний с большим бюджетом дополнительные соглашения с Microsoft позволяют запускать виртуальные машины с SQL Server в облаке без особых ограничений. Вы можете запустить новую Windows VM, установить SQL и использовать без каких дополнительных манипуляций.

  2. AWS предоставляет возможность запустить Windows VM с предустановленным SQL Server. При этом оплата производиться по фактическому использованию. К примеру один сервер с 512 Gb RAM и 64 CPU обойдется примерно в $23000/месяц.

  3. Использовать собственные лицензии SQL Server в облаке AWS.

 

Для нас был приемлем только третий вариант:

  • SQL Server должен запускаться на выделенном физическом сервере. Звучит глупо.. облако.. физический сервер, но AWS поддерживает такую возможность.

 

 

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

  • AWS не позволит использовать публичные образы Windows для запуска VM на выделенном сервере. Потребуется создать собственный образ Windows VM собственными силами с помощью Hyper-V или VMWare, а затем экспортировать этот образ в AWS. Образ должен содержать собственную лицензию Windows и активироваться собственными KMS.

  • AWS не поддерживает автоматическое восстановление при аварии для таких виртуальных машин. Если физический сервер умирает вы должны перевести виртуальные машины на новый сервер самостоятельно.

При построении образа потребуется установить соответствующие драйверы для работы в AWS - драйвер хранилища и сетевой драйвер.

 

Выбор HADR архитектуры

Учитывая ограничения AWS на общее сетевое хранилище, было решено использовать SQL Server AlwaysOn.

Основные достоинства:

  1. Каждая нода кластера содержит собственную физическую копию данных. При повреждении страниц баз данных на одной ноде они могут восстановлены с других нод.

  2. Процесс фейловера занимает всего несколько секунд. В отличие от SQL FCI, нет необходимости завершать основной процесс базы данных и запускать его на новом сервере. Фейловер в SQL FCI обычно требовал 5 минут из-за агрессивности клиентских приложений.

  3. Возможность перенести нагрузку резервного копирования на другие ноды.

Недостатки:

  1. Двойной коммит - все синхронные ноды должны зафиксировать коммит одновременно с мастер нодой. В результате, производительность UPDATE\DELETE\INSERT операций в AlwaysOn ниже, чем в SQL FCI.

  2. Восстановление AlwaysOn ноды с нуля требует значительно большего времени, чем восстановление ноды в SQL FCI, т.е. необходимо восстановить все базы данных.

 

Невозможность перемещения IP адреса между нодами средствами Windows также накладывает ограничения на целевую архитектуру:

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

  2. Каждая нода должна иметь только один сетевой интерфейс для каждой подсети. Если требуется два интерфейса - расположите их в разных подсетях. Это позволит избежать проблемы, когда Windows Failover Cluster пытается активировать клиентский IP адрес на ошибочном сетевом интерфейсе.

 

Принимая во внимание рекомендации по расположению серверов баз данных в разных зонах получаем следующую архитектуру:

 

Две синхронные реплики в регионе us-east-1. Одна асинхронная реплика в us-west-2. Синхронные реплики позволяют защититься от аварий на уровне одного датацентра (на самом деле не так уж и редки). Асинхронная реплика страхует на случай аварии на уровне региона - но это уже на случай серьезного катаклизма, при котором автоматическое восстановление работы сайта невозможно - потребуется ручной перевод трафика в другой регион.

 

Выбор типа виртуальной машины

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

  1. I3 - наибольший инстанс имеет 512 Gb RAM и 64 CPU. Дополнительно имеется 16Tb локальных быстродействующих SSD, которые могут быть использованы для tempdb и buffer pool extension.
    После ряда болезненных экспериментов мы пришли к выводу, что этот тип для нас не подходит. Вроде как там используется устаревший гипервизор, который тратит слишком много ресурсов на поддержку VM. Например, под большой нагрузкой утилизация CPU на физическом сервер была в 2 раза больше, чем внутри виртуальной машины.

  2. X1E - один из самых новых типов. Наибольший инстанс имеет 4096 Gb RAM и 128 CPU. Работает просто отлично, но цена…

  3. R4 - наибольший инстанс имеет 512 Gb RAM и 64 CPU. Приемлемая цена и хорошая производительность. Используется новая версия гипервизора с малыми издержками на виртуализацию.

 

При выборе размера инстанса необходимо учитывать ограничения на скорость доступа к сети и скорость доступа к хранилищу. Чем больше инстанс - тем выше лимиты.

Тип инстанса

Максимальная пропускная способность хранилища (MB/s, 128 KB I/O)

Максимум IOPS (16 KB I/O)

i3.8xlarge

875

32,500

i3.16xlarge

1,750

65,000

r4.8xlarge

875

37,500

r4.16xlarge

1,750

75,000

x1e.16xlarge

875

40,000

x1e.32xlarge

1,750

80,000

 

Конфигурация хранилища

AWS Elastic Block Storage позволяет выбрать из нескольких видов хранилища, каждый из который имеет свои лимиты и особенности.

 

Solid-State Drives (SSD)

Hard disk Drives (HDD)

Volume Type

General Purpose SSD (gp2)*

Provisioned IOPS SSD (io1)

Throughput Optimized HDD (st1)

Cold HDD (sc1)

Max. IOPS**/Volume

10,000

(when volumes size is > 3333Gb)

32,000

500

250

Max. Throughput/Volume

160 MiB/s

500 MiB/s***

500 MiB/s

(40 MB/s per TiB)

250 MiB/s

Use case

Database files

Database files

Database backups

<not being used>

 

Во-первых, нужно забыть стандартную рекомендацию про создание отдельных томов для данных, логов, tempdb.

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

В-третьих, чтобы получить максимальную производительность необходимо использовать RAID0 из правильно подобранного числа томов.

RAID0 не обеспечивает защиты данных за счет дупликации, но обеспечивает максимальную производительность за счет записи данных в разные тома.

К примеру наша конфигурация для r4.16xlarge сервера:

  1. Операционная система - C:\ - 300Gb. Тип тома - gp2. Стоимость в месяц $27.

  2. Базы данных с логами, tempdb - X:\ - 34Tb - десять томов gp2, каждый 3400Gb, объединенных в RAID0 средствами Windows Storage Spaces. Стоимость в месяц $3400.
    Как вышли на эту конфигурацию:

    1. Инстанс этого типа имеет лимит в 1750MB/s и 75000 IOPS.

    2. Один том gp2 имеет лимит в 160MB/s и до 10000 IOPS.

    3. Чтобы избежать проседания производительности размер каждого тома должен быть не менее 3333 Gb.

    4. Десять томов gp2, объединенных в RAID0 позволяют максимально утилизировать доступный лимит для инстанса и обеспечить максимальную пропускную способность.

Такого же эффекта можно добиться с помощью четырех io1 томов 20000 IOPS в каждом. Размер при этом не имеет значения. Но такая конфигурация обойдется значительно дороже при меньшей емкости. Например, 4 тома по 3000 Gb обойдутся в $6700 в месяц.

  1. Бэкапы - S:\ - 4Tb - один том st1. Стоимость в месяц $180 (в два раза дешевле gp2, при хорошей производительности для бэкапов).

 

Бэкапы баз данных

Мы пробовали много разных конфигураций и в итоге остановились на наиболее эффективной для нас.

  1. Бэкап базы данных выполняется на главной ноде на “локальный” диск S:\. Диск является EBS томом, поэтому беспокоится за его сохранность не стоит - том можно переключить на другой сервер даже если виртуальная машина полностью потеряна. Локальный том хранит бэкапы за последние 7 дней.

  2. По субботам полный бэкап загружается в AWS S3 на долговременное хранение. Для файлов изначально устанавливается тип хранилища “нечастый доступ”, а по истечение 45 дней файлы автоматически выгружаются в AWS Glacier. В итоге долговременное хранилище большого объема файлов выходит относительно дешево.

 

Клиентские приложения

В процессе работы над проектом мы осознали, что используемый jdbc-драйвер не сможет эффективно работать в новой конфигурации, т.к. он не поддерживает клиентские точки доступа с несколькими IP-адресами (multi-subnet cluster). Кстати, платформа 1С также не поддерживает такую конфигурацию в чистом виде - мне не удалось заставить сервер 1С стабильно подключаться к AlwaysOn кластеру с несколькими IP-адресами. Хотя, с определенными оговорками, есть вариант как это решить.

Суть проблемы в том, что для используемого доменного имени DNS сервер возвращает два (или больше) IP адреса вместо одного. Но только один адрес, принадлежащий мастер ноде, является активным.

Для решения проблемы нужно всего лишь добавить параметр “MultiSubnetFailover=True” в строку соединения. Но не всегда есть возможность сделать это.

Варианты решения, если поменять строку соединения невозможно:

  1. Windows Failover Cluster имеет параметр, который позволяет обновлять IP адрес в DNS и регистрировать только один адрес, который активен в данный момент. Минусы:

    1. в процесс фейловера вовлечен дополнительный участник (DNS сервер).

    2. DNS кэш на клиентских серверах обновляется не так часто.

    3. Дополнительные сложности возникнут если клиенты на Linux.

В результате сложно ожидать восстановления нормальный работы приложений быстрее чем через 5-10 минут после фейловера.

  1. Использовать один из сервисов AWS - Network Load Balancer

    1. NLB корректно определяет активную ноду и меняет DNS запись.

    2. Нормально работает в Linux.

    3. Проблема с DNS кэшем все равно присутствует.

Время на восстановление также 5-10 минут.

  1. Использовать решения типа HAProxy

    1. С точки зрения клиента IP адрес не меняется.

    2. Время восстановления после фейловера может приблизится к 30-60 секундам.

    3. Для построения реальной отказоустойчивости на уровне HAProxy требуется построение довольно сложной архитектуры. Один из вариантов: два HAProxy + AWS Network Load Balancer. В этом случае сбой на одном HAProxy не приведет к полной потере доступа к базе данных.

 

Непосредственная миграция

Одним из условий проекта была возможность быстрого возврата в локальный датацентр при проблемах в AWS, поэтому было решено использовать AlwaysOn как средство миграции баз данных. Хотя технически это можно назвать обычным процессом фейловера между нодами, расположенными в разных датацентрах.

 

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

Затем веб-сайт переводится в оффлайн режим, производится фейловер базы данных в AWS и AlwaysOn переключается обратно в асинхронный режим. В этом время, трафик переключается на приложения в AWS, которые уже подключены в новой мастер ноде.
Суммарное время даунтайма - 6 минут!

AWS базы данных миграция

См. также

Оптимизация нагрузки на ЦП сервера СУБД используя типовые индексы

HighLoad оптимизация Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

Анализ простого плана запроса. Оптимизация нагрузки на ЦП сервера СУБД используя типовые индексы.

13.03.2024    2957    spyke    26    

42

Быстродействие типовой 1С

HighLoad оптимизация Платформа 1С v8.3 Бесплатно (free)

Оказывается, в типовых конфигурациях 1С есть, что улучшить!

13.03.2024    5094    vasilev2015    19    

37

Анализируем SQL сервер глазами 1С-ника

HighLoad оптимизация Инструменты администратора БД Платформа 1С v8.3 Конфигурации 1cv8 Абонемент ($m)

Обработка для простого и удобного анализа настроек, нагрузки и проблем с SQL сервером с упором на использование оного для 1С. Анализ текущих зааросов на sql, ожиданий, конвертация запроса в 1с и рекомендации где может тормозить

1 стартмани

15.02.2024    7624    158    ZAOSTG    67    

96

Удаление строк из таблицы значений различными способами с замером производительности

HighLoad оптимизация Платформа 1С v8.3 Конфигурации 1cv8 Абонемент ($m)

Встал вопрос: как быстро удалить строки из ТЗ? Рассмотрел пять вариантов реализации этой задачи. Сравнил их друг с другом на разных объёмах данных с разным процентом удаляемых строк. Также сравнил с выгрузкой с отбором по структуре.

09.01.2024    5955    doom2good    48    

63

Опыт оптимизации 1С на PostgreSQL

HighLoad оптимизация Бесплатно (free)

При переводе типовой конфигурации 1C ERP/УТ/КА на PostgreSQL придется вложить ресурсы в доработку и оптимизацию запросов. Расскажем, на что обратить внимание при потерях производительности и какие инструменты/подходы помогут расследовать проблемы после перехода.

20.11.2023    8844    ivanov660    6    

76

ТОП проблем/задач у владельцев КОРП лицензий 1С на основе опыта РКЛ

HighLoad оптимизация Бесплатно (free)

Казалось бы, КОРП-системы должны быть устойчивы, быстры и надёжны. Но, работая в рамках РКЛ, мы видим немного другую картину. Об основных болевых точках КОРП-систем и подходах к их решению пойдет речь в статье.

15.11.2023    5093    a.doroshkevich    20    

72

Начните уже использовать хранилище запросов

HighLoad оптимизация Запросы

Очень немногие из тех, кто занимается поддержкой MS SQL, работают с хранилищем запросов. А ведь хранилище запросов – это очень удобный, мощный и, главное, бесплатный инструмент, позволяющий быстро найти и локализовать проблему производительности и потребления ресурсов запросами. В статье расскажем о том, как использовать хранилище запросов в MS SQL и какие плюсы и минусы у него есть.

11.10.2023    16163    skovpin_sa    14    

98
Комментарии
В избранное Подписаться на ответы Сортировка: Древо развёрнутое
Свернуть все
1. grumagargler 723 30.07.18 00:09 Сейчас в теме
Подскажите пожалуйста, в статье описаны особенности и сложности перехода, но непонятно зачем вы это делали?
2. Aleksey.Bochkov 3660 30.07.18 02:55 Сейчас в теме
(1) Задача была перевести все приложения в облако, для того, чтобы ускорить развитие бизнеса в конечном счете. В своем датацентре требуется минимум пара недель для получения нового сервера, в облаке же это вопрос пары минут.
JohnyDeath; +1 Ответить
3. mad375 30.07.18 05:15 Сейчас в теме
Было очень интересно, спасибо
4. ihtiking 01.08.18 12:45 Сейчас в теме
Дороговато выходит.... После перехода Вы почувствовали изменения к лучшему с точки зрения бизнеса или с точки зрения ИТ ?
5. Aleksey.Bochkov 3660 03.09.18 23:05 Сейчас в теме
(4) По словам CTO, в долговременной перспективе расходы на инфраструктуру после перехода в AWS ожидаются на 10-20% меньше расходов на собственный датацентр.
Изменения к лучшему заметили практически на всех уровнях:
- цикл разработки новой функциональности ускорился
- стало легче реагировать на скачки трафика (сервера приложений масштабируются горизонтально в течение пары минут)
- проще устранять проблемы
- и, как бы странно это ни звучало, сайт работает существенно быстрее в AWS.
6. kiruha 388 15.10.18 11:05 Сейчас в теме
glassdoor.com из США обратился во франч 1С в России для перевода дата центра ?
7. Aleksey.Bochkov 3660 15.10.18 20:14 Сейчас в теме
(6) я работаю в этой компании. Живу в Сан Франциско.
AQR84; Krio2; kiruha; +3 Ответить
8. zuxelzz 05.04.20 10:32 Сейчас в теме
Алексей, спасибо за статью, очень интересно.
Подскажите, пожалуйста, один момент:
"Во-первых, нужно забыть стандартную рекомендацию про создание отдельных томов для данных, логов, tempdb."

В связи с чем именно вам пришлось отказаться от этих рекомендаций? Возможно, в тексте это было написано, но, тогда значит, я не смог это понять :)
Это было связано с какими-то особенностями вашей архитектуры или просто при работе в AWS эти рекомендации не стоит принимать во внимание? Или их вообще не стоит принимать во внимание? :)
спасибо)
9. Aleksey.Bochkov 3660 06.04.20 01:46 Сейчас в теме
(8) Все, конечно, зависит от конкретной нагрузки и требований к системе, но, как мне кажется во многих случая это будет оправдано.
В AWS применяются жесткие лимиты пропускной способности как на уровне виртуальных машин, так и на стороне хранилища данных.
Например, для самых больших размеров более менее новых типов инстансов лимит пропускной способности к хранилищу составляет 2350 мегабайт в секунду.
В то же время, один GP2 том пропускает не более 250 мегабайт в секунду, а IO1 том - не более 500 Мб/с (можно до 1 Гб/с увеличить, но очень дорого).
Таким образом, для наиболее эффективного использования всей пропускной способности нужно не менее 9-10 томов GP2 или 5 томов IO1 на каждый сервер.
Если не использовать RAID0, то придется создавать 5-10 дисков и разносить нагрузку равномерно по ним, что в нашей ситуации практически нереально.
Можно использовать RAID0 и создать 2-3 логических диска, но все равно каждый из них будет ограничен пропусной способностью в 500-1000 мегабайт в секунду. Когда система испытывает повышенную нагрузку это становится узким местом.
Для нас самым оптимальным вариантом является создание единственного логического диска который состоит из 5-10 томов в RAID0 и обеспечивает максимальную пропускную способность в 2350 Мб/с. Это позволяет сгладить эффект от неожиданных пиков нагрузки.
(лимиты пропускной способности были увеличены после написания этой статьи)
Оставьте свое сообщение