Use PL/I para determinar o algoritmo para um IMS HALDB PSE

Experimentando vários algoritmos PSE

A Information Management System's High Availability Large Database (IMS HALDB) da IBM® é um banco de dados particionado. Uma Partition Selection Exit (PSE) é uma rotina Assembler usada para distribuir registros entre as partições. Não há maneira de provar que o algoritmo em uma PSE fornecerá a distribuição desejada sem antes implementar a PSE. Visto que a implementação de uma PSE afeta a disponibilidade do banco de dados, é necessária uma maneira de avaliar algoritmos de PSE sem afetar a disponibilidade. Este artigo descreve uma abordagem para avaliar algoritmos usando uma High Level Language (PL/I) para produzir uma distribuição uniforme.

Rita Yen, IMS Database Administrator, WellPoint, Inc

Author photoRita Yen é uma IMS Database Administrator da WellPoint, Inc. A WellPoint é uma das maiores empresas benefícios de saúde dos EUA, com 34 milhões de membros em seus planos de saúde afiliados e um total de mais de 65 milhões de pessoas atendidas através de suas subsidiárias.



John Harper, IMS Developer, IBM

Author photoJohn W. Harper é um IMS Development Programmer e IMS Technical Customer Advocate na equipe de desenvolvimento de IBM IMS Database no Silicon Valley Lab na Califórnia. Ele detém patentes na área de bancos de dados muito grandes e possui ampla experiência em IMS.



Laurence England, Client Technical Architect, IBM

Laurence England photoLarry England trabalha para a IBM como Client Technical Architect da WellPoint. Seu local inicial é o Silicon Valley Lab em San Jose. Quando ele não está trabalhando, gosta de correr pelas montanhas da Califórnia.



16/Ago/2012

Visão geral

A IBM introduziu o High Availability Large Database (HALDB) no IMS Versão 7. Os HALDBs estendem o tamanho do banco de dados IMS Full Function para até 40 terabytes. Isso é feito por meio da criação de partições dos dados. HALDB suporta até 1.001 partições, e cada partição pode conter dez conjuntos de dados, cada um contendo 4 gigabytes. O particionamento melhora o gerenciamento do banco de dados, permitindo, por exemplo, realizar uma reorganização em uma única partição em vez de em todo o banco de dados. As Partition Selection Exits podem melhorar o gerenciamento de um HALDB ao distribuir registros pelo HALDB de diversas formas. Um método de distribuição poderia ser usado para inserir novos registros em todo o banco de dados em vez de armazená-los em cluster no final. Isso reduz a contenção da última partição e permite que um banco de dados cresça de maneira mais uniforme, exigindo menos atenção. Este artigo descreve como usar PL/I, uma High Level Language (HLL), para descobrir mais facilmente o algoritmo necessário para distribuir de maneira uniforme os registros em todo o HALDB.

Para mais informações sobre HALDB, a seção Recursos contém um link para um IBM Redbook intitulado "The Complete IMS HALDB Guide".

Introdução a PSEs

Para gerenciar bancos de dados IMS extremamente grandes, é possível dividi-los em pedaços menores ou partições.

Os registros são colocados, por padrão, em uma partição específica com base na chave do registro. Isso é chamado de particionamento de intervalo de chave. Com o particionamento de intervalo de chave, é definido um valor de chave alto para cada partição. Uma dada partição contém todos os registros cujas chaves têm valor maior que a partição anterior, até (e incluindo) a chave alta definida para essa partição.

O objetivo de reduzir a contenção pode ser atingido pela criação de partições que sejam balanceadas, o que quer dizer que cada partição teria um número de registros aproximadamente igual. Ao inserir novos registros ao longo de todo o banco de dados, os padrões de acesso dos aplicativos podem ser espalhados pelo banco de dados.

Há casos em que o uso do esquema de Particionamento de Chave Alta é inadequado para atingir os objetivos de um número balanceado de registros nas partições, o que pode causar contenção quando os aplicativos acessam os registros. Por exemplo, chaves baseadas em um registro de data ou hora tendem a ser armazenadas em cluster no final do banco de dados.

Usando uma Partition Selection Exit (PSE)

Há casos em que o esquema de Particionamento de Chave Alta não atinge os objetivos de um número balanceado de registros nas partições. Uma Partition Selection Exit (PSE) pode ser usada para determinar, programaticamente, a qual partição pertence um registro. O algoritmo na PSE deve ser previsível, ou seja, ao receber uma dada chave, deve sempre selecionar a mesma partição.

