Использование языка PL/I при определении алгоритма для PSE-процедуры в среде IMS HALDB

Экспериментирование с различными алгоритмами для PSE-процедуры

IBM® Information Management System High Availability Large Database (IMS HALDB) — это база данных с разбивкой на разделы. Partition Selection Exit (PSE) — это процедура на языке ассемблера, которая используется для распределения записей между этими разделами. Чтобы убедиться в том, обеспечит ли алгоритм в PSE-процедуре требуемое распределение, не существует никакого иного способа, кроме заблаговременной реализации этой PSE-процедуры. Поскольку реализация PSE-процедуры затрагивает доступность базы данных, необходим способ, который позволял бы оценивать применяющиеся в этой процедуре алгоритмы без влияния на доступность. В этой статья описывается подход к оценке алгоритмов с использованием высокоуровневого языка программирования (PL/I) для обеспечения равномерного распределения.

Рита Йен, администратор баз данных IMS, WellPoint, Inc

Author photoРита Йен (Rita Yen) является администратором баз данных IMS в компании WellPoint, Inc. Компания WellPoint является одной из крупнейших компаний США по оказанию услуг медицинского страхования — она обслуживает 34 млн. человек непосредственно и более 65 млн. человек через свои филиалы.



Джон Харпер, разработчик IMS, IBM

Author photoДжон Харпер (John Harper), является программистом-разработчиком IMS и технологическим адвокатом по IMS для заказчиков в группе разработки IBM IMS при лаборатории IBM в Силиконовой долине (Сан-Хосе, шт. Калифорния, США). Он является обладателем патентов в области очень больших баз данных и обладает огромным опытом в области IMS, который активно использует в своей работе.



Лоренс Ингленд, технический архитектор решений для клиентов, IBM

Laurence England photoЛоренс Ингленд (Laurence England) работает в IBM в качестве технического архитектора решений для клиента – компании WellPoint. Его место работы находится в лаборатории IBM в Силиконовой долине (Сан-Хосе, шт. Калифорния, США). В свободное время он занимается восхождениями на Калифорнийские холмы.



05.04.2013

Обзор

Корпорация IBM впервые представила среду High Availability Large Database (HALDB) в версии IMS Version 7. Применение технологии HALDB увеличивает максимальные размеры базы данных IMS Full Function до 40 ТБ. Этот результат достигается посредством создания разделов данных. Среда HALDB поддерживает до 1001 раздела, при этом каждый из этих разделов может состоять из десяти наборов данных (объем одного раздела – до 4 ГБ). Разбиение на разделы улучшает управляемость баз данных; к примеру, это позволяет осуществлять реорганизацию лишь одного раздела, а не всей базы данных. Процедуры типа Partition Selection Exit (PSE) способны повысить управляемость HALDB посредством распределения записей по всей среде HALDB различными способами. Один из этих способов распределения состоит в том, чтобы вместо кластеризации новых записей в конце базы данных вставлять новые записей по всей базе данных. Это ослабляет конкуренцию в последнем разделе и позволяет наращивать базу данных более равномерно, что требует меньшего внимания со стороны администраторов. В предлагаемой статье описывается применение высокоуровневого языка программирования PL/I с целью упрощения выбора алгоритма, необходимого для равномерного распределения записей по всей среде HALDB.

Для получения более подробных сведений по HALDB обратитесь к разделу Ресурсы, в котором приведена ссылка на публикацию серии IBM Redbook под названием The Complete IMS HALDB Guide (Полное руководство по IMS HALDB).

Введение в PSE

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

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

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

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

Использование процедуры типа Partition Selection Exit (PSE)

В некоторых случаях применение схемы с разбиением по максимальному значению не позволяет нужным образом сбалансировать количество записей во всех разделах. Процедура типа Partition Selection Exit (PSE) может быть с успехом использована для программируемого определения того, к какому разделу принадлежит та или иная запись. Алгоритм в PSE-процедуре должен быть предсказуемым в том смысле, что для определенного ключа он должен всегда выбирать один и тот же раздел.

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

IMS автоматически разрешает такие конфликты посредством выбора одного из приложений в качестве "жертвы" и последующего аварийного завершения работы этого приложения. Такие завершения порождают бесполезное расходование процессорных ресурсов, поскольку процессорам приходится не только обрабатывать аварийные завершения, но также осуществлять создание резервных копий и последующее восстановление исходных состояний. От этого страдают и "выжившие" приложения, поскольку они вынуждены дожидаться завершения процесса терминации/восстановления. Обычно взаимоблокировки порождаются приложениями, которые обращаются к сегментам записей в разных измерениях.

