![]() |
+7 (495) 229-0436 | ![]() |
shopadmin@itshop.ru | 119334, г. Москва, ул. Бардина, д. 4, корп. 3 | ![]() |
![]() |
![]() |
|
|
Oracle RAC. Общее описание. Часть 205.11.2009 13:35
Высоконагруженные сайты, доступность "5 nines". На заднем фоне (backend) куча обрабатываемой информации в базе данных. А что, если железо забарахлит, если вылетит какая-то давно не проявлявшаяся ошибка в ОС, упадет сетевой интерфейс? Что будет с доступностью информации? Из чистого любопытства я решил рассмотреть, какие решения вышеперечисленным проблемам предлагает Oracle. Последние версии, в отличие от Oracle 9i, называются Oracle 10g (или 11g), где g - означает "grid", распределенные вычисления. В основе распределенных вычислений "как ни крути" лежат кластера, и дополнительные технологии репликации данных (DataGuard, Streams). В этой статье в общих чертах описано, как устроен кластер на базе Oracle 10g. Называется он Real Application Cluster (RAC). Статья не претендует на полноту и всеобъемлемость, также в ней исключены настройки (дабы не увеличивать в объеме). Смысл - просто дать представление о технологии RAC.Статья не претендует на полноту и всеобъемлемость, также в ней исключены настройки (дабы не увеличивать в объеме). Смысл - просто дать представление о технологии RAC. Считаем, что кластер поднялся и все закрутилось.
Взаимодействие узлов. Cache-fusion.Много экземпляров БД, много дисков. Хлынули пользовательские запросы… вот они, клиенты, которых мы так ждали. =) Самым узким местом любой БД являются дисковый ввод-вывод. Поэтому все базы данных стараются как можно реже обращаться к дискам, используя отложенную запись. В RAC все так же, как и для single-instance БД: у каждого узла в RAM располагается область SGA (System Global Area), внутри нее находится буферный кэш (database buffer cache). Все блоки, некогда прочитанные с диска, попадают в этот буфер, и хранятся там как можно дольше. Но кэш не бесконечен, поэтому, чтобы оценить важность хранимого блока, используется TCA (Touch Count Algorithm), считающий количество обращений к блокам. При первом попадании в кэш, блок размещается в его cold-end. Чем чаще к блоку обращаются, тем ближе он к hot-end. Если же блок "залежался", он постепенно утрачивает свои позиции в кэше и рискует быть замещенным другой записью. Перезапись блоков начинается с наименее используемых. Кэш узла - крайне важен для производительности узлов, поэтому для поддержания высокой производительности в кластере кэшем нужно делиться (как завещал сами-знаете-кто). Блоки, хранимые в кэше узла кластера, могут иметь роль локальных, т.е. для его собственного пользования, но некоторые уже будут иметь пометку глобальные, которыми он, поскрипев Технология общего кэша в кластере называется Cache-fusion (синтез кэша). CRS на каждом узле порождает синхронные процессы LMSn, общее их название как сервиса - GCS (Global Cache Service). Эти процессы копируют прочитанные на этом экземпляре блоки (глобальные) из буферного кэша к экземпляру, который за ними обратился по сети, и также отвечают за откат неподтвержденных транзакций. На одном экземпляре их может быть до 36 штук (GCS_SERVER_PROCESSES). Обычно рекомендуется по одному LMSn на два ядра, иначе они слишком сильно расходуют ресурсы. За их координацию отвечает сервис GES (Global Enqueue Service), представленный на каждом узле процессами LMON и LMD. LMON отслеживает глобальные ресурсы всего кластера, обращается за блоками к соседним узлам, управляет восстановлением GCS. Когда узел добавляется или покидает кластер, он инициирует реконфигурацию блокировок и ресурсов. LMD управляет ресурсами узла, контролирует доступ к общим блоками и очередям, отвечает за блокировки запросов к GCS и управляет обслуживанием очереди запросов LMSn. В обязанности LMD также входит устранение глобальных взаимоблокировок в рамках нескольких узлов кластера.
Но особая роль в координации ресурсов кластера и объединения кэша отведена таблице GRD (Global Resource Directory), в которой постоянно фиксируется, на каком экземпляре, какой блок (или его копия) доступен, режим, в котором экземпляр удерживает блок, роль блока, SCN. В single-instance варианте SCN - это просто инкрементный счетчик вносимых в БД изменений. В кластере же SCN необходимо синхронизировать между узлами. Существует два метода синхронизации SCN, в зависимости от значения параметра MAX_COMMIT_PROPOGATION_DELAY, задаваемого в миллисекундах:
В итоге SCN в RAC регулярно синхронизируются до самого большого SCN, известного в кластере. SCN требуется для того, чтобы записи о вносимых изменениях в блоках выстраивались в хронологическом порядке, что необходимо при восстановлении транзакций (roll-forward). Таблица GRD распределена между узлами кластера. Каждый узел принимает участие в распределении ресурсов кластера, обновляя свою часть GRD. Часть таблицы GRD относится к ресурсам - объектам: таблицы, индексы и.т.п. Она постоянно синхронизируется (обновляется) между узлами.
Ok, let"s bring "em all together! В GRD у master узла, для координации распределения блоков между экземплярами кластера, с каждым блоком записывается дополнительная информация:
Одни из самых важных принципов (single-instance) БД остаются верными и для RAC:
Отличие среды RAC от обычного single-instance БД заключается в том, что блокировки, несмотря на все желание, осуществляются не на уровне строк, а на уровне блоков. Т.е. экземпляр может заблокировать целый блок (содержаний и другие кому-то нужные данные). Опишем несколько типичных в жизни кластера ситуаций:
Без необходимости никаких записей на диск не происходит. Всегда копия блока хранится на узле, на котором он чаще используется. Если определенного блока пока еще нет в глобальном кэше, то при запросе master попросит соответствующий узел прочитать блок с диска и поделиться им с остальными узлами (по мере надобности). Исходя из описанного выше, становится ясно, что cache-fusion предполагает 2 сценария:
Неважно, сколько в кластере узлов, количество хопов (узлов, принимающих участие в пересылке блока) никогда не превысит 3. Этот факт и объясняет способность кластера RAC безболезненно масштабироваться на большое количество узлов.
Taking fire, need assistance! Workload distribution.Описанное устройство Cache-fusion, предоставляет кластеру возможность самому (автоматически) реагировать на загрузку узлов. Вот как происходит workload distribution или resource remastering (перераспределение вычислительных ресурсов): Перераспределение (remastering) также происходит, когда какой-то узел добавляется или покидает кластер. Oracle перераспределяет ресурсы по алгоритму называемому "ленивое перераспределение" (lazy remastering), т.к. Oracle почти не принимает активных действий по перераспределению ресурсов. Если какой-то узел упал, то все, что предпримет Oracle - это перекинет ресурсы, принадлежавшие обвалившемуся узлу, на какой-то один из оставшихся (менее загруженный). После стабилизации нагрузки GCS и GES заново (автоматически) перераспределят ресурсы (workload distribution) по тем позициям, где они более востребованы. Аналогичное действие происходит при добавлении узла: примерно равное количество ресурсов отделяется от действующих узлов и назначается вновь прибывшему. Потом опять произойдет workload distribution.
Вот пуля пролетела, и… ага? Recovery.Вдруг какой-то узел не ответил на heartbeat, процесс CSSD на узле, который первым это обнаружил, "бьет тревогу" и докладывает master узлу (если тот еще на связи, в противном случае придется самому брать на себя обязанности master"a). Master инициирует на всех узлах процедуру "голосования", уцелевшие узлы кластера начинают отмечаться на voting disk. Если пропавший узел и тут не оставляет следов, то master начинает процесс исключения пропавшего из кластера. Redo log файл будет читаться дважды: один раз по записям redo, в второй раз (заново) уже по записям undo, чтобы сделать базу доступной для запросов как можно раньше.
Но пока все эти процессы происходят, нетерпеливому клиенту есть что предложить.
Пока узлы спасают друг друга… Failover.Failover - это обработка ситуации сбоя узла в кластере.
Virtual IP (VIP) - логический сетевой адрес, назначаемый узлу на внешнем сетевом интерфейсе. Он предоставляет возможность CRS спокойно запускать, останавливать и переносить работу с этим VIP на другой узел. Listener (процесс, принимающий соединения) на каждом узле будет прослушивать свой VIP. Как только какой-то узел становится недоступным, его VIP подхватывает на себя другой узел в кластере, таким образом, временно обслуживая свои и запросы упавшего узла. Это делается для того, чтобы снизить время простоя клиента в случае, если узел, на котором осуществлялась его транзакция, отвалился. Ведь клиент может ожидать TCP timeout в течение нескольких минут. В данном же случае, VIP тут же "подхватится" другим узлом и дальше события могут развиваться по двум сценариям, по технологии TAF (Transparent Application Failover):
Database VIP могут предоставлять приложения только своего узла, и если приложение мигрировало, то отвечают отказом. Application VIP даже после миграции выполняет предоставляемый узлом функционал (positive). Если узел восстановится и выйдет в online, CRS опознает это и попросит сбросить в offline на подменяющем его узле и вернет VIP адрес обратно владельцу. VIP относится к CRS, и может не перебросится если выйдет из строя именно экземпляр БД. Важно отметить, что при failover переносятся только запросы select, вместе и открытыми курсорами (возвращающими результат). Транзакции не переносятся (PL/SQL, temp tables, insert, update, delete), их всегда нужно будет запускать заново. Есть два способа конфигурации TAF:
У клиентского подключения есть параметры retries и delay. Ими можно настраивать, сколько раз клиент (молча) попробует переподключиться в случае, если узел упадет, и какую задержку выставить. Пожалуй, самое интересное - это то, что в случае падения узла, Oracle может об этом оповестить клиента через FAN (Fast Application Notification), который является частью ONS (Oracle Notification Services). Если клиент использует "толстый" драйвер подключения к Oracle, то перед обращением к базе данных можно зарегистрировать callback функцию (обратного вызова), на которую придет event, в случае TAF (failover). Это можно либо отобразить как "небольшую заминку" у пользователя на экране и контролировать процесс перезапуска запроса вручную.
Туда не ходи, сюда ходи… Load-balancing.При выполнении любых операций, информацию, относящуюся к производительности запросов (наподобие "отладочной"), Oracle собирает в AWR (Automatic Workload Repository). Она хранится в tablespace SYSAUX. Сбор статистики запускается каждые 60 минут (default): I/O waits, wait events, CPU used per session, I/O rates on datafiles (к какому файлу чаще всего происходит обращение). Необходимость в Load-balancing (распределении нагрузки) по узлам в кластере определяется по набору критериев: по числу физических подключений к узлу, по загрузке процессора (CPU), по трафику. Жаль что нельзя load-balance по среднему времени выполнения запроса на узлах, но, как правило, это некоторым образом связано с задействованными ресурсами на узлах, а следовательно оставшимися свободными ресурсам. О Client load-balancing было немного сказано выше. Он просто позволяет клиенту подключаться к случайно выбранному узлу кластера из списка в конфигурации. Для осуществления же Server-side load-balancing отдельный процесс PMON (process monitor) собирает информацию о загрузке узлов кластера. Частота обновления этой информации зависит от загруженности кластера и может колебаться в пределе от приблизительно 1 минуты до 10 минут. На основании этой информации Listener на узле, к которому подключился клиент, будет перенаправлять его на наименее загруженный узел. Oracle предоставляет DBA выбирать наиболее значимые критерии для балансировки нагрузки:
Если в приложении реализован connection pool, Oracle предоставляет вариант Runtime Connection Load Balancing (RCLB). Вместо обычного варианта, когда мы пытаемся предугадать, который из узлов будет менее загружен, и направить запрос туда, будет использован механизм оповещений (events) приложения о загрузке на узлах. И теперь уже само приложение будет определять куда отправить запрос, опираясь на эти данные. Оповещение происходит через ONS (Oracle Notification Service). RCLB регулярно получает данные (feedback) от узлов кластера, и connection pool будет раздавать подключения клиентам, опираясь на некоторое относительное число, отображающее какой процент подключений каждый экземпляр может выполнить. Эти метрики (средняя загрузка узла), которые пересылает RAC, каждый узел строит сам в AWR. На их основании формируется required load advisory и помещается в очередь AQ (advanced querying), откуда данные пересылаются через ONS клиенту. Уведомления будут строиться по одному из механизмов:
Окончание. Ссылки по теме |
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
О нас |
Интернет-магазин ITShop.ru предлагает широкий спектр услуг информационных технологий и ПО.
На протяжении многих лет интернет-магазин предлагает товары и услуги, ориентированные на бизнес-пользователей и специалистов по информационным технологиям. Хорошие отзывы постоянных клиентов и высокий уровень специалистов позволяет получить наивысший результат при совместной работе. В нашем магазине вы можете приобрести лицензионное ПО выбрав необходимое из широкого спектра и ассортимента по самым доступным ценам. Наши менеджеры любезно помогут определиться с выбором ПО, которое необходимо именно вам. Также мы проводим учебные курсы. Мы приглашаем к сотрудничеству учебные центры, организаторов семинаров и бизнес-тренингов, преподавателей. Сфера сотрудничества - продвижение бизнес-тренингов и курсов обучения по информационным технологиям.
|
119334, г. Москва, ул. Бардина, д. 4, корп. 3 +7 (495) 229-0436 shopadmin@itshop.ru |
|
© ООО "Interface Ltd." Продаем программное обеспечение с 1990 года |