Este artigo examina um exemplo no qual os registros tendem a agrupar-se e as partições não possuem um número balanceado de registros. A chave é composta por um conjunto de campos que inclui uma data, um número de unidade de negócios com dois bytes e um número de sequência com quatro bytes. O número da unidade de negócios poderia estar associado a um único número ou a centenas de números na sequência. A prefixação de cada um deles foi um número de data/hora. O resultado é o armazenamento em cluster dos registros na última partição. Durante o processamento dos registros, alguns aplicativos encontraram conflitos ao tentar acessá-los de outros aplicativos.

Para resolver automaticamente conflitos de contenção, o IMS seleciona um aplicativo como vítima e encerra-o de forma anormal. Esses encerramentos anormais desperdiçam ciclos de CPU que não apenas lidam com o encerramento, mas também retiram as atualizações e posteriormente tentam novamente as atualizações originais. Há também um atraso para os aplicativos que sobreviveram, pois eles aguardam que o processo de encerramento/retirada seja concluído. O conflito geralmente deve-se ao fato de os aplicativos estarem acessando segmentos de registro em direções diferentes.

Um exemplo clássico disso em um ambiente online é uma tarefa de varredura que procura registros que concluíram um certo processo. Por motivos de desempenho, uma tarefa de varredura pode usar um índice para localizar registros com um certo código de status. O uso de um índice permite acesso mais rápido apenas dos registros relevantes, em vez de procurar em todo o banco de dados. À medida que os registros são movidos de um processo para outro, suas entradas no índice são excluídas e novas entradas são criadas, de modo que os registros podem ser localizados com seu novo status.

Caso o processo normal insira e atualize registros seguindo um caminho hierárquico (segmentos raiz e depois dependentes), o IMS primeiro obtém bloqueios nesses segmentos nessa ordem e, em seguida, obtém bloqueios no índice. Dado que tarefas de varredura tendem a acessar segmentos usando um caminho invertido ou lógico (segmentos dependentes e depois de raiz), essas tarefas entrarão em conflito com o processo normal, pois ambas tentam criar registros no final do índice. Uma abordagem para reduzir a contenção é espalhar as atualizações pelo banco de dados em vez de concentrá-las no final. Isso reduz grandemente a possibilidade de conflitos, pois reduz os clusters de solicitações de bloqueio.

Para um IMS HALDB, não apenas o banco de dados pode ser particionado, mas os índices também. No exemplo a seguir, o índice foi dividido em partições e uma PSE foi criada para espalhar as atualizações por todas as partições. Esse método visa reduzir o armazenamento em cluster dos dados e assim reduzir a contenção de aplicativos em relação aos dados.

Há alguns fatores que limitam a adoção e implementação de uma PSE. Devido a considerações do tempo de execução, uma PSE deve ser escrita em High Level Assembler (HLASM). Embora HLASM não seja difícil, outras linguagens são mais comuns, portanto, a disponibilidade de programadores qualificados e a propriedade da PSE podem ser um problema. Após ser criada, uma PSE deve ser testada para mostrar os efeitos do algoritmo. Para realizar o teste, é necessário implementar a PSE reorganizando todo o banco de dados. O tempo de retorno para a implementação de uma PSE em relação a um grande banco de dados pode limitar as oportunidades de testá-la. Em ambientes de produção, Acordos de Nível de Serviço rígidos limitam a frequência com que um banco de dados pode ser colocado offline. Após implementada, uma PSE deve funcionar perfeitamente desde o início, pois mesmo pequenos ajustes são impossíveis sem violar os Acordos de Nível de Serviço. Portanto, a falta de programadores qualificados e a necessidade de escrever uma PSE perfeita dificultam o uso de uma PSE.

Diante desses desafios, como escrever facilmente um algoritmo, testar a distribuição dos registros pelas partições e determinar quantas partições devem ser criadas? Para este artigo, foi criado um programa simples, usando PL/I, que permite que os algoritmos e o número de partições sejam variados sem afetar os sistemas de produção. Usando dados reais como entrada, foram determinados um algoritmo ideal e o número apropriado de partições. Em seguida, o algoritmo foi traduzido para High Level Assembler (HLASM) e inserido na Partition Selection Exit de amostra.

Observe que uma PSE de amostra é enviada com o IMS e encontra-se no IMS SAMPLIB.


Determinar o algoritmo para distribuição uniforme