Классическим примером этого явления в онлайновой среде является задание типа sweep job ("уборка"), которое ищет записи, закончившие определенный процесс. По соображениям производительности это задание может использовать индекс для отыскания записей с определенным кодом состояния. Использование индекса позволяет ускорить доступ за счет обращения только к релевантным записям – в противоположность осуществлению поиска по всей базе данных. В случае перемещения записей между процессами элементы их индексов удаляются и создаются новые элементы индексов, что позволяет найти записи по их новым состояниям.

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

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

Имеют место некоторые моменты, ограничивающие освоение и реализацию PSE-процедур. По соображениям производительности при исполнении PSE-процедура должен быть написана на языке HLASM (High Level Assembler – высокоуровневый ассемблер). Язык HLASM несложен в освоении, однако другие языки используются в более широких масштабах, поэтому доступность необходимых программистских навыков может оказаться под вопросом, как и владение PSE-процедурой. После написания PSE-процедуры она должна быть протестирована с целью демонстрации эффективности применяемого в ней алгоритма. Прежде, чем может быть произведено тестирование PSE-процедуры, она должна быть реализована посредством реорганизации всей базы данных. Затраты времени на реализацию PSE-процедуры для большой базы данных могут ограничить возможности по экспериментированию с этой PSE-процедурой. В производственных средах действуют строгие соглашения по уровню сервиса, которые ограничивают частоту переключения базы данных в офлайновый режим. После реализации PSE-процедуры она должна работать надлежащим образом с момента своего запуска, поскольку даже незначительные корректировки будет невозможно осуществить без нарушения соглашения об уровне сервиса. Таким образом, широкому применению PSE-процедур препятствуют такие факторы, как недостаточные навыки в области программирования и необходимость написания совершенных PSE-процедур.

С учетом вышеперечисленных трудностей необходим способ, который позволял бы с легкостью написать алгоритм для распределения записей между разделами и протестировать этот алгоритм, а также определить, сколько разделов должно быть создано. Для этой статьи была написана простая программа на языке PL/I, которая позволила менять алгоритмы и количество разделов без влияния на производственные системы. С использованием реальных исходных данные было произведено определение оптимального алгоритма и надлежащего количества разделов. Затем этот алгоритм был транслирован на язык HLASM и вставлен в учебную PSE-процедуру.

Примечание. Пример PSE-процедуры поставляется вместе с продуктом IMS; его можно найти в библиотеке IMS SAMPLIB.


Определение алгоритма для равномерного распределения записей

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

  • Напишите на языке PL/I программу, которая читает копию реальных данных. Эта программа будет исполнять алгоритм для выбора надлежащего раздела с помощью ключа. Обратите внимание на то, что IMS предоставляет этой программе только ключ сегмента, а не весь сегмент. После этого будет создан отчет, демонстрирующие распределение записей в результате выполнения алгоритма.
  • Экспериментируйте с разными алгоритмами в программе PL/I для определения того, какой алгоритм будет работать лучше с имеющимися у вас данными. Это обеспечивает потенциальные возможности для использования различных частей ключа в качестве критерия выбора.
  • После определения наилучшего алгоритма он транслируется на язык HLASM внутри самой PSE-процедуры.

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

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

Кроме того, необходимо исследовать, насколько заполненным может стать каждый раздел — этот показатель определяет необходимое количество разделов и обеспечивает "резерв для роста" в каждом из этих разделов. Желаемый объем резерва для роста определяется предполагаемым увеличением объемов данных с течением времени. В том случае, если данные займут весь раздел, потребуется введение дополнительных разделов и повторное распределение данных по этим разделам.

Упрощенная программа на языке PL/I показана в листинге 1.

Листинг 1. Основная логика PL/I-программы
Call InitPartitions();
Read File( InFile);
Do While ( not EndOfFile );
Call SelectPartition();
Read File( InFile);
End;
Call CalcPercent();
Call PrintPartitions();

Схема основной логики

Процедура SelectPartition() содержит основную логику для выбора корректного раздела. В этом примере используется встроенная в PL/I функция mod(). Эта процедура позволяет менять логику для определения оптимального распределения записей. Обратите внимание, что код на языке Pl/I использует структуру Buffer, которая представляет собой запись, подлежащую добавлению в базу данных. Демонстрируются только те поля, которые образуют ключ.

