|
Размещение БД в оперативной памяти с асинхронной записью на диск(без потери данных)
|
|||
---|---|---|---|
#18+
Пишу архитектуру кластерного решения с одним из режимов работы в оперативной памяти. В связи с чем провожу ревизию знаний и возникло несколько вопросов. Сначала приведу краткое описание, а затем задам список вопросов. Рассмотрим следующую архитектуру. Базу средних размеров наверное до 300 ГБ полностью помещаем в оперативную память(виртуальный диск). Плюсом такого решения будет ускорения работы, минусом – потеря данных, что неприемлемо. Далее берем и включаем асинхронный always on на сервер с физическим диском. Таким образом у нас имеется копия БД на диске с небольшим отставанием. Как показывает практика(для большинства oltp ИТ систем) без учета пересчета статистики или индексов среднее оставание составляет 2-3 секунды. Можно ли исключить потерю данных за эти 2-3 секунды? - Можно! Необходима интеграция с приложением. Реализуется простейшая система логирования транзакций на триггерах. Например в таблицу пишутся ссылки на документы, тип операции(I,U,D), доп информация(например сумма документа и т.п.). Далее job непрерывно работающий сравнивает две таблицы – на сервере источнике с оперативной памятью и на сервере приемнике с диском и апдейтит статус транзакций(разумеется в источнике) которые уже записаны на диск. Таким образом мы оперативно получаем дельту не записанных на диск транзакций и статус транзакций когда они записаны на диск. Важный момент, что приложение должно делить транзакции на важные и нет. То есть на те которые можно потерять и на те которые нельзя. Далее приложение для важных транзакций передает фокус управления только тогда, когда они записаны на диск. Для транзакций не важных можно передавать фокус моментально. Под фокусом управления подразумевается не только активизация окна диалога приложения но и выгрузка во внешние базы, распечатка документов и т.п. Передача фокуса может быть реализована различным способами, например сокет сервер опрашивает статус таблицы логирования(запрос таблицы транзакций на севрерах) их апдейтит и передает сообщения на сокет клиент в приложение, которое разрешает дальнейшие действия. Если мы считаем что все транзакции важны и фокус всегда ожидает статуса(ЗаписаноНаДиск) то в этом случае у нас вообще исключена потеря данных! (Если кто то считает по другому просьба обосновать) При использовании такого подхода у нас уменьшается время блокировок, потому как время транзакций уменьшается(ожидание статуса идет вне транзакции,уже после ее фиксации). Для большинства транзакций просто уменьшается время выполнения потому как их в случае непредвиденного выключения сервера(что в последнее время редкость) их можно воспроизвести в системе(то есть их можно спокойно потерять), тем более всегда есть лог незакомиченных транзакций(номер документа, время, пользователь, например сумма) который можно писать на физический диск. Если считать среднее время рассинхронизации нод - 2 сек. То за это время пользователь даже осмыслить ничего не успеет. Например можно разрешить передавать фокус управления приложения пользователю после проведения документа заказа, но печатать(отправлять на печать) его позволять только после фиксации на диске. На самом деле для подавляющего количества операций можно не дожидаться фиксации на диске. Что приведет к существенному уменьшению времени отклика от ИТ системы. В случае размещения базы в памяти у нас ускоряются не только операции вставки и изменений но и мы гарантированно всегда обращаемся к данным в памяти. В этом случае вообще необходимо запретить СУБД обращаться к кешу данных в оперативной памяти, потому как это будет двойная работа.(если это возможно, будет один из вопросов) Плюсы этой системы я уже приводил а минусы тоже существуют. Обслуживание БД, переиндексация и пересчет статистики могут привести к большому времени рассинхронизации – из чего следует, что их необходимо проводить в режиме прямого коннекта к БД.(необходимо автоматизировать режим реконнекта) Перезагрузка сервера должна предварять процедура остановки БД и ожидания (пара секунд) нулевого времени рассинхронизации. Короче говоря, процедуру перезагрузки необходимо также автоматизировать. После перезагрузки сервера необходимо вычитать всю БД в память, это тоже время(пару минут,300 ГБ). В общем, перезагрузка сервера будет занимать немного больше времени и требовать доп. регламента. В самом приложении, тажке нужна небольшая адаптация(система логирования и система семафоров). С точки зрения надежности мы полагаемся на надежный транспорт always on. Надежность работы памяти в современных серверах также обеспечивается механизмами про которые я здесь не буду расписывать. По сути эффективность системы будет определятся размером БД(для супер больших БД памяти не напасешься), количеством незапланированных перезагрузок СУБД(надежность ЦОД-а в первую очередь), а также средним временем рассинхронизации нод. А теперь вопросы. Вы реализовывали подобную схему? Кто ни будь размещал БД в память, проводил замеры? Можно поделиться результатами? Кто ни будь размещал БД приемник в always on в память, с целью горизонтального масштабирования? Каковы результаты?(то есть описанная ситуация но наоборот) Можно ли, и какими настройками запретить СУБД обращаться к кешу данных в оперативной памяти? (заставить считывать все страницы напрямую с виртуального диска) ... |
|||
:
Нравится:
Не нравится:
|
|||
19.07.2020, 15:07 |
|
Размещение БД в оперативной памяти с асинхронной записью на диск(без потери данных)
|
|||
---|---|---|---|
#18+
Ну совсем детали я не стал расписывать. Например это могут быть два инстанса на одном физическом сервере для того что бы атач базы можно было быстро сделать в оперативную память. Не знаю к слову, можно ли обмануть систему и писать always on из одной БД в другую на этом же сервере? ... |
|||
:
Нравится:
Не нравится:
|
|||
19.07.2020, 15:37 |
|
Размещение БД в оперативной памяти с асинхронной записью на диск(без потери данных)
|
|||
---|---|---|---|
#18+
Имхо 1) Если СУБД ненагруженная (пользователь легко ждет 2 сек.), то и затевать не стоит. Выигрыш во времени не компенсируется усложнением архитектуры 2) Если СУБД высоконагруженная, то она сама выкачает в кэш все таблицы и все прочее, лишь бы памяти хватило ... |
|||
:
Нравится:
Не нравится:
|
|||
19.07.2020, 18:55 |
|
Размещение БД в оперативной памяти с асинхронной записью на диск(без потери данных)
|
|||
---|---|---|---|
#18+
Узким местом станут триггера. Смысл "мутить"? Если "ради искусства",- ну может быть. Я искал бы алтернативный инструмент. PS Если это не своя "база" а чья-то стандартная - проверьте, А НОРМАЛЬНО ли она будет функционировать со всеми навешанными триггерами?,- у меня был опыт (делал логирование действий пользователей), когда навешанный триггер привёл к неправильной логике работы,- остался лог глобальных изменений а вот от конкретики пришлось отказаться (ну, компромисс, да). PPS Если "клиент" может "ждать" 2-3 секунды,- то какая же это "высоконагруженная" база. Тогда надо задумываться о правильности архитектуры базы, серверной части и клиентских приложений. А так это выглядит как "второе дно у корзинки с яйцами",- но ручка-то тоже может оборваться Оправдание только одно,- вложиться в сервак с терабайтом оперативы лет десять стоит дешевле труд спеца IMHO, конечно... Есличо - поправьте... ... |
|||
:
Нравится:
Не нравится:
|
|||
19.07.2020, 23:46 |
|
Размещение БД в оперативной памяти с асинхронной записью на диск(без потери данных)
|
|||
---|---|---|---|
#18+
МуМу, Мне вот не понятны цели всего этого. Вроде бы если вы можете себе позволить поместить 300 ГБ в оперативку + 2 секунды(!) ожидания для вас не критичны, то почему не купить ssd вместо памяти - дешевле, а результат тот же. Вот это вот "приложение должно делить транзакции на важные и нет" оно и есть самоцель или оно обусловлено какими то целями? Ради искусства то оно конечно да... ... |
|||
:
Нравится:
Не нравится:
|
|||
20.07.2020, 00:55 |
|
Размещение БД в оперативной памяти с асинхронной записью на диск(без потери данных)
|
|||
---|---|---|---|
#18+
2 секунды - не критично? Хм, в HFT за это время среднестатистический трейдинговый бот успеет вас продать, купить, и потом еще раз продать, но уже дороже. Я бы скорее подождал пару-тройку лет, пока Optane станет достаточным мейнстримом. ... |
|||
:
Нравится:
Не нравится:
|
|||
20.07.2020, 04:26 |
|
Размещение БД в оперативной памяти с асинхронной записью на диск(без потери данных)
|
|||
---|---|---|---|
#18+
МуМу, не сосем понятно. Если Вам требуется база реального времени, то MS SQL нельзя использовать, надо подобрать другую систему. ... |
|||
:
Нравится:
Не нравится:
|
|||
20.07.2020, 11:27 |
|
Размещение БД в оперативной памяти с асинхронной записью на диск(без потери данных)
|
|||
---|---|---|---|
#18+
МуМу, авторВ случае размещения базы в памяти у нас ускоряются не только операции вставки и изменений но и мы гарантированно всегда обращаемся к данным в памяти. Ничего не ускорится, т.к. сиквел уже кеширует все данные, при достаточном объеме памяти. Данные уже находятся в памяти и с диском общаются в фоновом режиме. Для подготовки базы к "горячей" работе достаточно просканировать все таблицы и сканировать из с какой-то периодичностью для поддержания кэша в дальнейшем. ... |
|||
:
Нравится:
Не нравится:
|
|||
20.07.2020, 11:31 |
|
Размещение БД в оперативной памяти с асинхронной записью на диск(без потери данных)
|
|||
---|---|---|---|
#18+
Владислав Колосов МуМу, авторВ случае размещения базы в памяти у нас ускоряются не только операции вставки и изменений но и мы гарантированно всегда обращаемся к данным в памяти. Ничего не ускорится, т.к. сиквел уже кеширует все данные, при достаточном объеме памяти. Данные уже находятся в памяти и с диском общаются в фоновом режиме. Для подготовки базы к "горячей" работе достаточно просканировать все таблицы и сканировать из с какой-то периодичностью для поддержания кэша в дальнейшем. Мой опыт подсказывает, что это несколько спорное заявление, основанное на весьма оптимистичном взгляде на скуль PS Ну да, да,- конечно все мы помним про lock pages in memory PPS Напоминаю: организатор срача пытается выгадать время ещё и на сбросе данных на диск. Тут он немного прав, за исключением того что в реалиях данные кидаются не на диски как таковые а в энергонезависимую память дискового контроллера/стойки и "комитятся" тут же,- до "физической" (ха!-ха!!-ха!!!) записи. Потому задержка там копеечная,- и сэкономить особо не удастся. ------------------------------------------- Владислав Колосов МуМу, не сосем понятно. Если Вам требуется база реального времени, то MS SQL нельзя использовать, надо подобрать другую систему. Поддерживаю, в общем-то. Но с другой стороны "а почему бы и нет?" ,- особенно учитывая "те самые" упомянутые две секунды (на ожидание со стороны клиента/приложения) . А если автор пишет какую-нибудь систему резервирования авиабилетов (или "горящих" туров),- то это не сильно критично,- из-за отмены заказа вторая волна короновируса не придёт,- и я бы тоже выбрал скуль (ну, хотя бы потому что это единственное в чём я могу говнокодить ). Я только бы посоветовал писать на основной сервак а читать (подтверждение) с зеркала (при переключении ролей "основной - зеркало" - соответствующим образом переключаться обратно) , ну для риалтайма 24 * 7 - три сервака и робинраунд (что бы один можно было вывести безболезненно на профилактику, да и датацентры иногда "падают", увы). --------------------------------------------- Это, есличо - поправьте ;) ... |
|||
:
Нравится:
Не нравится:
|
|||
20.07.2020, 15:23 |
|
Размещение БД в оперативной памяти с асинхронной записью на диск(без потери данных)
|
|||
---|---|---|---|
#18+
SIMPLicity_, Оракл может "взлететь", поскольку не блокировочник. Вопрос стоимости такой системы. ... |
|||
:
Нравится:
Не нравится:
|
|||
20.07.2020, 17:01 |
|
Размещение БД в оперативной памяти с асинхронной записью на диск(без потери данных)
|
|||
---|---|---|---|
#18+
... |
|||
:
Нравится:
Не нравится:
|
|||
20.07.2020, 17:16 |
|
Размещение БД в оперативной памяти с асинхронной записью на диск(без потери данных)
|
|||
---|---|---|---|
#18+
Владислав Колосов Оракл может "взлететь", поскольку не блокировочник. SQL уже 15 лет как не блокировочник. ... |
|||
:
Нравится:
Не нравится:
|
|||
20.07.2020, 17:32 |
|
Размещение БД в оперативной памяти с асинхронной записью на диск(без потери данных)
|
|||
---|---|---|---|
#18+
msLex, за счет tempdb или inmemory? Это цирк еще тот, тем более для реального времени. ... |
|||
:
Нравится:
Не нравится:
|
|||
20.07.2020, 17:56 |
|
Размещение БД в оперативной памяти с асинхронной записью на диск(без потери данных)
|
|||
---|---|---|---|
#18+
Владислав Колосов msLex, за счет tempdb или inmemory? Это цирк еще тот, тем более для реального времени. За счёт rcsi ... |
|||
:
Нравится:
Не нравится:
|
|||
20.07.2020, 18:45 |
|
Размещение БД в оперативной памяти с асинхронной записью на диск(без потери данных)
|
|||
---|---|---|---|
#18+
msLex, а где rcsi данные хранит, разве не в tempdb? Надо рулбуки перечитать... ... |
|||
:
Нравится:
Не нравится:
|
|||
20.07.2020, 18:59 |
|
Размещение БД в оперативной памяти с асинхронной записью на диск(без потери данных)
|
|||
---|---|---|---|
#18+
Какая-то крайне странная идея у топикстартера... Почему не использовать in-memory + always on? ... |
|||
:
Нравится:
Не нравится:
|
|||
20.07.2020, 19:07 |
|
Размещение БД в оперативной памяти с асинхронной записью на диск(без потери данных)
|
|||
---|---|---|---|
#18+
Критик, inmemory вроде бы плохо дружит с AlwaysOn? ... |
|||
:
Нравится:
Не нравится:
|
|||
20.07.2020, 19:31 |
|
Размещение БД в оперативной памяти с асинхронной записью на диск(без потери данных)
|
|||
---|---|---|---|
#18+
Владислав Колосов не сосем понятно. Если Вам требуется база реального времени, то MS SQL нельзя использовать, надо подобрать другую систему. Вопрос про ускорение обработки транзакций, ну, или про повышение производительности без перехода на распределённую систему. "Системы реального времени" - это не "быстрые системы", между этими двумя понятиями нет ничего общего. Ещё был задан интересный вопрос "как не терять транзакции при сбое системы", но он не имеет отношения к варианту "сервер/базы в RAM", он актуален и для обычной типовой системы. ... |
|||
:
Нравится:
Не нравится:
|
|||
20.07.2020, 20:14 |
|
Размещение БД в оперативной памяти с асинхронной записью на диск(без потери данных)
|
|||
---|---|---|---|
#18+
Не удивлюсь, что это очередная версия "а как бы нам усовершенствовать нашу 1С" , на которой строят в реальном времени разнообразные (неоптимизированные!) отчёты. Причём отчёты строят из примитивных конструкторов (или вообще эти отчёты натыкивают мышками в Access "налету")... Данные в скуль, кстати, можно лить быстро (не супер моментально, но всё-таки достаточно быстро), просто это делать относительно равномерным потоком. Хотя, конечно, кому-то и тысячи записей в секунду будет "так себе задачка" ;) ... |
|||
:
Нравится:
Не нравится:
|
|||
20.07.2020, 21:31 |
|
Размещение БД в оперативной памяти с асинхронной записью на диск(без потери данных)
|
|||
---|---|---|---|
#18+
Коллеги, спасибо за живой интерес к данному вопросу. Просьба к данной теме не относится слишком серьезно, это скорее логический эксперимент. Тем не менее, интуитивно я уверен, что для небольшого количества систем это вариант в разы уменьшить количество блокировок в системе с относительно небольшими трудозатратами(за счет уменьшения времени транзакций). Буду рад если кому то эта информация пригодится. Сразу задам единственный вопрос касающийся практической стороны вопроса. Кто ни будь знает(догадывается) оптимальные настройки для работы БД полностью в оперативной памяти? Какая может быть(возможно) практическая польза. Компания, в которой я работаю активно использует always on для построения кластеров для горизонтального масштабирования. Также знаю, что некоторые участники этого форума используют в подобных целях. Как вы знаете транспортировке данных c помощью always-on возникает некоторая задержка(в синхронном в том числе тоже). Иногда она не важна и запрос можно перенаправлять на доп. ноду, игнорируя запоздалость данных, а иногда это важно и необходимо дожидаться синхронности с помощью семафоров. Уменьшение времени синхронизации для некоторых систем становится важной задачи. Размещение ноды в памяти позволяет уменьшить время рассинхронизации ,в этом случае можно и синхронный режим(alwaya on) включать а в асинхронном писать на диск. Теперь просто размышления на тему. Как правильно отметил alexeyvg , вопрос о сохранности данных стоит не только для размещенных в памяти данных но и для классических дисковых хранилищ. Независимо от моделей, принцип остается один – контроллер пишет во внутренний кеш(память), затем порциями записывает на диск. За счет укрупнения происходит ускорение(не буду вдаваться в детали), но за счет этого происходит риск потери части данных. Все сводится к записи порции данных из кеша на диск в случае аварии. Для некоторых банковских систем подобное кеширование осознанно отключают. То есть данные записанные в БД немедленно записываются на диск(происходит замедление, увеличение времени отклика). Но многие данный факт скромненько замалчивают так как сами в жизни ни разу с этим не сталкивались, либо последствия были не существенны. Владислав Колосов , вы видимо подзабыли что условие большего обьема(да хоть бы и в три раза) памяти по отношению к БД вовсе не гарантирует нам того что она целиком будет в кеше. Есть запросы когда оптимизатору нужно выбрать вариант долгий и тяжелый с точки зрения ЦПУ и низкого использования памяти вариант типа вложенных циклов(nested loops).Либо оптимизатору выбрать затратный с точки зрения памяти типа хеш джоин. Так вот такие запросы выполняемый многочисленно в единицу времени могут постоянно вытеснять память(page life expectancy – падает) и результатом этого будет нахождение в памяти, например, не более чем 30% от БД. Понятно что это неоптимальные запросы и нужно их оптимизировать но это жизнь и наблюдал это многократно. А вообще, еще есть мысли реализовать отдельное кластерное решение полностью работающая синхронно в памяти на нескольких географически распределенных нодах с асинхронной записью на диск. Решение это не на базе always -on. Как вы считаете насколько такая система жизненно способна с точки зрения надежности? Каковы риски потери данных(не синхронной дельты между памятью и диском)? ... |
|||
:
Нравится:
Не нравится:
|
|||
21.07.2020, 11:43 |
|
Размещение БД в оперативной памяти с асинхронной записью на диск(без потери данных)
|
|||
---|---|---|---|
#18+
PizzaPizza Мне вот не понятны цели всего этого. Вроде бы если вы можете себе позволить поместить 300 ГБ в оперативку + 2 секунды(!) ожидания для вас не критичны, то почему не купить ssd вместо памяти - дешевле, а результат тот же. а я вот взял и погуглил раз авторЛатентность доступа на чтение SSD весьма далека от латентности RAM в пару десятков нс. Латентность записи - пока есть свободные страницы для записи ещё ничего, а вот если свободных страниц нет - то привет. Латентность растёт крайне существенно. авторВ теории использовать можно. Самые быстрые SSD отстают от нормальной DDR4 примерно на порядок-два. ... |
|||
:
Нравится:
Не нравится:
|
|||
21.07.2020, 13:56 |
|
Размещение БД в оперативной памяти с асинхронной записью на диск(без потери данных)
|
|||
---|---|---|---|
#18+
МуМу Сразу задам единственный вопрос касающийся практической стороны вопроса. Кто ни будь знает(догадывается) оптимальные настройки для работы БД полностью в оперативной памяти? Какая может быть(возможно) практическая польза. вы никогда не получите от БД "работу в ОЗУ". Всё это абстракция через обвязки самой БД. Кеш ничего общего с вашей задумкой не имеет. ... |
|||
:
Нравится:
Не нравится:
|
|||
21.07.2020, 14:01 |
|
Размещение БД в оперативной памяти с асинхронной записью на диск(без потери данных)
|
|||
---|---|---|---|
#18+
МуМу, распределение памяти вполне себе регулируется средством Resource Governor, можно настроить так, что запросы не будут вытеснять кэш данных при достаточном объему оперативной памяти. ... |
|||
:
Нравится:
Не нравится:
|
|||
21.07.2020, 14:29 |
|
Размещение БД в оперативной памяти с асинхронной записью на диск(без потери данных)
|
|||
---|---|---|---|
#18+
Владислав Колосов Критик, inmemory вроде бы плохо дружит с AlwaysOn? у меня нет таких данных, если у вас есть - линканите, с удовольствием почитаю ... |
|||
:
Нравится:
Не нравится:
|
|||
21.07.2020, 14:50 |
|
Размещение БД в оперативной памяти с асинхронной записью на диск(без потери данных)
|
|||
---|---|---|---|
#18+
msLex Владислав Колосов msLex, за счет tempdb или inmemory? Это цирк еще тот, тем более для реального времени. За счёт rcsi Вы меня немного сбили с толку, проверил - tempdb используется при версионировании. Так что я верно написал, за счет tempdb, на которую тратятся ресурсы. ... |
|||
:
Нравится:
Не нравится:
|
|||
21.07.2020, 15:25 |
|
|
start [/forum/topic.php?fid=46&msg=39982254&tid=1685836]: |
0ms |
get settings: |
9ms |
get forum list: |
14ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
59ms |
get topic data: |
11ms |
get forum data: |
2ms |
get page messages: |
68ms |
get tp. blocked users: |
1ms |
others: | 15ms |
total: | 185ms |
0 / 0 |