O objetivo é criar um algoritmo que produz, de forma consistente, partições com um número igual ou quase igual de registro. O método a seguir garante que seja criado um algoritmo que produz uma distribuição uniforme de registros pelo conjunto de partições.

  • Escreva um programa PL/I que lê uma cópia dos dados reais. Usando a chave, o programa executa o algoritmo para selecionar a partição apropriada. Observe que o IMS apenas oferece uma chave do segmento para a saída, não para o segmento inteiro. Em seguida, é produzido um relatório que mostra a distribuição de registros gerada pelo algoritmo.
  • Teste vários algoritmos no programa PL/I para determinar qual deles funciona melhor com os dados em questão. Isso significa, potencialmente, usar diferentes partes da chave como critério de seleção.
  • Após o melhor algoritmo ser determinado, ele é traduzido para HLASM na Partition Selection Exit.

O programa PL/I essencialmente fornece um modelo para testar vários algoritmos para determinar qual deles oferece a melhor e mais uniforme distribuição. É simples alterar o algoritmo no programa PL/I e executar novamente o modelo para visualizar os resultados da distribuição. Outro aspecto que pode ser variado, além do algoritmo, é o número de partições. Pode ser útil aumentar o número de partições e ainda fazer com que o algoritmo produza uma distribuição uniforme dos registros em cada partição.

Ao experimentar com o algoritmo, você talvez note que nem todos os campos-chave precisam participar da seleção da partição. Usando a High Level Language PL/I, é possível produzir alguns algoritmos, investigar os resultados da distribuição e, em seguida, selecionar o algoritmo que resulta na melhor distribuição.

Também sob consideração está a capacidade de cada partição, o que determina o número de partições necessárias e dá espaço de manobra para crescimento em cada partição. O tamanho do espaço de manobra é determinado pelo crescimento antecipado dos dados ao longo do tempo. Caso os dados consumam uma partição, será necessário incluir outras partições e reparticionar os dados.

A Listagem 1 mostra um programa PL/I simplificado.

Lista 1. Lógica principal para o programa PL/I
Call InitPartitions();
Read File( InFile);
Do While ( not EndOfFile );
Call SelectPartition();
Read File( InFile);
End;
Call CalcPercent();
Call PrintPartitions();

Estrutura da lógica principal

O procedimento SelectPartition() é o início da lógica para selecionar a partição correta. Aqui, o mod() de PL/I integrado é usado no exemplo. Nesse ponto é possível variar a lógica para determinar a distribuição ideal de registros. Observe que o código PL/I depende da estrutura "Buffer", que é o registro a ser incluído no banco de dados. Apenas os campos que formam a chave são revelados.

Quando for selecionado o algoritmo que produz a distribuição ideal, traduza-o de PL/I para HLASM. Nesse exemplo, DR (instrução Divide Register de HLASM) foi usada para a função "mod()" de PL/I, e LA (instrução Load Address de HLASM) garantiu um resto positivo, o que representa o número da partição indexado em zero. Observe que PL/I indexou em 1 por padrão.

A Partition Key Table (PKT) contém informações sobre as partições. A Partition Key Table fornece o endereço de uma Partition Table Entry (PTE) específica. A chave alta da partição é usada para procurar a tabela para obter o endereço de PTE.

A PKT consiste em duas seções. A primeira seção é a área de prefixo, que contém informações de controle. A segunda seção contém uma ou mais entradas de chave. Todas as entradas de chave são contíguas.

Quando o número da partição for determinado, é necessário identificar a entrada PKT correta. Há uma entrada na PKT para cada partição, e é necessário selecionar a entrada correta. Para isso, calcula-se o avanço na tabela (o avanço toma um índice na tabela multiplicado pelo tamanho de cada entrada da tabela usando a instrução MR, Multiply Register, de HLASM) e, em seguida, adiciona-se o avanço no endereço de início da tabela (instrução LA, Load Address, de HLASM).

Uma parte da fonte da PSE é incluída para download neste artigo, e as linhas com "LEE" nos números de sequência identificam a lógica para selecionar a partição correta.

Instalando a PSE

Para instalar a PSE, siga as seguintes instruções durante a migração de um banco de dados particionado não HALDB para um HALDB. Se o banco de dados já for HALDB, as especificações de migração podem ser omitidas do processo de reorganização.