После того, как будет выбран алгоритм, обеспечивающий оптимальное распределение, транслируйте этот алгоритм с языка PL/I на язык HLASM. В этом примере HLASM-инструкция DR (Divide Register) используется для PL/I-функции mod(), а HLASM-инструкция LA (Load Address) гарантирует получение положительного остатка, который представляет собой номер раздела, индексированного относительно нуля. Обратите внимание, что по умолчанию PL/I осуществляет индексацию относительно 1.

Таблица Partition Key Table (PKT) содержит информацию о разделах. Таблица Partition Key Table предоставляет адрес конкретного элемента Partition Table Entry (PTE). Верхняя граница значения ключа для раздела используется при поиске в таблице с целью получения адреса PTE-элемента.

Таблица PKT состоит из двух разделов. Первый раздел представляет собой префиксную область, которая содержит управляющую информацию. Второй раздел содержит один или несколько элементов ключей. Все элементы ключей являются смежными.

После того, как номер раздела будет определен, необходимо идентифицировать корректный элемент таблицы PKT. Для каждого раздела существует свой PKT-элемент, поэтому необходимо выбрать корректный PKT-элемент. Эта задача решается посредством вычисления шага для таблицы (этот шаг представляет собой индекс таблицы, который с помощью HLASM-инструкции MR (Multiply Register) умножается на размер каждого элемента таблицы) и последующего добавления этого шага к начальному адресу таблицы с помощью HLASM-инструкции LA (Load Address HLASM).

В загружаемых материалах для этой статьи представлена порция исходного кода PSE-процедуры; строки с символами 'LEE' в порядковых номерах обозначают логику для выбора надлежащего раздела.

Установка PSE-процедуры

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

Примечание: В этом разделе используются следующие имена.

  • NONHALDB: Имя исходной базы данных
  • HALDBDB: Имя базы данных в среде HALDB
  • HALDBSX: Вторичный индекс HALDB
  1. Выполните ассемблирование PSE-процедур с именами PSEDX и PSEX1 и связывание этих процедур с тестом RESLIB.
  2. 1. Выгрузите базу данных NONHALDB с параметром "MIGRATE=YES", (см. листинг 2).
    Листинг 2. Выгрузка базы данных NONHALDB
    //UNLOAD   EXEC PGM=DFSRRC00,PARM='ULU,DFSURGU0,NONHALDB,,,,,,,,,,,N'   
    //STEPLIB  	DD   DISP=SHR,DSN=regular.RESLIB      
    //* omitted lines 
    //SYSIN    	DD   *
    MIGRATE=YES
  3. Добавьте DBDGEN HALDBDB (PHDAM) и HALDBSX(PSINDEX) в тест DBDLIB.
  4. Создайте тест RECONs.
  5. Зарегистрируйте базы данных HALDBDB и HALDBSX в тесте RECONs как HALDB-базы данных "PARTSEL(PSEDX)" и "PARTSEL(PSEX1)", (см. листинг 3).
    Листинг 3. Регистрация баз данных как HALDB-баз
    INIT.DB    DBD(HALDBDB) SHARELVL(3) TYPHALDB PARTSEL(PSEDX)
        INIT.PART   DBD(HALDBDB) PART(HALDD*) -                          
                DSNPREFX(IMSP.IMS.HALDD*) BLOCKSZE(8192) -            
                FBFF(10) FSPF(10) GENMAX(3) HIBLOCK(420000)              
                            
        HALDBDB has 10 partitions.  
        So there are 10 INIT.PART and вЂ˜*’ is from AA to AJ  
                            
    INIT.DB    DBD(HALDBSX) SHARELVL(3) TYPHALDB PARTSEL(PSEX1) 
        INIT.PART  DBD(HALDBSX) PART(HALDX*) -    
                DSNPREFX(IMSP.IMS.HALDX*) -    
                FBFF(10) FSPF(10) GENMAX(3)  
                            
      HALDBSX has 6 partitions.  So there are 6 INIT.PART and вЂ˜*’ is from AA to AF
  6. Отсортируйте выгруженный набор данных базы данных с помощью IBM IMS High Performance Load: Physical Sequence Sort for Reload, (см. листинг 4).
    Листинг 4. Сортировка базы данных
    Sequence Sort (PSSR)
    //PSSR    EXEC PGM=FABSMAIN,     
    //* omitted lines 
    //SORTIN   	DD DSNAME=user.unloadds, 
    //SORTOUT	DD DSNAME=user.unloadds.sortout
    //* omitted lines 
    //CTL     DD  *   
    HALDBDB
  7. Для шага IDCAMS подготовьте все HALDB-наборы данных.
  8. Загрузите базу данных HALDB, используя результаты PSSR в качестве входной информации для загрузки базы данных, (см. листинг 5).
    Листинг 5. Загрузка базы данных
    //LOAD     EXEC PGM=HPSRRC00,PARM='ULU,DFSURGL0,HALDBDB' 
    //STEPLIB  DD   DISP=SHR,DSN=IBMTOOLS.LOADLIB
    //         DD   DISP=SHR,DSN=test.RESLIB  with PSEs in it            
    //* omitted lines  
    //DFSUINPT DD   DISP=OLD,DSN=user.unloadds.sortout
  9. Создайте вторичный индекс с помощью инструмента IBM IMS Index Builder, (см. листинг 6).
    Листинг 6. Создание индекса
    //IXBUILD   EXEC PGM=IIUSTART,     
    //STEPLIB   DD   DISP=SHR,DSN=IBMTOOLS.LOADLIB    
    //          DD   DISP=SHR,DSN=test.RESLIB  with PSEs in it   
    //* omitted lines 
    //IIUIN     DD *                      
    PROC     	 BLD_SECONDARY,HALDBDB,ALL 
    INPUT    	 IBSCAN,DBRC=Y              
    MAXTASKS 	 02                         
    VIC      	 YES,IIU.UIC