Observação: Os seguintes nomes são usados nesta seção.

  • NONHALDB: nome do banco de dados atual
  • HALDBDB: nome do banco de dados HALDB
  • HALDBSX: índice secundário de HALDB
  1. Monte e vincule as Partition Selection Exits (PSEs) PSEDX e PSEX1 no RESLIB de teste.
  2. Descarregue o banco de dados NONHALDB com "MIGRATE=YES", como mostra a Listagem 2.
    Lista 2. Descarregar o banco de dados NONHALDB
    //UNLOAD   EXEC PGM=DFSRRC00,PARM='ULU,DFSURGU0,NONHALDB,,,,,,,,,,,N'   
    //STEPLIB  	DD   DISP=SHR,DSN=regular.RESLIB      
    //* omitted lines 
    //SYSIN    	DD   *
    MIGRATE=YES
  3. Inclua DBDGEN HALDBDB (PHDAM) e HALDBSX(PSINDEX) na DBDLIB de teste.
  4. Crie RECONs de teste.
  5. Registre os bancos de dados HALDBDB e HALDBSX em RECONs de teste como HALDBs com "PARTSEL(PSEDX)" e "PARTSEL(PSEX1)", como mostra a Listagem 3.
    Lista 3. Registre com os bancos de dados como 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. Classifique o conjunto de dados do banco de dados descarregado com IMS High Performance Load da IBM: Classificação de Sequência Física para Recarga, como mostra a Listagem 4.
    Lista 4. Classificar o banco de dados
    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. Para a etapa de IDCAMS, prepare todos os conjuntos de dados HALDB.
  8. Carregue o banco de dados HALDB usando a saída PSSR como entrada de carga do banco de dados, como mostra a Listagem 5.
    Lista 5. Carregue o banco de dados
    //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. Desenvolva um índice secundário com IBM IMS Index Builder, como mostra a Listagem 6.
    Lista 6. Desenvolver o índice
    //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

Conclusão

O uso de uma High Level Language como PL/I para experimentar com vários algoritmos de seleção de partição proporciona flexibilidade e acelera a experimentação. Após o algoritmo de seleção de partição ideal ser determinado, ele pode ser traduzido para HLASM a partir da própria PSE.

Este artigo mostra como, após implementar a PSE, testá-la e colocá-la em produção, as partições possuem um número equivalente de registros e possuem, cada uma, menor armazenamento de registros em cluster. Isso, por sua vez, levou a uma redução na contenção de aplicativos que acessam os registros do banco de dados e reduziu o número de U777 ABENDS significativamente. Seus resultados podem variar, mas o cliente observou uma redução de dois terços nos conflitos em transações de alto volume atingidas pela PSE. Isso ocorreu mesmo diante de um aumento no número de registros processados no banco de dados.

Agradecimento

Um agradecimento especial para Moira McFadden por ter revisado este artigo e a todos os DBAs da WellPoint que auxiliaram neste projeto.


Downloads

DescriçãoNomeTamanho
Sample PLIplihal.zip4KB
Sample PSEdfspse00.zip4KB

Recursos

Aprender

Obter produtos e tecnologias

  • Crie seu próximo projeto de desenvolvimento com o o software de teste IBM, disponível para download diretamente do developerWorks.
  • Avalie os produtos IBM da maneira que for melhor para você: faça download da versão de teste de um produto, avalie um produto online, use-o em um ambiente de nuvem ou passe algumas horas no no Ambiente de Simulação da SOA aprendendo a implementar Arquitetura Orientada a Serviços de modo eficiente.

Discutir

Comentários

developerWorks: Conecte-se

Los campos obligatorios están marcados con un asterisco (*).


Precisa de um ID IBM?
Esqueceu seu ID IBM?


Esqueceu sua senha?
Alterar sua senha

Ao clicar em Enviar, você concorda com os termos e condições do developerWorks.

 


A primeira vez que você entrar no developerWorks, um perfil é criado para você. Informações no seu perfil (seu nome, país / região, e nome da empresa) é apresentado ao público e vai acompanhar qualquer conteúdo que você postar, a menos que você opte por esconder o nome da empresa. Você pode atualizar sua conta IBM a qualquer momento.

Todas as informações enviadas são seguras.

Elija su nombre para mostrar



Ao se conectar ao developerWorks pela primeira vez, é criado um perfil para você e é necessário selecionar um nome de exibição. O nome de exibição acompanhará o conteúdo que você postar no developerWorks.

Escolha um nome de exibição de 3 - 31 caracteres. Seu nome de exibição deve ser exclusivo na comunidade do developerWorks e não deve ser o seu endereço de email por motivo de privacidade.

Los campos obligatorios están marcados con un asterisco (*).

(Escolha um nome de exibição de 3 - 31 caracteres.)

Ao clicar em Enviar, você concorda com os termos e condições do developerWorks.

 


Todas as informações enviadas são seguras.


static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=80
Zone=Information Management
ArticleID=830387
ArticleTitle=Use PL/I para determinar o algoritmo para um IMS HALDB PSE
publish-date=08162012