Заключение

Использование такого высокоуровневого языка, как PL/I, для экспериментов с различными алгоритмами выбора разделов повышает гибкость и скорость экспериментирования. После того, как оптимальный алгоритм выбора раздела будет определен, он может быть транслирован на язык HLASM внутри самой PSE-процедуры.

В статье показано, как сделать так, чтобы после того, как PSE-процедура была реализована и протестирована, а затем перенесена в производственную среду, разделы имели одинаковое количество записей, а масштабы кластеризации записей внутри отдельно взятого раздела уменьшились. В свою очередь, это ослабляет конкуренцию приложений при обращении к записям базы данных и значительно сокращает количество событий U777 ABEND. Ваши результаты могут отличаться от описанных выше, однако у одного из заказчиков применение PSE-процедуры при работе с транзакциями большого объема сократило количество взаимоблокировок в 2/3 раза. Этот результат был достигнут несмотря на увеличение количества записей, обрабатываемых внутри базы данных.

Благодарности

Выражаем особую благодарность Мойре МакФэдден (Moira McFadden) за редактирование этой статьи, а также всем администраторам баз данных компании WellPoint, которые оказали нам содействие в этом проекте.


Загрузка

ОписаниеИмяРазмер
Sample PLIplihal.zip4 КБ
Sample PSEdfspse00.zip4 КБ

Ресурсы

Комментарии

developerWorks: Войти

Обязательные поля отмечены звездочкой (*).


Нужен IBM ID?
Забыли Ваш IBM ID?


Забыли Ваш пароль?
Изменить пароль

Нажимая Отправить, Вы принимаете Условия использования developerWorks.

 


Профиль создается, когда вы первый раз заходите в developerWorks. Информация в вашем профиле (имя, страна / регион, название компании) отображается для всех пользователей и будет сопровождать любой опубликованный вами контент пока вы специально не укажите скрыть название вашей компании. Вы можете обновить ваш IBM аккаунт в любое время.

Вся введенная информация защищена.

Выберите имя, которое будет отображаться на экране



При первом входе в developerWorks для Вас будет создан профиль и Вам нужно будет выбрать Отображаемое имя. Оно будет выводиться рядом с контентом, опубликованным Вами в developerWorks.

Отображаемое имя должно иметь длину от 3 символов до 31 символа. Ваше Имя в системе должно быть уникальным. В качестве имени по соображениям приватности нельзя использовать контактный e-mail.

Обязательные поля отмечены звездочкой (*).

(Отображаемое имя должно иметь длину от 3 символов до 31 символа.)

Нажимая Отправить, Вы принимаете Условия использования developerWorks.

 


Вся введенная информация защищена.


static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=40
Zone=Information Management
ArticleID=863817
ArticleTitle=Использование языка PL/I при определении алгоритма для PSE-процедуры в среде IMS HALDB
publish-date=04052013